2012-06-26 2 views
0

Я не знаю, получил ли я это правильно, но что я пытаюсь сделать, так это то, что пользователь вводит термин или несколько терминов в текстовом поле и после пользователь отправляет текстовое поле, он должен отображать любые результаты, содержащие этот термин. Но я не могу заставить его работать, поэтому мой вопрос заключается в том, что я нахожусь на правильном пути, когда дело доходит до использования mysqli, чтобы иметь возможность извлекать термины из базы данных при вводе в текстовое поле? Я не уверен, правильный ли запрос с аналогичным заявлением, и если он зацикливается на каждом члене, но если кто-то может помочь, он будет очень благодарен :)Как использовать mysqli для извлечения терминов из базы данных

Я также получаю предупреждение, которое необходимо для фиксировано:

Предупреждение: mysqli_stmt :: bind_param() [mysqli-stmt.bind-param]: Число переменных не соответствует количеству параметров в подготовленном операторе в строке 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(); 
}   
      ?> 
+0

Вы пытались повторить свой SQL-запрос, чтобы узнать, как он выглядит? – andrewsi

+0

Когда я эхо-запрос, он отображает это все время: 'SELECT q.QuestionContent FROM Question q WHERE q.QuestionContent LIKE? ИЛИ q.QuestionContent LIKE? GROUP BY q.QuestionId, q.SessionId ORDER BY + IF (q.QuestionContent LIKE?, 1,0) DESC'. Я не думаю, что это правильно, потому что давайте скажем, что вы входите всего в 1 член, это должен быть этот 'SELECT q.QuestionContent FROM Question q WHERE q.QuestionContent LIKE? GROUP BY q.QuestionId, q.SessionId ORDER BY + IF (q.QuestionContent LIKE?, 1,0) DESC', но если вы затем входите в 3 члена, например, это должно измениться на это ... – user1394925

+0

'SELECT q.QuestionContent FROM Question q WHERE q.QuestionContent LIKE? ИЛИ q.QuestionContent LIKE? ИЛИ q.QuestionContent LIKE? GROUP BY q.QuestionId, q.SessionId ORDER BY + IF (q.QuestionContent LIKE ?, 1,0) DESC' Оператор OR должен самостоятельно меняться в зависимости от количества терминов, введенных в текстовое поле – user1394925

ответ

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)); 
+0

В чате Я отправил проблему, которая отображается на вашем коде – user1394925

+0

Я также обновил код, чтобы вы могли видеть, что ваш код выглядит в моем коде. – user1394925

+0

Попробуйте это - строки, которые задают переменные массива в цикле, фактически преобразуют их в строки. – andrewsi

Смежные вопросы