我正在尝试从一个名为"照片"的文件夹中删除当前不在我的数据库中的照片。(这些都是我在构建网站并对其进行测试等时堆叠起来的照片,所以现在是时候让网站上线了,我不希望所有这些浪费都在里面(
我有三个表格,里面有照片信息,还有几列贯穿始终。下面是一个关于我认为它应该是什么样子的模型查询。
SELECT left_image, right_image, photo1, photo2, photo3, photo4, home_photo
FROM about_photos, facilities, home
left_image
和right_image
一起去about_photos
. photo1
、photo2
、photo3
和photo4
与facilities
同行。 home_photo
与home
同在.
另外,我需要在照片的末尾使用通配符,因为文件有缩略图,所以例如原始照片将被调用,abcimage.jpg
但会有abcimage.jpg
、abcimage_medium.jpg
、abcimage_thumb.jpg
也在数据库中我只存储、photos/abcimage
并根据文件名的去向添加
$directory = "../path/to/photos_directory/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.jpg");
foreach($images as $image)
{
$name = explode('_',$image);
$name = 'photos/' . $name[0];
$sql = mysql_query("SELECT id FROM table WHERE photo1='$name' OR photo2='$name'");
if(mysql_num_rows($sql) == 0)
unlink($directory . $image);
}
您有两个选择:
一:
- 使用 SQL 查询,获取数据库中引用的所有照片的完整列表
- 循环访问目录中的文件
- 如果文件是图像并且不在您的列表中,请删除该文件。
二:
- 循环访问目录中的文件
- 如果文件是图像
- 在数据库中查询该文件名
- 如果响应为空,请删除该文件
- 在数据库中查询该文件名
- 如果文件是图像
确切的 SQL 查询取决于您尚未提供的表结构。
最佳选择主要取决于规模。如果数据库中有很多图像,则第一个选项涉及在内存中有一个非常大的列表。但是,第二个版本涉及更多的数据库查询。所以这是一个权衡。
有更复杂的选项涉及缓存和抢占式查询,但我想你还不想深入。
如下所示。我的文件夹中也有原始文件,我一次限制为 500 次删除。根据需要进行调整。希望它能节省一些时间...
<?php
require 'session.php';
require 'settings.php';
/* Execute the query. */
$DBH = new PDO($mssql_driver.'='.$mssql_server.';'.$mssql_dbkey.'='.$mssql_database, $mssql_username, $mssql_password);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$tsql = 'select * from ProductImage';
$PRE = $DBH->prepare($tsql);
$PRE->execute();
$pictures =$PRE->fetchAll(PDO::FETCH_ASSOC);
$directory = $_SERVER["DOCUMENT_ROOT"]."'..'..'products'pictures/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.jpg");
$counter =0;
foreach($images as $image)
{
$name = explode('pictures/',$image);
$name = $name[1];
$foundImage = false;
print "checking: ".$name;
foreach ($pictures as $picture){
$original_file = explode('.', $picture['Image_Big']);
$original_file = $original_file[0].'-original.'.$original_file[1];
if ( ($picture['Image_Small'] == $name)|| ($picture['Image_Big'] == $name) || ( $original_file == $name) || ($picture['Image_Thumb'] == $name) || ($picture['Image_PriceList'] == $name)){
$foundImage = true;
break;
}
}
if (!$foundImage) {
unlink($directory . $name);
print "....deleting";
$counter += 1;
}
print "<br />";
if ($counter> 500){
exit;
}
}
?>