使用PHP UPDATE语句更新MySQL记录无生效 数据未修改问题求助
核心问题原因
- 更新处理脚本
actions/update-commit.php中,UPDATE语句WHERE条件用到的$c_id变量未声明赋值,也没有从请求中获取记录ID,导致UPDATE语句匹配不到任何要修改的记录,自然不会触发数据更新。 - 详情页的编辑表单没有将当前记录的ID作为参数传递给更新接口,即使更新脚本想要获取ID也没有来源。
- 可选优化问题:当前预处理参数绑定中,
length和min_time为数值类型,却使用了字符串s绑定,同时代码缺少错误校验逻辑,无法定位执行异常。
具体修复方案
第一步:修改详情页表单,传递记录ID
在详情页的<form>标签内部、提交按钮之前,新增隐藏字段传递当前记录的ID:
<!-- 其他表单input保持不变 --> <input type="hidden" name="c_id" value="<?=$id?>"> <input type='submit' name='update' value='Update' id='update' class='button small yellow'>
第二步:修改update-commit.php代码,补全逻辑和错误校验
替换原更新处理代码为以下版本:
<?php require("../const.php"); check_loggedin($con); $msg = ''; // 校验必要参数是否存在 if (!isset($_POST['name'], $_POST['description'], $_POST['assignee'], $_POST['length'], $_POST['min_time'], $_POST['c_id'])) { exit('参数缺失,请检查表单提交内容'); } // 从POST请求中获取记录ID $c_id = (int)$_POST['c_id']; // 预处理语句 注意数值类型用i绑定 $stmt = $con->prepare('UPDATE sys_commits SET name = ?, description = ?, assignee = ?, length = ?, min_time = ? WHERE id = ?'); if (!$stmt) { exit('预处理语句错误:' . $con->error); } // 三个字符串+三个整数,绑定类型为sssiii $stmt->bind_param('sssiii', $_POST['name'], $_POST['description'], $_POST['assignee'], $_POST['length'], $_POST['min_time'], $c_id); if (!$stmt->execute()) { exit('执行更新错误:' . $stmt->error); } // 校验是否真的有记录被更新 if ($stmt->affected_rows === 0) { exit('没有记录被更新,可能是ID不存在或内容无变化'); } $stmt->close(); header('Location: ../commitments.php'); exit; ?>
可选优化建议
- 删除详情页中无用的
isset($_GET['post'])相关代码段,该逻辑未实际用到且存在错误调用$dbc连接变量的问题 - 详情页查询单条记录的逻辑也替换为预处理语句,避免SQL注入风险,替换原查询代码为:
if (isset($_GET['id'])) { $id = (int)$_GET['id']; $stmt = $con->prepare("SELECT * FROM sys_commits WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); if (!$row) { header('Location: commitments.php'); exit; } }
内容的提问来源于stack exchange,提问作者Andrew Godby
相关产品推荐
相关产品推荐

