我使用HTML表单允许用户在数据库表中查找条目:
<form action="controller.php" method="get">
<input type="text" name="word" id="word">
我的数据库中的表有一个名为keywords的列,其中包含多个值,因此我使用SELECT查询来选择所有具有与用户键入表单相匹配的关键字的行。所以controller.php包含这个查询:
$word= $_GET['word'];
$query = SELECT * FROM table WHERE table.keywords LIKE '%{$word}%
除非用户在搜索框中输入多个单词,否则此工作正常。如何更改此选项,以便当用户在搜索框中键入多个单词时,它将返回其关键字列中 用户单词
的所有行。即,用户搜索“apples oranges”,查询将返回其关键字字段中 “apples”或“oranges”的所有行。
答案 0 :(得分:3)
您可以尝试使用 -
$words = explode(' ', $word);
$query = "SELECT * FROM table WHERE table.keywords IN (".implode(',', $words).")";
或 -
$query = "SELECT * FROM table WHERE";
$conds = array();
foreach ($words as $val) {
$conds[] = "table.keywords LIKE '%".$val."%'";
}
$query .= implode(' OR ', $conds);
如果需要,可以添加支票。
答案 1 :(得分:1)
您可以使用正则表达式:
array_walk(
$newArray,
function(&$value) {
$value .= ',';
}
);
答案 2 :(得分:1)
我使用此代码即可正常工作
$regcond = trim($_GET['word']);
$regcond = preg_replace('!\s+!', ' ', $regcond); //change how many space beetwen word to one space
$regcond = trim($regcond);
$regcond = str_replace(" ",".+",$regcond); // change all space to .+ for search with regex
$final_cond = 'SELECT * FROM table WHERE table.keywords REGEXP "' . $regcond . '"';
答案 3 :(得分:1)
$words = explode(" ",$string);
$string = array_map(function(&$word){
return "+".$word."*";
},$words);
$term = implode(" ",$string);
$query = "SELECT * FROM table_name WHERE MATCH(column_name) AGAINST('{$term}' IN BOOLEAN MODE)";
答案 4 :(得分:0)
LIKE
命令适用于单字符串。对于数据库中的高级搜索,请使用FULLTEXT
搜索。
https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
答案 5 :(得分:0)
因为在SQL中无法搜索单个名称,请尝试根据类似Heavens Road的空格拆分名称,并在最终查询中附加到字符串ie('%Heavens%'
)OR(%Road%
)。
SELECT id, gps, street_name
FROM streets
WHERE street_name LIKE ('%Heavens%') OR (%Road%)
例如,如果更多的术语是LIKE (%1term%) OR (%2term%) OR (%3term%) OR (%4term%)
答案 6 :(得分:0)
正则表达式适合我。
$str = $_GET['words'];
$ commonwords ='a,an,and,I,it,is,do,does,for,from,go,how,the,this,are'; //你不想搜索这些常用词< / p>
$ commonwords = explode(“,”,$ commonwords);
$ str = explode(“”,$ str);
foreach($ str as $ value){ if(!in_array($ value,$ commonwords)){//删除搜索中的常用词
$query[] = $value;
}
}
$query = implode(" ", $query);// generate coma separated values
$ str2 =(explode(“”,$ query)); //将值转换为数组 $ Words = implode('|',array_values($ str2))。''; //生成要搜索的值并生成正则表达式
“SELECT * FROM table_name WHERE keywords
REGEXP'$ Words'”
适用于我,用户搜索多个产品,每个产品用空格分隔。用户不必输入完整的单词
答案 7 :(得分:0)
这是我的PHP解决方案,其中搜索字符串包含多个关键字,可以以任何顺序排列,可以由多个空格分隔,可以重复,必须在找到的关键字数上进行排名,并且SQL注入安全。假设表名为ID为TopicID,主题列中的文本,主题列中的关键字的主题,并且您的mySQL连接为$ dbConn
//convert search string to lowercase - will do case insensitive search later
$words = trim(strtolower($_GET['k']));
//remove punctuation and wildcards
$words = str_replace(array('*', '?', '-', '.', '/', '(', ')', '+', '&'), '', $words);
//turn the string into an array of unique words
$words = array_unique(explode(' ', $words));
//strip the words we are not interested in
$stopWords = array('', '*', '?', 'a', 'about', 'an', 'and','are', 'as', 'at', 'be', 'by', 'for', 'from', 'how', 'in', 'is', 'it', 'of', 'on', 'or', 'that', 'the', 'this', 'to', 'was', 'what', 'when', 'where', 'who', 'will', 'with');
foreach($stopWords as $word) {
if (($key = array_search($word, $words)) !== false) unset($words[$key]);
}
//build SQL statement
$sql = "select TopicText, Score from (select TopicID, 0";
foreach($words as $word) {
if($word>'') $sql .= "+if(Keywords regexp '" . $dbConn->real_escape_string($word) . "',1,0)";
}
$sql .= " as Score from Topics) T join Topics TT on TT.TopicID = T.TopicID where T.Score>0 order by Score desc";
如果您没有包含关键字的列,则可以将TopicText列用作上面的正则表达式目标。
答案 8 :(得分:-4)
$word= $_GET['word'];
if (strpos($word, ' ') !== FALSE) {
$wordArr = explode(' ', $word);
$where = '';
foreach ($wordArr AS $word) {
$where .= " table.keywords LIKE '%{$word}%' OR";
}
$where = trim($where, 'OR');
} else {
$where = "table.keywords LIKE '%{$word}%' ";
}
$query = "SELECT * FROM table WHERE $where";
echo $query;