【问题标题】:unset $_POST doesn't works未设置 $_POST 不起作用
【发布时间】:2013-06-13 14:38:34
【问题描述】:

这是我的代码 http://pastebin.com/DtK8MMtU 当用户按下“下一回合”按钮时,$_POST["turnOver"] 正在设置。然后脚本进入这个部分

 if (isset($_POST["turnOver"])) {
                $_SESSION["state"] = 0;
                unset($_SESSION["rolls"] );
                unset($_SESSION["bet"]);
                unset($_SESSION["nextTurn"]);
                $_SESSION["turnNumber"]++;
                unset($_POST["turnOver"]);    
 }

通过这一行unset($_POST["turnOver"]); 我希望这个块在用户按下“下一回合”按钮后只执行一次,但是每次用户刷新页面时都会执行一次(我通过 $_SESSION["turnNumber"] 值看到了这个,它增加了所有我刷新页面的时间)。另外,这里是来自 xdebug 的 $_POST var_dump:

array (size=1)
  'turnOver' => string ''... (length=9)

表示设置好了?

【问题讨论】:

  • 你不能那样做。但是,您可以检查 $_SESSION["state"] 是否不为 0,如果已经存在,则不要执行。当您 UNSET 时,它仅用于 PHP 脚本的其余执行。这意味着如果您在那之后尝试访问$_POST["turnOver"],那么它会在您从数组中删除它时失败,但它会在每次刷新时重新提交。
  • 您可以在每个合法帖子中包含一个随机数。将该数字存储在会话变量中。检查给定的数字是否与存储的数字不同。如果相同,则为浏览器刷新。

标签: php post xdebug


【解决方案1】:

如果用户刷新页面,他们每次都会发送turnOver POST 值。取消设置帖子只会影响该页面的其余部分。

最好的办法是设置一个会话值,并在第一次发送turnOver 时设置它,然后检查它。

【讨论】:

  • 其实,只是在这里大声想:他不能发送一个 302 标头 (header("Location: thisurl.php");) 并避免整个刷新问题吗?
  • @h2ooooooo 好点。最好在帖子后重定向以防止此类事情发生。
  • 另外,他可以在会话中存储一个唯一的表单密钥,仅在匹配时认为表单已提交,并在接受提交时生成新的表单密钥。这通常用于防止重复提交。
【解决方案2】:

你说

我通过 $_SESSION["turnNumber"] 值看到了这个,它在我刷新页面时一直在增加

这是你执行后的正常情人

$_SESSION["turnNumber"]++;

每次刷新时都会继续加 1。更进一步的行前

unset($_POST["turnOver"]);    

您的 $_POST["turnOver"] 实际上已设置,因此如果您在 unset() 命令之前尝试 var_dump,您将看到它已设置。

【讨论】:

  • 所以,即使我取消设置($_POST["turnOver"]),它会在我刷新页面时自动设置,即使我没有按下设置它的按钮?
  • 是的,如果您刷新,您将重新发布数据,并且 $_POST["turnOver"] 将在发布数组中可用,直到您实际执行 unset()
猜你喜欢
  • 2011-08-16
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2016-05-25
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多