0

因此,我让我的 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");
}
?>
4

2 回答 2

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 可以访问它。通常的做法是使用session。只需让 profile.html 和 storeText.php 都设置会话,将 storeText.php 保存$msg到会话中,然后让 profile.html 将其拉回。然后require_once('storeText.php');从 profile.html 中删除该行,因为您不再需要该逻辑。

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

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

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

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

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

于 2013-09-14T15:50:16.343 回答
0

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

于 2013-09-13T02:17:59.577 回答