Вот код для класса:
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); }
// Получаем все идентификаторы детей из БД и сохраняем их в массиве
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.
// Выходная строка SQL, если эхо:
DELETE FROM `shop_categories` WHERE id IN (11,6)
// Если я вручную добавлю это в базу данных, он работает так, как предполагалось, поэтому проблема должна быть где-то в заявлении PDO … Может ли кто-нибудь мне помочь?
Вы можете использовать FIND_IN_SET
для этого:
DELETE FROM `shop_categories` WHERE FIND_IN_SET(id, :id)"