PHP连接XAMPP数据库报错排查请求:附错误信息及代码
排查PHP登录表单数据库连接及SQL错误
先逐个拆解你遇到的问题,再给出针对性的修正方案:
1. 数据库连接权限错误(Warning: mysqli_connect(): (HY000/1045))
这个错误的核心是账号权限不匹配:错误提示明确说root@localhost被拒绝访问,且标注了using password: YES,但你的代码里$password是空字符串""。这说明你的MySQL服务中root账号是设置了密码的,而你代码里填写的密码和实际数据库密码不匹配。
解决方法:
- 找到你MySQL root账号的真实密码,把代码里的
$password改成正确值,比如密码是123456,就写$password = "123456"; - 如果你确实没给root设密码,检查XAMPP的MySQL配置文件,确认是否允许无密码登录,或者重启MySQL服务尝试。
2. 连接失败后调用对象方法的错误(Notice: Trying to get property of non-object、Fatal error: Call to a member function query() on boolean)
当mysqli_connect连接失败时,它返回的是布尔值false,而不是数据库连接对象。你后续用$conn->connect_error、$conn->query()这种对象调用方式,自然会报错——因为false不是对象,没有这些属性和方法。
修正方法:
先判断连接是否成功,再执行后续逻辑,改用面向过程的写法更稳妥:
// 检查连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); }
这样连接失败时会直接终止程序,避免后续代码触发更多错误。
3. SQL INSERT语句语法错误
你的SQL语句INSERT INTO sign_in (username,password)是不完整的,缺少VALUES子句——INSERT必须指定要插入的具体值才能执行。假设你是从登录表单获取数据,可以这样写:
// 先转义表单数据防止SQL注入 $form_username = mysqli_real_escape_string($conn, $_POST['username']); $form_password = mysqli_real_escape_string($conn, $_POST['password']); // 完整的INSERT语句 $sql = "INSERT INTO sign_in (username,password) VALUES ('$form_username', '$form_password')";
如果只是测试,也可以写固定值:INSERT INTO sign_in (username,password) VALUES ('test_user', 'test_pass')
修正后的完整代码
<?php $servername = "localhost"; $username = "root"; $password = "你的实际数据库密码"; // 替换成正确的密码 $dbname = "myproject"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检查连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } // 处理表单数据(假设表单用POST提交) $form_username = mysqli_real_escape_string($conn, $_POST['username']); $form_password = mysqli_real_escape_string($conn, $_POST['password']); // 构造完整的SQL语句 $sql = "INSERT INTO sign_in (username,password) VALUES ('$form_username', '$form_password')"; if (mysqli_query($conn, $sql)) { echo "New record inserted successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } // 关闭连接 mysqli_close($conn); ?>
额外提醒:生产环境中更推荐用预处理语句来彻底防范SQL注入,示例代码如下:
$stmt = $conn->prepare("INSERT INTO sign_in (username,password) VALUES (?, ?)"); $stmt->bind_param("ss", $form_username, $form_password); // "ss"表示两个字符串类型参数 $stmt->execute();
内容的提问来源于stack exchange,提问作者Ayaz khan
相关产品推荐
相关产品推荐

