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