1

大家好,

我有一个问题,我到处查找,但我似乎仍然卡住了

如果我通过 post -> variable -> database 提交表单,然后重定向到另一个

页面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);
   }

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

4

3 回答 3

1

这个问题不是很清楚...

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

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

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

于 2016-10-14T13:06:07.583 回答
1

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

于 2016-10-14T13:00:42.410 回答
0

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

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

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

于 2016-10-14T13:01:56.893 回答