AutoSuggest使用PHP / MySQL&阿贾克斯

时间:2011-06-18 03:53:52

标签: php mysql ajax autosuggest

所以我使用PHP / MYSQL和Ajax为我的搜索引擎创建了类似于Google的自动提示。如果我的MySQL有2个不同的同名标题,我怎么才能让它们中的一个出现在autosuggest上?例如:我有一个title = ufc 131的字段和另一个title = ufc 131的字段。当我搜索UFC 131时,我怎么只得到其中一个来显示?

我使用的代码是..

<?php
    include('conn.php');
    $str = strtolower($_GET['content']);
    if(strlen($str))
    {
        $sel = mysql_query("select * from Streams where title like '".trim($str)."%'");
        if(mysql_num_rows($sel))
        {
            echo "<table border =\"0\" width=\"100%\">\n";
            if(mysql_num_rows($sel))
            {
                echo "<script language=\"javascript\">box('1');</script>";
                while($row = mysql_fetch_array($sel))
                {
                    $country = str_ireplace($str,"<b>".$str."</b>",($row['title']));
                    echo "<tr id=\"word".$row['title']."\" onmouseover=\"highlight(1,'".$row['title']."');\" onmouseout=\"highlight(0,'".$row['title']."');\" onClick=\"display('".$row['title']."');\" >\n<td>".$country."</td>\n</tr>\n";
                }
            }
            echo "</table>";
        }
    }
    else
    {
        echo "<script language=\"javascript\">box('0');</script>";
    }
?>

2 个答案:

答案 0 :(得分:0)

那么,你可以使用DISTINCT函数,你可以使用GROUP BY函数,或者甚至可以在从MySQL获取它然后使用array_unique()函数过滤后将所有搜索结果放在PHP中的数组中重复。

但是这一切都不如确保数据库不包含任何重复项有效。我的意思是,由于您提供了一个建议,您希望'SELECT'元素尽可能快地运行 。任何类型的技巧,如我上面列出的那些,都需要更多时间,更多内存和更多CPU的组合。因此,您要做的是确保数据库处于良好状态,以便SELECT语句尽可能顺利。执行此操作的一种好方法是使“Streams”表中的“title”字段成为UNIQUE索引。但是,我个人拥有的是我的“建议字段”中的FULLTEXT索引。 UNIQUE索引将确保数据库中不会有任何重复项,但是所有这一切都可以让您轻松获得插入的PHP代码。如果使用正确的FULLTEXT搜索,则可以进行FULLTEXT搜索(MATCH()AGAINST())。由于这些搜索使用索引,因此执行速度更快。您的查询语句将没有任何类型的索引实际使用索引。

最重要的是,你可能还想更新你的PHP(/ echo)代码,原因是,虽然你的代码很小,但它没有最佳编写(这也是你想要确定的东西,在搜索建议的情况下)。

答案 1 :(得分:0)

您的代码需要进行修改。 自动提示的一个好方法是使用尽可能少的数据。 因此,在这种情况下,您可以使用JSON

include('conn.php');
$str = strtolower($_GET['content']);
$str = mysql_real_escape_string($str); // escape to prevent sql injection

现在查询,您可以在mysql中使用GROUP BY关键字来重复行

$sel = "SELECT title FROM Streams
        WHERE title LIKE '{$str}%'
        GROUP BY title 
        LIMIT 10";

现在,对于返回的数据,您可以使用Javascript对象表示法JSON

返回它
$data = "{";
while($row = mysql_fetch_array($sel)) {
   $data .= '"title":"'.$row['title'].'",';
}
$data .= "}";

现在您可以回复内容

echo $data;

在您的javascript中,您可以使用Jquery之类的库来轻松检索轻量级json数据

我希望这可以帮助你制作一个非常好的自动提示盒