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

时间:2014-06-19 15:18:34

标签: 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()返回找到的行的数量,不是已更改行的数量”。

那么,显示更新总记录的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

问题在于如何实例化PDO连接对象。您不会准确计算已存在密钥的UPDATE操作。 rowCount()将始终返回0。

您需要更改创建PDO对象$conn的行,以便在PHP网站上的注释中包含referenced here的附加选项,其中包含:。

  

当更新具有相同值的Mysql表时,没有什么是真的   受影响因此rowCount将返回0.正如Perl先生在下面指出的那样   不总是首选的行为,你可以自己改变它   PHP 5.3。

     

只需使用<?php $p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true)); ?>rowCount()即可创建您的PDO对象   告诉你更新查询实际找到/匹配了多少行。

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

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

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

答案 1 :(得分:0)

$stmt->rowCount();输出上次执行查询的行数。由于您在循环中多次运行查询,然后在循环后调用rowCount(),因此只返回上次运行查询时更新的行数。

如果我正确地阅读你的问题你想要做的是在循环的每次迭代中增加一个计数器并在最后打印最终值。

$count = 0;
$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();
    $count += $stmt->rowCount();
}//end foreach

    echo "$count records updated.";