3 回答
TA贡献1874条经验 获得超12个赞
我结合了你的建议,现在这个过程完美无缺!
我可以在 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);
}
}
TA贡献1843条经验 获得超7个赞
在调用之前添加以下行fopen
ini_set('auto_detect_line_endings',TRUE);
请参阅 gmail.com 上的 james dot ellis 对https://www.php.net/manual/en/function.fgetcsv.php的评论
您的行尾可能由不同的操作系统以不同的方式编码。例如,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 = "INSERT into testimport() values (?,?,?)";
有关详细信息,请参阅PHP:将表单中的值插入 MySQL。
- 3 回答
- 0 关注
- 99 浏览
添加回答
举报