PHP使用mysqli操作MySQL提交后数据未更新问题排查求助
PHP mysqli更新数据库不生效问题排查方案
核心问题排查点
- 提交触发逻辑校验
先确认前端提交的表单中,提交按钮的name属性值是否为edit,同时表单提交方式是否为POST,只要其中一项不符合,if(isset($_POST['edit']))的判断就不会通过,更新逻辑完全不会执行。 - 执行结果判断逻辑错误
mysqli_query执行UPDATE语句成功时返回的是布尔值true,不是数值1,且如果提交的字段值和数据库已有值完全一致,MySQL不会产生实际的更新操作,mysqli_affected_rows返回值为0,你当前的$result == 1判断逻辑会把执行成功但无数据变更的情况判定为失败,导致你误认为更新没有执行。 - SQL语法错误风险
你直接将未转义的用户输入拼接进SQL语句,一旦date/total/remarques等字段的提交值包含单引号、反斜杠等特殊字符,会直接触发SQL语法错误,导致语句执行失败。如果页面跳转后你看不到die输出的错误信息,就无法感知到这类报错。 - 匹配条件失效问题
你当前的WHERE条件是id = '$rn',如果你的id字段为数值类型,rn参数为空、传递的是字符串或者值不存在于数据库的id列中,都会导致没有行匹配到更新条件,自然不会产生数据变更。
修复后的参考代码
<?php $host = "sql308.-----.com"; $dbUsername = "----_3041----"; $dbPassword = "-----------"; $dbName = "----_3041----_phpmysqli"; $conn = mysqli_connect($host, $dbUsername, $dbPassword, $dbName); // Check connection if ($conn->connect_error) { die("连接失败!".$conn->connect_error); } // 只在POST提交时处理更新逻辑 if(isset($_POST['edit'])) { // 校验必填参数不为空 if(empty($_POST['rn']) || empty($_POST['date']) || empty($_POST['total'])) { die("必填参数缺失"); } // 对参数做转义,避免SQL注入和语法错误 $rn = mysqli_real_escape_string($conn, $_POST['rn']); $dt = mysqli_real_escape_string($conn, $_POST['date']); $to = mysqli_real_escape_string($conn, $_POST["total"]); $rk = mysqli_real_escape_string($conn, $_POST['remarques']); $sql = "UPDATE `datab1` SET `date` = '$dt', `total` = '$to', `remarques` = '$rk' WHERE `datab1`.`id` = $rn"; // 数值类型id不需要加单引号 $result = mysqli_query($conn, $sql); if($result) { // 执行成功直接跳转,不需要判断等于1 header('location:table.php'); exit; // 跳转后加exit终止后续代码执行 } else { die(mysqli_error($conn)); } } // 非POST请求的GET参数读取逻辑放在这里,避免提前覆盖POST提交的rn值 $rn = $_GET['rn'] ?? ''; $dt = $_GET['dt'] ?? ''; $to = $_GET['to'] ?? ''; $rk = $_GET['rk'] ?? ''; ?>
内容的提问来源于stack exchange,提问作者fouad B
相关产品推荐
相关产品推荐

