Diskuze: Jak ve wrapperu definovat "vlastní" SQL dotaz?
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
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.


můžeš udělat něco takového:
$where = $cond ? 'WHERE cena = ? AND oblast = ?' : '';
return Db::dotazVsechny('
SELECT `clanky_id`, `titulek`, `url`, `popisek`
FROM `clanky`'
.$where ,array($cena,$oblast));
Díky za rychlou reakci. Zjednodušil jsem si to na jednu proměnnou, ale bohužel mi řešení nefunguje. Takto:
public function vratClanky($oblast)
{
return Db::dotazVsechny('
SELECT `id`, `nazev`
FROM `clanky` WHERE `oblast` = ?
', array($oblast));
}
Vypíše přesně to co potřebuji. Pokud kód změním na:
public function vratClanky($oblast)
{
$where = $cond ? ' WHERE `oblast` = ? ' : '';
return Db::dotazVsechny('
SELECT `id`, `nazev`
FROM `clanky`
'.$where, array($oblast));
}
Tak nevypíše žádný článek. A ještě jedna věc - jak bys mi doporučil předat tu proměnnou "where" s dotazem? Tohle mám totiž v modelu (snažím se o MVC) a v kontroleru potom:
$clanky= $clanky->vratClanky($oblast,$cena, atp.);
Předpokládám že jako parametr funkce to nepůjde...
PS: Co je myšleno tím "ewww, český kód"?
Takhle to mám vyřešené ve své knihovně:
protected $connect;
protected $fncs = [];
public function query($query) {
if(empty($this->db) && !in_array($fnc, ["__construct", "changeDB", "dbList"]))
throw new Exception("No database selected");
$result = $this->connect->query($query);
if($this->connect->errno)
throw new Exception("Error in MySQL: " . $this->connect->error . " <strong>SQL command:</strong> " . $query);
return $result;
}
public function __set($name, $query) {
$this->fncs[$name] = $query;
}
public function __get($name) {
return $this->fncs[$name];
}
public function __call($name, $params) {
if(isset($params[0]) && is_array($params[0]))
$this->execFnc($name, $params[0]);
else
$this->execFnc($name, $params);
}
public function __isset($name) {
return isset($this->fncs[$name]);
}
public function __unset($name) {
if(isset($this->fncs[$name]))
unset($this->fncs[$name]);
return true;
}
public function setFnc($name, $query) {
$this->fncs[$name] = $query;
}
public function execFnc($name, $params = []) {
if(isset($this->fncs[$name]))
$this->queryf($this->fncs[$name], $params, $name);
else
throw new Exception("(" . $name . "): This function isn't defined");
}
public function queryf($q, $a) {
foreach($a as $k => $v) {
$q = str_replace("%" . $k, $this->escape($v), $q);
};
return $this->query($q);
}
A můžeš to provést třeba takhle:
$db->vratClanky = "SELECT `clanky_id`, `titulek`, `url`, `popisek` FROM `clanky` WHERE cena = %0 AND oblast = %1";
$result = mysqli_fetch_object($db->vratClanky("Oblast..."));
Pokud používáš MVC, tak si v modelu napiš funkci, která ti podle množství uvedených parametrů sestaví dotaz na míru a ten následně předá wrapperu ke zpracování jako argumenty funkce/metody, tedy vratVsechny($query, $params), ať si to následně wrapper sám přebere. To mi připadá jako nejčistší řešení a není potřeba "ohýbat" samotný wrapper. Minimálně se ti to bude hodit při debugování, když si budeš moci nechat vypsat celý dotaz jako string a uvidíš, co se taky dosazuje.
Pokud bys chtěl používat nějakou pokročilejší třídu, tak třeba Dibi ( https://dibiphp.com/cs/quick-start ) nabízí poměrně značné možnosti, případně i fluentí skládání dotazů, ale to si myslím není úplně potřeba.
Zobrazeno 6 zpráv z 6.