Я использую следующий код для поиска в созданной таблице и фильтрации данных. Моя проблема в том, что когда я ищу, скажем, 1, он ищет и фильтрует не только 1, но также данные, содержащие 1, такие как 11, 21, etc..
Как я могу заставить его искать и фильтровать точные данные, которые я ввожу?
<?php
if (isset($_POST['search']))
{
$valueToSearch = $_POST['valueToSearch'];
// search in all table columns
// using concat mysql function
$query = "SELECT * FROM `tbstats` WHERE CONCAT(`date`, `mode`, `svar`, `sdev`) LIKE '%".$valueToSearch."%'";
$search_result = filterTable($query);
}
else {
$query = "SELECT * FROM `tbstats`";
$search_result = filterTable($query);
}
function filterTable($query)
{
$connect = mysqli_connect("localhost", "root", "", "dbstats");
$filter_Result = mysqli_query($connect, $query);
return $filter_Result;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Stats</title>
<style>
table,tr,th,td
{
border: 1px solid black;
}
</style>
</head>
<body>
<form action = "stats_filter.php" method = "post">
<input type = "text" name = "valueToSearch" placeholder = "Value To Search"><br><br>
<input type = "submit" name = "search" value = "Filter"><br><br>
<table>
<tr>
<th>Date</th>
<th>Mode</th>
<th>Svar</th>
<th>Sdev</th>
</tr>
<?php while($row = mysqli_fetch_array($search_result)):?>
<tr>
<td><?php echo $row['date'];?></td>
<td><?php echo $row['mode'];?></td>
<td><?php echo $row['svar'];?></td>
<td><?php echo $row['sdev'];?></td>
</tr>
<?php endwhile;?>
</table>
</form>
</body>
</html>






Когда вы выполняете LIKE '%".$valueToSearch."%', вы ищите значение, содержащее %value%.
Если вы хотите найти значение, которое начинается с вашего valueToSearch, используйте LIKE '".$valueToSearch."%', для значения, которое заканчивается вашим valueToSearch, используйте LIKE '%".$valueToSearch."', а для точного значения используйте = '".$valueToSearch."'.
Так что в вашем случае просто замените LIKE '%".$valueToSearch."%' на = '".$valueToSearch."'
Редактировать :
В вашем случае вы используете CONCAT, поэтому я думаю, вы хотите найти точное значение в одном из ваших полей, верно?
Если да, попробуйте заменить:
$query = "SELECT *
FROM `tbstats`
WHERE CONCAT(`date`, `mode`, `svar`, `sdev`) LIKE '%".$valueToSearch."%'";
от
$query = "SELECT *
FROM `tbstats`
WHERE `date` = '".$valueToSearch."'
OR `mode` = '".$valueToSearch."'
OR `svar` = '".$valueToSearch."'
OR `sdev` = '".$valueToSearch."'";
Таким образом, вы вернете данные только в том случае, если ваше точное значение searchValue присутствует в одном или четырех полях.
хорошо, я сделал то, что вы сказали, например, $query = "SELECT * FROM tbstats` WHERE CONCAT (date, mode, svar, sdev) LIKE '". $ valueToSearch."'; `, но теперь он не показывает никаких результатов.
@Jason Я внес правку, потому что комментарий Филиппа был правильным: вы сделали concat, чтобы искать термин внутри большой строки ... поэтому он ничего не возвращает. Если вы хотите, чтобы присутствовал точный термин, я думаю, вам следует создать условие WHERE, в котором вы проверяете каждое поле на значение.
Спасибо, Микаэль, у меня возникли ошибки, я попробовал решение от Филиппа.
Да, я забыл один " в конце! Я до сих пор получаю то же самое, так что мой ответ по-прежнему хорош, но он сначала видит "concat", так что для него хороший ответ!
Я почти закончил писать свой ответ после моего комментария, когда я увидел, что вы обновили свой вопрос, и подумал, что было бы безумием выбросить мои записи ... тем не менее - дал вам положительный ответ за ваш хороший ответ!
@Jason Я очень надеюсь, что вы заметили мой комментарий об экранировании и подготовленном операторе - ваше решение широко открыто для инъекций sql!
@Philipp np, вы сначала увидели проблему concat :)
Спасибо, Филипп, внесу необходимые изменения.
В настоящее время вы объединяете все свои столбцы в одну строку, а затем ищете вхождение вашей строки поиска в любом месте этой объединенной строки.
На самом деле вы можете захотеть точно сопоставить каждый столбец с вашей строкой поиска и вернуть каждую строку, которая имеет точное совпадение в любом столбце. Для точного совпадения не используйте LIKE. Простой = - это то, что вам нужно. Чтобы объединить их, просто используйте оператор OR.
$query = "SELECT * FROM tbstats WHERE
date = '" . $valueToSearch . "' OR
mode = '" . $valueToSearch . "' OR
svar = '" . $valueToSearch . "' OR
sdev = '" . $valueToSearch . "'";
Вдобавок к этому вам действительно следует избегать ввода или, что еще лучше, использовать подготовленные операторы.
Не уверен, что простая замена работает, так как он выполняет некоторые конкатенации.