如何在PHP中删除图片?

3

我正在尝试在一个ajax php文件中删除一张图片。我有以下代码:

<?php
define('IS_AJAX', true);   

$id = $db->real_escape_string($_GET['photo_id']);    
$files = $db->query("SELECT * FROM uploaded_photos WHERE id=".$id);        
$files = $files->fetch_object();

$file = $files->path;

if($file){    
unlink("../uploads/".$file);    
$db->query("DELETE FROM uploaded_photos WHERE id='".$id);

}

在这种情况下,"path"指的是图像,例如1.jpg。它确实删除了表格行,但它并没有删除上传文件夹中的图像。希望有人能帮助我解决这个问题。提前感谢您的努力。


3
可能存在两个问题:1. Apache/php 没有正确的权限来删除文件。2. 传递给函数的文件名不正确,因此请检查 $file 变量,并确保它相对于工作目录是正确的。 - Cave Johnson
1
unlink在失败时应生成E_WARNING级别的错误。您的日志中是否有相应的记录? - Ivan Burlutskiy
@ Andrew - 我已经检查了文件名,是正确的。我不知道是 PHP 还是 Apache 拥有正确的权限,我该如何检查呢? - Aurora
你可能需要使用类似于if(is_file($filename = "../uploads/".$file)) unlink($filename); else die('File not found at '.$filename);的语句来检查文件是否存在于你认为的位置。 - Rasclatt
@Shpionus 我的错误日志中没有 e_warning。 - Aurora
显示剩余7条评论
1个回答

2

您可能需要重新检查您的代码。您有一个未关闭的单引号。请参见下面的代码...

        define('IS_AJAX', true);

        $id     = $db->real_escape_string($_GET['photo_id']);
        $files  = $db->query("SELECT * FROM uploaded_photos WHERE id=".$id);
        $files  = $files->fetch_object();

        $file   = $files->path;

        // NOTE THAT if($file) WOULD ALMOST ALWAYS RETURN TRUE SO LONG AS IT CONTAINS ANY STRING
        // HOWEVER file_exists WILL CHECK IF THE FILE PHYSICALLY EXIST ON THE PATH/LOCATION OR NOT.
        // PREFER file_exists IN THIS SCENARIO INSTEAD.
        if(file_exists("../uploads/" . $file)){
            // CHANGE THE FILE PERMISSION ON THE IMAGE SO THAT YOU CAN WORK WITH IT...
            chmod("../uploads/" . $file, 0755);   // <== GIVES YOU PERMISSION TO DEAL WITH THE FILE...
            unlink("../uploads/".$file);
            // BY THE WAY;  HERE IS A PROBLEM... YOU HAVE AN UNCLOSED SINGLE QUOTE AFTER THE EQUAL SIGN.
            // I REALLY WONDER HOW THE TABLE ROW DELETES WITH THE TYPO...
            // TRY REMOVING OR COMPLETING IT THOUGH:        
            //$db->query("DELETE FROM uploaded_photos WHERE id='".$id);   <=== SEE THAT SINGLE QUOTE AFTER "=" THERE? THAT'S YOUR ENEMY.
            $db->query("DELETE FROM uploaded_photos WHERE id=".$id);
        }

更新:不带评论

    <?php

        define('IS_AJAX', true);

        $id     = $db->real_escape_string($_GET['photo_id']);
        $files  = $db->query("SELECT * FROM uploaded_photos WHERE id='{$id}'" );
        $files  = $files->fetch_object();       
        $file   = $files->path;

        if(file_exists("../uploads/" . $file)){
            chmod("../uploads/" . $file, 0777); 
            unlink("../uploads/".$file);    
            $db->query("DELETE FROM uploaded_photos WHERE id='{$id}'");
        }

原帖作者表示从数据库中删除操作是有效的,但是文件删除操作不起作用,尽管多了一个单引号,你是正确的,那个单引号不应该在那里。 - Rasclatt
@Rasclatt 你说得对...我也发现了一个拼写错误,让我想知道如何删除这样的一行,因为这个错误很可能会导致错误。然而,我还建议他尝试使用***var_dump(file_exists($file));***来查看文件是否存在或路径是否有问题....;-) - Poiz
@Aurora,您需要展示您的文件夹结构——这个 AJAX 脚本位于哪里以及图像文件位于哪里。很可能只是您代码中的路径出错了。 - Denis Mysenko
@Poiz 我试了你的代码。在尝试删除它后,它退出了,所以路径是正确的,因为它存在...当我通过ftp检查时,文件在文件夹中。它只是无法删除--这是对我上面评论的更正-- - Aurora
1
只是为了让未来阅读此内容的任何人清楚,更新:没有注释的代码可以工作。 - Aurora
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接