Поиск точного значения с помощью PHP

Я использую следующий код для поиска в созданной таблице и фильтрации данных. Моя проблема в том, что когда я ищу, скажем, 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
505
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы выполняете 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 присутствует в одном или четырех полях.

Не уверен, что простая замена работает, так как он выполняет некоторые конкатенации.

Philipp 20.07.2018 15:21

хорошо, я сделал то, что вы сказали, например, $query = "SELECT * FROM tbstats` WHERE CONCAT (date, mode, svar, sdev) LIKE '". $ valueToSearch."'; `, но теперь он не показывает никаких результатов.

Jason 20.07.2018 15:23

@Jason Я внес правку, потому что комментарий Филиппа был правильным: вы сделали concat, чтобы искать термин внутри большой строки ... поэтому он ничего не возвращает. Если вы хотите, чтобы присутствовал точный термин, я думаю, вам следует создать условие WHERE, в котором вы проверяете каждое поле на значение.

Mickaël Leger 20.07.2018 15:27

Спасибо, Микаэль, у меня возникли ошибки, я попробовал решение от Филиппа.

Jason 20.07.2018 15:34

Да, я забыл один " в конце! Я до сих пор получаю то же самое, так что мой ответ по-прежнему хорош, но он сначала видит "concat", так что для него хороший ответ!

Mickaël Leger 20.07.2018 15:36

Я почти закончил писать свой ответ после моего комментария, когда я увидел, что вы обновили свой вопрос, и подумал, что было бы безумием выбросить мои записи ... тем не менее - дал вам положительный ответ за ваш хороший ответ!

Philipp 20.07.2018 15:46

@Jason Я очень надеюсь, что вы заметили мой комментарий об экранировании и подготовленном операторе - ваше решение широко открыто для инъекций sql!

Philipp 20.07.2018 15:47

@Philipp np, вы сначала увидели проблему concat :)

Mickaël Leger 20.07.2018 15:50

Спасибо, Филипп, внесу необходимые изменения.

Jason 20.07.2018 16:03
Ответ принят как подходящий

В настоящее время вы объединяете все свои столбцы в одну строку, а затем ищете вхождение вашей строки поиска в любом месте этой объединенной строки.

На самом деле вы можете захотеть точно сопоставить каждый столбец с вашей строкой поиска и вернуть каждую строку, которая имеет точное совпадение в любом столбце. Для точного совпадения не используйте LIKE. Простой = - это то, что вам нужно. Чтобы объединить их, просто используйте оператор OR.

$query = "SELECT * FROM tbstats WHERE
    date = '" . $valueToSearch . "' OR
    mode = '" . $valueToSearch . "' OR
    svar = '" . $valueToSearch . "' OR
    sdev = '" . $valueToSearch . "'";

Вдобавок к этому вам действительно следует избегать ввода или, что еще лучше, использовать подготовленные операторы.

Другие вопросы по теме