HTML动态表格多行数据插入MySQL时count报错问题求助
问题分析与解决
错误原因
你遇到的count(): Parameter must be an array or an object that implements Countable错误,本质是前端没有把多行表格数据以数组形式传给后端:
- 原JS循环中,
hid1到hid8每次循环都会被新行数据覆盖,最终AJAX只提交了表格最后一行的单个值 - PHP里
$_POST['ordercode']是字符串而非数组,count()函数无法对字符串计数,导致报错
修复步骤
1. 修改JavaScript代码(传递多行数组数据)
将单个变量改为数组,循环收集每一行的数据,再通过AJAX提交数组:
var table1 = document.getElementById("mytable"); // 初始化数组存储多行数据 var ordercodes = [], productnames = [], qtys = [], units = [], weights = [], prices = [], discounts = [], amounts = []; for (var r = 1, n = table1.rows.length; r < n; r++){ var c1 = table1.rows[r].cells[1].innerHTML; var c2 = table1.rows[r].cells[2].innerHTML; var c3 = table1.rows[r].cells[3].innerHTML; var c4 = table1.rows[r].cells[4].innerHTML; var c5 = table1.rows[r].cells[5].innerHTML; var c6 = table1.rows[r].cells[6].innerHTML; var c7 = table1.rows[r].cells[7].innerHTML; var c8 = table1.rows[r].cells[8].innerHTML; // 将每一行数据push到对应数组 ordercodes.push(c1); productnames.push(c2); qtys.push(c3); units.push(c4); weights.push(c5); prices.push(c6); discounts.push(c7); amounts.push(c8); } $.ajax({ type: "POST", url: "shipment-action.php", data: { 'checking_form2': true, 'transactioncode': transactioncode, 'ordercode': ordercodes, // 传数组 'productname': productnames, 'qty': qtys, 'unit': units, 'weight': weights, 'price': prices, 'discount': discounts, 'amount': amounts, }, success: function (response) { alert(response) } });
2. 修改PHP代码(接收数组并循环插入,同时修复SQL注入风险)
- 先判断接收的参数是否为数组
- 循环时取对应索引的数组元素
- 使用预处理语句避免SQL注入(原代码直接拼接变量存在严重安全隐患)
if(isset($_POST['checking_form2'])){ $transactioncode = $_POST['transactioncode']; // 先判断是否为数组,避免非数组情况下的count报错 if(!is_array($_POST['ordercode']) || empty($_POST['ordercode'])){ echo "没有可插入的数据"; exit; } $ordercodes = $_POST['ordercode']; $productnames = $_POST['productname']; $qtys = $_POST['qty']; $units = $_POST['unit']; $weights = $_POST['weight']; $prices = $_POST['price']; $amounts = $_POST['amount']; $discounts = $_POST['discount']; $count = count($ordercodes); $success = true; // 使用预处理语句防止SQL注入,字段顺序需和表结构匹配 $stmt = $conn->prepare("INSERT INTO shipment_product VALUES ('','', ?, ?, '', ?, ?, ?, ?, ?, ?, '', 'ON_PROCESS')"); // 绑定参数,类型需和字段对应(s=字符串,i=整数,d=浮点数) $stmt->bind_param("ssssssssss", $transactioncode, $ordercode, $productname, $qty, $unit, $weight, $price, $discount, $amount, $discount); for ($i=0; $i < $count; $i++) { // 处理格式转换 $weight = str_replace(".", "", $weights[$i]); $discount = str_replace(".", "", $discounts[$i]); $amount = str_replace(".", "", $amounts[$i]); // 赋值对应变量 $ordercode = $ordercodes[$i]; $productname = $productnames[$i]; $qty = $qtys[$i]; $unit = $units[$i]; $price = $prices[$i]; // 执行插入,若失败则标记并终止循环 if(!$stmt->execute()){ $success = false; break; } } $stmt->close(); if($success){ echo "插入成功"; } else { echo "插入失败:" . $conn->error; } }
额外注意事项
- 确保MySQL表
shipment_product的字段顺序和INSERT语句中的值顺序完全匹配,否则会插入错误数据 - 预处理语句的
bind_param参数类型需和字段类型对应(s代表字符串,i代表整数,d代表浮点数等) - 原代码中
$current_date定义了但未使用,可根据需求添加到INSERT语句中
内容的提问来源于stack exchange,提问作者The Underdog
相关产品推荐
相关产品推荐

