Postgres.Jak za pomocą PHP pobrać nazwy tabel dostępne w wybranej bazie danych?

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

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.

Opisany 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";
}</div>
$l_odp_nastronie=10;
$l_odp_napasku=5;
$skrypt="index.php?";

// połączenie z bazą
$baza = pg_Connect("dbname=baza1 port=5432 user=uzytkownik");

// ustalenie ilości wszystkich rekordów spełniających warunek
$wynik = pg_Exec($baza, "SELECT count(*) FROM ludzie;");
$l_odp = pg_result($wynik,0,"count");

// pobranie porcji informacji
$start=$a*$l_odp_nastronie;
$wynik = pg_Exec($baza, "SELECT * FROM ludzie
LIMIT $l_odp_nastronie OFFSET $start");
pg_close($baza);

// pokazanie paska nawigacyjnego
pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$skrypt,$a);

// wyświetlenie wyników z bazy danych
$ile = pg_numrows($wynik);
echo $ile."

";
for ($i=0;$i<$ile;$i++) {
  $rekord = pg_fetch_row($wynik, $i);
  for ($j=0; $j
     echo "$rekord&#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

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 OFFSET pokazuje wyniki od określonego numeru rekordu, natomiast LIMIT określa ile tych wyników chcemy pobrać. Ponieważ ilość rekordów na stronie jest stała, wystarczy zmodyfikować tylko OFFSET 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.

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: