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

PHP新手求助:MySQLi相关报错排查与修复

嘿,别慌!这些都是PHP新手常遇到的典型问题,咱们一个个拆解解决,很快就能搞定:

先逐个分析错误原因&修复方案

1. mysqli_real_escape_string() 参数不足的警告

这个函数必须传两个参数:第一个是数据库连接对象$conn,第二个才是要转义的字符串。你的sanitize()和array_sanitize()函数里只传了待处理的变量,漏掉了$conn。

修改general.php里的这两个函数:

// 修正array_sanitize(注意传引用,否则array_walk无法修改原数组)
function array_sanitize(&$item) {
    global $conn; // 声明使用全局的$conn变量
    $item = htmlentities(strip_tags(mysqli_real_escape_string($conn, $item)));
}

// 修正sanitize函数
function sanitize($data) {
    global $conn;
    return htmlentities(strip_tags(mysqli_real_escape_string($conn, $data)));
}

2. users.php里$conn未定义的提示

PHP函数内部默认不能直接访问全局作用域的变量,你在文件开头定义了$conn,但在f_activate()、update_f()这些函数里直接用的话,函数会把它当成未定义的局部变量,所以才会出现null的错误。

解决方法是:在每个用到$conn的函数开头加上global $conn;,新手先从全局变量入手更简单,后续可以尝试用参数传递的更规范写法。

3. mysqli_query()传入null的警告

这个是上面$conn未定义导致的连锁问题,只要修复了$conn的问题,这个错误就自动消失了。

4. mysqli_result()函数不存在的致命错误

PHP 7.0之后已经彻底移除了这个函数,不能再用了。我们需要用mysqli_fetch_row()或者mysqli_fetch_assoc()来替代它获取查询结果。

修改users.php里的f_activate()函数:

function f_activate($f_mailid, $f_mailcode) {
    global $conn; // 声明使用全局$conn
    // 这里不要直接用$_POST,应该用传入的参数,保持函数独立性
    $f_mailid = sanitize($f_mailid);
    $f_mailcode = sanitize($f_mailcode);
    
    // 先执行查询,拿到结果集
    $result = mysqli_query($conn, "SELECT COUNT(`f_id`) FROM `flight_users` WHERE `f_mailid` = '$f_mailid' AND `f_mailcode` = '$f_mailcode' AND `f_active` = 0");
    // 用mysqli_fetch_row获取第一行的第一个值
    $count = mysqli_fetch_row($result)[0];
    
    if($count == 1) {
        mysqli_query($conn, "UPDATE `flight_users` SET `f_active` = 1 WHERE `f_mailid` = '$f_mailid' ");
        return true;
    } else {
        return false;
    }
}

还要修复users.php里其他函数的$conn问题

除了f_activate(),其他用到mysqli_query()的函数都要补上$conn参数和全局声明:

  • update_f()函数:
function update_f($f_id, $update_data) {
    global $conn; // 加上这行
    $update = array();
    array_walk($update_data, 'array_sanitize');
    foreach ($update_data as $field => $data) {
        $update[] = '`' . $field . '` = \'' . $data . '\'';
    }
    // 注意SQL语句里SET和WHERE之间要加空格!原来的代码漏了空格会导致语法错误
    mysqli_query($conn, "UPDATE `flight_users` SET " . implode(', ',$update) . " WHERE `f_id` = $f_id") or die(mysqli_error($conn));
}
  • register_f()函数里的mysqli_query要加上$conn:
mysqli_query($conn, "INSERT INTO `flight_users` ($fields, `f_regdate`) VALUES ($data, NOW())");
  • f_change_password()函数里的mysqli_query也要加上$conn:
mysqli_query($conn, "UPDATE `flight_users` SET `f_password` = '$f_password', `f_passrec` = 0 WHERE `f_id` = $f_id");

额外小提示

你的register_f()函数里的激活邮件链接没写完,应该把$register_data['f_mailid']和激活码拼到链接后面,不然用户点不开激活页面哦~

内容的提问来源于stack exchange,提问作者Jie Eim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:24:17