PHP分页中mysqli查询LIMIT位置错误导致mysqli_fetch_array报错求助
解决mysqli分页查询中LIMIT位置错误及"boolean given"报错问题
嘿,我来帮你搞定这个问题!你遇到的mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given报错,本质是你的SQL语句存在严重的语法错误,导致mysqli_query()执行失败,返回了false(也就是报错里的布尔值),而非正常的查询结果集,所以后续的fetch方法才会报错。
你的SQL语句存在的核心问题
- LIMIT的位置完全错误:SQL语句的执行顺序有严格要求,正确顺序是
SELECT→FROM→JOIN→WHERE→ORDER BY→LIMIT。你把LIMIT $start,$limit放在了INNER JOIN前面,数据库根本无法解析这个语句。 - WHERE子句语法错误:语句最后多了一个逗号(
WHERE by_teacher='".$_SESSION['admin_id']."',"),这会直接导致SQL解析失败。 - 严重的SQL注入风险:直接将
$_SESSION['admin_id']拼接到SQL语句中,哪怕是SESSION变量,也存在被篡改的可能,会带来安全隐患。
正确的解决方案
第一步:修正SQL语句的结构
正确的分页查询语句应该把LIMIT放在整个语句的最后,结构如下:
SELECT * FROM notes INNER JOIN subjects ON subjects.subject_id = notes.subject_id WHERE by_teacher = ? LIMIT ?, ?
第二步:使用mysqli预处理语句实现安全查询
为了避免SQL注入,同时确保语法正确,推荐使用mysqli的预处理机制:
// 1. 获取必要参数(假设$start是分页起始偏移,$limit是每页条数) $admin_id = $_SESSION['admin_id']; $start = 0; // 根据你的分页逻辑赋值,比如从GET参数获取 $limit = 10; // 每页显示的数量 // 2. 准备预处理语句 $stmt = mysqli_prepare($conn, "SELECT * FROM notes INNER JOIN subjects ON subjects.subject_id = notes.subject_id WHERE by_teacher = ? LIMIT ?, ?"); // 3. 绑定参数:"iii"表示三个整数类型的参数(如果admin_id是字符串,改成"ssi") mysqli_stmt_bind_param($stmt, "iii", $admin_id, $start, $limit); // 4. 执行语句 mysqli_stmt_execute($stmt); // 5. 获取结果集 $result = mysqli_stmt_get_result($stmt); // 6. 正常遍历结果 while ($row = mysqli_fetch_array($result)) { // 处理你的数据,比如输出或存储 echo $row['note_title']; // 示例字段,根据你的表结构调整 } // 7. 关闭语句和连接(可选,推荐) mysqli_stmt_close($stmt);
额外调试提示
如果想快速定位SQL语法问题,可以在执行查询后用mysqli_error($conn)获取具体错误信息,比如:
// 仅用于调试旧的拼接查询(不推荐生产环境使用) $query = "你的错误SQL语句"; $result = mysqli_query($conn, $query); if (!$result) { echo mysqli_error($conn); // 输出具体的SQL语法错误 }
内容的提问来源于stack exchange,提问作者Muhammad ali
相关产品推荐
相关产品推荐

