如何在 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集合