PHP报Trying to access array offset on bool错误,求排查while循环数组赋值问题
解决「Trying to access array offset on value of type bool」错误
嘿,我一眼就瞅出问题所在了——while循环的条件表达式优先级搞混了!PHP里逻辑运算符&&的优先级比赋值运算符=高,所以你写的这行代码:
while ($r = $row->fetch_array(MYSQLI_ASSOC) && $i < $numrow)
实际执行顺序是先算$row->fetch_array(MYSQLI_ASSOC) && $i < $numrow这个逻辑判断,得到一个布尔值(true/false),然后把这个布尔值塞给$r。等你后面想去取$r['user_name']的时候,$r已经是个布尔值了,根本不是数组,自然就触发这个报错了。
快速修复
给赋值表达式套个括号,强制让它先执行赋值,再做逻辑判断:
while (($r = $row->fetch_array(MYSQLI_ASSOC)) && $i < $numrow)
额外的优化建议
除了修复这个报错,还有几个地方可以让你的代码更安全、更简洁:
- 堵上SQL注入漏洞:你直接把
$skill拼进SQL语句里,这是非常危险的操作,很容易被黑客注入攻击。换成预处理语句才是正确的姿势:
$qry = "select * from useri_nfo where skills=? order by u_id ASC"; $stmt = $conn->prepare($qry); $stmt->bind_param("s", $skill); // "s"表示参数是字符串类型 $stmt->execute(); $result = $stmt->get_result(); // 之后用$result代替原来的$row做fetch操作
- 简化数组初始化:没必要预先创建指定长度的数组,直接在循环里用
[]追加元素就行,代码清爽多了:
$name = []; $profile_img = []; $skills = []; $address = [];
- 加个错误判断:可以给数据库连接、查询加个错误捕获,比如检查
$conn->connect_error或者$stmt->error,方便后续排查问题。
修复后的完整代码示例
$conn = new mysqli('localhost','root','','project_nlt'); // 检查数据库连接是否成功 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 使用预处理语句防止SQL注入 $qry = "select * from useri_nfo where skills=? order by u_id ASC"; $stmt = $conn->prepare($qry); $stmt->bind_param("s", $skill); $stmt->execute(); $result = $stmt->get_result(); $numrow = $result->num_rows; $name = []; $profile_img = []; $skills = []; $address = []; $i = 0; echo $numrow; while (($r = $result->fetch_array(MYSQLI_ASSOC)) && $i < $numrow) { $name[$i] = $r['user_name']; $profile_img[$i] = $r['dp']; $skills[$i] = $r['skills']; $address[$i] = $r['address']; echo $name[$i]; $i++; } // 关闭语句和连接 $stmt->close(); $conn->close();
内容的提问来源于stack exchange,提问作者terinao
相关产品推荐
相关产品推荐

