Как реализовать поиск по нескольким полям?

Как реализовать поиск в базе если нужно найти по одному или нескольким введённым данным. Делаю следующим образом
данные подготавливаю следующим образом:
function getParam($param, $conn, $default = '') {
    (isset($_POST[$param])) ? $data = '%'.mysqli_real_escape_string($conn, $_POST[$param]).'%' : $data = $default;
    return $data;
}

сам запрос:
$query = sprintf(
        "SELECT * FROM `people` WHERE 
        (LOWER(`surname`) LIKE LOWER('%s')
        OR LOWER('name') LIKE LOWER('%s')
        OR LOWER('fathername') LIKE LOWER('%s')
        OR LOWER('phone') LIKE ('%s'))",
        $data['surname'],
        $data['name'],
        $data['fathername'],
        $data['phone']
    );

В чём ошибка?
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Если вычистить из кода неверные кавычки и бессмысленные телодвижения, и переделать на "использование стандартных подготовленных запросов" (с) @Rsa97
$data = [
    "%{$_POST['surname']}%",
    "%{$_POST['name']}%", 
    "%{$_POST['fathername']}%",
    "%{$_POST['phone']}%",
];
$query = "SELECT * FROM `people` 
          WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
$result = $conn->execute_query($query, $data);


Если используется устаревшая версия РНР, то либо добавить в неё execute_query руками, либо написать по-старинке,
$stmt = $conn->prepare($query);
$stmt->bind_param("ssss", ...$data);
$stmt->execute();
$result = $stmt->get_result();


Одно из преимуществ такого подхода в том, что мы как раз не путаемся в кавычках. Одинарные в запросе становятся не нужны
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы