当我发现它没有按照我想要的方式进行搜索时,我刚刚完成了用户系统的搜索功能。
如果我有一个名为'fname'和'lname'的2列的数据库表。
在一行中,'fname'的值为'Ashley','lname'的值为'Staggs'。
我可以搜索'Ashley'或'Staggs',我会正确地得到结果,但是如果我搜索'Ashley Staggs',则不会显示任何结果。
我该如何正确地做到这一点?
我的SELECT查询如下:
SELECT * FROM `users` WHERE fname LIKE '%" . protect($_GET['s']) . "%' OR lname LIKE '%" . protect($_GET['s']) . "%'
我知道这样的事情会发生,但这次我无法理解。
谢谢, 阿什利
答案 0 :(得分:3)
'Ashley Staggs'既不是fname,也不是lname,所以你的请求不会返回任何内容。您可以尝试连接MySQL字段:
SELECT * FROM `users` WHERE fname LIKE '%" . $_GET['s'] . "%' OR lname LIKE '%" . $_GET['s'] . "%' OR CONCAT(fname, ' ', lname) LIKE '%" . $_GET['s'] . "%'
[编辑] 更好:
SELECT * FROM `users`
WHERE REPLACE(CONCAT(fname, lname, fname), ' ', '')
LIKE '%" . str_replace(' ', '', protect($_GET['s'])) . "%'
答案 1 :(得分:0)
SELECT fname_lname FROM ( SELECT CONCAT(fname, ' ', lname) fname_lname FROM users ) users
WHERE fname_lname LIKE '%" . $_GET['s'] . "%'
答案 2 :(得分:0)
你可以尝试这样的事情 - 它只是用空格分割搜索字符串并搜索每个单词:
$search = explode(' ', $_GET['s']);
$query = 'SELECT * FROM `users` WHERE 0';
foreach ($search as $v)
{
$v = mysql_real_escape_string($v);
$query .= " OR (`fname` LIKE '%{$v}%' OR `lname` LIKE '%{$v}%')";
}
// echo $query;
答案 3 :(得分:0)
关于sp00m的答案,我的方法略有不同,但建立在相同的概念上。
$search = preg_replace ( "/\s\s+/" , " " , $_GET['s']);
然后使用此查询:
"SELECT * FROM `users` WHERE CONCAT(fname, ' ', lname) LIKE '%" . $search . "%' OR CONCAT(lname, ' ', fname) LIKE '%" . $search . "%'"
修改强>
刚才有一个想法可以使用。基本上,您可以在表格中创建另外两个字段 - fname_lname
和lname_fname
,使用我之前提到的正则表达式来消除不必要的空格,使用explode()
来检查字数。如果您有两个单词,那么您可以使用这两个新字段,在查询中只提供两个条件。如果只有一个单词,则查询中仍有两个条件。
答案 4 :(得分:0)
MyISAM
表
代码是
$q="you search string";
$searchArray = explode(" ", $q);
$query="SELECT * FROM cmusers WHERE MATCH (`firstname`, `lastname`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
$result=mysql_query($query) or die("Error founded:".mysql_error()."there is problem existing we feels a very great sorry");
$finded=mysql_num_rows($result);
看到这方面的工作
答案 5 :(得分:0)
我会做的
SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) LIKE '%{$search}%'