【问题标题】:PHP PDO and DELETE with in() not working带有 in() 的 PHP PDO 和 DELETE 不起作用
【发布时间】:2012-03-02 20:08:19
【问题描述】:

这是该类的代码:

    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);
    }

//从数据库中获取所有的Children 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 语句中的某个地方......有人可以帮助我吗?

【问题讨论】:

  • 有些地方不能使用准备好的语句变量,这就是其中之一。另外两个(据我所知)是limitoffset

标签: php sql pdo


【解决方案1】:

您可以为此使用FIND_IN_SET

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

【讨论】:

  • 像魅力一样工作。谢谢。
  • 为什么它与 find in set 而不是 just in 一起工作?
  • @guy_fawkes IN 运算符需要一个值列表,而准备好的语句中的参数只能保存单个值。与此相反,FIND_IN_SET 函数期望第二个参数是一个单个字符串值(然后保存一个值列表)。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2017-04-08
相关资源
最近更新 更多