RSS

Archiwum kategorii: Jak w PHP zrobć…?

PHP triki

Właściwe Pytania – Właściwe Odpowiedzi

Niektórzy z nas osiągają wielkie cele, aktywnie zmieniają swój świat. Inni nie osiągają nic, niekiedy nawet nie wytrzymują trudów życia. Pełna odpowiedź na pytanie dlaczego tak się dzieje, nie jest możliwa. Musiałaby sięgnąć spraw, które są poza zasięgiem naszego poznania i możliwości oddziaływania. Jednak o własnych osiągnięciach wystarczająco dużo możemy powiedzieć trzymając się tego, na co mamy wpływ.Jednym z kluczowych problemów z kręgu naszego wpływu jest sposób interpretacji i oceny naszych życiowych doświadczeń. Ktoś mądry powiedział, że Doświadczenie to nie to co nam się przydarza, lecz to, co robimy z tym, co nam się przydarza!
Nasza ocena i znaczenie przypisywane wydarzeniom determinuje decyzje, jakie podejmujemy. To w konsekwencji prowadzi do określonych działań oraz ich skutków, czyli tworzy treść naszego życia oraz w dużym stopniu określa naszą przyszłość i przeznaczenie.
Ustalając oceny zawsze świadomie lub podświadomie zadajemy sobie pytania i odpowiadamy na nie.Tak! Początkiem są pytania! Załóżmy, ze przytrafił się nam jakiś duży problem. Pytanie: Dlaczego mnie się to przydarzyło? – rodzi następstwa w postaci irytacji, odczucia krzywdy, narastającego stresu, emocjonalnego przytłoczenia, poczucia przygnębienia i niemożności znalezienia rozwiązania.Brakuje sił, nie ma pomysłów na wyjście z tej trudnej sytuacji. Często również długoterminowe skutki podobnych pytań bywają bardzo przykre.
Pytanie:

Co w tej sytuacji jest dobrego? – koncentruje nas na pozytywnych aspektach tego wydarzenia. Nie pozbawia sił, ale stwarza szansę ich odrodzenia i wzmocnienia. Stwarza też możliwość zadania następnych dobrych pytań i wyjścia z kryzysowej sytuacji. Niewłaściwe pytania prowadzą do niewłaściwych odpowiedzi. Właściwe pytania to możliwość wypracowania dobrych rozwiązań. To szansa na osiągnięcie pożądanych rezultatów. Pytania to początek procesów o ogromnej sile: destrukcyjnych i bolesnych lub pozytywnych, twórczych i satysfakcjonujących.
Czyli, lepsze pytania tworzą lepsze życie! Pierwszy z wyborów prowadzących do lepszego życia pojawia się w naszej głowie z pierwszym pytaniem. Pierwszy i najważniejszy, bo wyznaczający kierunek w którym pójdziemy! Jakie więc pytania są dobre? Jakie zmuszą nas do pracy nad rozwiązaniem problemów?

Jedno już mamy:

  • Co w tej sytuacji jest dobrego?

Następne:

  • Co muszę zmienić/poprawić, by sprawy zaczęły układać się po mojej myśli?
  • Jak tego dokonać? Co konkretnie musi być zrobione i w jaki sposób?
  • Co muszę zrobić samodzielnie?
  • W czym mogę uzyskać pomoc i od kogo?
  • Jak mogę to zrobić najlepiej?

Zacznij od tych pytań i nie ustawaj, póki nie znajdziesz po trzy odpowiedzi na każde z nich. Potem zadawaj następne dobre pytania.

Dobre pytania zaczynają się od Jak…, nie od Dlaczego…

A potem działaj. Działaj! Działaj!!
Nie zapominaj też o pytaniu:

W jaki sposób mogę cieszyć się życiem, idąc ku moim celom?

Krzysztof Pietraszek
http://www.superumysl.pl
Artykuł pochodzi z serwisu
Artelis.pl

 
Leave a comment

Posted by w dniu 25 Maj, 2008 in Ogólna, Praca - Zawsze Coś Nowego.

 

Tagi:

Java – Zadania Testowe .Ciąg Dalszy

Praca – Ankiety,Testy Sprawdzające

webdesignKolejny zadanie to już Java. Treść jest następująca :D okonać implementacji zamiany cyfr zapisanych w systemie dziesiętnym , na cyfry zapisane w systemie rzymskim.

  • 1 – I;
  • 2 – II;
  • 3 – III;
  • 4 – IV;
  • itp, itd.

Treść tematu testu w języku angielskim

Implement a program which can take an integer and convert it into a Roman Numeral string.
e.g.

1 = “I”
5 = “V”
19 = “XIX”
101 = “CI”
The function should be capable of converting every number between 1 and 3999.

Przeliczanie wg. mnie wygląda tak:

public static String evaluate(int value)
   {
      StringBuffer ret = new StringBuffer();

value = doThousands(value, ret);
      value = doHundreds(value, ret);
      value = doTens(value, ret);
      doOnes(value, ret);

return ret.toString();
   }

private static int doThousands(int value, StringBuffer buff)
   {
      int ret = value;
      int subtract = 0;

while (value >= 900)
      {
         if(value >= 1000)
         {
            buff.append("M");
            subtract += 1000;
            value -= 1000;
         }
         else if(value >= 900)
         {
            buff.append("CM");
            subtract += 900;
            value -= 900;
         }
      }

return ret - subtract;
   }

private static int doHundreds(int value, StringBuffer buff)
   {
      int ret = value;
      int subtract = 0;

while (value >= 90)
      {
         if(value >= 500)
         {
            buff.append("D");
            subtract += 500;
            value -= 500;
         }
         else if(value >= 400)
         {
            buff.append("CD");
            subtract += 400;
            value -= 400;
         }
         else if(value >= 100)
         {
            buff.append("C");
            subtract += 100;
            value -= 100;
         }
         else if(value >= 90)
         {
            buff.append("XC");
            subtract += 90;
            value -= 90;
         }
      }

return ret - subtract;
   }

private static int doTens(int value, StringBuffer buff)
   {
      int ret = value;
      int subtract = 0;

while (value >= 9)
      {
         if(value >= 50)
         {
            buff.append("L");
            subtract += 50;
            value -= 50;
         }
         if(value >= 40)
         {
            buff.append("XL");
            subtract += 40;
            value -= 40;
         }
         else if(value >= 10)
         {
            buff.append("X");
            subtract += 10;
            value -= 10;
         }
         else if(value == 9)
         {
            buff.append("IX");
            subtract += 9;
            value -= 9;
         }
      }

return ret - subtract;
   }

private static void doOnes(int value, StringBuffer buff)
   {
      while (value > 0)
      {
         if(value >= 5)
         {
            buff.append("V");
            value -= 5;
         }
         else if(value == 4)
         {
            buff.append("IV");
            value -= 4;
         }
         else if(value < 4)
         {
            buff.append("I");
            value -= 1;
         }
      }
   }

 

Jednak okazuje się ,że w tym fragmencie mam błąd.

 
Leave a comment

Posted by w dniu 12 Marzec, 2008 in Praca - Zawsze Coś Nowego.

 

CMS – Jaki wybrać ?

CMS – Jaki wybrać ?
webdesignCoraz więcej osób, które korzystają z Internetu, chciałoby również w nim zaistnieć. Możliwości jest wiele , ale nic tak nie zaznaczy naszej obecności w Sieci jak własna strona WWW.Wielu użytkowników internetu obawia się jednak, że samodzielne utworzenie i opublikowanie witryny jest bardzo trudne. Z prostymi stronami poradzą sobie nawet początkujący użytkownicy komputerów , ale co jeśli chcemy utworzyć stronę , która wchodzi w interakcję z użytkownikiem ? Są to już zaawansowane portale utworzymy za pomocą tzw. CMS-ów (Content Management Systems – Systemy Zarządzania Treścią). Ich główną ideą jest to, że składają się one z zestawu narzędzi, z których – tak jak z klocków – budujemy witrynę.

Utworzenie zaawansowanej witryny nie musi się wiązać ze znajomością tajników HTML-a i języków skryptowych.

Właśnie tego typu stwierdzenie często się słyszy – “nie trzeba nic znać wystarczy tylko umieć pisać” . Więc jaki wybrać CMS dla osoby , która nie mam zielonego pojęcia o HTML’u , PHP, MySQL itp, itd ? , a tym bardziej ,że uzytkownikami tego systemu mają być dzieci ( portal edukacyjny ) .

Co prawda znam osobiście “bardzo poważne” strony instytucji Państwowych , które chyba były budowane przez początkujących “webmasterów” ale to już inna historia.

Zlecenie na wykonanie portalu dla dzieci ( i obsługiwanego przez starsze dzieci ) wygląda w następujący sposób :

  • Możliwość zapisu publikowania treści w dwóch ( wersja Light ) językach .

Jedna ale jak ważna funkcjonalność – jednoczesny zapis artykułu w dwóch językach bez zbędnych komplikacji ( Oczywiście artykuł lub materiał był uprzednio przygotowany w dwóch językach ).

Powtarzam,nie chodzi tutaj o obsługę menu,kalendarz ale o jednoczesne zapis treści w dwóch językach. Przeglądałem możliwości większości CMS ( ranking CMS-ów na stronie www.opensourcecms.com ) , ale najbardziej odpowiednim wydaje się być PHP BP ( http://www.phpbp.com/ )

Testując ten system nie musiałem się wykazać ,żadną znajomością HTML , PHP – wyjątkiem jest BBcode , ale to jest tak proste ,że i dziecko w wieku 10 lat nie ma problemu z napisaniem “newsa”.

webJednym słowem Polacy bardzo wiele potrafią. System PHP BP oczywiście zostanie wykorzystany do budowy nowego portalu , ale po dokonaniu zmian w wyglądzie.
 
1 Comment

Posted by w dniu 11 Marzec, 2008 in Praca - Zawsze Coś Nowego.

 

Praca – Ankiety,Testy Sprawdzające

Praca – Ankiety,Testy Sprawdzające

webdesignKolejny raz otrzymałem do wypełnienia ankietę od firmy , która chciałby podjąć współpracę ze mną. Ostatnio otrzymałem sporo takich ankiet do wypełnienia , ale jakoś to zainteresowanie współpracą gaśnie… Znając życie i realia Polski to “łowcy głów” wymieniają się swoimi zdobyczami . Na szczęście ta oferta nie pochodzi z Polski. Poza standartowymi pytaniami w stylu “od kiedy mógłby Pan… ?”, “Czy ma Pan rodzinę…?” najciekawsze są zawsze testy sprawdzające wiedzę przytoczę to co mam obecnie do zaimplementowania. Jak w swoim CV napisałem ,że pisałem w Javie w PHP no i gdzieś tam po drodze w ASP więc dostałem następujące zadania:

 

Zadanie #1:

How using checkboxes to update multiple database entries – ASP implementation .

webdesignTak naprawdę to nie za bardzo “czuję się” dobrze w tworzeniu w ASP ( ASP NET ) , ale uważam ,że należy odpisać na wszelkiego rodzaju przesyłane propozycje pracy ( współpracy ) nigdy nic nie wiadomo – mój znajomy zmieniła pracę i otoczenie z Polskich klimatów na Norweskie i nie narzeka inny jeszcze przeprowadził się na Islandię i bardzo sobie chwali. Ale ja na razie “udzielam” się Holendrom i też nie narzekam.

 

Najprościej będzie chyba tak:

<%@ Language=VBScript %>
<%option explicit%>
<%Response.Buffer = false%>

<%
dim iNum        'the number of checkboxes to generate
dim strAll      'a comma delinated list of all the values
dim i           'a loop counter
dim arrAll      'an array which will hold all of the values
dim arrVals       'an array to hold all checked values
dim arrInactive() 'an array to hold all unchecked values
dim bThere       'a boolean match variable
dim IDX          'an index variable
dim strSql       'the resulting SQL string
dim z            'a loop counter

iNum = Request.QueryString ("numBoxes")                             ‘Test :Use - URL - Box.asp?numBoxes=9 - Ok! work
if iNum = "" then
    iNum = 10
end if
if Request.Form = "" then
    strAll = ""
%>

<form name="form1" action="Box.asp" method="post">
<table><%
  for i = 1 to iNum
%><tbody>
<tr>
<td>Checkbox<%=i%>:</td>
<td></td>
</tr>
<% 'append the id to strAll
strAll = strAll & i & ","
next
%>
<tr>
<td colspan="2"></td>
</tr>
</tbody></table>
<%
'trim off the trailing ","
strAll = left(strAll, (len(strAll) -1))
%></form><%
else
   'get the array with all of the checkbox id's    arrAll = split(Request.Form ("allBoxes"), ",")
    'get the array with the id's that were ticked

arrVals = split(Request.Form ("chkBox"), ",")

strSql = ""
    strSql = strSql & "UPDATE aTable SET status = 4 WHERE "

'loop through the checkboxes which were ticked

for i = 0 to ubound(arrVals)
      if i = 0 then
         strSql = strSql & "id = "& arrVals(i)
      else
       'only add the " AND " if this is not the first value
       strSql = strSql & " AND id = "& arrVals(i)
      end if
    next

Response.Write strSql & "

<hr />"%>

 

Zadanie #2.

“Roman numerals” – Implement (Java ) a program which can take an integer and convert it into a Roman Numeral string.
e.g.
1 = “I”
5 = “V”
19 = “XIX”
101 = “CI”
The function should be capable of converting every number between 1 and 3999.
CDN…

 
Leave a comment

Posted by w dniu 9 Marzec, 2008 in Ogólna, Praca - Zawsze Coś Nowego.

 

PHP.Sesje

Sesje (ang. session) w PHP

Pewnie każdy wie czym są sesje, ale dla pewności pozwolę sobie zacytować wstęp z manuala na temat sesji:

Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony. Pozwala to na budowanie bardziej spersonalizowanych aplikacji i zwiększenie atrakcyjności twojej strony internetowej.

Mechanizm ten umożliwia on przekazywanie parametrów między stronami w łatwy sposób. Zmienne są przechowywane po stronie serwera a u klienta trzymane jest tylko ID sesji. Te ID jest zapisane w cookie lub przekazywane przez URL. PHP jest w stanie sam rozpoznać czy na komputerze klienta włączony jest mechanizm cookies i w razie potrzeby dodać identyfikator sesji do każdego URLu i formularza. Wymaga to jednak posiadania PHP skompilowanego z opcją –enable-trans-sid.

Po otrzymaniu żądania klienta PHP automatycznie (jeśli w konfiguracji PHP włączona została opcja auto_start) lub “ręcznie” przez programistę (za pomocą funkcji session_start()) sprawdza, czy przypisano już ID sesji. Jeśli tak, to PHP odczytuje zmienne zarejestrowane w tej sesji. Jeśli nie, generowany jest nowy, unikalny identyfikator sesji. Aby PHP zaczęło śledzić wartość zmiennej, najpierw trzeba ją zarejestrować za pomocą funkcji session_register(var).
Istnieje też odwrotna wersja tej funkcji – funkcja session_unregister(var) powoduje, że PHP “zapomni” o tej zmiennej.Jako przykład podamy ile osób odwiedziło daną stronę w czasie trwania jednej sesji.


<?php
session_start(); /* można pominąć jeśli jest się pewnym że włączona jest opcja auto_start */

if (!isset($_SESSION['count'])) { // jeśli zmienna nie jest zarejestrowana
  $_SESSION['count'] = 0; // przypisz jej początkową wartość
} else { // jeśli jest zarejestrowana
      $_SESSION['count']++; // zwiększ jej wartość
}

echo 'Strona odczytana '.$_SESSION['count'].' razy w ciągu tej sesji';

?>

 
Leave a comment

Posted by w dniu 8 Marzec, 2008 in Jak w PHP zrobć...?

 

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="http://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="http://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="http://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[$j]." ";
  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.

 

 
Leave a comment

Posted by w dniu 7 Marzec, 2008 in Bazy Danych, Jak w PHP zrobć...?

 

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="http://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="http://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="http://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[$j]  ";
  }
  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.

 
Leave a comment

Posted by w dniu 7 Marzec, 2008 in Bazy Danych, Jak w PHP zrobć...?

 

Postgres. Jak wypisać na ekranie w PHP zawartość dowolnej tabeli?

Jak wypisać na ekranie w PHP zawartość dowolnej tabeli?

webdesignProblem

Chcesz wykonać dowolne zapytanie SQL (np. pobrać zawartość całej tabeli) i wypisać wynik zapytania (czyli zawartość rekordów) na ekranie.

webdesignRozwiązanie

To chyba najczęściej wykorzystywany fragment kodu w komunikacji z bazą danych. Pozwala wynik zapytania SQL wypisać na ekranie w postaci rekordów z tabeli. Oto gotowy kod programu:

<?php
$pyt="SELECT * FROM pracownicy";
$baza = pg_Connect("dbname=jakasbaza port=5432 user=uzytkownik");
$wynik = pg_Exec($baza, $pyt);
pg_close($baza);
$ile = pg_numrows($wynik);
for ($i=0;$i<$ile;$i++) {
  $rekord = pg_fetch_row($wynik, $i);
  for ($j=0; $j
     echo "$rekord[$j]  ";
  }
  echo "
";
}
?>

 
Leave a comment

Posted by w dniu 7 Marzec, 2008 in Bazy Danych, Jak w PHP zrobć...?

 
 
Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.