2012-03-02 36 views
0

下面是类代码:PHP PDO并在删除()不工作

class Delete_Category extends Category { 

    private $idchain = array(); 

    public function __construct($id) { 
     parent::__construct(); 
     $this->check_id($id); 
     $this->get_delete_ids($this->id); 
     $this->delete_category($this->idchain); 
    } 

//从数据库中获取所有儿童的ID,并将其存储在阵列中

private function get_delete_ids($id) { 
     $this->query = $this->db->prepare("SELECT id FROM `shop_categories` WHERE parent_id = :id"); 
     $this->query->execute(array("id" => $id)); 
     while($result = $this->query->fetch(PDO::FETCH_ASSOC)) { 
      $this->get_delete_ids($result['id']); 
     } 
     $this->idchain[]= $id; 
    } 

//内爆的阵列到ID字符串和查询扔

private function delete_category($id_array) { 
     $id = implode(",",$id_array); 
     try { 
      $this->query = $this->db->prepare("DELETE FROM `shop_categories` WHERE id IN (:id)"); 
      $this->query->execute(array(':id' => $id)); 
     } 
     catch(PDOException $e) { 
      // log it{ 
     } 
    } 
} 

的事情是,这个总是只有最后ID结束被删除。该查询似乎正在工作,但因为它看起来很好,如果我回声它,并替换:ID与$ ID。如果呼应

// SQL输出字符串:

DELETE FROM `shop_categories` WHERE id IN (11,6) 

//如果我手动将它添加到它的工作原理是这样打算的问题已经在PDO声明某处数据库...谁能帮助我?

+0

有几个地方,你不能用事先准备好的声明的变量,这是其中之一。另外两个(我知道的)是'limit'和'offset'。 – Maerlyn 2012-03-02 20:17:53

回答

4

您可以使用FIND_IN_SET为:

DELETE FROM `shop_categories` WHERE FIND_IN_SET(id, :id)" 
+0

工程就像一个魅力。谢谢。 – Sepix 2012-03-02 20:14:09

+0

为什么它使用set中的find而不是just in? – 2015-10-14 07:41:49

+1

@guy_fawkes'IN'运算符需要*值列表*,而准备好的语句中的参数只能包含*单个值*。与此相反,FIND_IN_SET函数期望第二个参数是一个*单个字符串值*(然后保存一个值列表)。 – Gumbo 2015-10-14 18:14:19