Php PDO 事务中的多个准备语句

标签 php mysql pdo

我有这个代码:

    $this->db->beginTransaction();
    $query = 'INSERT INTO `table1` VALUES (NULL,:a,:b,NULL,NOW())';
    $sth = $this->db->prepare($query);
    foreach ($values as $k => $v) {
      $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
    }

    $this->executeQueryRollbackOnException($sth, 'Message_1');
    $resetId = $this->db->lastInsertId();

    $query = 'UPDATE `table2` SET c=:c,d=:d WHERE reset_id IS NULL';
    $sth = $this->db->prepare($query);
    foreach ($values2 as $k => $v) {
      $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
    }


    $this->executeQueryRollbackOnException($sth, 'Message_2');

    Zend_Debug::dump($sth->rowCount(), 'Affected'); // This is 0

    // Commit
    $this->db->commit();    

...

  private function executeQueryRollbackOnException($sth, $message) {
    try {
      $sth->execute();
    } catch (Exception $e) {
      $this->logSQLError($e);
      $this->db->rollBack();
      throw new Exception($message);
    }
  }

第一个查询被执行但第二个没有。没有产生 mysql 错误。有什么想法吗?

最佳答案

我找到了解决方案。

foreach ($values as $k => $v) {
   $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
}

应该是

foreach ($values as $k => $v) {
   $sth->bindParam(':' . $k, $values[$k], PDO::PARAM_INT);
}

抱歉,我第一次没有发布正确的代码,我排除了 foreaches 以简化代码

关于Php PDO 事务中的多个准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087878/

相关文章:

php - 我的 sql 查询没有插入任何内容,我做错了什么?

php - json 解码 - 从对象获取单个数组?

mysql - 'where clause' Rails 4 中的未知列

java - 如何在线托管使用 jpa toplink、tomcat7 mysql 和 primefaces 创建的 java web 动态项目

php - 安全地使用准备好的语句来查询数据库

php - 在 UTF-8 编码的字符串上使用 str_split

php - 使用 PHP 在 MySQL 中插入图像时出错

mysql - 如何将 .sql 文件 (MYSQL) 恢复/导入到 Oracle 数据库中?

php - 如果不存在使用 PDO 添加 MySQL 列

php - 为什么 SQL SELECT 语句不检索 PHP 日历的相关日期?