NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: MVC - vypisování

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:16.4.2015 22:57

Ahoj. Třeba si to v tuto hodinu ještě někdo přečte a pomůže mi dojít k řešení.

Chci na dané podstránce otevřené pomocí MVC zobrazit nadpis příslušné podkategorie. Její název mám uložený v tabulce v db spolu s url, která téměř odpovídá té v řádku na zadávání adresy.

Stále se mi ale vypisuje Array, jelikož nejsem patrně schopen skriptu říct, že chci POUZE hodnotu ze sloupce"jmeno"

$nazevKategorie=$spravceInzeratu->upresniInzeraty();
                echo($nazevKategorie);
                $this->data['jmeno'] = $nazevKategorie['jmeno'];

Níže je zdrojový kód modelu s příslušnou volanou metodou:

public function upresniInzeraty($url)
          {
              return Db::dotazVsechny('
                       SELECT `jmeno`
                       FROM `podstranky`
                       WHERE `url` = ?
               ',array($url));

           }

a v šabloně vypisuji tedy

<?= $jmeno ?>

Nevíte, kde dělám chybu?

 
Odpovědět
16.4.2015 22:57
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Michal Kuba
Ondřej Štorc:16.4.2015 23:05

Nevím to jistě, ale nechtělo by to při tom volání upřesni kategorii dát té metodě nějaký parametr?

Nahoru Odpovědět
16.4.2015 23:05
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Ondřej Štorc
Michal Kuba:16.4.2015 23:08

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 :/

 
Nahoru Odpovědět
16.4.2015 23:08
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Michal Kuba
Ondřej Štorc:16.4.2015 23:36

Možná zkus použít místo Db::dotazVsechny, Db::dotazJeden, ale to už je spíš z mé strany spíš střílení na slepo...

Nahoru Odpovědět
16.4.2015 23:36
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Dominik Klapuch:17.4.2015 0:48

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.

Nahoru Odpovědět
17.4.2015 0:48
Kód a data patří k sobě.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:17.4.2015 10:16

Já tam nikde ale fetch (zatím) nepoužívám.. A nefunguje mi žádný způsob pro rozepsání toho, co je v poli..

 
Nahoru Odpovědět
17.4.2015 10:16
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:17.4.2015 10:30

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

 
Nahoru Odpovědět
17.4.2015 10:30
Avatar
Dominik Klapuch:17.4.2015 10:31

FetchAll asi budeš mít v te metodě dotazVsechny. Zkus var_dump a uvidis.

Nahoru Odpovědět
17.4.2015 10:31
Kód a data patří k sobě.
Avatar
Dominik Klapuch:17.4.2015 10:31

Postni obsah pole

Nahoru Odpovědět
17.4.2015 10:31
Kód a data patří k sobě.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:17.4.2015 10:33

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 :/

 
Nahoru Odpovědět
17.4.2015 10:33
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:17.4.2015 10:33

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 :/

 
Nahoru Odpovědět
17.4.2015 10:33
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:17.4.2015 10:49

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.

Editováno 17.4.2015 10:50
Nahoru Odpovědět
17.4.2015 10:49
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:17.4.2015 10:50

vypisuje to z toho pole toto:

automobily/osobni_automobily/

jenže já chci, aby to podle url automobily/osob­ni_automobily vzalo z příslušného sloupce jméno název Osobní automobily..

 
Nahoru Odpovědět
17.4.2015 10:50
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :17.4.2015 11:35

Použij dotaz jeden z místního wrapperu:

$result = Db::dotazJeden('
                   SELECT `jmeno`
                   FROM `podstranky`
                   WHERE `url` = ?
           ', array($url));
echo $result['jmeno'];
Nahoru Odpovědět
17.4.2015 11:35
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.4.2015 14:55

Pořád to nechce fungovat :/ tentokrát to nevypisuje vůbec nic..

 
Nahoru Odpovědět
18.4.2015 14:55
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :18.4.2015 14:57

Máš zapnuté hlášky? Píše to něco či? Toto by totiž mělo fungovat..

Nahoru Odpovědět
18.4.2015 14:57
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.4.2015 15:01

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ý

 
Nahoru Odpovědět
18.4.2015 15:01
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :18.4.2015 15:17

A ten dotazJeden ti nic nevyhodí? Result neobsahuje žádné pole s daty?

Nahoru Odpovědět
18.4.2015 15:17
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:18.4.2015 15:23

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/osob­ni_automobily, ale pak když chci do nadpisu vypsat 'jmeno' tak to vypíše do nadpisu Array

 
Nahoru Odpovědět
18.4.2015 15:23
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :18.4.2015 15:34

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

Nahoru Odpovědět
18.4.2015 15:34
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Uživatel sítě :18.4.2015 15:38

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

Nahoru Odpovědět
18.4.2015 15:38
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.4.2015 15:52

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

 
Nahoru Odpovědět
18.4.2015 15:52
Avatar
misaj
Člen
Avatar
Odpovídá na Michal Kuba
misaj:18.4.2015 16:04

a co ti vypíše:

var_dump($result);
 
Nahoru Odpovědět
18.4.2015 16:04
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na misaj
Michal Kuba:18.4.2015 16:08

vypíše to NULL

 
Nahoru Odpovědět
18.4.2015 16:08
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na misaj
Michal Kuba:18.4.2015 16:16

Zdá se tedy, že to nic nepředává, což by mělo, protože v databázi je to, co hledám.. :/

 
Nahoru Odpovědět
18.4.2015 16:16
Avatar
misaj
Člen
Avatar
Odpovídá na Michal Kuba
misaj:18.4.2015 16:16

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.

 
Nahoru Odpovědět
18.4.2015 16:16
Avatar
mkub
Tvůrce
Avatar
Odpovídá na Michal Kuba
mkub:18.4.2015 17:32

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

 
Nahoru Odpovědět
18.4.2015 17:32
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na mkub
Michal Kuba:19.4.2015 19:57

Myslíš na začátku v té mé metodě?

 
Nahoru Odpovědět
19.4.2015 19:57
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na misaj
Michal Kuba:19.4.2015 19:58

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í..

 
Nahoru Odpovědět
19.4.2015 19:58
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na misaj
Michal Kuba:19.4.2015 19:58

A když jsem kód upravil na podobu dle tebe tak to nyní vypisuje:

bool(false)
 
Nahoru Odpovědět
19.4.2015 19:58
Avatar
misaj
Člen
Avatar
Odpovídá na Michal Kuba
misaj:19.4.2015 20:28

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í?

 
Nahoru Odpovědět
19.4.2015 20:28
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na misaj
Michal Kuba:19.4.2015 20:33

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();
        }
 
Nahoru Odpovědět
19.4.2015 20:33
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:19.4.2015 21:08

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. :D

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
19.4.2015 21:08
TruckersMP vývojář
Avatar
misaj
Člen
Avatar
Odpovídá na Michal Kuba
misaj:19.4.2015 21:18

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));

 }
 
Nahoru Odpovědět
19.4.2015 21:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 34 zpráv z 34.