如何修复来自 php 页面的评论在页面重新加载时重复发布?

How to fix comments from php page got repeatedly posting on page reload?

您好,我正在尝试仅使用 php(没有数据库)为网站创建评论框,几乎成功了。但是,每次重新加载页面时,评论都会重复 post 一次又一次。如何解决?

我的代码在comment.php

<form action="comment.php" method="post">
<label for="name">Name:</label><br/>
<input type="text" name="yourname"><br>
<label for="name">Comment:</label> <br/>
<textarea name="comment" id="comment" cols="30" rows="10"></textarea><br/>
<input type="submit" value="submit">
</form>

<?php
$yourname = $_POST['yourname'];
$comment = $_POST['comment'];
$data = $yourname . "<br>" . $comment . "<br><br>";
$myfile = fopen("comment.txt", "a"); 
fwrite($myfile, $data); 
fclose($myfile);
$myfile = fopen("comment.txt", "r");
echo fread($myfile,filesize("comment.txt"));
?>

预期输出,

当用户输入姓名和评论并提交时,它必须Post评论。 (虽然重新加载它不应该再次重复最后的 posted 评论)

正在输出,

当用户输入姓名和评论并提交时,post评论。但是,当 reload/refresh 该页面再次 post 最后评论时。如果再次重装,再次posting最后的评论。每次重新加载页面时都会重复。

请帮助我修复我的代码。这会很有帮助。谢谢。

第一次学习PHP。对你有好处。虽然也许可以更好地花时间学习 Python。无论如何,这里发生了两件事。

一个是每次用户点击页面时,无论是否发送了任何信息,php 块都会执行。您想将 php 代码包装在 if 语句中,例如:

if( count($_POST) )
{
 $yourname = $_POST['yourname'];
 $comment = $_POST['comment'];
 $data = $yourname . "<br>" . $comment . "<br><br>";
 $myfile = fopen("comment.txt", "a"); 
 fwrite($myfile, $data); 
 fclose($myfile);
 $myfile = fopen("comment.txt", "r");
 echo fread($myfile,filesize("comment.txt"));
}

你的第二个问题是,一旦你 POST 编辑了一些东西,那么每次你重新加载页面(通过 F5)而不是从新会话重新加载时,你需要清除 POST数组。有很多方法可以做到这一点,我认为最适合你的是在 echo 之后坚持这个:

foreach( $_POST as $key=>$val )
{
   unset( $_POST[$key] );
}

查看此 link 了解更多 - [Unset post variables after form submission

祝你好运!

您可以使用PRG Pattern来避免多次提交。

首先检查请求方式是否为POST。如果是这样,请保存评论,然后重定向回(或您想要的任何其他页面):

<?php
$myfile = fopen('comment.txt', 'a');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $yourname = $_POST['yourname'];
    $comment = $_POST['comment'];
    $data = $yourname . "<br>" . $comment . "<br><br>"; 
    fwrite($myfile, $data); 
    fclose($myfile);
    header('Location: comment.php');
    die();
}

$myfile = fopen('comment.txt', 'r');
echo fread($myfile, filesize('comment.txt'));
?>