使用PHP搜索MySQL数据库的最佳方法是什么?

时间:2008-09-30 08:41:55

标签: php mysql search

如果我在MySQL数据库中有一个书籍表,我想在“标题”字段中搜索关键字(由用户在搜索字段中输入);在PHP中执行此操作的最佳方法是什么? MySQL LIKE命令是最有效的搜索方式吗?

6 个答案:

答案 0 :(得分:21)

是的,最有效的方法通常是在数据库中搜索。要做到这一点,你有三种选择:

  • LIKE, ILIKE匹配确切的子字符串
  • RLIKE以匹配POSIX正则表达式
  • FULLTEXT索引匹配针对自然语言处理的另外三种不同类型的搜索

所以这取决于你将实际寻找什么来决定什么是最好的。对于书籍标题,我提供了一个LIKE搜索精确子字符串匹配,当人们知道他们正在寻找的书时很有用,还有一个FULLTEXT搜索来帮助找到类似于单词或短语的标题。我当然会在界面上给它们不同的名字,可能就像子串搜索一样精确,类似于全文搜索。

关于全文的示例:http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

答案 1 :(得分:10)

这是一种简单的方法,您可以拆分一些关键字,以构建一些子句,用于过滤这些关键字上的列,ANDed或ORed。

$terms=explode(',', $_GET['keywords']);
$clauses=array();
foreach($terms as $term)
{
    //remove any chars you don't want to be searching - adjust to suit
    //your requirements
    $clean=trim(preg_replace('/[^a-z0-9]/i', '', $term));   
    if (!empty($clean))
    {
         //note use of mysql_escape_string - while not strictly required
         //in this example due to the preg_replace earlier, it's good
         //practice to sanitize your DB inputs in case you modify that
         //filter...
         $clauses[]="title like '%".mysql_escape_string($clean)."%'";
    }
}

if (!empty($clauses))
{   
    //concatenate the clauses together with AND or OR, depending on
    //your requirements
    $filter='('.implode(' AND ', $clauses).')';

    //build and execute the required SQL
    $sql="select * from foo where $filter";
}
else
{
    //no search term, do something else, find everything?
}

答案 2 :(得分:2)

考虑使用sphinx。它是一个开源的全文引擎,可以直接使用你的mysql数据库。它比手工编写LIKE语句更具可伸缩性和灵活性(并且不易受SQL注入影响)

答案 3 :(得分:1)

您也可以在mysql手册http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex中查看soundex函数(soundex,听起来像) 它的功能是返回这些匹配,例如严格检查(通过LIKE或=)没有返回任何结果。

答案 4 :(得分:1)

Paul Dixon的代码示例为基于LIKE的方法提供了很好的主意。

我只想添加这个可用性的想法:在界面中设置一个(AND | OR)单选按钮,默认为AND,然后如果用户的查询结果为零(0)匹配且包含至少两个单词,则回复可以选择效果:

  

“抱歉,找不到没有匹配您的搜索词组。展开搜索以匹配您词组中的任何字词?

也许有更好的方式来说明这一点,但基本的想法是引导人们走向另一个查询(可能是成功的)而用户不必考虑布尔逻辑AND和OR。

答案 5 :(得分:1)

我认为如果这是一个词,那么就是最有效的方式。如上所述,多个单词可以用爆炸功能分开。然后它可以循环并用于通过数据库单独搜索。如果返回两次相同的结果,则可以通过将值读入数组来进行检查。如果它已存在于数组中,请忽略它。然后使用计数功能,您将知道在循环打印时停止的位置。可以使用similar_text函数进行排序。百分比用于对数组进行排序。那是最好的。