警告:取消链接($name):权限被拒绝

Warning: unlink($name): Permission denied


首先,我要求不要将我的问题标记为重复。因为我用谷歌搜索了很多问题,但没有找到解决问题的方法。 permission denied on unlink 有很多问题,但我的问题完全不同。所以,请先仔细阅读下面我的问题。

我正在创建一个基于用户的网站。在个人资料编辑中,我正在更新个人资料图片。目前,用户数据库中没有图像,但我正在后端检查,如果用户数据库中存在配置文件图片,则首先从文件夹中取消链接(删除),然后用新的更新。但是如果没有图像,我会在取消链接时收到权限被拒绝的错误。但是如果有图像,我没有得到任何权限被拒绝的错误。因此,如果数据库中存在用户图像,我只需要在该条件下调用该取消链接函数。但我已经尝试了很多次。我一次又一次失败。
这是我的函数代码:

public function updateProfilePic($file, $userid) {
        $this->selectImgOnUpdating($userid);

        $filename = $file['user_img']['name'];
        $filetmp = $file['user_img']['tmp_name'];
        $valid_ext = array('png', 'jpeg', 'jpg');
        $location = "user/profilepic/" . $filename;
        $file_extension = pathinfo($location, PATHINFO_EXTENSION);
        $file_extensionstr = strtolower($file_extension);

        if (in_array($file_extensionstr, $valid_ext)) {
            $this->compressImage($filetmp, $location, 60);

            $updateuserpic = $this->updateProfilePicture($filename, $userid);
            return $updateuserpic;
        } else {
            $msg = '<div class="alert alert-danger" role="alert">Invalid file type. You can upload only:-' . implode(', ', $valid_ext) . '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>';
            return $msg;
        }
    }

    public function selectImgOnUpdating($userid){
        $query = "SELECT user_img from users WHERE user_id = '$userid'";
        $result = $this->db->select($query);
        if ($result) {
            $deleteImg = $result->fetch_assoc();
            $deleteLink = $deleteImg['user_img'];
            $path = "user/profilepic/$deleteLink";
            unlink($path);
        }
    }

    public function updateProfilePicture($filename, $userid){
        $update = "UPDATE users SET user_img = '$filename' WHERE user_id = '$userid'";
        $result = $this->db->update($update);
        if($result){
            $msg = '<div class="alert alert-success" role="alert">Profile picture uploaded successfully <a href="profile.php">Go back</a><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>';
            return $msg;
        } else {
            $msg = '<div class="alert alert-danger" role="alert">Error while uploading profile picture. Pleas try again!<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>';
            return $msg;
        }
    }

现在,我尝试将检查条件放在抓取的第一位。

public function selectImgOnUpdating($userid){
        $query = "SELECT user_img from users WHERE user_id = '$userid'";
        $result = $this->db->select($query);
        if ($result) {
            $deleteImg = $result->fetch_assoc();
            $deleteLink = $deleteImg['user_img'];
            $count = $result->num_rows;
            if($count > 0){
                $path = "user/profilepic/$deleteLink";
                unlink($path);
            }
        }
    }

它也不起作用,我仍然收到权限被拒绝的错误。 在编辑个人资料中,有一个名为 "Update profile pic" 的按钮,新用户可以从该按钮 upload/update。
当前用户数据库行中没有图像。 (所以,我还在更新它,因为我只用一个 function/page。)在更新功能上,我首先获取用户图像,然后想检查用户图像是否存在然后 delete/unlink 从文件夹然后 运行 更新下面的函数。

你说当个人资料有图片时它可以工作但是如果没有图片它给你的权限被拒绝所以

首先检查上传目录中的权限

成为775777

Never use permission 777 in deploy just for testing

使用 is_file 它将帮助您检查是否有图像,因此您可以像这样制作它

if(is_file('your image path')){
   unlink('your image path');
}

最后使用他们在评论中对您说的准备好的语句来保护您免受 SQL 注入

问题是,如果没有用户图像,您的 $path 变量将只包含文件夹的路径,然后您将尝试取消链接。

取消链接前检查文件是否存在:

$deleteLink = $deleteImg['user_img'];
$path = "user/profilepic/$deleteLink";

if (is_file($path)) {
    // The path exists and is a file
    unlink($path);    
}

这不适用于 file_exists(),因为该函数 returns true 即使路径是文件夹也是如此。如果用户在数据库中没有图像名称,$path 将只包含一个文件夹,因此您最终会遇到与以前完全相同的问题。

is_file() 将检查路径是否存在 如果它是一个文件。