mysqli_query()返回false表示查询执行失败,需用=== false严格判断并调用$mysqli->error获取具体错误信息,不可直接fetch;成功时才返回mysqli_result对象或布尔true(非select语句)。

mysqli_query() 返回 false 怎么判断和处理
直接调用 mysqli_query() 后不检查返回值,是新手最常踩的坑。它在查询失败时返回 false,不是空数组或空对象——如果没做判断就直接 foreach 或 ->fetch_assoc(),会触发 Warning 甚至 Fatal error。
- 必须先用
=== false判断(不能只用if (!$result),因为查询成功但无数据时结果集可能为“空”,但仍是有效对象) - 出错后用
$mysqli->error和$mysqli->errno查具体原因,比如1054(Unknown column)、1146(Table doesn't exist) - 注意:只有
SELECT、SHOW、EXPLAIN等返回结果集的语句才用mysqli_query();INSERT/UPDATE/DELETE建议改用mysqli_prepare()+execute()防注入
用 mysqli_result->fetch_assoc() 取数据时总报 Call to a member function fetch_assoc() on bool
这个错误说明你把 mysqli_query() 的返回值当成了结果集对象,但它其实是 false(查询失败)或 mysqli_result 对象(成功)。常见于忘记判断就直接链式调用。
- 正确写法:
$result = $mysqli->query("SELECT id, name FROM users"); if ($result === false) { die("Query failed: " . $mysqli->error); } while ($row = $result->fetch_assoc()) { echo $row['id'] . ': ' . $row['name']; } -
fetch_assoc()每次只取一行,内部指针自动下移;取完再调用会返回null,不是报错,但要注意循环边界 - 如果只需要一行,用
$result->fetch_row()或$result->fetch_array(MYSQLI_ASSOC)效果一样,但fetch_assoc()最清晰
为什么 mysqli_connect() 成功了,但 query 却提示 No database selected
面向对象方式下,new mysqli() 构造函数的第四个参数是数据库名,**不是可选的**。漏传或传空字符串,连接成功但没选库,后续所有查询都会失败。
- 正确初始化:
$mysqli = new mysqli('localhost', 'user', 'pass', 'mydb'); - 如果想连接后切换库,用
$mysqli->select_db('otherdb'),但不如初始化时指定稳妥 - 注意:主机地址写
127.0.0.1和localhost在某些系统下行为不同(前者走 TCP,后者可能走 socket),若权限配置按 host 区分,这里也可能导致“能连不能查”
查出来的中文是乱码?set_charset() 放哪儿才生效
乱码通常不是前端问题,而是 MySQL 连接层编码没对齐。必须在执行任何查询前调用 set_charset(),且要跟表/字段的字符集一致(一般是 utf8mb4)。
- 放在
new mysqli()之后、第一个query()之前:$mysqli = new mysqli('localhost', 'user', 'pass', 'mydb'); $mysqli->set_charset('utf8mb4'); - 不要用
SET NAMES utf8mb4查询代替——它只是 SQL 指令,不如set_charset()彻底(后者还会影响mysql_real_escape_string行为) - 确认表结构也是
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,否则即使连接层正确,存进去还是乱码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











