【问题标题】:PDO prepared statement returns empty set, Query works finePDO 准备好的语句返回空集,查询工作正常
【发布时间】:2018-01-12 09:20:41
【问题描述】:

我有以下执行 Mysql 查询的 PDO 函数。它适用于所有查询。

public function run($sql, array $params = NULL) {

  $statement = $this->pdo->prepare($sql);

  if (!is_null($params)) {

    foreach ($params as $key) {

      $statement->bindParam(":n", $key);

    }

  }

  $statement->execute();

  return $statement->fetchAll(PDO::FETCH_CLASS);

}

但是,当我运行以下查询时,它返回一个空集

$variation = $query->run(
  "SELECT url, title, sale_price
  FROM product
  where category_id = :n
  and url != :n",
  [ $data[0]->category_id, $filePathArray[1] ]
);

当我在 mysql 客户端手动运行查询时,它的工作原理。

我尝试了类型转换类别 id 但没有乐趣:

(int)$data[0]->category_id 

(因为它传递的是字符串而不是整数)

这是运行函数中 $params 的 var_dump

array(2) { 
  [0]=> int(1) 
  [1]=> string(21) "light-resistance-band" 
}

【问题讨论】:

  • 您不能在单个查询中重复使用占位符。
  • 您正在使用命名占位符,名称 :n 使用了两次,并且您将两个不同的值绑定到 :n。那应该如何工作?

标签: php mysql pdo


【解决方案1】:

您需要添加不同的命名占位符来绑定对应的值(不相同)

$variation = $query->run(
  "SELECT url, title, sale_price
  FROM product
  where category_id = :n
  and url != :n1",
  [ ':n'=>$data[0]->category_id, ':n1'=>$filePathArray[1] ]
);

【讨论】:

  • 有道理我会这样做
  • @BennyThadikaran 你可以给我发链接。如果我有时间我会回答或有人肯定会回答
【解决方案2】:

您可以自定义检查$key 和bindParam 类型的函数,如下所示:

 public function run($sql, array $params = NULL) {

  $statement = $this->pdo->prepare($sql);

  if (!is_null($params)) {

    foreach ($params as $key=>$value) {
        $statement->bindParam(":".$key, $value);
    }

  }

  $statement->execute();

  return $statement->fetchAll(PDO::FETCH_CLASS);

}

【讨论】:

  • 感谢 Goms,但这会将参数限制为 2。请参阅我的编辑。 P.S - 我没有拒绝你的回答。
  • 这也不起作用:(。仍然返回一个空集。顺便说一句,“:”$key 必须是“:$key”。我可以为此编写一个单独的函数,但只是想知道怎么了。
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 2012-05-16
  • 2016-04-04
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多