首页 文章

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

提问于
浏览
0

我正在使用以下查询更新我的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()没有显示多次更新中更新的总行数?我怎么能显示 total number of rows updated

Update:

我还尝试将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 records updated . 我已经确认该行确实更新了 .

从我的理解“如果MYSQL_ATTR_FOUND_ROWS打开,rowCount()返回 found rowsnot the number of changed rows ”的数字 .

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

2 回答

  • 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))创建PDO对象; ?>和rowCount()将告诉您更新查询实际找到/匹配的行数 .

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

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

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

  • 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.";
    

相关问题