搜索多个关键字

时间:2014-07-17 06:08:52

标签: php

我有这个小的php搜索脚本来帮助我搜索我的用户表。

示例:

  • 如果我搜索“John”,我会得到结果
  • 如果我搜索“John Doe”(两个带空格的单词),我就没有结果。 即使用户名是John Doe。

我想知道这个脚本中是否有什么东西我可以改变以帮助我搜索多个关键词。

以下是搜索代码:

<?php
if(isset($_GET['keywords'])){
    $keywords = escape($_GET['keywords']);

    $search = DB::getInstance()->query("
    SELECT `id`,`username`,`first_name`,`last_name`,`unit`,`email`,`rent_own`,`city`,`zip`,`phone`,`joined`,`group_id` FROM `users` WHERE 
    `username`    LIKE '%{$keywords}%' OR
    `first_name`  LIKE '%{$keywords}%' OR
    `last_name`   LIKE '%{$keywords}%' OR
    `unit`        LIKE '%{$keywords}%' OR
    `email`       LIKE '%{$keywords}%' OR
    `rent_own`    LIKE '%{$keywords}%' OR
    `city`        LIKE '%{$keywords}%' OR
    `zip`         LIKE '%{$keywords}%' OR
    `phone`       LIKE '%{$keywords}%' OR
    `joined`       LIKE '%{$keywords}%' OR
    `group_id`    LIKE '%{$keywords}%'  
    ");                



?>

欢迎并赞赏任何想法或解决方案。

2 个答案:

答案 0 :(得分:3)

执行您网站的搜索功能时。 Match和Against比Like sql语句更好。该字段必须设置为FullText与字段上的术语匹配:

SELECT `id`,`username`,`first_name`,`last_name`,`unit`,`email`,`rent_own`,`city`,`zip`,`phone`,`joined`,`group_id` FROM `users` WHERE MATCH(`id`,`username`,`first_name`,`last_name`,`unit`,`email`,`rent_own`,`city`,`zip`,`phone`,`joined`,`group_id`) AGAINST('keywords')

您还可以使用IN BOOLEAN MODE来允许sql语句中的运算符。 例如。 ... MATCH( first_name , last_name ) AGAINST('-John +Doe' IN BOOLEAN MODE) ... ( - )减号意味着什么都不应该匹配'约翰' (+)该词必须出现在比赛中。

还有许多其他运营商需要使用。请参阅this page for more operator和解释

答案 1 :(得分:1)

如果您使用全名搜索,则需要为其添加条件

CONCAT(`first_name`,' ',`last_name`) LIKE '%{$keywords}%' OR