我已经使用 while 循环完成了您所描述的内容,以便每次迭代都会创建一个影响一行的 MySQL 语句。在循环中,我运行 mysql_affected_rows(),然后根据返回的值是 0 还是 1 增加一个计数器。在循环结束时,我回显两个变量以供查看。
MySQL Docs关于 mysql_affected_rows 函数的完整措辞是(注意有 3 个可能的值返回 - 0、1 或 2):
对于 INSERT ... ON DUPLICATE KEY UPDATE 语句,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果将现有行设置为其当前值,则为 0 . 如果您指定 CLIENT_FOUND_ROWS 标志,如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。
(旁注- 我在 while 循环之前将 $countUpdate 和 $countInsert 和 $countUpdateNoChange 设置为 0):
这是我开发的对我很有用的代码:
while (conditions...) {
$sql = "INSERT INTO test_table (control_number, name) VALUES ('123', 'Bob')
ON DUPLICATE KEY UPDATE name = 'Bob'";
mysql_query($sql) OR die('Error: '. mysql_error());
$recordModType = mysql_affected_rows();
if ($recordModType == 0) {
$countUpdateNoChange++;
}elseif($recordModType == 1){
$countInsert++;
}elseif($recordModType == 2){
$countUpdate++;
};
};
echo $countInsert." rows inserted<br>";
echo $countUpdateNoChange." rows updated but no data affected<br>";
echo $countUpdate." rows updated with new data<br><br>";
希望我在删除机密数据的同时重新创建它以共享它,因此我没有打错任何字。
希望这可以帮助某人。祝你编码好运!