php - 尝试通过 PHP 将 15k 行 CSV 导入 SQL,但每次只导入 600-900 行
问题描述
这是我的第一篇文章,我提前为我的错误道歉......
我正在尝试通过 PHP 将 15k 行的 csv 文件导入 SQL,但每次只导入 600-900 行。
这是我的代码:
<?php
if(isset($_POST["Import"]))
{
$filename=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
$file = fopen($filename, "r");
while (($getData = fgetcsv($file, 0, ',', '"')) !== FALSE)
{
$sql = "INSERT into testimport()
values ('".$getData[0]."','".$getData[1]."','".$getData[2]."')";
$result = mysqli_query($conn, $sql);
if(!isset($result))
{
echo "<script type=\"text/javascript\">
alert(\"Invalid File:Please Upload CSV File.\");
window.location = \"readRecords.php\"
</script>";
}
else
{
echo "<script type=\"text/javascript\">
alert(\"CSV File has been successfully Imported.\");
window.location = \"readRecords.php\"
</script>";
}
}
fclose($file);
}
}
?>
非常感谢你的帮助!!乔治奥
解决方案
在调用之前添加以下行fopen
ini_set('auto_detect_line_endings',TRUE);
请参阅 gmail dot com 对https://www.php.net/manual/en/function.fgetcsv.php的评论中的 james dot ellis
您可能有不同操作系统以不同方式编码的行尾。例如,Windows 将\r\n
在基于 Unix 的系统使用\n
这可能会导致某些行被连接在一起。例如,
Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
如果 fgetcsv 正确捕获结束行字符,它将产生 $getData 的单独迭代,如下所示:
迭代 1:
[0] => Say
[1] => Something
[2] => Im
迭代 2:
[0] => Giving
[1] => Up
[2] => On
然而,如果它没有正确检测到结束符,您最终会将两行连接在一起。然后该行将被解析为具有 6 个元素的 $getData 数组。仅将位置 0,1 和 2 写入 SQL 插入脚本的脚本将忽略最后三个。
迭代 1:
[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)
最后,您可能希望避免编写将未经验证的字符串附加到插入代码的 SQL 代码。这是危险的,而且很容易受到注入攻击。强烈建议您考虑使用看起来像这样的准备好的语句:
$stmt = mysqli_prepare($sql); $stmt->bind_param($getData[0], $getData[1],$getData[2]); $sql = "插入 testimport() 值 (?,?,?)";
有关详细信息,请参阅PHP:将值从表单插入 MySQL。
推荐阅读
- r - R:文件名列表结果无法识别实际读取文件(文件名字符编码问题)
- html - 更改相对 div 中绝对按钮的顺序
- pandas - Pandas Dataframe:将列拆分为多列
- python - 在 TCP recv() 中只接收 4 kb
- php - HTML5 响应式一页站点,url 中带有 php 变量
- ionic-framework - 离子电容器文件系统文件存在
- angular - Angular Service Worker 不适用于导航 URL(离线模式)
- javascript - 我的 ES6 导入是从索引文件还是直接从导出文件读取?
- ios - 快速获取待处理本地通知的剩余时间的问题
- c# - c# version 8 Target-typed new-expressions error requires (), [], or {} after type