【问题标题】:PDO and MySQL Fulltext searchesPDO 和 MySQL 全文搜索
【发布时间】:2012-11-20 20:46:58
【问题描述】:

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

【问题讨论】:

    标签: php mysql pdo full-text-search


    【解决方案1】:

    不幸的是,这是使用查询参数的一个奇怪的例外(edit:,但显然不是在每个 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 (? IN BOOLEAN MODE) 适合我。你用的是什么版本的mysql?
    【解决方案2】:
    $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();
    }
    

    【讨论】:

    • 如果搜索字符串包含一个括号:PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected $end,这对我来说会中断。 PDO::quote() 也不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2015-07-03
    相关资源
    最近更新 更多