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.
//= 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.


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.