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.

9 Příspěvků v diskuzi

  1. 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.

  2. 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.

  3. 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.

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

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

Odpovědět