webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Zarządzanie danymi bez zewnętrznej bazy danych

autor: Łukasz Nawojczyk, ostatnia modyfikacja: 2007-11-15

szukaj: phpJustDiBi phpJustDiBi pseudo baza danych pseudo baza danych pliki pliki

Gdy bazie danych mówimy "NIE"...

Gdy plik tekstowy to za mało, a baza danych to zbyt wiele, trzeba znaleźć jakiś kompromis. Powiedzmy, że chcemy, aby nasza witryna posiadała Księgę Gości. Jednak przeraża nas fakt, że firma hostingowa narzuca dość przykre limity dla naszej bazy w MySQL. Przecież bazę danych chcemy wykorzystywać do wykonywania skomplikowanych zapytań i do składowania ważnych dla informacji naszych stron. Księga Gości - fajna sprawa, ale czy ma ona bezpośredni związek z naszą stroną? Czy nie lepiej byłoby nie zabałaganić naszej bazy tekstami typu „Lol... zajefana stronka!:) – Kasia12 z Pomorza"? A przecież tyle niewykorzystywanego miejsca dyskowego można by na to spożytkować...

Dodatkowo możemy pozbyć się problemów z konfiguracją dostępu do bazy czy kłopotów z kopiowaniem danych z jednego serwera na drugi.

Jak się za to zabrać?

Nasz powyższy pomysł zrealizuję przy pomocy phpJustDiBi (http://dev.klikersi.pl/projects/phpJustDiBi). Ten zestaw klas (w praktyce wykorzystamy tylko jedną jej klasę) umożliwia łatwe przechowywanie danych podobne do składowania informacji w systemach DBMS, takich jak MySQL. Nie będziemy przy tym wykorzystywać języka SQL. Użyjemy metod oferowanych przez klasę obsługujących logiczne działania na tabeli takie jak wstaw wiersz, szukaj, usuń wiersz. Mając do dyspozycji wiele z możliwości Systemów Zarządzania Bazami Danych posiadamy znaczną przewagę nad prostą organizacją informacji dodawanych do końca plików tekstowych.

Zakładam, że znasz (X)HTML i przynajmniej podstawy PHP. Świadomie opuszczam więc nagłówki HTML-owe czy znaczniki rozpoczęcia/zakończenia kodu skryptu <?php ... ?>, aby przekazać przystępniej właściwą treść tego artykułu. Przyda się też znajomość obsługi baz danych.

Do roboty!

Tworzymy nowy plik ze skryptem o nazwie „guestbook.php".

W sekcji (X)HTML strony będziemy potrzebowali formularza, w którym użytkownik może się dopisać do Księgi Gości:

<form action="guestbook.php" method="POST"><p>
  Nick: <input type="text" name="form_nick" maxlength="100" /><br />
  Twój wpis: <br />
  &lt;textarea name="form_text" cols="50" rows="3" maxlength="50000">&lt;/textarea><br />
  <input type="submit" name="form_add" value="Dodaj wpis" />
</p></form>

Importujemy phpJustDiBi do kodu w PHP:

require_once("class.phpJustDiBi.php");

Ponieważ do implementacji Księgi Gości wystarczy nam jedna tabela, posłużymy się klasą phpJustDiBi_Table, która będzie naszym pośrednikiem pomiędzy informacjami których oczekujemy a fizycznie składowanymi danymi w plikach.

Spróbujmy teraz opracować strukturę naszej tabeli:

$guestbook_struct = array(
	"ID" => array( "type" => "INT" ),
	"time" => array( "type" => "INT" ),
	"nick" => array( "type" => "VARCHAR", "size" => 100 ),
	"text" =>  array( "type" => "VARCHAR", "size" => 5000 )
	);

Na pierwszy rzut oka może to wyglądać dość dziwnie. Mamy tu pola „ID" i „time" które mają typ numeryczny, oraz „nick" i „text", które zawierają dane tekstowe o ustalonej maksymalnej długości.

Tworzymy/otwieramy tabelę, podając jej nazwę oraz strukturę (którą zadeklarowaliśmy wyżej):

$guestbook = new phpJustDiBi_Table("guestbook", $guestbook_struct);

Powyższy kod wykonany po raz pierwszy, utworzy nową tabelę. Z każdym następnym uruchomieniem skryptu spowoduje otwarcie istniejącej tabeli. Od teraz możemy używać obiektu $guestbook do wykonywania operacji na naszej tabeli z wpisami Księgi Gości. Musimy obsłużyć kliknięcie przycisku „Dodaj wpis".

if(isset($_POST["form_add"])) {
	$row = array( 
		"nick" => $_POST["form_nick"],
		"text" => $_POST["form_text"],
		"time" => time()
	);
	$guestbook->insertRow( $row );
}

Pole „ID" zdefiniowane w strukturze „$guestbook_struct" jest kluczem głównym i jest uzupełniany automatycznie jeśli nie zostanie podany. Pierwszy wiersz będzie miał wartość „ID" równą 1.

Następnie wyświetlamy wszystkie dotychczasowe wpisy:

$rows = $guestbook->select ( );
while( $row = $guestbook->fetchAssoc($rows) ) {
	echo "<b>" . htmlspecialchars( $row["nick"] ) . "</b>" ;
	echo " <i>". date("Y.m.d H:i", $row["time"]) . "</i><br />\n" ;
	echo htmlspecialchars( $row["text"] ) ;
	echo "<br /><br />\n" ;
}

Mamy już gotową Księgę Gości o podstawowej funkcjonalności.

Co dalej?

Prawdopodobnie będziesz chciał pokazać wpisy w kolejności od najnowszego. Linię:

$rows = $guestbook->select ( );

należy zastąpić:

$keys = $guestbook->getKeys();
$rows = $guestbook->select ( array_reverse( $keys ) );

Pierwsza linia zwraca listę wartości „ID" (klucz główny), natomiast druga – odwraca tablicę „$keys” i zwraca wiersze o identyfikatorach podanych w tablicy (czyli wszystkich kluczy w kolejności od największego).

Należałoby teraz uniemożliwić zapisanie kolejnego wpisu przez tego samego użytkownika oraz zabezpieczenie przed możliwością kliknięcia „Odśwież" i ponownego wysłania danych POST. Do kodu należałoby także dodać zabezpieczenia antyfloodowe i (w miarę możliwości) filtry antyspamowe oraz automat cenzora. Ale zagadnienia te znacznie wykraczają poza główny temat tej publikacji.

Za mało?

phpJustDiBi ma znacznie więcej możliwości, oto prezentacja niektórych z nich, które po przeróbkach można zastosować np. w skrypcie administrującym Księgą Gości.

Wyświetlenie pełnej zawartości tabeli:

$rows = $guestbook->printTable( );

Wyświetlenie wpisów, które przybyły w ciągu tygodnia:

$keys = $guestbook->search( "time" , ">=" , time()-7*24*60*60 );
$guestbook->printRows ( $guestbook->select ( $keys ) );

Usunięcie wpisu użytkownika o Nicku „DeVil":

$rows = $guestbook->delete( $guestbook->search ( "nick" , "=" , "DeVil" ) );

Optymalizacja tabeli (aby przywrócić miejsce po usuniętych rekordach i przebudować klucz):

$guestbook->optimize ( );

Podsumowanie

Gotowe rozwiązania typu phpJustDiBi nie są w stanie w pełni zastąpić prawdziwej bazy danych. Jednak dla pewnych zastosowań wydają się być ciekawą alternatywą. Stosunkowo szybkie, proste w użyciu i nie wymagające połączeń z serwerem baz danych.

Podobnym rozwiązaniem, na jakie natrafiłem ostatnio w sieci, jest PHP BTree Implementation (http://phpbtree.com/). Jest zaimplementowanym B-drzewem w PHP (B-drzewo to bardzo szybki algorytm wyszukiwania wg klucza stosowany w większości DBMS). Nie miałem okazji przetestować, ale wygląda interesująco.

Można też spróbować użyć SQLite (http://www.sqlite.org), który jest prawdziwym DBMSem działającym na lokalnych plikach z obsługą języka zapytań SQL. Nie jest on jednak napisany w PHP. Interpreter PHP na serwerze musi być odpowiednio skonfigurowany dla SQLite, więc być może nie działa on na Twoim serwerze.

Należy jednak wciąż mieć na uwadze, że dedykowany serwer baz danych, szczególnie na osobnym komputerze, jest zazwyczaj znacznie szybszy, ma większe możliwości, zapewnia integralność danych i w praktyce jest niemal niezawodny. Przed praktycznym zastosowaniem lokalnych "pseudobaz" należy sobie zadać pytanie: czy w danym przypadku można sobie pozwolić na rezygnację z DBMSa.

Łukasz Nawojczyk

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org