JS提交表单时数组被转为字符串导致PHP端报错如何解决?
问题修复方案
根本原因
你当前遇到的报错是前端提交的array字段为PHP数组格式的字符串,并非可直接遍历的二维数组。你使用(array)$_POST['array']强转只会把整个字符串塞到新数组的第一个元素中,遍历过程中$vals实际是字符串类型,自然无法用列名作为偏移量取值,就会抛出Illegal string offset警告。
修复方案
方案1:仅修改后端代码(无需调整前端逻辑)
如果你不想改动现有前端提交逻辑,可直接解析前端传入的PHP数组字面量字符串:
// 替换原来的 $array = (array)$_POST['array']; 代码 $arrayStr = $_POST['array']; // 解析var_export格式的数组字符串,若输入来源可控可直接使用,不可控请额外加安全校验 eval('$array = ' . $arrayStr . ';'); // 后续原有逻辑保持不变 $date = $_POST['col_date']; $cash = $_POST['cash']; $res = array(); foreach($array as $vals){ if(array_key_exists($vals[$date],$res)){ $res[$vals[$date]][$cash] += $vals[$cash]; $res[$vals[$date]][$date] = $vals[$date]; } else{ $res[$vals[$date]] = $vals; } }
方案2:改用JSON传输(更规范、更安全,推荐)
即使列名经常变动,也可以使用通用的JSON格式传输数组,避免PHP专属语法的兼容和安全问题:
- 前端调整:输出数组到input框时,PHP端用
json_encode转换数组格式,替代原来的var_export输出 - 后端解析逻辑调整:
// 替换原来的 $array = (array)$_POST['array']; 代码 $array = json_decode($_POST['array'], true); // 增加解析错误校验 if (json_last_error() !== JSON_ERROR_NONE) { die('传入的数组格式非法'); } // 后续原有逻辑保持不变
内容的提问来源于stack exchange,提问作者Chiliaz
相关产品推荐
相关产品推荐

