Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何避免向数据库中插入双重查询?_Php_Mysql_Database - Fatal编程技术网

Php 如何避免向数据库中插入双重查询?

Php 如何避免向数据库中插入双重查询?,php,mysql,database,Php,Mysql,Database,问题: 我制作了一个简单的表单,它使用PHP通过插入查询将信息传递给我的数据库。但是,每次我运行它时,它都会尝试将信息放入两次。我怎样才能避免这种情况 说明: 我首先将答案插入我的答案表,并将答案ID保存为变量。然后用我的问题表保存,最后我将包含ID的两个保存的变量用在我的问题答案表中 我的代码: if (isset($_POST['textinput1']) && !empty($_POST['textinput1'])) { $text1 = mysqli_re

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

说明:
我首先将答案插入我的答案表,并将答案ID保存为变量。然后用我的问题表保存,最后我将包含ID的两个保存的变量用在我的问题答案表中

我的代码:

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);
    ?>
if(设置($\u POST['textinput1'])和&!空($\u POST['textinput1'])){
$text1=mysqli\u real\u escape\u字符串($conn,$\u POST['textinput1']);
$text2=mysqli\u real\u escape\u字符串($conn,$\u POST['textinput2']);
$q_text=mysqli_real_escape_字符串($conn,$\u POST['textarea']);
$stmt=$conn->prepare(“插入答案(Answer1Text,Answer2Text)值(?,)”;
$stmt->bind_参数('ss',$text1,$text2);
$stmt->execute();
$answerid=$stmt->insert\u id;
$stmt=$conn->prepare(“插入问题(问题文本)值(?)”;
$stmt->bind_参数('s',$q_text);
$stmt->execute();
$questionid=$stmt->insert\u id;
如果($stmt->execute()){
$stmt=$conn->prepare(“在问题中插入答案(AnswerID,QuestionID)值(?,)”;
$stmt->bind_参数('ss',$answerid,$questionid);
$stmt->execute();
回音“这是你的工作!”;
echo“Tusinde-tak表示对SMIL-SkodfriÅrhus的兴趣。”;
}
其他的
{
echo“错误:无法执行。”.mysqli_错误($conn);
}
}
//密切联系
mysqli_close($conn);
?>
我的重要表格:
问题:问题ID(PK),问题文本
答案:应答器ID(主键)、应答器1文本、应答器2文本
问题\u答案:问题回答者ID(PK)、问题ID(FK)、回答者ID(FK)

另外,我不喜欢使用复合唯一约束作为解决方案


另一个附带问题是,
$stmt->insert\u id
变量是否应该是
mysqli\u real\u escape\u string

您的问题是第二个查询执行了两次

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 (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($stmt->execute()){

这会再次运行一条语句。如果以后需要某个变量,则应将返回值赋给该变量。

if($stmt->execute()){


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

所有表都插入了两次数据吗?您可以运行
$stmt->execute()
两次。对于准备好的语句,您不需要转义。感谢您的回答,这确实是问题所在。啊,这是否意味着此代码可以安全地防止SQL注入?是否所有表都插入了两次数据?您运行
$stmt->execute()
两次。对于准备好的语句,您不需要转义。感谢您的回答,这确实是个问题。啊,这是否意味着这段代码可以安全地抵抗SQL注入呢?通过将我的查询定义为“$stmt1”和“$stmt2”,然后定义为安全,使用“if”(isset($answerid,$questionid)){帮助解决了问题。非常感谢您提供的所有答案。通过将我的查询定义为“$stmt1”和“$stmt2”,然后将其定义为安全性,使用“if(isset($answerid,$questionid)){”帮助解决了问题。非常感谢您提供的所有答案。