使用php从csv快速更新大量数据mysql [关闭]
Posted
技术标签:
【中文标题】使用php从csv快速更新大量数据mysql [关闭]【英文标题】:Fast updates mass data mysql from csv with php [closed] 【发布时间】:2021-08-10 12:37:47 【问题描述】:我正在尝试使用 php 更新我的数据库。不幸的是,这个过程太长了。我无法使用数据加载 infile,因为我的主机不允许。
我的数据库行(id、sku、stock、image_1、image_2、image_3) 我的 csv 文件(sku、库存)
我尝试仅将 csv 文件中的库存更新到我的数据库中。
<?php
$connect = mysqli_connect("localhost", "databsename", "PAssword", "databsename");
$handle = fopen("new_stock.csv", "r");
while($data = fgetcsv($handle))
$sku = mysqli_real_escape_string($connect, $data[0]);
$stock = mysqli_real_escape_string($connect, $data[1]);
$query = "UPDATE Products SET stock='$stock' WHERE sku='$sku'";
mysqli_query($connect, $query);
fclose($handle);
echo 'finish';
?>
【问题讨论】:
(可能的)旁注:忘记*escape_string*()
并且不要使用字符串插值或连接将值获取到 SQL 查询中。这很容易出错,并且可能使(仍然)您的程序容易受到 SQL 注入攻击。使用参数化查询。见"How to include a PHP variable inside a MySQL statement" 和"How can I prevent SQL injection in PHP?"。
is far too long
表示你达到了执行时间限制还是什么?
不,我的意思是更新所有股票需要很长时间
恕我直言,我不同意因缺乏细节而关闭此问题的决定。它非常清楚地提出了提问者的问题。
【参考方案1】:
这里的技巧是将多个 UPDATE 操作放在一个 transaction 中。为什么?当您提交您的工作时,MySQL 会完成大部分的 UPDATE 和 INSERT 工作。因此,更少的事务导致更快的操作。通常 mysqli 使用“自动提交”模式,这意味着每个语句都是它自己的事务。但这里我们使用mysqli_begin_transaction() 和mysqli_commit()。
这样的事情会起作用(不是!调试)。它还使用prepared statement 和绑定变量来代替已弃用的mysqli_real_escape_string
。
$transactionSize = 500;
$handle = fopen("new_stock.csv", "r");
$countdown = $transactionSize;
mysqli_begin_transaction($connection);
$updateStatement = mysqli_prepare($connection,
"UPDATE Products SET stock=? WHERE sku=?");
while($data = fgetcsv($handle))
set_time_limit(30);
mysqli_stmt_bind_param($updateStatement , "ss", $data[0], $data[1]);
mysqli_stmt_execute($updateStatement);
$countdown--;
if ($countdown <= 0)
/* end one transaction, start another */
mysqli_commit($connection);
mysqli_begin_transaction($connection);
$countdown = $transactionSize
mysqli_commit($connection);
fclose($handle);
echo 'finish';
?>
此 Code Pattern 或类似的东西对于各种多行 INSERT 和 UPDATE 都很有用。
【讨论】:
那么脚本运行了几个小时对吧? 使用像我这样的代码,它的运行速度应该比使用示例代码快 10 到 100 倍。 有趣的代码!真的很专业! 感谢您的客气话。这种事情我做过太多次了:-) 脚本耗时很长,有 350,000 条数据记录【参考方案2】:也许使用以下代码可以做到这一点。我有同样的问题。
set_time_limit(0);
$connect = mysqli_connect("localhost", "databsename", "PAssword", "databsename");
$handle = fopen("new_stock.csv", "r");
$str = [];
$flag = true;
$counter = 0;
$str2 = "";
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE)
if ($flag)
$flag = false;
continue;
;
$sku = mysqli_real_escape_string($connect, $data[0]);
$stock = mysqli_real_escape_string($connect, $data[1]);
$query = "UPDATE Products SET stock='$stock' WHERE sku='$sku'; ";
$counter++;
$str2 .= $query;
if ($counter % 10000 == 0)
$str[] = $str2;
$str2 = "";
fclose($handle);
if ($str2 != "")
$str[] = $str2;
foreach ($str as $item)
$item2 = str_replace('\"', '"', $item2);
mysqli_query($connect, $item);
echo 'finish';
【讨论】:
那么脚本运行了几个小时对吧? 没有。为什么要几个小时?它将在其工作结束时完成。我猜它会很快。 这是正确的吗? $handle = fopen("new_stock.csv", "r"); $file = fopen($handle); 你说得对。对不起。我编辑了我的答案。 而且 $connect 必须在顶部?以上是关于使用php从csv快速更新大量数据mysql [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
最佳实践:使用 PHP 5.x 将 CSV 导入 MYSQL 数据库