用PHP搜索MySQL数据库的最佳方法是什么?
假设我在MySQL数据库中有一本书的表,并且想在"标题"字段中搜索关键字(由用户在搜索字段中输入);用PHP做到这一点的最佳方法是什么? MySQLLIKE
命令是最有效的搜索方式吗?
解决方案
是的,最有效的方法通常是在数据库中搜索。为此,我们有三种选择:
- 喜欢,喜欢匹配精确的子字符串
- RLIKE匹配POSIX正则表达式
- FULLTEXT索引可匹配针对自然语言处理的另外三种不同类型的搜索
因此,这取决于我们实际搜索的内容,以决定最好的方法。对于书名,我会提供LIKE搜索,以查找完全匹配的子字符串,这在人们知道他们要查找的书时非常有用,还提供FULLTEXT搜索,以帮助查找与单词或者短语相似的书名。我当然会在界面上给它们起不同的名称,可能类似于精确的子字符串搜索和相似的全文搜索。
有关全文的示例:http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html
这是一种简单的方法,我们可以分解一些关键字来构建一些子句,以过滤这些关键字的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? }
我们还可以在mysql手册http://dev.mysql.com/doc/refman/5.0/zh-CN/string-functions.html#function_soundex中检查soundex函数(soundex,听起来像)
例如,如果严格检查(通过LIKE或者=)未返回任何结果,则其具有返回这些匹配项的功能。
Paul Dixon的代码示例很好地理解了基于LIKE的方法的主要思想。
我将添加此可用性想法:在界面中提供一个(AND | OR)单选按钮集,默认设置为AND,然后,如果用户的查询结果为零(0)匹配项并且包含至少两个单词,则使用一个选项进行响应效果:
"Sorry, No matches were found for your search phrase. Expand search to match on ANY word in your phrase?
也许有一种更好的措词,但是基本思想是引导用户进行另一个查询(可能会成功),而无需用户考虑AND和OR的布尔逻辑。
考虑使用狮身人面像。这是一个开放源代码的全文引擎,可以直接使用mysql数据库。与手动编码LIKE语句相比,它具有更大的可伸缩性和灵活性(并且不易受到SQL注入的影响)