2017-10-28 105 views
2

我對將大量原始數據插入數據庫的最佳方式有什麼問題。將大量原始數據插入到數據庫中PHP

的原始數據看起來是這樣的(這是一個很多,但我不認爲我需要用我的例子都):

CUSACODE - 遊戲 - 控制檯 - 大區 - DOWNLOADURL

CUSA00475 Akiba's Trip 2 PS4 JP http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00475_00/4/f_28d6a38b6ebac96d17a8b4de7616f6e5de43da365ef30d8354fb55df94eb0a4a/f/JP0048-CUSA00475_00-AKIBASNEXTAPP000.pkg 
CUSA00363 Alien: Isolation - 0 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_0.pkg 
CUSA00363 Alien: Isolation - 1 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_1.pkg 
CUSA00363 Alien: Isolation - 2 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_2.pkg 

使用空格分隔。

所以我認爲這將是一個很好的做法,首先製作一個數組。一旦它在數組中,通過whilewhile循環一個SQL INSERT查詢。

或者更好的做一個SQL查詢呢?有什麼方法可以生成這個SQL查詢,所以我不必手動添加所有東西?

我試着這樣做:

$data = "CUSA00475|Akiba's Trip 2|PS4|JP|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00475_00/4/f_28d6a38b6ebac96d17a8b4de7616f6e5de43da365ef30d8354fb55df94eb0a4a/f/JP0048-CUSA00475_00-AKIBASNEXTAPP000.pkg, 
CUSA00363|Alien: Isolation - 0|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_0.pkg, 
CUSA00363|Alien: Isolation - 1|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_1.pkg, 
CUSA00363|Alien: Isolation - 2|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_2.pkg"; 

$result = explode("|", $data); 

foreach($result as $res) { 
     $sub = explode(",",$res); 
     $mainCategory[$sub[0]] = explode("|",$sub[1]); 
} 

但是,可怕的失敗。我希望有人能幫助我解決這個問題!

+0

哪些錯誤與進行SQL在while循環中插入?那裏有什麼問題? –

+0

您的原始數據是否在文件中?最好不要將所有數據加載到內存中(如果您的數據量很大)。 – nand42

+0

@FabianN。我不知道如何將這些信息放入數組中,所以我可以使用該數組將其插入到數據庫中。 – Mitch

回答

1

如果涉及大量數據,一個好主意是使用準備好的語句,在循環之前初始化。然後在循環中綁定當前數據並執行語句。

這將是這個樣子:

$sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
$pstmt = $connection->prepare($sql); 

foreach($allData as $data){ 
    $pstmt->bind_param("sssss", $data[0], $data[1], $data[2], $data[3], $data[4]); 
    $pstmt->execute(); 
} 

$pstmt->close(); 

對於如何使在數據環幾種方法,這取決於你如何存儲數據。

例如,如果你的數據在某個地方保存爲文本文件,你可以使用這樣的事情:

$handle = fopen("inputfile.txt", "r"); 
if ($handle) { 

    $sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
    $pstmt = $connection->prepare($sql); 

    while (($line = fgets($handle)) !== false) { 

     $data = explode("\t", $line); //if the original delimiter is a tab, which was guessed, because only "whietspace" would make no sense 

     $pstmt->bind_param("sssss", $data[0], $data[1], $data[2], $data[3], $data[4]); 
     $pstmt->execute(); 
    } 

    fclose($handle); 
    $pstmt->close(); 
} 

編輯:在已經轉化爲你|,格式的數據inmemory,你肯定會先製作一個遍歷explode(',', $data)再與|爆炸,所以是這樣的:

$sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
$pstmt = $connection->prepare($sql); 

$seperatedData = explode(',', $data); 

foreach($seperatedData as $oneDataSet){ 
    $seperatedOneData = explode('|', oneDataSet); 

    $pstmt->bind_param("sssss", $seperatedOneData[0], $seperatedOneData[1], $seperatedOneData[2], $seperatedOneData[3], $seperatedOneData[4]); 
    $pstmt->execute(); 
} 

$pstmt->close(); 
+0

恕我直言,這將在大型數據集或大型文件的情況下爆炸。 –

+0

@M Noeini,在內存方法,當然,但逐行閱讀文件是完全正確的,因爲當一行太多的內​​存,然後米奇應該仍然考慮以不同的方式讀取數據 –

+0

所以我修改你的第一個代碼以滿足我的需要(閱讀你的編輯太遲了),但它給我$數據是未定義的。請看我編輯的問題。 – Mitch