【问题标题】:PDO prepared statement bind parameters once for different queriesPDO 准备好的语句为不同的查询绑定一次参数
【发布时间】:2019-08-17 22:02:13
【问题描述】:

我正在使用PDO prepared statements 执行两个查询:

SELECT count(*) FROM vocabulary WHERE  `type` = :type AND `lesson` = :lesson;
SELECT * FROM vocabulary WHERE  `type` = :type AND `lesson` = :lesson limit 100;

获取计数的第一个查询按预期工作,我得到了行数。

$stmt = $this->connection->prepare($sql);
foreach ($params as $key => $value)
    $stmt->bindValue(":" . $key, $value, PDO::PARAM_STR);

$stmt->execute();
$count = $stmt->fetchColumn();

$sql .= " limit $limit;";
$sql = str_replace("count(*)", $columns, $sql);
$stmt = $this->connection->prepare($sql);
$stmt->execute();

$result = $stmt->fetchAll(PDO::FETCH_CLASS, $class);

但是在执行第二个查询时我得到:

SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

因此,我想知道,如果我有多个参数完全相同的查询,是否需要再次使用绑定相同的参数

foreach ($params as $key => $value)
    $stmt->bindValue(":" . $key, $value, PDO::PARAM_STR);

或者如果有一种方法可以只绑定一次参数。

【问题讨论】:

  • 您的$stmt = 重置该值,使其不再被绑定。您可以构建一个数组并将其传递给两个 execute 调用。

标签: php pdo prepared-statement


【解决方案1】:

如果我有多个参数完全相同的查询,是否需要再次使用绑定相同的参数

是的,当然。

参数绑定到每个查询,而不是全局绑定到 PDO 或数据库。

附带说明,使用 PDO,您不必显式绑定变量,因此您的“问题”有一个解决方案:根本不绑定,而是将数据直接发送到 execute() 中,如图所示在达曼的出色回答中

【讨论】:

    【解决方案2】:

    没有必要像这样修改你的 SQL。您的代码基本上归结为:

    $stmt = $this->connection->prepare('SELECT count(*) FROM vocabulary WHERE  `type` = :type AND `lesson` = :lesson');
    $stmt->execute($params);
    $count = $stmt->fetchColumn();
    
    $stmt = $this->connection->prepare('SELECT * FROM vocabulary WHERE  `type` = :type AND `lesson` = :lesson limit 100');
    $stmt->execute($params);
    $result = $stmt->fetchAll(PDO::FETCH_CLASS, $class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多