Linux下PHP正确连接MySQL数据库读取数据及报错解决方案
报错原因解析
报错核心是$conn->query($sql)执行失败返回了布尔值false,你直接对布尔值调用fetch_array()方法就会触发该错误。常见触发原因如下:
test数据库中不存在名为user的表- 配置的
my_user账号没有test库user表的查询权限 - 表名
user是MySQL内置关键字,未加反引号包裹导致SQL语法错误 - 数据库连接会话后续异常(概率较低)
正确的PHP连接MySQL实现方案
修正后的完整代码(带完整错误校验)
<html> <head> <title>Test PHP Connection Script</title> </head> <body> <h3>PHP Connect Test</h3> <?php $dbname = 'test'; $dbuser = 'my_user'; $dbpass = 'my_password'; $dbhost = 'localhost'; // 开启MySQLi异常上报方便排查问题 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); try { $conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname); $conn->set_charset("utf8mb4"); // 统一设置字符集避免中文乱码 // 关键字作为表名需用反引号包裹 $sql = "SELECT * FROM `user`"; $result = $conn->query($sql); // 先校验查询结果合法性,再判断是否有返回数据 if ($result && $result->num_rows > 0) { // 循环输出所有匹配数据,避免单条数据为空的问题 while($row = $result->fetch_assoc()) { printf("%s %s (%s)<br>", $row["firstname"], $row["lastname"], $row["age"]); } } else { echo "未查询到匹配数据"; } // 释放结果集、关闭连接释放资源 $result->free(); $conn->close(); } catch (mysqli_sql_exception $e) { // 调试阶段直接输出错误,生产环境请改为写入日志 echo "数据库操作错误:" . $e->getMessage(); exit(); } ?> </body> </html>
Linux环境额外检查项
- 确认MySQL服务正常运行:执行命令
systemctl status mysql(部分发行版服务名为mysqld/mariadb),未启动则执行systemctl start mysql,如需开机自启追加enable参数即可 - 验证库表及账号权限:
- 命令行执行
mysql -u root -p登录数据库 - 执行
show databases;确认test库存在 - 执行
use test;切换到test库,执行show tables;确认user表存在,执行descuser;确认表中存在firstname、lastname、age三个字段 - 执行
show grants for 'my_user'@'localhost';确认账号权限,无查询权限则执行GRANT SELECT ON test.* TO 'my_user'@'localhost'; FLUSH PRIVILEGES;完成授权
- 命令行执行
- 确认PHP mysqli扩展已启用:执行
php -m | grep mysqli,无输出则安装对应扩展,Debian/Ubuntu系执行apt install php-mysqli,CentOS/RHEL系执行yum install php-mysqli,安装完成后执行systemctl restart apache2(部分发行版服务名为httpd)重启Apache生效
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

