如何在 PDO 中使用绑定参数进行模糊搜索?

Posted

技术标签:

【中文标题】如何在 PDO 中使用绑定参数进行模糊搜索?【英文标题】:How do you do fuzzy searches using bound parameters in PDO? 【发布时间】:2010-09-08 19:33:01 【问题描述】:

试图做这种事情......

WHERE username LIKE '%$str%'

...但是在 PDO 中使用绑定参数来准备语句。例如:

$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();

我已经尝试过无数种单引号和 % 符号的排列方式,但我对此感到很反感。

我似乎记得以前在某个时候与这个搏斗过,但我找不到任何参考资料。有谁知道如何(如果?)在 PDO 中使用命名参数很好地做到这一点?

【问题讨论】:

【参考方案1】:

啊。在 php.net 上发现一条评论让我想起了答案;在评估 bindParam 之前,您需要通配符您的值,而不必担心引用它。因此,例如,这可以正常工作:

$str = "%$str%";
$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();

【讨论】:

很高兴你找到了它。前几天我也发现了它,正在寻找同样的东西。太糟糕了,你不能接受自己的答案! 啊哈——他们修好了——你现在可以接受你自己的答案了。适合将 *** 用作库【参考方案2】:

5 年后,万一其他人偶然发现了这一点,我发现了另一种方法。接受的解决方案对我的情况并不可行,但这种方法似乎也能完成工作:

$query = $db->prepare("select * FROM table WHERE field LIKE CONCAT('%',:search,'%')");
$query->bindParam(':search', $str);
$query->execute();

我不确定调用CONCAT 函数的开销是否会影响性能,但我想将其作为一个选项传递。希望它会对某人有所帮助。

【讨论】:

$query->bindParam(':search', "%$str%"); 不可行?你在开玩笑吗? 哈哈,是的,代码在一个数据库抽象函数中,它从输入中生成一个 WHERE 子句。该函数无法访问参数值,只能访问键。可能有更好的方法来做到这一点,但它现在正在工作,所以我会接受它。 投反对票似乎有点苛刻。这是解决问题的有效方法不是吗? 您好多米尼克,感谢您的意见。我喜欢您的替代解决方案,它似乎更具可读性。 5年?吉普车。 我有一个声明,我想通过大量的参数重用来绑定参数。我的数据库是 PostgreSQL,所以我使用了 '||' 而不是 'CONCAT'。它工作得很好。 +1ed

以上是关于如何在 PDO 中使用绑定参数进行模糊搜索?的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合

关于Lucene怎么使用SpanQuery进行模糊搜索

如何在 Redis 中进行模糊搜索

如何使用 Lodash java-script 库进行模糊搜索?

如何进行模糊查找文件

sql 模糊搜索无输入参数时查询所有