PHP与MySQL出现未捕获错误问题排查及代码分析
PHP注册功能Uncaught Error排查与解决方法
嘿,我来帮你拆解这段代码里的问题——几个小细节凑到一起,就触发了这个未捕获错误:
1. MySQL扩展与mysqli扩展混用(最直接的报错原因)
你用mysqli_connect()建立了数据库连接,但后续却调用了mysql_real_escape_string()函数。这俩属于完全独立的PHP数据库扩展:mysql扩展早就被废弃(PHP7+甚至直接移除了),而且它和mysqli不共享连接资源,直接调用会立刻触发致命错误。
解决方法:把所有mysql_real_escape_string()替换成mysqli_real_escape_string(),并且必须传入数据库连接对象作为第一个参数:
$username = mysqli_real_escape_string($db, $_POST['username']); $email = mysqli_real_escape_string($db, $_POST['email']); $password = mysqli_real_escape_string($db, $_POST['password']); $password2 = mysqli_real_escape_string($db, $_POST['password2']);
2. 变量名拼写错误
你在INSERT语句里写的是'$usrname',但前面定义的变量明明是$username——少了一个字母'e'!这会触发“Undefined variable: usrname”的错误,直接中断SQL语句的执行。
解决方法:把SQL语句里的$usrname改成$username。
3. SQL语句语法不完整
你的INSERT语句末尾有...,而且括号没闭合,这属于明显的SQL语法错误,会导致数据库查询失败,进而抛出错误。
解决方法:补全并修正SQL语句:
$sql = "INSERT INTO users(username, email, password) VALUES('$username','$email','$password')";
4. 额外的安全性建议(非错误原因,但必须提)
虽然不是直接导致错误的问题,但md5()加密密码已经完全不安全了,建议改用PHP原生的password_hash()函数,它会自动生成符合安全标准的哈希值:
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
后续验证密码时,使用password_verify()函数即可完成匹配。
修正后的完整代码示例
<?php // 开启错误显示,方便调试(上线前记得关闭) error_reporting(E_ALL); ini_set('display_errors', 1); session_start(); $db = mysqli_connect("localhost","root", "", "authentication"); // 检查连接是否成功 if (!$db) { die("数据库连接失败: " . mysqli_connect_error()); } if (isset($_POST['regbtn'])) { $username = mysqli_real_escape_string($db, $_POST['username']); $email = mysqli_real_escape_string($db, $_POST['email']); $password = $_POST['password']; $password2 = $_POST['password2']; if ($password == $password2) { // 使用安全的密码哈希算法 $passwordHash = password_hash($password, PASSWORD_DEFAULT); // 修正变量名与SQL语法 $sql = "INSERT INTO users(username, email, password) VALUES('$username','$email','$passwordHash')"; if (mysqli_query($db, $sql)) { // 注册成功,跳转至登录页 $_SESSION['success'] = "注册成功,请登录"; header('Location: login.php'); exit; } else { // 捕获SQL执行错误 $_SESSION['error'] = "注册失败: " . mysqli_error($db); } } else { // 密码不匹配提示 $_SESSION['error'] = "两次输入的密码不一致!"; } } ?>
内容的提问来源于stack exchange,提问作者A M
相关产品推荐
相关产品推荐

