使用mysqli_multi_query执行INSERT和UPDATE失效,值显示0,能否单语句实现?
当然可以用mysqli_multi_query同时执行INSERT和UPDATE,返回值为0是有原因的
首先明确:完全没问题在一个mysqli_multi_query调用里同时跑INSERT、UPDATE甚至其他类型的SQL语句,只要把多个语句用分号;分隔开就行,数据库会按顺序执行它们。
你遇到的“数据库更新了但显示值为0”的情况,大概率是对mysqli_multi_query的返回值逻辑理解错了——这个函数的返回值和mysqli_query不一样:
- 它只返回第一个SQL语句的执行启动状态:如果第一个语句是查询类(比如SELECT),成功返回
true,失败返回false;如果第一个是INSERT/UPDATE这类写操作,成功也会返回true表示语句已成功发送给数据库。 - 如果你看到的“值为0”是受影响行数的话,那可能是你只获取了第一个语句的受影响行数(比如第一个语句是SELECT,受影响行数本来就是0),而实际执行更新的是后面的语句,你没去获取它的受影响行数。
举个正确处理多语句结果的例子:
// 示例多语句(先不考虑SQL注入,后面会重点提醒) $sql = "UPDATE fees SET amount = '$courseFee' WHERE studentid = '$studentId'; INSERT INTO payment_records (student_id, amount) VALUES ('$studentId', '$courseFee')"; // 执行多语句 if (mysqli_multi_query($con, $sql)) { $totalAffected = 0; // 遍历所有语句的结果,累加受影响行数 do { $totalAffected += mysqli_affected_rows($con); } while (mysqli_next_result($con)); echo "总共成功影响了 {$totalAffected} 行数据"; } else { echo "第一个语句执行出错:" . mysqli_error($con); }
另外必须严肃提醒你:你当前的代码直接把$courseId、$studentId这类变量拼进SQL里,存在严重的SQL注入风险!哪怕用mysqli_multi_query,也绝对不要这么做。强烈建议改用预处理语句(Prepared Statements),如果需要保证多个语句的原子性(要么全成功要么全失败),可以配合事务使用:
// 开启事务 mysqli_begin_transaction($con); // 预处理UPDATE语句 $updateStmt = mysqli_prepare($con, "UPDATE fees SET amount = ? WHERE studentid = ?"); mysqli_stmt_bind_param($updateStmt, "si", $courseFee, $studentId); mysqli_stmt_execute($updateStmt); // 预处理INSERT语句 $insertStmt = mysqli_prepare($con, "INSERT INTO payment_records (student_id, amount) VALUES (?, ?)"); mysqli_stmt_bind_param($insertStmt, "is", $studentId, $courseFee); mysqli_stmt_execute($insertStmt); // 提交事务 mysqli_commit($con); // 获取总受影响行数 $totalAffected = mysqli_stmt_affected_rows($updateStmt) + mysqli_stmt_affected_rows($insertStmt); echo "总共影响行数:{$totalAffected}";
最后,你给出的代码片段是截断的(if(mysq...),如果你的多语句执行逻辑在这部分,可能是那里没有正确调用mysqli_next_result()遍历所有结果,导致你只拿到了第一个语句的无效数值。可以重点检查这部分逻辑。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

