我正在使用以下代码和Jquery自动填充功能来填充我网站上的搜索建议..
$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);
$data = array();
if ( $results && mysql_num_rows($results) )
{
while( $row = mysql_fetch_array($results, MYSQL_ASSOC) )
{
$data[] = array(
'label' => $row['artist'],
'value' => $row['artist']
);
}
}
echo json_encode($data);
flush();
这工作正常,但我希望能够在多个列中搜索各种结果,例如 -
来自艺术家列
来自名称列
标签列
我花了2个小时阅读大量不同的方法来完成它,但是没有一个方法适合我正在尝试做的事情,而且我无法正确格式化查询。
有人有任何建议吗?
- 以下编辑添加解决方案 -
这是我设法让它工作的原因,感谢Ed的建议以防其他人试图这样做。
这将从2个不同的表中搜索4个不同的列,并将用户键入的搜索词与在任何表中找到的任何内容匹配,同时删除重复的结果。这与JQuery Autocomplete完美配合,以及如何设置它。
1)创建以下php文件并将其命名为search.php
<?php
if ( !isset($_REQUEST['term']) )
exit;
$connect = mysql_connect('dbhost', 'dbusername', 'dbpassword') or die( mysql_error() );
mysql_select_db('dbname');
$results = mysql_query('SELECT artist AS shout FROM albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT name FROM albums WHERE name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT label FROM albums WHERE label LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" UNION SELECT track_name FROM tracks WHERE track_name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY 1 LIMIT 10', $connect);
$data = array();
if ( $results && mysql_num_rows($results) )
{
while( $row = mysql_fetch_array($results, MYSQL_ASSOC) )
{
$data[] = array(
'label' => $row['shout'],
'value' => $row['shout']
);
}
}
echo json_encode($data);
flush();
?>
2)在新脚本中,替换dbhost
,dbusername
,dbpassword
&amp; dbname
包含用于连接数据库的实际详细信息。 虽然我建议您没有将此信息存储在此文件中。将连接信息存储在单独的文件中要好得多,在webroot之外找到它并在此处“包含”
3)用您自己的查询替换查询。这就是我的设置方式,以便您可以看到需要更换的内容..
首先,它将搜索字符串重命名为shout
(仅为了清晰起见),然后搜索表artist
中的列albums
,然后将artist
与搜索{匹配} {1}}由自动填充功能生成。
此格式重复搜索以下内容......
来自term
的 name
来自albums
的{{1}}
来自label
albums
只需将这些信息替换为列&amp;您要搜索的表格,保存文件并上传。
4)将以下搜索表单添加到track_name
指向您搜索引擎的页面。
tracks
5)假设您已经在页面上加载了所需的.js库,您可以在某处完成这一段代码,然后就完成了!
pathtoyoursearchenginescript.php
注意:上面的代码假定您的webroot中有<form action="pathtoyoursearchenginescript.php" method="post">
Search: <input type="text" id="suggest" /> <input type="submit" value="Search" />
</form>
,如果不确定您使用文件的正确位置更新此代码。
希望这对某人有用;)
答案 0 :(得分:1)
我会使用UNION
。 UNION
会删除重复的值,因此您不需要DISTINCT
关键字:
SELECT artist FROM mm_albums WHERE artist LIKE <value>
UNION SELECT name FROM mm_albums WHERE name LIKE <value>
UNION SELECT label FROM mm_albums WHERE label LIKE <value>
ORDER BY 1 LIMIT 10
这会从artist
,name
和label
列中提取关键字。
答案 1 :(得分:0)
$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" or name LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" or label LIKE "'. mysql_real_escape_string($_REQUEST['term']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);
答案 2 :(得分:0)
这样的事情可以满足您的需求:
$results = mysql_query('SELECT DISTINCT artist FROM mm_albums WHERE artist LIKE "%'.
mysql_real_escape_string($_REQUEST['artist']) .'%" OR name LIKE "%'.
mysql_real_escape_string($_REQUEST['track']) .'%" OR label LIKE "%'.
mysql_real_escape_string($_REQUEST['label']) .'%" ORDER BY artist ASC LIMIT 0,10', $dbcon);
您还需要在REQUEST中传回更多参数 - 在这种情况下为三个,每个值对应您要查询的值。