【问题标题】:Unlink .XML file on submit提交时取消链接 .XML 文件
【发布时间】:2021-05-01 03:47:07
【问题描述】:

我之前问过this question,但由于this,我找到了不同的解决方案/版本。

为了对 Web 应用程序有一些了解,我将在此处引用它:

至于分配,我创建了一个过滤器,该过滤器修改了一个连接到打印出订单文件的 API 的配置。 Web 应用程序可以选择保存修改后的 Orderlist,并在其中添加日期和编号。

修改后的订单列表的输出:

Order 25-01-21 Versie 1.xml
Order 26-01-21 Versie 1.xml
Order 26-01-21 Versie 2.xml
Order 26-01-21 Versie 3.xml
Order 26-01-21 Versie 4.xml

我被要求添加一个允许他删除文件的工具,如果他愿意的话。经过一番挣扎,环顾四周,并在我提出这个问题之前提出了一个惊人的方法:

<?php
$dir    = '..\api-ivolved\s_orderlist';
$ar=glob($dir); // Change this input 
foreach(glob("*.xml") as $filename) {
    echo "<input type=\"checkbox\" name=\"files[]\" value=".$filename."/>" . htmlspecialchars($filename) . "<br />"; }

if (isset($_GET['delete'])){

    // Make sure files are checked/marked for deletion. 
    if (!empty($_GET['files[]'])) {
 
        // Loop through each file and delete
        foreach ($_GET['files[]'] as $file) {
            unlink($file);      
        } 
    }
 }
?>

<form class="deleteFile" method="get" enctype="multipart/form-data">
<br />
<strong> Delete checked files? </strong> <input type="checkbox" name="delete" value="1"/><br/>
<input type="submit" id="delete" value="Delete file"/> 
</form> 

现在的问题是,在我选中文件复选框并确认删除文件后,该文档仍保留在文件夹中。有人可以指出或举例说明如何解决此问题吗?

【问题讨论】:

  • $_GET['files'] 不存在。您的表单中没有name="files"。 (根据您的 echo 语句判断,您的表单可能至少有一个 outside。未提交表单之外的字段...)
  • P.S.不上传文件时,enctype="multipart/form-data" 不是必需的。
  • @ADyson echo "&lt;input type=\"checkbox\" name=\"files[]\"[..] 包含我意识到的名称,但即使添加也不会改变结果。
  • @ADyson 感谢您的通知!我仍然从我之前有输入文件的尝试中添加了 enctype,所以我将删除它。 C:
  • even adding that 到底是什么意思?在 PHP 端它应该仍然是$_GET['files']...因为它是一个数组。就像我说的,主要问题是输入在表单之外。它们需要在 &lt;form&gt; 标记内回显

标签: php html forms


【解决方案1】:

这里的主要问题是您的files 复选框在您的&lt;form&gt; 之外。浏览器不会提交 HTML 中 &lt;form&gt; 之外的字段。 (在 HTML5 中有一个 way around that,但这里真的没有必要。)

此外,从语义上和实践上来说,使用 POST 执行此操作会更有意义。在 PHP 方面,您仍然应该在 POST 数组中搜索 files 而不是 files[]

这是一个更好的版本:

<?php
if (isset($_POST['delete'])){

    // Make sure files are checked/marked for deletion. 
    if (!empty($_POST['files'])) {
 
        // Loop through each file and delete
        foreach ($_POST['files'] as $file) {
            unlink($file);      
        } 
    }
 }
?>

<form class="deleteFile" method="post">

    <?php
    $dir = '..\api-ivolved\s_orderlist';
    $ar = glob($dir); // Change this input 

    foreach(glob("*.xml") as $filename) {
        echo "<input type=\"checkbox\" name=\"files[]\" value=\"$filename\"/>" . htmlspecialchars($filename) . "<br />"; 
    }
    ?>

    <br />
    <strong> Delete checked files? </strong> 
    <input type="checkbox" name="delete" value="1"/>
    <br/>
    <input type="submit" id="delete" value="Delete file"/> 
</form>

附:确保您对此具有无懈可击的安全性,因为机器人或恶意用户可能会对此类功能造成严重破坏,客户端可以指定要删除的任何文件的完整路径。表单应该受到身份验证的保护,并且网络服务器应该只有从您想要允许的确切位置删除文件的权限。

【讨论】:

  • 它仍然显示这个问题很遗憾Warning: unlink(Order): No such file or directory in C:\xampp\htdocs\php-api\api-ivolved\s_orderlist\testTest.php - 但你的修复肯定显示了一些结果,我只是不知道如何解决这个问题
  • 好的,这表明它正在处理结果。只是可能提交的内容不正确。您需要检查提交并放置在$file 中的确切值,然后查看该路径是否真的存在于您的计算机中。作为一个简单的测试,将var_dump($file); 放入foreach ($_POST['files'] as $file) { 循环中,看看它会打印什么。
  • P.S.您是否仔细注意到我在代码中对您的 echo "&lt;input type=\"checkbox\".... 行所做的更改。输出文件名的方式存在问题。检查你使用的是我的版本,然后看看你是否还有问题。
  • 非常感谢您的帮助!
猜你喜欢
  • 2012-02-02
  • 2013-05-17
  • 2016-10-04
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
相关资源
最近更新 更多