当前位置: 首页> 最新文章列表> 【mysqli::$affected_rows】函数返回-1是什么意思?你必须知道的几种情况

【mysqli::$affected_rows】函数返回-1是什么意思?你必须知道的几种情况

gitbox 2025-06-09

在PHP中,使用mysqli扩展操作数据库时,$mysqli->affected_rows是一个非常常用的属性,它可以告诉你最近一次执行的SQL语句影响了多少行。然而,有时候我们会遇到$mysqli->affected_rows返回-1的情况,这到底是什么意思呢?本文将带你详细解析几种导致返回-1的常见情况,帮你更好地理解和排查代码问题。


什么是 mysqli::$affected_rows

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


mysqli::$affected_rows返回-1的几种情况

1. SQL语句执行失败

如果你的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
}
?>

2. 执行的是不影响行数的查询

$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不影响行数
?>

3. 事务未提交或自动提交关闭

如果你使用了事务,执行了修改操作但未提交,$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通常会正确返回,但特殊情况下可能产生误导。

4. 预处理语句使用不当

当用预处理语句执行时,某些情况下$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确认是否有错误。


如何正确处理返回-1的情况?

  1. 检查SQL执行是否成功
    通过判断返回值是否false,并调用$mysqli->error获取详细错误信息。

  2. 确认SQL语句类型
    affected_rows只对修改操作有效,查询语句永远返回-1。

  3. 检查事务状态
    保证修改操作的事务已提交。

  4. 对预处理语句做错误判断
    检查$stmt->execute()是否成功,及时处理错误。


小结

  • mysqli::$affected_rows返回-1,通常意味着最近一次SQL执行失败或者执行的是不影响行数的语句。

  • 使用时一定要结合错误信息和SQL语句类型进行判断。

  • 在写代码时,养成检查$mysqli->error或者$stmt->error的习惯,可以帮助快速定位问题。

通过以上方法,你可以更加准确地理解和处理mysqli::$affected_rows返回-1的情况,提升代码的健壮性和调试效率。