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

Laravel中explode报Expected type 'string' Found 'array'(1006)错误

报错原因

你触发Expected type 'string'. Found 'array'.intelephense(1006)报错的核心原因是参数类型不匹配:

  • Laravel中DB::select()执行查询后,返回的结果是由查询记录组成的数组,每条记录为包含对应字段的对象或关联数组,并非你预期的逗号拼接的字符串值
  • explode()函数的第二个参数要求传入字符串类型,你直接把查询返回的数组传入,不符合函数的参数规则,因此静态检测工具和运行时都会抛出错误
解决方案

根据你数据库中room_number字段的存储格式,选择对应写法即可:

场景1:每条记录的room_number存储单个房间号(常规表设计)

这种场景不需要调用explode(),直接提取查询结果中的room_number字段即可,同时建议改用参数绑定传值,避免SQL注入风险:

// 用参数绑定传入查询日期,避免SQL注入
$rooms_db = DB::SELECT(
    "SELECT room_number FROM bookings WHERE ? BETWEEN checkin_date AND checkout_date",
    [$checkin_date]
);

// 提取所有记录的room_number字段组成一维数组
$room_arr = array_column($rooms_db, 'room_number');

return response()->json(['data' => $room_arr]);

如果用Laravel查询构造器可以写得更简洁:

$room_arr = DB::table('bookings')
    ->where('checkin_date', '<=', $checkin_date)
    ->where('checkout_date', '>=', $checkin_date)
    ->pluck('room_number')
    ->toArray();

return response()->json(['data' => $room_arr]);

场景2:room_number字段存储逗号拼接的多个房间号(不推荐的表设计)

这种场景需要遍历查询结果,对每条记录的room_number字符串单独做拆分,再合并为最终的房间号数组:

$rooms_db = DB::SELECT(
    "SELECT room_number FROM bookings WHERE ? BETWEEN checkin_date AND checkout_date",
    [$checkin_date]
);

$room_arr = [];
foreach ($rooms_db as $record) {
    // 拆分单条记录里的逗号拼接房间号,合并到结果数组
    $room_arr = array_merge($room_arr, explode(',', $record->room_number));
}
// 可选:去重避免重复的房间号
$room_arr = array_unique($room_arr);

return response()->json(['data' => $room_arr]);

注意:不要直接把PHP变量拼接进SQL语句,这种写法存在严重的SQL注入风险,无论使用哪种查询方式,都优先用参数绑定的方式传入动态查询值。

内容的提问来源于stack exchange,提问作者nadeesha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:57:18