我想要的是删除数据库中表格的记录后删除图像文件
我的数据库包含4个表,用主键和外键链接。
这4个表是:品牌,产品,内容,促销。所有包含列“brandID”并具有“文件路径”列
表被更改为“ON DELETE CASCADE”,因此当删除“brandID”时,将删除其他表的记录。
**我将图像文件保存到服务器,文件路径到数据库。同样,我想删除表的文件路径(条目)时删除服务器中的物理文件..
任何建议都非常感谢。
我是DB的新手,下面是我红色的链接..我需要更多信息..
再次感谢
Can we delete the physical file from server when I delete the corresponding entry from database?
答案 0 :(得分:2)
MySQL无法真正为您自动执行此类文件系统操作*。相反,向服务器发出DELETE
语句的应用程序代码应该调用文件系统操作来删除文件。
因此您需要:
从数据库中选择文件路径;
从数据库中删除记录(级联外键约束可以确保删除所有相关记录);以及
从文件系统中删除文件。有人假设你的应用程序是用PHP编写的(因为你的问题被标记了),在这种情况下你可以调用unlink()
删除文件。
*这不完全正确,因为可以使用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();
非常感谢代码的任何建议或改进。 谢谢!