【问题标题】:SQLSTATE[42000]: Syntax error or access violation: 1172 Result consisted of more than one rowSQLSTATE [42000]:语法错误或访问冲突:1172 结果包含多于一行
【发布时间】:2026-02-22 22:35:01
【问题描述】:

当我尝试在一个查询中插入多行时,出现此错误:

SQLSTATE[42000]:语法错误或访问冲突:1172 结果 由多行组成

这是我使用的代码:

  public function submitAnswers($q)
   {
    try
      {
        $sql = 'INSERT INTO `result_answers` (`resultID`, `questionID`, `answerID`, `isTrue`,`textAnswer`) VALUES ';
        foreach($q as $question => $answer){
        if($answer[0] == 0){
        for($i = 1;$i < count($answer);$i++){
            $sql .= '((select max(id) from result r where r.studentID = :studentID), ' . $question . ', ' . $answer[$i] .', NULL, NULL),';}
        }elseif($answer[0] == 1){
          $sql .= '((select max(id) from result r where r.studentID = :studentID), ' . $question . ', NULL, ' . $answer[1] .', NULL),';
        }elseif($answer[0] == 2){
          $sql .= '((select max(id) from result r where r.studentID = :studentID), ' . $question . ', NULL, NULL, "' . $answer[1] .'"),';
        }
        }
          $query = rtrim($sql,',');
         $stmt = $this->connect()->prepare($query);
         $stmt->bindparam(":studentID",$_SESSION['student']->id);

         $stmt->execute();

         return true;
      }
    catch(PDOException $e)
      {
         echo $e->getMessage();
         return false;
      }
   }

当我直接在我的数据库中执行$query 输出时,行已成功插入,所以我认为出于某种原因 PDO 不允许插入多行。

【问题讨论】:

  • 这是一个 SQL 错误,而不是 PDO。这些值在select 列表中。像select max(id), $question . ', ' . $answer[$i] .', NULL, NULL from result r where r.studentID = :studentID 这样的东西。你的$question$answer[$i] 也应该被绑定。
  • 我在数据库上试过了,它可以工作,但是我如何用多行实现它我使用联合但我认为这不是性能的好选择@user3783243

标签: php mysql pdo


【解决方案1】:

我已经找出问题的原因。原来在我插入数据的表上有一个TRIGGER BEFORE INSERT,而在触发器里面是一个SELECT INTO语句,它返回了不止一行。

【讨论】: