Multiple input search v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Andurit
Člen | 131
+
0
-

Ahojte,
snažím sa napísať nejaký multiple input search. Inak povedané užívateľ ma k dispozícii niekoľko inputov napr : country, name, currency, gender.

Užívateľ môže vyplniť 1 alebo kľudne aj všetky inputy, výsledny select by mal vyzerať nejako takto:

SELECT * FROM table WHERE country ='.$country.' AND name = '.$name.' AND gender = '.$gender.'

Neviem ale úplne ako to mám zariadiť ak užívateľ vyplní trebars len 1 input. Môže mi niekto poradiť ako upravovať model v prípade, že užívateľ vyplní len niečo?

Vďaka

Myiyk
Člen | 321
+
-2
-

Nepíšeš jaký nástroj používáš, proto odpovídám v takovéto univerzální formě.

Upozornění: Tento kód není bezpečný na SQL injection. Musíš si ošetřit $country, $name$gender

$sql = "SELECT * FROM table ";
$where = array();

if($country) {
	$where[] = "country ='.$country.'";
}
if($name) {
	$where[] = "name = '.$name.'";
}
if($gender) {
	$where[] = "gender = '.$gender.'";
}

if(count($where)) {
	$sql .= "WHERE " . implode(" AND ", $where);
}

Editoval Myiyk (26. 7. 2015 13:46)

Andurit
Člen | 131
+
0
-

Ak správne rozumiem tak ako si to napisal by teda mal vyzerať model, dajme tomu ho pomenujeme findMatch:
Zatiaľ čo v presentri by som mal mať zrejme odescepovať premenné a následne si len volať model niecim ako:

function renderSearch($country, $name, $gender)
{
	// escape premennych
	$this->template->search = $this->searches->findMatch($country, $name, $gender);
}

Editoval Andurit (26. 7. 2015 14:04)

Unlink
Člen | 298
+
0
-

Nejak tak, ale akú DB vrstvu používaš?
Nette Database?

ondrej256
Člen | 187
+
+2
-

V případě Nette Database

public function findMatch($country = NULL, $name= NULL, $gender = NULL)
{
	$selection = $this->database->table('table');
	if ($country) {
		$selection = $selection->where('country', $country);
	}
	if ($name) {
		$selection = $selection->where('name', $name);
	}
	if ($gender) {
		$selection = $selection->where('gender', $gender);
	}
	return $selection;
}
Myiyk
Člen | 321
+
0
-

To mě taky napadlo, ale udělalo by to OR a on chce AND

F.Vesely
Člen | 369
+
0
-

Ne, udela to AND.

ondrej256
Člen | 187
+
0
-

Ano, udělá to AND

Myiyk
Člen | 321
+
0
-

Aha, nějak jsem si to popletl

Andurit
Člen | 131
+
0
-

používam

Nette\Database\Context

Ohľadom Myiykovej odpovede, opravte ma ak sa mýlim toto zabezpeci vždy jedno hľadanie. Tj skontroluje ktore pole užívateľ vyplnil a podla toho hľadá Čo ale ak užívateľ vyplní 2 polia, alebo 3 polia? Ja práve hľadám spôsob ako byť v tomto dynamický