

Darmowa wersja CrazyEgg pozwala śledzić cztery strony oraz do 5 tys. wizyt miesięcznie.



Darmowa wersja CrazyEgg pozwala śledzić cztery strony oraz do 5 tys. wizyt miesięcznie.

Jest to darmowy serwis z otwartym kodem źródłowym, którego autorem jest Johann C. Rocholl. Gdy podasz adres strony WWW, zostanie on dodany do kolejki zleceń. Rozproszona sieć komputerów otworzy zadaną stronę w dostępnych na nich przeglądarkach internetowych. Następnie komputery te wykonają zrzut ekranu i wyślą go na centralny serwer.
Baza danych Oracle od dawna słynie z wyjątkowej stabilności, wydajności i… ceny! Jednak po wydaniu wersji, oznaczonej symbolem 10g, producent zdecydował się na zaskakujący krok, udostępnił jedną z nich – Express Edition – bezpłatnie. Otworzyło to przed twórcami aplikacji sieciowych możliwości wykorzystania tego doskonałego produktu w projektach niskobudżetowych. Wszędzie tam, gdzie klienci oczekują zaplecza bazodanowego zbudowanego w oparciu o sprawdzony system i nieprzychylnie reagują na rozwiązania open-source, można dziś zaproponować Oracle Database 10g Express Edition.
Nie należy się przerażać nazwy Oracle, która kojarzy się nam przede wszystkim – z bazą danych z ogromną ilością poleceń, plików konfiguracyjnych i wiadomości, jakie należy posiąść, by móc wykorzystać możliwości tej bazy danych. Tymczasem wiedza niezbędna do komfortowej pracy z serwerem Oracle nie jest wiedzą tajemną dostępną jedynie dla komputerowych guru. Rosnąca popularność Oracle powoduje, że jego znajomość staje się sporym atutem na rynku pracy. Warto więc poświęcić trochę czasu na opanowanie go.
Aby cokolwiek zrobić należy w pierwszej kolejności zainstalować serwer baz danych Oracle 10g Express Edition. Oprogramowanie możemy pobrać ze strony Oracle:
http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html
Uwaga
Aby pobrać niezbędne oprogramowanie niezbędna jest wcześniejsza rejestracja.
Serwer baz danych Oracle 10g dostępny jest na następujące platformy systemowe – czyli można go zainstalować na :
* Windows 2000 Service Pack 4
* Windows Server 2003
* Windows XP Professional Service Pack 1 lub nowszy
* Red Hat Enterprise Linux RHEL3 , RHEL4
* Suse SLES-9
* Fedora Core 4
* Red Flag DC Server 5.0/MIRACLE LINUX V4.0/Haansoft Linux 2006 Server
* Debian 3.1
Uwaga
Dla poprawnej instalacji bazy danych Oracle w środowisku Linux wymagane są następujące komponenty:
* glibc release 2.3.2
* libaio release 0.3.96
Osobiście wybrałem wersję dla MS Windows . Czyli już wiemy na jakim systemie będziemy instalować Oracle teraz należy zaakceptować warunki licencji i pobrać odpowiednie pliki – ja wybrałem uniwersalne wersje instalacyjne.
Oracle Database 10g Express Edition (Universal) OracleXEUniv.exe (216,933,372 bytes) Multi-byte Unicode database for all language deployment, with the Database Homepage user interface available in the following languages: Brazilian Portuguese, Chinese (Simplified and Traditional), English, French, German, Italian, Japanese, Korean and Spanish.
Przed przystąpieniem do instalacji należy:






Po pomyślnym zainstalowaniu bazy danych instalator “zapyta użytkownika – Czy uruchomić moduł administracji”
Uwaga
Administracja bazą danych odbywa się za pomocą strony www która dostępna jest jedynie lokalnie.

Wynik instalacji można samodzielnie sprawdzić wpisując w przeglądarce następujący adres http://127.0.0.1:8080/apex.
Po uruchomieniu w oknie przeglądarki pojawia się strona ( lokalna ) administracji bazy danych Oracle 10g Express Edition.


Przedstawione zdarzenia działy się pod kontrolą systemu operacyjnego Windows 2000 z zainstalowanym Service Pack 4. Komputer wyposażony 512 Mb pamięci RAM.
Praca – Ankiety,Testy Sprawdzające
Kolejny zadanie to już Java. Treść jest następująca
okonać implementacji zamiany cyfr zapisanych w systemie dziesiętnym , na cyfry zapisane w systemie rzymskim.
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.
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 :
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”.
Jednym słowem Polacy bardzo wiele potrafią. System PHP BP oczywiście zostanie wykorzystany do budowy nowego portalu , ale po dokonaniu zmian w wyglądzie.Praca – Ankiety,Testy Sprawdzające
Kolejny 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 .
Tak 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.
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';
?>
W jaki sposób zapisać ( przepisać ) dane z bazy MySQL do arkusza MS Exel.
Czasami istnieje potrzeba zaimportowania danych z MySQL ponieważ , ludzie pracujący w biurach używają różnego rodzaju arkuszy kalkulacyjnych , najczęściej jednak ( ja się spotkałem ) jest to MS Exel. No i jeżeli szef prosi o jakieś zestawienie na “już” to… Tutaj znajduje się przykład jak stworzyć raport w MS Exelu z danymi pobranymi z MySQL’a
<?php
require("DB.php");
$excel_handle = new COM("excel.application");
$excel_handle->Visible = false;
$worksheet = $excel_handle->workbooks->add();
$values = array("Name", "Salary", "Time of Employment");
for ($i = 1; $i < 4; ++$i) {
$cell = &$worksheet->Cells(1, $i);
$cell->value = $values[$i - 1];
}
$dbh = new DB;
$dbh->connect("mssql://username:password@localhost/empreports");
$sth = $dbh->query("SELECT * FROM empnames WHERE salary='salary'");
$idx = 2;
while ($row = $dbh->fetchRow($sth, DB_GETMODE_ASSOC)) {
$values = array($row['name'], $row['Salary'], $row['toe']);
for ($i = 0; $i < 4; ++$i) {
$cell = &$worksheet->Cells($idx, $i);
$cell->value = $values[$i - 1];
}
}
$dbh->disconnect();
$worksheet->SaveAs("emp_reports-$salary.xls");
$excel_handle->quit();
?>MySQL. Jak zrobić uniwersalne porcjowanie wyników na stronie, aby nie pokazywała się cała zawartość bazy danych?
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.
Rozwią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";
}$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.
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.
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.
Rozwią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 "";
}
?>
$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.