如何通过MySQL存储过程将PHP传递的数组数据批量插入多行
方案实现(基于MySQL 5.7+ 支持JSON的主流版本)
第一步:修改PHP端代码
原有代码直接传入PHP数组打印字符串的方式不可行,需要将数组转为MySQL可识别的JSON格式,同时使用预处理语句规避SQL注入风险:
<?php $conn = new mysqli("localhost","root","","company"); // 连接异常校验 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 定义实际业务数组 $array_item = [ [ "user_name" => "VANITHA", "adddress" => "", "mobile_no" => "8877665544" ], [ "user_name" => "VANITHA1", "adddress" => "rere", "mobile_no" => "8877665544" ] ]; // 数组转JSON字符串 $json_data = json_encode($array_item, JSON_UNESCAPED_UNICODE); // 预处理调用存储过程 $stmt = $conn->prepare("CALL addnew(?)"); $stmt->bind_param("s", $json_data); $stmt->execute(); $stmt->close(); $conn->close(); ?>
第二步:修改MySQL存储过程
存储过程需要接收JSON参数,解析数组后循环插入每一行数据:
DELIMITER // CREATE PROCEDURE addnew(IN ArrayDemo JSON) BEGIN DECLARE i INT DEFAULT 0; DECLARE data_count INT DEFAULT JSON_LENGTH(ArrayDemo); -- 遍历JSON数组的每一条数据 WHILE i < data_count DO INSERT INTO geektable (user_name, adddress, mobile_no) VALUES ( JSON_UNQUOTE(JSON_EXTRACT(ArrayDemo, CONCAT('$[', i, '].user_name'))), JSON_UNQUOTE(JSON_EXTRACT(ArrayDemo, CONCAT('$[', i, '].adddress'))), JSON_UNQUOTE(JSON_EXTRACT(ArrayDemo, CONCAT('$[', i, '].mobile_no'))) ); SET i = i + 1; END WHILE; END // DELIMITER ;
注意说明
- 如果使用的是5.7以下不支持JSON的MySQL版本,可以将PHP数组转为指定分隔符的字符串,存储过程内通过
SUBSTRING_INDEX拆分后循环插入 - 示例中保留了你原有代码的字段名
adddress(两个d),请确认和实际表结构的字段名一致 - 如果单批插入数据量超过100条,更推荐直接在PHP端拼接批量INSERT语句执行,性能优于存储过程循环插入
内容的提问来源于stack exchange,提问作者Rajesh Mandal
相关产品推荐
相关产品推荐

