Diskuze: Jak ve wrapperu definovat "vlastní" SQL dotaz?
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.