Databáze kontaktů v PHP 5.

10. července 2001

Vítejte u posledního dílu této minisérie, ve kterém doplním aplikaci o možnosti hledání v seznamu osob, jejich mazání a zobrazení detailu. A samozřejmě si budete moci stáhnout kompletní zdrojové texty celé aplikace.

Velká část tohoto dílu je podobná dílu předchozímu, proto se soustředím hlavně na porovnání rozdílů. Ten největší, kromě toho, že se hledají osoby a ne firmy, spočívá v SQL dotazu. Ten v tomto případě zasahuje přes dvě tabulky a musí vybrat záznamy o hledaných osobách. Je nutné myslet na to, že člověk nemusí být zařazen v žádné firmě.

Ale hezky od začátku. Jelikož vždy bude potřeba seznam firem, načteme si ho hned na začátku:

$Conn = mysql_connect(„localhost“,“dbuser“,“userdb“);
mysql_select_db(„db_interval“,$Conn);
//Pristupy do DB
$Firmy=Array();
$SQLText=“SELECT Nazev,Firma_ID FROM TKontakty_Firmy ORDER BY Nazev“;
$RS=mysql_query($SQLText,$Conn);
while($row = mysql_fetch_array($RS)) {
 $Firmy[]=$row;
}

Dále se nastaví velikost vyčítané stránky, používám 10, je to jednak hezké kulaté číslo a jednak je to akorát tak na obrazovku. Potom se ve skriptu zjistí, zda je nastavena nějaká aktuální stránka výpisu, pokud ne, nastaví se proměnná $cPage na 0 a vypočítá se aktuální pozice kurzoru v databázi. Následně se provede kontrola, zda byl odeslán formulář do stránky, byť i prázdný. To je bráno jako požadavek na kompletní výpis. Skript provádí tuto kontrolu na $Prijmeni pomocí PHP funkce isset. Ta kontroluje, jestli je proměnná vytvořena, ne však její obsah. Pokud je do parametrů vyhledávání zahrnuta i firma, dojde k rozšíření SQL dotazu o patřičnou podmínku.

$PageSize=10;
if ( (!isset($cPage)) || (empty($cPage)) )
 $cPage=0;
$dbCursor=$PageSize*$cPage;
$isNextRec=0;
$Vysledky=Array();
if (isset($Prijmeni)){
 $SQLText=“SELECT TKontakty_Lide.Prijmeni,TKontakty_Lide.Jmeno,TKontakty_Lide.Telefon,“;
 $SQLText.=“TKontakty_Lide.email,TKontakty_Lide.Komentar,TKontakty_Lide.Kontakt_ID,TKontakty_Firmy.Nazev FROM TKontakty_Lide LEFT OUTER JOIN TKontakty_Firmy ON (TKontakty_Lide.Firma_ID=TKontakty_Firmy.Firma_ID) WHERE (TKontakty_Lide.Prijmeni LIKE ‚$Prijmeni%‘)“;
 if ($Firma_ID>0)
  $SQLText.=“ AND (TKontakty_Lide.Firma_ID=$Firma_ID)“;
 $SQLText.=“ ORDER BY TKontakty_Lide.Prijmeni“;
 $RS=mysql_query($SQLText,$Conn);

Po proběhnutí SQL dotazu se do proměnné $maxRecs uloží počet záznamů jím vrácených. Následně proběhne kontrola, zda je skript na konci seznamu. Provede to opět pomocí ternárních operátorů. V dalším kroku dojde k sebeobraně :) vůči nenechavým uživatelům, kteří rádi přepisují adresní řádku. Pokud skript zjistí, že je mimo rozsah, vybere poslední stránku dat a nastaví si na ni potřebné ukazatele. Pokud ne, pouze se přesune kurzor v databázi na 1. záznam, který se bude načítat. Následně proběhne smyčka, která načte do pole $Vysledky požadovaná data. Tato smyčka má délku buď do konce RS nebo <$PageSize.

 $maxRecs=mysql_num_rows($RS);
 $isNextRec=(($dbCursor+$PageSize)<$maxRecs) ? 1:0;
 if ($dbCursor>$maxRecs){
  $tmp=(($maxRec-$PageSize)>=0) ? ($maxRec-$PageSize): 0;
  mysql_data_seek($RS,$tmp);
  $cPage=floor($maxRecs/$PageSize);
 }  else
  mysql_data_seek($RS,$dbCursor);
 $i=0;
 while (($row = mysql_fetch_array($RS)) && ($i++<$PageSize) ) {
  $Vysledky[]=$row;
 }
}
mysql_close($Conn);

Dále už následuje vytvoření formuláře pro vyhledávání a výpis výsledků hledání. Obojí je obdobou zobrazování jako v minulém díle. I zde jsou u vyhledané položky tři ikonky sloužící pro zobrazení detailu, úpravy záznamu a smazání položky. Jejich význam i funkčnost nedoznaly změn.

Vyhledávání osob

A to je úplně vše, stáhněte si ještě všechny zdrojové soubory této aplikace.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

9 komentářů

  1. zdeny

    Pro 5, 2009 v 23:31

    Dobrý den, vaše databáze kontaktů mě velmi zaujala, bohužel mám s ní jeden problém, na vlastním pc mi vše funguje skvěle, nahrajuli ovšem vše na web a s provozním databázi, tak se při ukládání firem uloží vždy jen prázdné hodnoty, u ukládání osob se vždy objeví hláška neexistující kontakt.

    Odpovědět
  2. Anonym

    Dub 13, 2010 v 23:19

    Zřejmě máte na serveru zakázané Register_Globals. Tato aplikace funguje korektně pouze při Register_Globals On. Což může být pro server nevhodné z hlediska bezpečnosti. U některých hostingů to lze nastavit pomocí vloženého souboru .htacess, u některých /spíše většiny/ Vám to musí udělat admin serveru. V současné době pracuji na úpravě této aplikace schopné pracovat pod Register_Globals Off.

    Odpovědět
  3. Jenda

    Dub 13, 2010 v 23:28

    Ještě dodatek: Nedávno se mi povedlo nahradit otravné vkládání volání DB do většiny souborů souborem jedním, volaným pak pomocí rutiny include, jak je v civilizovaném světe zvykem. Hodně to pomáhá zejména při ladění a přechodu z lokálu na ostrý server. Kdy se mění jen jeden soubor. Též jsem aplikaci doplnil admin rozhraním s dvěma úrovněmi Správce a Admin. Běžný user už nemůže v seznamu měnit a mazat údaje.

    Sorry, v minulém příspěvku jsem se nepodepsal.

    Odpovědět
  4. blaaablaaa

    Dub 14, 2010 v 15:05

    Jenda:
    v civilizovanem svete je zvykem si do souboru ulozit pouze prihlasovaci udaje ;)

    Odpovědět
  5. Zdeny

    Srp 10, 2010 v 18:15

    Dobrý den, už jste aplikaci upravili? Zkouším upravit proměnné, ale ne zrovna moc se mi to zatím daří :).

    Odpovědět
  6. Michal V.

    Led 15, 2011 v 10:13

    Dobrý den, chci se zeptat, existuje již upravená verze, která funguje pod Register_Globals Off? Předem děkuji, Michal V.

    Odpovědět
  7. Dusan

    Led 21, 2011 v 8:34

    Dobry den. Zajimalo by me jak mate upravenu aplikaci pro pouziti promenne Register_Globals Off pripadne viceurvnovy pristup. dekuji

    Odpovědět
  8. Michal V.

    Led 21, 2011 v 16:14

    Zajímalo by o i mne, celkem by se mi hodila

    Odpovědět
  9. JJ

    Říj 26, 2011 v 14:09

    nemate nekde upravene na ty register-globals off?

    Odpovědět

Napsat komentář: Anonym Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *