You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:03:11