MySQL MATCH ПРОТИВ ПОИСКА ПОЛНОГО ТЕКСТА не работает динамически с php PDO bindParam - PullRequest
0 голосов
/ 15 мая 2018

Я реализовал поиск автозаполнения 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, как в примере ниже, выбор больше не работает.Я много исследовал, но не смог найти способ решить эту проблему.

    $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;

1 Ответ

0 голосов
/ 15 мая 2018

Это потому, что у вас есть :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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...