HTML表单未修改默认值时无法向MySQL提交UPDATE请求
问题分析与解决方案
你的问题核心是MySQL的affected_rows机制——它仅统计实际发生值变更的行数。当提交的数值与数据库现有值完全一致时,即便UPDATE语句执行成功,affected_rows也会返回0,导致代码误判为更新失败。
方案1:修改判断逻辑,不依赖affected_rows
如果你的需求是只要表单提交成功(无论值是否变化)就触发短信发送和页面跳转,直接判断UPDATE语句的执行结果即可,无需关注是否有行被修改:
// 捕获执行结果 $executeResult = $stmt->execute(); if ($executeResult) { sendsms($first, $last, $who); header('Refresh: 3; URL=https://example.com/success.php'); } else { echo '数据库更新执行失败,请稍后重试'; header('Refresh: 3; URL=https://example.com/return.php'); }
方案2:强制MySQL返回匹配行数
若一定要保留affected_rows的判断逻辑,可以在连接数据库时添加MYSQLI_CLIENT_FOUND_ROWS参数,让affected_rows返回WHERE条件匹配到的行数(而非实际修改的行数):
// 示例:修改数据库连接代码 $connmember = mysqli_init(); mysqli_real_connect($connmember, $host, $user, $pass, $db, null, null, MYSQLI_CLIENT_FOUND_ROWS);
这样只要WHERE条件匹配到对应id_member的记录,哪怕值未修改,affected_rows也会返回5(对应5条variable字段记录),就能正常进入成功分支。
额外优化:调整数字字段的处理逻辑
你的test_input函数使用htmlspecialchars处理金额字段,虽然不会直接引发问题,但针对数值类型的字段,更建议直接用类型转换替代,避免不必要的转义:
$novpil = (float)trim($_POST['november']); $decpil = (float)trim($_POST['december']); // 其余金额字段同理
内容的提问来源于stack exchange,提问作者thirtywest
相关产品推荐
相关产品推荐

