PHP代码无报错但数据库无法更新问题求助
问题分析与修复方案
首先一眼就戳中核心问题:你只定义了更新的SQL语句,但根本没有执行它!这就是数据库没变化的原因——代码只是把SQL字符串写出来了,没告诉PHP去实际运行这条命令。另外还有几个潜在问题,我一起帮你梳理清楚:
1. 最关键的缺失:执行SQL语句
在你定义完$sql变量之后,必须调用mysql_query()来执行这条更新命令,最好加上错误检查方便排查问题:
$sql = "UPDATE `mydatabase` SET `mon_am` = '$mon_am' WHERE `id` = 1"; // 执行SQL并检查是否成功 if (!mysql_query($sql, $conn)) { die('更新失败: ' . mysql_error()); }
2. 必须处理的SQL注入风险
直接把$_POST的内容拼到SQL里是非常危险的操作,哪怕是自己用的小项目也可能被攻击。你需要用mysql_real_escape_string()来转义用户输入:
$mon_am = mysql_real_escape_string($_POST['mon_am'], $conn);
3. 字符串类型字段的引号问题
如果mon_am是字符串类型的字段,你的原SQL里没有给变量加引号,这会导致SQL语法错误(你在phpMyAdmin里能执行是因为手动输入时加了引号)。转义后一定要给变量加上单引号,就像上面修复的那样。
4. 过时函数的警告
mysql_*系列函数早在PHP 5.5就被废弃了,PHP 7更是直接移除了这些函数,所以强烈建议你换成mysqli扩展(MySQL Improved),兼容性更好也更安全。下面给你一个用mysqli重写的版本:
推荐的mysqli修复版代码
<?php if(isset($_POST['submit'])){ $dbhost = 'localhost'; $dbuser = 'dbuser'; $dbpass = 'dbpass'; $dbname = 'mydatabase'; // 这里要明确指定数据库名 // 创建mysqli连接 $conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname); // 检查连接错误 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 使用参数化查询彻底避免SQL注入 $stmt = $conn->prepare("UPDATE `mydatabase` SET `mon_am` = ? WHERE `id` = 1"); $stmt->bind_param("s", $_POST['mon_am']); // "s"表示字符串类型,根据字段类型调整(i=int, d=double) $stmt->execute(); if($stmt->affected_rows > 0){ echo "更新成功!"; } else { echo "没有数据被更新,可能输入内容和原数据一致或查询出错"; } $stmt->close(); $conn->close(); } ?> <!DOCTYPE html> <html> <head> <title>title</title> </head> <body> <form method="POST" action="mon_am.php"> <input type="text" name="mon_am"> <input type="submit" name="submit"> </form> </body> </html>
额外小问题
原代码里mysql_close($conn);放在了if(isset($_POST['submit']))外面,当用户第一次访问页面没有提交表单时,$conn还没定义就会触发错误,所以一定要把关闭连接的代码放到if块里面。
内容的提问来源于stack exchange,提问作者Regan
相关产品推荐
相关产品推荐

