Databáze kontaktů v PHP 3.

    0

    V minulých dvou dílech o tvorbě aplikace pro uchovávání kontaktů přes PHP jsme si navrhli databázi, připravili skript pro zadávání nových firem a osob a také zajistili uložení dat do databáze. Dnes si naprogramujeme skripty pro hledání firem. Skript bude umožňovat hledání podle názvu a města sídla firmy.

    Vyhledávání firem

    Pokud skladujete jakékoliv věci, časem zjistíte, že je potřebujete také rychle najít. A nejinak tomu bude i v naší aplikaci. Dnes si napíšeme skripty sloužící k vyhledání firmy podle zadání a zobrazení dat o ní. Vyhledávat bude možné podle 2 kritérií – název firmy a město. Pro ukázkovou aplikaci je to dostačující, v reálném provozu je dobré hledat i podle IČO/DIČ. Ve výsledcích vyhledávání zobrazíme základní údaje, tj. název firmy, adresu, telefon. Další údaje se zobrazí po kliknutí na ikonu detailu Detail. Z výsledků hledání také můžeme mazat Smazat a editovat Edit.

    Vyhledávací formulář a výsledky hledání

    Ve vyhledávacím skriptu nejdříve nastavíme pomocné proměnné pro případné stránkování výpisu výsledků hledání.

    • $cPage – aktuálně vypisovaná stránka
    • $PageSize – počet řádků ve výpisu
    • $dbCursor – záznam od kterého se vypisuje
    • $maxRec – pouze pomocná proměnná pro LIMIT v SQL dotazu
    • $isNext – příznak, který říká zda bude další stránka ve výpisu

    Jak jsem již nahoře psal, výpis výsledků budeme stránkovat. A protože mě během psaní tohoto výukového skriptu napadl nový postup, jak to udělat, tak vám jej také předložím k posouzení. Ale o tom později, nejdříve vám musím ukázat tento kousek kódu:

    <?
    $PageSize=10;
    if ( (!isset($cPage)) || (empty($cPage)) )
     $cPage=0;
    $dbCursor=$PageSize*$cPage;
    $maxRec=$PageSize+1;
    $isNext=0;
    $Vysledky=Array();
    $SQLText=““;
    if (isset($Nazev))
     $SQLText.=“(Nazev LIKE ‚$Nazev%‘) OR „;
    else
     $Nazev=“%“;
    if (isset($Mesto))
     $SQLText.=“(Mesto LIKE ‚$Mesto%‘) OR „;
     
    if ($SQLText!=““){
     $Conn = mysql_connect(„localhost“,“dbuser“,“userdb“);
     mysql_select_db(„db_interval“,$Conn);
     $SQLText=substr($SQLText,0,strlen($SQLText)-4);
     $SQLText=“SELECT * FROM TKontakty_Firmy WHERE $SQLText ORDER BY Nazev LIMIT $dbCursor,$maxRec“;
     $RS=mysql_query($SQLText,$Conn);
     $isNextRec=(mysql_num_rows($RS)>$PageSize) ? 1:0;
     $i=0;
     while( ($row = mysql_fetch_array($RS)) && ($i++<$PageSize) ) {
      $Vysledky[]=$row;
     }
     mysql_close($Conn);
    }
    ?>

    Pokud zjistíme, že do skriptu byl odeslán obsah formuláře, tj. proměnná $Nazev nebo $Mesto jsou nastaveny, vložíme do proměnné $SQLText podmínky vyhledávání. Jelikož se jedná o „stringové“ proměnné, použijeme LIKE. A na pravou stranu hledaného výrazu přidáme %, jelikož chceme, aby se hledalo podle kořene slova. To, zda se bude prohledávat databáze, rozhodneme podle toho, zda je v $SQLText něco uloženo. Přece nebudeme zbytečně používat další proměnnou. Pokud je v $SQLText něco uloženo, vytvoříme spojení na databázi a vytvoříme SQL dotaz. Do něj vložíme podmínky pro hledání. Pak nastavíme limit pro stránkování. Limit nastavíme od $dbCursor s velikostí $maxRec. V $maxRec je uložena velikost stránky navýšená o 1. Tím se dostáváme k nápadu, který mě napadl a o kterém se zmiňuji na začátku článku. Pokud nastavíme limit o 1 větší než je velikost stránky a počet záznamů, který se nám vrátí, je větší než velikost stránky, víme, že podmínkám hledání vyhovuje více záznamů a tudíž budeme stránkovat.

    Myslím si, že tato metoda při takto jednoduchém SELECTu asi nebude o moc lepší než COUNT(*), ale při JOINu atd. bude asi efektivnější. Také předpokládám, že jsem objevil již dávno vynalezené, takže mi za to do diskuse pod článkem nenadávejte:o). Pochopitelně, tato metoda neumožňuje vypsat počet stránek nalezených hledáním. Jedná se pouze o nápad, který nabízím k posouzení. Pro nastavení $isNextRec je použito ternárních operátorů, je zbytečné psát if.

    Takže nyní pouze překopírujeme výsledek dotazu do pole $Vysledky ve standardním cyklu. A opět využijeme „autoindexace“ polí v PHP. Nyní je již na řadě vlastní stránka, opět vyberu pouze podstatné části, zbytek najdete ve zdrojových souborech připojených k tomuto článku.

    // Formulář pro vyhledávání
    <table cellpadding=“3″ cellspacing=“0″ border=“0″ width=“300″>
    <! –Main page –><form name=“myform“ action=“search_company.php“ method=“post“>
     <tr><td CLASS=“SectionTitle“ colspan=“2″>Vyhledávání firem</td></tr>
     <tr><td>Název</td><td><input type=“text“ name=“Nazev“ value=“<?echo $Nazev;?>“></td></tr>
     <tr><td>Město</td><td><input type=“text“ name=“Mesto“ value=“<?echo $Mesto;?>“></td></tr>
     <tr>
    <td colspan=“2″ align=“right“><input type=“submit“ value=“OK“ CLASS=“Button“><input type=“reset“ CLASS=“button“></td>
    </tr>
    </form>
    </table>
    …………..
    // Zobrazení výsledků hledání
    <table cellpadding=“3″ cellspacing=“0″ border=“0″ width=“480″>
    <tr><td CLASS=“SectionTitle“ colspan=“3″>Výsledky hledání</td>
    <td CLASS=“SectionTitle“ align=“right“> 
    <?
    if ($cPage>0){
     echo „<a href=\“search_company.php?Nazev=$Nazev&Mesto=$Mesto&ICO=$ICO&DIC=$DIC&cPage=“.($cPage-1).“\“>“;
     echo „<img src=\“left.gif\“ width=\“16\“ height=\“16\“ ALT=\“Předchozí\“ border=\“0\“>“;
     echo „</a>“;
    }
    else
     echo “ „;
    if ($isNextRec==1){
     echo „<a href=\“search_company.php?Nazev=$Nazev&Mesto=$Mesto&ICO=$ICO&DIC=$DIC&cPage=“.($cPage+1).“\“>“;
     echo „<img src=\“right.gif\“ width=\“16\“ height=\“16\“ ALT=\“Další\“ border=\“0\“>“;
     echo „</a>“;
    }
    else
     echo “ „;
    ?>
      </td>
    </tr>
      <tr>
       <td CLASS=“SubTitle“>Název</td><td „CLASS=SubTitle“>Adresa</td><td CLASS=“SubTitle“ COLSPAN=“2″>Telefon</td>
     </tr>
    <?
     for ($i=0;$i<count($Vysledky);$i++){
      if ( ($i % 2)==0)
       $LStyle=“LightLine“;
      else
       $LStyle=“DarkLine“;
      echo „<tr>“;
      echo „<td CLASS=\“$LStyle\“ nowrap valign=\“top\“>“.$Vysledky[$i][„Nazev“].“</td>“;
      echo „<td CLASS=\“$LStyle\“ valign=\“top\“>“.$Vysledky[$i][„Ulice“].“ , „.$Vysledky[$i][„Mesto“].“<br>“.$Vysledky[$i][„PSC“].“</td>“;
      echo „<td CLASS=\“$LStyle\“ valign=\“top\“>“.$Vysledky[$i][„Telefon“].“</td>“;
      echo „<td CLASS=\“$LStyle\“ valign=\“top\“ align=\“right\“ nowrap><a href=\“javascript:showDetail(„.$Vysledky[$i][„Firma_ID“].“)\“><img src=\“detail.gif\“ border=0 width=16 height=16 ALT=DETAIL HSPACE=3></a>“;
      echo „<a href=\“edit_company.php?Firma_ID=“.$Vysledky[$i][„Firma_ID“].“\“><img src=\“edit.gif\“ border=\“0\“ width=\“16\“ height=\“16\“ ALT=\“UPRAVIT\“ HSPACE=\“3\“></a>“;
      echo „<a href=\“javascript:deleteRecord(„.$Vysledky[$i][„Firma_ID“].“)\“><img src=\“delete.gif\“ border=\“0\“ width=\“16\“ height=\“16\“ ALT=\“SMAZAT\“ HSPACE=\“3\“></a>“;
      echo „</td></tr>\n“;
     }
    ?>

    Myslím, že vstupním formulářem se nemá vcelku cenu zabývat, jsou to vlastně dvě textová pole pro vložení hledaného textu a odesílací a tlačítko Reset. V části pro výpis výsledků hledání si nejdříve zjistíme, zda jsem na první (nulté) stránce výpisu. Pokud ne, zobrazíme šipku s odkazem, který vede na zobrazení předchozí stránky výsledků hledání. Pak zjistíme, zdali jsme na jsme na poslední stránce výpisu. Pokud ne, zobrazíme šipku doprava s odkazem na další stránku.

    Ve výsledcích hledání zobrazíme název firmy, adresu a telefon. Pak následují aktivní ikonky pro zobrazení detailu, úpravu a smazání. Ale ty si probereme až přístě. Zdrojové soubory aplikace jsou ke stažení zde.

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

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

    Žádný příspěvek v diskuzi

    Odpovědět