【问题标题】:Search for more than one keyword搜索多个关键字
【发布时间】:2014-07-17 06:08:52
【问题描述】:

我有这个小的 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}%'  
    ");                



?>

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

【问题讨论】:

  • 我的第一个想法是您将John Doe 作为查询字符串参数传递,其中包括两个单词之间的%20 空格。您能否确认$keywords 实际上是您想要的John Doe
  • 不,我很确定您对 %20 的空间是正确的。有什么办法可以解决吗?
  • 确保 $keywords = escape($_GET['keywords']);正在做你认为它会做的事情。
  • 展开您的关键字并在每个数据库表行中搜索每个关键字,因此您应该得到所有可能的数据返回。
  • 我对需求一无所知。但似乎全文搜索在这里很有用。

标签: php


【解决方案1】:

在执行您网站的搜索功能时。 Match and Against 优于 Like sql 语句。该字段必须设置为全文匹配字段上的术语:

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及说明

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • OP 询问的是username 而不是first_namelast_name
    • @echo 编辑您的问题并提及first_namelast_name 而不是user name
    • @FuzzyTree 还有一个问题。如果我想搜索不同用户组中的用户,例如管理员版主 ...等,如果我的 group_id 是数字,我该怎么做。示例: Admin =1 , moderator =2 如果我搜索 Admin 我没有得到任何结果。
    • @echo 如果您想在搜索该关键字时显示管理员,则必须加入 group_id 并为管理员列添加或条件
    • @FuzzyTree 类似这样:` group_id == 1){ echo 'admin'; } elseif ($s->group_id == 2){ echo 'moderater'; } elseif ($s->group_id == 3){ echo 'owner'; } ?>`
    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多