当前位置: 首页 > 知识库问答 >
问题:

PHP解除关联文件错误是一个目录

卜鹏
2023-03-14

我正忙于学习一本关于php的书,他们有一个关于从数据库中删除记录的练习。我遇到的问题是删除与数据库项关联的图像。我有一个定义常数:

define(GW_UPLOADPATH, 'images/')

在一个叫appvars.php.的文件里这是remove.php

<?php
    require_once 'authorize.php';
?>
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>        
        <?php
        require_once 'appvars.php';
        require_once 'connectionvars.php';

        if(isset($_GET['id']) && isset($_GET['name']) && isset($_GET['score']) && isset($_GET['date'])
                && isset($_GET['screenshot'])){
            $id = $_GET['id'];
            $name = $_GET['name'];
            $score = $_GET['score'];
            $date = $_GET['date'];
            $screenshot = $_GET['screenshot'];
        } else if(isset($_POST['id']) && isset($_POST['name']) && isset($_POST['score']) && isset($_POST['date'])){
            $id = $_POST['id'];
            $name = $_POST['name'];
            $score = $_POST['score'];
            $date = $_POST['date'];

        } else {
            echo 'No record selected';
        }

            if(isset($_POST['submit'])){
                if(($_POST['confirm'] == 'Yes') && is_file(GW_UPLOADPATH.$screenshot)){

                    unlink(trim(GW_UPLOADPATH.$screenshot));

                    $query = "DELETE from guitarwars where id = $id limit 1";
                    mysqli_query($dbc, $query);
                    mysqli_close($dbc);

                    echo '<p class="error">The score of ' . $score . ' for' . $name . ' was successfully deleted</p>';
                } else {
                    echo '<p class="error">Error removing record</p>';
                }
            }

            else if(isset ($id) && isset($name) && isset($date) && isset($score) && isset($screenshot)){
                echo '<p>Are you sure you want to delete the following high score?</p>';
                echo '<p>Name: ' . $name . '<br />Date: ' . $date . '<br />Score: ' . $score . '<br />'
                        . 'PATH:' . GW_UPLOADPATH.$screenshot. '</p>' ;
                echo '<form method="POST" action="remove.php">';
                echo '<input type="radio" name="confirm" value="Yes" />Yes<br />';
                echo '<input type="radio" name="confirm" value="No" checked="checked" />No<br />';
                echo '<input type="submit" name="submit" value="Submit">';
                echo '<input type="hidden" name="id" value="' . $id . '">';
                echo '<input type="hidden" name="name" value="' . $name . '">';
                echo '<input type="hidden" name="date" value="' . $date . '">';
                echo '<input type="hidden" name="score" value="' . $score . '">';
                echo '</form>';

            }

            echo '<p><a href="admin.php">Back to Admin page</a></p>';

        ?>
    </body>
</html>

数据库100%删除条目,但我得到一个错误,图像是一个目录。如果查看html,它会将路径报告为images/imageName。gif

我添加了is_file(),试图弄清楚发生了什么,结果现在我得到了分配的错误消息“error removing record”。所以我想,是看不到我的名字。gif文件。由于不确定如何删除该文件,该书平静地使用了unlink。

非常感谢您的指导

添加:addscore.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Guitar Wars - Add Your High Score</title>
  <link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
  <h2>Guitar Wars - Add Your High Score</h2>

<?php
require_once 'appvars.php';
require_once 'connectionvars.php';

  if (isset($_POST['submit'])) {
    // Grab the score data from the POST
    $name = $_POST['name'];
    $score = $_POST['score'];
    $screenshot = $_FILES['screenshot']['name'];
    $screenshot_type = $_FILES['screenshot']['type'];
    $screenshot_size = $_FILES['screenshot']['size'];


    if (!empty($name) && !empty($score) && !empty($screenshot)) {
        if((($screenshot_type == 'image/gif') || ($screenshot_type == 'image/jpeg') || ($screenshot_type == 'image/pjpeg')
                || ($screenshot_type == 'image/png')) && (($screenshot_size > 0) && ($screenshot_size <= GW_MAXUPLOADSIZE))){
        $target = GW_UPLOADPATH.$screenshot;
        if(move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)){


      // Write the data to the database
      $query = "INSERT INTO guitarwars VALUES (0, NOW(), '$name', '$score', '$screenshot')";
      mysqli_query($dbc, $query) or die('Error inserting data: ' . mysqli_error($dbc));

      // Confirm success with the user
      echo '<p>Thanks for adding your new high score!</p>';
      echo '<p><strong>Name:</strong> ' . $name . '<br />';
      echo '<strong>Score:</strong> ' . $score . '<br />';
      echo '<img src="' . GW_UPLOADPATH.$screenshot . '" alt="screenshot image" /></p>';
      echo '<p><a href="index.php">&lt;&lt; Back to high scores</a></p>';

      // Clear the score data to clear the form
      $name = "";
      $score = "";

      mysqli_close($dbc);
        }
    } else {
        echo '<p class="error">Please ensure image file is corrent format and less than ' . (GW_MAXUPLOADSIZE / 1024) .
                'Kb</p>';
    }

    @unlink($_FILES['screenshot']['tmp_name']);

    }


    else {
      echo '<p class="error">Please enter all of the information to add your high score.</p>';
    }


  }

?>

  <hr />
  <form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
      <input type="hidden" name="MAX_FILE_SIZE" value="32768"/>
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" value="<?php if (!empty($name)) echo $name; ?>" /><br />
    <label for="score">Score:</label>
    <input type="text" id="score" name="score" value="<?php if (!empty($score)) echo $score; ?>" /><br />
    <label for="screenshot">Screen Shot:</label>
    <input type="file" id="screenshot" name="screenshot" />
    <hr />
    <input type="submit" value="Add" name="submit" />
  </form>
</body> 
</html>

共有1个答案

高嘉熙
2023-03-14

我认为问题是$屏幕截图是未定义的...

稍微简化一下代码,你有:

if(isset($_GET['screenshot'])) {
    $screenshot = $_GET['screenshot'];
} else if(isset($POST['id')) {

}

if(isset($_POST['submit'])){
    if(($_POST['confirm'] == 'Yes') &&  is_file(GW_UPLOADPATH.$screenshot)){

所以假设您没有做一些非常奇怪的事情,请求将是GET请求或POST请求。如果是GET请求,则仅设置$screenshot,但仅在POST请求中检查是否为\u文件。因此,您正在检查is_file(“images/”),它(正确地)告诉您它是一个目录。

试试这个:

else if(isset($_POST['id']) && isset($_POST['name']) && isset($_POST['score']) && isset($_POST['date']) && isset($_POST['screenshot'])){
    $id = $_POST['id'];
    $name = $_POST['name'];
    $score = $_POST['score'];
    $date = $_POST['date'];
    $screenshot = $_POST['screenshot']; //<-- add this line
}

...

echo '<form method="POST" action="remove.php">';
echo '<input type="radio" name="confirm" value="Yes" />Yes<br />';
echo '<input type="radio" name="confirm" value="No" checked="checked" />No<br />';
echo '<input type="hidden" name="screenshot" value="$screenshot" />'; //<-- add this line

 类似资料:
  • 我是MongoDB的新手。我正在尝试在Ubuntu 13.0 LTS上安装MongoDb 3.0,这是Windows 7 Host上的VM。我已经成功安装了MongoDB(软件包等),但是当我执行命令时,我在“/var/log/mongob/mongod.log”日志文件中得到以下错误。有人能帮助我理解这个错误吗。Internet上没有与此相关的内容。 2015-04-23T00:12:00.87

  • 我有一个非常简单的功能: 该文件在执行后显示不可读,并从文件目录中消失。但是,当从浏览器访问时,它仍然可用,尽管没有缓存(在不同的浏览器上打开文件进行测试)。我是不是错过了什么?文件是否被服务器缓存?这是我能想到的唯一解释。

  • 我在通过函数删除文件时遇到问题。当文件名为西里尔字母时,该函数不起作用。 [24-Jul-2012 00:33:35 UTC]PHP警告:取消链接(/home/gtsvetan/public_html/МъжъУ.doc)[function.unlink]:在/home/gtsvetan/public_html/deleter中没有这样的文件或目录。php在线114 那么,当名称被西里尔化时,如何

  • 我有文件在上传/project ect1/更新。 问题是,只删除更新中的文件。我想删除文件夹上载中的目录。。。也就是说,文件夹名“project1”和“update”在更新中的文件被删除后也会被删除。你能帮我找出错误吗?? 这个编码发出警告 警告:clocdirer()期望参数1为资源, 警告:rmdir(update)[function.rmdir]:没有这样的文件或目录。。 但是在目录上传中,

  • 我想删除ABC目录内的所有文件。 当我尝试使用时,它还删除文件夹abc。 有没有一个线性的解决方案,我可以删除目录内的文件,但不是目录?

  • 我正在创建一个允许调整gif大小的小类。为此,我创建了一个包含所有帧的临时目录,调整它们的大小,然后再次创建gif。 创建gif后,我想删除我的临时目录。但一旦我的所有文件都被删除,我就会出现以下错误: 警告:目录不为空 这是我的密码: 这是我得到的: 正如您所看到的,没有隐藏文件,因为scandir没有返回任何文件<如你所见,我尝试了这个解决方案,但没有成功 我可以手动删除它,一旦代码完成,里面