Как можно выполнить поиск по нескольким полям в SQL?

Как можно улучшить реализацию поиска в базе данных, чтобы можно было найти записи по одной или нескольким введенным данным? Вот как я сейчас подготавливаю данные и формирую запрос, но у меня возникает ошибка. Можете помочь найти проблему?

Функция для подготовки данных:

```php
function getParam($param, $conn, $default = '') {
    (isset($_POST[$param])) ? $data = '%'.mysqli_real_escape_string($conn, $_POST[$param]).'%' : $data = $default;
    return $data;
}
```

Формирование запроса:

```php
$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']
    );
```

Что я делаю неправильно? Пожалуйста, подскажите.
  • 29 сентября 2023 г. 7:18
Ответы на вопрос 2
В вашем коде есть несколько проблем.

1. В вашем запросе, при поиске по полям `name`, `fathername` и `phone`, вы использовали строковые значения вместо переменных. Вместо этого вы должны использовать переменные `$data['name']`, `$data['fathername']` и `$data['phone']`.

```php
$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']
    );
```

2. В функции `getParam` вы возвращаете переменную `$data`, которая является локальной для функции. Чтобы получить значение `$data` в основной части кода, вы должны объявить переменную `$data` в основной части кода перед вызовом функции `getParam`.

```php
$data = array(
   'surname' => getParam('surname', $conn),
   'name' => getParam('name', $conn),
   'fathername' => getParam('fathername', $conn),
   'phone' => getParam('phone', $conn)
);
```

3. Ошибка может возникнуть, если вам необходимо подключиться к базе данных перед выполнением запроса. Убедитесь, что у вас есть правильное подключение `$conn` перед выполнением запроса.

```php
$conn = mysqli_connect("хост", "пользователь", "пароль", "имя_бд");
```

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

```php
$result = mysqli_query($conn, $query);
if (!$result) {
    die('Ошибка выполнения запроса: ' . mysqli_error($conn));
}
```

Улучшенный код будет выглядеть так:

```php
function getParam($param, $conn, $default = '') {
    (isset($_POST[$param])) ? $data = '%'.mysqli_real_escape_string($conn, $_POST[$param]).'%' : $data = $default;
    return $data;
}

$conn = mysqli_connect("хост", "пользователь", "пароль", "имя_бд");

$data = array(
    'surname' => getParam('surname', $conn),
    'name' => getParam('name', $conn),
    'fathername' => getParam('fathername', $conn),
    'phone' => getParam('phone', $conn)
);

$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']
    );

$result = mysqli_query($conn, $query);
if (!$result) {
    die('Ошибка выполнения запроса: ' . mysqli_error($conn));
}

// Обработка результатов запроса
while ($row = mysqli_fetch_assoc($result)) {
    // Ваш код обработки найденных записей
}

// Закрытие соединения с базой данных
mysqli_close($conn);
```

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

$query = "SELECT * FROM `people` WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
$result = $conn->execute_query($query, array_values($data));

Если используется устаревшая версия PHP, то можно вручную добавить метод `execute_query`, либо использовать следующий код:

$query = "SELECT * FROM `people` WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
$stmt = $conn->prepare($query);
$stmt->bind_param("ssss", $data['surname'],$data['name'], $data['fathername'], $data['phone']);
$stmt->execute();
$result = $stmt->get_result();
Похожие вопросы