加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – PDO和MySQL全文搜索

发布时间:2020-12-13 18:16:54 所属栏目:PHP教程 来源:网络整理
导读:我正在将我的所有网站代码从使用 mysql_ *函数转换为PDO.关于PDO的 PHP文档并不清楚我的需求.它为您提供了使用的功能,但没有详细说明在不同的场景中解释它们. 基本上,我有一个mysql全文搜索: $sql = "SELECT ... FROM search_table WHERE MATCH(some_field)
我正在将我的所有网站代码从使用 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中的限制.

要安全地将搜索模式插入查询,请使用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查询.

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

>在AGAINST()子句中使用存储过程参数始终返回相同的结果:http://bugs.mysql.com/bug.php?id=3734
>准备好的声明,MATCH和FULLTEXT:http://bugs.mysql.com/bug.php?id=14496崩溃或奇怪的结果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读