Diskuze: MVC - vypisování

PHP PHP MVC - vypisování American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

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
Odpovídá na Michal Kuba
Ondřej Štorc:

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
Redaktor
Avatar
Odpovídá na Ondřej Štorc
Michal Kuba:

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
Odpovídá na Michal Kuba
Ondřej Štorc:

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:

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
Redaktor
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:

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
Redaktor
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:

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:

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:

Postni obsah pole

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

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
Redaktor
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:

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

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
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Dominik Klapuch
Michal Kuba:

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
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

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
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

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

 
Nahoru Odpovědět 18.4.2015 14:55
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

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
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

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
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

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
Redaktor
Avatar
Michal Kuba:

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
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

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  +1 18.4.2015 15:34
Chybami se člověk učí, běžte se učit jinam!
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Marek Z.
Marek Z.:

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
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

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:

a co ti vypíše:

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

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:

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
Redaktor
Avatar
Odpovídá na Michal Kuba
mkub:

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
Redaktor
Avatar
Odpovídá na mkub
Michal Kuba:

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

 
Nahoru Odpovědět 19.4.2015 19:57
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na misaj
Michal Kuba:

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
Redaktor
Avatar
Odpovídá na misaj
Michal Kuba:

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:

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
Redaktor
Avatar
Odpovídá na misaj
Michal Kuba:

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
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 19.4.2015 21:08
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
misaj
Člen
Avatar
Odpovídá na Michal Kuba
misaj:

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.