Php 使用PRG模式在最后一页显示表单数据的好方法是什么

Php 使用PRG模式在最后一页显示表单数据的好方法是什么,php,post-redirect-get,Php,Post Redirect Get,我想使用PRG模式来防止表单重新提交,因为提交涉及发送邮件。但是,这种方法的问题在于,我似乎没有找到“正确”的方法来向用户显示重定向后发送的数据。目前我正在做一些类似的事情: 带有表单(index.html)的某些页面 以及一个脚本页面formhandled.php,在成功后显示 <!-- header and menu html --> <?php echo $_GET["id"]; ?> <!-- footer html --> 这种方法

我想使用PRG模式来防止表单重新提交,因为提交涉及发送邮件。但是,这种方法的问题在于,我似乎没有找到“正确”的方法来向用户显示重定向后发送的数据。目前我正在做一些类似的事情:

带有表单(
index.html
)的某些页面

以及一个脚本页面
formhandled.php
,在成功后显示

<!-- header and menu html -->

<?php
    echo $_GET["id"];
?>

<!-- footer html -->

这种方法的问题是,我认为这会暴露URL中输入的所有数据,因此可能太容易受到攻击。最重要的是,HTML字符串使得URL相当长。我可以想出另外两种方法来解决我的问题

  • 将字符串存储在一个(临时)文件中并传递文件名,但是在我离开
    formhandled.php
    之后,我需要找到一些方法来删除这些文件,以防止这些信息在服务器上停留的时间过长
  • 开始一个会话。这种方法的主要问题是,如果用户没有禁用cookie(如果我理解正确的话),我只能显示数据 但我不明白为什么这些会更好/更糟。我也无法想象没有人做过这样的事情,但我找不到任何关于这个问题是如何解决的


    因此,我的问题是:重定向后如何显示输入的表单数据?

    有两种方法可以传输该数据:

  • 传输it客户端,在重定向的情况下,这意味着通过URL或可能的cookie
  • 将其传输到服务器端,这意味着服务器存储数据并在下一页再次检索数据
  • 你已经差不多明白了。在客户端传输确实有点恶心;您不想将所有这些信息都放到URL中(不是因为“漏洞”,只需将数据从URL打印到屏幕上没有太多问题),并且您希望避免仅为此设置cookie

    最好的解决方案是:

  • 服务器将数据存储在具有唯一id的短期自动清除位置
  • 通过URL发送唯一id作为查询参数
  • 您可以使用id从短期位置检索数据,显示它,然后放弃它
  • 现在,什么才算是好的短期存储?会话会很好,您可以通过URL而不是cookies传输会话id。这可能是内置PHP工具的最简单解决方案。或者,类似于存储或类似内存存储的东西对于这样的情况非常有用;但是,仅仅为了这个目的而建立可能是过分的。如果您已经在运行数据库,那么可以将数据存储在那里


    无论选择哪种解决方案,都必须确保数据迟早会自动丢弃。如果用户出于任何原因没有访问重定向页面,临时存储的数据将堆积在您的服务器上,这是您希望避免的。会话自动垃圾收集,可以自动清除Redis数据,使用数据库,您可以通过各种机制偶尔运行清理查询。

    Cookie和会话(几乎)是两件独立的事情。我将参加这次会议。我想说,会话始终是cookie,但cookie不一定是会话。Cookie只允许存储非常有限的数据量,并且很容易从客户端访问。会话将id存储在cookie中,但数据保留在服务器上。@ArtisticPhoenix会话将数据存储在服务器端,并将关联的id传输到客户端。这种传输不必通过cookies进行,这只是默认行为。@deceze-我知道这一点,但感谢您为其他人澄清这一点。。。我说的更多的是cookie vs session。
    <?php
        $data[0] = filter_var(INPUT_POST, "name", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
        $data[1] = filter_var(INPUT_POST, "tel", FILTER_SANITIZE_NUMBER_INT);
        $data[2] = filter_var(INPUT_POST, "mail", FILTER_VALIDATE_EMAIL);
    
        // process rest of data and create mail
    
        $mail->Body = getNiceHTML($data);
    
        $mail->send();
        header("Location: formhandled.php?id=" . urlencode($mail->Body));
        exit();
    ?>
    
    <!-- header and menu html -->
    
    <?php
        echo $_GET["id"];
    ?>
    
    <!-- footer html -->