Как правильно использовать Wildcard с CONCAT

(Спойлер: Название не имеет ничего общего с тем, что не так с кодом.)

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

Я пытался использовать различные типы утверждений «ГДЕ КАК», и большинство из них не работали вообще. Например, я пытался использовать запрос заполнителя (вопросительный знак), и это не сработало вообще. Если я выполнил этот запрос вручную в своей базе данных, я получу результаты, которые я ожидаю.

Так выглядит мой код, переменная $ q получается с помощью метода $ _GET.

$query = $pdo->prepare('SELECT DISTINCT EventCategory FROM Events
WHERE EventCategory LIKE CONCAT(\'%\',:q,\'%\')');
$query->bindParam(":q", $q);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div>  $row->EventCategory </div>";
}

Ожидаемые результаты будут следующими: Если $ q равно n, возвращается Встреча и Ночная жизнь. Когда $ q равно ni, Nightlife возвращается только.

Поиск не чувствителен к регистру, N и n обрабатываются одинаково.

Запрос SHOW CREATE TABLE Events вернул следующее:

  CREATE TABLE `Events` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(100) NOT NULL,
`Image` varchar(600) NOT NULL,
`Date` date NOT NULL,
`Description` varchar(1200) NOT NULL,
`SpacesAvailable` int(11) NOT NULL,
`EventCategory` varchar(50) NOT NULL,
`Trending` varchar(30) DEFAULT NULL,
`TrendingID` int(255) NOT NULL,
`Sale` int(255) NOT NULL,
PRIMARY KEY (`ID`)
)DEFAULT CHARSET=latin1

Изображения, чтобы показать работу сайта: https://imgur.com/a/yP0hTm3
Пожалуйста, если вы просматриваете изображения, вид снизу вверх. Спасибо

0

Решение

Проблема не в LIKE, но в PHP и PDO. Смотреть на 3 противоречивый использование $row в вашем коде:

$row = $query->fetch(PDO::FETCH_ASSOC);
while ($row = $query->fetchObject()) {
echo "<div>  $row->EventCategory </div>"; }

Затем ознакомьтесь с документацией и примерами. (Извините, я не собираюсь давать вам ответ; вам нужно учиться, чтобы понять его.)

0

Другие решения

Я подозреваю, что сопоставление по умолчанию в вашем EventCategory столбец чувствителен к регистру. Вот почему Ni а также ni не совпадают в Nightlife,

Попробуйте этот запрос вместо.

'SELECT DISTINCT EventCategory FROM Events WHERE EventCategory COLLATE utf8_general_ci LIKE CONCAT(\'%\',:q,\'%\')'

Или, если набор символов вашего столбца не является юникодом, а iso8859-1, попробуйте это:

'SELECT DISTINCT EventCategory FROM Events WHERE EventCategory COLLATE latin1_general_ci LIKE CONCAT(\'%\',:q,\'%\')'

Это объясняет, как посмотреть доступные наборы символов и сопоставления на MySQL.

Как изменить параметры сортировки базы данных, таблицы, столбца? объясняет, как изменить параметры сортировки по умолчанию для таблицы или столбца. Как правило, это хорошая идея, потому что сопоставления запекаются в индексы.

1

В дополнение к исчерпывающему ответу О.Джонса, еще одним, более простым решением было бы просто выполнить поиск без учета регистра, например:

'SELECT DISTINCT EventCategory
FROM Events
WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector