1

当我发现它没有按照我想要的方式搜索时,我刚刚完成了用户系统的搜索功能。

如果我有一个包含名为“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']) . "%'

我知道会发生这样的事情,但这次我想不通。

谢谢,阿什利

4

6 回答 6

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'])) . "%'
于 2012-04-16T21:42:14.793 回答
0
SELECT fname_lname FROM ( SELECT CONCAT(fname, ' ', lname) fname_lname FROM users ) users
WHERE fname_lname LIKE '%" . $_GET['s'] . "%'
于 2012-04-16T21:48:04.647 回答
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);

可以在http://www.funnenjoy.com上看到它的工作原理

于 2013-11-19T14:04:33.457 回答
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;
于 2012-04-16T21:48:42.777 回答
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()检查字数。如果你有两个词,那么你可以使用这两个新字段,在查询中只给你两个条件。当您只有一个词时,查询中仍有两个条件。

于 2012-04-16T21:50:48.407 回答
0

我会做的

SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) LIKE '%{$search}%'

于 2016-09-22T05:39:33.883 回答