在PHP中,使用mysqli扩展操作数据库时,$mysqli->affected_rows是一个非常常用的属性,它可以告诉你最近一次执行的SQL语句影响了多少行。然而,有时候我们会遇到$mysqli->affected_rows返回-1的情况,这到底是什么意思呢?本文将带你详细解析几种导致返回-1的常见情况,帮你更好地理解和排查代码问题。
mysqli::$affected_rows返回的是上一次执行的INSERT、UPDATE、DELETE语句受影响的行数。例如:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->query("UPDATE users SET active = 1 WHERE id = 10");
echo $mysqli->affected_rows; // 输出受影响的行数
?>
如果这条更新语句成功执行,$affected_rows会返回一个非负整数,表示实际修改的行数。但当出现错误或者某些特殊情况时,返回值可能是-1。
如果你的SQL语句执行失败,比如语法错误、表不存在等,$affected_rows会返回-1。此时你应该通过检查错误信息来判断:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$result = $mysqli->query("UPDATE non_existing_table SET active=1");
if ($result === false) {
echo "查询失败,错误信息:" . $mysqli->error;
echo "受影响行数:" . $mysqli->affected_rows; // 这里会输出 -1
}
?>
$affected_rows只对修改类操作(INSERT、UPDATE、DELETE)有意义。如果你执行的是SELECT、SHOW或者其他不改变数据的查询,$affected_rows会返回-1。
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->query("SELECT * FROM users");
echo $mysqli->affected_rows; // 输出 -1,因为SELECT不影响行数
?>
如果你使用了事务,执行了修改操作但未提交,$affected_rows可能会返回异常值。确保事务已正确提交。
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query("UPDATE users SET active=1 WHERE id=5");
echo $mysqli->affected_rows; // 仍可能显示正确
$mysqli->commit();
?>
未提交的事务可能导致实际未生效,尽管affected_rows通常会正确返回,但特殊情况下可能产生误导。
当用预处理语句执行时,某些情况下$stmt->affected_rows可能为-1,例如执行了不支持返回影响行数的语句,或者查询失败。
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$stmt = $mysqli->prepare("UPDATE users SET active=1 WHERE id=?");
$id = 10;
$stmt->bind_param("i", $id);
$stmt->execute();
echo $stmt->affected_rows; // 可能为-1,表示执行异常
?>
务必检查$stmt->error确认是否有错误。
检查SQL执行是否成功
通过判断返回值是否false,并调用$mysqli->error获取详细错误信息。
确认SQL语句类型
affected_rows只对修改操作有效,查询语句永远返回-1。
检查事务状态
保证修改操作的事务已提交。
对预处理语句做错误判断
检查$stmt->execute()是否成功,及时处理错误。
mysqli::$affected_rows返回-1,通常意味着最近一次SQL执行失败或者执行的是不影响行数的语句。
使用时一定要结合错误信息和SQL语句类型进行判断。
在写代码时,养成检查$mysqli->error或者$stmt->error的习惯,可以帮助快速定位问题。
通过以上方法,你可以更加准确地理解和处理mysqli::$affected_rows返回-1的情况,提升代码的健壮性和调试效率。
相关标签:
mysqli