MySQL&PHP.Jak zrobić uniwersalne porcjowanie wyników na stronie, aby nie pokazywała się cała zawartość bazy danych?

MySQL. Jak zrobić uniwersalne porcjowanie wyników na stronie, aby nie pokazywała się cała zawartość bazy danych?

webdesignProblem

Chcesz wyniki zapytania do bazy danych podzielić na porcje, aby użytkownik mógł przeglądać kilka mniejszych stron z wynikami zamiast jednej ogromnej. Chcesz decydować ile odpowiedzi znajdzie się na każdej ze stron i jak długi będzie pasek nawigacyjny.

webdesignRozwiązanie

Porcjowanie wyników zapytania to podstawowa czynność podczas pracy z bazami danych, gdy wyniki przekraczają 30 rekordów. Niektóre bazy danych liczą nawet kilkaset tysięcy wpisów i pokazanie ich wszystkich na jednej stronie WWW nie jest możliwe.Zamiast pokazywać po kilkaset wyników, można je łatwo porcjować. Nie jest ważne co porcjujesz – mogą to być wpisy na forum, dedykacje w księgach gości, informacje o książkach lub zawartość katalogu produktów w jakimś sklepie.

webdesignOpisany poniżej skrypt nie tylko świetnie porcjuje dowolne zapytania do baz danych, ale jest niesamowicie elastyczny. Możesz ustawiać ilość danych przypadających na jedną stronę, przekazywać dodatkowe zmienne podczas przechodzenia pomiędzy stronami czy ustalać jak szeroki (np. od 1 do 10) będzie pasek służący do poruszania się pomiędzy stronami z wynikami.

Dodatkowo oprócz klikania na poszczególne strony możesz wykorzystać pola „następna” i „poprzednia”, które automatycznie przenoszą o jedną stronę do przodu lub do tyłu. Zobacz jak napisać uniwersalny skrypt do porcjowania wyników:

function pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a) {
  $l_odp_podz = intval($l_odp / $l_odp_nastronie);
  $l_odp_podz_mod = $l_odp % $l_odp_nastronie;
  if ($l_odp_podz_mod>0) $l_odp_podz++;
  if ($a<0) $a=0;
  if ($a>=$l_odp_podz) $a=$l_odp_podz-1;
  $start = $a-1;
  if ($a>0) {$pop="<a href="https://webdesk.wordpress.com/wp-admin/%5C%22%22.$skrypt.%22a=$start%5C%22"><<<
    poprzednia</a> -  ";}
  else {$pop = "<font color="gray"><<< poprzednia </font> -  ";}
  if ($a<$l_odp_napasku) {$koniec = $l_odp_napasku*2+1;}
    else {$koniec = $a+$l_odp_napasku+1;}
  if ($a<=$koniec-$l_odp_napasku) {$star=$a-$l_odp_napasku;}
  if ($a>=$l_odp_podz-$l_odp_napasku) {$star=$l_odp_podz-$l_odp_napasku*2-1;}
  if ($koniec>$l_odp_podz) $koniec = $l_odp_podz;
  if ($star<0) $star=0;
  for ($i=$star; $i<$koniec; $i++) {
    if ($i <> $a) { $pasek .= "<a href="https://webdesk.wordpress.com/wp-admin/%5C%22%22.$skrypt.%22a=$i%5C%22">";}
      else {  $pasek .= "<font color="red"><b>"; }
    if ($l_odp_podz<>1) {$pomocniczy = $i+1;}
    if ($i<>$a) { $pasek .= "$pomocniczy</b></font></a><font color="red"><b>  "; }
      else {$pasek .= "$pomocniczy</b></font>  ";}
  }
  $dalej = $a+1;
  if ($a<$l_odp_podz-1)
   {$nas="- <a href="https://webdesk.wordpress.com/wp-admin/%5C%22%22.$skrypt.%22a=$dalej%5C%22">następna >>> </a>";}
    else { $nas = "- <font color="gray">następna >>> </font>";}
  if ($pomocniczy>0) {$br= "
 $pop $pasek $nas"; }
  echo " znalezionych: <b>$l_odp</b> na <b>$l_odp_podz</b>
    stronach $br";
}$l_odp_nastronie=10;
$l_odp_napasku=5;
$skrypt="index.php?";
// połączenie z bazą
$baza = mysql_connect("localhost", "admin", "admin");
mysql_select_db("baza1",$baza);

// ustalenie ilości wszystkich rekordów spełniających warunek
$wynik = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ludzie"));
$l_odp = $wynik[0];

// pobranie porcji informacji
$start=$a*$l_odp_nastronie;
$wynik = mysql_query("SELECT * FROM ludzie LIMIT
  $start,$l_odp_nastronie",$baza);
mysql_close($baza);
// pokazanie paska nawigacyjnego
pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a);

// wyświetlenie wyników z bazy danych
$wierszy = mysql_num_rows($wynik);
$pol = mysql_num_fields($wynik);
for ($i=0;$i<$wierszy;$i++) {
  $wiersz = mysql_fetch_row($wynik);
  for ($j=0;$j<$pol;$j++) echo $wiersz&#91;$j&#93;." ";
  echo "
";
}
?>

Działania funkcji pasek() opisywać nie będę, ponieważ algorytm jest dosyć złożony i zależy od wielu warunków. Generalnie wszystko jest czystą matematyką. Funkcja rozbija liczbę wszystkich odpowiedzi na poszczególne składowe, a więc liczbę stron, aktualną pozycję czy ilość cyfr w menu. Obliczenia są uzależnione od wielu czynników i warunków początkowych.

Ważne aby do funkcji pasek() przekazać pięć zmiennych:

$l_odp – liczba wszystkich rekordów w bazie (możliwych odpowiedzi)

$l_odp_nastronie – liczba rekordów na jednej stronie

$l_odp_napasku – liczba cyfr na pasku – wystarczy podać tylko połowę planowanej liczby zwiększonej o jeden, np. 5 to w rzeczywistości 11 cyfr (1,2,3,4,5),6,(7,8,9,10,11). Określa ona ilość cyfr po prawej i lewej stronie względem środka.

$skrypt – nazwa skryptu bez parametrów np. index.php? lub z dodatkowymi parametrami index.php?x=123&c=sort&.

$a – zmienna określająca numer strony z wynikami – to właśnie ona określa, która porcja wyników będzie pokazana.

Warto poeksperymentować z różnymi opcjami aby dostować skrypt do własnych potrzeb. Opcje są bardzo elastyczne i z powodzeniem można skrypt zastosować do dowolnych projektów.

Funkcja pasek() tak na prawdę nie porcjuje wyników… Tworzy ona jedynie pasek do nawigacji pomiędzy stronami z wynikami i ustala zmienną $a. Właściwe porcjowanie zachodzi na etapie zadawania pytania SQL do bazy danych.

Polecenie LIMIT wywołane z dwoma parametrami pokazuje wyniki od numeru rekordu z pierwszego parametru. Drugi parametr określa ile tych wyników chcemy pobrać. Ponieważ ilość rekordów na stronie jest stała, wystarczy zmodyfikować tylko pierwszy parametr aby uzyskać np. piątą dziesiątkę wyników.

Liczbę odpowiedzi przypadających na stronę podajemy pod funkcją pasek(), ustalamy tam również liczbę cyfr na pasku i skrypt (oraz ewentualne parametry jakie ma przekazywać). Brakuje jeszcze ilości wszystkich rekordów. Pierwsze pytanie SQL pobiera brakującą ilość rekordów (COUNT(*)). Jeżeli liczba rekordów w tabeli nie zmienia się, możesz tą wartość przypisać na stałe i usunąć dwie linijki skryptu.

Gdy masz już wszystkie zmienne można zadać właściwe pytanie. Następnie wyświetlany jest pasek nawigacyjny i wybrana porcja wyników. Kolejność może być dowolna – najpierw porcja wyników, a na dole pasek nawigacyjny.

Jak widzisz, bez problemu można w ten sposób przeglądać bazy danych o tysiącach czy setkach tysięcy rekordów. Wszystko odbywa się szybko i bardzo wygodnie dla użytkownika.

Pytanie SQL nie musi zwracać wszystkich rekordów – może zawierać dodatkowe warunki np. sortowanie i wyszukiwanie rekordów.

 

Skomentuj

Please log in using one of these methods to post your comment:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: