我有一个csv文件上传功能。如果csv有近30k行,则功能正常。但是每当csv文件的行数超过30k时,批量插入就无法正常工作。下面是我读取csv和插入表格的代码。
$csvfile = fopen($file, 'r');
$i = 0;
$data4 = "";
while (!feof($csvfile))
{
$csv_data[] = fgets($csvfile, 1024);
$csv_array = explode(";", $csv_data[$i]);
$data4.= "('".$csv_array[2]."', '".$csv_array[4]."', '".$csv_array[0]."','".$csv_array[1]."'),";
}
$i++;
fclose($csvfile);
$data4 = substr($data4,0,-1);
$sql = "INSERT INTO csv_table(`column1`,`column2`,`column3`,`column4`) VALUES $data4";
mysqli_query($mysqliConn,$sql);
当我的记录超过30k时,我才会遇到问题。请在这里建议我更改。 提前致谢
答案 0 :(得分:1)
专业提示:"不工作,"当然,可能意味着来自"我的服务器起火了,我的数据中心被烧毁了,"我的所有价值观都改为42
,"到"手术无效。" 了解您的错误。检查来自mysqli_query()
等操作的错误。
有人说......
您正在整理您的整个CSV文件的内容并将其插入单个文本字符串中。当csv文件太长时,该方法很可能会失败。
MySQL查询的长度有限制。它很大,但不是无限的,它由服务器参数和服务器配置设置。读这个。 https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html
php也会耗尽内存。
如何解决?不是一次处理您的CSV文件,而是以五十行左右的方式处理。一旦你读了五十行,就做一个插入。
专业提示2: 清理您的输入数据。如果有人在上传的CSV文件中添加这样的行,您的表会怎样?
"bwahahahaha!'; -- DROP TABLE csv_table;", "something", "somethingelse"
你可能没事。但你想冒这样的风险吗?
请注意,公共网络正在爬行网络犯罪分子,如果您让它继续运行,有人会在几天内发现并利用此类漏洞。