PDO和MySQL全文搜索

时间:2012-12-03 11:32:15

标签: php mysql pdo full-text-search

我正在将我的所有网站代码从使用mysql_ *函数转换为PDO。关于PDO的PHP文档并不清楚我的需求。它为您提供了使用的功能,但没有详细说明在不同的场景中解释它们。

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

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)";

实际陈述时间更长,但这基本上就是这样。

我的问题是,我如何将其纳入PDO?

我知道你不打算在地方标记周围使用引号,所以你把它们留在AGAINST()函数中吗?我包括它们吗?如果我把它们排除在外,那么通配符符号会发生什么?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE");
$sql->bindValue(':searchText', $searchFor . '*');

2 个答案:

答案 0 :(得分:14)

遗憾的是,这是使用查询参数的一个奇怪的例外(编辑:,但显然不是在每个MySQL分支的最新点发布中,见下文)。

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

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

$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的评论:

你是对的,我刚刚在MySQL 5.5.31,5.1.68和5.0.96(MySQL Sandbox是一个很棒的工具)上进行了测试,看起来这些版本确实接受了AGAINST()中的查询参数动态SQL查询的子句。

我仍然记得过去存在的冲突。也许它已在每个分支的最新点发布中得到纠正。例如,我发现了这些相关的错误:

答案 1 :(得分:0)

$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();
}