开发者社区> 问答> 正文

多次使用绑定参数

我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。

但是,返回的数据是从不同的表中获取的。

每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。

现在,该手册说:

调用PDOStatement :: execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备好的语句中两次使用相同名称的命名参数标记。

我想,不是用:termX替换每个:term参数(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 ) )

展开
收起
保持可爱mmm 2020-05-11 16:47:15 390 0
1 条回答
写回答
取消 提交回答
  • 我已经遇到过相同的问题好几次了,我想我已经找到了一个非常简单和好的解决方案。万一我想多次使用参数,我只是将它们存储到MySQL中User-Defined Variable。 这使代码更具可读性,并且您在PHP中不需要任何其他功能:

    $sql = "SET @term = :term";

    try { $stmt = $dbh->prepare($sql); $stmt->bindValue(":term", "%$term%", PDO::PARAM_STR); $stmt->execute(); } catch(PDOException $e) { // error handling }

    $sql = "SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term";

    try { $stmt = $dbh->prepare($sql); $stmt->execute(); $stmt->fetchAll(); } catch(PDOException $e) { //error handling } 唯一的缺点可能是您需要执行其他MySQL查询-但恕我直言,这是完全值得的。 由于User-Defined Variables在MySQL中是会话绑定的,因此也不必担心变量会@term在多用户环境中产生副作用。来源:stack overflow

    2020-05-11 16:47:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载