gpt4 book ai didi

php - PDO 和 MySQL 全文搜索

转载 作者:可可西里 更新时间:2023-11-01 06:32:14 25 4
gpt4 key购买 nike

我正在将所有站点代码从使用 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 . '*');

最佳答案

不幸的是,这是使用查询参数的一个奇怪的异常(exception)(编辑:但显然不是在每个 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 沙盒是一个很棒的工具),看起来这些版本确实接受 AGAINST() 中的查询参数动态 SQL 查询的子句。

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

关于php - PDO 和 MySQL 全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13682355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com