Php 通过迭代目录和深层目录结构填充数据库

Php 通过迭代目录和深层目录结构填充数据库,php,database,algorithm,file,import,Php,Database,Algorithm,File,Import,我有一个图像库的导入脚本,用于根据“图像”目录填充数据库。在我最终弄明白如何正确使用递归迭代器之后,填充效果很好。不幸的是,它没有考虑子磅 <?php $dir = "/home/photofoli/domains/dev.photofolio.local/public_html/photo"; $ir = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); $album_id

我有一个图像库的导入脚本,用于根据“图像”目录填充数据库。在我最终弄明白如何正确使用递归迭代器之后,填充效果很好。不幸的是,它没有考虑子磅

<?php
$dir = "/home/photofoli/domains/dev.photofolio.local/public_html/photo";            
$ir = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);

$album_id = 0;
$image_id = 0;

foreach(new RecursiveIteratorIterator($ir, RecursiveIteratorIterator::SELF_FIRST) as $iterator) { 

    $realpath = $iterator->getRealPath();

    if ($iterator->isDir()) { 
        // Counting
        $numberofpictures = 1;
        $lastalbumid = $album_id;               
        $album_id++;

        // SQL
        $albumname = $iterator->getFileName();
        $addslashes = addslashes($albumname);
        $albumslug = str_replace(' ','-',$addslashes); $albumslug = strtolower($albumslug);             
        $sql = "INSERT INTO `photofoli_db`.`albums` (`name`, `id`, `path`, `album_id`, `image_count`, `slug`) VALUES ('$addslashes', $album_id, '$addslashes', '1', $numberofpictures, '$albumslug');";
        $this->Album->query($sql);
    }   
    else {
        // Counting
        $numberofpictures++;
        $image_id++;

        // SQL
        $imagename = $iterator->getFileName();
        $imagepath = $albumname.'/'.$iterator->getFileName();
        $addslashes = addslashes($imagepath);
        $sql = "INSERT INTO `photofoli_db`.`images` (`path`, `album_id`, `description`, `id`) VALUES ('$addslashes', $album_id, '$imagename', $image_id);";
        $this->Image->query($sql);
    }
}
?>

免责声明:我之所以使用脚本重新填充数据库,是因为在上载300个文件以重新运行脚本时速度更快,而不是手动添加300个新图像。

您可以将这段代码包含到一个接受目录路径的函数中:只要找到子目录,就可以递归调用此函数。

我会这样做

$ritit = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS)
);
$map = array();
foreach ($ritit as $splFileInfo) {
    $dir = dirname($splFileInfo->getRealPath());
    $map[ $dir ][] = $splFileInfo->getFileName();
}

print_r($map);
它生成一个映射,其中dir是键,值是该dir的直接子级文件名


循环生成的数组,计数并插入到数据库中应该很简单。

使用
RecursiveDirectoryIterator
RecursiveIteratoryIterator
可以生成一个包含路径中所有文件和文件夹的“展平”数组,这样您的脚本应该已经看到了子脚本。
$ritit = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS)
);
$map = array();
foreach ($ritit as $splFileInfo) {
    $dir = dirname($splFileInfo->getRealPath());
    $map[ $dir ][] = $splFileInfo->getFileName();
}

print_r($map);