
本文详解 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 字段。
遵循以上规范,即可稳定、高效地将多维数组持久化至数据库。










