防止双重提交到数据库

时间:2016-10-14 12:46:39

标签: php redirect html-formhandler

美好的一天,

我有一个问题我到处查看它似乎仍然卡住了

如果我通过邮寄提交表格 - >变量 - >数据库,然后重定向到另一个

在重定向和我

的时间内使用header(location:page.php);

页面

点击提交按钮,它仍会将重复数据插入数据库

如何防止这种情况发生?当我读到令牌时,我看不出它是怎样的

无需在另一页上处理我的表单数据即可使用

请帮忙吗?

请参阅下面的html:

     <form name="frmall"class="col s12" action="" method="post">
                            <!--basic info------------------------------------------------------------------------------------------------------------->
                            <div class="divider"></div>
                                <div class="section">
                                    <h5>Basic Member Information</h5>
                                        <div class="row">
                                            <div class="input-field col s6">
                                                <input id="first_name" name="txt_name" type="text" class="validate" value="<?php if(isset($_POST['btnContinue'])){echo $_POST['txt_name']; }  ?>">
                                                <label for="first_name">First Name</label>
                                            </div>
                                            <div class="input-field col s6">
                                                    <input id="last_name" type="text" name="txt_surname" class="validate"value="<?php if(isset($_POST['btnContinue'])){echo $_POST['txt_surname']; } ?>">
                                                    <label for="last_name">Last Name</label>
                                            </div>
                                            <div class="input-field col s6">
                                                <input id="icon_telephone" type="tel" name="txt_number" class="validate"value="<?php if(isset($_POST['btnContinue'])){echo $_POST['txt_number']; } ?>">
                                                <label>Telephone</label>
                                            </div>
                                            <div class="input-field col s6">
                                                <input id="email" type="email" name="txt_email" class="validate"value="<?php if(isset($_POST['btnContinue'])){echo $_POST['txt_email']; } ?>">
                                                <label for="email" data-error="wrong" data-success="right">Email</label>
                                            </div>
                                            <div class="input-field col s6">
                                                <input id="idnumber" type="text" name ="txt_idnumber" class="validate"value="<?php if(isset($_POST['btnContinue'])){echo $_POST['txt_idnumber']; }  ?>">
                                                <label>ID Number</label>
                                            </div>
                                        </div>
 <button class="btn waves-effect waves-light" type="submit" name="btnCancel">Cancel</button>
                                                <button class="btn waves-effect waves-light" type="submit" name="btnContinue">Continue</button>

                                </div>
    </Form>

PHP(请不要仅仅为例子):

if (isset($_POST['btnContinue'])) {
      $Conn->insert_main_member($name, $surname, $number, $idnumber, $email);
      header(location:page.php);
   }

那么如何在不禁用按钮的情况下阻止双重提交?请协助

3 个答案:

答案 0 :(得分:1)

清除post变量并将header(...)放在正确的位置(在db查询执行后)。

答案 1 :(得分:1)

问题不是很明确......

如果您在多次提交表单并插入相同值时遇到问题,可以在脚本中进行检查(连接到数据库并检查)或在数据库表中创建UNIQUE索引 - 然后记录将如果它已经存在,则不插入。

如果您在网站上有太多人遇到问题并且插入了一些数据但它应该等到其他内容已经完成,那么您可以使用LOCK TABLES命令发送到您的数据库。

如果您在唯一标识事务时遇到问题,您还可以使用令牌(例如,在提交表单之前生成的随机哈希),例如作为隐藏表单字段与数据一起发送。

答案 2 :(得分:0)

第一个快速解决方案: 您可以在第一次表单提交后使用javascript禁用提交按钮,以防止在重定向之前提交任何其他内容...

第二个解决方案: 在隐藏的输入中将标记(生成的服务器端)添加到HTML表单。 在表单提交时,您的令牌将与其他POST数据一起发送。 在将数据插入数据库之前检查令牌服务器端

编辑:也许您的代码示例(服务器端+ html表单)可以帮助我们为您提供更合适的答案。