publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
7 skomentuj »

TAGI: php , xml , mysql , ajax , księga gości

2008-09-17 12:55  |  Piotr Ostalecki

Księga gości w technologii Ajax

Księga gości w technologii Ajax

W tym artykule pokażemy, jak utworzyć księgę gości, w której będzie można dodać swój wpis i przeglądać inne bez uciążliwego przeładowywania strony. Wykorzystamy w tym celu zdobywającą coraz większą popularność technologię Ajax.

Niemal każdy słyszał o Ajaksie. Wykorzystywany jest on obecnie w bardzo wielu witrynach, niemniej bardzo rzadko jego zastosowanie wychodzi poza podstawowe aplikacje. Istnieje jeszcze niewiele stron, które dzięki wyeliminowaniu ciągłego przeładowywania strony zaczynają upodabniać się do aplikacji desktopowych. Pomyślmy, o ile mniej wygodne są interfejsy poczty na niektórych dużych polskich portalach niż ten, który znamy z Gmaila, gdzie wszystkie wiadomości ładują się bardzo szybko i bez ciągłego odświeżania strony.

Podobnie będzie działała nasza księga gości, w której dodawanie nowych wpisów, a także przewijanie stron z tymi już istniejącymi będzie odbywało się dzięki:

  1. wysłaniu ajaksowego zapytania,
  2. generowaniu kodu XML przez skrypt PHP,
  3. parsowaniu tego kodu za pomocą JavaScriptu.

Na razie brzmi to być może nieco zawile, ale nie jest zbyt trudne w realizacji, o czym będzie się można przekonać, czytając dalej nasz artykuł.

Zanim zaczniemy

Musimy pobrać kilka zewnętrznych bibliotek. O ile w prostych zastosowaniach zdecydowanie wystarczy standardowy (rozpowszechniany we wszystkich kursach) kod zaczynający się od var xmlHttp, my zastosujemy gotową bibliotekę jkl-parsexml (do pobrania stąd: http://www.kawa.net/works/js/jkl/parsexml-e.html). Dzięki niej przesłanie zapytania, a następnie analizę wynikowego kodu XML upchniemy do dosłownie kilku linijek kodu.

Zastosujemy także dzieło polskich programistów – bibliotekę Alladyn (http://alladyn.art.pl/pol/Alladyn.zip). Jest ona darmowa do zastosowań niekomercyjnych i pozwala na łatwą realizację obsługi warstw – bez martwienia się o to, jaką przeglądarkę ma użytkownik. Na koniec pobierzmy (lub też poprośmy o to naszego administratora) bardzo przydatną bibliotekę PEAR – XML_Query2XML, która posłuży do przekształcania wyników zapytań do baz danych bezpośrednio w pliki XML. Będziemy potrzebowali także bibliotek MDB2 oraz MDB2_driver_mysqli. Warto wspomnieć o tym, że skrypt będzie działał tylko pod PHP w wersji 5 lub wyższej. Jeśli na Twoim serwerze nadal pracuje starsza wersja PHP, namów administratora do upgrade'u – rozwój popularnej „czwórki” już się bowiem zakończył.

Baza danych

Przed rozpoczęciem kodowania utworzymy prostą tabelę w bazie danych MySQL. Uruchamiamy program phpMyAdmin i przechodzimy do przydzielonej bazy danych, a następnie wydajemy polecenie utworzenia nowej tabeli o nazwie kgosci z pięcioma polami, które tworzymy według poniższej tabeli oraz załączonego zrzutu ekranu.

Nazwa pola

Typ

Atrybuty

Typ klucza

Id

smallint

„unsigned” „auto_increment”

podstawowy

Autor

Varchar(150)

 

 

Tresc

Mediumtext

 

 

Czas

Int

 

 

Email

Varchar (150)

 

 

Tabela: Schemat tworzenia nowej tabeli w MySQL-u.

 
Rysunek 1: Schemat tworzenia nowej tabeli w MySQL-u.

Po dodaniu bazy danych możemy, korzystając z przycisku Dodaj, umieścić w tabeli kilka przykładowych wpisów do księgi. Warto to zrobić, gdyż zdecydowania ułatwi to później pisanie kodu i sprawdzanie jego poprawności.

Pobieranie wpisów

Zaczniemy od pliku getxml.php, który będzie pobierał odpowiednie 10 wpisów do księgi gości z bazy danych. Po pobraniu zostaną one zwrócone w postaci pliku XML.

<?php
require_once 'XML/Query2XML.php';
require_once 'XML/Query2XML/Callback.php';
require_once 'MDB2.php';

$mdb2 = MDB2::factory('mysqli://<uzytkownik>:<haslo>@<serwer>/<baza danych>');
//przykładowo: $mdb2 = MDB2::factory('mysqli://ala:kot@localhost/baza_ali');

if (PEAR::isError($mdb2)) {
    die($mdb2->getMessage());
}

$mdb2->query("SET NAMES 'utf8'");   
$res = $mdb2->query("SELECT id FROM kgosci");   
$wpisow = $res->numRows();
$res->free();

if (!isset($_POST['od']))
    $od = 0;
else if (($wpisow-(intval($_POST['od'])))< 1 )
    $od = ($wpisow-10);
else
    $od = intval($_POST['od']);

Listing 1. Plik getxml.php, część pierwsza.

Na początku dołączone zostają odpowiednie biblioteki ze zbioru PEAR i wykonywane jest połączenie z bazą danych – należy pamiętać o wpisaniu w odpowiednie miejsca właściwych danych użytkownika. Następnie ustawiane jest właściwe kodowanie danych przesyłanych przez MySQL, a do zmiennej $wpisow pobierana jest liczba wszystkich wpisów w tabeli – przyda się nam to do ustalenia, od jakiego identyfikatora (id) pobrane zostaną wpisy, a także do wygenerowania odpowiednich linków, za pomocą których użytkownik będzie mógł przeglądać starsze wpisy.

Kolejny blok kodu (duża instrukcja warunkowa) określa, które dziesięć wpisów zostanie pobrane. Jest to uzależnione od parametru od – w wypadku jego braku wyświetlane jest dziesięć pierwszych. Gdyby jego wartość była natomiast taka, że nie zostałby wyświetlony żaden wpis, zmienna $od zostanie tak skorygowana, aby wyświetlić dziesięć ostatnich. W przeciwnym razie (czyli gdy wszystko jest w porządku) wyświetlone zostają dokładnie te wpisy, które zostały wskazane przez parametr od.

Druga część kodu odpowiedzialna jest za pobranie z bazy odpowiednich wpisów i wygenerowanie zbioru XML.

function konwertuj ($rekord) {
        return date("d.m.y @ G:H",$rekord[czas]);
}
$query2xml = XML_Query2XML::factory($mdb2);
$dom = $query2xml->getXML(
        false,
        array(   
            'encoder' => false,   
            'rootTag' => 'ksiega_gosci',
            'idColumn' => false,
            'rowTag' => 'dane',
            'elements' => array(      
                'ilosc_wpisow'=>':'.$wpisow,
                'wpisy'=>array(
                    'sql' => "SELECT * FROM kgosci ORDER BY id DESC LIMIT ".$od." , 10",
                    'rootTag' => 'wpisy',
                    'rowTag' => 'wpis',
                    'idColumn' => 'id',
                    'elements' => array(
                        'id',
                        'autor',
                     'tresc',
                        'czas' => "#konwertuj()",
                        'email'
                    )   
                ),
            )
        )
);

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
header('Content-Type: application/xml');
$dom->formatOutput = true;
echo $dom->saveXML();
$mdb2->disconnect();
?>

Listing 2. Plik getxml.php, część druga.

Na początku deklarujemy krótką funkcję konwertuj(), która zamieni pobrany z bazy danych czas w formacie timestamp na format przyjazny i czytelny dla człowieka. W następnej kolejności zostaje utworzony obiekt klasy Query2XML, któremu jako argument podajemy ogromną tabelę, określającą to, jak ma wyglądać wynikowy plik XML. O wszystkich możliwościach tej tabeli można by napisać całkiem duży artykuł, dlatego też teraz wytłumaczę tylko kilka absolutnych podstaw.

Komenda rootTag to klucz główny, obejmujący wszystkie dane – u nas nazywa się on ksiega_gosci. Zawiera dwa elementy (tablica elements): liczbę wszystkich wpisów w księdze wyrażoną jako dane statyczne (niepochodzące z bazy danych i oznaczane dwukropkiem) oraz kolejny rootTag, zawierający wiersze (rowTagi) z wpisami do księgi. Wierszy będzie tyle, ile zostanie zwróconych rekordów po wykonaniu zapytania SQL. Każdy wiersz (rowTag) będzie natomiast zawierał takie elementy, jak m.in. id czy autor. Pole czas, przed przekazaniem do wynikowego zbioru XML, zostanie przesłane do funkcji konwertuj (oznacza się to znakiem #).

Uważnego Czytelnika zdziwi zapewne to, że funkcję konwertuj deklarowaliśmy za pomocą parametru, wywołujemy ją natomiast bez niego. Otóż wywołując dowolną funkcję z poziomu listy elementów (jak w wierszu: 'czas' => "#konwertuj()"), jako pierwszy parametr przekazywany jest automatycznie cały węzeł XML (u nas: jeden wpis do księgi) w postaci tablicy asocjacyjnej.

Pozostaje już tylko ustawienie odpowiednich nagłówków, które zapobiegną cache'owaniu pliku XML przez przeglądarki, oraz ustalenie parametru Content-Type. Włączamy formatowanie i wyświetlamy wynikowy XML. Efekt działania jest następujący:


Rysunek 2: Schemat Wygenerowany plik XML.

«poprzednia 1 2 3 następna »

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
7 skomentuj »

Polecamy

Reklama

Komentarze

  • ziemowit

    #1 ziemowit 2008-09-17 21:16:56 0

    Czy naprawde konieczne było użycie tych wszystkich bibliotek do prostej księgi gości? Czy autor chce odstraszyć początkujących programistów?

    A przecież wystarczyłoby mysqli zamiast PEAR, JSON zamiast XML-a. Byłoby szybciej i łatwiej.

    Nazewnictwo funkcji pożal się Boże. Dodaj, Konwertuj, Rozjasnij, Schowaj, Chowaj, Dopisz - autor za tydzień sam nie będzie pamiętał o co chodziło. Taki serwis jak ten powinien dawać przykład jak się powinno pisać, a nie chwalić się ilością obsługiwanych frameworków.

    None

  • Deancraft

    #2 Deancraft 2008-09-18 08:36:11 0

    A gdzie jest w tym Ajax?!?

    None

  • dAREuS

    #3 dAREuS® 2008-09-18 09:27:25 0

    @ziemowit: idąc tym tropem, równie dobrze można by pobrać jakąś księgę gości z HotScripts i mieć spokój. Bardziej chcieliśmy pokazać komunikację z bazą danych bez przeładowywania strony WWW i parsowanie XML. Księga gości to tylko przykład. Funkcje faktycznie mogłyby się nazywać lepiej.

    None

  • ziemowit

    #4 ziemowit 2008-09-18 15:34:50 0

    @dAREuS:

    Proponuję więc zmienić tytuł artykułu na "Jak zrobić stronę bez przeładowywania z wykorzystaniem PEAR, Alladyn i parsowaniem XML na przykładzie księgi gości".

    Ja naprawdę lubię tu zaglądać...

    None

  • starr

    #5 starr 2008-09-18 22:39:46 0

    Liczenie znaków jakie pozostały do wpisania w formularzu niestety nie działa jak trzeba, może poprawicie to !

    None

  • Kartofelek

    #6 Kartofelek 2008-10-31 08:02:20 0



    ????

    Swoja droga lepiej bylo by skorzystac w takim artykule z jquery czy podobnie znanej. Tam przeciez wykorzystanie ajaxa to tez bułeczka.

    None

  • <a title="projektowanie stron internetowych Piła" href="http://www.strony-internetowe.pila.pl">tworzenie stron www Piła</a>

    #7 tworzenie stron www Piła 2011-03-07 10:57:59 0

    Ciekawe rozwiązanie

    http://www.strony-internetowe.pila.pl

    IP: 62.21.51.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15

Uwaga! Możesz zarejestrować się w serwisie i w ten sposób zarezerwować swój nick oraz ominąć konieczność ciągłego odczytywania wyrazów.

Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł