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.
$keres=array();
if(isset($_POST['nem'])){
  $keres[]="nem='".mysql_real_escape_string($_POST['nem'])."'";
}
if(isset($_POST['kor'])){
  $keres[]="kor='".mysql_real_escape_string($_POST['kor'])."'";
}
if(isset($_POST['hol'])){
  $keres[]="hol='".mysql_real_escape_string($_POST['hol'])."'";
}

$keres=explode('AND', $keres);
if($keres){
  $keres= 'WHERE ' . $keres;
}

$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):
if(isset($_POST['kuld'])){

$nem=array();

  for($n=0; $n<count($_POST['nem']); $n++){
    $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";
  }

$nem=implode(' OR ', $nem);

$megye=array();
if(isset($_POST['megye'])){
for($m=0; $m<count($_POST['megye']); $m++){
  $megye[]="megye='".mysql_real_escape_string($_POST['megye'][$m])."'";
}
}else{
  $megye[]="megye=''";
}
$megye=implode(' OR ', $megye);

$keres=array($nem, $megye);
echo "$keres";


$result = mysql_query("SELECT * FROM user WHERE $nem AND $megye");
while($row=mysql_fetch_array($result)){
  $name=$row['name'];
 
  echo "<div id='user'><a href='profile.php?name=$name'>$name</a></div>";
}
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:
SELECT * FROM user WHERE $nem AND $megye
Ez az SQL utasítás áll össze:
SELECT * FROM user WHERE nem='nő' OR nem='férfi' AND megye='Bács-Kiskun' OR megye='Baranya'
Akkor az úgy lesz értelmezve mint:
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.
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.
$keres=array();
  if($nem!=""){
    $keres[]="($nem)";
  }
  if($megye!=""){
    $keres[]="($megye)";
  }
  $keres=implode(' AND ', $keres);
  
  
  echo "$keres";
}
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):
if(isset($_POST['kuld'])){
    $nem=array();

    $countn=count($_POST['nem']);

    if($countn==0){
      $nem[]="";
    }else{
      for($n=0; $n<$countn; $n++){
      $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";
    }

    $nem=implode(' OR ', $nem);

    }

    $megye=array();

    $countm=count($_POST['megye']);

    if($countm==0){
      $megye[]="";
    }else{
      for($m=0; $m<$countm; $m++){
      $megye[]="lakhely='".mysql_real_escape_string($_POST['megye'][$m])."'";
    }

    $megye=implode(' OR ', $megye);

    }

    $kor=array();
    if(!empty($_POST['kortol'])){
      $kor[]="kor>'".mysql_real_escape_string($_POST['kortol'])."'";
    }

    if(!empty($_POST['korig'])){
      $kor[]="kor<'".mysql_real_escape_string($_POST['korig'])."'";
    }
   
    $kor=implode(' AND ', $kor);

  $keres=array();

  if($nem!=""){
    $keres[]="($nem)";
  }

  if($megye!=""){
    $keres[]="($megye)";
  }

  if($kor!=""){
    $keres[]="($kor)";
  }

  $keres=implode(' AND ', $keres);
  
  
  echo "$keres";
}
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:
$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.

/* előtte */
if($countn==0){  
  $nem[]="";  
}else{
  for($n=0; $n<$countn; $n++){
    $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";
  }
  $nem=implode(' OR ', $nem); // <- innen, feltételes utasítás tömbön belülről
}

/* utána */
if($countn==0){  
  $nem[]="";  
}else{
  for($n=0; $n<$countn; $n++){
    $nem[]="nem='".mysql_real_escape_string($_POST['nem'][$n])."'";
  }
}
$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:

if($nem!=""){ // <- ezután ez már nem lesz gond
  $keres[]="($nem)";
}
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.