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
相关产品推荐
相关产品推荐

