ugrás a tartalomhoz

Kereső egyszerűbben?

iddqd · 2012. Már. 5. (H), 16.16
Sziasztok!
Készítettem egy keresőt, amivel az adatbázisomban szeretnék kutakodni.
Több opciós, 5 kritérium alapján lehet keresni, 8 kombinációban.
Ebből adódóan ez most egy elég terjedelmes if-elsif szerkezet lett, a feltételekből generálom a különböző query-ket. ( a POST adatokat vizsgálom empty ill. !empty -vel )
pl:
  1. if ( emptyempty$name )   &&  
  2.      emptyempty$city )   &&  
  3.      emptyempty$status ) &&  
  4.      !emptyempty$cat )   &&  
  5.      !emptyempty$prom )    
  6.     )  
  7.    { //QUERY   
  8.    }  
  9. elseif (...)  
Van erre esetleg egyszerűbb, tömörebb módszer?
Nézelődök egy ideje, de nem sok mindent találtam.
Ötlet?
Köszi üdv!
 
1

UI:

iddqd · 2012. Már. 5. (H), 16.17
Bocs, nem tudom miért duplázta meg az empty -t !
2

Ahhoz, hogy erre válaszolni

Kubi · 2012. Már. 5. (H), 16.56
Ahhoz, hogy erre válaszolni tudjunk ismerni kéne, a teljes logikáját a keresődnek :)

Amit javaslok, indulj ki abból, ha nem üres a változód, akkor beleteszel az sql-be egy extra where feltételt ("OR" vagy "AND" el hozzákapcsolva, attól függ mit szeretnél, szűkíteni vagy bővíteni a keresésen).

Ha keresés beírásánál feltétel az, hogy ki legyen töltve x, y mező, z pedig ne, az már form validálás kérdése és a kódban hamarabb kezeld le.
4

Igazad van valóban kevés ez

iddqd · 2012. Már. 5. (H), 17.09
Igazad van valóban kevés ez így bocs, a lényeg hogy van egy egy üzlet, amihez tartozik a db -ben, név, státusz, város, kategória stb.
Ezeket szeretném lekérni a db -ből az előbbi kritériumok alapján. Tehát egy eset: az összeset Budapestről. Ekkor ugye csak város fog érkezni a többi üres. Vagy: Budapest - Kat.: 2 - Státusz: 3 . Vagy csak kat. esetleg csak státusz és így tovább.
5

UI:

iddqd · 2012. Már. 5. (H), 17.30
Validálásra ebben az esetben nincs szükségem, egyrészt a néven kívül az összes al opció előre meg van adva nem lehet hibásat ütni, másrészt a külön külön is kereshetek, nincs kötelezően megadandó mező, esetleg ha semmi sincs kiválasztva, nincs keresés ,ezt kiírhatom. A problémám leginkább a nagy terjedelmű if-elseif lánccal volt, mert úgy minden kombinációt külön meg kellett vizsgálni. Így ezzel szemben a lenti foreach-verzióm praktikusabbnak tűnik.
6

dehogynem

Poetro · 2012. Már. 5. (H), 17.36
Ó, dehogynem... simán úgy töltöm ki a mezőket, ahogy akarom. Ha az egy select mező volt, 2 kattintással csinálok belőle sima text mezőt. Úgyhogy mindenképpen kell validálni.
7

:)

iddqd · 2012. Már. 5. (H), 17.57
Hehe :) De te nem nyúlsz hozzá! Ez a kereső csak az én "admin felületem" van :))
DE amúgy igazad van KELL a validálás! Pontosítom magam, a keresési mechanizmust próbálom csiszolni, aztán a validálással foglalkozni. Nem éles oldal.
Esetleg észrevétel?
3

Foreach

iddqd · 2012. Már. 5. (H), 16.57
Közben arra gondoltam inkább hogy tömbbe rakom az egészet és foreach-el végig pörgetem és ha nem üres az értéke egy elemnek akkor az már mehet is a query -be.
  1. foreach ( $data as $key => $value){  
  2.           
  3.     if ( $value ){  
  4.           
  5.         //  QUERY -> WHERE $key = $value  
  6.     }  
Csak a title -t kell külön szednem, mert a többi opció előre megadott, kiválasztható.
Ez így szimpatikusabb, rövidebb és elvileg az eredménye is, úgy néz ki, ugyan az. :)
De továbbra is érdekelne, milyen bevett módszer(ek) vannak esetleg egy ilyen keresőre.
8

teljesen jó az ötlet

Kubi · 2012. Már. 5. (H), 22.32
teljesen jó az ötlet :)

if($value) itt is inkább if(!empty($value) (string "0" == false)
a query where részének elemeit egy tömbe gyüjtsd, majd implod és kész a where rész
9

Nem ugyanaz?

iddqd · 2012. Már. 6. (K), 13.52
az if( $value ) nem teljesen ugyan az mint az if ( !empty($value) )? Van köztük különbség? CI -re épülök úgyhogy, a ciklusban legyártódik az x WHERE feltétel,
( $this->db->where( $key , $value );
és utánuk már megy is az egy lekérdezés.
( $this->db->get('tábla'); )
Köszi az áttekintést!
10

Nem

Poetro · 2012. Már. 6. (K), 14.44
Egyáltalán nem ugyanaz. Az empty igazat ad vissza akkor is, ha a változó nem létezik, és ekkor nem dob E_NOTICE típusú hibaüzenetet.
11

Ha jól értelek

iddqd · 2012. Már. 6. (K), 15.13
Igen ezt tudom az empty -ről. Ha jól értelek akkor, az "if ( $value )" -forma, a létezését is vizsgálja? Ergo, notice-t kapnék, ha nem létezne a változóm.
Erre gondoltál? Na ezt akkor rosszul tudtam. Köszönöm! Mindjárt ki is próbálom.
12

Másik alternatíva

Pepita · 2012. Már. 6. (K), 20.21
Ha a lekérdezést fixen megírod (pl. LIKE % használatával), és paraméterként adod meg az értékeket (VALUES). Így nem kell vesződni az sql legyártásával, csak egyszer. Arra kell figyelni, hogy a változók létezzenek. Ha egyik nem létezik, hozd létre üres string-nek.

Szerk.: lehet, hogy ez csak tárolt eljárásnál mehet így, akkor neked nem jó ide.
13

Így használom jelenleg:

iddqd · 2012. Már. 8. (Cs), 12.20
(( Codeigniter, active record class -al ))
  1. public function search(){  
  2.           
  3.         $title = $this->input->post('title');  
  4.           
  5.         $data = array (  
  6.           
  7.                 'city'  => $this->input->post('city'),  
  8.             'category' => $this->input->post('category'),  
  9.             'status' => $this->input->post('status'),  
  10.             'promotion' => $this->input->post('promotion')  
  11.         );  
  12.           
  13.           
  14.           
  15.         if ( !emptyempty($title) ){  
  16.               
  17.             $this->db->like('title'$title);  
  18.             $query = $this->db->get('partners');  
  19.               
  20.             return  $query->result_array();  
  21.               
  22.         }  
  23.           
  24.       
  25.         else {  
  26.                
  27.             foreach ( $data as $key => $value){  
  28.           
  29.                   if ( !emptyempty$value ) ){  
  30.           
  31.                      $this->db->where( $key , $value );  
  32.                   }  
  33.             }  
  34.           
  35.               $query = $this->db->get('partners');  
  36.               return $query->result_array();  
  37.           
  38.         }  
  39.       
  40.     }  
UI: nyilván így, név alapján kategóriában és/vagy más kitételek alapján nem működik, de a név egyedi, tehát ha az alapján szeretnék keresni, nem kell más feltétel. ( Elméletileg :) )

Szerk.: miért duplázza meg a kódszínező az empty -ket? Lehet hogy béna vagyok, de nem jöttem még rá!
Továbbá validálás nélküli és ebben a formában, ugye ha simán üres változókat kap, kizárólag az else ág utolsó sora fut le, azaz megkapok mindent a DB -ből. Sajna kevés időm volt rá az elmúlt pár napban, most próbálom meg összerakni teljesen.
Kösz. Üdv!