如何让用户从数据库和文件目录路径中删除文件?

时间:2016-02-09 23:07:17

标签: php html sql-delete filepath delete-file

我的代码中已经达到了这个目的:

<?php
include 'template/overall/header.php';?>
<div class="large-12 medium-12 columns">
<table width="60%" border="1" align="center">
<tr>
<th colspan="4"><label style="text-align: center"><b>Dina filer</b></label> <label style="text-align: center"><a href="ladda_fil.php"> Ladda upp en ny fil</a></label></th>
</tr>
<tr>
<td>Fil Namn</td>
<td>Fil Typ</td>
<td>Fil Storlek(KB)</td>
<td>Öppna</td>
<td>Radera</td>
</tr>
<?php
$sql="SELECT * FROM file LEFT JOIN users on userName";
$result_set=mysql_query($sql);
if($result_set === FALSE) { 
die(mysql_error()); // TODO: better error handling
}
while($row=mysql_fetch_array($result_set))
{
    ?>
    <form action="" method="POST">
        <tr>
        <td><?php echo $row['file'] ?></td>
        <td><?php echo $row['type'] ?></td>
        <td><?php echo $row['size'] ?></td>
        <td><a href="filer/mina_filer/<?php echo $row['file'] ?>" target="_blank">Öppna fil</a></td>
        <td style="text-align: center; padding-top: 10px"><input name="delete" type="checkbox"></td>
        </tr>
    <?php
}
?>
</table>
<input type="submit" class="button" value="Radera filer" style="float: right; margin-right: 20%; padding: 0.7%; color: black; font-style: italic; font-size: 80%">
</form>
</div>  
<?php
if (isset($_POST['delete'])) {
    $sql = "DELETE * FROM file WHERE";
    mysql_query($sql);
}
include 'template/overall/footer.php'; 
?>

我从哪里开始?这是从数据库中删除的开始,但它不起作用。我是php的新手并试图解决这个问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

使用unlink()功能,您可以删除文件夹中的文件。

  

示例代码

    $res=mysql_query("SELECT file FROM tbl_uploads WHERE id=".$_GET['remove_id']);
    $row=mysql_fetch_array($res);
    mysql_query("DELETE FROM tbl_uploads WHERE id=".$_GET['remove_id']);
    unlink("folder/path/".$row['file']);
  • 首先编写选择查询以从数据库中获取文件。
  • 此代码可以使用if(isset($ _ GET [])条件。
  • 获取文件后,将获取的文件放入上面的unlink()函数中。

更新::

  

要删除目录,您可以使用rmdir()

这很有用

realpath - Returns canonicalized absolute pathname.

is_writable - Tells whether the filename is writable.

对于SQL注入,我们可以使用mysql_real_escape_string

  

mysql_real_escape_string - 转义字符串中的特殊字符   在SQL语句中使用。但是在PHP 5.5.0中不推荐使用此扩展,并且它已在PHP 7.0.0中删除。相反,应该使用MySQLi或PDO_MySQL扩展。

答案 1 :(得分:0)

就像@RiggsFolly所说,还有很多东西需要学习。这个答案将涵盖您正在寻找的一些概念。对于初学者来说,这里有一些安全漏洞。首先停止使用mysql_*而使用mysqli_*,您也应该使用预准备语句来避免SQL注入。并且,还要检查文件是否属于用户,用户可以在其POST或GET请求中输入任何file_id,并可以删除不属于他的文件。

让我们来看看如何做到这一点。

list_file.php是您列出文件的地方:

//list files
while($row=mysql_fetch_array($result_set))
{
    ?>
        <tr>
        <td><?php echo $row['file'] ?></td>
        <td><?php echo $row['type'] ?></td>
        <td><?php echo $row['size'] ?></td>
        <td><a href="filer/mina_filer/<?php echo $row['file'] ?>" target="_blank">Öppna fil</a></td>
        <td style="text-align: center; padding-top: 10px"><a href="delete.php?file_delete=" . $row['file_id']>Delete</a></td>
        </tr>
    <?php
}
?>

delete_file.php看起来像这样:

   <?php

$file_id=$_GET['file_id'];
$user_id=$_SESSION['user_id'];                //user ID stored in session at time of login
$conn = new mysqli($servername, $username, $password, $dbname);
if (isset($_GET['file_delete'])) {
    $sql = "DELETE * FROM file WHERE ? && ? LIMIT 1"; // question indicate placeholders for later use, Also make sure to limit it to 1
    $stmt = $conn->prepare($sql);             // prepare query
    $stmt->bind_param("ii", $file_id, $user_id); // Bind values to the placeholders
    if($stmt->execute()){                     // execute the query OR delete the entry if it exists
      $sql="SELECT * FROM file WHERE file_id = '". $file_id ."' LIMIT 1";     // select file name using file_id
      $result=mysqli_query($sql);
      if($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
        unlink("folder/path/" . $row['file']);// Delete the file from server
        }
      }else{echo "Something went wrong!";}
}

?>

您可以查看准备好的陈述here

另外,这个<a href="filer/mina_filer/<?php echo $row['file'] ?>" target="_blank">是一个坏主意。您可以将其链接到download.php脚本,发送get或post参数并使用脚本获取文件而不是公开文件目录。查看this并查看下载脚本的外观