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

时间:2013-11-18 09:54:48

标签: php mysql sql-server database

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

我的数据库包含4个表,用主键和外键链接。

这4个表是:品牌,产品,内容,促销。所有包含列“brandID”并具有“文件路径”列

表被更改为“ON DELETE CASCADE”,因此当删除“brandID”时,将删除其他表的记录。

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

任何建议都非常感谢。

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

再次感谢

Can we delete the physical file from server when I delete the corresponding entry from database?

How to delete files when a record is deleted?

delete file using MySQL procedure

2 个答案:

答案 0 :(得分:2)

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

因此您需要:

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

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

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


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

答案 1 :(得分:0)

这就是我所做的。如果您注意到,删除文件和删除数据库记录是分开的,因为数据库表是通过引用键连​​接的,因此使用“ON DELETE CASCADE”可以很容易地删除记录部分。

**数据库旨在仅存储上传文件的路径

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

<?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();

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