首先,我想现在解释一下我的情况。
我使用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()”;
请有人帮我解决这个问题。
答案 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);
}