PHP Warning报错咨询:array_push()参数类型错误代码排查
PHP报错排查与修复
报错原因
PHP Warning: array_push() expects parameter 1 to be array, string given in
这个警告的核心问题是:调用array_push()时,第一个参数$key_count[0]并非数组类型,而是$wpdb->get_var()返回的数值/字符串(许可证统计数量),而array_push()要求第一个参数必须是数组,因此触发类型不匹配错误。
代码中的具体问题
- 类型错误:
第一次循环时,$i=0,$key_count[0]被赋值为SQL查询返回的统计数值,随后尝试用array_push($key_count[0], ...)向这个数值中添加元素,直接违反array_push()的参数要求。 - 逻辑混乱:
赋值后$i自增为1,此时$key_count[1]尚未定义就被传入array_push,会额外触发"未定义索引"警告;同时代码混淆了数组元素和数组本身的操作逻辑,意图表达不清晰。 - 安全隐患:
原代码直接将$product_id拼接进SQL语句,存在SQL注入漏洞。
修复后的代码
global $wpdb; $key_count = array(); $order_id = $order->get_id(); $order = wc_get_order($order_id); foreach( $order->get_items() as $item_id => $item ){ // 获取产品ID $product_id = $item->get_product_id(); // 预处理SQL并查询未关联订单的许可证数量 $sql = $wpdb->prepare( "SELECT count(license_key) FROM bff_lmfwc_licenses WHERE product_id = %d AND order_id IS NULL", $product_id ); $count = $wpdb->get_var($sql); // 将结果追加到数组 $key_count[] = $count; }
修复说明
- 移除冗余的
$i变量,使用$key_count[] = $count自动向数组追加元素,避免手动维护索引的混乱。 - 用
$wpdb->prepare()预处理SQL语句,通过占位符%d安全传入数值类型的$product_id,彻底规避SQL注入风险。 - 删除错误的
array_push调用,直接收集每个商品对应的许可证数量到数组中,符合常规数据收集逻辑。
内容的提问来源于stack exchange,提问作者xb yang
相关产品推荐
相关产品推荐

