Nasıl birden fazla seçilebilir filtreleri izin - pagination?

2 Cevap php

Hey, ben yine birden fazla filtreleri Sayfalandırması komut dosyası için seçilmesine izin çalışıyorum ama emin değilim nasıl yapılacak genel olarak php ve programlama için çok yeni olması.

Bir kullanıcı 'pazarlama' düğmesini (link) tıkladığında Yani benim numaralandırılmasında, sadece pazarlama = kategori için veritabanını sorgular. Aynı aşağıdaki komut görüldüğü gibi diğer 2 filtre düğme için de geçerlidir. (Otomotiv, spor).

Sorun, ben pazarlama filtreyi tıklatın ve sonra otomotiv, o eşit pazarlama kategorileri görüntülemek ve otomotiv olsaydı, örneğin yalnızca pazarlama ve auomotive veya otomotiv ve spor gibi birden fazla filtre seçmek için güçlü olmak istiyorum, bir.

Bunu gerçekleştirmek için nasıl hiçbir fikrim yok, bu yüzden bana yardım için uzmanlara gelmiş.

Bu üzerinde çalışıyorum betik:

<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>";

?>

Bu konuda herhangi bir yardım büyük olurdu. Teşekkür ederim.

-- EDIT --

Herkes yukarıda olandan çoklu filtre ile bir Sayfalandırması sistemi yapmanın daha iyi bir yöntem varsa, lütfen bana bildirin.

2 Cevap

While selecting second filter u can add the category ex:

İlk başta ur değişken $ kategori vardır

$category="Marketing";

Başka bir kategori ile kullanıcı filtre otomotiv sonra Şimdi, bir Ayraç ile $ kategoriye eklemek varsayalım zaman

$category="Marketing:Automotive";

u GET kullanımı aracılığıyla erişirken patlayabilir:

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

ve durumu yazmak

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

$where="WHERE $condition";

gibi, ur sorguda nerede $ kullanın

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

Ben iki ayrı sorunlarını görmek

  1. Kullanıcı tarafından filtrelemek için bir kategori daha fazla seçmek için izin nasıl
  2. Sayfa bağlantıları için bu seçimler yaymak nasıl

Ben bir çözüm var her biri için!

Kullanıcı tarafından filtrelemek için bir kategori daha fazla seçmek için izin nasıl

Bir form en direkt yaklaşım olacak.

<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>

Şimdi, $_GET['category'] seçildi her kategoride bir dizi olacak.

$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)" )
);

Tabii ki, muhtemelen sorguyu çalıştırmadan önce emin $categories boş değil yapmak için burada bir çek eklemek isterdim.

Siz de gerçek seçimi sorguyu değiştirmek gerekir

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

Bingo! Şimdi bu kısmı yapılır!

Sayfa bağlantıları için bu seçimler yaymak nasıl

Biz zaten $categories saklanan seçilen kategorilerden bir dizi olduğundan, bu http_build_query() kullanarak önemsiz olacaktır.

//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> ';
}

Şimdi, bu uygulama delikleri hala var.

  • <form> sayfanın mantığı before kalanı yazdırılır yana, geçerli filtre seçimleri temsil onay kutularını önceden seçmek için hiçbir yolu yoktur. Hangi kesinlikle değişebilir.
  • Ayrıca, PHP komut dosyası dizeler gibi kategoriler var - onlar gerçekten veritabanında kendi tabloda daha iyi olurdu.
  • Eğer tüm veri kümesi için bir sayısını almak yolu verimsiz - o zaman kayıt sayısını belirlemek için sorumlu olduğu, PHP tel üzerinden tüm veri setini gönderir. Bu SELECT count(*) ... yerine kullanan ayrı bir sorgu çalıştırmak için daha iyidir.