Я пытаюсь реализовать довольно базовую поисковую систему для моей базы данных, где пользователь может включать различные виды информации. Сам поиск состоит из пары союзников, где результаты всегда объединяются в 3 столбца.
Возвращаемые данные, однако, извлекаются из разных таблиц.
Каждый запрос использует $term для matchmaking, и я привязал его к ": term" в качестве подготовленного параметра.
Теперь в руководстве написано:
Вы должны включить уникальный маркер параметра для каждого значения, которое вы хотите передать в оператор, когда вы вызываете PDOStatement:: execute(). Вы не можете использовать маркер именованного параметра с тем же именем дважды в подготовленном операторе.
Я решил, что вместо замены каждого параметра term: termX (x для term = n ++) должно быть лучшее решение?
Или мне просто нужно связать номер X: termX?
Изменить. Опубликуйте свое решение:
$query = "SELECT ... FROM table WHERE name LIKE :term OR number LIKE :term";
$term = "hello world";
$termX = 0;
$query = preg_replace_callback("/\:term/", function ($matches) use (&$termX) { $termX++; return $matches[0] . ($termX - 1); }, $query);
$pdo->prepare($query);
for ($i = 0; $i < $termX; $i++)
$pdo->bindValue(":term$i", "%$term%", PDO::PARAM_STR);
Хорошо, вот образец. У меня нет времени на sqlfiddle, но я добавлю его позже, если это необходимо.
(
SELECT
t1.`name` AS resultText
FROM table1 AS t1
WHERE
t1.parent = :userID
AND
(
t1.`name` LIKE :term
OR
t1.`number` LIKE :term
AND
t1.`status` = :flagStatus
)
)
UNION
(
SELECT
t2.`name` AS resultText
FROM table2 AS t2
WHERE
t2.parent = :userParentID
AND
(
t2.`name` LIKE :term
OR
t2.`ticket` LIKE :term
AND
t1.`state` = :flagTicket
)
)