【问题标题】:Check to update and then insert multiple records at once in mysql?检查更新然后在mysql中一次插入多条记录?
【发布时间】:2026-01-27 22:10:01
【问题描述】:

我有 2 张与调查相关的表格。当用户回答每组问题然后点击提交按钮时,它会根据提交的表单循环每个答案,以便首先在数据库中检查,如果找到了 CustomerID 和 QuestionID,然后进行更新。如果未找到,请改为执行插入操作。

问题

  • 问题 ID (PK)
  • 问题文本

ANSWERS表格

  • 答案 ID (PK)
  • 客户 ID (FK)
  • 问题 ID (FK)
  • 答案文本

    <html>
    ....
    <form action="/db.php" method="POST">
     <?php echo $questiontext[1]; ?><input type="text" name="answer1" id="answer1">
     <?php echo $questiontext[2]; ?><input type="text" name="answer2" id="answer2">
     <?php echo $questiontext[3]; ?><input type="text" name="answer3" id="answer3">
     <?php echo $questiontext[4]; ?><input type="text" name="answer4" id="answer4">
     <?php echo $questiontext[5]; ?><input type="text" name="answer5" id="answer5">
     <?php echo $questiontext[6]; ?><input type="text" name="answer6" id="answer6">
    
     <input type="submit" name="submit" id="submit" value="Submit">
    </form>
    ...
    </html>
    

db.php

    <?php
    if(isset($_POST['submit'])) {
      $cusid = intval($_POST['CustomerID']);
      $answer1 = $db->real_escape_string($_POST['answer1']);
      $answer2 = $db->real_escape_string($_POST['answer2']);
      $answer3 = $db->real_escape_string($_POST['answer3']);
      $answer4 = $db->real_escape_string($_POST['answer4']);
      $answer5 = $db->real_escape_string($_POST['answer5']);
      $answer6 = $db->real_escape_string($_POST['answer6']);

      $sql = "INSERT INTO Answers (CustomerID, QuestionID, AnswerText) VALUES     
      ('".$cusid."','".$quesid."','".$answer."')";
      $res = $db->query($sql) or die ('Error: ' . mysqli_error($db));
    }
    ?>

我的问题是:

  1. 如果使用数组和SQL查询没有找到CustomerID和QuestionID,如何将每个答案(1-6)一个一个更新,然后插入数据库,如果找到,则更新?
  2. 如何引用 QuestionID 以便与 HTML 和 PHP 中的 AnswerText 相关联?

【问题讨论】:

  • 与您的问题无关,但您的代码易受 SQL 注入攻击。考虑一下如果有人将他们的答案设置为answer'); DROP TABLE Answers'
  • 感谢您指出这一点。使用 $db->real_escape_string 会更好吗?
  • 假设$db 类似于mysqli 的一个实例,是的。

标签: php sql database


【解决方案1】:

这只是你的一个想法。希望你能理解。确保用 $db 对象替换数据库驱动的函数。

if(isset($_POST['submit'])) {
    $sql = "SELECT QuestionID FROM Questions ORDER BY QuestionID ";
    $res = $db->query($sql);
    $qus = 1;
    while ($row = mysqli_fetch_array($res , MYSQLI_ASSOC)) {
    {
        $questionID = $row['QuestionID'] ;
        $answer = $db->real_escape_string($_POST['answer' . $qus ]);


        $sql = "SELECT AnswerID  FROM Answers WHERE CustomerID='$cusid' AND QuestionID='$questionID' ";
        $resAns = $db->query($sql);
        $num_rows = $resAns->num_rows; // This should be replace with your $db object record count obtaining method
        if($num_rows == 1)
        {
            $sql = "UPDATE Answers SET AnswerText = '$answer' WHERE CustomerID='$cusid' AND QuestionID='$questionID'  ";
            // Execute your update query
        }
        else
        {
            $sql = "INSERT INTO Answers (CustomerID, QuestionID, AnswerText) VALUES     
  ('".$cusid."','".$questionID."','".$answer."')";
            // Execute your insert statement
        }
        $qus ++;
    }
}

【讨论】:

  • 我有以下错误:mysqli_real_escape_string() 需要 2 个参数,1 给定 mysqli_fetch_array() 需要参数 1 是 mysqli_result,布尔值 顺便说一下,如何更新和只插入答案不为空。
  • 这取决于您使用的库。 1.mysql 2.mysqli 3.PDO
  • 不应该是这样的>> while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC)) {
  • 解决了!仅使用不同的变量来保留查询结果,使用 $result 保留 QuestionID(问题表)并使用 $res 更新/插入数据。其余的,你的代码是完美的!我的问题已经解决了。非常感谢。
【解决方案2】:

您可以先运行一个选择查询,然后查看从那里返回了多少行,如下所示

$check = mysql_query("SELECT * FROM Answers WHERE CustomerId = '$cusid' OR QuestionId =                '$quesid' LIMIT 1") or die(mysql_error());

  $num_rows = mysql_num_rows($check);
   if($num_rows == 1)
     {
          // value exists run the update
     }
     else
     { 
           // go ahead with insert query
     }

【讨论】:

  • 那么如何反复循环这个过程呢?还有我如何以及在哪里可以将 QuestionID 与 html 中的 AnswerText 链接,然后将其发送到 db.php?
【解决方案3】:

如果您在 CustomerID+QuestionID 上设置了唯一键,那么您只需执行 INSERT ... ON DUPLICATE KEY UPDATE ...

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

让数据库处理检查。

【讨论】: