ugrás a tartalomhoz

PHP keresés

Freddy88 · 2012. Jan. 14. (Szo), 23.42
Heló!

Kaptam egy php kódot egy másik oldalon, de valami hiba merült fel, ezen a területen nem brilirozok tehát valaki ha segítene jó lenne.
  1. $keres=array();  
  2. if(isset($_POST['nem'])){  
  3.   $keres[]="nem='".mysql_real_escape_string($_POST['nem'])."'";  
  4. }  
  5. if(isset($_POST['kor'])){  
  6.   $keres[]="kor='".mysql_real_escape_string($_POST['kor'])."'";  
  7. }  
  8. if(isset($_POST['hol'])){  
  9.   $keres[]="hol='".mysql_real_escape_string($_POST['hol'])."'";  
  10. }  
  11.   
  12. $keres=explode('AND'$keres);  
  13. if($keres){  
  14.   $keres'WHERE ' . $keres;  
  15. }  
  16.   
  17. $result=mysql_query("SELECT * FROM user $keres"or die (mysql_error());  
 
1

explode

Poetro · 2012. Jan. 14. (Szo), 23.49
Ugye azt tudod, az explode mit csinál? Nem lehet, hogy esetleg az implode-ra van szükséged? Bár az AND körül akkor is szükség lesz szóközökre.
2

Lehet

Freddy88 · 2012. Jan. 14. (Szo), 23.52
Én nem tudom, hogy melyik kell, bár csodálkoztam, mert azt tudom hogy az explode az szét szedésre szolgál. De a gond ott kezdődik hogy a végén a $keres értéke WHERE Array.
3

Húúú

Pepita · 2012. Jan. 15. (V), 20.55
Mert onnét meg kimaradt: []. ($keres[]=' WHERE ' ....).
Egyébként ne nagyon irkálj olyat, hogy "valami hiba van benne", hanem vedd a fáradságot és másold ide a hibaüzit! Plusz a forráskódot, és jelöld meg, hogy a hibaüzi x. sora a COLORER-ben melyiknek felel meg.
Én nem tudom, hogy melyik kell
Forgasd sokat a manual-t, ez alapdolog. És bánj óvatosabban az innen-onnan letöltött - többnyire gány - kódokkal. Szívesebben segítek - és sztem más is - új, egyéni kód elkészítésében. Mert abból tanulsz is.
4

Köszi a hozzászólást

Freddy88 · 2012. Jan. 15. (V), 21.06
Na már most (talán ez egy fokkal jobb) megpróbálom kiegészíteni ezt a kódot úgy hogy ha checkboxokkal viszem fel a keresési feltételeket és nyílván akkor több lehetőséget is el lehet küldeni. De miután egy fél napja ezzel küszködöm most szeretnék tanácsot kérni. A kód amit eddig produkáltam (és hibaüzenetet nem kapok csak egyszerűen nem fut le, mert ha valamelyik csoport [nem vagy megye] üres akkor nem kérdezi le az adatokat):
  1. if(isset($_POST['kuld'])){  
  2.   
  3. $nem=array();  
  4.   
  5.   for($n=0; $n<count($_POST['nem']); $n++){  
  6.     $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";  
  7.   }  
  8.   
  9. $nem=implode(' OR '$nem);  
  10.   
  11. $megye=array();  
  12. if(isset($_POST['megye'])){  
  13. for($m=0; $m<count($_POST['megye']); $m++){  
  14.   $megye[]="megye='".mysql_real_escape_string($_POST['megye'][$m])."'";  
  15. }  
  16. }else{  
  17.   $megye[]="megye=''";  
  18. }  
  19. $megye=implode(' OR '$megye);  
  20.   
  21. $keres=array($nem$megye);  
  22. echo "$keres";  
  23.   
  24.   
  25. $result = mysql_query("SELECT * FROM user WHERE $nem AND $megye");  
  26. while($row=mysql_fetch_array($result)){  
  27.   $name=$row['name'];  
  28.    
  29.   echo "<div id='user'><a href='profile.php?name=$name'>$name</a></div>";  
  30. }  
5

Form?

Pepita · 2012. Jan. 15. (V), 21.43
Jó lenne látni egy egyszerűsített (teszt)formot is, abban is lehet hiba. Checkbox mire kell?
Itt viszont ezt látom:
isset($_POST['megye']. Ez azt jelenti, hogy van(nak) "megye" nevű űrlapmező(k) a $_POST tömbben, nem azt, hogy ezeknek az értékei (HTML-ben: Value) nem üres string. De a php kódból azt gondolom, hogy a "megye" az input tömb, ezért a feldolgozáskor azt kell ellenőrizd, hogy $_POST['megye'][$m]<>''. Tehát nem isset(...).
ha valamelyik csoport [nem vagy megye] üres akkor nem kérdezi le az adatokat):
Ha pl. minden "megye" mezőt üresen hagysz, akkor a WHERE vhogy így néz ki: "nem='xx' OR nem='yy' AND megye=''". Ezt (sql-t), amíg tesztelsz, kiírathatnád magadnak! Tehát (de ehhez meg a tábla ismerete lenne hasznos) csakis azokat a rekordokat kapod vissza, amelyekben a megye mező értéke üres string (és nem NULL, stb.). Ha nincs ilyen rekord, akkor semmit. Emiatt üres (megye)csoport esetén olyan megyefeltételt kell megadni, ami minden rekordra igaz, pl.: "megye <> NULL". De ez csak akkor biztos megoldás, ha a táblának ez az oszlopa rendelkezik is ezzel a (NOT NULL) kritériummal.
6

Figyelni kellene az

kuka · 2012. Jan. 16. (H), 10.03
Figyelni kellene az operátorokra. Az and elsőbbsége magasabb mint az oré. Tehát ha ebből a karakterláncból:
  1. SELECT * FROM user WHERE $nem AND $megye  
Ez az SQL utasítás áll össze:
  1. SELECT * FROM user WHERE nem='nő' OR nem='férfi' AND megye='Bács-Kiskun' OR megye='Baranya'  
Akkor az úgy lesz értelmezve mint:
  1. SELECT * FROM user WHERE nem='nő' OR (nem='férfi' AND megye='Bács-Kiskun'OR megye='Baranya'  
Tehát a listában benne lesz minden nő, Bács-Kiskun megyei férfiak, minden Baranya megyei.

Részletek a MySQL dokumentáció Operator Precedence lapján.
7

Érdekes

Freddy88 · 2012. Jan. 17. (K), 00.23
Nem sejtettem hogy itt is ez a rendszer van, és köszönöm, hogy leírtad. Viszont most megint ott vagyok ahol elkezdtem:D nem tudom, hogy kezdjek hozzá:(
8

zárójelek

Poetro · 2012. Jan. 17. (K), 00.26
Mondjuk magad rakod ki a zárójeleket. Ezzel megelőzheted a motor által szabályozott csoportosítást.
  1. SELECT * FROM user WHERE (nem='nő' OR nem='férfi'AND (megye='Bács-Kiskun' OR megye='Baranya')  
9

Jogos

Freddy88 · 2012. Jan. 17. (K), 14.41
Ez tényleg működő megoldás. De van még egy gondom (mint mindig), mert ha nem jelölök be megyét vagy nemet akkor automatikusan egy (Array) lesz a változóban hiába csinálok ellenörzést.
  1. $keres=array();  
  2.   if($nem!=""){  
  3.     $keres[]="($nem)";  
  4.   }  
  5.   if($megye!=""){  
  6.     $keres[]="($megye)";  
  7.   }  
  8.   $keres=implode(' AND '$keres);  
  9.     
  10.     
  11.   echo "$keres";  
  12. }  
10

A Jan. 15. (V), 21.06

kuka · 2012. Jan. 17. (K), 14.53
A Jan. 15. (V), 21.06 válaszodban $nem és $megye még tömb volt, most meg ismét karakterláncként kezeled. Akkor most mik is ők?
11

A tömből készültek (csak

Freddy88 · 2012. Jan. 17. (K), 15.07
A tömből készültek (csak ebben a kódban már beletettem egy plusz kor vizsgálatot is, de ne zavarjon meg senkit:D):
  1. if(isset($_POST['kuld'])){  
  2.     $nem=array();  
  3.   
  4.     $countn=count($_POST['nem']);  
  5.   
  6.     if($countn==0){  
  7.       $nem[]="";  
  8.     }else{  
  9.       for($n=0; $n<$countn$n++){  
  10.       $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";  
  11.     }  
  12.   
  13.     $nem=implode(' OR '$nem);  
  14.   
  15.     }  
  16.   
  17.     $megye=array();  
  18.   
  19.     $countm=count($_POST['megye']);  
  20.   
  21.     if($countm==0){  
  22.       $megye[]="";  
  23.     }else{  
  24.       for($m=0; $m<$countm$m++){  
  25.       $megye[]="lakhely='".mysql_real_escape_string($_POST['megye'][$m])."'";  
  26.     }  
  27.   
  28.     $megye=implode(' OR '$megye);  
  29.   
  30.     }  
  31.   
  32.     $kor=array();  
  33.     if(!emptyempty($_POST['kortol'])){  
  34.       $kor[]="kor>'".mysql_real_escape_string($_POST['kortol'])."'";  
  35.     }  
  36.   
  37.     if(!emptyempty($_POST['korig'])){  
  38.       $kor[]="kor<'".mysql_real_escape_string($_POST['korig'])."'";  
  39.     }  
  40.      
  41.     $kor=implode(' AND '$kor);  
  42.   
  43.   $keres=array();  
  44.   
  45.   if($nem!=""){  
  46.     $keres[]="($nem)";  
  47.   }  
  48.   
  49.   if($megye!=""){  
  50.     $keres[]="($megye)";  
  51.   }  
  52.   
  53.   if($kor!=""){  
  54.     $keres[]="($kor)";  
  55.   }  
  56.   
  57.   $keres=implode(' AND '$keres);  
  58.     
  59.     
  60.   echo "$keres";  
  61. }  
12

Nem figyelsz!

Pepita · 2012. Jan. 17. (K), 22.34
Vizsgáld így: if($nem[0]!=""), de igazából itt kéne a count v. isset, nem korábban.
13

A vizsgálattal nem volna

kuka · 2012. Jan. 18. (Sze), 10.16
A vizsgálattal nem volna semmi gond, mert korábban volt a 13. sorban:
  1. $nem=implode(' OR '$nem);  
A hiba ott van, hogy az említett implode() az else ágban van, tehát ha teljesül az if feltétele, akkor nem hajtódik végre. Csak ki kellene mozgatni az implode()-os sorokat a feltételes utasítás tömbökön kívülre. És hogy a jövőben ez könnyebben észrevehető legyen, jó volna konzisztensen használni a bekezdéseket.
14

Nem értem

Pepita · 2012. Jan. 18. (Sze), 17.55
Az elsővel elvileg egyet értek (és köszi a kijavítást), de én egész mást látok a 13. sorban (IE8 miatt?).
Csak ki kellene mozgatni az implode()-os sorokat a feltételes utasítás tömbökön kívülre.
Akkor lesz belőle: " OR ". És előtte-utána semmi (legalábbis ami a $nem-et illeti). Ez miért lenne jó?
De - a magam részéről - inkább szívesen látnám a formot, adattáblát, és egy feladatspecifikációt. Úgy tűnik, Freddy88 nem a legjobb oldalról közelít, vagy valahogy egész másképp gondolkodik, mint én. Valószínű én elejétől fogva másképp csinálnám.
15

Ezek szerint megint nem

kuka · 2012. Jan. 18. (Sze), 20.02
Ezek szerint megint nem voltam világos.
  1. /* előtte */  
  2. if($countn==0){    
  3.   $nem[]="";    
  4. }else{  
  5.   for($n=0; $n<$countn$n++){  
  6.     $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";  
  7.   }  
  8.   $nem=implode(' OR '$nem); // <- innen, feltételes utasítás tömbön belülről  
  9. }  
  10.   
  11. /* utána */  
  12. if($countn==0){    
  13.   $nem[]="";    
  14. }else{  
  15.   for($n=0; $n<$countn$n++){  
  16.     $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";  
  17.   }  
  18. }  
  19. $nem=implode(' OR '$nem); // <- ide, feltételes utasítás tömbön kívülre  
Ezzel a $_POST['nem'] különböző értékeinek a feldolgozása így alakul:





$_POST['nem'] $nem
-nincs- ""
array() ""
array('no') "nem='no'"
array('no','ferfi') "nem='no' OR nem='ferfi'"

Ezek közül az első kettő később kiesik, az utolsó kettő pedig helyesen lesz kezelve:
  1. if($nem!=""){ // <- ezután ez már nem lesz gond  
  2.   $keres[]="($nem)";  
  3. }  
Ui: Hibbant ez a BBCode feldolgozó.
16

Valóban,

Pepita · 2012. Jan. 18. (Sze), 22.05
nem voltál világos.
Így műxik, a második (u. olyan) count feltételt hagytad ki az előző magyarázatból.
Itt már tényleg nagyon másképp csinálnám. Ez egy csomó if, tömb, for; én valószínűleg tömböt egyáltalán nem csinálnék, hanem elejétől fogva u. azt az SQL string-ecskét írkálnám tovább. Csak saccra: kb. fele-annyi if, for és 0 tömb, 0 implode. Jár a szám, de most nincs rá türelmem, bocs.