【问题标题】:How to avoid Query doubles INSERT into database?如何避免查询加倍 INSERT 到数据库中?
【发布时间】:2015-12-13 18:52:35
【问题描述】:

问题:
我制作了一个简单的表单,它使用 PHP 通过 INSERT 查询将信息传递到我的数据库。但是,每次我运行它时,它都会尝试将信息输入两次。我怎样才能避免这种情况?

说明:
我首先将答案插入到我的答案表中,将 AnswerID 保存为变量。然后使用我的问题表进行保存,最后我使用包含 ID 的两个已保存变量到我的 question_answers 表中。

我的代码:

if (isset($_POST['textinput1']) && !empty($_POST['textinput1'])) {

      $text1 = mysqli_real_escape_string($conn, $_POST['textinput1']);
      $text2 = mysqli_real_escape_string($conn, $_POST['textinput2']);
      $q_text = mysqli_real_escape_string($conn, $_POST['textarea']);

      $stmt = $conn->prepare("INSERT INTO answers (Answer1Text, Answer2Text) VALUES (?, ?)");
      $stmt->bind_param('ss', $text1, $text2);
      $stmt->execute();
      $answerid = $stmt->insert_id;
      $stmt = $conn->prepare("INSERT INTO question (QuestionText) VALUES (?)");
      $stmt->bind_param('s', $q_text);
      $stmt->execute();
      $questionid = $stmt->insert_id;
      if ($stmt->execute()) {
        $stmt = $conn->prepare("INSERT INTO question_answers (AnswerID, QuestionID) VALUES (?, ?)");
        $stmt->bind_param('ss', $answerid, $questionid);
        $stmt->execute();
        echo "<h2>Dit spørgsmål er nu lagt op på siden!</h2>";
        echo "<h3>Tusinde tak for din interesse for SMIL - Skodfri Århus.</h3>";
      }
      else
      {
        echo "ERROR: Could not able to execute . " . mysqli_error($conn);
      }
    }

    // close connection
    mysqli_close($conn);
    ?>

我的重要性表:
问题: QuestionID(PK)、QuestionText
答案: AnswerID(PK)、 Answer1Text, Answer2Text
question_answers: QuestionAnswerID(PK), QuestionID(FK), AnswerID(FK)

附言。我不喜欢使用复合唯一约束作为解决方案。

还有一个附带问题,$stmt-&gt;insert_id 变量应该是mysqli_real_escape_string吗?

【问题讨论】:

  • 是否所有的表都插入了两次数据?
  • 您运行$stmt-&gt;execute() 两次。使用准备好的语句,您无需转义。
  • 感谢您的回答,确实是这个问题。啊,这是否意味着这段代码对 SQL 注入是安全的?

标签: php mysql database


【解决方案1】:

你的问题是你已经执行了第二个查询两次

if (isset($_POST['textinput1']) && !empty($_POST['textinput1'])) {

      $text1 = mysqli_real_escape_string($conn, $_POST['textinput1']);
      $text2 = mysqli_real_escape_string($conn, $_POST['textinput2']);
      $q_text = mysqli_real_escape_string($conn, $_POST['textarea']);

      $stmt = $conn->prepare("INSERT INTO answers (Answer1Text, Answer2Text) VALUES (?, ?)");
      $stmt->bind_param('ss', $text1, $text2);
      $stmt->execute();
      $answerid = $stmt->insert_id;
      $stmt = $conn->prepare("INSERT INTO question (QuestionText) VALUES (?)");
      $stmt->bind_param('s', $q_text);
      $stmt->execute();
      $questionid = $stmt->insert_id;

      // THIS IS THE SECOND EXECUTION OF QUERY 2
      if ($stmt->execute()) {
        $stmt = $conn->prepare("INSERT INTO question_answers (AnswerID, QuestionID) VALUES (?, ?)");
        $stmt->bind_param('ss', $answerid, $questionid);
        $stmt->execute();
        echo "<h2>Dit spørgsmål er nu lagt op på siden!</h2>";
        echo "<h3>Tusinde tak for din interesse for SMIL - Skodfri Århus.</h3>";
      }
      else
      {
        echo "ERROR: Could not able to execute . " . mysqli_error($conn);
      }
    }

    // close connection
    mysqli_close($conn);
    ?>

试试这个作为 IF 测试

    //if ($stmt->execute()) {
    if ( isset($answerid,$questionid) ) {

【讨论】:

  • 通过将我的查询定义为 '$stmt1' 和 '$stmt2' 然后作为安全,使用 'if ( isset($answerid,$questionid) ) {' 有助于解决问题。非常感谢所有的答案。
【解决方案2】:

if ($stmt-&gt;execute()) {

这会再次运行您的一个语句。如果您以后需要它,您应该将返回值分配给一个变量。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2017-09-08
    相关资源
    最近更新 更多