PHP 7数据库连接问题:连接成功但无法更新数据表求助
解决PHP数据库连接成功但无法更新users表的问题
我来帮你排查一下这个问题,从你的代码来看,有几个关键问题可能导致更新失败,咱们一步步来解决:
1. 变量作用域问题(最可能的核心原因)
你的$con数据库连接变量是在全局作用域定义的,但在_VoteReward函数里直接使用它时,函数默认会把它当成局部变量——也就是说,函数内部根本找不到这个连接对象,自然没法执行SQL语句。
解决方法有两种,更推荐第二种(避免全局变量污染):
// 方法1:在函数内声明使用全局变量 function _VoteReward($custom) { global $con; // 明确告知函数要用全局的$con $sql = "UPDATE `users` SET `gold` = `gold` + 50000 WHERE `id` = '" . $custom . "' "; mysqli_query($con, $sql); } // 方法2:把连接对象作为参数传入(更规范) function _VoteReward($con, $custom) { $sql = "UPDATE `users` SET `gold` = `gold` + 50000 WHERE `id` = '" . $custom . "' "; mysqli_query($con, $sql); } // 调用时改成这样: _VoteReward($con, $custom);
2. 缺少错误检测,没法定位问题
你现在的代码完全没检查mysqli_query的执行结果,就算SQL语法错了、权限不够或者找不到匹配的行,你也不知道哪里出问题。加上错误检测能帮你快速揪出问题:
$result = mysqli_query($con, $sql); if (!$result) { die("更新失败:" . mysqli_error($con)); // 直接输出数据库返回的错误信息 }
3. 严重的SQL注入风险(同时可能导致语法错误)
直接把用户提交的$custom拼到SQL语句里,不仅容易被黑客攻击,还可能因为输入的特殊字符(比如单引号)导致SQL语法错误。强烈建议用预处理语句替代:
function _VoteReward($con, $custom) { // 用占位符?代替直接拼接变量 $sql = "UPDATE `users` SET `gold` = `gold` + 50000 WHERE `id` = ?"; $stmt = mysqli_prepare($con, $sql); // 绑定参数,"i"表示这个参数是整数类型(id通常是整数) mysqli_stmt_bind_param($stmt, "i", $custom); mysqli_stmt_execute($stmt); // 还可以检查影响的行数,判断是否真的更新了数据 if (mysqli_stmt_affected_rows($stmt) === 0) { echo "提示:没有找到匹配的用户ID,或者金币值未发生变化"; } else { echo "更新成功,共修改了" . mysqli_stmt_affected_rows($stmt) . "条记录"; } mysqli_stmt_close($stmt); }
4. 完善用户输入的验证
$custom是从$_POST获取的,默认是字符串类型,最好先转成整数(因为user表的id一般是整数),同时还要判断参数是否存在:
// 先判断参数是否存在,再转成整数,避免Undefined index错误 $custom = isset($_POST["custom"]) ? (int)$_POST["custom"] : 0; $key = isset($_POST["key"]) ? $_POST["key"] : '';
整合后的完整代码
<?php $host = 'localhost'; $db_name = 'db_name'; $db_user = 'user'; $db_password = 'password'; $con = mysqli_connect($host, $db_user, $db_password, $db_name); if (!$con) { die("Connection failed: " . mysqli_connect_error()); } function _VoteReward($con, $custom) { $sql = "UPDATE `users` SET `gold` = `gold` + 50000 WHERE `id` = ?"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "i", $custom); $executeResult = mysqli_stmt_execute($stmt); if (!$executeResult) { die("更新执行失败:" . mysqli_stmt_error($stmt)); } $affectedRows = mysqli_stmt_affected_rows($stmt); if ($affectedRows === 0) { echo "提示:没有匹配的用户ID,或者金币值未发生变化"; } else { echo "更新成功,共修改" . $affectedRows . "条记录"; } mysqli_stmt_close($stmt); } $custom = isset($_POST["custom"]) ? (int)$_POST["custom"] : 0; $key = isset($_POST["key"]) ? $_POST["key"] : ''; $result = false; if (($custom > 0) && ($key == 'key')) { $result = true; _VoteReward($con, $custom); } mysqli_close($con); ?>
按照上面的步骤修改后,你就能看到具体的错误提示或者成功信息,很快就能定位问题啦。
内容的提问来源于stack exchange,提问作者WikStar
相关产品推荐
相关产品推荐

