Авто-поиск с использованием PHP / MySQL и Ajax - PullRequest
0 голосов
/ 18 июня 2011

Итак, я создал автозаполнение для своей поисковой системы, похожее на Google, используя PHP / MYSQL и Ajax. Если мой 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>";
    }
?>

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Ваш код должен быть обновлен.Хороший способ сделать самовнушение - использовать минимально возможный объем данных.Так что в этом случае вы можете использовать JSON .

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

Теперь для вашего запроса вы можете использовать ключевое слово GROUP BY в mysql, чтобы не иметь повторяющихся строк

$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

Надеюсь, это поможет вам создать очень хорошую коробку самовнушения

0 голосов
/ 18 июня 2011

Ну, вы можете использовать функцию DISTINCT, вы можете использовать функцию GROUP BY, или вы даже можете поместить все свои результаты поиска в массив в PHP после извлечения его из MySQL, а затем с помощью функции array_unique () отфильтровать из дубликатов.

Но все это не так эффективно, как проверка того, что база данных не содержит дубликатов. Я хочу сказать, что, поскольку вы предоставляете предложение, вы хотите, чтобы элемент SELECT выполнял максимально быстро . Любой тип хитрости, такой как те, что я перечислил выше, потребует комбинации большего количества времени, большего объема памяти и большего количества ЦП. Поэтому вы должны убедиться, что база данных находится в хорошем состоянии, чтобы операторы SELECT могли быть как можно более плавными. Хороший способ сделать это - сделать поле title в вашей таблице Streams уникальным индексом. Однако то, что я лично имею, - это индекс FULLTEXT в моем «поле для предложений». Индекс UNIQUE гарантирует, что в базе данных точно не будет дубликатов, но все, что с этим связано, позволит вам получить небрежный PHP-код для вставки. Если вы используете правильный поиск FULLTEXT, вы можете выполнять поиск FULLTEXT (MATCH () AGAINST ()). Так как эти поиски используют индекс, они выполняются НАМНОГО быстрее. Ваш оператор запроса будет без индекса на самом деле использовать индекс.

Кроме того, вы, вероятно, также захотите немного обновить свой код PHP (/ echo), потому что, хотя ваш код действительно небольшой, он не написан оптимально (что опять же, то, что вы ХОТИТЕ убедиться, в случае поисковых предложений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...