MySQL MATCH AGAINST FULL TEXT SEARCH не работает динамически с php PDO bindParam

Я реализовал на своем веб-сайте поиск с автозаполнением ajax с пользовательским интерфейсом jQuery, и он работает очень хорошо, но у меня проблема с выбором, который не хочет работать.

Поле autocomplete_search_name в database уже указано как FULLTEXT index.

Приведенный ниже select отлично работает в статическом режиме, и я хочу, чтобы поиск работал именно так, с **

    $stmt = $this->db->prepare("SELECT autocomplete_search_name as label, url as the_link FROM product WHERE status = 'active' AND MATCH(autocomplete_search_name) AGAINST('*psico*' IN BOOLEAN MODE) ORDER BY MATCH(autocomplete_search_name) AGAINST('*psico*') DESC LIMIT 10");
    $stmt->execute();
    $moddados = $stmt->fetchAll();
    return $moddados;

однако, когда я начинаю динамически вставлять параметры с помощью PDO bindParam или PDO quote, как в примере ниже, выбор больше не работает. Я много исследовал, но не смог найти способ решить эту проблему.

    $data['query'] = '*'.$data['query'].'*';
    $stmt = $this->db->prepare("SELECT autocomplete_search_name as label, url as the_link FROM product WHERE status = 'active' AND MATCH(autocomplete_search_name) AGAINST(:query IN BOOLEAN MODE) ORDER BY MATCH(autocomplete_search_name) AGAINST(:query) DESC LIMIT 10");
    $stmt->bindParam(':query', $data['query']);
    $stmt->execute();
    $moddados = $stmt->fetchAll();
    return $moddados;

Я пробовал этот способ ниже, но он тоже не работает:

$stmt = $this->db->prepare("SELECT autocomplete_search_name as label, url as the_link FROM product WHERE status = 'active' AND MATCH(autocomplete_search_name) AGAINST(CONCAT('*', :query, '*') IN BOOLEAN MODE) ORDER BY MATCH(autocomplete_search_name) AGAINST(CONCAT('*', :query, '*')) DESC LIMIT 10");
    $stmt->bindParam(':query', $data['query']);
    $stmt->execute();
    $moddados = $stmt->fetchAll();
    return $moddados;

а также этот способ не сработал

$stmt = $this->db->prepare("SELECT autocomplete_search_name as label, url as the_link FROM product WHERE status = 'active' AND MATCH(autocomplete_search_name) AGAINST(':query' IN BOOLEAN MODE) ORDER BY MATCH(autocomplete_search_name) AGAINST(':query') DESC LIMIT 10");
    $stmt->bindParam(':query', '*' . $data['query'] . '*');
    $stmt->execute();
    $moddados = $stmt->fetchAll();
    return $moddados;

добавление и добавление звездочки на входе правильные, но ваш заполнитель неверен, просто используйте только :query внутри, выньте цитату и звездочку

Kevin 15.05.2018 03:29

@Ghost, я сделал это, но все еще не работает

Rangel Bacher 15.05.2018 03:35

Во втором примере, который не работает, у вас все еще есть одинарные кавычки вокруг :query. Их там быть не должно.

Nick 15.05.2018 03:52

@Nick, я вынул одинарные кавычки вокруг: query, но он все равно не работает

Rangel Bacher 15.05.2018 04:05

Я обновил свой ответ. Вы можете это попробовать? Кроме того, вы получаете сообщение об ошибке или просто нет результатов?

Nick 15.05.2018 04:07

@Nick Я увидел твое новое обновление в ответ. Спасибо, что помогли мне, но все равно не работает, возвращает нулевой результат. И когда я запускаю тот же запрос в phpmyadmin, он работает, но только с одинарными кавычками вокруг: querys in statement

Rangel Bacher 15.05.2018 04:15

Что дает нулевой результат? $stmt->execute() или $stmt->fetchAll()? Какое значение имеет $data['query']?

Nick 15.05.2018 04:39

$ stmt-> fetchAll () возвращает null, внутри $ data ['query'] содержится строка поиска продукта, например 'Psycho', набранная во внешнем интерфейсе.

Rangel Bacher 15.05.2018 04:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
287
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что у вас есть :query в одинарных кавычках, и поэтому MySQL обрабатывает его как строку, а не параметр.

Вы можете обойти это, заменив '*:query*' на :query и изменив привязку на:

$stmt->bindParam(':query', '*' . $data['query'] . '*');

Или можно заменить '*:query*' на CONCAT('*', :query, '*')

Вы также можете столкнуться с ограничением (см. руководство по эксплуатации) на использование одного и того же имени параметра дважды в одном запросе (что происходит только в том случае, если вы не используете эмулированные подготовленные операторы). В этом случае вам нужно будет изменить свой код следующим образом:

$stmt = $this->db->prepare("SELECT autocomplete_search_name as label, url as the_link FROM product 
                            WHERE status = 'active' AND MATCH(autocomplete_search_name) AGAINST(CONCAT('*', :query1, '*') IN BOOLEAN MODE) 
                            ORDER BY MATCH(autocomplete_search_name) AGAINST(CONCAT('*', :query2, '*')) DESC 
                            LIMIT 10");
$stmt->bindParam(':query1', $data['query']);
$stmt->bindParam(':query2', $data['query']);
$stmt->execute();

Привет, @Nick, я заменил ':запрос' звездочкой на ': query' в инструкции и использовал ваши bindParam и CONCAT, но все еще не работал

Rangel Bacher 15.05.2018 03:40

Привет, Рэйчел, не используйте оба, вам нужна только одна из альтернатив (т.е. используйте :query и измените bindParam, или же используйте CONCAT. Вы изменили оба вхождения? Получаете ошибку или просто нет результатов?

Nick 15.05.2018 03:43

Привет, @Nick, после того, как я поставил bindParam, который вы предложили, он возвращает Fatal error: невозможно передать параметр 2 по ссылке в C: \ wamp64 \ www \ app \ models \ productModel.php онлайн

Rangel Bacher 15.05.2018 03:53

Я улучшил вопрос, посмотрите, можете ли вы мне помочь.

Rangel Bacher 15.05.2018 03:53

Привет, @Nick, я увидел твое новое обновление в ответ. Спасибо, что помогли мне, но все равно не работает, возвращает нулевой результат. И когда я запускаю тот же запрос в phpmyadmin, он работает, но только с одинарными кавычками вокруг: querys in statement

Rangel Bacher 15.05.2018 04:13

Я обнаружил, что то, что было набрано во внешнем интерфейсе, не подходит для модели.

Rangel Bacher 15.05.2018 04:50

Не волнуйтесь, я рад, что вы все поняли.

Nick 15.05.2018 07:04

Другие вопросы по теме