2015-01-26 139 views
0

我從一個文件夾中檢索文件名列表,並需要使用php將其插入到mysql數據庫中。從文件夾中插入一個文件名列表到mysql

我插入數據庫,它開始建設,不會停止。它的文件夾中只有約20個項目,但它一直循環到數據庫:

<?php 
$directory = "/xml/"; 
$results_array = array(); 

if(is_dir($directory)) { 
    if($handle = opendir($directory)){ 
     while(($file = readdir($handle)) !== false) { 
      $results_array[] = $file; 
     } 
     closedir($handle); 
    } 
} 
foreach($results_array as $value) { 
    $e_get = substr($value, 0, 16); 
    $edate = substr($e_get, -6); 
    $checkDB = $pdo->query("select `dateString` from `report`"); 
    $checkDB->fetchAll(); 
    foreach($checkDB as $checkItems){ 
     if($checkItems->dateString != $edate) { 
      $pdo->query("insert into `report`(`dateString`) values 
         ('$edate'); 
     } 
    } 
} 

現在我嘗試不同的方式,但我只拿到一個項目:

<?php 
$directory = "/xml/"; 
$results_array = array(); 

if(is_dir($directory)) { 
    if($handle = opendir($directory)){ 
     while(($file = readdir($handle)) !== false) { 
      $results_array[] = $file; 
     } 
     closedir($handle); 
    } 
} 
$edate = array(); 
foreach($results_array as $value) { 
    $e_get = substr($value, 0, 16); 
    $edate[] = substr($e_get, -6); 
} 
foreach($edate as $date) { 
    $checkDB = $pdo->query("select `dateString` from `report`"); 
    foreach($checkDB as $checkItems) { 
    if($checkItems->dateString != $date) { 
      $pdo->query("insert into `report`(`dateString`) values 
         ('$edate'); 
    } 
    } 
} 

請幫助...謝謝!

+0

你正在走錯這個方向。 '讀取,檢查,插入'方法導致可能的競爭條件,所以應該避免,並且爲了實現它,您需要在_every_插入之前將整個表讀入內存。相反,您應該在數據庫中將'dateString'標記爲唯一的,使用'INSERT IGNORE ...'插入新值,並檢查'​​affected_rows'以查看它是否有效(如果您關心 - 您可能很樂意忽略重複項) – 2015-01-26 23:55:54

+0

感謝您的建議... – smor 2015-01-27 00:15:38

+0

好吧我改變我的數據庫(dateString)爲唯一的,它不會重複,但是當使用上面的第一個例子,我寫它只插入第一個然後停止...整個目錄等於21個文件,只有第一個被插入。我需要改變什麼? – smor 2015-01-27 15:46:14

回答

0

我假設代碼的第一部分正確填充$edate。之後,您不必要地閱讀數據庫,並且您在第二個查詢中使用了$edate,而不是$date

因爲數據庫應該被檢查的獨特性,你應該只需要這樣:

foreach($edate as $date) { 
    $pdo->query("insert ignore into `report`(`dateString`) values ('$date')"; 
} 

INSERT IGNORE插入一個新條目,或者忽略它,如果它檢測到一個無效的請求,如在UNIQUE列重複)

但是,這不會帶來可能發生的任何語法或其他錯誤,因此您需要添加一些錯誤檢查。我的建議:

// Just after you open the PDO connection, set PDO to 
// throw an exception in the event of an error 
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

// Then... 
try { 
    foreach($edate as $date) { 
     $pdo->query("insert ignore into `report`(`dateString`) values ('$date')"; 
    } 
} catch(PDOException $e) { 
    echo 'Database error '.$e->getCode().': '.$e->getMessage(); 
    exit(1); 
} 

你可以不同的方式處理該異常,或者懶得在這裏抓住它,並讓默認的異常處理程序捕獲它,如果你有一個。

注意:您可以通過破壞$edate陣列在單個INSERT中執行此操作。

// No loop required 
$query = "insert ignore into `report`(`dateString`) values ('" . implode("'),('",$edate) . "')"; 
$pdo->query($query); 

安全:我假設你有過在目錄中的文件名一定的控制,他們將會很安全使用這種方式。如果不是這樣,那麼在這段代碼中你就有了SQL注入的敏感性。您需要在值或更高的值上使用PDO::quote(),切換到準備好的語句。

相關問題