如何高效实现批量插入并转换为mysqli?代码转预处理语句求助
嘿,我来帮你把这两个问题解决掉,直接上直观的可运行示例,你照着改就行,一目了然!
一、把现有查询转成mysqli预处理语句
你的现有查询是用query()方法直接拼接SQL的,改成预处理语句其实很简单,核心就是把动态参数换成占位符?,然后绑定参数再执行。我假设你的完整查询带有参数(比如WHERE q_id = ?),给你完整示例:
// 1. 第一步:准备预处理语句,把动态参数的位置用?代替 $stmt = $con->prepare("SELECT q_id, m_id FROM q_followers WHERE q_id = ?"); // 2. 绑定参数:第一个参数是类型字符串('i'=整数,'s'=字符串,'d'=浮点数,'b'=二进制),后面跟对应的变量 $targetQId = 123; // 这里替换成你实际要传入的参数值 $stmt->bind_param("i", $targetQId); // 3. 执行查询 $stmt->execute(); // 4. 获取结果集,之后就和你原来的用法一样了 $resultF = $stmt->get_result(); while ($row = $resultF->fetch_assoc()) { // 处理每一行数据,比如打印或者存入数组 echo "q_id: {$row['q_id']}, m_id: {$row['m_id']}<br>"; } // 好习惯:用完关闭语句和结果集 $stmt->close(); $resultF->close();
如果你的WHERE条件有多个参数,比如WHERE q_id = ? AND m_id > ?,只需要调整绑定的类型和变量:
$stmt->prepare("SELECT q_id, m_id FROM q_followers WHERE q_id = ? AND m_id > ?"); $stmt->bind_param("ii", $qId, $minMId); // 两个整数参数,所以类型字符串是"ii"
预处理语句的好处就是彻底避免SQL注入,同时如果多次执行类似查询,性能也会更好。
二、高效的mysqli批量插入
批量插入要高效,核心是减少和数据库的交互次数,这里给你两种常用的方案:
方案1:循环执行预处理语句(适合少量数据)
这种方式简单直观,适合数据量不大的场景:
// 准备插入语句,用?占位 $stmt = $con->prepare("INSERT INTO q_followers (q_id, m_id) VALUES (?, ?)"); // 绑定参数(这里用变量引用,所以循环里可以重复赋值) $stmt->bind_param("ii", $qId, $mId); // 模拟要插入的批量数据 $batchData = [ [1, 101], [1, 102], [2, 103], [3, 104] ]; // 循环遍历数据,每次赋值后执行插入 foreach ($batchData as $row) { $qId = $row[0]; $mId = $row[1]; $stmt->execute(); } // 关闭语句 $stmt->close();
方案2:单条SQL插入多行(适合大量数据,效率更高)
这种方式只需要和数据库交互一次,数据量越大,效率提升越明显:
// 模拟批量数据 $batchData = [ [1, 101], [1, 102], [2, 103], [3, 104] ]; // 生成占位符:每一行对应(?,?),然后用逗号拼接所有行的占位符 $rowPlaceholders = implode(', ', array_fill(0, count($batchData), '(?, ?)')); // 准备完整的插入语句 $stmt = $con->prepare("INSERT INTO q_followers (q_id, m_id) VALUES $rowPlaceholders"); // 把二维数据转成一维数组,同时生成参数类型字符串 $flatData = []; $paramTypes = ''; foreach ($batchData as $row) { $flatData[] = $row[0]; $flatData[] = $row[1]; $paramTypes .= 'ii'; // 每个行是两个整数,所以加两个'i' } // 动态绑定参数:因为参数数量不固定,用call_user_func_array来处理 call_user_func_array([$stmt, 'bind_param'], array_merge([$paramTypes], $flatData)); // 执行插入 $stmt->execute(); // 关闭语句 $stmt->close();
如果你的数据里有字符串类型,只需要把paramTypes里对应的i改成s就行,比如某一行是字符串+整数,就改成'si'。
内容的提问来源于stack exchange,提问作者Niels Hermann
相关产品推荐
相关产品推荐

