PHP:输入到.txt和html页面

时间:2013-09-13 02:09:47

标签: php html

所以,我得到了我的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:

storeText.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");
}
?>

2 个答案:

答案 0 :(得分:2)

Nikhil Patel在你的问题评论中几乎打败了我,但让我试着提供更多细节。

我并不是100%确定我正确地阅读了你的问题,所以如果我错了,请纠正我:你在profile.html上有一个表格,它总结为storeText.php。 StoreText.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中可用并应显示。另一种方法是POST/redirect/GET设置,其中表单提交给storeText.php,后者完成工作并将用户重定向回profile.html。

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

如果你想使用重定向,你需要一些方法在服务器端存储该变量,以便profile.html可以访问它。通常的方法是使用sessions。只需让profile.html和storeText.php设置会话,让storeText.php将$msg保存到会话中,并让profile.html将其拉出来。然后从profile.html中删除require_once('storeText.php');行,因为您不再需要那个逻辑了。

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

然而,如果你正在做的事情的全部要点是使profile.html输出文本文件中的任何内容,那么这两种方法都是完全错误的,无论是什么?你是否在表格提交后立即看到它。在这种情况下,不要担心保留$msg变量。保持storeText.php不变,包括重定向。从profile.html中删除包含。然后,不要让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)。

答案 1 :(得分:0)

使用File Put Content在任何文件上存储数据