Как правильно использовать Wildcard с CONCAT - PullRequest
0 голосов
/ 04 января 2019

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

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

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

Так выглядит мой код, переменная $ 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, возвращаются Meeting и Nightlife. Когда $ 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 Пожалуйста, если вы просматриваете изображения, вид снизу вверх. Спасибо

Ответы [ 3 ]

0 голосов
/ 04 января 2019

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

'SELECT DISTINCT EventCategory 
 FROM Events 
 WHERE UPPER(EventCategory) LIKE CONCAT(\'%\',UPPER(:q),\'%\')'
0 голосов
/ 05 января 2019

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

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

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

0 голосов
/ 04 января 2019

Я подозреваю, что параметры сортировки по умолчанию в столбце 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.

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

...