PHP实现MySQL多行批量插入:拆分字符串批量入库需求
嘿,这个需求其实挺常见的——核心就是把逗号分隔的字符串拆成对应数组,然后将每一组匹配的数据插入数据库。我给你两种靠谱的实现方案,优先推荐预处理语句的方式,安全还高效:
方案一:使用PDO预处理语句(推荐,兼容性&安全性拉满)
PDO现在是PHP操作数据库的主流选择,支持多种数据库,而且内置的预处理机制能完美防御SQL注入。代码如下:
<?php // 替换成你实际的数据库配置 $host = 'localhost'; $dbname = 'your_database_name'; $username = 'your_db_username'; $password = 'your_db_password'; // 给定的变量 $id = '11'; $value1 = 'tb1,tb2,tb3,tb4'; $value2 = 'th1,th2,th3,th4'; // 把逗号分隔的字符串转成数组,顺便去掉每个元素的首尾空格(防止有多余空格) $tbList = array_map('trim', explode(',', $value1)); $thList = array_map('trim', explode(',', $value2)); // 先校验两个数组长度是否一致,避免出现tb和th不匹配的情况 if (count($tbList) !== count($thList)) { die("Error: tb和th的元素数量不匹配,请检查输入"); } try { // 建立PDO连接 $pdo = new PDO( "mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 准备预处理插入语句 $stmt = $pdo->prepare("INSERT INTO your_table_name (id, tb, th) VALUES (:id, :tb, :th)"); // 绑定id参数(所有行的id都是11,绑定一次就行) $stmt->bindParam(':id', $id, PDO::PARAM_STR); // 循环插入每一组匹配的数据 foreach ($tbList as $index => $tbItem) { $thItem = $thList[$index]; $stmt->bindParam(':tb', $tbItem, PDO::PARAM_STR); $stmt->bindParam(':th', $thItem, PDO::PARAM_STR); $stmt->execute(); } echo "数据插入成功!共插入 " . count($tbList) . " 行"; } catch (PDOException $e) { die("数据库操作出错: " . $e->getMessage()); } // 关闭连接 $pdo = null; ?>
方案二:使用mysqli预处理语句(如果你的项目还在用mysqli)
如果项目依赖mysqli扩展,也可以用同样的思路实现,代码如下:
<?php // 替换成实际数据库配置 $host = 'localhost'; $dbname = 'your_database_name'; $username = 'your_db_username'; $password = 'your_db_password'; // 给定的变量 $id = '11'; $value1 = 'tb1,tb2,tb3,tb4'; $value2 = 'th1,th2,th3,th4'; // 拆分字符串并清洗数据 $tbList = array_map('trim', explode(',', $value1)); $thList = array_map('trim', explode(',', $value2)); if (count($tbList) !== count($thList)) { die("Error: tb和th的元素数量不匹配"); } // 建立mysqli连接 $conn = mysqli_connect($host, $username, $password, $dbname); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } mysqli_set_charset($conn, "utf8mb4"); // 准备预处理语句 $stmt = mysqli_prepare($conn, "INSERT INTO your_table_name (id, tb, th) VALUES (?, ?, ?)"); // 绑定参数类型(sss表示三个字符串类型参数) mysqli_stmt_bind_param($stmt, "sss", $id, $tbItem, $thItem); // 循环插入 foreach ($tbList as $index => $tbItem) { $thItem = $thList[$index]; mysqli_stmt_execute($stmt); } echo "数据插入成功!共插入 " . count($tbList) . " 行"; // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
重要注意事项
- 一定要替换代码里的
your_database_name、your_table_name、your_db_username、your_db_password为你实际的数据库信息 - 绝对不要用直接拼接SQL字符串的方式插入数据(比如
INSERT INTO ... VALUES ('$id', '$tb')),这种写法会被SQL注入攻击,预处理语句才是安全的选择 - 如果你的输入字符串里有多余的空格(比如
tb1 , tb2),array_map('trim', ...)这个处理能保证插入的数据干净整洁 - 如果数据量特别大(比如上千行),可以改成批量插入的方式减少数据库交互次数,进一步提升效率
内容的提问来源于stack exchange,提问作者Anitha S
相关产品推荐
相关产品推荐

