0

古いmysqlコードでは、以下のクエリが完全に機能しました。

$questioncontent = (isset($_GET['questioncontent'])) ? $_GET['questioncontent'] : '';

$searchquestion = $questioncontent;
$terms = explode(" ", $searchquestion);

$questionquery = "
SELECT q.QuestionId, q.QuestionContent, o.OptionType, an.Answer, r.ReplyType, 
  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 ";

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

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

                 $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 `%$each%` ,1,0)"; 
        } 

        $questionquery .= " DESC ";

しかし、人々が PDO または mysqli を使用するように言っている古い mysql が消えつつあるので (私が現在持っている php のバージョンのために PDO を使用できません)、コードを mysqli に変更しようとしましたが、これは私に問題を引き起こしています. 以下のコードでは、bind_params コマンドを省略しています。私の質問は、以下のクエリでパラメーターをバインドするにはどうすればよいかということです。$eachユーザーは複数の用語を入力でき、それぞれ$eachが用語として分類されるため、複数をバインドできる必要があります。

以下は、同じクエリの現在の mysqli コードです。

     $questioncontent = (isset($_GET['questioncontent'])) ? $_GET['questioncontent'] : '';

        $searchquestion = $questioncontent;
        $terms = explode(" ", $searchquestion);

        $questionquery = "
        SELECT q.QuestionId, q.QuestionContent, o.OptionType, an.Answer, r.ReplyType, 
          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 ";

    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->execute();
            $stmt->bind_result($dbQuestionId,$dbQuestionContent,$dbOptionType,$dbAnswer,$dbReplyType); 
            $questionnum = $stmt->num_rows();
4

1 に答える 1

4

を使用したcall_user_func_arrayの使用について説明しているこのSO 投稿をご覧ください。bind_param()

mysqli_stmt_bind_paramのPHP ドキュメントから、次のように述べています...

ノート:

mysqli_stmt_bind_param() を call_user_func_array() と組み合わせて使用​​する場合は注意が必要です。mysqli_stmt_bind_param() はパラメーターを参照渡しする必要があるのに対し、call_user_func_array() は参照または値を表すことができる変数のリストをパラメーターとして受け入れることができることに注意してください。

あなたはこのようなものを使いたいでしょう

call_user_func_array(array($stmt, 'bind_param'), $terms);

?SQL 文字列に正しい文字数が表示されるようにするのは、ユーザー次第です$stmt

[編集]

これが実際の例です

// user entered search strings
$user_terms = array("a", "b", "c");

// append your wildcard "%" to all elements. you must use "&" reference on &$value
foreach ($user_terms as &$value) {
    $value = '%'.$value.'%';
}

$types = "";
for($i = 0; $i<sizeof($user_terms); $i++) {
    $types .= "s";
}

$terms = array_merge( array($types), $user_terms);

// the array $terms now contains: { "sss", "%a%", "%b%", "%c%" }

$sql = "SELECT ... ?,?,?"    // edit your sql here

$stmt = $mysqli->prepare($sql)

call_user_func_array(array($stmt, 'bind_param'), $terms);
于 2012-06-22T08:34:53.183 に答える