我有一个我创建的搜索栏的问题,我没有错误,我知道我的查询是正确的,因为我的搜索栏曾经在旧的mysql代码中正常工作。但是因为我尝试将我的代码更改为mysqli,所以它还没有完成。无论用户在搜索栏中输入什么内容,无论搜索栏是否为空,它始终会显示“请在搜索栏中输入短语”。它也不显示搜索结果。所以我的问题是,为什么不显示搜索结果是否找到关键字?
以下是当前代码:
<?php
$questioncontent = (isset($_POST['questioncontent'])) ? $_POST['questioncontent'] : '';
$searchquestion = $questioncontent;
$terms = explode(" ", $searchquestion);
//Query for search bar
$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 one term entered in search bar then perform a LIKE statement to look up the term entered
if ($i == 1) {
$questionquery .= "q.QuestionContent LIKE ? ";
} else {
//If multiple terms then add an OR statement to check for multiple keywords
$questionquery .= "OR q.QuestionContent LIKE ? ";
}
}
//Order by terms entered in ascending order they have been entered
$questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY ";
$i = 0;
foreach ($terms as $each) {
$i++;
//if there are multiple terms, then for example there are 2 terms then display content which contains both terms first, then display content which contains only one of those terms
if ($i != 1)
$questionquery .= "+";
$questionquery .= "IF(q.QuestionContent LIKE ? ,1,0)";
}
$questionquery .= " DESC ";
//prepare query, bind the terms and execute query
$stmt = $mysqli->prepare($questionquery);
$stmt->bind_param('ss', $each = '%' . $each . '%', $each = '%' . $each . '%');
$stmt->execute();
$stmt->bind_result($dbQuestionId, $dbQuestionContent, $dbOptionType, $dbNoofAnswers, $dbAnswer, $dbReplyType, $dbQuestionMarks);
$questionnum = $stmt->num_rows();
//If search bar is empty and user submits the search bar, then below is the phrase it should display:
if (empty($questioncontent)) {
echo "Please enter in a phrase in the text box in able to search for a question";
}
//Below is the code if no results are found from the search:
else if ($questionnum == 0) {
echo "<p>Your Search: '$searchquestion'</p>";
echo "<p>Number of Questions Shown from the Search: <strong>$questionnum</strong></p>";
echo "<p>Sorry, No Questions were found from this Search</p>";
}
//Finally below is the code that displays the results of the search if search is successful:
else {
echo "<p>Your Search: '$searchquestion'</p>";
echo"<p>Number of Questions Shown from the Search: <strong>$questionnum</strong></p>";
$output = "";
$output .= "
<table border='1' id='resulttbl'>
<tr>
<th class='questionth'>Question</th>
</tr>
";
while ($stmt->fetch()) {
$output .= "
<tr>
<td class='questiontd'>{$dbQuestionContent['QuestionContent']}</td>
<td class='addtd'><button type='button' class='add' onclick=\"parent.addwindow('{$dbQuestionContent['QuestionContent']}');\">Add</button></td>
</tr>";
}
$output .= " </table>";
echo $output;
}
?>
以下是您自己测试的应用程序的链接。如果您在搜索栏中键入“AAA”,它应显示结果,但它会一直说明需要输入一个短语。如果你输入一些随机的东西,以便搜索不能找到结果,它仍然说明请输入一个短语。 Application
答案 0 :(得分:0)
我重写了一下你的代码,并切换到PDO以便更容易绑定。 试试这个
$searchquestion = $_GET['questioncontent'];
$terms = explode(" ", $searchquestion);
//Query for search bar
$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 ";
$where = array();
$bindings = array();
$orderby=array();
foreach($terms as $key=>$each)
{
$where[] = 'q.QuestionContent LIKE ? ';
$bindings[] = $each;
$orderby[] = ' IF(q.QuestionContent LIKE ? , 1, 0)';
}
$questionquery .= join(' OR ', $where);
$questionquery .= "GROUP BY q.QuestionId, q.SessionId ORDER BY " . join('+', $orderby) . ' DESC';
$stmt = $pdo->prepare($questionquery);
$sth->execute(array_merge($bindings, $bindings));
$results = $sth->fetchAll()