如何使用odbc_exec执行多条PHP查询?跨库批量插入求助
解决Pervasive SQL批量插入的问题
针对你遇到的「用odbc_exec只能单条插入Pervasive SQL」的问题,这里有几个实用的解决方案,既能实现批量插入,还能兼顾效率和安全性:
方法1:用事务包裹多条单条INSERT语句
如果Pervasive不支持多行VALUES的批量语法,你可以用ODBC事务来包裹所有单条插入操作——这样既能保证数据的原子性(要么全成功,要么全回滚),还能避免单条提交带来的性能损耗。
示例代码:
// 先关闭自动提交,开启事务 odbc_autocommit($yourPervasiveConn, false); // 假设你有一个存储所有待插入数据的数组$invoiceDataList foreach ($invoiceDataList as $data) { // 从数组中取出对应字段值 $inv_No = $data['inv_number']; $supp_code = $data['SupplCode']; $itNo = $data['Item_No']; $itName = $data['product_name']; $qqty = $data['qty']; $cost = $data['unitPrice']; $ttotal = $data['subtotal']; $inv_dt = $data['inv_dt']; $submitted_by = $data['created_by']; // 构建单条INSERT语句 $query = 'INSERT INTO supplier_invoice (inv_number, SupplCode, Item_No, product_name, qty, unitPrice, subtotal, inv_dt, created_by) VALUES("'.$inv_No.'", "'.$supp_code.'", "'.$itNo.'", "'.$itName.'", "'.$qqty.'", "'.$cost.'", "'.$ttotal.'", "'.$inv_dt.'", "'.$submitted_by.'");'; $result = odbc_exec($yourPervasiveConn, $query); if (!$result) { // 出错就回滚所有操作 odbc_rollback($yourPervasiveConn); die("插入失败: " . odbc_errormsg($yourPervasiveConn)); } } // 所有插入成功后提交事务 odbc_commit($yourPervasiveConn); // 恢复自动提交 odbc_autocommit($yourPervasiveConn, true);
⚠️ 注意:如果你的数据来自用户输入,直接拼接SQL会有SQL注入风险,建议优先用下面的预处理语句方案。
方法2:尝试Pervasive的多行VALUES批量语法
部分版本的Pervasive SQL支持类似MySQL的批量INSERT语法(一条语句包含多个VALUES组),你可以先在Pervasive的查询工具里测试一下:
INSERT INTO supplier_invoice (inv_number, SupplCode, Item_No, product_name, qty, unitPrice, subtotal, inv_dt, created_by) VALUES ("INV001", "SUPP001", "ITEM001", "Product A", 10, 5.99, 59.9, "2024-05-20", "user1"), ("INV001", "SUPP001", "ITEM002", "Product B", 5, 12.5, 62.5, "2024-05-20", "user1");
如果测试通过,你就可以像处理MySQL那样,把所有数据拼接成一条大的INSERT语句,用odbc_exec执行一次即可。
方法3:使用ODBC预处理语句(推荐)
预处理语句是最安全高效的批量插入方式——它会自动转义参数,避免SQL注入,而且重复执行相同结构的语句时,性能比拼接SQL更好。
示例代码:
// 准备预处理语句,用?作为参数占位符 $stmt = odbc_prepare($yourPervasiveConn, 'INSERT INTO supplier_invoice (inv_number, SupplCode, Item_No, product_name, qty, unitPrice, subtotal, inv_dt, created_by) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)'); if (!$stmt) { die("预处理语句创建失败: " . odbc_errormsg($yourPervasiveConn)); } // 开启事务 odbc_autocommit($yourPervasiveConn, false); foreach ($invoiceDataList as $data) { // 按字段顺序准备参数数组 $params = [ $data['inv_number'], $data['SupplCode'], $data['Item_No'], $data['product_name'], $data['qty'], $data['unitPrice'], $data['subtotal'], $data['inv_dt'], $data['created_by'] ]; // 执行预处理语句 $result = odbc_execute($stmt, $params); if (!$result) { odbc_rollback($yourPervasiveConn); die("插入失败: " . odbc_errormsg($yourPervasiveConn)); } } // 提交事务并恢复自动提交 odbc_commit($yourPervasiveConn); odbc_autocommit($yourPervasiveConn, true); // 释放资源 odbc_free_result($stmt);
另外,还要注意适配Pervasive的特性:比如日期格式是否符合要求(部分版本要求特定的字符串格式)、字段数据类型是否匹配,以及表的主键/唯一约束是否会导致插入冲突。
内容的提问来源于stack exchange,提问作者Kwasi Owusu
相关产品推荐
相关产品推荐

