Diskuze: Filtrování na webu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 14 zpráv z 14.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.