本节我们学习如何通过PHP向MySQL表格一次性插入多条数据。
1. PDO:通过扁平化数组将用户信息放在一个数组里,然后通过预处理语句一次性执行所有sql操作。
先看看PDO_db数据库中dotcpp_users表格情况:

有7个用户,现在我们一次性增加3个用户。
<?php
$host = 'localhost';
$dbname = 'PDO_db';
$username = 'dotcpp';
$password = 'dotcpp';
$pdo = new PDO(
"mysql:host={$host};dbname={$dbname};charset=utf8mb4",
$username,
$password,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// 3个用户
$users = [
['PDO_db_user8', 'Coding!', 100, 'P1'],
['PDO_db_user9', 'Coding!', 100, 'P1'],
['PDO_db_user10', 'Coding!', 100, 'P1']
];
// 构建SQL: VALUES (?,?,?,?), (?,?,?,?), (?,?,?,?)
$placeholders = [];
$params = [];
foreach ($users as $user) {
$placeholders[] = '(?, ?, ?, ?)'; // 每组4个占位符
$params = array_merge($params, $user); // 合并所有参数
}
// SQL变成:INSERT ... VALUES (?,?,?,?), (?,?,?,?), (?,?,?,?)
$sql = "INSERT INTO dotcpp_users (nickName, signature, grade, degree)
VALUES " . implode(', ', $placeholders);
$stmt = $pdo->prepare($sql);
$stmt->execute($params); // 一次性执行12个参数
$stmt=null;
$pdo = null;
?>访问test.php后没有报错,说明我们批量插入成功了,回到MySQL命令行进行查看:

可以看到我们已经成功将8、9、10用户插入到表中。
2. MySQLi批量插入数据:
我们先看看MySQLi_db数据库中dotcpp_users表格情况:

有6名用户,现在增加4名用户:
<?php
$host = 'localhost';
$dbname = 'MySQLi_db'; // 注意:通常小写
$username = 'dotcpp';
$password = 'dotcpp';
// 创建连接
$mysqli = new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
// 要插入的用户数据
$users = [
['mysqli_user7', 'Coding!', 100, 'P1'],
['mysqli_user8', 'Coding!', 100, 'P1'],
['mysqli_user9', 'Coding!', 100, 'P1'],
['mysqli_user10', 'Coding!', 100, 'P1']
];
// 构建占位符和参数
$placeholders = [];
$params = [];
$types = ''; // 类型字符串
foreach ($users as $user) {
$placeholders[] = '(?, ?, ?, ?)';
$params = array_merge($params, $user);
$types .= 'ssis'; // 每个用户:字符串,字符串,整数,字符串
}
// 构建SQL
$sql = "INSERT INTO dotcpp_users (nickName, signature, grade, degree)
VALUES " . implode(', ', $placeholders);
// 准备语句
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("预处理失败: " . $mysqli->error);
}
// 绑定参数(注意:MySQLi需要展开数组)
$stmt->bind_param($types, ...$params);
// 执行
$stmt->execute();
$stmt->close();
$mysqli->close();
?>访问test.php后没有报错,说明我们批量插入成功了,回到MySQL命令行进行查看:

总结:批量添加会让我们插入效率更高,学会批量添加能够让我们插入数据更高效!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程