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);