Dan*_*Dan 8 php mysql sql select
我有一个选择,如查询搜索表单,如下所示:
<?php
$bucketsearch = sanitizeone($_POST["bucketsearch"], "plain");
$bucketsearch = strip_word_html($bucketsearch);
?>
if(isset($_POST['search'])){
$result=MYSQL_QUERY( "SELECT * FROM buckets where bucketname like '%$bucketsearch%' order by bucketname");
}else{
$result=MYSQL_QUERY( "SELECT * FROM buckets order by bucketname");
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果有人搜索"苹果和梨"的例子我没有得到任何包含任何单词的结果,我只能让它返回结果(1个结果)及其中的所有单词.
任何人都可以帮我把这个搜索更多一些吗?提前致谢.
Tim*_*ain 31
所以你想要使用输入的每个单词进行AND搜索,而不是确切的字符串?怎么样这样:
$searchTerms = explode(' ', $bucketsearch);
$searchTermBits = array();
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$searchTermBits[] = "bucketname LIKE '%$term%'";
}
}
...
$result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits).");
Run Code Online (Sandbox Code Playgroud)
这会给你一个像这样的查询:
SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%'
Run Code Online (Sandbox Code Playgroud)
如果要匹配任何搜索词而不是全部,请将AND更改为OR.进一步的改进可能涉及定义一些停止词,如'和',以提供更好的结果.
我认为最好的解决方案是使用正则表达式.它是最干净的,可能是最有效的.所有常用的数据库引擎都支持正则表达式.
在MySQL中有RLIKE
运算符,所以你的查询将是这样的:
SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)"
Run Code Online (Sandbox Code Playgroud)
没有测试过,希望我的表达式适合MySQL正则表达式"方言".
有关MySql regexp支持的更多信息:http:
//dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp