Vyhladavanie v php

Programovacie jazyky, rady, poradňa...
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Vyhladavanie v php

Príspevok od používateľa Frikso »

Zdravim. Prosim o pomoc dobre duše. Pracujem na jednom webe a chcel som tam spraviť vyhľadávanie na štýl filtra, kde user vyberie možnosti viacerých rolovacích menu, čo potrebuje. Spravil som si formulár, ten som skúšal obslúžiť pomocou vlastnej funkcie, avšak natrafil som na problem - script formulár obslúži iba vtedy, ak sú vyplnené všetky položky. V kóde prikladám formulár, script a štruktúru DB.
Formulár:

Kód: Vybrať všetko

<form action="#" method="post">
<input type="hidden" name="vyhladat" value="vyhladat"/>
<table>
<select name="dopyt" style="width:150px; ">
<option value="predaj">Predaj</option>
<option value="prenajom">Prenajom</option>
</select>
<tr><td>Druh:</td></tr>
<tr><td>
<select name="kat" style="width:150px; ">
<option>--Vyberte--</option>
<option value="byty">Byty</option>
<option value="domy">Domy</option>
<option value="pozemky">Pozemky</option>
<option value="novostavby">Novostavby</option>
<option value="podnikanie">Podnikanie</option>
</select></td></tr>
<tr><td>Lokalita:</td></tr>
<tr><td>
<select name="lokalita" style="width:150px; ">
<option>--Vyberte--</option>
<option value="1">Bratislava 1</option>
<option value="2">Bratislava 2</option>
<option value="3">Bratislava 3</option>
<option value="4">Bratislava 4</option>
<option value="5">Bratislava 5</option>
<option value="6">Okolie</option>
</select></td></tr>
<tr><td>Cena:</td></tr>
<tr><td>
<select name="cena" style="width:150px; ">
<option>--Vyberte--</option>
<option value="10000">do 10.000</option>
<option value="20000">do 20.000</option>
<option value="35000">do 35.000</option>
<option value="50000">do 50.000</option>
<option value="1é0000">do 100.000</option>
<option value="500000">do 500.000</option>
<option value="1000000">do 1.000.000</option>
<option value="5000000">do 5.000.000</option>
<option value="10000000">nad 5.000.000</option>
</select></td></tr>
</table>
<input type="submit" value="zobrazit"/>
</form>
Script:

Kód: Vybrať všetko

<?//vyhladavanie
function Vyhladaj($dopyt2, $kat2, $lokalita2, $cena2){
while ($zaznam = mysql_fetch_array($query)){ 
$query = mysql_query("SELECT * FROM polozky WHERE dopyt='$dopyt2' AND kat='$kat2' AND lokalita='$lokalita2' AND (cena<='$cena2') ORDER BY datum DESC") or die(mysql_error());


$datum = date('j. m. Y, H:i', $zaznam["datum"]);
	echo "<h2><a href=\"index.php?read=".$zaznam['id']."\">".$zaznam['nazov']."</a><span class=\"h2-datum\">".$datum."</span></h2>
	<p style=\"min-height:80px;\"><a href=\"index.php?read=".$zaznam['id']."\"><img src=\"".$zaznam["obr"]."\" width=\"120\" align=\"left\" height=\"90\" alt=\"\"/></a>
	Lokalita:Bratislava";
	if($zaznam['lokalita']==6){ echo" - okolie <br/></strong>"; }else{ echo"  
		   ".$zaznam['lokalita']." <br/></strong>";}
	echo" Cena:".$zaznam['cena'].",-Sk<br/>
	 exkluzivne - len - u - nas</p>";

}}?>
Všetky stlpce databazy su NOT NULL (MySQL). Keď pri volaní databázy
Volanie funkcie:

Kód: Vybrať všetko

... ... ...

}elseif(isset($_POST['vyhladat'])){
Vyhladaj($_POST["dopyt"], $_POST["kat"], $_POST["lokalita"], $_POST["cena"]);
.... .... .... 

Kód: Vybrať všetko

$query = mysql_query("SELECT * FROM polozky WHERE dopyt='$dopyt2' AND kat='$kat2' AND lokalita='$lokalita2' AND (cena<='$cena2') ORDER BY datum DESC") or die(mysql_error());
nesmiem namiesto AND použiť OR, pretože mi nevyberie spravne udaje.
Štruktúra tabuľky:

Kód: Vybrať všetko

 `id` int(11) NOT NULL auto_increment,
  `nazov` varchar(64) character set utf8 collate utf8_slovak_ci NOT NULL,
  `dopyt` varchar(255) character set utf8 collate utf8_slovak_ci NOT NULL,
  `lokalita` smallint(5) NOT NULL,
  `cena` int(32) NOT NULL,
  `popis` text character set utf8 collate utf8_slovak_ci NOT NULL,
  `clanok` text character set utf8 collate utf8_slovak_ci NOT NULL,
  `datum` varchar(64) character set utf8 collate utf8_slovak_ci NOT NULL,
  `kat` varchar(32) character set utf8 collate utf8_slovak_ci NOT NULL,
  `obr` varchar(255) character set utf8 collate utf8_slovak_ci NOT NULL,
 
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

najprv si ocheckuj co ti prislo postom a potom uz len zostavit spravny query. taktiez si uprav v html selecte prvy option takto v kazdom:

Kód: Vybrať všetko

<option value="none">--Vyberte--</option>
a potom:

Kód: Vybrať všetko

CheckSQLEntry($_POST);
$dopyt2 = $_POST['dopyt'];
$kat2 = $_POST['kat'];
$lokalita2 = $_POST['lokalita'];
$cena2 = $_POST['cena'];
echo "SELECT * FROM polozky WHERE ".(($dopyt2)?"dopyt='$dopyt2' AND ":"1=1 AND ") .
                             (($kat2)?"kat='$kat2' AND ":"1=1 AND ") .
                             (($lokalita2)?"lokalita='$lokalita2' AND ":"1=1 AND ") .
                             (($cena2)?"cena<='$cena2' AND ":"1=1") .
                             " ORDER BY datum DESC";

function CheckSQLEntry(&$pole)
{
  if( is_array($pole) && !empty($pole) )
  {
    foreach( $pole as $k => $v )
    {
      $pole[$k] = mysql_real_escape_string($v);
      if( $v == "none" )
        $pole[$k] = false;
    }
    return true;
  }
  else
    return false;
}
vystupne query bude trosku bacovske, ale funkcne
good luck.
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

Dikes, funguje to bezchybne, velmi si mi pomohol. :wink:

//predsa len som narazil na prekážku, kde si neviem pomôcť. Pri zadaní ceny (či už samotnej alebo s iným parametrom) mi vypíše chybu

Kód: Vybrať všetko

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /domains1/.../func.php on line 118
je to až pri spracovaní dát cyklom

Kód: Vybrať všetko

while ($zaznam = mysql_fetch_array($query2)){   //riadok 118


$datum = date('j. m. Y, H:i', $zaznam["datum"]);
	echo "<h2><a href=\"index.php?read=".$zaznam['id']."\">".$zaznam['nazov']."</a><span class=\"h2-datum\">".$datum."</span></h2>
	<p style=\"min-height:80px;\"><a href=\"index.php?read=".$zaznam['id']."\"><img src=\"".$zaznam["obr"]."\" width=\"120\" align=\"left\" height=\"90\" alt=\"\"/></a>
	Lokalita:Bratislava";
	if($zaznam['lokalita']==6){ echo" - okolie <br/></strong>"; }else{ echo"  
		   ".$zaznam['lokalita']." <br/></strong>";}
	echo" Cena:".$zaznam['cena'].",-Sk<br/>
	 exkluzivne - len - u - nas</p>";

}
mysql_fetch_array volá vstupne query, nazval som si ho query2, aby som s ním mohol manipulovať pri výpise :? asi zasa bačovské, čo?
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

chybova hlaska pojednava o zlom vstupe, t.j. ak ti dotaz nepresiel, neda sa vystup fetchovat.

Kód: Vybrať všetko

$query = mysql_query('...');
if ($query) {
  while ($zaznam = mysql_fetch_array($query))
  {
    .
    .
    .
  }
}
else
{
  die('Invalid query: ' . mysql_error());
}
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

Znova oživujem tuto temu. Po nejakom čase som sa vratil k mojmu projektu a narazil som na hlasenie

Kód: Vybrať všetko

Invalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BY datum DESC' at line 1
Hladal som na nete, čo za znak očakáva, nuž na nič som nedošiel :? Na servery je databáza MySQL 5.0.37.
Kód skriptu:

Kód: Vybrať všetko

$query2 = mysql_query("SELECT * FROM polozky WHERE ".(($dopyt2)?"dopyt='$dopyt2' AND ":"1=1 AND ") . 
                             (($kat2)?"kat='$kat2' AND ":"1=1 AND ") . 
                             (($lokalita2)?"lokalita='$lokalita2' AND ":"1=1 AND ") . 
                             (($cena2)?"cena<='$cena2' AND ":"1=1") . 
                             "ORDER BY datum DESC"); 
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Skús za 1=1 pridať medzeru:

Kód: Vybrať všetko

(($cena2)?"cena<='$cena2' AND ":"1=1")
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

chrono:V tom nie je chyba. Skúšal som všetky znaky, čo ma napadli, že by tam mohli aj nemohli byť, aj som sa to snažil preštylizovať, ale stále píše túto chybu. :roll:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ak nezadáš $cena2 tak vznikne reťazec

Kód: Vybrať všetko

1=1ORDER BY datum DESC
Skúsil si tam dať tú medzeru?
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

chrono napísal:Ak nezadáš $cena2 tak vznikne reťazec

Kód: Vybrať všetko

1=1ORDER BY datum DESC
Skúsil si tam dať tú medzeru?
mas pravdu, ja som tam zamerne nechal na zaciatku jednu medzeru, ale Friksovi sa asi nevidela :wink:

to Frikso: vzdy ked nevies kde je chyba v sql dotaze, nechaj si samotny dotaz vypisat, a ked ti samotna chyba neudre do oci, pomoze ti phpMyAdmin.
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

Skúšal som ju tam včera, aj dnes no stale to nejde :?
Igi:Zrejme som ju vymazal, keď som tam skúšal čosi dopísať a experimentoval s tým.
IgiPoP napísal:to Frikso: vzdy ked nevies kde je chyba v sql dotaze, nechaj si samotny dotaz vypisat, a ked ti samotna chyba neudre do oci, pomoze ti phpMyAdmin.
Ok, pokusim sa. :wink: Diki za ochotu pomôcť :) cenim si to
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Aké je to query? Môžeš ho zobraziť napr pomocou:

Kód: Vybrať všetko

$q = "SELECT * FROM polozky WHERE ".(($dopyt2)?"dopyt='$dopyt2' AND ":"1=1 AND ") . 
        (($kat2)?"kat='$kat2' AND ":"1=1 AND ") . 
        (($lokalita2)?"lokalita='$lokalita2' AND ":"1=1 AND ") . 
        (($cena2)?"cena<='$cena2' AND ":"1=1 ") . 
        "ORDER BY datum DESC";
        echo $q;
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

Vtedy sa mi to zobrazí a neprevedie sa SQL dotaz. Ja som použil funkciu mysql_query(); ako som bol zvyknutý

Kód: Vybrať všetko

$dopyt2 = $_POST['dopyt']; 
$kat2 = $_POST['kat']; 
$lokalita2 = $_POST['lokalita']; 
$cena2 = $_POST['cena']; 
$query2 = mysql_query("SELECT * FROM polozky WHERE ".(($dopyt2)?"dopyt='$dopyt2' AND ":"1=1 AND ") . 
                             (($kat2)?"kat='$kat2' AND ":"1=1 AND ") . 
                             (($lokalita2)?"lokalita='$lokalita2' AND ":"1=1 AND ") . 
                             (($cena2)?"cena<='$cena2' AND ":"1=1") . 
                             " ORDER BY datum DESC"); 
vtedy to funguje, avšak dostaneme sa k spomínanej chybe. Myslíš, že tam bude chyba? Zle volám databázu??
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ja viem, že ten môj príkaz len zobrazí sql query. Práve o to tam ide. Vygeneruj ho a daj to ho sem (aby sme mohli vylúčiť chybu v tom samotnom query).
IgiPoP
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 446
Registrovaný: 12 sep 2005, 8:17
Bydlisko: MT

Príspevok od používateľa IgiPoP »

napr. takto:

Kód: Vybrať všetko

$dopyt2 = $_POST['dopyt'];
$kat2 = $_POST['kat']; 
$lokalita2 = $_POST['lokalita']; 
$cena2 = $_POST['cena']; 
$sql = "SELECT * FROM polozky WHERE ".(($dopyt2)?"dopyt='$dopyt2' AND ":"1=1 AND ") . 
                             (($kat2)?"kat='$kat2' AND ":"1=1 AND ") . 
                             (($lokalita2)?"lokalita='$lokalita2' AND ":"1=1 AND ") . 
                             (($cena2)?"cena<='$cena2' AND ":"1=1") . 
                             " ORDER BY datum DESC";
echo htmlspecialchars($sql);
$query2 = mysql_query($sql) or die(mysql_error()); 
Frikso
Darca
Darca
Používateľov profilový obrázok
Príspevky: 4777
Registrovaný: 07 mar 2006, 19:09

Príspevok od používateľa Frikso »

Aha! Pozeram, že je tam jedno AND navyše

Kód: Vybrať všetko

SELECT * FROM polozky WHERE dopyt='predaj' AND kat='byty' AND lokalita='3' AND cena<='5000000' AND ORDER BY datum DESCYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY datum DESC' at line 1
Tak som to opravil, ide to bezchybne. Diki moc chalani, pomohli ste mi, ako sa vám odvďačím? :)
Napísať odpoveď