AutoSuggest使用PHP / MySQL和Ajax

| 因此,我使用PHP / MYSQL和Ajax为我的搜索引擎创建了类似于Google的自动建议。如果我的MySQL具有2个同名的不同标题,我如何仅使其中之一出现在自动建议中?例如:我有一个标题为ufc 131的字段,另一个标题为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>\";
    }
?>
    
已邀请:
        好吧,您可以使用DISTINCT函数,可以使用GROUP BY函数,或者甚至可以在从MySQL中获取所有搜索结果后,将所有搜索结果放入PHP数组中,然后使用array_unique()函数过滤出重复项。 但是,这没有效率比确保数据库不包含任何重复项有效。我的意思是,由于您正在提供建议,因此您希望\'SELECT \'元素尽可能快地运行。像我上面列出的那样,任何类型的欺骗都会需要更多的时间,更多的内存和更多的CPU。因此,您要做的是确保数据库处于良好状态,以便SELECT语句尽可能平滑。一个很好的方法是使\'Streams \'表中的\'title \'字段成为UNIQUE索引。但是,我个人拥有的是“建议字段”中的FULLTEXT索引。 UNIQUE索引将确保确保数据库中不会有任何重复项,但是所有这些操作都使您摆脱了用于插入的草率PHP代码。如果使用正确的FULLTEXT搜索,则可以执行FULLTEXT搜索(MATCH()AGAINST())。由于这些搜索使用索引,因此执行速度更快。您的查询语句将不使用任何索引类型来实际使用索引。 最重要的是,您可能还想稍微更新一下PHP(/ echo)代码,这是因为,尽管您的代码确实很小,但它并不是以最佳方式编写的(在这种情况下,您需要确保这一点)搜索建议)。     
        您的代码需要修改。 进行自动建议的一种好方法是使用尽可能少的数据。 因此,在这种情况下,您可以使用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数据 我希望这可以帮助您制作一个很好的自动提示框     

要回复问题请先登录注册