2010-04-28 103 views
0

嘿,我仍然試圖讓我的分頁腳本選擇多個過濾器,但不知道如何做到這一點對於PHP和一般編程非常新。如何允許選擇多個過濾器 - 分頁?

因此,在我的分頁中,當用戶點擊「營銷」按鈕(鏈接)時,它會查詢數據庫僅用於營銷類別。其他2個過濾器按鈕也是如此,如下面的腳本所示。 (汽車,體育)。

問題是,我想能夠選擇多個過濾器,例如只有市場營銷和汽車或汽車和體育,例如,如果我點擊營銷過濾器,然後點擊汽車,它會顯示等於營銷的類別,汽車。

我不知道如何做到這一點,所以我來找專家來幫助我。

這是我工作的腳本:

<h3>Filter results by:</h3> 
<a href='pagi_test.php?category=marketing'>marketing</a> 
<a href='pagi_test.php?category=automotive'>automotive</a> 
<a href='pagi_test.php?category=sports'>sports</a> 
<br /> 

<h3>Results:</h3> 
<?php 

//connecting to the database 
$error = "Could not connect to the database"; 
mysql_connect('localhost','root','root') or die($error); 
mysql_select_db('ajax_demo') or die($error); 

//max displayed per page 
$per_page = 3; 

//get start variable 
$start = $_GET['start']; 

$category = mysql_real_escape_string($_GET['category']); 
//count records 
$record_count = mysql_num_rows(mysql_query("SELECT * FROM explore WHERE category='$category'")); 

//count max pages 
$max_pages = $record_count/$per_page; //may come out as decimal 

if (!$start) 
    $start = 0; 

//display data 
$get = mysql_query("SELECT * FROM explore WHERE category='$category' LIMIT $start, $per_page"); 
?> 
<table width="800px"> 
<?php 
while ($row = mysql_fetch_assoc($get)) 
{ 
// get data 
$id = $row['id']; 
$site_name = $row['site_name']; 
$site_description = $row['site_description']; 
?> 

<tr> 
<td><?php echo $id; ?></td> 
<td><?php echo $site_name; ?></td> 
<td><?php echo $site_description; ?></td> 
</tr> 
<?php 
} 

//setup prev and next variables 
$prev = $start - $per_page; 
$next = $start + $per_page; 

//show prev button 
if (!($start<=0)) 
     echo "<a href='pagi_test.php?category=$category&start=$prev'>Prev</a> "; 

//show page numbers 

//set variable for first page 
$i=1; 

for ($x=0;$x<$record_count;$x=$x+$per_page) 
{ 
if ($start!=$x) 
    echo " <a href='pagi_test.php?category=$category&start=$x'>$i</a> "; 
else 
    echo " <a href='pagi_test.php?category=$category&start=$x'><b>$i</b></a> "; 
$i++; 
} 

//show next button 
if (!($start>=$record_count-$per_page)) 
     echo " <a href='pagi_test.php?category=$category&start=$next'>Next</a>"; 

?> 

任何幫助,在此將是巨大的。謝謝。

- 編輯 -

如果任何人有做多的過濾器比上面的一個分頁系統的更好的方法,請讓我知道。

回答

1

在選擇第二濾波器ü可以添加 類別例如:

在第一回合變量$類別有

$category="Marketing"; 

當與其他類別用戶過濾假設汽車,然後將其與添加到$類別分隔符,現在

$category="Marketing:Automotive"; 

當u訪問直通GET使用爆炸:

$cat=explode(":",$_GET['category']); 

,寫你的條件,其中在UR查詢

$condition="category=category[0]"; 
    for($i=1; $i<sizeof($cat); $i++) 
    { 
     $condition="AND category=$cat[$i]"; 
    } 

$where="WHERE $condition"; 

使用$,像

$record_count = mysql_num_rows(mysql_query("SELECT * FROM explore $where")); 
+0

我不確定如何將分隔符添加/實現到$ category,並將條件放在GET爆炸之下嗎?謝謝。 – NewSOuser 2010-04-28 15:38:31

+0

檢查是否($ category!=''){$ category。=「:automotive」;} – nik 2010-04-28 15:57:36

1

我看到了兩個不同的問題

  1. 如何讓用戶選擇更多比一個類別要過濾
  2. 如何傳播這些選擇到分頁鏈接

每個我都有一個解決方案!

如何讓用戶選擇多個類別由

表單將是最直接的方法來過濾。

<h3>Filter results by:</h3> 
<form action="pagi_test.php" method="GET"> 
    <input type="checkbox" name="category[]" value="marketing" id="cat_marketing"/> 
    <label for="cat_marketing">Marketing</label> 
    <br/> 

    <input type="checkbox" name="category[]" value="automotive" id="cat_automotive"/> 
    <label for="cat_automotive">Automotive</label> 
    <br/> 

    <input type="checkbox" name="category[]" value="sports" id="cat_sports"/> 
    <label for="cat_sports">Marketing</label> 
    <br/> 

    <input type="submit" value="Filter!" /> 
</form> 

現在,$_GET['category']將是選擇的每個類別的數組。

$categories = $_GET['category']; 
$inClause = "'" . implode("','", array_map('mysql_real_escape_string', $categories)) . "'"; 

//count records 
$record_count = mysql_num_rows(
    mysql_query("SELECT * FROM explore WHERE category IN($inClause)") 
); 

當然,你可能想在這裏增加一個檢查,以確保執行查詢之前$categories不是空的。

你需要修改實際的選擇查詢以及

//display data 
$get = mysql_query("SELECT * FROM explore WHERE category IN($inClause) LIMIT $start, $per_page"); 

賓果!現在這部分完成了!

到分頁鏈接

既然我們已經選擇了存儲在$categories類別的數組如何傳播這些選擇,這將使用http_build_query()是微不足道的。

//setup prev and next variables 
$prev = $start - $per_page; 
$next = $start + $per_page; 

// Get the categories in an HTML-safe array 
$requestVars = array_map('htmlspecialchars', $categories); 

//show prev button 
if (!($start<=0)) 
{ 
    $requestVars['start'] = $prev; 
    echo '<a href="pagi_test.php?' . http_build_query($requestVars) . '">Prev</a> '; 
} 

//show page numbers 

//set variable for first page 
$i=1; 

for ($x = 0; $x < $record_count; $x = $x + $per_page) 
{ 
    $requestVars['start'] = $x; 
    if ($start != $x) 
    { 
    echo '<a href="pagi_test.php?' . http_build_query($requestVars) . '">'. $i .'</a> '; 
    } else { 
    echo '<a href="pagi_test.php?' . http_build_query($requestVars) . '"><b>'. $i .'</b></a> '; 
    } 
    $i++; 
} 

//show next button 
if (!($start>=$record_count-$per_page)) 
{ 
    $requestVars['start'] = $next; 
    echo '<a href="pagi_test.php?' . http_build_query($requestVars) . '">Next</a> '; 
} 

現在,這個實現中仍然存在漏洞。

  • 由於<form>被打印到頁面前邏輯的其餘部分,也沒有辦法來預先選擇一個代表當前濾波器的選擇的複選框。你肯定可以改變。
  • 此外,您在PHP腳本中將類別定義爲文字字符串 - 它們在數據庫中的表中確實會更好。
  • 您檢索整個數據集的計數方式效率低下 - 它通過網絡將整個數據集發送到PHP,PHP然後負責確定記錄數。運行使用SELECT count(*) ...代替的單獨查詢要好得多。
相關問題