2011-06-18 11 views
0

私はPHP/MYSQLとAjaxを使ってGoogleに似た検索エンジンの自動募集を作成しました。私のMySQLに同じ名前の2つの異なるタイトルがある場合、どのようにしてそれらのうちの1つだけを自動尋問に表示するのですか?たとえば、title = ufc 131のフィールドとtitle = ufc 131のフィールドがあります。私がUFC 131を検索すると、どのようにしてそれらのうちの1つしか表示されないのですか?AutoSuggest PHP/MySQLとAjaxを使用

iが使うコード..

<?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>"; 
    } 
?> 
+1

を作るのに役立ちます願っていますあなたはそれが簡単に軽量なJSONデータに

を取得できるようにすることJqueryのようなライブラリを使用することができますJavaScriptで](http://stackoverflow.com/search?q=sql+injection+php) – Ibu

+0

ハァッ?私はSQLインジェクションにはごめんなさい。 – Mdkd

+1

*ユーザー入力を信用しない*。常にユーザーからの文字列をエスケープしてからクエリに使用し、文字列をエスケープしてからユーザーに表示してください。 ['mysql_real_escape_string()'](http://php.net/manual/en/function.mysql-real-escape-string.php)を使用してください。これはあなたの現在の問題ではなく、警告と関連しています。 – rid

答えて

0

さて、あなたは、あなたが、機能、GROUP BYを使用することができDISTINCT関数を使用することができますかあなたもPHPの配列に検索結果のすべてを置くことができますそれをMySQLからフェッチした後、array_unique()関数を使用して重複を除外します。

しかし、データベースに重複が含まれていないことを確認するのに有効な方法はありません。私が言いたいことは、あなたが提案を提供しているので、 'SELECT'要素をできるだけ速くので実行したいということです。上記のようなどんなタイプのトリッキーでも、より多くの時間、より多くのメモリー、およびより多くのCPUを組み合わせる必要があります。したがって、データベースの状態が良好であることを確認して、SELECT文を可能な限りスムーズにする必要があります。これを行う良い方法は、 'Streams'テーブルの 'title'フィールドをユニークなインデックスにすることです。しかし、私が個人的に持っているのは、私の「提案フィールド」のFULLTEXTインデックスです。 UNIQUEインデックスは、確実にデータベースに重複がないことを確認しますが、挿入するために厄介なPHPコードを手に入れることができます。適切なFULLTEXT検索を使用する場合は、FULLTEXT検索(MATCH()AGAINST())を実行できます。これらの検索では索引が使用されるため、すばやく実行されます。あなたのクエリステートメントは、実際にインデックスを使用するインデックスのタイプなしで行います。

さらに、PHP(/ echo)コードを少し更新したいと思うかもしれません。なぜならあなたのコードは本当に小さく、最適に書かれていないからです、検索の提案の場合)。

+0

私は分かりませんので、私のためのコードを行うことができますか?私はちょうど重複を除外したいと思います – Mdkd

+0

@Mdkd:私はあなたのためのコードを行うことができますが、私が言ったように、このバグをあなたのシステムのこの側から消したくないはずです。可能であれば、できるだけ簡単にクエリの末尾の SELECTにコードを保存することを強くお勧めします。情報がで、に正しく入力されていることを確認してください。私がそのコードを手伝うためには、あなたのコードがそのような観点から見えるかどうかを調べる必要があります。 –

0

コードを改訂する必要があります。 自動脆弱性を作成する良い方法は、可能な限り最小限のデータ量を使用することです。 この場合、JSONを使用できます。

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

今すぐあなたのクエリのために、あなたが重複行を持っていないためにMySQLでキーワードBY

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

をGROUPを使用することができます今すぐ返されたデータのためにあなたはJavascriptオブジェクト表記のJSON

でそれを返すことができます
$data = "{"; 
while($row = mysql_fetch_array($sel)) { 
    $data .= '"title":"'.$row['title'].'",'; 
} 
$data .= "}"; 

今はコンテンツをエコーすることができます

echo $data; 

スクリプトが[SQLインジェクション攻撃に対して非常に脆弱である私は、これはあなたが非常に良い自己暗示ボックス

+0

このシステムのDISTINCT機能(私の答えを読んでください)に異論はありませんが、このシナリオではJSONデータがはるかに効率的であることにIbuは同意します。しかし、私はこの方法でコードを書くのではなく、$ row ['title']をrawurlencode()してからJSでunescape()して配列に入れることをお勧めします。それから、JSON.parse()をJSで使用する前に、PHP関数json_encode()を使用してください。これにより、多くの点でパフォーマンスが大幅に向上します。 –

+0

クエリのために置いたコードで私にこのエラーが出る警告:mysql_num_rows():指定された引数は、/vhosts/firemoon.me/httpdocs/script_page.phpの9行目の有効なMySQL結果リソースではありません – Mdkd

+0

私はクエリを更新しました。これはうまくいくはずです – Ibu

関連する問題