我正在使用以下查询更新我的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 rows , not the number of changed rows ”的数字 .
那么,显示总记录更新的解决方案是什么?
2 回答
问题在于如何实例化PDO连接对象 . 您不会准确计算已存在密钥的
UPDATE
操作 .rowCount()
将始终返回0 .您将需要更改创建PDO对象
$conn
的行,以在PHP网站上的注释中包含一个附加选项referenced here,其中包含:根据他们在该评论中的示例,它看起来像这样:
该选项记录在此处:http://php.net//manual/en/ref.pdo-mysql.php
$stmt->rowCount();
输出上次执行查询的行数 . 由于您在循环中多次运行查询,然后在循环后调用rowCount()
,它只返回上次运行查询时更新的行数 .如果我正确地读你的问题你想要做的是在循环的每次迭代中增加一个计数器并在结尾打印最终值 .