2012-12-03 256 views
7

我将使用mysql_ *函数的所有网站代码转换为PDO。关于PDO的PHP文档并不清楚我的需求。它给你使用的功能,但没有详细解释它们在不同的场景。PDO和MySQL全文搜索

基本上,我有一个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 . '*'); 

回答

12

这是不幸的是一个奇怪的例外使用的查询参数(编辑:但显然不是每个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 31年5月5日,68年5月1日,和5.0.96(MySQL的沙盒是一个奇妙的工具),并且似乎这些版本在动态SQL查询的AGAINST()子句中接受查询参数。

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

+0

非常感谢您的回答,并替代解决方案:) –

+2

我无法重现你说的是这个“怪异”的行为。 “反对(在布尔模式中)”适合我。你使用的是什么MySQL版本? –

+0

当然,仿真模式将被关闭并进行双重检查。 –

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