0

これが正しいかどうかはわかりませんが、ユーザーがテキストボックスに用語または複数の用語を入力し、ユーザーがテキストボックスを送信した後、結果が表示されるはずです。という用語が含まれています。しかし、私はそれを機能させることができないので、私の質問は、テキストボックスに入力されたときにデータベースから用語を取得できるように mysqli を使用することになると、私は正しい軌道に乗っているのでしょうか? likeステートメントでクエリが正しいかどうか、各用語をループしているかどうかはわかりませんが、誰かが助けてくれれば大歓迎です:)

警告も表示されますが、これは修正が必要です:

警告: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables does not match number of parameters in prepare statement in ... 84 行目。これを修正するにはどうすればよいですか?

以下は、コードの mysqli 側です。

    <?php

        $username="xxx";
        $password="xxx";
        $database="mobile_app";

          $mysqli = new mysqli("localhost", $username, $password, $database);

          /* check connection */
          if (mysqli_connect_errno()) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            die();
          }

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

        ?>

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

        <?php 

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

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


        //loop through each term
        foreach ($terms as &$each) {
            $each = '%'.$each.'%';

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

$i=0;

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

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

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

    $whereArray = "%" . $each . "%";
    $orderByArray = $each;

    $paramString = "ss";
}  



$questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY " . $orderBySQL; 
$stmt=$mysqli->prepare($questionquery)or die($mysqli->error);;  
$stmt->bind_param($paramString, array_merge($whereArray, $orderByArray));
    $stmt->execute();
    $stmt->bind_result($dbQuestionContent); 
    $questionnum = $stmt->num_rows();
}           
            ?>
4

1 に答える 1

0

これはあなたが望むことのほとんどを行うはずです-私はそれをテストしていないので、タイプミスがあるかもしれません; これらの修正は、読者の演習として残しておきます。

$terms = array(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++;
    //if only 1 term entered then perform this LIKE statement
    if ($i == 1){
        $questionquery .= "q.QuestionContent LIKE ? ";
    } else {
        //If more than 1 term then add an OR statement
        $questionquery .= "OR q.QuestionContent LIKE ? ";
        $orderBySQL .= ",";
    }

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

    $whereArray[] = "%" . $each . "%";
    $orderByArray[] = $each;

    $paramString .= "ss";
}  

$questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY " . $orderBySQL; 
$stmt=$mysqli->prepare($questionquery)or die($mysqli->error); ;  
$stmt->bind_param($paramString, array_merge($whereArray, $orderByArray));
于 2012-06-26T15:14:50.487 に答える