gpt4 book ai didi

php - 在 PHP 中提交表单时如何防止多次插入?

转载 作者:IT王子 更新时间:2023-10-29 01:12:55 27 4
gpt4 key购买 nike

有时用户可能会按 Enter 两次,然后帖子被插入两次。

除了检查是否已经有具有相同 titlecontent 的帖子外,是否有其他解决方案可以防止这种情况发生?

最佳答案

这个问题有几种解决方案:

  1. 使用 Javascript 在表单发布时禁用表单的提交按钮。 这样做的缺点是这绝对不是万无一失的方法。无需实际单击按钮即可轻松提交表单,这对于禁用 JavaScript 的用户也不起作用。 我绝对不会推荐这种方法。

    例子:

    <script language="javascript">
    <!--
    function disableSubmitButton() {
    // you may fill in the blanks :)
    }
    -->
    </script>
    <form action="foo.php" method="post">
    <input type="text" name="bar" />
    <input type="submit" value="Save" onclick="disableSubmitButton();">
    </form>
  2. 使用PHP sessions将 session 变量(例如 $_SESSION['posttimer'])设置为 post 上的当前时间戳。 在 PHP 中实际处理表单之前,检查 $_SESSION['posttimer'] 变量是否存在并检查一定的时间戳差异(IE:2秒)。这样,您可以轻松过滤掉重复提交。

    例子:

    // form.html
    <form action="foo.php" method="post">
    <input type="text" name="bar" />
    <input type="submit" value="Save">
    </form>

    // foo.php
    if (isset($_POST) && !empty($_POST))
    {
    if (isset($_SESSION['posttimer']))
    {
    if ( (time() - $_SESSION['posttimer']) <= 2)
    {
    // less then 2 seconds since last post
    }
    else
    {
    // more than 2 seconds since last post
    }
    }
    $_SESSION['posttimer'] = time();
    }
  3. 在每个 POST 中包含一个唯一标记。在这种情况下,您还可以将 session 变量设置为要包含的标记,然后在表单中呈现该标记。提交表单后,您将重新生成 token 。当提交的token与你 session 中的token不匹配时,表单已经重新提交,应该声明无效。

    例子:

    // form.php
    <?php
    // obviously this can be anything you want, as long as it is unique
    $_SESSION['token'] = md5(session_id() . time());
    ?>
    <form action="foo.php" method="post">
    <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
    <input type="text" name="bar" />
    <input type="submit" value="Save" />
    </form>

    // foo.php
    if (isset($_SESSION['token']))
    {
    if (isset($_POST['token']))
    {
    if ($_POST['token'] != $_SESSION['token'])
    {
    // double submit
    }
    }
    }

关于php - 在 PHP 中提交表单时如何防止多次插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com