重定向不停止重新提交?

时间:2013-03-05 22:39:18

标签: php post-redirect-get

PHP

    $thisfile=$_SERVER["REQUEST_URI"];

    if(isset($_POST['comment'])&&!empty($_POST['comment'])){
    if($id!=0){
    $comment=$_POST['comment'];

    if ($comment_query=mysql_query("INSERT INTO `photosite`.`comments` VALUES ('$id', '', '$firstname', '$surname', '$photo_id', '$comment', '$time')")){

    header('Location: photopage.php?photo_id='.$photo_id.'', true, 303);
    exit;

    }else {
    echo 'Could not add comment';
    }
    }else {
    echo'Please Log In to add a Comment';
    }
    }       

我不知道为什么我的

header('Location: photopage.php?photo_id='.$photo_id.'', true, 303);
    exit;       

还是用户重新提交数据?这链接到同一页面,因为它用于添加注释,因此当用户添加注释时,页面将刷新到同一页面。但如果你再次刷新,内容会重新提交,任何想法为什么?

更新: 我 DO 在同一文档中的所有代码之前都有回声。这是问题吗?

好的,我将表单操作更改为另一个要处理的页面。以前的事情输出到页面是问题!

3 个答案:

答案 0 :(得分:0)

尝试

...
header('Location: /photopage.php?photo_id='.$photo_id.'', true, 303);
...

答案 1 :(得分:0)

 header('Location: photopage.php?photo_id='.$photo_id.'&added='.time());
    exit;

应该有效。您提供的代码也应该有效。 header->位置会删除POST内容,因此如果您之后刷新页面,则不应重新提交。

按BACK按钮是另一回事,除非您为每个表单请求使用唯一令牌,否则无法解决此问题。

示例:

 //check if the token in the session matches the token in the post
 if( isset( $_POST['token'], $_SESSION['token']) 
     && $_SESSION['token'] == $_POST['token'] ){
    //handle your post data
     [...]
 }

 //set the token
 $_SESSION['token'] = sha1(time().mt_rand());

 //process your form
 ?>
 [...]
 <input type='hidden' name='token' value='<?php echo $_SESSION["token"];?>'/>
 [...]

答案 2 :(得分:0)

好吧,好像我已经找到了你的问题..我认为你的错误报告已关闭,所以你没有看到关于标题的警告,“无法修改标题信息 - 标题已经发送......”。
你不能发送标题或修改它们,因为发送,你必须打开缓冲。在代码顶部使用ob_start()。它必须看起来像这样

<?php
ob_start();
..

请勿在{{1​​}}之前使用任何空格。

并从标题函数中删除参数true,303 ..

<?php

http://www.php.net/manual/en/function.ob-start.php