1

MYSQLIのクエリでLIKEステートメントに問題があります。LIKEステートメントに含まれる用語が見つからないようです。パラメータをLIKEステートメントにバインドしようとしていますが、私の質問は、mysqliでLIKEステートメントを正しく設定していないということです。

奇妙なことに、クエリを出力してSQLに挿入し、「?」を変更するだけです。'%AAB%'などの用語に対しては、用語AABを構成するレコードを表示するため、SQLでは正常に機能します。問題は、テキストボックスにAABと入力すると、レコードがまったく表示されないため、PHP、mysqliで機能しないことです。「申し訳ありませんが、検索から質問が見つかりませんでした」と表示され続けます。なぜこれなのか誰か知っていますか?

以下はコードです(私はmysqliを使用してdbに接続しました):

<form action="previousquestions.php" method="get">
<p>Search: <input type="text" name="questioncontent" value="<?php echo isset($_GET['questioncontent']) ? $_GET['questioncontent'] : ''; ?>" onchange="return trim(this)" /></p>
      <p><input id="searchquestion" name="searchQuestion" type="submit" value="Search" /></p>
      </form>


<?php 

if (isset($_GET['searchQuestion'])) {

$searchquestion = $_GET['questioncontent'];
$terms = explode(" ", $searchquestion);

$questionquery = "SELECT q.QuestionContent FROM Question q WHERE ";

$i=0;

$whereArray = array();
$orderByArray = array();
$orderBySQL = "";
$paramString = "";

//loop through each term


 foreach ($terms as $each) {
    $i++;
    $whereArray[] = $each;
    $orderByArray[] = $each; 
    $paramString .= 'ss';
    //if only 1 term entered then perform this LIKE statement
    if ($i == 1){
        $questionquery .= "q.QuestionContent LIKE CONCAT('%', ?, '%') ";
    } else {
        //If more than 1 term then add an OR statement
        $questionquery .= "OR q.QuestionContent LIKE CONCAT('%', ?, '%') ";
        $orderBySQL .= ",";
    }

    $orderBySQL .= "IF(q.QuestionContent LIKE CONCAT('%', ?, '%') ,1,0)";

}  

$questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY " . $orderBySQL;
$questionquery .= " DESC ";
$stmt=$mysqli->prepare($questionquery)or die($mysqli->error); 

function makeValuesReferenced(&$arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
        $refs[$key] = &$arr[$key]; 
    return $refs; 

}

$ref = array_merge((array)$paramString, $whereArray, $orderByArray);
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($ref));


    $stmt->execute();
    $stmt->bind_result($dbQuestionContent); 
    $questionnum = $stmt->num_rows();

        if($questionnum ==0){
    echo "<p>Sorry, No Questions were found from this Search</p>";
    }
    else{

      $output = "";
        while ($stmt->fetch()) {
$output .= "
      <tr>
      <td class='questiontd'>$dbQuestionContent</td>
      </tr>";
        }
        $output .= "        </table>";

        echo $output;

  }


?> 
4

1 に答える 1

0

mysqliが%キャラクターをエスケープしているか、クライアント/サーバー通信の一部として同等のことが起こっているようです。これを試して:

foreach ($terms as $each) {
    $i++;
    $whereArray[] = $each;
    $orderByArray[] = $each; 
    $paramString .= 'ss';
    //if only 1 term entered then perform this LIKE statement
    if ($i == 1){
        $questionquery .= "q.QuestionContent LIKE CONCAT('%', ?, '%') ";
    } else {
        //If more than 1 term then add an OR statement
        $questionquery .= "OR q.QuestionContent LIKE CONCAT('%', ?, '%') ";
        $orderBySQL .= ",";
    }
    $orderBySQL .= "IF(q.QuestionContent LIKE CONCAT('%', ?, '%') ,1,0)"; 
}

あなたはあなたのORDER BY条項が全く役に立たないことをしていることに気づいていますよね?

于 2012-06-28T17:22:11.457 に答える