2012-03-02 49 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