我在PHP
中构建一个简单的搜索引擎,用户在搜索时从MySQL数据库中检索动物名称。
说我有下表:
ID | Name
---------------
1 | Red panda
2 | Okapi
3 | Red fox
当用户输入"panda"
时,它会返回Red Panda
行,当他们输入"red panda"
时,会再次返回Red Panda row
。
但是当用户输入"red"
时,它什么都不返回。
但是,搜索"Okapi"
确实有效。
出于某种原因,搜索由多个单词组成的多个单词中的第一个单词并不会返回任何内容。
我用来查找数据的查询如下:
"SELECT * FROM example_table WHERE Name LIKE '%%$search'"
答案 0 :(得分:1)
你可以像这样使用它:
"SELECT * FROM example_table WHERE Name LIKE '%".$search."%'";
答案 1 :(得分:1)
如果您需要查找包含您正在搜索的内容的任何内容,则应在查询中%
之前和之后使用$search
通配符。
因此你应该这样做:
$query = "SELECT * FROM example_table WHERE Name LIKE %$search%";
您当前使用的方式仅匹配其末尾有$search
的值。
例如:
ID | Name
---------------
1 | Red panda
2 | Okapi
3 | Red fox
4 | kaok // added for examples
匹配%ka
:
不会返回任何内容,因为kaok
和Okapi
在ka
之后有一些内容。通过此查询,您正在寻找带有表达式开始的所有内容;
匹配%ka%
:
将同时返回kaok
和Okapi
。通过此查询,您可以查找包含表达式的所有内容;
匹配ka%
:
仅返回kaok
。通过此查询,您正在寻找表达式结束的所有内容。
查看关于模式匹配的MySQL Dev guide。
当然,正如Elzo Valugi所指出的,在他的回答中你需要记住清理你的输入以避免SQL注射。
答案 2 :(得分:0)
您在相似字符串的开头放置了一个通配符,因此您可以在搜索字词中找到结束的所有名称。
要搜索包含的所有名称,搜索字词会在相似字符串的末尾添加一个通配符:
LIKE '%$search%'
答案 3 :(得分:0)
它不返回任何内容,因为您的SQL查询需要稍微修改:
更改此
"SELECT * FROM example_table WHERE Name LIKE '%%$search'"
到此:
"SELECT * FROM example_table WHERE Name LIKE '%$search%'"
通过在搜索到的字符串的两边添加%,您的数据库将查找将该单词插入其中的任何列值。
请告诉我这是否为您解决了问题,或者是否还有其他问题!
答案 4 :(得分:0)
试试这个
%wildcard应该是这样的
$query = "SELECT * FROM example_table WHERE Name LIKE '%$search%'";
答案 5 :(得分:0)
附注,请勿将用户输入直接聚合到SQL查询。这是完全不安全的做法并导致SQL注入,事实上这里显示的所有示例都是不好的做法。使用binding参数可以使用mysqli或PDO创建查询。
$search = "%". "your_search_term" . "%";
$sth = $dbh->prepare('SELECT *
FROM example_table
WHERE name like :search');
$sth->bindParam(':search', $search, PDO::PARAM_STR, 12);
$sth->execute();
答案 6 :(得分:0)
选择查询一直存在问题。您只需要更改选择查询。
select * from tbl_pets where name like "%'".$data."'%"
和真正的mysql查询
select * from tbl_pets where name like "%red%"
你可以看看这里。我已经创建了你可以检查的模式。