我正在将所有站点代码从使用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 . '*');
不幸的是,这是使用查询参数的一个奇怪的例外( 编辑: 但显然不在每个MySQL分支的最新版本中,请参见下文)。
中的模式AGAINST() 必须 是常量字符串,而不是查询参数。与SQL查询中的其他常量字符串不同,您不能在此处使用查询参数,这仅仅是因为MySQL的限制。
AGAINST()
要将搜索模式安全地插入查询中,请使用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是一个很棒的工具)上进行了测试,看来这些版本确实接受aAGAINST()子句中的查询参数动态SQL查询。
我仍然回想起过去存在的冲突。也许已在每个分支机构的最新发行版中对其进行了更正。例如,我发现这些相关的错误: