【问题标题】:PDO with Mulitple Update prepared statements failing to execute具有多个更新准备语句的 PDO 无法执行
【发布时间】:2018-10-27 10:15:21
【问题描述】:

我正在尝试构建一个更新 2 个表的 PDO 多准备语句。

当我尝试让我的代码工作时遇到问题并遇到各种错误,最新:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

在查看 SO 时,我发现了各种方法,但我不知道如何实现它们。

另一个问题是无法使用$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);。我已经在线阅读了重要的内容,以包括安全性。但是我也明白它不适用于多查询 PDO (?)。

可以进行多重更新还是我应该有不同的脚本? (我的代码也不受 SQL 注入的影响吗?)

这是我正在使用的代码:

<?php
try {
$conn = new PDO('mysql:host=localhost;dbname=*', '*', '*');
$conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


$est_id = $_POST['est_id'];
$known_for = $_POST['known_for'];
$street_address = 'addressToAdd';

$sql = " UPDATE `theList`
 SET `known_for` = :known_for
 WHERE `id` = :est_id
    ";

$sql = " UPDATE `est_address`
  SET `street_address` = :street_address
  WHERE `id` = :est_id
     ";

 $params = array(
    ':est_id' => $est_id,
    ':known_for' => $known_for,
    ':street_address' => $street_address
);


  $statement = $conn->prepare($sql);

  $statement->execute($params);


  $conn = null;        // Disconnect
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>

【问题讨论】:

    标签: php sql pdo


    【解决方案1】:
    <?php
    try {
    $conn = new PDO('mysql:host=localhost;dbname=*', '*', '*');
    $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $est_id = $_POST['est_id'];
    $known_for = $_POST['known_for'];
    $street_address = 'addressToAdd';
    
    $sqlKnown = "UPDATE `theList` SET `known_for` = :known_for WHERE `id` = :est_id";
    $stKnown = $conn->prepare( $sqlKnown );
    $stKnown->execute([
      ':est_id' => $est_id,
      ':known_for' => $known_for,
    ]);
    
    $sqlStreet = "UPDATE `est_address` SET `street_address` = :street_address WHERE `id` = :est_id";
    $stStreet = $conn->prepare( $sqlStreet );
    $stStreet->execute([
      ':est_id' => $est_id,
      ':street_address' => $street_address
    ]);
    
      $conn = null;        // Disconnect
    }
    catch(PDOException $e) {
      echo $e->getMessage();
    }
    ?>
    

    【讨论】:

    • 谢谢,但是我正在更新 2 个不同的表。 theList 和 est_address。
    • 上次 ))) 没有更多时间了 ) 上面的代码已更改。
    • 谢谢.... 现在完美运行!我必须在 $sqlStreet 中更改的一件事应该是 est_id = :est_id"; 而不是 id = :est_id";!
    • @НиколайЛубышев 你能否更新你的答案,向大家展示和解释你做了什么解决了他们的问题?
    • 不是全局问题,只是代码不正确。这不会是一个大规模的问题,所以没有意义。
    猜你喜欢
    • 2012-02-16
    • 2012-01-12
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多