Решение проблемы сортировки по буквам после перехода на PHP 8.4

В системе реализована функция сортировки по алфавиту: при клике на букву происходит AJAX-запрос для получения элементов, названия которых начинаются с выбранной буквы.

Клиентская часть (JavaScript/jQuery)

На стороне клиента используется следующий код:

$(document).on('click', ".jq-char", function() {
    let selectedLetter = $(this).html();
    
    $.ajax({
        url: '/admin/sortbya',
        type: 'POST',
        data: { name: selectedLetter },
        cache: false,
        success: function(response) {
            console.log(response);
            $('.table-news').html(response);
        }
    });
});

Серверная часть (PHP)

На сервере запрос обрабатывается методом, который выполняет SQL-запрос с использованием оператора LIKE:

public static function allA($name)
{
    $db = Db::getConnection();
    $sql = 'SELECT * FROM watch WHERE watch_brand LIKE :name AND sold != "yes"';
    $result = $db->prepare($sql);
    $result->bindParam(':name', "$name%", PDO::PARAM_STR);
    $result->setFetchMode(PDO::FETCH_ASSOC);
    $result->execute();
    return $result->fetchAll();
}

Проблема и диагностика

После перехода с PHP 7 на версию 8.4 возникла следующая ситуация:

  • Клиентская часть работает корректно - буква передается на сервер
  • Прямые запросы к базе данных возвращают ожидаемые результаты
  • При выполнении метода allA() возникает ошибка 500, связанная с PDO
  • Если закомментировать SQL-запрос и просто вернуть данные - метод работает
  • Проблема проявляется именно при использовании оператора LIKE с параметризованным запросом

Возможные причины и решения

Рассмотрим основные направления для диагностики:

  1. Проверка версии PDO и драйверов
    Убедитесь, что после обновления PHP установлены актуальные драйверы PDO для вашей СУБД.
  2. Анализ логов ошибок
    Проверьте логи PHP и веб-сервера для получения детальной информации об ошибке 500.
  3. Изменение формата параметра
    Попробуйте изменить способ передачи параметра в запрос:
    $searchPattern = $name . '%';
    $result->bindParam(':name', $searchPattern, PDO::PARAM_STR);
  4. Проверка кодировки соединения
    Убедитесь, что кодировка соединения с БД установлена корректно (например, UTF-8).
  5. Тестирование упрощенного запроса
    Попробуйте выполнить запрос без условия sold != "yes" для исключения возможных конфликтов.

Рекомендуется начать диагностику с анализа логов ошибок, так как они могут содержать конкретное сообщение об ошибке PDO, которое поможет точно определить причину проблемы.