3

我正在使用以下代码和 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&替换dbname为您用于连接数据库的实际详细信息。尽管我建议您没有将此信息存储在此文件中。最好将连接信息存储在单独的文件中,将其定位在 webroot 之外并在此处“包含”它

3)用您自己的查询替换。这就是我的设置方式,因此您可以查看需要更换的内容..

首先它将搜索字符串重命名为shout(只是为了清楚起见),然后搜索artist表中的列albums,然后匹配自动完成生成artist的搜索term

这种格式重复搜索以下...

name来自albums label来自albums track_name来自tracks

只需将此信息替换为您要搜索的列和表,保存文件并上传即可。

4) 将以下搜索表单添加到pathtoyoursearchenginescript.php指向您的搜索引擎的页面。

<form action="pathtoyoursearchenginescript.php" method="post">
Search: <input type="text" id="suggest" /> <input type="submit" value="Search" />
</form>

5) 假设您已经在页面上加载了所需的 .js 库,您只需将这段代码扔到某个地方就可以了!

<script type="text/javascript">
jQuery(document).ready(function($){
$('#suggest').autocomplete({source:'search.php', minLength:2});
});</script>

注意:上面的代码假定它search.php位于您的 webroot 中,如果不确定您使用文件的正确位置更新它。

希望这对某人有用;)

4

3 回答 3

1

我会用UNION这个。AUNION将删除重复值,因此您不需要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,namelabel列中提取关键字。

于 2013-06-12T03:11:59.880 回答
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);
于 2013-06-12T03:08:57.430 回答
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 中传回更多参数 - 在这种情况下为三个参数,一个用于您要查询的每个值。

于 2013-06-12T03:11:51.410 回答