为什么无法从上传的文件夹中删除图像文件

时间:2018-02-11 06:23:31

标签: php

我尝试使用以下代码从上传的文件夹中删除图像文件

public function delete(){

                $query = 'SELECT  *  FROM  tbl_product  WHERE  productID= ' . $this->productID;

                $STH = $this->DBH->query($query);

                $STH->setFetchMode(PDO::FETCH_OBJ);

                $img = $STH->fetch();

                foreach($deleteIMG = $img){
                    {
                        $deleteLINK = $deleteIMG['image'];
                        unlink("../resource/image/".$deleteLINK);
                    }
                }

                $sql= "DELETE FROM tbl_product WHERE productID=" . $this->productID;

                $result = $this->DBH->exec($sql);

此处无法从上传的文件夹中删除图像文件,但可以从数据库中删除数据。

所以请帮助我适当的解决方案。 感谢....

2 个答案:

答案 0 :(得分:0)

如果不了解服务器的详细信息,很难说。它可能是权限问题。您可以使用ls -al来检查权限。

需要考虑两件事:权限和文件/目录所有权。您的Web服务器用户应拥有所有者或组所有权。您需要{file}}文件及其父目录的write and execute权限才能删除文件。这个页面解释它(如果使用Linux):https://www.pluralsight.com/blog/it-ops/linux-file-permissions

就你的代码而言,你可以做到全部或全部'。这意味着如果文件没有删除,则记录也不会从数据库中删除。如果unlink()函数没有成功删除文件,则返回布尔值false。尝试这样的事情:

$allDeleted = true;

foreach($images as $img) {
   $deleteLINK = $deleteIMG['image'];
   $allDeleted |= unlink("../resource/image/" . $deleteLINK);
}

if ($allDeleted === true) {
   $sql= "DELETE FROM tbl_product WHERE productID=" . $this->productID;
   $result = $this->DBH->exec($sql);
}

|=是按位OR运算符。这篇文章很好地解释了它:

In PHP what does |= mean, That is pipe equals (not exclamation)

答案 1 :(得分:0)

@Zunaid,这就是我能够从一个文件夹中删除一个文件(无论是图像,视频,文档等)以及它的'同时来自db表的文件路径(几小时前编写的代码& 无情测试);

Code Breakdown:

<?php
// triggered by a link on the delete form - 
// < a href="delete.php?fname=<?php echo $fname; ? >" class="btn btn-danger" onclick="confirm('you sure about this?');"><i class="icon-trash icon-white">< /a >
if(isset($_POST['delete']))
{

   //include the database connection file
   include("db.php");


   //instantiate the PHP Data Object
   $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_password, $db_options);


   // set the PDO error mode to exception
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


   //get the filename
   $fname = $_GET['fname'];


   //delete file from directory with checking for both file_exists AND is_writable
   if(file_exists($fname) && !is_writable($fname))
   {
   chown($fname, 0644); // tried CHMOD - didn't work - LAST RESORT USAGE FOR CHOWN: 0777 - USE WITH CARE!!!      
   }       
   unlink("user_data/$uname".DIRECTORY_SEPARATOR.$fname);


   //deleting the row from table
   $sql = "DELETE FROM `upload_data` WHERE `FILE_NAME`=:FILE_NAME";
   $query = $pdo->prepare($sql);
   $query->execute(array(':FILE_NAME' => $fname));


   if($query)
   {
      echo "<h4 style='color:red'>File DELETED</h4>";
      header('Refresh: 1;url=home.php');
   }
   else
   {
      echo "<h4 style='color:red'>Error Deleting File</h4>";
      header('Refresh: 1;url=home.php');
   }

}
?>

我,我自己,在我能够根据自己的情况制作这个问题之前,仔细阅读了几十个的Stack Overflow问题/答案和完整的网络教程。

我遇到了 EXACT 同样的问题,即能够从db表中删除文件路径,而代码甚至没有触及文件。希望你能把它扭曲到你自己的目的......