php - pdo rowCount() 在成功更新多行时提供零值

标签 php mysql pdo

我正在使用以下查询更新 mysql 数据库中的多条记录。

$conn->beginTransaction();
try {
    $stmt = $conn->prepare('UPDATE products 
                            SET `stock_status`=:stockstatus,
                                `price`=:price  WHERE `id`=:id');
    foreach ($data as $v){
        $stmt->bindParam(':stockstatus', $v['instock'], PDO::PARAM_STR);
        $stmt->bindParam(':price', $v['Price'], PDO::PARAM_INT);
        $stmt->bindParam(':id', $v['ID'], PDO::PARAM_STR);
        $stmt->execute();
    }//end foreach
    $conn->commit();
} catch (PDOException $e) {
  $conn->rollBack(); //roll back changes, if error
    echo 'Update failed: ' . $e->getMessage();
    exit;
}
$count = $stmt->rowCount();
//$count = $stmt->rowCount();
echo "$count records updated.";
$stmt->closeCursor(); 
$conn = NULL; 

rowCount() 在多行更新时始终生成 0。为什么会这样??

来自 PDO 手册: rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。

但是 rowCount() 没有显示多次更新中更新的总行数?如何显示更新的总行数

更新:

我还尝试添加 PDO::MYSQL_ATTR_FOUND_ROWS 作为 mysql 连接属性,如下所示:

    <?php
    $attr  = array(
        PDO::MYSQL_ATTR_FOUND_ROWS   => TRUE,
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    );
    conn = new PDO($dsn,$user,$pass,$attr);
    ?>

但是多行更新仍然返回0 条更新记录。我已经验证该行确实更新了。

根据我的理解,“如果 MYSQL_ATTR_FOUND_ROWS 打开,rowCount() 返回找到的行数而不是更改的行数”。

那么,如何解决显示更新的总记录???

最佳答案

问题在于如何实例化 PDO 连接对象。您将无法准确计数 UPDATE key 已经存在的情况下的操作。 rowCount()将始终返回 0。

您需要更改创建 PDO 对象的行 $conn包括一个附加选项 referenced here在 PHP 网站的评论中指出:。

When updating a Mysql table with identical values nothing's really affected so rowCount will return 0. As Mr. Perl below noted this is not always preferred behaviour and you can change it yourself since PHP 5.3.

Just create your PDO object with <?php $p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true)); ?> and rowCount() will tell you how many rows your update-query actually found/matched.

根据该评论中的示例,它看起来像这样:

<?php
    $conn = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>

该选项记录在此处:http://php.net//manual/en/ref.pdo-mysql.php

关于php - pdo rowCount() 在成功更新多行时提供零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24310200/

相关文章:

php - 额外的mysql select查询条件?

php - 在我的类里面使用 pdo php

java - 如何在发生异常后删除 "null id ...entry (don' t 刷新 session )”

php - 我想在使用 JavaScript 和 PHP 键入时向用户建议一些数据。这怎么可能?

php - 将 ?id=__ 重写为存储在数据库行中的页面标题

MySQL 查询以聚合过去 7 天内创建的版本数

java - 无法使用 Eclipse 访问 Amazon RDS

php - 从表中获取用户,其中 group=另一个表行的组,但我有其他表行的 id

php - 与占位符一起使用时,PDO 仅更新一行

php - 使用 PDO 插入记录失败