Diskuze: MVC - vypisování
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 34 zpráv z 34.
//= 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.
Nevím to jistě, ale nechtělo by to při tom volání upřesni kategorii dát té metodě nějaký parametr?
To jsem už všelijak zkoušel, ale nijak mi to nefungovalo.. zkoušel jsem ['jmeno'] v různých tvarech a bez výsledku :/
Možná zkus použít místo Db::dotazVsechny, Db::dotazJeden, ale to už je spíš z mé strany spíš střílení na slepo...
Pokud očekáváš pouze jednu hodnoty, nebylo by tedy lepší použít něco jako fetch místo fetchAll? Za další, zkusil bych nejprve zjistit, jaký obsah ti vrací daná metoda (upresniInzeraty) a dle toho si zřídit přistup k hodnotě přes index.
Já tam nikde ale fetch (zatím) nepoužívám.. A nefunguje mi žádný způsob pro rozepsání toho, co je v poli..
Když použiju pouze fetch, nic to nevrátí, v případě fetchAll to vrátí právě pole, ze kterého se mi nedaří vypsat jeho obsah..
FetchAll asi budeš mít v te metodě dotazVsechny. Zkus var_dump a uvidis.
Postni obsah pole
konečně jsem něco vypsal, ale pouze url adresu.. vypisuje to například automobily/dodavky což je sloupec url, ale ten nechci vybírat pomocí SELECT.. pomocí selectu volám sloupec jméno a nic :/
konečně jsem něco vypsal, ale pouze url adresu.. vypisuje to například automobily/dodavky což je sloupec url, ale ten nechci vybírat pomocí SELECT.. pomocí selectu volám sloupec jméno a nic :/
Ahoj nejsem v tom uplne zbehly ale co jsem nejak pochopil z tutorialu tak bys mel bud pouzit na pole data funkci extract ktera ti to pole rozlozi na promenne nebo tam kde to vypisujes misto $jmeno pouzit $data[jmeno] nevim jestli je spravne syntaxe.
vypisuje to z toho pole toto:
automobily/osobni_automobily/
jenže já chci, aby to podle url automobily/osobni_automobily vzalo z příslušného sloupce jméno název Osobní automobily..
Použij dotaz jeden z místního wrapperu:
$result = Db::dotazJeden('
SELECT `jmeno`
FROM `podstranky`
WHERE `url` = ?
', array($url));
echo $result['jmeno'];
Pořád to nechce fungovat :/ tentokrát to nevypisuje vůbec nic..
Máš zapnuté hlášky? Píše to něco či? Toto by totiž mělo fungovat..
Hlášky zapnuté jsou, když mám nějakou chybu tak to vyskočí jen hláška, ale teď se normálně zobrazuje šablona pro danou podstránku subkategorie.. Wrapper používám ze zdejšího MVC tutoriálu, v některých částech lehce upravěný
A ten dotazJeden ti nic nevyhodí? Result neobsahuje žádné pole s daty?
Nic nevyhazuje zjevně.. mám na konci metody echo ale nic se nikde neprojevuje.. ale když si vypíšu parametry 0 a 1 tak to vypíše správně automobily/osobni_automobily, ale pak když chci do nadpisu vypsat 'jmeno' tak to vypíše do nadpisu Array
Když použiješ dotaz všechny, tak ti to logicky výpis hodí do několika polí, protože se očekává, že dotazů bude více. Resp. pole dotazu všechny může vypadat asi takto:
Array
(
[0] => Array
(
[jmeno] => Nějaké jméno
[0] => Nějaké jméno
[url] => Url
[1] => Url
)
[1] => Array
(
[jmeno] => Nějaké jméno2
[0] => Nějaké jméno2
[url] => Url2
[1] => Url2
)
)
A při dotaz jeden:
Array
(
[jmeno] => Nějaké jméno
[0] => Nějaké jméno
[url] => Url
[1] => Url
)
Takže funkci upresni inzeráty uprav:
public function upresniInzeraty($url){
return Db::dotazJeden('
SELECT `jmeno`
FROM `podstranky`
WHERE `url` = ?
',array($url));
}
A do šablony zadej na zkoušku:
$result = upresniInzeraty($urlDleKtereToUrcujes);
echo result['jmeno'];
A jestli ti ani toto nebude fungovat, tak opravdu nevím..
Nebo to zavolej dle názvu třídy, nevím kde ji máš umístěnou přesně:
$result = $router->upresniInzeraty($urlDleKtereToUrcujes);
echo result['jmeno'];
Apod..
pořád to nechce nic vypsat.. chápu že to musím volat přes dotazJeden, protože chci jen jednu hodnotu výslednou.. ale stále mi to nefunguje.. už fakt nevím jak to vyřešit..
Zdá se tedy, že to nic nepředává, což by mělo, protože v databázi je to, co hledám.. :/
Ok, jako první bych ověřil SQL dotaz přímo v DB, pokud třeba on nevypisuje NULL.
A pokud bude v pořádku zkusil bych jít postupně např. ve funkci upresniInzeraty:
public function upresniInzeraty($url){
$res = Db::dotazJeden('
SELECT `jmeno`
FROM `podstranky`
WHERE `url` = ?
',array($url));
var_dump($res);
return $res;
}
A tak lze zjistit, kde ti to nefunguje.
sice to nic neriesi, ale je tam drobna chybicka, ktora moze ti vyhodit chybu E_Warn... v povodnom kode mas deklarovanu mrodu s parametrom url, ktoru volas bez ziadnych parametrov
Tak v DB mi nejde ten dotaz rozjet.. v phpMyAdminu ho zadám ale nic to nevyhodí, po zpracování se to okno jen vyčistí..
A když jsem kód upravil na podobu dle tebe tak to nyní vypisuje:
bool(false)
Asi je jasné, že problém je v SQL dotazu nebo ve třídě DB. Nevím jak je tvoje třída DB připravená na debug...
Nevidím ti do kódu a nechce se mi hádat, proto zkus změnit select na
SELECT jmeno FROM podstranky
Pokud v tomto případě něco vypíše je problém v parametru $url, jak psal mkub.
Ostatní SQL dotazy ti fungují?
Takto vypadá moje Db.php
public static function dotazJeden($dotaz, $parametry = array()) {
$navrat = self::$spojeni->prepare($dotaz);
$navrat->execute($parametry);
return $navrat->fetch();
}
// Spustí dotaz a vrátí všechny jeho řádky jako pole asociativních polí
public static function dotazVsechny($dotaz, $parametry = array()) {
$navrat = self::$spojeni->prepare($dotaz);
$navrat->execute($parametry);
return $navrat->fetchAll();
}
// Spustí dotaz a vrátí z něj první sloupec prvního řádku
public static function dotazSamotny($dotaz, $parametry = array()) {
$vysledek = self::dotazJeden($dotaz, $parametry);
return $vysledek[0];
}
// Spustí dotaz a vrátí počet ovlivněných řádků
public static function dotaz($dotaz, $parametry = array()) {
$navrat = self::$spojeni->prepare($dotaz);
$navrat->execute($parametry);
return $navrat->rowCount();
}
Takže si smaž ten var_dump() z té metody, dej tam jen ten dotazJeden místo dotazVsechny a uprav si kód:
$url = $parametry[0] . '/' . $parametry[1];
$nazevKategorie = $spravceInzeratu->upresniInzeraty($url);
$this->data['jmeno'] = $nazevKategorie['jmeno'];
Ve směs poskládat všechny příspěvky do sebe stačilo.
Spojeni s DB je OK?
Pro tvoji potřebu by ve funkci "upresniInzeraty" stačilo volat metodu
dotazSamotny.
Zkus:
public function upresniInzeraty($url){
if(empty($url)) return FALSE; //akce bez parametru
var_dump('SELECT jmeno FROM podstranky WHERE url ='.$url);
return Db::dotazSamotny('
SELECT jmeno
FROM podstranky
WHERE url = ?
',array($url));
}
Zobrazeno 34 zpráv z 34.