You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现MySQL多关键词无序精准匹配搜索需求

问题描述

我用以下PHP代码做MySQL数据库查询:

function search_it() {
    if ( isset( $_GET['s'] ) ) {
        global $wpdb;
        $address_table = $wpdb->prefix . 'my_products';
        $search = $_GET['s'];
        $search = trim($search);         
        $keywords = explode(" ", $search);     
        foreach($keywords as $search) {
            $search = "%{$search}%";
            $where = $wpdb->prepare( 'WHERE name LIKE %s OR price LIKE %d OR id LIKE %d OR market_price LIKE %d OR image_url LIKE %s LIMIT 0,30' , $search, $search, $search, $search, $search );
        }   
        $results = $wpdb->get_results( "SELECT * FROM {$address_table} {$where}" );
        return $results;
    }
} 

数据库示例数据:

This is a blue car
This is a white car
This is a red car
This car color is blue
This is a yellow car
This is a blue bike
This car name is bluebird
Blue car looks awesome

当搜索"blue car"时,当前代码会返回所有包含blue或car的结果,但我需要**仅返回同时包含所有关键词(顺序不限)**的结果,即:

This is a blue car 
This car color is blue
This car name is bluebird
Blue car looks awesome
解决方案

修改后的代码如下,核心是把每个关键词的匹配条件用AND连接,确保所有关键词都被命中:

function search_it() {
    if ( isset( $_GET['s'] ) && !empty(trim($_GET['s'])) ) {
        global $wpdb;
        $address_table = $wpdb->prefix . 'my_products';
        $search = trim($_GET['s']);         
        $keywords = explode(" ", $search);
        // 过滤连续空格拆分出的空关键词
        $keywords = array_filter($keywords, function($k) {
            return !empty(trim($k));
        });

        if (empty($keywords)) {
            return []; // 无有效关键词时返回空数组
        }

        $where_clauses = [];
        $prepare_args = [];

        foreach($keywords as $keyword) {
            $like_keyword = "%{$keyword}%";
            // 单个关键词对所有字段的OR匹配条件
            $clause = '(name LIKE %s OR price LIKE %s OR id LIKE %s OR market_price LIKE %s OR image_url LIKE %s)';
            $where_clauses[] = $clause;
            // 为当前关键词的5个占位符添加参数
            $prepare_args = array_merge($prepare_args, [$like_keyword, $like_keyword, $like_keyword, $like_keyword, $like_keyword]);
        }

        // 用AND拼接所有关键词的条件,再加上分页限制
        $where_template = 'WHERE ' . implode(' AND ', $where_clauses) . ' LIMIT 0,30';
        // 预处理完整的WHERE语句
        $prepared_where = $wpdb->prepare($where_template, $prepare_args);

        $results = $wpdb->get_results( "SELECT * FROM {$address_table} {$prepared_where}" );
        return $results;
    }
    return []; // 无搜索参数时返回空数组
} 
修改说明
  • 修复循环覆盖$where的问题:原代码每次循环都会替换$where,最终只保留最后一个关键词的条件;现在会为每个关键词生成独立的匹配规则,再用AND拼接,确保所有关键词都必须出现在结果中。
  • 增加空关键词过滤:避免连续空格拆分出空字符串,导致生成无效的SQL条件。
  • 优化参数绑定:统一用%s作为LIKE的占位符(数值类型字段用%d会在关键词为字符串时出错,%s更通用),同时正确传递所有预处理参数,杜绝SQL注入风险。
  • 补充边界情况处理:无搜索参数或有效关键词时直接返回空数组,避免执行错误的SQL语句。

内容的提问来源于stack exchange,提问作者NewPal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:45:08