首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO和MySQL全文搜索

PDO和MySQL全文搜索
EN

Stack Overflow用户
提问于 2012-12-03 19:32:15
回答 2查看 7.4K关注 0票数 9

我正在转换我所有的网站代码,从使用mysql_*函数到PDO。关于PDO的PHP文档不能清楚地满足我的需要。它为您提供了要使用的函数,但不会详细解释不同场景下的函数。

基本上,我有一个mysql全文搜索:

代码语言:javascript
复制
$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)";

实际的语句要长得多,但这就是它的基本功能。

我的问题是,我如何将其合并到PDO中?

我知道您不应该在位置标记两边使用引号,那么您是否会将它们省略在AGAINST()函数中呢?我要把它们包括进来吗?如果我省略了它们,通配符等会发生什么?

代码语言:javascript
复制
$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE");
$sql->bindValue(':searchText', $searchFor . '*');
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-03 19:42:10

不幸的是,对于查询参数的使用来说,这是一个奇怪的例外(edit:,但显然不是在每个MySQL分支的最新版本中,见下文)。

AGAINST()中的模式必须是常量字符串,而不是查询参数。与SQL查询中的其他常量字符串不同,您不能在这里使用查询参数,这仅仅是因为MySQL中的限制。

要安全地将搜索模式插入到查询中,请使用PDO::quote()函数。注意,PDO的quote()函数已经添加了引号分隔符(与mysql_real_escape_string()不同)。

代码语言:javascript
复制
$quoted_search_text = $this->db->quote('+word +word');

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE");

来自@YourCommonSense的回复:

您说得对,我刚刚在SQL5.5.31、5.1.68和5.0.96 ( Sandbox是一个很棒的工具)上测试了这一点,而且这些版本似乎确实接受动态MySQL查询的MySQL()子句中的查询参数。

我仍然记得过去存在的一场冲突。也许它已经在每个分支的最新版本中得到了纠正。例如,我发现了这些相关的bug:

在AGAINST()子句中使用存储过程参数的FULLTEXT始终返回相同的结果:http://bugs.mysql.com/bug.php?id=3734

票数 14
EN

Stack Overflow用户

发布于 2013-09-30 20:44:27

代码语言:javascript
复制
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}";

try {
    $database->prepare($sql);
    $database->bindParam(':searchstr', $search);
    $database->execute();
    $result_array = $database->fetch_array($sql);
} catch (Exception $e) {
    echo $e->getMessage();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13682355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档