停止重新发送信息的帖子

时间:2015-05-28 12:24:14

标签: php html post

我在此之前询问了question我要求提供一种方法来阻止帖子在提交时被重新发送。

社区给了我这个功能:

function cansend($token) {
    if(isset($_SESSION['token'])) {        
        if ($token == $_SESSION['token']){
            $continue = false;
        }
        else {
            $continue = true;
        }
    }
    else {
        $_SESSION['token'] = $token;
        $continue = true;
    }
    return $continue;
}

这是完美的,并且做了我需要它,然而,由于某种原因,它总是返回true并且不会停止再次发布方法。

我的表格是这样的:

<?php
$token = rand();

if ($_POST) {
    if (isset($_POST['submit'])) {
        if (cansend($_POST['token'])) {
            print $_POST['textinput'];
        }
    }
}
?>

<form action="#" method="post">
    <input type="hidden" name="token" value="<?php echo $token ?>" />
    <input type="text" name="textinput" />
    <input type="submit" value="Submit" name="submit" />
</form>

我需要更改什么以及在哪里重新开始工作?

修改

实际代码:

$_SLIP = new BettingSlip();
if ($_SLIP->CanSend($_POST['token'])) {
    if (isset($_POST['creditAcc'])) {
        $_SLIP->SetUserBalance($_POST['id'], $_POST['amount'], 'in');
    }
    if (isset($_POST['setLimit'])) {
        $_USERMAN->setlimit($_POST['id'], $_POST['limit']);
    }
}
else {
    echo "Cannot resend the same information twice";
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是在页面启动时创建一个随机值,并将其设置为会话和隐藏的表单,就像您现在正在做的那样。

<?php 
$_SESSION['token'] = $somerandom; //give the session token a random value
$token = $somerandom; //give the same value to the variable token
?>

接下来,您将令牌回显到隐藏的表单中,就像您已经

一样
<form action="#" method="post">
    <input type="hidden" name="token" value="<?php echo $token ?>" />
    <input type="text" name="textinput" />
    <input type="submit" value="Submit" name="submit" />
</form>

在处理表单中,您需要做的就是检查$ _SESSION标记是否与$ _POST标记相同。

if($_POST['token'] == $_SESSION['token']){
    //Do something
}

每当您打开主页面时,它都会更改会话变量。因此,仍然包含旧令牌的post值将不再与较新的Session令牌匹配。

这在我眼中更简单,并且不需要你为它创建一个函数。