试图通过PHP将15k行CSV导入SQL,但每次只能导入600-900行
这是我的第一篇帖子,我为我的错误提前道歉 我试图通过PHP将一个15k行的csv文件导入SQL,但每次只导入600-900行 这是我的代码:试图通过PHP将15k行CSV导入SQL,但每次只能导入600-900行,php,sql,csv,Php,Sql,Csv,这是我的第一篇帖子,我为我的错误提前道歉 我试图通过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
<?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);
}
}
?>
在循环开始时,在之前添加以下代码行:
设置时间限制(300)
它会将执行查询的时间限制设置为开始之前的5分钟(300秒)当循环开始时,添加以下代码行:
设置时间限制(300)
它会将执行查询的时间限制设置为5分钟(300秒)在调用fopen
ini_set('auto_detect_line_endings',TRUE);
参见gmail.com上的james dot ellis对
可能您的行尾由不同的操作系统进行不同的编码。例如,Windows将是\r\n
,而基于Unix的系统使用\n
这可能会导致某些行连接在一起。比如说,
Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
迭代2:
[0] => Giving
[1] => Up
[2] => On
然而,如果它没有正确地检测到结束行字符,则会导致两行连接在一起。然后,该行将被解析为包含6个元素的$getData数组。脚本只将位置0、1和2写入SQL插入脚本,将忽略最后三个位置
迭代1:
[0] => Say
[1] => Something
[2] => Im
[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)
[0]=>说
[1] =>什么
[2] =>即时通讯
[3] =>给予(忽略)
[4] =>向上(忽略)
[5] =>打开(忽略)
最后,如果要在插入代码中附加未经验证的字符串,则可能希望避免编写SQL代码。这很危险,而且很容易受到注射攻击。强烈建议您考虑使用准备好的语句,这些语句如下所示:
$stmt = mysqli_prepare($sql);
$stmt->bind_param($getData[0], $getData[1],$getData[2]);
$sql = "INSERT into testimport() values (?,?,?)";
$stmt=mysqli\u prepare($sql);
$stmt->bind_param($getData[0]、$getData[1]、$getData[2]);
$sql=“插入testimport()值(?,,?)”;
有关更多信息,请参阅。在调用fopen
ini_set('auto_detect_line_endings',TRUE);
参见gmail.com上的james dot ellis对
可能您的行尾由不同的操作系统进行不同的编码。例如,Windows将是\r\n
,而基于Unix的系统使用\n
这可能会导致某些行连接在一起。比如说,
Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
迭代2:
[0] => Giving
[1] => Up
[2] => On
然而,如果它没有正确地检测到结束行字符,则会导致两行连接在一起。然后,该行将被解析为包含6个元素的$getData数组。脚本只将位置0、1和2写入SQL插入脚本,将忽略最后三个位置
迭代1:
[0] => Say
[1] => Something
[2] => Im
[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)
[0]=>说
[1] =>什么
[2] =>即时通讯
[3] =>给予(忽略)
[4] =>向上(忽略)
[5] =>打开(忽略)
最后,如果要在插入代码中附加未经验证的字符串,则可能希望避免编写SQL代码。这很危险,而且很容易受到注射攻击。强烈建议您考虑使用准备好的语句,这些语句如下所示:
$stmt = mysqli_prepare($sql);
$stmt->bind_param($getData[0], $getData[1],$getData[2]);
$sql = "INSERT into testimport() values (?,?,?)";
$stmt=mysqli\u prepare($sql);
$stmt->bind_param($getData[0]、$getData[1]、$getData[2]);
$sql=“插入testimport()值(?,,?)”;
有关更多信息,请参阅。感谢您的帮助@dexter和@Daryl
我结合了你的建议,这个过程现在运行得非常完美
我可以在28秒内导入41列的15k记录,在60秒内导入30k记录!太神了现在,我需要将其自动化,但这是另一个难题:-)
这是我的最终代码:
include('dbconnect.php');
if(isset($_POST["Import"]))
{
$filename=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
ini_set('auto_detect_line_endings',TRUE);
$file = fopen($filename, "r");
set_time_limit (45);
while ($getData = fgetcsv($file, 0, ',', '"'))
{
$sql = "INSERT INTO testimport
(
id_record,panel_number,machine_number,id_internal_code,
id_number,tot_production,waiting_time,operation_length,
avg_flow,max_flow,flow_15,flow_30,flow_60,flow_120,
avg_temp,max_temp,avg_cond,max_cond,m_detach,m_input,
m_quantity,m_input_nc,max_time,m_operation,m_sep_,
a_no_flow,a_conductivity,a_low_prod,a_kick_off,
a_temperature,prod_2min,low_flow_time,
50char_graph_data,data_enter,data_start,data_end,
data_exit,preparation_time,nr_session,perc_2min,
perc_low_flow
)
VALUES
(
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)";
$stmt = mysqli_prepare($conn, $sql);
$stmt->bind_param
( "sssssssssssssssssssssssssssssssssssssssss",
$getData[0], $getData[1], $getData[2], $getData[3],
$getData[4], $getData[5], $getData[6], $getData[7],
$getData[8], $getData[9], $getData[10], $getData[11],
$getData[12], $getData[13], $getData[14], $getData[15],
$getData[16], $getData[17], $getData[18], $getData[19],
$getData[20], $getData[21], $getData[22], $getData[23],
$getData[24], $getData[25], $getData[26], $getData[27],
$getData[28], $getData[29], $getData[30], $getData[31],
$getData[32], $getData[33], $getData[34], $getData[35],
$getData[36], $getData[37], $getData[38], $getData[39],
$getData[40]
);
$sql = "INSERT into testimport()
values
(
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)";
$stmt->execute();
}
fclose($file);
mysqli_close($conn);
}
}
谢谢你的帮助@dexter和@Daryl
我结合了你的建议,这个过程现在运行得非常完美
我可以在28秒内导入41列的15k记录,在60秒内导入30k记录!太神了现在,我需要将其自动化,但这是另一个难题:-)
这是我的最终代码:
include('dbconnect.php');
if(isset($_POST["Import"]))
{
$filename=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
ini_set('auto_detect_line_endings',TRUE);
$file = fopen($filename, "r");
set_time_limit (45);
while ($getData = fgetcsv($file, 0, ',', '"'))
{
$sql = "INSERT INTO testimport
(
id_record,panel_number,machine_number,id_internal_code,
id_number,tot_production,waiting_time,operation_length,
avg_flow,max_flow,flow_15,flow_30,flow_60,flow_120,
avg_temp,max_temp,avg_cond,max_cond,m_detach,m_input,
m_quantity,m_input_nc,max_time,m_operation,m_sep_,
a_no_flow,a_conductivity,a_low_prod,a_kick_off,
a_temperature,prod_2min,low_flow_time,
50char_graph_data,data_enter,data_start,data_end,
data_exit,preparation_time,nr_session,perc_2min,
perc_low_flow
)
VALUES
(
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)";
$stmt = mysqli_prepare($conn, $sql);
$stmt->bind_param
( "sssssssssssssssssssssssssssssssssssssssss",
$getData[0], $getData[1], $getData[2], $getData[3],
$getData[4], $getData[5], $getData[6], $getData[7],
$getData[8], $getData[9], $getData[10], $getData[11],
$getData[12], $getData[13], $getData[14], $getData[15],
$getData[16], $getData[17], $getData[18], $getData[19],
$getData[20], $getData[21], $getData[22], $getData[23],
$getData[24], $getData[25], $getData[26], $getData[27],
$getData[28], $getData[29], $getData[30], $getData[31],
$getData[32], $getData[33], $getData[34], $getData[35],
$getData[36], $getData[37], $getData[38], $getData[39],
$getData[40]
);
$sql = "INSERT into testimport()
values
(
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)";
$stmt->execute();
}
fclose($file);
mysqli_close($conn);
}
}
感谢Dexter,我增加了设置时间限制,现在它在前20-30秒内上传8200到8400行,但随后它停止了。即使我设置了300秒或600秒的时间限制,我总是能导入最多8400行,这比昨天要好得多:-),但仍然不能导入存储在csv文件中的15k行。fgetcsv()函数工作得很好,我可以回显所有15k行并对所有41列执行数学运算,但我仍然没有成功地将它们一次全部导入到SQL表中……感谢Dexter,我添加了设置时间限制,现在它在前20-30秒内上载8200到8400行,但随后它停止了。即使我设置了300秒或600秒的时间限制,我总是能导入最多8400行,这比昨天要好得多:-),但仍然不能导入存储在csv文件中的15k行。fgetcsv()函数工作得很好,我可以回显所有15k行并对所有41列执行数学运算,但我仍然没有成功地将它们一次全部导入SQL表中…谢谢Daryl!在我的特定情况下,csv文件总是正确格式化,因为它是由另一台服务器自动生成的。我将您的建议的第二部分(绑定函数)与@dexter的建议(超时45秒)结合起来,然后。。。它有效!!:-)非常感谢你!!多么伟大的团队合作!!我将在下面发布为我工作的代码。谢谢Daryl!在我的特定情况下,csv文件总是正确格式化,因为它是由另一台服务器自动生成的。我将您的建议的第二部分(绑定函数)与@dexter的建议(超时45秒)结合起来,然后。。。它有效!!:-)非常感谢你!!多么伟大的团队合作!!我将在下面发布为我工作的代码。