我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可以包含不同种类的信息。搜索本身由两个联合选择组成,其中结果总是合并到3列中。
然而,返回的数据是从不同的表中获取的。
每个查询都使用$term进行匹配,我已经将它绑定到":term“作为一个准备好的参数。
现在,手册上写道:
execute调用PDOStatement::
()时,对于要传递给语句的每个值,必须包括一个唯一的参数标记。在预准备语句中,不能两次使用同名的命名参数标记。
我想,与其将每个:term参数替换为: term X (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
)
)
https://stackoverflow.com/questions/18511645
复制相似问题