树莓派中PHP无法连接MySQL问题求助
解决你的PHP数据库连接&500错误问题
首先,HTTP 500错误是服务器内部错误,想要快速定位问题,第一步一定要看Apache的错误日志,在树莓派上你可以通过这条命令查看最新的错误信息:
tail -f /var/log/apache2/error.log
当你再次提交表单或者访问测试连接脚本时,日志里会显示具体的错误原因(比如语法错误、数据库连接失败的详细信息),这是排查500错误的关键。
接下来看你代码里的几个明显问题:
1. 数据库连接代码的语法错误
你最初的连接代码:
$con=mysqli_connect("'localhost'",pi,"pwd","testdatabase");
有三个致命错误:
"'localhost'"多套了一层单引号,应该写成"localhost"pi和pwd是字符串类型的用户名和密码,必须用引号包裹,比如"pi"和"你实际的MySQL密码"- 替换
"pwd"为你登录MySQL时输入的真实密码(就是你用mysql -u pi -p时输入的密码)
修正后的连接代码应该是:
$con = mysqli_connect("localhost", "pi", "你的真实密码", "testdatabase");
2. 测试连接脚本用错了用户
你后来的测试脚本用了root用户,但树莓派上的MySQL(或MariaDB)默认root用户是通过auth_socket插件认证的——也就是说它只能通过本地终端的root用户登录,不能用密码通过PHP脚本登录,这就是你测试连接也失败的原因。
既然你能通过mysql -u pi -p正常登录,测试连接时就应该用pi用户,把测试脚本改成:
<?php $link = mysqli_connect("localhost", "pi", "你的真实密码"); if($link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); } echo "Connect Successfully. Host info: " . mysqli_get_host_info($link); mysqli_close($link); ?>
3. 严重的SQL注入风险
你最初的插入脚本直接把$_POST[email]和$_POST[password]拼到SQL语句里,这会导致严重的SQL注入漏洞,攻击者可以轻易篡改你的数据库。必须使用预处理语句(prepared statements)来解决这个问题,修正后的插入脚本示例:
<?php $con = mysqli_connect("localhost", "pi", "你的真实密码", "testdatabase"); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); exit(); } // 预处理SQL语句,用?作为占位符 $stmt = mysqli_prepare($con, "INSERT INTO users (email, password) VALUES (?, ?)"); // 绑定参数:"ss"表示两个字符串类型的参数 mysqli_stmt_bind_param($stmt, "ss", $_POST['email'], $hashed_password); // 重要:不要明文存储密码,用password_hash加密 $hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT); if(mysqli_stmt_execute($stmt)){ echo "1 record added"; } else { die('Error: ' . mysqli_error($con)); } // 关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($con); ?>
额外提醒
- 确保
users表确实存在email和password字段,并且字段类型正确(比如email是VARCHAR,password是VARCHAR(255)因为加密后的密码比较长) - 如果还是有问题,先单独测试连接脚本,确认能正常连接后再测试表单提交
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

