2012-05-05 9 views
2

URL検索文字列を使用してMySQL検索結果をフィルタリングしています。ユーザーがリンクの1つをクリックすると、別の変数とともにクエリがアプリケーションに渡され、アプリケーションがデータベースにSQLクエリを作成して実行します。URLクエリ文字列の繰り返しを停止する方法はありますか?

フィルタリングは機能します。ユーザーはジャンル、プラットフォーム別にフィルタリングでき、同時にソートすることもできますが、リンクをクリックするたびに$queryの末尾に別の変数が追加されるという問題があります。例えば

でユーザータイプであれば、フィルター、ジャンルアクションとして選択し、クエリは次のようになります。

keywords=example&genre=action 

しかし、彼らはその後、冒険のジャンルをクリックして言うことができます、クエリは次のようになります。

keywords=example&genre=action&genre=adventure 

変数がすでに設定されている場合、そのクエリを取得する方法はありますか?

$query = mysql_real_escape_string(htmlentities(trim($_SERVER[QUERY_STRING]))); 

<div id="filter_nav"> 
     <ul id="nav_form"> 
      <li><h3 id="h3">Genre: &nbsp;</h3> 
      <li><a href="search.php?'.$query.'&genre=Fighting">Fighting</a></li> 
      <li><a href="search.php?'.$query.'&genre=Role-Playing">Role-Playing</a></li> 
      <li><a href="search.php?'.$query.'&genre=Action">Action</a></li> 
     </ul> 
     <ul id="nav_form"> 
      <li><h3 id="h3">Platform: &nbsp;</h3> 
      <li><a href="search.php?'.$query.'&platform=Playstation 3">PS3</a></li> 
      <li><a href="search.php?'.$query.'&platform=xbox 360">Xbox 360</a></li> 
      <li><a href="search.php?'.$query.'&platform=Gamecube">Gamecube</a></li> 
     </ul> 
     </div> 
     '; 
     echo ' 
     <ul id="sorting_form"> 
      <li><h3 id="h3">SORT BY: &nbsp;</h3> 
      <li><a href="search.php?'.$query.'&order=title">Title</a></li> 
      <li><a href="search.php?'.$query.'&order=release_date">Date</a></li> 
      <li><a href="search.php?'.$query.'&order=rating">Rating</a></li> 

     </ul> 
     '; 

function search_results($keywords){ 
$returned_results = array(); 
$where = ""; 

$keywords = preg_split('/[\s]+/', $keywords); 
$total_keywords = count($keywords); 

foreach($keywords as $key=>$keyword){ 
    $where .= "title LIKE '%$keyword%'"; 
    if($key != ($total_keywords - 1)){ 
     $where .= " AND "; 
    } 
} 
if (isset($_GET['platform']) && !empty($_GET['platform'])){ 
    $platform = mysql_real_escape_string(htmlentities(trim($_GET['platform']))); 
     $where .= " AND platform='$platform'"; 
    } 

if (isset($_GET['genre']) && !empty($_GET['genre'])){ 
    $genre = mysql_real_escape_string(htmlentities(trim($_GET['genre']))); 
       $where .= " AND genre='$genre'"; 
} 

if (isset($_GET['order']) && !empty($_GET['order'])){ 
    $order = mysql_real_escape_string(htmlentities(trim($_GET['order']))); 
    $where .= " ORDER BY $order DESC"; 
    } 

$results ="SELECT * FROM games WHERE $where "; 
+2

あなたは(http://stackoverflow.com/a/9667076/367456)[が正常に新しいURLをbuildiong]であることを防ぎます。 – hakre

+0

[ページング時にURLパラメータを保持する]の複製が可能です。(http://stackoverflow.com/questions/9666909/keeping-url-parameters-during-pagination) – hakre

+0

ありがとう、私は投稿をチェックアウトします。私はしばらく私は間違ったキーワードを使用していたと推測してきた。 – hugoismyname

答えて

-1

などのあらゆる<a>タグに変更します'.$query.'一部を除去 <a href="search.php?'.$query.'&genre=Fighting">Fighting</a> すなわち<a href="search.php?&genre=Fighting">Fighting</a>

にします。

+1

他のすべてのパラメータが緩んでいないでしょうか? – hakre

+1

'すでに設定されている場合、変数を置き換えるクエリを取得する方法はありますか? ' –

2

コードを使用して、parse_urlを使用してクエリ文字列を構成解除し、すべてのリンクに対してhttp_build_queryを使用して再構築することができます。

しかし、個人的には、以前に選択した値があらかじめ選択されている3つの選択ボックスを持つフォームに行きます。

すべての選択オプションを1つの多次元配列に配置し、2重ループを実行できます。

例:

<?php 
$options = array(
    "genre" => array("Fighting", "Role-Playing", ...), 
    ... 
); 
foreach $options as $key => $value) 
{ 
?> 
<select name="<?php echo $key; ?>"> 
<?php 
    foreach ($value as $item) 
    { 
    // echo option for item and mark it selected if necessary 
    } 
?> 
</select> 
<?php 
} 
?> 
+0

興味深い、私はそれを試してみるとあなたに戻ってきます。ありがとう。 – hugoismyname

+0

@hugoismyname問題はありません、フォームを追加してボタンを送信することを忘れないでください... – jeroen

関連する問題