当前位置: 首页> 最新文章列表> 【mysqli::$affected_rows】在插入数据后的常见误区

【mysqli::$affected_rows】在插入数据后的常见误区

gitbox 2025-05-26

1. mysqli::$affected_rows 的基本用法

<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");

$sql = "INSERT INTO users (username, email) VALUES ('testuser', '[email protected]')";
$mysqli->query($sql);

echo "受影响的行数:" . $mysqli->affected_rows;
?>

上述代码中,插入了一条新数据,$affected_rows 应该返回 1,表示插入了一行。


2. 常见误区及解决方案

误区1:插入数据后返回 0,明明插入成功了

  • 原因:如果你执行的是 INSERT ... ON DUPLICATE KEY UPDATE 语句,并且实际没有更新任何数据,那么 $affected_rows 可能返回 2 或 0,具体取决于 MySQL 版本。

  • 说明

    • MySQL 5.1 及更早版本中,ON DUPLICATE KEY UPDATE 影响的行数是 1(插入)或 2(更新)。

    • MySQL 5.7 以后,如果没有实际更新数据,返回 0。

  • 解决

    • 你可以检查 $mysqli->info 获取详细信息,或者根据需求调整逻辑。

误区2:执行多条 SQL 时,受影响行数不准确

<?php
$sql = "INSERT INTO users (username) VALUES ('user1');";
$sql .= "INSERT INTO users (username) VALUES ('user2');";

$mysqli->multi_query($sql);
do {
    if ($result = $mysqli->store_result()) {
        $result->free();
    }
    echo "受影响的行数:" . $mysqli->affected_rows . "\n";
} while ($mysqli->more_results() && $mysqli->next_result());
?>
  • 说明$affected_rows 是针对最近一次执行的查询,如果你批量执行多条语句,必须逐条处理结果,才能准确获得每条语句的受影响行数。

误区3:$affected_rows 对于 SELECT 语句无效

  • $affected_rows 只对写操作(INSERT、UPDATE、DELETE)有效,SELECT 语句不会影响任何行数,返回 -1。

  • 如果想知道 SELECT 查询返回多少条结果,应该使用 $result->num_rows


3. 影响 $affected_rows 的其他因素

  • 事务未提交:如果开启了事务,且未提交,$affected_rows 仍然反映实际影响行数,但数据未提交到数据库。

  • 触发器影响:MySQL 触发器执行过程中对行的修改不会改变 PHP 中 $affected_rows 的值。

  • 连接状态:确保 mysqli 连接正常,错误时 $affected_rows 可能返回 -1。


4. 推荐调试技巧

  • 使用 $mysqli->error 检查是否有 SQL 错误。

  • 使用 $mysqli->info 查看最近执行语句的详细信息。

  • 开启 MySQL 日志或者使用工具查看执行的 SQL 是否和预期一致。


5. 总结

mysqli::$affected_rows 是检测写操作影响行数的有效工具,但在以下情况下容易让人困惑:

  • 使用复杂 SQL(如 ON DUPLICATE KEY UPDATE)时,返回值规则需特别注意。

  • 多条 SQL 批量执行时,需逐条处理结果。

  • SELECT 语句不会影响行数,使用 $result->num_rows 替代。

  • 事务、触发器等也可能影响实际表现。

只要理解其工作原理和边界条件,$affected_rows 就能帮你准确判断数据库操作效果,提升代码健壮性。