在 mysqli 中批量插入的最佳方法?
P粉951914381
P粉951914381 2023-08-24 21:16:22
[PHP讨论组]
<p>我正在寻找一种 SQL 注入安全技术,可以使用 PHP 和 MySQLi 一次插入大量行(约 2000 行)。 </p><p>我有一个数组,其中包含必须包含的所有值。 目前我正在这样做:</p> <pre class="brush:php;toolbar:false;">&lt;?php $array = array(&quot;array&quot;, &quot;with&quot;, &quot;about&quot;, &quot;2000&quot;, &quot;values&quot;); foreach ($array as $one) { $query = &quot;INSERT INTO table (link) VALUES ( ?)&quot;; $stmt = $mysqli-&gt;prepare($query); $stmt -&gt;bind_param(&quot;s&quot;, $one); $stmt-&gt;execute(); $stmt-&gt;close(); } ?&gt;</pre> <p>我尝试了call_user_func_array(),但它导致了堆栈溢出。</p> <p>什么是更快的方法来做到这一点(比如一次插入它们?),但仍然可以防止 SQL 注入(比如准备好的语句)和堆栈溢出?</p>
P粉951914381
P粉951914381

全部回复(2)
P粉530519234

再试一次,我不明白为什么您的原始代码在稍作修改后就无法工作:

$query = "INSERT INTO table (link) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $one);

foreach ($array as $one) {
    $stmt->execute();
}
$stmt->close();
P粉340980243

通过将插入内容放入事务中,您应该能够大大提高速度。您还可以将准备和绑定语句移到循环之外。

$array = array("array", "with", "about", "2000", "values");
$query = "INSERT INTO table (link) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt ->bind_param("s", $one);

$mysqli->query("START TRANSACTION");
foreach ($array as $one) {
    $stmt->execute();
}
$stmt->close();
$mysqli->query("COMMIT");

我在我的网络服务器上测试了此代码 10,000 次迭代。

没有事务:226 秒。 交易时间:2 秒。 或者速度提高两个数量级,至少对于该测试而言。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号