3 回答

TA貢獻(xiàn)1820條經(jīng)驗 獲得超10個贊
在while
循環(huán)開始之前,添加以下代碼行:
set_time_limit (300)
它將執(zhí)行查詢的時間限制設(shè)置為 5 分鐘(300 秒)

TA貢獻(xiàn)1874條經(jīng)驗 獲得超12個贊
我結(jié)合了你的建議,現(xiàn)在這個過程完美無缺!
我可以在 28 秒內(nèi)導(dǎo)入 41 列的 15k 條記錄,在 60 秒內(nèi)導(dǎo)入 30k 條記錄!驚人的!現(xiàn)在,我需要讓它自動化,但那是另一個遺憾:-)
這是我的最終代碼:
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貢獻(xiàn)1843條經(jīng)驗 獲得超7個贊
在調(diào)用之前添加以下行fopen
ini_set('auto_detect_line_endings',TRUE);
請參閱 gmail.com 上的 james dot ellis 對https://www.php.net/manual/en/function.fgetcsv.php的評論
您的行尾可能由不同的操作系統(tǒng)以不同的方式編碼。例如,Windows 將是\r\n,而基于 Unix 的系統(tǒng)將使用\n
這可能導(dǎo)致一些行被連接在一起。例如,
Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
如果 fgetcsv 正確捕獲結(jié)束行字符,它將生成 $getData 的單獨(dú)迭代,如下所示:
迭代 1:
[0] => Say
[1] => Something
[2] => Im
迭代 2:
[0] => Giving
[1] => Up
[2] => On
而如果它沒有正確檢測到結(jié)束字符,您最終會把兩行連接在一起。然后該行將被解析為包含 6 個元素的 $getData 數(shù)組。最后三個將被腳本忽略,該腳本只將位置 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)
最后,您可能希望避免編寫將未經(jīng)驗證的字符串附加到插入代碼的 SQL 代碼。它很危險,而且很容易受到注入攻擊。強(qiáng)烈建議您考慮使用準(zhǔn)備好的語句,它看起來像這樣:
$stmt = mysqli_prepare($sql);
$stmt->bind_param($getData[0], $getData[1],$getData[2]);
$sql = "INSERT into testimport() values (?,?,?)";
有關(guān)詳細(xì)信息,請參閱PHP:將表單中的值插入 MySQL。
- 3 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報