Autor Zpráva
cenek
Profil
Ahoj,

Dělám vyhledávací filtr výpisu z databáze.
Takže například:

<select name="lokalita">
  <option value="praha">Praha</option>
  <option value="ostrava">Ostrava</option>
</select>

Takže po zvolení sql příkaz bude vypadat třeba takto

mysql_query("SELECT * FROM tabulka WHERE lokalita = ".$_GET["lokalita"].");

Ovšem nejsem si jist, jak zprovoznit aby se vypsali všechny lokality, pokud bych do selectu přidal položku "Všechny lokality". Volat přes to funkci, ve které by byly všechny lokality vypsané je kravina.

Může mi někdo poradit nějaké řešení?

Díky
Alphard
Profil
Tak tam vůbec nedávejte to where. Ten dotaz je normální řetězec, můžete se ho připravit skládáním.
cenek
Profil
Mel jsem za to, ze bez where to nepujde... jak by tedy takovy prikaz vypadal?
Someone
Profil
<select name="lokalita">
  <option value="vsechny">Všechny lokality</option>
  <option value="praha">Praha</option>
  <option value="ostrava">Ostrava</option>
</select>

<?php
  mysql_query("SELECT * FROM tabulka".($_GET['lokalita']!="vsechny"?" WHERE lokalita='".$_GET['lokalita']."'":''));
?>
cenek
Profil
Díky to funguje.

Ale mám s tím další problém. Co když má filtr více selectů? Vyhazovalo by mi to "SELECT * FROM tabulka WHERE lokalita=neco WHERE typ=neco.... atd.

Jde o to, že v tomhle řetězci se těžko určí kdy má být před tím parametrem WHERE a kdy AND. Možné by to bylo jen kdyby měla všechna pole vždy povinou hodnotu, což je v reálu nesmysl.

Doufám, že jsem to popsal dostatečně ;)
mzk
Profil *
cenek:
pokud tam budeš mít jen 'AND', tak to jde jednoduše pomocí funkce implode()

$sql = 'SELECT * FROM tabulka';
$par = array();

if ($_GET['lokalita'] != "vsechny") $par[] = 'lokalita="' . $_GET['lokalita'] . '"';
if ($_GET['podminka'] != "podminka") $par[] = 'podminka="' . $_GET['podminka'] . '"';
a potom už by mělo stačit otestovat jestli jsou nějaké parametry a pokud ano, tak tam dát $sql . ' WHERE ' . a použít funkci implode()
cenek
Profil
Ok ale jak určím kdy má být v tom sql AND a kdy WHERE?
Alphard
Profil
cenek:
Je to v poli, mohlo by se hodit count() (zjistíte, jestli vůbec where) a implode() (k čemu služí viz manuál).
A ještě vaší pozornosti doporučuji funkci mysql_real_escape_string().

A kdyby vám tohle všechno přišlo složité a napadla vás myšlenka, že už to řešily tisíce lidí před vámi, máte pravdu.
Bear
Profil *
mam podobny problem, osobne se v php moc nevyznam a potreboval bych poradit, potreboval bych vypis databaze pomoci 3 rolovacich filtru... v databazi mam asi 9 polozek a pomoci 3 udaju bych to chtel filtrovat. Pomuze mi nekdo? Potreboval bych kus kodu abych to pochopil.
panther
Profil
Bear:
neuvadis problem, ktery by se v tomto vlakne drive jiz neresil. S cim konkretne mas kde problem? Dodej ukazku.
Bear
Profil *
Takhle to vypada, potreboval bych aby kdyz zmacknu odeslat tak aby mi to vyfiltrovalo podle tech 2 ( chci do budoucna 3) filtru a vypsalo pod sebe..






Bear
Profil *
http://2i.cz/60f55872a1
panther
Profil
Bear:
a kde je problem? Bude to obycejny select se dvema podminkami ve where spojenymi operatorem AND.
Šéva
Profil
Bear:
<form action="" method="post">
<select name="filtr1">
<option value="hodnota1">hodnota1</option>
<option value="hodnota2">hodnota2</option>
</select>
<br>
<select name="filtr2">
<option value="hodnota1">hodnota1</option>
<option value="hodnota2">hodnota2</option>
</select>
<br>
<input type="submit" name="filtrovat" value="Filtr">
</form>
<?php
if(IsSet($_POST["filtrovat"]))
{
$dotaz=mysql_query("select * from tabulka where sloupec1='$_POST[filtr1]' and sloupec2='$_POST[filtr2]'");
//atd atd...
}
?>
Bear
Profil *
Mám takovy kod a vubec nevim jak to tam zakomponovat, ja vim ze to je docela silene ale programuje poprve teprve mesic a potrebuji to odeslat at to funguje, jedine co mi chybi je ten filtr pro 3 polozky, jestli mi s timto nekdo poradi tak budu mega moc rad


 <form action="" method="get">
<p><b>Line:</b> 
<select name="id_line"  value="<?php echo $id_line ?>" >
    <option value="">Vyberte linku</option>
    <option value="L1">L1</option>
    <option value="L2">L2</option>
    <option value="L3">L3</option>
    <option value="L4">L4</option>
    <option value="L5">L5</option>
    <option value="L6">L6</option>
    <option value="L7">L7</option>
    <option value="L8">L8</option>
    <option value="L9">L9</option>
    <option value="LA">LA</option>
    <option value="">All</option>    
</select>
</p>
<b>Nález:</b> 
<select name="zavada"  value="<?php echo $zavada ?>" >
    <option value="">Vyberte Nález</option>
    <option value="Šroubovák">Šroubovák</option>
    <option value="INTERLOCK - Test fail">INTERLOCK - Test fail</option>
    <option value="INTERLOCK - Prasklá díra">INTERLOCK - Prasklá díra</option>
    <option value="INTERLOCK - Nevyskakuje klika">INTERLOCK - Nevyskakuje klika</option>  
    <option value="">All</option>    
</select>
<p>
<INPUT name="odeslat2" TYPE=Submit VALUE="Zobrazit">
</p>
 </form>



if (isset($_GET['odeslat2'])) { // Zpracovat formular.

  $zpráva = NULL; // Vytvoreni nove prazdne promenne.


   // Overit id line.
  if (empty($_GET['id_line'])) {
    $id_line = FALSE;
    $zpráva .= '<p>Zapomneli jste zadat cislo Line!</p>';
  } else {
    $id_line = $_GET['id_line'];
  }
 
 
  if ($id_line) { 
 echo  '<table align="center" cellspacing="2" cellpadding="2" width="1000">
      <tr>
      <td align="center"><b>Line</b></td>
      <td align="center"><b>Type</b></td>
      <td align="center"><b>OEM</b></td>
      <td align="center"><b>Serial Number</b></td>
      <td align="center"><b>Model Number</b></td>
      <td align="center"><b>Nález</b></td>
      <td align="center"><b>Dira na HDD</b></td>
      <td align="center"><b>Sroubovak Poloha</b></td>
      <td align="center"><b>Sroubky</b></td>
      <td align=\"center\" width=\"5%\"><b>Pridal</b></td>
      <td align="center"><b>Datum pridání</b></td>
      </tr>'; 
require_once ('mysql_spojit.php');
require_once('Pager.class.php'); 



$dotaz = "SELECT CONCAT(id) AS ID, id_line, g7_g8, oem, serial_number, model_number, zavada, sroubovak_dira, sroubovak_poloha, sroubky, add_user, 
    DATE_FORMAT(date_time, '%d. %m. %Y - %k:%i') AS dr FROM data WHERE id_line = '$id_line' ORDER BY date_time DESC";
    $výsledek = @mysql_query ($dotaz); // Spustit dotaz
    $pocet = mysql_num_rows ($výsledek);
        
    if ($výsledek) { // Je-li vse OK.
      
      echo  '<div align="center">';
      echo "<p><big><b>Pocet nalezenych zaznamu : $pocet </b></big></p>";
      echo  '<p></p></div>';
       }
//vytvoreni objektu, jako parametry konstruktoru se 
//predavaji SQL dotaz a parametr URL, ktery bude pager
//pouzivat pro odkazy na dalsi stranky  
$pager = new Pager("SELECT * FROM data WHERE id_line LIKE '$id_line' ORDER BY date_time DESC", 'page');
$pager->HtmlSpecialChars = 0;
$pager->PageSize = 4;
$pager->PagerAlign = "left";
//ziska z databaze pozadovanou cast vysledkove sady
$pager->DataBind();

//postupne ziskavani jednotlivych zaznamu z vysledkove sady
while ($obj = $pager->GetOne())
 
  echo '<tr>
      <td align=\"left\" width=\"5%\">'.$obj->id_line.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->g7_g8.
  '</td>
      <td align=\"left\" width=\"8%\">'.$obj->oem.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->serial_number.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->model_number.
  '</td>
      <td align=\"left\" width=\"14%\">'.$obj->zavada.
  '</td>
      <td align=\"left\" width=\"8%\">'.$obj->sroubovak_dira.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->sroubovak_poloha.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->sroubky.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->add_user.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->date_time.
  '</td>';
  echo '</tr><table/>'; 
//mody lze kombinovat - takto lze skombinovat 
//zakladni strankovani spolu s odkazy na prvni, 
//posledni, predchozi a nasledujici stranky
//defaultni strankovani
$firstLastMode = new FirstLastPagerMode();
$pager->AddPagerMode($firstLastMode);
$prevNextMode = new PrevNextPagerMode();
$pager->AddPagerMode($prevNextMode);
$defaultMode = new DefaultPagerMode();
$pager->AddPagerMode($defaultMode);

$pager->DrawPager();
 include ('sablony/pata2.inc');
    
}

......


else{

echo  '<table align="center" cellspacing="2" cellpadding="2" width="1000">
      <tr>
      <td align="center"><b>Line</b></td>
      <td align="center"><b>Type</b></td>
      <td align="center"><b>OEM</b></td>
      <td align="center"><b>Serial Number</b></td>
      <td align="center"><b>Model Number</b></td>
      <td align="center"><b>Nález</b></td>
      <td align="center"><b>Dira na HDD</b></td>
      <td align="center"><b>Sroubovak Poloha</b></td>
      <td align="center"><b>Sroubky</b></td>
      <td align=\"center\" width=\"5%\"><b>Pridal</b></td>
      <td align="center"><b>Datum pridání</b></td>
      </tr>';
require_once ('mysql_spojit.php');
require_once('Pager.class.php');
$dotaz = "SELECT CONCAT(id) AS ID, id_line, g7_g8, oem, serial_number, model_number, zavada, sroubovak_dira, sroubovak_poloha, sroubky, add_user, 
    DATE_FORMAT(date_time, '%d. %m. %Y - %k:%i') AS dr FROM data ORDER BY date_time DESC";
    $výsledek = @mysql_query ($dotaz); // Spustit dotaz
    $pocet = mysql_num_rows ($výsledek);
        
    if ($výsledek) { // Je-li vse OK.
      echo  '<div align="center">';
      echo "<p><big><b>Pocet nalezenych zaznamu : $pocet </b></big></p>";
      echo  '<p></p></div>';
       }
//vytvoreni objektu, jako parametry konstruktoru se 
//predavaji SQL dotaz a parametr URL, ktery bude pager
//pouzivat pro odkazy na dalsi stranky
$pager = new Pager('SELECT * FROM data ORDER BY date_time DESC', 'page');
$pager->HtmlSpecialChars = 0;
$pager->PageSize = 5;
$pager->PagerAlign = "left";
//ziska z databaze pozadovanou cast vysledkove sady
$pager->DataBind();

//postupne ziskavani jednotlivych zaznamu z vysledkove sady
while ($obj = $pager->GetOne())
 
  echo '<tr>
      <td align=\"left\" width=\"5%\">'.$obj->id_line.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->g7_g8.
  '</td>
      <td align=\"left\" width=\"8%\">'.$obj->oem.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->serial_number.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->model_number.
  '</td>
      <td align=\"left\" width=\"14%\">'.$obj->zavada.
  '</td>
      <td align=\"left\" width=\"8%\">'.$obj->sroubovak_dira.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->sroubovak_poloha.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->sroubky.
  '</td>
      <td align=\"left\" width=\"5%\">'.$obj->add_user.
  '</td>
      <td align=\"left\" width=\"15%\">'.$obj->date_time.
  '</td>';
  echo '</tr><table/>'; 
//mody lze kombinovat - takto lze skombinovat 
//zakladni strankovani spolu s odkazy na prvni, 
//posledni, predchozi a nasledujici stranky
//defaultni strankovani 
$firstLastMode = new FirstLastPagerMode();
$pager->AddPagerMode($firstLastMode);
$prevNextMode = new PrevNextPagerMode();
$pager->AddPagerMode($prevNextMode);
$defaultMode = new DefaultPagerMode();
$pager->AddPagerMode($defaultMode);

$pager->DrawPager();
 include ('sablony/pata2.inc');
} 

}


takhle mi to funguje pro jeden filtr akorat nevim jak tam pridat ten druhy
Šéva
Profil
<?php
 if (empty($_GET['id_line']) and empty($_GET['zavada'])) {
    $id_line = FALSE;
    $zpráva .= '<p>Zapomneli jste zadat cislo Line a Zavadu!</p>';
  } else {
    $id_line = $_GET['id_line'];
    $zavada=$_GET['zavada'];
  }
  
   if (!empty($id_line) and !empty($zavada))
   {
   //...
   $dotaz = "SELECT CONCAT(id) AS ID, id_line, g7_g8, oem, serial_number, model_number, zavada, sroubovak_dira, sroubovak_poloha, sroubky, add_user, 
    DATE_FORMAT(date_time, '%d. %m. %Y - %k:%i') AS dr FROM data WHERE id_line = '$id_line' and zavada='$zavada' ORDER BY date_time DESC";
  //...
  $pager = new Pager("SELECT * FROM data WHERE id_line LIKE '$id_line' and zavada LIKE '$zavada' ORDER BY date_time DESC", 'page');
  //...
  }
  ?>

zbytek si už nějak doplň, zhruba takhle nějak by to snad mohlo chodit...
Bear
Profil *
diky moc uz jsem to rozchodil =)
DepperDC
Profil
nechci kazit krásnou diskuzi 7 let starou ale naučil jsem se používat : Select * from table Where 1=1 a následně můžete vkládat podmínky všechny začínající na AND neco = něco. není to tak čisté řešení jak je zde popisováno, ale učel plní dokonale a hlavně je nádherně čitelné i pro začátečníky. Proč 1=1 protože tato podmínka je vždy splněna, takže vypíše všechna data nikterak omezovaná a následně můžete na tomto stavět dál

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0