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:
if ( empty( $name )   &&
     empty( $city )   &&
     empty( $status ) &&
     !empty( $cat )   &&
     !empty( $prom )  
    )
   { //QUERY 
   }
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.
foreach ( $data as $key => $value){
		
	if ( $value ){
		
        //  QUERY -> WHERE $key = $value
	}
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 ))
public function search(){
		
		$title = $this->input->post('title');
		
		$data = array (
		
	            'city'  => $this->input->post('city'),
		    'category' => $this->input->post('category'),
		    'status' => $this->input->post('status'),
		    'promotion' => $this->input->post('promotion')
		);
		
		
		
		if ( !empty($title) ){
			
			$this->db->like('title', $title);
			$query = $this->db->get('partners');
			
			return  $query->result_array();
			
		}
		
	
		else {
		     
			foreach ( $data as $key => $value){
		
			      if ( !empty( $value ) ){
		
				     $this->db->where( $key , $value );
			      }
		    }
		
		      $query = $this->db->get('partners');
		      return $query->result_array();
		
	    }
	
	}
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!