RSS

Miesięczne archiwum: Marzec 2008

Zobacz Co Się Dzieje Na Twojej Stronie.

Serwis CrazyEgg pozwala “zarejestrować”, co robią użytkownicy naszej strony WWW. Umożliwia stworzenie wizualizacji poszczególnych stron, na których widać miejsca, w które klikali internauci.Serwis jest adresowana do projektantów portali, stron WWW, oraz specjalistów od dostępności.
crazyegg1.png
CrazyEgg śledzi wszystkie kliknięcia, których dokonali użytkownicy. Następnie tworzy dwa rodzaje wizualizacji. Jedna z nich pokazuje, ile było dokładnie kliknięć w poszczególne obszary strony, druga to tzw. heatmap. Dzięki niej, możemy zobaczyć, które obszary są “cieplejsze”, czyli, w których strefach było najwięcej kliknięć. Heatmap swoim wyglądem przypomina obrazy termograficzne.
Aby skorzystać z usług serwisu, wystarczy się w nim zarejestrować, a podczas tworzenia testów skopiować fragment kodu do każdej ze stron serwisu, którą chcemy śledzić. Przykład ( strony crazyegg) uruchomionego testu znajduje się poniżej.
crazyegg2.png

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

crazyegg3.png
 
Leave a comment

Posted by w dniu 28 Marzec, 2008 in HTML, Ogólna

 

Przetestuj swoją stronę WWW w różnych przeglądarkach

Przetestuj swoją stronę WWW w różnych przeglądarkach

Tworząc własną stronę WWW dobrze jest sprawdzić jak wygląda ona w innych przeglądarkach np. Opera,Safari. Najlepiej jest jeszcze sprawdzić jak nasza strona będzie wyglądała w przeglądarkach pracujących pod innymi systemami operacyjnymi ( nie cały świat oparty jest o MS Windows ) Sam osobiście nie miałem okazji testować tego co pisałem na zbyt wielu platformach systemowych.Wykonanie takich testów wymaga czasu ale również znajomości innych systemów operacyjnych. Idealnym rozwiązaniem problemów testowania ( w innych przeglądarkach ) aplikacji internetowych jest Browsershots
Browsershots wykonuje zrzuty ekranu wybranych stron WWW w różnych przeglądarkach. 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.
Wyniki testów.
080323-082913-seamonkey-20-ubuntu-710-605c708b98297fb8b13fd97f816185c8.jpg080323-082802-firefox-30-ubuntu-710-f5d4cd1d91d93d8db2e5d60d1eef2f12.png080323-082941-firefox-15-windows-2000-bfb3ce854af3dd02ecd538572c1a36fc.jpg080323-082953-firefox-15013pre-ubuntu-606-lts-f647d87678b3f965bd47a7cfe7af6f85.jpg
 
Leave a comment

Posted by w dniu 23 Marzec, 2008 in HTML

 

PHP Razem z Oracle – Część I.

Część I – Instalacja Bazy Danych Oracle 10g Express Edition.

Oracle.comBaza 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.

Co nam będzie potrzebne ?

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.

Server Baz Danych


Oracle Database 10g Express Edition (Universal)
Download 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.

 

Wymagania Systemowe:

  • Wymagane wolna przestrzeń dyskowa :
    • Serwer baz danych : 1.6 gigabytes minimum
    • Oprogramowanie klienta:75 megabytes
  • Protokół Sieciowy TCP/IP
  • Pamięć Operacyjna RAM : 256 megabytes minimum, zalecane 512 megabytes
  • Microsoft Windows Installer (MSI) ( jeżeli pobraliśmy pliki z rozszerzeniem MSI ) :MSI version 2.0 lub nowszy ( pobrać można ze strony Microsoft ( http://msdn.microsoft.com/ )
  • Zainstalowana jedna z poniższych przeglądarek internetowych:
  • Microsoft Internet Explorer 6.0 lub nowsza. Sposób konfiguracja podany jest na stronie – Microsoft Internet Explorer
  • Netscape Navigator 7.2 lub nowsza.Sposób konfiguracja podany jest na stronie – Netscape Navigator
  • Mozilla 1.7 lub nowsza.Sposób konfiguracja podany jest na stronie - Mozilla
  • Firefox 1.0 lub nowsza.Sposób konfiguracja podany jest na stronie – Firefox

Instalacja

Przed przystąpieniem do instalacji należy:

  • Zalogować się do systemu ( w moim przypadku MS Windows 2000 ) jako administrator , lub jako użytkownik z uprawnieniami administracyjnymi.
  • Jeżeli poprzednio mieliśmy zainstalowaną poprzednią wersję Oracla ( ale została odinstalowana ) należy usunąć ze zmiennych środowiskowych wpis ORACLE_HOME.
  • Uruchamiamy uprzednio pobrany plik OracleXEUniv.exe.
  • Na ekranie pojawia się okno powitalne instalatora Oracle 10g Express screenshot002.png
  • Klikamy myszką w przycisk “next” – pojawia się okienko z warunkami licencji instalowanego produktu.screenshot003.png
  • Po zaakceptowaniu warunków licencji , należy kliknąć myszką w przycisk “next” od tego momentu rozpoczyna się właściwy proces instalacji. Następnym oknem jest okno z wyborem lokalizacji instalacji bazy danych Oracle 10g.screenshot004.png
  • W trakcie instalacji instalator poprosi nas o podanie hasła dla użytkownika “system” lub “sys” – nazwy podanych użytkowników są nazwami preinstalowanymi czyli takim “wbudowanymi”.screenshot006.png
  • Ostatnim oknem , które jest wyświetlane podczas instalacji jest okno z informacjami dotyczącymi ustawień portów ( Informacja ta jest przydatna w przypadku gdy np. mamy zainstalowane wcześniej inne serwery baz danych, HTPP).screenshot007.png
  • Na tym kończy się proces instalacji bazy danych. Instalator Oracle utworzy grupę “Oracle Database 10g Express Edition” w skład której wchodzą następujące elementy.
    screenshot021.png

Pierwsze uruchomienie.

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.

 

screenshot009.png

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.screenshot010.png

Jako użytkownik należy wpisać – sys, a hasło takie jakie podaliśmy w trakcie instalacji . Jeżeli nie zapomnieliśmy hasła oraz instalacja przebiegła prawidłowo w oknie przeglądarki pojawi się strona taka jak poniżej.
screenshot011.png
Przyznać można , że instalacja Oracle 10g Express Edition nie należy do zbyt trudnych.W następnej części przedstawię jak skonfigurować PHP dla potrzeb Bazy Danych Oracle.Na zakończenie jeżeli już nie chcemy pracować z bazą oraz zależy nam na oszczędności pamięci RAM możemy “zatrzymać ” bazę.Aby to zrobić należy wybrać “Oracle Database 10g Express Edition” -> “Stop Database”. Jeżeli wszystko odbyło się prawidłowo powiniśmy otrzymać komunikat jak poniżej.
screenshot022.png

Uwaga.

Przedstawione zdarzenia działy się pod kontrolą systemu operacyjnego Windows 2000 z zainstalowanym Service Pack 4. Komputer wyposażony 512 Mb pamięci RAM.

 
Leave a comment

Posted by w dniu 21 Marzec, 2008 in Bazy Danych, Oracle

 

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ć...?

 

MySql2MS Exel

W jaki sposób zapisać ( przepisać ) dane z bazy MySQL do arkusza MS Exel.

webdesignCzasami 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();
    ?>

Jest to jedynie przykład , który można adaptować do własnych potrzeb.

 
Leave a comment

Posted by w dniu 7 Marzec, 2008 in MySQL

 

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ć...?

 
 
Follow

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