2017-06-01 23 views
0

我是PHP新手 我想將大的14MB .csv加載到mysql表中。 但它沒有完全上傳到數據庫,可能是由於大文件(〜400000行)。錯誤頁面花了很長時間迴應。如何將大的.csv加載到表中mysql,使用PHP

有沒有更快的方法來做到這一點。

我在Amazon RDS上的數據庫,EC2上的PHP。

我當前的代碼是

<?php 
header('Access-Control-Allow-Origin: *'); 

require "../config.php"; 

//$user_id = $_REQUEST['user_id']; 





// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

// path where your CSV file is located 
define('CSV_PATH','./'); 
$csv_file = CSV_PATH . "data_unique.csv"; 

if (($handle = fopen($csv_file, "r")) !== FALSE) { 
    fgetcsv($handle); 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 
     for ($c=0; $c < $num; $c++) { 
      $col[$c] = $data[$c]; 
     } 
     $col1 = $col[0]; 
     $col2 = $col[1]; 
     $col3 = $col[2]; 
     $col4 = $col[3]; 
     $col5 = $col[4]; 
     $col6 = $col[5]; 
     // SQL Query to insert data into DataBase 
     $query = "INSERT INTO uniqueid_master(autoid,package_id,unique_id,user_id,issued,book_code) VALUES('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."','".$col6."')"; 
     $result = $conn->query($query); 
    } 

    fclose($handle); 
} 


echo "File data successfully imported to database!!"; 
$conn->close(); 
?> 
+0

請試試這個 '的ini_set( '的max_execution_time', -1); ini_set('memory_limit',-1);' 否則你已經將它設置在php.init文件中。 –

+0

也看看使用準備好的語句,並插入插入多行(https://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql) –

回答

0

這將提高一些PHP的性能變量。

ini_set('memory_limit','-1'); 
ini_set('max_execution_time', 0); 

這可能會解決您的問題。但是,它仍然是可能的,你會發現內存錯誤。在這種情況下,將csv文件分成多個塊並逐個處理它們。 這是處理它的好方法。

How to extract data from csv file in PHP

1

我想你應該嘗試LOAD DATA mysql的語句。這將是非常快的,因爲你沒有去詳細閱讀到PHP。

mysqli_query($dblink, ' 
    LOAD DATA LOCAL INFILE "'.$file.'" 
     INTO TABLE transactions 
     FIELDS TERMINATED by "," 
     OPTIONALLY ENCLOSED BY "\'" 
     LINES TERMINATED BY "\n" 
'); 

可能是這樣寫太:

$sql = "LOAD DATA LOCAL INFILE '/path/to/file.csv' 
    REPLACE INTO TABLE table_name FIELDS TERMINATED BY ',' 
    ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES"; 
$result = $mysqli->query($sql); 

OR

對於另一種方法:請參閱本question

相關問題