停止数据插入数据库两次

Ben*_*Rae 25 php user-input

我是PHP的新手,我想知道当用户在与表单相同的页面刷新时,其他程序员使用什么方法/预防来阻止数据输入MySQL数据库两次?显然它发生了,我需要一个很好的方法来阻止它.

谢谢,本

Ily*_*man 40

我称之为网络编程的黄金法则:

永远不要用身体回应POST请求.始终执行工作,然后使用Location:标头进行响应以重定向到更新的页面,以便浏览器使用GET请求它.

这样,清爽不会对你造成任何伤害.

另外,关于评论中的讨论.为防止双重发布,例如,意外双击"提交"按钮,将表单的md5()存储在文本文件中,并将新表单的md5与存储的md5进行比较.如果他们是平等的,你就有一个双重职位.

  • 我对使用重新提交有问题的表单使用nonces("一次使用的数字").创建一个随机数/字符串,将其存储在会话数据中,并将其作为隐藏字段添加到表单中.在表单提交时,检查POSTed值是否与会话值匹配,然后立即清除会话值.重新提交将失败. (4认同)
  • jeroen,好的浏览器不会警告你(Opera).因为我们开发人员必须处理它,用户并不在意.他说F5,一定要刷新.用户将在没有阅读问题的情况下按"是" - 用户将是正确的! (3认同)

cha*_*aos 7

处理表单,然后重定向到结果页面.然后重新加载仅重新显示结果页面.


Jam*_*col 5

Ilya的回答是正确的,我只想添加一些比评论更多的内容:

如果重新提交是危险的(返回并再次提交,重新加载结果页面[如果你没有采取伊利亚的建议]等)我使用"随机数"来确保表格只能通过一次.

在表单页面上:

<?php
@session_start(); // make sure there is a session

// store some random string/number
$_SESSION['nonce'] = $nonce = md5('salt'.microtime());
?>
// ... snip ...
<form ... >
<input type="hidden" name="nonce" value="<?php echo $nonce; ?>" />
</form>
Run Code Online (Sandbox Code Playgroud)

在处理页面中:

<?php
if (!empty($_POST)) {
@session_start();

// check the nonce
if ($_SESSION['nonce'] != $_POST['nonce']) {
    // some error condition
} else {
    // clear the session nonce
    $_SESSION['nonce'] = null;
}

// continue processing
Run Code Online (Sandbox Code Playgroud)

表单提交一次后,无法再次提交,除非用户故意将其填写第二次.