You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:00