PHP:输入到.txt和html页面

PHP:输入到.txt和html页面,php,html,Php,Html,所以,我让我的PHP脚本将输入存储在一个.txt文件中,但是,我的html页面出现了一些问题。我想将文本输出到.txt文件以及html页面上的div 我个人认为这与脚本本身在一个单独的页面上这一事实有关,我正在刷新页面,所以从来没有机会出现。我觉得PHP脚本应该做的是从.txt文件中提取。但不确定 我尝试了action=”“并将PHP放在同一页面上,但没有写入.txt文件。它写入.txt文件的唯一方式是执行action=“[php文件]”操作 有什么想法吗 HTML: <?php

所以,我让我的PHP脚本将输入存储在一个.txt文件中,但是,我的html页面出现了一些问题。我想将文本输出到.txt文件以及html页面上的div

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

我尝试了
action=”“
并将PHP放在同一页面上,但没有写入.txt文件。它写入.txt文件的唯一方式是执行
action=“[php文件]”
操作

有什么想法吗

HTML:

<?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");
}
?>
参考资料:

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

用于在任何文件上存储数据

Nikhil Patel在对您的问题的评论中几乎击败了我,但让我尝试提供一些更详细的信息

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

希望.html文件作为PHP代码执行可能会有问题。我不知道您的Web服务器是如何设置的,但通常只有.php文件由php解析。您可以尝试将profile.html重命名为profile.php,看看这是否会有所不同。从这里开始,我将假设profile.html被解析为PHP;如果我错了,你可能需要重新命名这个文件

真正的问题是重定向。在这里,您可以采用两种不同的方法中的任何一种。一种方法是在profile.html中包含storeText.php,并将表单提交到profile.html。然后,
$msg
变量将在profile.html中可用,并应显示。另一种方法是设置表单提交到storeText.php,由storeText.php完成工作并将用户重定向回profile.html

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

如果要使用重定向,则需要某种方法将该变量存储在服务器端,以便profile.html能够访问该变量。通常的做法是使用。只需让profile.html和storeText.php都设置会话,让storeText.php将
$msg
保存到会话,然后让profile.html将其拉出即可。然后删除
require_一次('storeText.php')profile.html中的行,因为您不再需要该逻辑

如果你没有加入重定向,那么你可以做我通常做的事情(以及Nikhil Patel在评论中的建议)。我通常将表单显示逻辑和表单处理逻辑放在一个文件中,该文件根据是否有表单输入来决定要做什么。我发现这样做更容易进行验证,但我离题了。这里真正需要更改的是将表单提交到profile.html(
action=“
可以正常工作)并从storeText.php中删除重定向。然后一切都会像你期望的那样

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

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

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


顺便说一句,您可能已经知道这一点,但无论如何都值得明确说明:不要显示从用户处获得的任何值而不进行转义。如果您这样做,则您的页面将允许攻击者输入恶意代码并在用户的浏览器中运行。无论您是从上次表单输入还是从文件中获取值,这都适用。阅读IT Security StackExchange或OWASP.org上的跨站点脚本(XSS)。

我可以使用上述脚本写入文件。我现在的问题是在同一个html页面中显示输入
<div class="menuItem" >
    <?php echo $msg; ?>
</div>
<?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");
    }
?>
<?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");
}
?>