如何使用PHP向MySQL表中执行单次查询批量插入多行数据
PHP 单次查询批量插入MySQL多行数据实现方案
MySQL原生支持单条INSERT语句插入多行数据,你只需要拼接对应的VALUES段即可,以下是两种主流PHP数据库扩展的实现方式,操作后生成的表数据和你给出的目标结果完全一致:
首先假设你操作的表名为user_messages,字段对应为user_id(int类型)、Message(varchar类型)、Date(varchar/date类型)、Subject(varchar类型)。
1. 使用mysqli扩展实现
固定值插入版本
适合插入数据是固定值的场景:
<?php // 替换为你自己的数据库连接配置 $host = '127.0.0.1'; $dbname = 'your_database'; $username = 'your_username'; $password = 'your_password'; // 建立连接 $conn = new mysqli($host, $username, $password, $dbname); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 单条INSERT批量插入多行的SQL语句 $sql = "INSERT INTO user_messages (user_id, Message, Date, Subject) VALUES (1243, 'Hello world!', '06.04.2021', 'First Message'), (5265, 'Hi John!', '07.04.2021', 'Second Message')"; if ($conn->query($sql) === TRUE) { echo "插入成功,共插入2条记录"; } else { echo "插入错误: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
预处理防注入版本
如果插入的数据来自用户输入,一定要用预处理语句避免SQL注入:
<?php $conn = new mysqli($host, $username, $password, $dbname); // 要插入的数据集,可动态扩展 $insertData = [ [1243, 'Hello world!', '06.04.2021', 'First Message'], [5265, 'Hi John!', '07.04.2021', 'Second Message'] ]; // 生成对应行数的占位符 $placeholders = rtrim(str_repeat('(?,?,?,?),', count($insertData)), ','); $sql = "INSERT INTO user_messages (user_id, Message, Date, Subject) VALUES $placeholders"; // 绑定参数类型:i对应int,s对应string $types = str_repeat('isss', count($insertData)); // 扁平化二维数组为一维参数列表 $params = []; foreach ($insertData as $row) { foreach ($row as $val) { $params[] = $val; } } $stmt = $conn->prepare($sql); $stmt->bind_param($types, ...$params); $stmt->execute(); echo "成功插入".$stmt->affected_rows."行数据"; $stmt->close(); $conn->close(); ?>
2. 使用PDO扩展实现
PDO支持跨数据库,预处理写法更简洁:
<?php $host = '127.0.0.1'; $dbname = 'your_database'; $username = 'your_username'; $password = 'your_password'; try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $insertData = [ [1243, 'Hello world!', '06.04.2021', 'First Message'], [5265, 'Hi John!', '07.04.2021', 'Second Message'] ]; $placeholders = rtrim(str_repeat('(?,?,?,?),', count($insertData)), ','); $sql = "INSERT INTO user_messages (user_id, Message, Date, Subject) VALUES $placeholders"; $stmt = $conn->prepare($sql); // 扁平化参数直接传入执行 $params = []; foreach ($insertData as $row) { $params = array_merge($params, $row); } $stmt->execute($params); echo "成功插入".$stmt->rowCount()."行数据"; } catch(PDOException $e) { echo "插入错误: " . $e->getMessage(); } $conn = null; ?>
注意:如果你的Date字段是MySQL的date类型,建议把日期格式转换成2021-04-06这种标准格式再插入,避免数据库识别出错,如果你确实需要存储06.04.2021格式的字符串,可以把字段设置为varchar类型。
内容的提问来源于stack exchange,提问作者user15580703
相关产品推荐
相关产品推荐

