【问题标题】:MySQL Insert occurs twice on one submitMySQL 插入在一次提交时发生两次
【发布时间】:2016-06-29 00:53:37
【问题描述】:

我有这个 PHP 文件,它处理用户使用 mysql 注册的输入...我有一个问题,使用户输入被输入两次... 所以,这只是注册表单中的一个输入.下面是我的注册表单的大约一半(最有用的部分)...

  if ($_SERVER["REQUEST_METHOD"] == "POST") {

    require("db-settings.php");

    // Security

    if (empty($_POST['name'])) {
      echo "Sorry, fullname input was empty, please retry if you like.";
      die();
    } else {
      $fullname = $_POST['name'];
    }
    if (empty($_POST['email'])) {
      echo "Sorry, email input was emty, please retry if you like.";
      die();
    } else { 
      $email = $_POST['email'];
    }
    if (empty($_POST['password'])) {
      echo "Sorry, password was empty, please retry if you like.";
      die();
    } else {
      $password = $_POST['password'];

      // If password variable is success to set, let's encrypt it now!
      $password = password_hash($password, PASSWORD_DEFAULT)."\n";
    }

  // Log users IP and store in variable
    $ip = $_SERVER["REMOTE_ADDR"];

  // Create connection
  $conn = new mysqli($servername, $username, $db_password, $dbname);
  // Check connection
  if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
  }

  $sql = "INSERT INTO `table-ex` (fullname, email, password, ip) VALUES ('$fullname', '$email', '$password', '$ip')";
  $stmt = $conn->prepare($sql);
  //$stmt->bind_param('sss', $fullname, $email, $password, $ip);
  $stmt->execute();

  if ($conn->query($sql) === TRUE) {
      echo "New user was created successfully, please wait for activation...";
  } else {
    echo "Error: " . $sql . "<br>" . $conn->error;
  }

  $conn->close();

所以,这里有这一切。我还将在下面的html代码中给出整个表单部分...

  <form action="signup.php" method="post">
    <h1>Sign up</h1><br/>

    <span class="input"></span>
  <input type="text" name="name" placeholder="Full name" title="Format: Xx[space]Xx (e.g. John Doe)" autofocus autocomplete="off" required pattern="^\w+\s\w+$" />
    <span class="input"></span>
    <input type="email" name="email" placeholder="Email address" required />
    <span id="passwordMeter"></span>
    <input type="password" name="password" id="password" placeholder="Password" title="Password min 10 characters. At least one UPPERCASE and one lowercase letter" required pattern="(?=^.{10,}$)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$"/>

    <button type="submit" value="Sign Up" title="Submit form" class="icon-arrow-right"><span>Sign up</span></button>
  </form>

所以,代码中一定有一些东西使它输入了两次......另外,我如何重置 id 号码?因为每次我创建一个新用户时,都会发生这种情况(每次都是),然后我只是删除用户,它仍然算作他们仍然存在。

【问题讨论】:

  • 您正在执行两次查询。
  • 它在哪里说的?
  • 第一个:$stmt-&gt;execute();,然后:$conn-&gt;query($sql)
  • 是因为你查询了两次,我已经添加了如何做到这一点的答案,以及如何照顾id。

标签: php html mysql


【解决方案1】:

因为这条线。您无需添加 if else 语句。

  if ($conn->query($sql) === TRUE) {
          echo "New user was created successfully, please wait for activation...";
      }

只需这样做-

    $sql = "INSERT INTO `table-ex` (fullname, email, password, ip) VALUES ('$fullname', '$email', '$password', '$ip')";
  $stmt = $conn->prepare($sql);
  //$stmt->bind_param('sss', $fullname, $email, $password, $ip);
//Set the variables here for $fullname, $email, $password and $ip
 if($stmt->execute())

 {
      echo "New user was created successfully, please wait for activation...";
} 
  else { echo "There was a problem";}

  $stmt->close();
  $conn->close();

更新

对于 id 部分,我假设您使用的是auto increment,但我建议您手动插入它们而不是依赖它。我建议您使用唯一的密钥派生函数并对它们进行编码(如果您希望它们是纯文本并将它们用作 ID)。

如果您想跟踪其中有多少条目,您可以随时使用mysqli_num_rows() 计算行数。

【讨论】:

    【解决方案2】:

    您同时使用了execute() 和query(),因此执行了两次。

    首先,它在$stmt-&gt;execute(); 处插入了 1 行。然后它在$conn-&gt;query($sql) 处插入另一行。

    $stmt->execute();
    
    if ($conn->query($sql) === TRUE) {
        echo "New user was created successfully, please wait for activation...";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    

    你应该只$stmt-&gt;execute();:

    if ($stmt->execute()) { 
        echo "New user was created successfully, please wait for activation...";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    

    注意:

    更好的做法是坚持使用准备好的语句并使用execute() 来提高安全性,而不是使用$conn-&gt;query($sql)。有关差异的更多信息,请访问PDO's query vs execute。

    【讨论】:

    • 事实上......我不认为这与你们正在谈论的部分有关。不过,当我注释掉这部分时 > $stmt->execute();然后它工作并且只提交了一次......
    • @JohnDoe 您可以使用if ($stmt-&gt;execute()) { 或if ($conn-&gt;query($sql) === TRUE) {,答案的想法是您应该只使用其中之一,而不是两者都使用
    • @JohnDoe 此外,您应该坚持使用execute() 以获得最大的安全性,更多信息请访问stackoverflow.com/questions/4700623/pdos-query-vs-execute。
    【解决方案3】:
     if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
        require("db-settings.php");
    
        // Security
    
        if (empty($_POST['name'])) {
          echo "Sorry, fullname input was empty, please retry if you like.";
          die();
        } else {
          $fullname = $_POST['name'];
        }
        if (empty($_POST['email'])) {
          echo "Sorry, email input was emty, please retry if you like.";
          die();
        } else { 
          $email = $_POST['email'];
        }
        if (empty($_POST['password'])) {
          echo "Sorry, password was empty, please retry if you like.";
          die();
        } else {
          $password = $_POST['password'];
    
          // If password variable is success to set, let's encrypt it now!
          $password = password_hash($password, PASSWORD_DEFAULT)."\n";
        }
    
      // Log users IP and store in variable
        $ip = $_SERVER["REMOTE_ADDR"];
    
      // Create connection
      $conn = new mysqli($servername, $username, $db_password, $dbname);
      // Check connection
      if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
      }
    
      $sql = "INSERT INTO `table-ex` (fullname, email, password, ip) VALUES ('$fullname', '$email', '$password', '$ip')";
      $stmt = $conn->prepare($sql);
      //$stmt->bind_param('sss', $fullname, $email, $password, $ip);
    
    
      if ($stmt->execute()) {
          echo "New user was created successfully, please wait for activation...";
      } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
      }
      $stmt->close();
      $conn->close();
    

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多