将文件夹中的文件名列表插入mysql

时间:2015-01-26 23:22:19

标签: php mysql file

我从文件夹中检索文件名列表,需要使用php将其插入到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');
     }
  }
}

请帮忙......谢谢!

1 个答案:

答案 0 :(得分: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);
}

你可以用不同的方式处理异常,或者在这里没有抓住它并让默认的异常处理程序捕获它,如果你有的话。

注意:您可以通过插入INSERT数组在单个$edate中执行此操作。

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

安全性:我假设您可以控制目录中的文件名,并且可以安全地使用这种方式。如果没有,那么您在此代码中易受SQL注入攻击。您需要对值使用PDO::quote()或更好,切换到预准备语句。