2

私が抱えている問題は、mysqliで次のような警告が表示されることです。

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in ...on line 89

警告を取り除くにはどうすればよいですか?

$questionquery = "
SELECT q.QuestionId, q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(an.Answer ORDER BY an.Answer SEPARATOR ' ') AS Answer, r.ReplyType, 
       q.QuestionMarks 
  FROM Answer an 
  INNER JOIN Question q ON q.AnswerId = an.AnswerId
  JOIN Reply r ON q.ReplyId = r.ReplyId 
  JOIN Option_Table o ON q.OptionId = o.OptionId 

                 WHERE ";

$i=0;
foreach ($terms as $each) {     
    $i++;         

    if ($i == 1){         
        $questionquery .= "q.QuestionContent LIKE ? ";     
        } else {         
            $questionquery .= "OR q.QuestionContent LIKE ? ";    
             } 
             }  

             $questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY "; $i = 0; foreach ($terms as $each) {     
                 $i++;      

    if ($i != 1)         
    $questionquery .= "+";     
    $questionquery .= "IF(q.QuestionContent LIKE ? ,1,0)"; 
    } 

    $questionquery .= " DESC "; 

    $stmt=$mysqli->prepare($questionquery);      
    $stmt->bind_param('s', $each = '%' . $each . '%');
    $stmt->execute(); 
    $stmt->bind_result($dbQuestionId,$dbQuestionContent,$dbOptionType,$dbNoofAnswers,$dbAnswer,$dbReplyType,$dbQuestionMarks); 
    $questionnum = $stmt->num_rows();

SQLの出力:

SELECT q.QuestionId, q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(an.Answer ORDER BY an.Answer SEPARATOR ' ') AS Answer, r.ReplyType, q.QuestionMarks 

FROM Answer an INNER JOIN Question q ON q.AnswerId = an.AnswerId JOIN Reply r ON q.ReplyId = r.ReplyId JOIN Option_Table o ON q.OptionId = o.OptionId 

WHERE q.QuestionContent LIKE ? 

GROUP BY q.QuestionId, q.SessionId 

ORDER BY IF(q.QuestionContent LIKE ? ,1,0) DESC 
4

1 に答える 1

1

MySQLiのパラメータバインディングメソッドをPDO(への配列を受け入れる)と混同しているようですexecute()。呼び出しbind_param()$each、パラメータをに渡さないでくださいexecute()

$stmt->bind_param('s', $each);
$stmt->execute();

LIKEワイルドカードでクエリを使用する場合は、次%のように、それらのワイルドカードをバインドされた変数の一部にする必要があることに注意してください。

$each = '%' . $each . '%';
于 2012-06-19T23:41:04.083 に答える