级联删除数据库记录到删除相关图像文件

Cascade deletion of database record to deletion of associated image file

我最近发现了外键和删除与 InnoDB 级联的奇迹,我喜欢它。它帮助我轻松删除复杂的数据结构,而不用担心留下垃圾。

我目前正在通过以下方式为产品数据库存储图像(就像您在网上商店中存储的那样):

我的 products table 是您所期望的,它有一个 id 主列。 我的 product_images table 有一个 product_id 列,其中包含 products.id 列的外键,以及一个存储图像文件名的 varchar 类型的 image 列。

文件名是通过计算图像的 SHA1 哈希值创建的,然后存储在以哈希值的前 2 个字符命名的文件夹中: 61/6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg。在数据库中,只存储了6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg

现在,如果我要从数据库中删除产品,级联 DELETE 规则将删除 product_images table 中的记录,但会将该文件保留在我的服务器上。

有没有办法在删除 product_images table 中的记录时自动删除图像文件,是特定的还是级联的?也许 link 某种删除操作的触发器或例程?

您将使用以下代码删除特定文件。
注意:您的文件名($filName)将来自您的查询。

$filName;
$dirName = substr($filName, 0, 2);

chown($filName,465);
unlink("../".dirName."/" . $filName);

mysql 中没有内置的本机功能来执行此操作。如果有的话,将它变成特性蠕变和成熟的高级编程语言就没有尽头了。膨胀软件,远离其核心竞争力。

人们使用了以 C 语言编译的 UDF 库,这些库作为目标文件或编译到服务器源代码中集成到 mysql 中。请参阅 Adding New Functions to MySQL, and UDF Repository for MySQL 部分。它变得像一个科学博览会项目,在你让它运行一次之后,你可能不想将它推广到其他服务器上。

那么你有什么选择?安全的赌注总是写入另一个 table (在级联删除层次结构之外) directory/filename 组合。并让另一个迷你系统为您打扫房间。例如,一天两次,使用 Java 或 c# 或 python(任何语言)。这些环境具有数据库库和强大的文件操作。无论如何,这样会容易得多。

我做这些类型的事情是为了扩展 mysql 相关活动的功能,这些活动主要是基于文件或禁止在存储过程和 .

内部调用

在将图像插入数据库时​​更改其名称以与其产品链接 或者它是类别。 删除类别时搜索名称涉及猫 ID 的图片然后取消链接

此代码可以提供帮助

        foreach(glob(IMG_PATH.'cat_'.$_POST['id'].'*.*') as $file)
        {
            if(is_file($file))
            {
                @unlink($file);
            }


    }