从服务器和数据库中删除文件(PHP)

时间:2014-12-04 12:53:30

标签: php mysql

我有一个非常基本的文件上传页面。 如果您已登录,则会看到一个页面(myFiles.php),其中我有一个用户上传的文件表,每个行都有一个删除按钮。我从我的数据库中获取用户文件,其中我有一个表格上传(文件名,扩展名,文件时间,用户名),代码如下:

 if ($_SESSION['active'] == true) {
                echo "<table class='table'>
                    <tr>
                    <th>File name</th>
                    <th>Added</th>
                    <th></th>
                    </tr>";
                $query = "SELECT filename, filemtime, username FROM Uploads WHERE username='".$active."' ORDER BY filemtime"; //
                $result = mysql_query($query);

                while($row = mysql_fetch_array($result,  MYSQL_ASSOC)) {
                    $timestamp = strtotime($row["filemtime"]);
                    echo "<tr><td>" . $row["filename"]. "</td><td>" . date("d.m.Y",$timestamp). "</td>";
                    echo "<td><form role='form' action='delete_check.php' method='post' enctype='multipart/form-data'>";
                    echo "<button type='submit' class='btn btn-default'>Delete</button></form></td>";
                    echo "</tr>";
                }

                echo "</table>";
}

我需要知道如何将删除按钮连接到该行以及如何将参数(文件名和扩展名)传递到我从数据库和服务器删除文件的页面(页面delete_check.php)。

delete_check.php目前看起来像这样(这不起作用,因为我无法从delete.php传递参数):

    session_start();
    $active = $_SESSION['active'];

    $con = mysql_connect("database","user","pw");
    if (!$con) {
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("database", $con);


    $file = "upload/".$filename.".".$extension;
    unlink($filename);

    $query = "DELETE FROM Uploads WHERE filename='".$filename."'";
    $delete = MYSQL_QUERY($query);
    if ($delete === true ) {
        echo "Deleted from database ".$filename." extension: " . $extension;
    } else {
        echo "Not deleted ".$filename." extension: " . $extension;
    }
    //header("Location: index.php");

2 个答案:

答案 0 :(得分:0)

我建议您为数据库中的每一行添加一个唯一的自动增量ID。所以结构看起来像那样:

id| filename| filemtime| username ...
1 |  *      |   *      |    *
2 |  *      |   *      |    *
...

现在您可以使用以下SQL语句

选择数据
 $query = "SELECT id, filename, filemtime, username FROM Uploads WHERE username='".$active."' ORDER BY filemtime"; //

现在将id添加到删除表单中,如下所示:

echo "<td><form role='form' action='delete_check.php' method='post' enctype='multipart/form-data'><input type=\"hidden\" name=\"id\" value=\"".$row["id"]."\">;
echo "<button type='submit' class='btn btn-default'>Delete</button></form></td>";

在您的delete_check.php中,您现在可以按$id = $_POST['id']选择ID。 SQL语句看起来像这样

$sql = "DELETE FROM Uploads WHERE id=".$id;

但要小心!如果您不希望用户删除未分配给他们的附件,您还应检查给定ID是否附加到当前用户。您可以使用以下内容扩展delete sql语句:

$sql = "DELETE FROM Uploads WHERE id=".$id." AND WHERE username LIKE '".$active."'";

答案 1 :(得分:0)

这是另一种方法。

使用JavaScript,在传递文件名时将每个按钮重定向到delete_check.php(假设它是唯一标识符;我更喜欢在我的表中使用一个名为id的列作为唯一标识符。)

  echo "<button type=\"submit\" class=\"btn btn-default\" onclick=\"window.location='delete_check.php?filename=$filename'\">Delete</button></form></td>";

位于delete_check.php的顶部,

  $filename = isset($_GET['filename']) ? $_GET['filename'] : null;

就像你在第一部分中所做的那样,你用一个额外的条件来查询行。您需要这样做,否则任何用户都可以删除任何文件。

  $query = "SELECT * FROM Uploads WHERE username='$active' AND filename='$filename'";

  $row = mysql_fetch_assoc($query);

然后从表中删除文件和行。

  unlink("upload/{$row['filename']}.{$row['extension']}");

  $query = "DELETE FROM Uploads WHERE username='$active' AND filename='{$row['filename']}'";