2015-01-26 68 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(),切换到准备好的语句。

相关问题