You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:55:57