【问题标题】:Why When i deleted image from database not deleted also from server folder?为什么当我从数据库中删除图像时也没有从服务器文件夹中删除?
【发布时间】:2018-08-23 19:16:19
【问题描述】:

问题是只从数据库中删除,而不是从服务器文件夹中删除。我的代码有错误吗?

这个删除IMG.php

<?php
include('dbh.inc.php');
if (isset($_POST['submit4'])) {



    //DELETE FILE
    $del_img=$_GET['name'];
    $queryy = "DELETE FROM table1 WHERE name='$del_img'";
    $result = mysqli_query($conn, $queryy);

    if ($result) {
        ?> <script> alert('This image has been deleted.'); window.location ="/pages/pictures.php"; </script>
        <?php 
        unlink("/pages/uploads/$del_img");
    } else {
        ?>
        <script> alert('This image not yet deleted.'); window.location ="/pages/pictures.php"; </script>
        <?php
    }
}   




?>

【问题讨论】:

  • JS 是在 PHP 完成后执行的,所以这没什么意义
  • @Qirel 有趣的是,一条错误的评论会触发两个完全相同的错误答案...
  • 我建议在 unlink 函数中使用 $_GET 数据...用户可以 ../../ 并删除您的网站...无论如何,请注释掉页面更改并查看如果在使用 unlink 时出现错误。
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。

标签: php mysql file server unlink


【解决方案1】:

更新

最终的答案是把unlink("/pages/uploads/$del_img");改成unlink("pages/uploads/$del_img");,因为绝对路径不对。

如果我的原始答案真的被阅读并遵循了,那么这场灾难是可以避免的。


根据unlink() 的文档:

删除文件名。类似于 Unix C unlink() 函数。失败时将生成 E_WARNING 级错误。


所以unlink("/pages/uploads/$del_img"); 可能会产生错误,但您的 Javascript 重定向发生在您有机会在浏览器中看到错误之前。

您需要在调试代码时检查您的 PHP 日志是否有错误或暂时停止重定向。

另外,请确保您已设置error_reporting( E_ALL );

【讨论】:

  • 删除成功,我看到一条消息提示删除成功。问题是没有对服务器文件夹进行删除。
  • @airex 是的,正确。停止重定向一分钟并检查unlink() 生成的错误,因为它显然无法从服务器文件夹中删除文件,但您在屏幕上看到错误之前就进行了重定向。
  • 真的不知道为什么要投反对票。谁能告诉我这个答案有什么不正确的地方?
  • @airex 我明白了,但你没有在听。 unlink() 正在产生一个您没有看到的错误。无论如何,您的屏幕截图显示您的路径是错误的;将 unlink("/pages/uploads/$del_img"); 更改为 unlink("pages/uploads/$del_img");,因为您正在删除相对于 PHP 文件位置的图像。
【解决方案2】:

在执行 PHP 取消链接命令之前,您正在执行 javascript window.location。只需重新组织您的代码,使其看起来像这样:

if ($result) {
        unlink("/pages/uploads/$del_img");
        ?> 
<script> 
   alert('This image has been deleted.'); window.location ="/pages/pictures.php"; </script>
        <?php 
    } else {
        ?>
        <script> alert('This image not yet deleted.'); window.location ="/pages/pictures.php"; </script>
        <?php
    }?>

【讨论】:

  • 只是想让您知道,使用 PHP,所有代码都在服务器上完成处理,然后将 HTML/Javascript 发送到浏览器。所以在浏览器被指示重定向之前,unlink() 已经被执行了。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多