Diskuze: Filtrování na webu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
zdar,
nějak nevidim, že bys metodě SpravceInzeratu::vratInzerat() předával
nějaké parametry. Je to tak úmyslně?
Já si nějak myslel, že to bude částečně tím, jenže ani takto to nefunguje:
if($_POST){
$_SESSION['filtr']= $filtr = array(
'castTextu' => $_POST["castTextu"],
'castKategorie' => $_POST["castKategorie"],
'castMesto' => $_POST["castMesto"]);
$inzeraty=$spravceInzeratu->vratInzerat($_SESSION['filtr']);
if(!empty($_SESSION['filtr']['castTextu'])){
$this->data['inzeraty'] = $inzeraty;
}
}
Zatím předávám jen tu jednu část SESSION, ale víc jich udělaných zatím nemám tak proto bez upřesnění.. tohle je asi špatná cesta že?
Už to mám. Měl jsem špatně model, hledal jsem ve špatném sloupci.. jenže poslední zádrhel, a to je spíš moje neznalost všech příkazů, jak udělat, aby se z databáze poslaly všechny výsledky obsahující to slovo. Teď musím napsat doslova celý text inzerátu aby se vyfiltroval.. mám
WHERE text=?
a to právě porovnává jen celé obsahy toho sloupečku a ne jen jedno slovo..
Ani zástupné znaky mi nejdou nějak použít.
WHERE text=%?% nebo text=%"?"%
Pak ti asi pomůže operátor LIKE. Ten dokáže vyhledat záznam, který obsahuje část slova, např.
SELECT data FROM table
WHERE column LIKE "%abc%"
ta procenta znamenají, že může být jakýkoliv text před a po.
Jojo, ted jsem to našel, jenže v tom dotazu mám otazník a to je hodnota poslaná od uživatele.. pořád mi to s tím otazníkem blbne.. A když to udělám takhle
text LIKE "%?%"
tak to vrací prázdno, protože tam mám ten otazník blbej..
ani když jen procenta obalím uvozovkama tak nic..
Musíš tam nechat jen ten otazník a hodnotu včetně procent hodit až do nějaké execute metody.
Úplně nevím co myslíš tou execute metodou.. Nepřiblížíš mi to prosím?
Jo, ty ty parametry předáváš rovnou metodám jako Db::dotazVsechny() apod. Mám tím na mysli ten druhej parametr
Db::dotazVsechny("
SELECT data
FROM clanek
WHERE nadpis LIKE ?
", array("%{$nadpis}%"));
jen si nejsem jistý, zda takhle funguje správně automatické ošetření proti SQL inject.
Heuréka, díky moc! Fakt to funguje.. Proti injekcím to bude snad ok, kdyby se k tomu ale ještě někdo raději vyjádřil, budu klidnější
Jo, asi to bude lepší, s tímhle vyhledáváním moc zkušenost nemám
Čas ukáže Musím teď nějak skloubit ošetření toho, že někdo zadá slovo, někdo město a někdo oboje..
Zatím to nefunguje, vrací to stránku ale bez inzerátu, i když zadané slovo existuje v datbázi
if($_POST){
$_SESSION['filtr']= $filtr = array(
'castTextu' => $_POST["castTextu"],
'castMesto' => $_POST["castMesto"]);
$inzeraty= $castTextu && $castMesto;
$castTextu=$spravceInzeratu->vratInzerat3($_SESSION['filtr']['castTextu']);
$castMesto=$spravceInzeratu->vratInzerat4($_SESSION['filtr']['castMesto']);
if(!empty($_SESSION['filtr'])){
$this->data['inzeraty'] = $inzeraty;
}
}
model
public function vratInzerat3($parametry)
{
$ress= Db::dotazVsechny('
SELECT *
FROM `inzeraty`
WHERE text LIKE ?
ORDER BY `datum_vlozeni` DESC
',array("%{$parametry}%"));
return $ress;
}
public function vratInzerat4($parametry)
{
$ress= Db::dotazVsechny('
SELECT *
FROM `inzeraty`
WHERE mesto LIKE ?
ORDER BY `datum_vlozeni` DESC
',array("%{$parametry}%"));
return $ress;
}
asi to bude složitější než se zdá, že?
K dynamickému skládání dotazů jsou super tzv. query buildery, s těmi pak můžeš udělat něco jako
$b = new SqlBuilder();
$b->addSelect("data, ...")->from("table");
if ($_POST["castTextu"]) {
$b->where("text", $_POST["castTextu"]);
}
if ($_POST["castMesto"]) {
$b->where("mesto", $_POST["castMesto"]);
}
Ve tvém případě asi budeš muset ten dotaz složit nějak ručně. Teď mě nenapadá žádný způsob, jak by se to dalo obejít pomocí operátorů nebo funkcí, ale možná to nějak jde.
Edit: a nepojmenovávej metody stejně, jen na konci jiné číslo když už, tak neni to sice moc hezký, ale je obvykle lepší třeba vratPodleMesta(), vratPodleMestaNeboNazvu().
Zobrazeno 14 zpráv z 14.