
本文详解 php 中处理关联型多维数组并逐条插入数据库的正确方法,重点解决“trying to get Property of non-Object”和“illegal String offset”等常见错误,涵盖数组访问语法、循环插入逻辑及数据结构适配要点。
在 php 中,当你从查询或外部接口获取一个关联键名的多维数组(如 $output_querys),却用对象属性语法($output_query->ID)访问其元素时,就会触发 Trying to get property of non-object 错误——因为该变量是数组,不是对象。同理,若变量意外被转为字符串(例如错误调用 json_encode() 后未解码),再用数组下标访问,就会报 Illegal string offset。
✅ 正确做法:统一使用数组语法访问
你的原始数据结构是标准的索引数组 + 关联子数组:
$output_querys = [ ['ID' => '2', 'Code' => 'AWS001', 'Des' => 'loan', ...], ['ID' => '4', 'Code' => 'AWS002', 'Des' => 'tax', ...] ];
因此,必须使用方括号语法($output_query[‘ID’]),而非箭头语法($output_query->ID):
foreach ($output_querys as $output_query) { $Pv_ID = $output_query['ID']; // ✅ 正确:数组键访问 $Pv_Code = $output_query['Code']; $Pv_Description = $output_query['Des']; $data_final = [ 'id' => $Pv_ID, 'code' => $Pv_Code, 'des' => $Pv_Description ]; // ⚠️ 关键:insert 必须在循环内,否则只插入最后一条 $db->insert('abc', $data_final); // 注意表名应为字符串(加引号) }
❌ 常见错误剖析
| 错误写法 | 问题原因 |
|---|---|
| $output_query->ID | 将数组误当对象,PHP 无法读取对象属性 → Trying to get property of non-object |
| json_encode($output_query[‘Code’], true) | json_encode() 返回字符串,后续若误用于数组访问(如 $str[‘ID’])→ Illegal string offset |
| db->insert(…) 在 foreach 外 | $data_final 被反复覆盖,最终仅插入最后一组数据 |
? 进阶建议:批量插入提升性能(可选)
若数据量较大(如 > 100 条),建议改用批量插入减少数据库往返:
立即学习“PHP免费学习笔记(深入)”;
$batch_data = []; foreach ($output_querys as $row) { $batch_data[] = [ 'id' => $row['ID'], 'code' => $row['Code'], 'des' => $row['Des'] ]; } $db->insertBatch('abc', $batch_data); // 假设 DB 类支持 insertBatch()
✅ 总结检查清单
- ✅ 确认源数据是数组(用 is_array() 或 var_dump() 验证);
- ✅ 访问关联键一律用 $arr[‘key’],禁用 ->key;
- ✅ insert() 必须置于 foreach 循环体内,确保每条记录独立入库;
- ✅ 表名、字段名作为字符串传入(如 ‘abc’ 而非 abc,后者会被解析为常量);
- ✅ 避免对数组元素做无意义的 json_encode()/json_decode(),除非需存储为 JSON 字段。
遵循以上规范,即可稳定、高效地将多维数组持久化至数据库。