#php #mysql #search
#php #mysql #Поиск
Вопрос:
Я хочу выполнить поиск по ключевому слову, например, по проблеме клиента. Однако каждый раз, когда он выполняет поиск, он извлекает каждую отдельную запись, а не ту, которая из их выпуска.
Я пытался не использовать for each, а просто выполнить простой like, но это тоже не сработало.
Это то, что передается.
<form id="" class="searchbar" action="searchAppt.php" method="get">
<input type="text" name="terms" size="40" class = "sbar" required value="Search by keyword" oninput="validity.valid||(value='');"
onblur="if (this.value == '') {
this.value = 'Enter keyword';
}"
onfocus="if (this.value == 'Enter keyword') {
this.value = '';
}"/>amp;nbsp;amp;nbsp;
<button type="submit" class = "btn">Search</button>
</form>
if (filter_has_var(INPUT_GET, "terms")) {
$terms_str = filter_input(INPUT_GET, 'terms', FILTER_SANITIZE_NUMBER_INT);
} else {
echo "There were no appointments found.";
include ('includes/footer.php');
exit;
//explode the search terms into an array
$terms = explode(" ", $terms_str);
$sql = "SELECT * FROM appointments WHERE 1";
foreach ($terms as $term) {
$sql .= " AND issue LIKE '%$term%' AND email = '". $_SESSION['email'] ."'
";
}
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<br /><br /><center><h1>Your Ticket(s)</h1><br />
<div class='table'>
<div class='tr'>
<div class='td'><b>Ticket #</b></div>
<div class='td'><b>First Name</b></div>
<div class='td'><b>Last Name</b></div>
<div class='td'><b>Phone #</b></div>
<div class='td'><b>Building</b></div>
<div class='td'><b>Room #</b></div>
<div class='td'><b>Issue</b></div>
<div class='td'><b>Appt. Start Time</b></div>
<div class='td'><b>Appt. End Time</b></div>
<div class='td'><b>Ticket Details</b></div>
</div>";
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<div class='tr'>
<div class='td'>".$row["id"]."</div>
<div class='td'>".$row["fname"]."</div>
<div class='td'>".$row["lname"]."</div>
<div class='td'>".$row["phonenum"]."</div>
<div class='td'>".$row["building"]."</div>
<div class='td'>".$row["room"]."</div>
<div class='td'>".$row["issue"]."</div>
<div class='td'>".$row["start_time"]."</div>
<div class='td'>".$row["end_time"]."</div>
<div class='td'><form action='ticketdetails.php' method='post'>
<input type='hidden' name='id' value='".$row["id"]."'>
<input type='submit' value='Ticket Details'></form>
</div>
</div>";
}
echo "</div>";
} else {
echo "<br /> <br />Your search <i>'$terms_str'</i> did not match any appointments";
Он отображает каждое отдельное назначение, а не те, у которых есть проблема, похожая на поиск по ключевому слову. Я чувствую, что я просто что-то упускаю из виду с помощью инструкции select. Любая помощь была бы высоко оценена.
Комментарии:
1. Примеры данных и ожидаемые результаты, пожалуйста.
2. Что передается в
$_GET['terms']
?3. Таким образом, в основном их проблемой может быть, например, «подключение к Wi-Fi». Если они вводят «wifi» и назначают какие-либо встречи с проблемами, подобными «wifi», я хочу, чтобы эти встречи отображались из базы данных.
4. @Nick только что добавил его в начало
5. 1. что такое $ terms_str? 2. неверен начальный код. для нескольких $ terms это приведет к созданию sql-запроса с большим количеством дубликатов И email = ‘». $_SESSION[’email’] .»‘ условия. Я бы предложил добавить фильтр AND email=… ПОСЛЕ цикла foreach.
Ответ №1:
Ваша проблема заключается в вашем вызове filter_input
. Вы указываете фильтр FILTER_SANITIZE_NUMBER_INT
, но передаете список слов, разделенных пробелом. В результате вывод filter_input
представляет собой пустую строку (поскольку с этим флагом из входных данных удаляется все, кроме /-
и цифр), и поэтому к вашему запросу не добавляются никакие условия. Вы, вероятно, захотите использовать FILTER_SANITIZE_STRING
вместо этого.
Комментарии:
1. Привет, Ник! Извините, я действительно забыл свои учетные данные для входа, но восстановил их сегодня. Я сделал именно то, что вы сказали, и это работает!! Спасибо. Я нажал на зеленую галочку и дал вам положительный результат, хотя он не будет отображаться из-за того, что моя учетная запись новая. Еще раз спасибо!