Я реализовал на своем веб-сайте поиск с автозаполнением 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;
@Ghost, я сделал это, но все еще не работает
Во втором примере, который не работает, у вас все еще есть одинарные кавычки вокруг :query. Их там быть не должно.
@Nick, я вынул одинарные кавычки вокруг: query, но он все равно не работает
Я обновил свой ответ. Вы можете это попробовать? Кроме того, вы получаете сообщение об ошибке или просто нет результатов?
@Nick Я увидел твое новое обновление в ответ. Спасибо, что помогли мне, но все равно не работает, возвращает нулевой результат. И когда я запускаю тот же запрос в phpmyadmin, он работает, но только с одинарными кавычками вокруг: querys in statement
Что дает нулевой результат? $stmt->execute() или $stmt->fetchAll()? Какое значение имеет $data['query']?
$ stmt-> fetchAll () возвращает null, внутри $ data ['query'] содержится строка поиска продукта, например 'Psycho', набранная во внешнем интерфейсе.






Это потому, что у вас есть :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, но все еще не работал
Привет, Рэйчел, не используйте оба, вам нужна только одна из альтернатив (т.е. используйте :query и измените bindParam, или же используйте CONCAT. Вы изменили оба вхождения? Получаете ошибку или просто нет результатов?
Привет, @Nick, после того, как я поставил bindParam, который вы предложили, он возвращает Fatal error: невозможно передать параметр 2 по ссылке в C: \ wamp64 \ www \ app \ models \ productModel.php онлайн
Я улучшил вопрос, посмотрите, можете ли вы мне помочь.
Привет, @Nick, я увидел твое новое обновление в ответ. Спасибо, что помогли мне, но все равно не работает, возвращает нулевой результат. И когда я запускаю тот же запрос в phpmyadmin, он работает, но только с одинарными кавычками вокруг: querys in statement
Я обнаружил, что то, что было набрано во внешнем интерфейсе, не подходит для модели.
Не волнуйтесь, я рад, что вы все поняли.
добавление и добавление звездочки на входе правильные, но ваш заполнитель неверен, просто используйте только
:queryвнутри, выньте цитату и звездочку