PHP提交表单执行更新查询时出现basic.php1443行数组转字符串报错
问题分析与修复方案
报错根因
- 循环内的
print $new_data是第一个潜在触发点:$new_data是数组类型,PHP 不支持直接用print输出数组,直接输出就会触发「Array to string conversion」提示。 - 第1443行是明确报错触发点:你重复调用了
execute()方法,第一次调用$stmt->execute($new_data)已经完成了参数绑定和SQL更新操作,第二次调用无参数的execute()时,PDO会尝试复用之前的参数绑定上下文,此时如果没有有效绑定值、或绑定参数中存在数组类型值,就会触发转字符串报错,且这行重复执行没有任何业务意义。 - 额外潜在问题:如果表单提交的字段是多选类型,
$_POST[$column['name']]本身就是数组,直接把数组作为绑定参数传入execute,PDO默认不会自动处理数组转字符串,也会触发同款报错。
修复步骤
- 删除循环内多余的
print $new_data代码,如需调试查看数组内容,改用print_r($new_data)或者var_dump($new_data)。 - 直接删除第1443行的多余
$stmt->execute();代码,仅保留第一次带参数的execute调用即可。 - 如有表单多选项字段,需要先把数组类型的POST值转成字符串(比如用
implode(',', $_POST[$column['name']]))之后再存入$new_data数组,避免参数绑定时报错。
修复后代码参考:
function updateUSR($id, $columns, $old) { global $database; $query = ''; $new_data = array(); foreach($columns as $column) { if(isset($_POST[$column['name']]) && $old[$column['name']] != $_POST[$column['name']]) { // 兼容处理数组类型的POST值(比如多选字段) $postVal = $_POST[$column['name']]; if(is_array($postVal)) { $postVal = implode(',', $postVal); } $new_data[$column['name']] = $postVal; $query = $query.$column['name'].'=:'.$column['name'].', '; // 调试时可放开下一行 // print_r($new_data); } } if(strlen($query)) { $query=rtrim($query,", "); $new_data['name'] = $id; $stmt = $database->runQueryPlayer("UPDATE users SET ".$query." WHERE a_index=:name "); $stmt->execute($new_data); } }
内容的提问来源于stack exchange,提问作者Laurentiu
相关产品推荐
相关产品推荐

