删除数据库中表的记录后删除物理文件


delete physical file after deleting the record of a table in database

我想要的是删除数据库中表的记录后删除图像文件

我的数据库由 4 个表组成,与主键和外键链接。

这4个表格是:品牌,产品,内容,促销。 全部由"brandID"列和"文件路径"列组成

被更改为"删除级联",因此当删除"brandID"时,其他表的记录将被删除。

**我将图像文件保存到服务器,文件路径保存到数据库。同样,我想要的是当我删除表的文件路径(条目)时删除服务器中的物理文件。

任何建议都非常感谢。

我是DB的新手,下面是我红色的链接..我需要更多信息..

再次感谢

当我从数据库中删除相应的条目时,我们可以从服务器中删除物理文件吗?

删除

记录时如何删除文件?

使用MySQL过程删除文件

MySQL无法真正自动为您执行此类文件系统操作*。 相反,向服务器发出 DELETE 语句的应用程序代码应调用文件系统操作来删除该文件。

因此,您将需要:

  1. 从数据库中选择文件路径;

  2. 从数据库中删除记录(级联外键约束可以确保根据需要删除所有关联的记录);以及

  3. 从文件系统中删除该文件。 一个假设你的应用程序是PHP的(因为你的问题被标记了),在这种情况下,你可以调用unlink()来删除文件。


* 这并不完全正确,因为可以使用 UDF 从触发器中删除文件,但这通常会打开许多很少值得权衡的安全漏洞。

这就是

我所做的。如果您注意到,删除文件和删除数据库记录是分开的,因为数据库表是通过引用键连接的,因此使用"删除级联"删除记录部分非常容易。

**数据库设计为仅存储上传文件的路径

要删除文件,首先,我创建一个查询以获取标题为"pictureLocation"的所有文件位置,然后在循环中 1 个 1 取消链接,如下所示

<?php
.....
.....
    //query and make file path  AS 'pictureLocation'

    if($table == "something_user"){
    $query= sprintf ("SELECT userID,userLogo AS 'pictureLocation' 
        FROM something_user
        WHERE $idTitle=$id
        UNION ALL
        SELECT userID,contentImage 
        FROM something_content
        WHERE $idTitle=$id  
        UNION ALL
        SELECT userID,promoImg 
        FROM something_promo
        WHERE $idTitle=$id 
        ORDER BY userID"  );
        }
        else if($table == "something_product"){
                $query= sprintf ("SELECT productID, contentImage AS 'pictureLocation'
                FROM something_content
                WHERE $idTitle=$id
                UNION ALL
                SELECT productID, promoImg
                FROM something_promo
                WHERE $idTitle=$id
                ORDER BY productID" );
                }
                else if ...

        else{
            //do nothing
        }

$result = mysql_query($query);      //execute the query , put into $result
$numrow = mysql_num_rows($result);  //for error checking
$removeCount = 0;
while ($row = mysql_fetch_array($result)) {    //fetch array to $row
$deletepath = "../".$row['pictureLocation'];        //adding  ../  to the path 
                                            //*pictureLocation storing the file path retrieved from query
    if(file_exists($deletepath)){
        echo "exist".$deletepath;
        if(unlink($deletepath)){
        $deletecount++;
        }
        else{ 
            die("unlink error");
            }
    }
    else{       //if file not exist
        echo $deletepath."not here";
        $deletecount++;
    }

}
//end of file deletion

    //if delete count equal to number of query, delete database entry
    if($removeCount == $numrow){
    $updateSQL = sprintf("DELETE FROM ".$_GET["table_name"]." WHERE $idTitle = %s",
                GetSQLValueString($id, "text"));        //defend against injection
    }
    mysql_query($updateSQL, $DBConnect) or die(mysql_error());
} 
else{
    $error = 1;
}
mysql_close();

非常感谢对代码的任何建议或改进。谢谢!