PHP论坛页面刷新时评论区帖子重复提交问题求助
问题根源
- 表单提交逻辑未做限制:写入评论的代码没放在提交判断里,只要页面加载(包括刷新)且POST参数存在,就会重复写入评论。
- 未采用PRG模式:提交后直接输出内容,刷新时浏览器会重复发送POST请求,导致重复提交。
- 文件读取有长度限制:
fread($old,1024)只读取1024字节,评论内容较多时会丢失部分内容。
修复方案
1. 修正PHP处理逻辑
把写入文件的代码放到提交判断内,同时用重定向避免重复提交:
<?php if(isset($_POST['Submit'])){ $Topic = $_POST['Topic']; $Name = $_POST['Name']; $Comment = $_POST['Comment']; // 读取全部旧评论,无需限制字节数 $old_comments = file_get_contents("comments.txt") ?: ""; // 拼接新评论,修正原代码里多余的</b>标签 $new_comment = "<b>{$Topic}</b><br>{$Name}<br>{$Comment}<br><br>"; $string = $new_comment . $old_comments; // 写入文件 file_put_contents("comments.txt", $string); // 重定向到当前页面,刷新时就不会重复提交了 header("Location: " . $_SERVER['PHP_SELF']); exit; } // 读取并显示评论 $comments = file_get_contents("comments.txt") ?: "暂无评论"; ?>
2. 修复混乱的HTML结构
原代码存在重复的<html>标签,修正后结构更清晰合法:
<!DOCTYPE html> <html> <body> <center> <form action="" method="POST"> <label> Topic: <input type="text" name="Topic" class="Input" style="width: 300px" required> </label> <br><br> <label> Name: <input type="text" name="Name" class="Input" style="width: 225px" required> </label> <br><br> <label> Comment: <br> <textarea name="Comment" class="Input" style="width: 300px" required></textarea> </label> <br><br> <input type="Submit" name="Submit" value="Submit" class="Submit"> </form> </center> <hr> <br><br> <center> <h3>Comments</h3> <hr> <?php echo $comments; ?> </center> </body> </html>
关键改进点
- PRG模式:提交后重定向,浏览器会发送GET请求,刷新时不会重复提交表单。
- 简化文件操作:用
file_get_contents和file_put_contents替代复杂的fopen系列函数,能读取完整文件内容,避免字节限制问题。 - 修复HTML错误:移除多余的
<html>标签,保证页面结构合法。
内容的提问来源于stack exchange,提问作者possessor of 67 IQ
相关产品推荐
相关产品推荐

