基于表删除目录中的文件

时间:2012-01-03 05:32:49

标签: php arrays

首先,我想现在解释一下我的情况。

我使用PHP作为编程语言。

我有一个名为“Produk”的表。它保留了每个产品名称。 id_produk列中的示例值“TWC0001”。

每个产品都有自己的图像,并存储在./images/Produk/目录中。

问题是,这个项目大约在1年前开始工作,当用户删除产品时,产品的图像也没有被删除。所以,它仍然留在./images/Produk/目录中。这意味着,该文件成为垃圾吧?


案例:

在“产品”表格中,列“id_produk”我有3行:

“TWC0001”, “TWC0002”, “TWC0003”。

当然,每个行都有自己的图像存储在./images/Produk /

每个文件名为:

“TWC0001.jpg”,“TWC0002.jpg”,“TWC0003.jpg”


案例:用户登录并删除了行“TWC0002”,当然“TWC0002.jpg”文件仍然存在。

问题:我想删除“Produk”表中未列出的所有“.jpg”文件。


我一直这样做:

//listing all the ".jpg" files
$arrayfiles=scandir("../images/Produk/");

//getting all the product list
$sql="select * from produk";
$produk=mysql_query($sql,$conn) or die("Error : ".mysql_error());

foreach($arrayfiles as $key=>$value)
{
  while($row=mysql_fetch_array($produk,MYSQL_ASSOC))
  {
    ///here is the part i've been confused of.
  }
}

删除文件的PHP函数是“unlink()”;

请有人帮我解决这个问题。

4 个答案:

答案 0 :(得分:1)

试试这个

$it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('../images/Produk/'));

$regx = new RegexIterator( $it, '/^.*\.jpg$/i', // only matched text will be returned RecursiveRegexIterator::GET_MATCH );

foreach ($regx as $file) {

echo $file[0] , "\n";

unlink($file[0]);

}

这将找到给定文件夹和子文件夹中的所有JPG文件,并将其删除

答案 1 :(得分:1)

以下代码将生成一个数组,其中包含没有相应产品记录的所有图像。我已经离开了unlink命令,因此您可以先进行一些审核流程。

$sql = "SELECT * FROM Produk";
$result = mysql_query($sql);
$existing_products = array();
while ($row = mysql_fetch_array($result)) 
  $existing_products[] = $row["id_produk"] . ".jpg";

$existing_images = array();
foreach(glob("../images/Produk/*.jpg") as $v) 
  $existing_images[] = str_replace("../images/Produk/", "", $v);

$images_to_delete = array_diff($existing_images, $existing_products);

答案 2 :(得分:0)

我建议遵循:

通过

制作“图像”目录列表
dir /b > filelist.txt (windows)

ls -1 > filelist.txt (linux)

现在您将拥有应该导入mysql中某个临时表的现有文件列表。

现在编写简单的SQL来选择没有适当产品的文件(不要忘记添加.JPG后缀)。

要删除的文件列表,您只需创建file_get_contents和foreach循环取消链接。

我推荐这个的原因是安全性。您可以查看将删除的内容。 一旦你运行脚本,就没有撤销(只是来自备份)。

答案 3 :(得分:0)

foreach(glob('../images/Produk/*.jpg') as $file) {
    if(is_file($file))
        @unlink($file);
}