2012-10-10 43 views
1

所以我在 用戶名的格式的平面文件分貝:$ SHA $ 1010101010101010 $ 010110010101010010101010100101010101001010:255.255.255.255:1342078265214高效的php代碼插入數組數據到mysql表?

在新行中的每個記錄......約5000+線..我想將它導入一個MySQL表。通常我會使用phpmyadmin和「文件導入」來做到這一點,但現在我想通過使用php通過ftp下載數據庫來自動執行此過程,然後清理現有的表數據並上載更新的數據庫。

id(AUTH INCREMENT) | username | password | ip | lastlogin 

我下面有大部分該腳本..雖然PHP將產生一個錯誤: 「PHP致命錯誤:最長30秒的執行時間超過了」我相信我可以增加此時間,但在遠程服務器上,我懷疑我會被允許,所以我需要找到更好的方式來做到這一點。

只有約1000條記錄將被插入到該超時之前數據庫...

我正在使用的代碼如下..我會說,現在我不是在PHP親,這是主要收集起來並拼湊在一起。我正在尋找一些幫助,使之更有效率,因爲我聽說像這樣做插入是不好的。它真的聽起來不錯,因爲當我在本地PC上運行這個腳本時,大量的磁盤劃傷了。我的意思是爲什麼它想要殺死硬盤來做這樣一個看似簡單的任務。

<?php 
require ('Connections/local.php'); 

$wx = array_map('trim',file("auths.db")); 
$username = array(); 
$password = array(); 
$ip = array(); 
$lastlogin = array(); 
foreach($wx as $i => $line) { 

     $tmp = array_filter(explode(':',$line)); 
     $username[$i] = $tmp[0]; 
     $password[$i] = $tmp[1]; 
     $ip[$i] = $tmp[2]; 
     $lastlogin[$i] = $tmp[3]; 

mysql_query("INSERT INTO authdb (username,password,ip,lastlogin) VALUES('$username[$i]', '$password[$i]', '$ip[$i]', '$lastlogin[$i]') ") or die(mysql_error()); 
} 
?> 
+1

在一個查詢中插入多行應顯着提高性能。 –

+0

什麼是'aswel'? – alfasin

+1

由於您在沒有[正確的SQL轉義](http://bobby-tables.com/php)的情況下使用'mysql_query',您應該爲了自己的安全而使用'mysqli'或PDO。 – tadman

回答

4

試試這個,綁定參數和PDO。

<?php 
require ('Connections/local.php'); 

$wx = array_map('trim',file("auths.db")); 
$username = array(); 
$password = array(); 
$ip = array(); 
$lastlogin = array(); 

try { 
    $dbh = new PDO("mysql:host=$ip;dbname=$database", $dbUsername, $dbPassword); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 

$mysql_query = "INSERT INTO authdb (username,password,ip,lastlogin) VALUES(:username, :password, :ip, :lastlogin)"; 
$statement = $dbh->prepare($mysql_query); 

foreach($wx as $i => $line) { 
     set_time_limit(0); 

     $tmp = array_filter(explode(':',$line)); 
     $username[$i] = $tmp[0]; 
     $password[$i] = $tmp[1]; 
     $ip[$i] = $tmp[2]; 
     $lastlogin[$i] = $tmp[3]; 

     $params = array(":username" => $username[$i], 
         ":password" => $password[$i], 
         ":ip"  => $ip[$i], 
         ":lastlogin" => $lastlogin[$i]); 
     $statement->execute($params); 
} 
?> 
+0

感謝分享..我馬上測試了它,儘管我收到了一些壞消息。 Php在30秒內仍然超時。 //插入了1,188條記錄......我測試了原來的腳本並管理了// 1,085個插入的記錄。反正有沒有辦法解決這個php限制?除了增加限制? – NestedCodeblocksFTW

+0

php.ini中'max_execution_time'的值是多少?你是從命令行運行的嗎? – jdstankosky

+0

我只是從h ** p:// localhost運行php腳本...另外,php.ini是max_execution_time = 30。這是關於「PHP致命錯誤:最大執行時間超過30秒」的錯誤我明白了。就像我說過的,我可以在這裏改變它,但我不認爲我會被允許在遠程服務器上,在那裏我最好想讓這個腳本更快地更新數據庫。 – NestedCodeblocksFTW

0

而是在形式

insert into table (x,y,z) values (1,2,3) 

您應該使用擴展插入語句由一個發送查詢服務器之一,爲:

insert into table (x,y,z) values (1,2,3),(4,5,6),(7,8,9),... 

這將增加英里插入性能。但是,您需要注意在一條語句中插入了多少行,因爲對單個SQL的大小有限制。所以,我會說從100行包開始,看看它是如何發展的,然後相應地調整包的大小。機會是你的插入時間將下降到5秒鐘,在max_execution_time限制之下。