Как использовать PDO bindParam для SphinxSearch 3? - PullRequest
0 голосов
/ 04 февраля 2019

Я недавно установил SphinxSearch 3.1.1 в Ubuntu 18 и в настоящее время создаю фрагмент кода с использованием PHP 7.2.У меня проблемы с работой bindParam.

Вот мой код:

$mytest = "hello";
$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH('\"@title :mytest \"/1')");
$query->bindParam(':mytest', $mytest, PDO::PARAM_STR);
$query->execute();

Когда я пытаюсь выполнить его, результат пуст.

Однако, когда я пытаюсь поместить $ mytest непосредственно в оператор, я получаю ожидаемый результат

$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH('\"@title". $mytest ."\"/1')");

Означает ли это, что sphinx не поддерживает bindParam в функции MATCH ()?Или я что-то здесь упускаю.

1 Ответ

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

Примечание от http://php.net/manual/en/pdo.prepare.php

Маркеры параметров могут представлять только полный литерал данных.Ни часть литерала, ни ключевое слово, ни идентификатор, ни какая-либо произвольная часть запроса не могут быть связаны с помощью параметров.

т.е. вы пытаетесь связать внутри строкового литерала.В практическом смысле PHP (или сервер mysql) добавит 'вокруг значения, чтобы сделать утверждение.

... По сути, в результате sphinxql запросит:

SELECT *, weight() FROM test WHERE MATCH('"@title 'hellow' "/1')

, что явно неверно!


Вместо этого свяжите целом строковый литерал.

$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH(:mytest)");
$query->bindParam(':mytest',  '"@title '.$mytest.'"/1', PDO::PARAM_STR);

Хотя это выглядит как недопустимый запрос расширенного синтаксиса Sphinx, квалификатор @field должен находиться вне кворума,

$query->bindParam(':mytest',  '@title "'.$mytest.'"/1', PDO::PARAM_STR);
...