【问题标题】:stop inserting data in the database when refreshing the page [duplicate]刷新页面时停止在数据库中插入数据[重复]
【发布时间】:2013-08-09 13:18:19
【问题描述】:

我正在寻找一种在刷新页面时停止在数据库中插入或发送数据的方法。

这是我的代码:

user_details_page.php

<form action="confirm_page.php" method="post" >
User Name:  
<input  type="text" name="username" >
User Email
<input  type="text" name="useremail" >
Password:  
<input  type="text" name="password" >
<input type="submit"  name="submit" >
</form>

确认页面.php

if (isset($_POST['submit'])) 
{
$user= $_POST['username'];
$email = $_POST['useremail'];
$pass= $_POST['password']; 

mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email');

}

所以每次我刷新确认 page.php 时都会出现问题,数据会发送到数据库。如何阻止这种情况?

【问题讨论】:

  • 您是手动使用浏览器的刷新/重新加载还是点击网页上的刷新按钮/链接?
  • @The Debi,我指的是浏览器上的刷新按钮
  • @nnichols,我进行了验证,并放入了代码的特定部分来解决问题

标签: php mysql database load refresh


【解决方案1】:

将用户标到新页面:

if (isset($_POST['submit'])) 
{
  $user= $_POST['username'];
  $email = $_POST['useremail'];
  $pass= $_POST['password']; 

  mysql_query("INSERT INTO table (username, useremail, email) VALUES(`$username','$useremail','$email')");

}
//best outside the if statement so user isn't stuck on a white blank page.
header("location: landing_page.php");
exit;

通过这样做,刷新的用户将刷新landing_page.php,这意味着它不会进行两次插入。

最佳建议:先检查用户是否存在,如果存在则不要插入!

【讨论】:

  • 警告:您对SQL Injections 持开放态度,应该真正使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何类型的输入,尤其是来自客户端的输入。即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data
  • 如果他在这篇文章 5 年后仍然没有使用像 PDO 这样的东西,那是他自己的错。
【解决方案2】:

这里发生的事情是,当你刷新页面时,表单被提交了两次。

为了防止这种情况,您可以使用会话:

session_start();

if( $_SESSION['submit'] == $_POST['submit'] && 
     isset($_SESSION['submit'])){
    // user double submitted 
}
else {
    // user submitted once
    $_SESSION['submit'] = $_POST['submit'];        
} 

【讨论】:

    【解决方案3】:

    在您的代码中完成插入或更新后,您总是需要重定向到另一个页面。

    请参阅此处了解如何执行此操作:How to make a redirect in PHP?

    (您想使用 PHP 重定向,而不是 Javascript 或 HTML 重定向,因为您显然确实需要它来工作。)

    确认页面应该是您在更新后重定向到的页面,而不是插入的页面。

    【讨论】:

    • 不正确 - 这可以工作,但很多时候您需要留在同一页面上
    • @mark 如果想留在同一页面上,请使用 Ajax 或使用不同参数重定向回同一页面,但如果您执行了正常的 HTML 提交并且不重定向并且有人刷新页面然后重新发送相同的参数,您将获得该数据的双重提交。
    【解决方案4】:

    确认页面.php:

    if (isset($_POST['submit'])) 
    {
    $user= $_POST['username'];
    $email = $_POST['useremail'];
    $pass= $_POST['password']; 
    
    mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email')"); // <-- missing endquote and bracket here
    
    header('Location: somewhere_else.php');
    exit;
    }
    

    【讨论】:

      【解决方案5】:

      防止这种情况的最佳方法是在查询后添加 header('Location: filename')。因此,在您的情况下,

      if (isset($_POST['submit'])) 
      {
      $user= $_POST['username'];
      $email = $_POST['useremail'];
      $pass= $_POST['password']; 
      
      mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email');
      //must be inside the condition to prevent too many redirects
      header('Location: user_details_page.php');
      }
      

      【讨论】:

        【解决方案6】:

        我通过使用会话有这个解决方案

        <?php session_start();
                if(isset($_POST[$_SESSION[a][count($_SESSION[a])-1]])){
                    echo "somthing....";
                    unset($_SESSION[a]);
                }
                else{     
                                echo '<form method="post">';
                                      $_SESSION["a"]=array();
                                      $_SESSION["a"][0]="a".rand(1,100);
                                echo '<input name="'.$_SESSION["a"][0].'"><br>';
                                      $_SESSION["a"][1]="a".rand(1,100);
                                echo '<input name="'.$_SESSION["a"][1].'"><br>';
                                      $_SESSION["a"][2]="a".rand(1,100);
                                echo '<input name="'.$_SESSION["a"][2].'"><br>';
                                      $_SESSION["a"][3]="a".rand(1,100);
                                echo '<input type="submit" name="'.$_SESSION["a"][3].'" value="submit"><br>';
                                echo '</form>';
                }               
        ?>
        

        【讨论】:

          【解决方案7】:

          我们可以在不重定向的情况下停止它,最好的方式是像这样使用 PHP $_SESSION:

          if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_SESSION['form_submit']) )
          { 
              extract($_POST);
              $sql=""INSERT INTO table (username, useremail, email) VALUES('$username','$useremail','$email')";
              $_SESSION['form_submit']='true'; 
          } 
          else
           {
              $_SESSION['form_submit']='NULL';
           }
          

          【讨论】:

            【解决方案8】:

            快速的方法是将页面重定向到当前位置:

            if (isset($_POST['submit'])) 
            {
            //do somthing
            header("Location: $current_url");
            }
            

            【讨论】:

              【解决方案9】:

              我也遇到了同样的问题。试图添加一些数据,每次刷新页面时都会再次添加。发生这种情况是因为页面未加载。为此,您需要添加:

              &lt;?php ob_start();?&gt; 在你的头文件中,然后在你正在处理的当前文件中包含头文件。之后使用下面的代码

                  if (isset($_POST['submit'])) 
              {
                $user= $_POST['username'];
                $email = $_POST['useremail'];
                $pass= $_POST['password']; 
              
                mysql_query("INSERT INTO table (username, useremail, email) VALUES(`$username','$useremail','$email')");
              
              //user it before if statement
              header("location: onthesamepage/oranyotherpage.php");
              }
              

              【讨论】:

                【解决方案10】:

                index.php

                面临相同问题的解决方案 |如果在值中不使用反引号时使用 () 外部查询,请使用 ' ' 单引号。

                <?php 
                  include 'connection.php';
                
                 if(isset($_POST['submit'])){
                     $username = $_POST['username'];
                     $password = $_POST['password'];
                
                    $query = "INSERT INTO`login`(`username`,`password`)
                                        VALUES('$username','$password')";  
                    $insert_data= mysqli_query( $connection,$query);
                     }
                   ?>
                

                表格

                <form method="post">
                      <br><br>
                    <div class="card">
                        <div class="card-header bg-dark">
                            <h1 class="text-white text-center">Insert Opration</h1>
                            <h2><a href="display.php">Data</a> </h2>
                        </div>
                          <label for="username">Username</label>
                          <input type="text" name="username" class="form-control"><br>
                
                          <label for="password">Password</label>
                          <input type="password" name="password" class="form-control"><br>
                
                          <button class="btn btn-success" name="submit" type="submit">Submit</button> 
                    </div>
                    </form>
                

                【讨论】:

                  【解决方案11】:
                  if($_POST(submit)
                  {
                   //database insertion query
                   // if successful insertion
                      {
                  echo"<script language='javascript'>alert('successfully inserted')</script>";
                  echo"<script>document.location='your_page.php';</script>;
                      }
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-12-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多