2011-06-28 4 views
3

私は、PHPを使用して、ユーザーが特定のアイテムの写真を探すためにキーワードを入力できるページ上に簡単な検索ボックスを作った。私はMySQLデータベースを使用しています。私は結果をトリミングし、ロードを速くするために10だけを表示しますが、キーワードの特定のセットはブラウザがIEとFirefoxの両方でハングする原因になります。これがIEで起こると、写真をロードしたときと同様に右上に「X」マークが付いた10個の結果を超える写真の輪郭(シルエットのみ)を見ることができ、写真はウェブページ上に存在しません私はコードを書いて10個の結果しか表示しませんでした。データベースには10,000件を超えるエントリーがあり、データベース内のすべての写真を表示しようとしているのかもしれません。ここで私が使用しているいくつかのコードです。検索ページのロードが極端に遅い(MySQLとPHP)

私は以下の関数を使用してクエリを作成しています。 $キーワードは、ユーザーが入力したキーワードの配列です。

function create_multiword_query($keywords) { 
// Creates multi-word text search query 
$q = 'SELECT * FROM catalog WHERE '; 
$num = 0; 
foreach($keywords as $val) { // Multi-word search 
    $num++; 
    if ($num == 1) { 
     $q = $q . "name LIKE '%$val%'"; } 
    else { 
     $q = $q . " AND name LIKE '%$val%'";} 
} 
$q = $q . ' ORDER BY name'; 
return $q; 
//$q = "SELECT * FROM catalog WHERE name LIKE \"%$trimmed%\" ORDER BY name"; 
} 

結果を表示します。 MAX_DISPLAY_NUMは10

$num = 0; 
while (($row = mysqli_fetch_assoc($r)) && ($num < MAX_DISPLAY_NUM)) { // add max search result! 
    $num++; 
    print_images($row['img_url'], '/_', '.jpg'); // just prints photos    
} 

である私は非常にPHPと初心者だけど、私は自分のコードに何かを見つけるように見えることはできません。たぶん、私はこれらのアルゴリズムを書いた方法は、PHPやMySQLのためのかなり適切ではない?あなたたちはこれで私を助けてくれますか?私は必要に応じてより多くのコードを投稿することができます。 TIA !!

+0

皆さん、LIMIT 10はブラウザがフリーズしても動作しないようです。 10件の結果が表示されますが、検索結果ページは10個目の検索結果を超えるXの空白のボックスが表示されています。私はLIMIT 10のステートメントが実際にクエリに含まれていることを確認しています。別の理由がありますか?ところで、ブラウザをフリーズさせるクエリは、合計16個の結果しか返しません。 – musicliftsme

+0

私は何かがwhileループで正しくないと思う。 while($ num == 0)を実行して1つの結果しか表示しない場合、それは最初に説明したのと同じ方法でハングします。私はこれをさらに調べます。 – musicliftsme

+0

HM ..私は、反復回数が限られているforループを試してみました。代わりにmysqli_fetch_row()を使用しましたが、明らかに問題ではありません。私のブラウザをフリーズさせるのはDBからの特定の行です。たとえば、アイテム「A」を返す検索を実行すると、このクエリは検索ボックスに入力された内容に関係なくブラウザをフリーズします。奇妙な..アイテム "A"を検索すると、phpMyAdmin内で問題なく動作します。 – musicliftsme

答えて

5

PHPで検索結果を制限しないでください。LIMITキーワードを使用してSQLクエリに制限してください。

のように:

select * form yourtable where ... order by ... limit 10; 

ところで、これらのLIKE '%something%'は高価なことができます。たぶんFull text indexing and searchingをご覧ください。

More...のリンクなどを表示したい場合は、limitにクエリを入力して最初の10文字のみを表示する方法があります。

+0

LIMITの有無にかかわらず2つのクエリを実行せずに返された値を比較することなく、制限が満たされているかどうかを簡単に知る方法はありますか?限界に達したかどうかをユーザーに知らせたい。 – musicliftsme

+0

このサイトで「[mysql]ページネーション」を検索すると、このタイプのものに関する多くの情報が見つかります。 [ダブルクエリを使用しないMySQLのページネーションですか?](http://stackoverflow.com/questions/818567/mysql-pagination-without-double-querying)にはいくつかの情報があります。 – Mat

1

あなたの質問にLIMITを加えてください。

DBからすべての行を取得しています(DBからサーバーに移動する大量のデータ)。その後、最初の10行がフィルタリングされます。

なぜ返される検索結果の数を制限するために使用するMySQLを使用していない?

$q = $q . ' ORDER BY name LIMIT 10'; 
0

LIKEはまた、Flickr(スライド24~26)に従っても遅い。最初にFULL TEXT indexesを使用するようにしてください。

少しあるだけの事は:あなたのサイトはまだ遅いと思われる場合に利用できる他のいくつかの(ER)本当に速い/人気の選択肢もありますこれらのテクノロジーを学ぶ/インストールする必要があることを迷惑に思いますが、必要に応じて投資価値があります。

関連する問題