PHP:输入到.txt和html页面


PHP: Input to .txt AND html page

所以,我让我的PHP脚本将输入存储在.txt文件中,但是,我的html页面不起作用。 我想将文本输出到.txt文件以及我的 html 页面上的div。

我个人认为这与脚本本身位于单独的页面上这一事实有关,并且我正在刷新页面,因此永远不会有机会出现。 我觉得 PHP 脚本应该做的是从.txt文件中提取。 但不确定。

我已经尝试action=""并将PHP放在同一页面上,但这并没有写入.txt文件。 它写入.txt文件的唯一方法是当我执行action="[php file]".

有什么想法吗?

.HTML:

参考资料:

<?php require_once('storeText.php');?>

形式:

<form id="post" name="post" action="storeText.php" method="post">
    <textarea name="msg" rows="5"></textarea>
    <input class="button" name="submit" type="submit" value="SQUAWK!"/>
</form>

我希望输入在页面上的位置:

<div class="menuItem" >
    <?php echo $msg; ?>
</div>

.PHP:

存储文本.php

<?php       
    if ( isset( $_POST['submit'] ) ) {
       $filename = 'posts.txt';
       $msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
       if ( is_writable( $filename ) ) {
          if ( $handle = fopen( $filename, 'a') ) {
             fwrite( $handle, $msg );
             echo "Success, wrote ( $msg ) to file ( $filename )";
             fclose( $handle );
          } else {
             echo "Could not open file.";
          }
       } else {
          echo "File not writable.";
       }
       header("Location: profile.html");
    }
?>

仅供参考-我决定为所有fwrite()仇恨者使用替代脚本...同样的交易...不会写入 HTML 页面。

备用 PHP:

<?php       
if(isset($_POST['submit'])) 
{
    $file = 'posts.txt';
    // Open the file to get existing content
    $msg = file_get_contents($file);
    // Append new content to the file
    $msg .= (isset($_POST['msg']) ? $_POST['msg'] : null);
    // Write the contents back to the file
    file_put_contents($file, $msg);
    header("Location: profile.html");
}
?>

Nikhil Patel 在对您的问题的评论中几乎击败了我,但让我尝试提供更多细节。

我不是 100% 确定我是否正确阅读了您的问题,因此如果我在任何问题上错了,请纠正我:您在 profile.html 上有一个表单,该表单汇总到 storeText.php。StoreText.php写入文件并重定向回profile.html。然后,您希望 profile.html 显示写入文本文件的相同$msg变量,但它没有这样做。是吗?

您可能在期望将.html文件作为 PHP 代码执行时遇到问题。我不知道您的 Web 服务器是如何设置的,但通常只有 PHP 解析.php文件。您可以尝试将配置文件重命名.html重命名为配置文件.php看看这是否有区别。从现在开始,我将假设配置文件.html被解析为 PHP;如果我错了,您可能需要重命名文件。

真正的问题是重定向。您可以在此处采用两种不同的方法之一。一种方法是在配置文件中包含storeText.php.html并将表单提交到profile.html。然后,$msg变量将在配置文件中可用.html并且应该显示。另一种方法是POST/redirect/GET设置,其中表单提交到storeText.php,后者完成工作并将用户重定向回profile.html。

问题是,你不能同时执行包含重定向。这就是你遇到问题的地方。请参阅,来自客户端的每个 HTTP 请求(包括客户端为响应重定向标头而发送的新请求)都会导致脚本从头开始再次运行。重定向后启动的全新配置文件.html从未见过包含写入文件的值的$msg变量。提交到 profile.html 不起作用的原因是它包含来自 storeText.php 的所有代码,包括重定向,即使您重定向到同一个文件,它仍然是一个新请求。

如果要使用重定向,则需要某种方式将该变量存储在服务器端,以便配置文件.html可以访问它。执行此操作的通常方法是使用会话。只需同时拥有配置文件.html和 storeText.php设置会话,具有 storeText.php将$msg保存到会话,并具有配置文件.html将其拉出。然后从配置文件中删除require_once('storeText.php');行.html,因为您不再需要该逻辑。

如果您不依附于重定向,那么您可以按照我通常的做法(以及 Nikhil Patel 在评论中建议的)。我通常将我的表单显示逻辑和表单处理逻辑放在一个文件中,该文件根据是否有表单输入来决定要做什么。我发现这使得进行验证变得更容易,但我跑题了。您真正需要在这里更改的只是将表单提交到配置文件.html(action=""可以正常工作)并从storeText.php中删除重定向。然后一切都会按您的预期工作。

但是,如果您正在做的重点是制作配置文件.html输出文本文件中的任何内容,无论您是否在表单提交后立即看到它,那么这两种方法都是完全错误的。在这种情况下,根本不用担心保留该$msg变量。保持storeText.php几乎是原样,包括重定向。从配置文件中删除包含.html。然后,不要有配置文件.html而是尝试回显$msg,让它打开文件并回显其内容。(您甚至可以设置一个循环,一次读取一行,并根据需要将每个循环放在单独的div 中。

在重新阅读您的问题时,我不太清楚您真正想要哪种行为。您的第一个版本的storeText.php仅将新内容存储在$msg中,并使用fopen/fwrite/etc.函数将其附加到文件中。因此,如果$msg确实在重定向中幸存下来(例如,如果您将其存储在会话中),则用户将只能看到添加到文件中的新位。备用版本将文件加载到$msg中,将新内容附加到该文件,并用$msg覆盖文件。如果在这种情况下$msg重定向中幸存下来,用户将看到文件的全部内容。

但是,在任何一种情况下,用户只会在提交表单后立即看到结果;对profile.html的新GET请求仍将显示一个空的div。如果您希望在用户查看配置文件时显示信息.html,则从文件中读取它是唯一的选择。

顺便说一下,你可能已经知道这一点,但无论如何都值得明确:不要显示从用户那里获得的任何值而不转义它们。如果您这样做,那么您的页面将允许攻击者输入恶意代码并使其在用户的浏览器中运行。无论您是从最后一个表单输入还是从文件中获取值,这都适用。阅读有关跨站点脚本 (XSS) 的信息,请访问 IT Security StackExchange 或 OWASP.org。

使用文件放置内容在任何文件上存储数据