Na čtenáře nejsou kladeny žádné zvláštní nároky. Stačí, když ovládá jazyk HTML a základy práce se systémem PHP3. Znalost jazyka SQL není vůbec na škodu, ale není nezbytně nutná.
Tato fáze vždy sestává z vytvoření datového modelu, který popisuje vztahy mezi jednotlivými entitami. Z tohoto modelu také vyčteme jaké tabulky budou v databázi, jaké budou primární klíče v jednotlivých tabulkách, jaké jsou vztahy mezi tabulkami, jaká platí integritní omezení atd.
Na rozebírání datového modelování zde není prostor. My si vše ukážeme na jednoduché úloze, kde si bez něj vystačíme. Pro složitější systémy je však důkladná analýza nezbytná. Potřebné znalosti lze získat např. v kurzu IT_360 -- Databáze. Zde se mimo jiné i důkladně seznámíte s jazykem SQL.
MySQL umožňuje na jednom počítači pracovat s více databázemi. Každá databáze pak může obsahovat několik tabulek, které mohou, ale nemusí, být navzájem provázány. Výpis všech databází uložených v systému získáme pomocí příkazu:
mysqlshowKaždý máte k dispozici databázi, jejíž jméno odpovídá vašemu uživatelskému jménu. Pokud se chceme podívat, jaké tabulky databáze obsahuje, použijeme příkaz:
mysqlshow jméno_databázeK samotné práci s databází slouží příkaz
mysql
. Po jeho
spuštění můžeme pomocí příkazové řádky zadávat SQL příkazy, které se mají
provést. Jako parametr programu se zadává jméno databáze, se kterou chceme
pracovat. Příkazovou řádku programu ukončíme pomocí příkazu quit
.
mysql xaaabnnxaaabnn je přitom naše uživatelské jméno a tedy i jméno databáze. K vytvoření nové tabulky v databázi slouží SQL příkaz
create
table
. Jeho syntaxe je následující: create table jméno_tabulky (jméno_položky typ_položky, ... )Přehled nejběžnějších datových typů přináší tabulka.
Typ | Popis |
---|---|
int
| celé číslo |
float
| číslo s pohyblivou řádovou čárkou |
varchar(n)
| textový řetězec o maximální délce n |
date
| datum ve tvaru RRRR-MM-DD |
time
| čas ve tvaru HH:MM:SS |
My vytvoříme tabulku adresar
se čtyřmi položkami jméno,
příjmení, e-mail a datum narození. Pro usnadnění dalších operací přidáme do
tabulky i pátou položku, kterou bude jedinečné identifikační číslo záznamu
(primární klíč). Toto číslo deklarujeme tak, že se bude u každého nového záznamu
automaticky zvyšovat -- MySQL pohlídá, aby měl každý záznam toto číslo unikátní.
create table adresar (id int auto_increment primary key, jmeno varchar(15), prijmeni varchar(15), email varchar(40), narozen date);Důležitý je středník na konci, kterým se odesílají příkazy MySQL k provedení.
O tom, že se tabulka skutečně vytvořila, se můžeme přesvědčit pomocí příkazu
mysqldump xaaabnn
(příkaz musí být zadán na příkazovou řádku
shellu, ne v prostředí programu mysql
).
mysql
můžeme do databáze přidávat i nové záznamy. K přidání nového záznamu do tabulky
s N položkami slouží v SQL příkaz insert into
: insert into jméno_tabulky values (hodnota1, ..., hodnotaN)My do tabulky přidáme informace o panu Novákovi:
insert into adresar values (0, 'Jan', 'Novák', 'Jan.Novak@mail.cz', '1965-08-25');Nula na místě
id
způsobí automatické generování jedinečného
id
. Obdobným způsbem můžeme přidat i další záznamy. Vidíme, že
tento způsob není zrovna dvakrát uživatelsky příjemný -- dobrá motivace pro
vytvoření snadno ovladatelného WWW rozhraní k tabulce.
select
. Pokud chceme vypsat obsah celé
tabulky, zadáme příkaz: select * from jméno_tabulkyObsah naší tabulky si tedy můžeme ověřit pomocí:
select * from adresar;Informace lze vybírat i selektivně. Podmínka, která musí pro vybrané záznamy platit, se uvádí za klíčové slovo
where
. Příklady
selektivních dotazů: select * from adresar where prijmeni like 'Novák'; select * from adresar where email = 'jkj@sorry.vse.cz'; select * from adresar where prijmeni = 'Procházka' and jmeno = 'Karel'; select * from adresar where prijmeni like 'Pro%';Znak '%' má ve vyhledávacím řetězci za operátorem
like
speciální význam -- nahrazuje libovolnou sekvenci znaků.
delete from
. Záznamy, které chceme smazat, musíme určit podmínkou v
klauzuli where
: delete from jméno_tabulky where podmínkaPraktická ukázka smazání záznamu, jehož identifikační číslo je tři:
delete from adresar where id=3;
update
: update jméno_tabulky set položka=hodnota, ... where podmínkaTen modifikuje všechny záznamy, které vyhovují podmínce. Pokud chceme měnit pouze jeden záznam -- to je ostatně nejtypičtější příklad -- je vhodné jako podmínku uvést test primárního klíče na jedinečnou hodnotu:
update adresar set email="novak@ini.cz" where id=37;Příkaz změní mailovou adresu uživatele, který je v adresáři veden pod identifikačním číslem 37.
drop table jméno_tabulkyDejte si na tuto operaci pozor. Tabulka je smazána nenávratně.
mysql
. Před každou komunikací se serverem je potřeba
se k němu připojit a po skončení práce se zase odpojit. Typické schéma práce s
MySQL v PHP3 tedy vypadá takto: <? mysql_Connect("localhost")?> práce s databází <? mysql_Close()?>
select
. V PHP máme k dispozici
funkci mysql(jméno_databáze, SQL_příkaz)
,
která jako výsledek vrací výsledek SQL příkazu.
V případě příkazu select
je výsledkem seznam záznamů. Funkce v
tomto případě vrací ukazatel na seznam záznamů. Tyto záznamy jsou pak dále
přístupné pomocí dalších funkcí. Příklad dotazu v PHP:
<? $result = mysql("xaaabnn", "select * from adresar"); ?>Počet záznamů, které jsou výsledkem posledního dotazu, můžeme zjistit pomocí funkce
mysql_NumRows($result)
. Poněkud ucelenější ukázka: <? mysql_Connect("localhost"); $result = mysql("xaaabnn", "select * from adresar"); $pocet = mysql_NumRows($result); echo "V tabulce adresar je $pocet záznamů."; mysql_Close(); ?>Jednotlivé položky záznamů, které jsou výsledkem dotazu, jsou přístupné pomocí funkce
mysql_Result()
. Ta má tři parametry: mysql_Result($result, číslo_záznamu, položka)Poznamenejme, že záznamy jsou číslovány od 0. Pokud bychom tedy chtěli vypsat obsah celé tabulky adresar, můžeme na stránku zařadit následující kód:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "select * from adresar"); $pocet = mysql_NumRows($result); echo "V tabulce adresar je $pocet záznamů."; echo "<P>"; $i = 0; while ($i<$pocet): echo mysql_Result($result, $i, "jmeno") + " " + mysql_Result($result, $i, "prijmeni") + ", " + mysql_Result($result, $i, "email") + ", " + mysql_Result($result, $i, "narozen") + "<BR>"; $i++; endwhile; mysql_Close(); ?>Ve smyčce bychom mohli kolem dat z databáze umístit například HTML tagy pro vytvoření tabulky a výsledky tak prezentovat v přehledné tabulce.
Pokud již nepotřebujeme s výsledkem dotazu dále pracovat, je vhodné uvolnit
paměť, ve které je výsledek uložen. To provedeme voláním funkce
mysql_FreeResult($result)
.
Pokud výsledkem volání funkce mysql()
není seznam záznamů (např.
po SQL příkazech update
, delete
nebo
insert
), vrací funkce 0. Pokud při provádění SQL příkazu došlo k
chybě, vratí funkce hodnotu -1.
Počet záznamů, kterých se dotklo provedení operace update
,
delete
nebo insert
, vrací funkce
mysql_Affected_Rows()
.
$jmeno
, $prijmeni
, $email
a
$narozen
máme uloženy informace o člověku, kterého chceme do
adresáře přidat. Do proměnných se údaje mohly dostat například z formuláře,
který vyplnil uživatel. Stránka, která tento formulář obsluhuje, pak bude
obsahovat tento kód pro přidání nového záznamu do tabulky: <? mysql_Connect("localhost"); $result = mysql("xaaabnn", "insert into adresar values (0, '$jmeno', '$prijmeni', " + "'$email', '$narozen')"); if ($result==0): echo "Do adresáře byl úspěšně přidán nový záznam."; else: echo "A sakra! Nový záznam se do adresáře nepodařilo přidat."; endif; mysql_Close(); ?>
$id
. Vymazání
pak v PHP provedeme takto: <? mysql_Connect("localhost"); $result = mysql("xaaabnn", "delete from adresar where id=$id"); if ($result==0): echo "Záznam se podařilo úspěšně vymazat."; else: echo "Záznam nelze vymazat, do povrchu pevného disku je vyryt."; endif; mysql_Close(); ?>
$id
známe, chceme změnit e-mailovou adresu na hodnotu proměnné
$email
: <? mysql_Connect("localhost"); $result = mysql("xaaabnn", "update adresar set email='$email' where id=$id"); if ($result==0): echo "Záznam se podařilo úspěšně aktualizovat."; else: echo "Záznam nelze aktualizovat, do povrchu pevného disku je vyryt."; endif; mysql_Close(); ?>
.phtml
stránek implementovat aplikaci pro práci s
adresářem.
index.phtml
.
Ve filtru můžeme používat hvězdičku pro nahrazení libovolné sekvence znaků. V PHP pak všechny hvězdičky převedeme na znak '%', který se používá v SQL pro zastoupení libovolné skupiny znaků.
Když generujeme výpis adresáře, přidají se ke každému záznamu dva odkazy,
které vedou na stránky zajišťující změnu a smazání záznamu. Odkazy mají v sobě
rovnou zakomponováno id
záznamu, kterého se operace týká.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Uvodni stranka</TITLE> </HEAD> <BODY> <H1>Adresar - vyhledavani</H1> <H2>Zadejte filtr pro hledani v databazi:</H2> <? /* Pocatecni prihlaseni ke strance ? */ if ($jmeno=="" && $prijmeni=="" && $email=="" && $narozen=="") { $firsttime="true"; }; /* Inicializace filtru pro prazdna pole */ if ($jmeno=="") { $jmeno="*"; }; if ($prijmeni=="") { $prijmeni="*"; }; if ($email=="") { $email="*"; }; if ($narozen=="") { $narozen="*"; }; ?> <FORM ACTION=index.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno VALUE="<?echo $jmeno?>" SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni VALUE="<?echo $prijmeni?>" SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email VALUE="<?echo $email?>" SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen VALUE="<?echo $narozen?>" SIZE=10> </TABLE> <BR><INPUT TYPE=SUBMIT VALUE="Prohledej adresar"> </FORM> <FORM ACTION=new.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Pridej novou adresu"> </FORM> <? if ($firsttime!="true"): ?> <HR> <H2>Vysledky prohledavani</H2> <TABLE> <TR><TH>Jmeno<TH>Email<TH>Datum narozeni<TH>Uprava<TH>Smazani <? mysql_Connect("localhost"); /* prevod * na % pro operator like */ $_jmeno = ereg_replace("\*", "%", $jmeno); $_prijmeni = ereg_replace("\*", "%", $prijmeni); $_email = ereg_replace("\*", "%", $email); $_narozen = ereg_replace("\*", "%", $narozen); $result = mysql("jkj", "select * from adresar where " + "jmeno like '$_jmeno' and prijmeni like '$_prijmeni' and " + "email like '$_email' and narozen like '$_narozen'"); $num = mysql_NumRows($result); if ($num==0): echo "<TR><TH COLSPAN=5>Dotazu nevyhovuje zadna adresa!\n"; else: $i = 0; while ($i<$num): echo "<TR><TD>" + mysql_Result($result, $i, "jmeno") + " " + mysql_Result($result, $i, "prijmeni"); echo "<TD>" + mysql_Result($result, $i, "email"); echo "<TD>" + mysql_Result($result, $i, "narozen"); echo "<TD><A HREF='edit.phtml?id=" + mysql_Result($result, $i, "id") + "'>Uprav</A>"; echo "<TD><A HREF='delete.phtml?id=" + mysql_Result($result, $i, "id") + "'>Smaz</A>"; $i++; endwhile; endif; mysql_Close(); ?> </TABLE> <? endif; ?> </BODY> </HTML>
add.html
-- ten se postará o samotné přidání záznamu do
tabulky. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Pridani nove adresy</TITLE> </HEAD> <BODY> <H1>Adresar - pridani nove adresy</H1> <H2>Zadejte novou adresu:</H2> <FORM ACTION=add.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen SIZE=10> </TABLE> <BR><INPUT TYPE=SUBMIT VALUE="Pridej adresu"> </FORM> <FORM ACTION=index.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Zpet"> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek pridani adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "insert into adresar values (0, '$jmeno'," + "'$prijmeni', '$email', '$narozen')"); if ($result==0): echo "<H1>Nova adresa byla uspesne pridana</H1>"; else: echo "<H1>Novou adresu se nepodarilo pridat</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>
id
: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek smazani adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "delete from adresar where id=$id"); if ($result==0): echo "<H1>Adresa byla uspesne smazana.</H1>"; else: echo "<H1>Adresu se nepodarilo smazat.</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>
id
. Po úpravách se obsah formuláře odešle skriptu
update.phtml
, který se postará o změnu záznamu v tabulce. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Zmena adresy</TITLE> </HEAD> <BODY> <H1>Adresar - Zmena adresy</H1> <H2>Opravte udaje v adrese:</H2> <? mysql_Connect("localhost"); $result = mysql("jkj", "select * from adresar where id='$id'"); $jmeno = mysql_Result($result, 0, "jmeno"); $prijmeni = mysql_Result($result, 0, "prijmeni"); $email = mysql_Result($result, 0, "email"); $narozen = mysql_Result($result, 0, "narozen"); mysql_Close(); ?> <FORM ACTION=update.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno VALUE="<?echo $jmeno>" SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni VALUE="<?echo $prijmeni>" SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email VALUE="<?echo $email>" SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen VALUE="<?echo $narozen>" SIZE=10> </TABLE> <BR><INPUT TYPE=HIDDEN NAME=id VALUE=<?echo $id>> <INPUT TYPE=SUBMIT VALUE="Proved zmenu udaju"> </FORM> <FORM ACTION=index.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Zpet"> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek zmeny adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "update adresar set jmeno='$jmeno', " + "prijmeni='$prijmeni', email='$email', narozen='$narozen' " + "where id=$id"); if ($result==0): echo "<H1>Adresa byla uspesne zmenena.</H1>"; else: echo "<H1>Adresu se nepodarilo zmenit.</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>