我想要的是删除数据库中表的记录后删除图像文件
我的数据库由 4 个表组成,与主键和外键链接。
这4个表格是:品牌,产品,内容,促销。 全部由"brandID"列和"文件路径"列组成
表被更改为"删除级联",因此当删除"brandID"时,其他表的记录将被删除。
**我将图像文件保存到服务器,文件路径保存到数据库。同样,我想要的是当我删除表的文件路径(条目)时删除服务器中的物理文件。
任何建议都非常感谢。
我是DB的新手,下面是我红色的链接..我需要更多信息..
再次感谢
当我从数据库中删除相应的条目时,我们可以从服务器中删除物理文件吗?
删除记录时如何删除文件?
使用MySQL过程删除文件
MySQL无法真正自动为您执行此类文件系统操作*。 相反,向服务器发出 DELETE
语句的应用程序代码应调用文件系统操作来删除该文件。
因此,您将需要:
-
从数据库中选择文件路径;
-
从数据库中删除记录(级联外键约束可以确保根据需要删除所有关联的记录);以及
-
从文件系统中删除该文件。 一个假设你的应用程序是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();
非常感谢对代码的任何建议或改进。谢谢!