<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
<TITLE>PuszBaza 1.2 help</TITLE>
<STYLE>
<!--
A {color: #000082; text-decoration: none; font-family: Verdana; font-size: 11px; FONT-WEIGHT: bold;}
A:hover {color: white; text-decoration: none; font-family: Verdana; font-size: 11px;}
BODY {SCROLLBAR-FACE-COLOR: #395893; SCROLLBAR-ARROW-COLOR: white; SCROLLBAR-TRACK-COLOR: #2b3357;}
P {TEXT-ALIGN: justify; COLOR: #000000; FONT-SIZE: 11px; FONT-FAMILY: Verdana;
MARGIN-LEFT: 3%; MARGIN-RIGHT: 4%; LINE-HEIGHT: 180%;}
SPAN {FONT-SIZE: 11px; FONT-FAMILY: Verdana; COLOR: white; FONT-WEIGHT: bold; BACKGROUND: #395893;}
.uwaga {BACKGROUND: red;}
H1 {FONT-FAMILY: Impact, Verdana, Arial; FONT-WEIGHT: bold; FONT-SIZE: 35pt; COLOR: #000082; MARGIN-LEFT: 3%;}
H2 {FONT-FAMILY: Verdana, Arial; FONT-WEIGHT: bold; FONT-SIZE: 15pt; COLOR: #000082; MARGIN-LEFT: 3%;}
H3 {FONT-FAMILY: Verdana, Arial; FONT-WEIGHT: bold; FONT-SIZE: 12pt; COLOR: #000082; MARGIN-LEFT: 3%;}
PRE {MARGIN-LEFT: 6%; MARGIN-RIGHT: 3%; LINE-HEIGHT: 180%;}
HR {COLOR: #395893; MARGIN-LEFT: 3%; MARGIN-RIGHT: 4%;}
TABLE {BACKGROUND: white; MARGIN-LEFT: 3%; MARGIN-RIGHT: 3%; WIDTH: 93%;}
-->
</STYLE>
</HEAD>
<BODY BGCOLOR="#BCD0FE">
<H1>PuszBaza 1.2</H1>
<UL>
<LI><A HREF="#wprowadzenie">Wprowadzenie</A>
<LI><A HREF="#instalacja">Instalacja</A>
<LI><A HREF="#funkcje">Lista funkcji i zmiennych</A>
<LI><A HREF="#przegladanie">Przegl±danie wyników</A>
<LI><A HREF="#varia">Ró¿ne przydatne sztuczki</A>
<LI><A HREF="#plany">Plany</A>
</UL>
<HR>
<P>Autor, Micha³ „Puszkin” Marszalik, udostêpnia <B>PuszBazê</B> jako freeware. Mo¿esz
j± kopiowaæ i u¿ywaæ na potrzeby prywatne lub komercyjne, ale nie mo¿esz jej sprzedawaæ. Autor nie
ponosi ¿adnej odpowiedzialno¶ci za efekty u¿ytkowania skryptu, jak i za jego sprawno¶æ:
korzystaj±c z PuszBazy robisz to na w³asn± odpowiedzalno¶æ. Wszelkie pytania proszê kierowaæ do <A
HREF="mailto:hide@address.com">hide@address.com</A>, natomiast uwagi w sprawie dokumentacji PuszBazy
do <A HREF="mailto:hide@address.com?Subject=Uwagi do dokumentacji PuszBazy">Przemys³awa Jackowskiego</A>.
Najnowsze wersje znajdziesz na stronie <A HREF="http://www.puszkin.polbox.pl/">http://www.puszkin.polbox.pl/</A>. </P>
<HR>
<A NAME="wprowadzenie"></A><H2>Wprowadzenie</H2>
<P>PuszBaza to bazodanowy skrypt napisany w PHP4 z my¶l± o osobach, które nie maj± dostêpu do MySQL
czy PostgreSQL, a chc± szybko napisaæ skrypt obs³uguj±cy ksiêgê go¶ci, forum, sondê etc. – lub
nawet bardziej skomplikowany... PuszBaza dzia³a na plikach tekstowych (ang. „flat
files”) podobnych do csv (=„comma separated values”), tzn. o nastêpuj±cej
strukturze: w pierwszej linii nazwy pól, oddzielone ¶rednikami, za¶ kolejne rekordy – w
kolejnych liniach, np.: </P>
<PRE>
id;autor;tytul;
1;Agatha Christie;Z³o czai siê wszêdzie;
2;Arthur Conan Doyle;Studium w szkar³acie;
3;Raymond Chandler;¯egnaj laleczko;
</PRE>
<P>Jedyn± ró¿nic± pomiedzy formatem u¿ywanym przez PuszBazê a csv jest konieczno¶æ umieszczenia
¶rednika <B>po ostatnim polu</B>, tj. na koñcu ka¿dej linii. Na potrzeby tego dokumentu pliki z
danymi bêd± mia³y rozszerzenie <B>pbf</B> (=„PuszBaza format” ;-) choæ naprawdê mo¿e
byæ ono dowolne (np. txt). </P>
<P>Aby korzystaæ z PuszBazy, wystarczy wpisaæ jednolinijkow± komendê: </P>
<TABLE><TR><TD><PRE>
<?PHP
include "puszbaza.php";
?></PRE></TD></TR></TABLE>
<P><SPAN> PODPOWIED¬: </SPAN> Aby strony korzystaj±ce z PuszBazy ³adowa³y siê szybciej
do przegl±darki, mo¿na wykasowaæ z pliku <B>puszbaza.php</B> komentarze oraz funkcje, z których
siê nie bêdzie korzysta³o, np. <B>delete_pb</B> czy <B>update_pb</B>. </P>
<P><SPAN> PODPOWIED¬: </SPAN> Plikowi z baz± danych (*.pbf, *.txt) nale¿y nadaæ prawa
zapisu dla wszystkich, inaczej zostanie wy¶wietlony komunikat <B>Permission denied</B> (=„dostêp
zabroniony”). Ka¿dy program do ftp (tak¿e popularny Windows Commander) ma mo¿liwo¶æ zmiany
praw dostêpu do plików. </P>
<P><SPAN> UWAGA: </SPAN> Baza nie ma najmniejszych nawet zabezpieczeñ. Je¿eli kto¶
zorientuje siê, jaka jest nazwa pliku z danymi, bêdzie móg³ bez problemu je obejrzeæ. </P>
<HR>
<A NAME="instalacja"></A><H2>Instalacja</H2>
<P>Instalacja PuszBazy nie jest potrzebna – po prostu wgraj plik <B>puszbaza.php</B> tam,
gdzie trzymasz pozosta³e pliki projektu; to wszystko! </P>
<HR>
<A NAME="funkcje"></A><H2>Lista funkcji i zmiennych</H2>
<UL>
<LI><A HREF="#connect">connect_pb</A>
<LI><A HREF="#select">select_pb</A>
<LI><A HREF="#count">count_pb</A>
<LI><A HREF="#insert">insert_pb</A>
<LI><A HREF="#update">update_pb</A>
<LI><A HREF="#delete">delete_pb</A>
</UL>
<HR>
<A NAME="connect"></A><H3>connect_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> connect_pb("nazwa_pliku"); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN> <BR>
<B>nazwa_pliku</B> to nazwa pliku tekstowego, zawieraj±cego kolejne rekordy, o dowolnym
rozszerzeniu; pola musz± byæ oddzielone ¶rednikami; mo¿na u¿yæ ¶cie¿ki dostêpu. </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>connect_pb</B> ³±czy z plikiem danych. </P>
<P><SPAN> PRZYK£AD 1: </SPAN> dla pliku <B>data.pbf</B> po³±czenie wygl±da nastêpuj±co: </P>
<TABLE><TR><TD><PRE>
<?PHP
$conn = connect_pb("data.pbf");
?></PRE></TD></TR></TABLE>
<P>Plik z danymi mo¿e znajdowaæ siê w innym katalogu ni¿ <B>puszbaza.php</B>: </P>
<TABLE><TR><TD><PRE>
<?PHP
$conn = connect_pb("moje_bazy/ta_baza/data.pbf");
?></PRE></TD></TR></TABLE>
<P>Mo¿na te¿ u¿yæ zmiennej: </P>
<TABLE><TR><TD><PRE>
<?PHP
$nazwa_pliku = "moje_bazy/ta_baza/data.pbf";
$conn = connect_pb($nazwa_pliku);
?></PRE></TD></TR></TABLE>
<P>Funkcja <B>connect_pb</B> zwraca zmienn± (tablicê ze wszystkimi warto¶ciami), na której mo¿na
dokonywaæ intrukcji <A HREF="#select">select_pb</A>. Po pojedynczym wywo³aniu <B>connect_pb</B>
mo¿na wielokrotnie u¿ywaæ <B>select_pb</B>; je¶li jednak w miêdzyczasie plik z danymi zosta³
zmieniony (np. na skutek u¿ycia <A HREF="#insert">insert_pb</A>, nale¿y ponownie u¿yæ
<B>connect_pb</B>. </P>
<HR>
<A NAME="select"></A><H3>select_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> select_pb($conn,'pole','warunek'[,'pole_do_sortowania'][,'sposób_sortowania']); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN><BR>
<B>$conn</B> – zmienna zwrócona przez funkcjê <B>connect_pb</B> <BR>
<B>pole</B> – nazwa pola, do której odnosi siê warunek <BR>
<B>warunek</B> – warunek PHP (czyli np. „równa siê” to <B>==</B>, „nie równa siê”
to <B>!=</B> etc.); zamiast nazwy kolumny nale¿y wstawiæ <B>x</B> <BR>
<B>pole_do_sortowania</B> – nazwa pola, wed³ug której ma siê odbywaæ sortowanie (opcjonalnie) <BR>
<B>sposób_sortowania</B> – mo¿e byæ <B>ASC</B> (rosn±co) b±d¼ <B>DESC</B> (rosn±co) (opcjonalnie;
domy¶lnie jest <B>ASC</B>) </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>select_pb</B> pozwala wy¶wietliæ wybrane (zgodnie z
warunkiem lub warunkami) dane z pliku i odpowiednio je uszeregowaæ (posortowaæ). </P>
<P><SPAN> PRZYK£AD 2: </SPAN> wyszukaj wszystkie rekordy, dla których warto¶æ <B>id</B> jest
wiêksza ni¿ 2 i uszereguj je rosn±co wg pola <B>id</B>:</P>
<TABLE><TR><TD><PRE>
<?PHP
$conn = connect_pb("data.pbf");
$wynik = select_pb($conn,"id","x > 2",'id',"ASC");
?></PRE></TD></TR></TABLE>
<P><SPAN> UWAGA: </SPAN> Jako warunek mo¿na u¿yæ dowolnej funcji PHP, zwracaj±cej
w wyniku <B>true</B> b±d¼ <B>false</B>, np. warunkiem mo¿e byæ <B>ereg('2',x)</B> (co dzia³a
podobnie jak <B>like</B> w SQLu) – nale¿y pamiêtaæ o u¿ywaniu apostrofów. </P>
<P><SPAN> PRZYK£AD 3: </SPAN> wyszukaj wszystkie rekordy, w których pole <B>tytul</B>
zawiera frazê <B>cie</B>, i uszereguj je rosn±co wed³ug pola <B>id</B>: </P>
<TABLE><TR><TD><PRE>
<?PHP
$wynik = select_pb($conn,"tytul","ereg('cie',x)",'id',"ASC");
?></PRE></TD></TR></TABLE>
<P><SPAN> PRZYK£AD 4: </SPAN> Czy mo¿na u¿yæ do selekcji wiêcej ni¿ jednego warunku? Mo¿na,
jednak trzeba zastosowaæ koniunkcjê warunków, tzn. u¿ywaæ tylko AND (u¿ycie OR oraz nawiasów da
w rezultacie komunikat o b³êdzie). We wszystkich warunkach nale¿y u¿yæ <B>x</B>; PuszBaza sama
podstawi odpowiednie nazwy pól pod kolejne warunki, trzeba tylko pamiêtaæ, ¿eby liczba pól
oddzielonych AND równa³a siê liczbie warunków tak¿e oddzielonych AND. Uwaga: 1) AND musi byæ pisane
wielkimi literami; 2) trzeba podaæ nazwê pola, wg którego wyniki <B>select_pb</B> maj± zostaæ
posortowane. W poni¿szym przyk³adzie zostan± wybrane wszystkie rekordy, dla których warto¶æ pola
<B>id</B> jest wiêksza lub równa 1 i mniejsza ni¿ 3, a warto¶æ pola <B>data</B> jest wcze¶niejsza
ni¿ 12 marca 2001 r. i posortowane wg pola <B>id</B>: </P>
<TABLE><TR><TD><PRE>
<?PHP
$wynik = select_pb ($conn,"id AND id AND data","x >= 1 AND x < 3 AND mktime(x) < mktime('12-3-2001')","id")
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="count"></A><H3>count_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> count_pb($wynik); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN><BR>
<B>$wynik</B> – zmienna otrzymana z funkcji <A HREF="#select">select_pb</A> </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>count_pb</B> zwraca liczbê rekordów (czyli wierszy pliku
z danymi), odpowiadaj±c± warunkowi postawionemu w <A HREF="#select">select_pb</A>.
<P><SPAN> PRZYK£AD 5: </SPAN> podaj liczbê rekordów, dla których warto¶æ <B>id</B> jest
wiêksza ni¿ 2: </P>
<TABLE><TR><TD><PRE>
<?PHP
$conn = connect_pb("data.pbf");
$wynik = select_pb($conn,"id","x > 2",'id',"ASC");
$liczba = count_pb($wynik);
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="insert"></A><H3>insert_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> insert_pb("nazwa_pliku","rekord"); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN><BR>
<B>nazwa_pliku</B> – nazwa pliku z baz± danych <BR>
<B>rekord</B> – pe³ny rekord, tj. z wszystkimi polami zadeklarowanymi w pierwszej linii
pliku z danymi </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>insert_pb</B> pozwala dopisaæ nowy rekord (czyli kolejny
wiersz do pliku z danymi). </P>
<P><SPAN> PRZYK£AD 6: </SPAN> </P>
<TABLE><TR><TD><PRE>
<?PHP
insert_pb("data.pbf","4;Ross McDonald;Sprawa Galtona;");
?></PRE></TD></TR></TABLE>
<P><SPAN> UWAGA: </SPAN> Nale¿y pamiêtaæ, ¿e w <B>rekord</B> nie mog± wystêpowaæ
¶redniki inne ni¿ te oddzielaj±ce pola, inaczej bêdzie tych pól nieco wiêcej :) Aby siê przed tym
zabezpieczyæ, mo¿na u¿yæ funkcji <B>ereg_replace()</B>: </P>
<TABLE><TR><TD><PRE>
<?PHP
$wartosc1 = ereg_replace(";","",$wartosc1);
$wartosc2 = ereg_replace(";","",$wartosc2);
$wartosc3 = ereg_replace(";","",$wartosc3);
insert_pb("data.pbf","$wartosc1;$wartosc2;$wartosc3;")
?></PRE></TD></TR></TABLE>
<P>Aby jednak „przemyciæ” ¶rednik, który jest czêsto u¿ywany np. przy wpisach do
ksiêgi go¶ci czy forum, wystarczy przed u¿yciem <B>insert_pb</B> zamieniæ go na inny ci±g
znaków, np.: </P>
<TABLE><TR><TD><PRE>
<?PHP
$wartosc = ereg_replace(";","##srednik##",$wartosc);
?></PRE></TD></TR></TABLE>
<P>a po <B>select_pb</B> przywróciæ mu dawny wygl±d :) </P>
<TABLE><TR><TD><PRE>
<?PHP
$wartosc = ereg_replace("##srednik##",";",$wartosc);
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="update"></A><H3>update_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> update_pb("nazwa_pliku","pole","warunek",
"klucz","wartosc"); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN><BR>
<B>nazwa_pliku</B> – nazwa pliku z baz± danych <BR>
<B>pole</B> – nazwa pola, do którego odnosi siê <B>warunek</B> <BR>
<B>warunek</B> – warunek PHP (jak w <A HREF="#select">select_pb</A>)<BR>
<B>klucz</B> – pole, którego warto¶ci bêd± zmieniane <BR>
<B>wartosc</B> – warto¶æ, jak± przyjmie pole <B>klucz</B> </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>update_pb</B> pozwala zmieniæ dane w jednym lub wiêcej
rekordach bazy danych. </P>
<P><SPAN> PRZYK£AD 7: </SPAN> aby w bazie wszystkim rekordom powy¿ej drugiego zmieniæ
warto¶æ pola <B>autor</B> na „Ross MacDonald”, nale¿y u¿yæ: </P>
<TABLE><TR><TD><PRE>
<?PHP
update_pb("data.pbf","id","x > 2","autor","Ross MacDonald");
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="delete"></A><H3>delete_pb</H3>
<P><SPAN> SK£ADNIA: </SPAN> delete_pb("nazwa_pliku","pole","warunek"); </P>
<P><SPAN> OPIS SK£ADNI: </SPAN><BR>
<B>nazwa_pliku</B> – nazwa pliku z baz± danych <BR>
<B>pole</B> – nazwa pola, do którego odnosi siê <B>warunek</B> <BR>
<B>warunek</B> – warunek PHP (jak w <A HREF="#select">select_pb</A>) </P>
<P><SPAN> CEL: </SPAN> Funkcja <B>delete_pb</B> pozwala skasowaæ dowolny rekord,
odpowiadaj±cy <B>warunkowi</B>. </P>
<P><SPAN> PRZYK£AD 8: </SPAN> skasuj wszystkie rekordy, w których pole <B>autor</B> ma warto¶æ
„Ross MacDonald”: </P>
<TABLE><TR><TD><PRE>
<?PHP
delete_pb("data.pbf","autor","x == 'Ross MacDonald'");
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="przegladanie"></A><H2>Przegl±danie wyników</H2>
<P><SPAN> PRZYK£AD 9: </SPAN> aby wy¶wietliæ wszystkie rekordy, mo¿na napisaæ: </P>
<TABLE><TR><TD><PRE>
<?PHP
include "puszbaza.php";
$conn = connect_pb("data.pbf");
$wynik = select_pb($conn,"id","x > -1",'id',"ASC");
$liczba = count_pb($wynik);
for($i=0; $i < $liczba; $i++)
{
$id = $wynik["id"][$i];
$autor = $wynik["autor"][$i];
$tytul = $wynik["tytul"][$i];
echo "$id) $autor: <B>$tytul</B> <BR>";
}
?></PRE></TD></TR></TABLE>
<P>Rezultat bêdzie nastêpuj±cy: </P>
<TABLE><TR><TD>
1) Agatha Christie: <B>Dwana¶cie prac Herkulesa</B><BR>
2) Arthur Conan Doyle: <B>Studium w szkar³acie</B><BR>
3) Joe Alex: <B>Cicha jak ostatnie tchnienie</B>
</TD></TR></TABLE>
<P>Warunkiem celowo jest "x > -1": dziêki temu zostan± wy¶wietlone wszystkie rekordy ³±cznie z tym,
dla którego <B>id</B> równa siê 0. </P>
<P><SPAN> PODPOWIED¬: </SPAN> Aby wy¶wietliæ <B>wszystkie</B> rekordy w przypadku, je¶li
brak jest pola <B>id</B>, nale¿y dzia³aæ na wyniku <B>connect_pb</B> tak, jakby to by³ wynik
<B>select_pb</B>: </P>
<TABLE><TR><TD><PRE>
<?PHP
include "puszbaza.php";
$conn = connect_pb("data.pbf");
$liczba = count_pb($conn);
for($i=0; $i < $liczba; $i++)
{
$id = $conn["id"][$i];
$autor = $conn["autor"][$i];
$tytul = $conn["tytul"][$i];
echo "$id) $autor: <B>$tytul</B> <BR>";
}
?></PRE></TD></TR></TABLE>
<HR>
<A NAME="varia"></A><H2>Ró¿ne przydatne sztuczki</H2>
<H3>max, min, sum</H3>
<P>S³u¿± do wyznaczenia kolejno: pola o najwiêkszej warto¶ci, najmniejszej warto¶ci oraz sumy
warto¶ci pól. </P>
<P><SPAN> PRZYK£AD 10: </SPAN> </P>
<TABLE><TR><TD><PRE>
<?PHP
include "puszbaza.php";
$conn = connect_pb("data.pbf");
$wynik = select_pb($conn,"id","x > -1",'id',"ASC");
if ($wynik != 0) $id_max = max($wynik["id"]);
if ($wynik != 0) $id_min = min($wynik["id"]);
if ($wynik != 0) $id_sum = array_sum($wynik["id"]);
?></PRE></TD></TR></TABLE>
<HR>
<H3>$data</H3>
<P>Jak zapisaæ datê, ¿eby móc pó¼niej w ³atwy sposób sortowaæ (ASC lub DESC) wpisy wed³ug niej?
Mo¿na to zrobiæ, wstawiaj±c jedn± liniê: </P>
<TABLE>
<TR><TD><PRE><?PHP
$data = date("ymdHi");
?></PRE></TD></TR>
</TABLE>
<P>W ten sposób w zmiennej <B>$data</B> zostanie zapisana data w formacie <B>rrmmddggmm</B>, czyli
np. 0205122045 (= <B>12.05.02, 20:45</B>). Poniewa¿ rok zapisany jest na pierwszym miejscu,
nastêpnie miesi±c, dzieñ etc., daty mo¿na sortowaæ porównuj±c je jak liczby: 0205122045 jest wiêksze
ni¿ np. 0203251212 (=25.03.02, 12:12), czyli pierwsza wymieniona data jest pó¼niejsza ni¿ druga.
Uwaga: ten sposób dzia³a tylko dla dat od roku 2000; ¿eby porównywaæ i daty wcze¶niejsze, trzeba do
zapisu roku u¿yæ czterech cyfr, tzn. </P>
<TABLE>
<TR>
<TD><PRE><?PHP
$data = date("YmdHi");
?></PRE></TD></TR>
</TABLE>
<P>Jak zamieniæ ten format daty na „normalny”? Na przyk³ad tak: </P>
<TABLE>
<TR>
<TD><PRE><?PHP
function data_norm($var)
{
$var = $var[4].$var[5].'.'.$var[2].$var[3].'.'.$var[0].$var[1].', '.$var[6].$var[7].':'.$var[8].$var[9];
return $var;
}
?></PRE></TD></TR>
</TABLE>
<P><SPAN> PRZYK£AD 11: </SPAN></P>
<TABLE>
<TR>
<TD><PRE><?PHP
$zmienna = '0203251212';
echo data_norm($zmienna);
?></PRE></TD></TR>
</TABLE>
<P>...da w rezultacie: </P>
<TABLE>
<TR>
<TD><PRE>25.03.02, 12:12</PRE></TD></TR>
</TABLE>
<HR>
<A NAME="plany"></A><H2>Plany</H2>
<P>Je¶li masz pomys³ na jak±¶ dodatkow± funkcjê, to <A HREF="mailto:hide@address.com">napisz do mnie</A>! </P>
</BODY>
</HTML>