IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Chyba Db wrapperu

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:19.1.2015 22:42

A znovu další potíž. Tentokrát je to ale zřejmě způsobeno kvůli souboru Db.php, který je stažen odsud z itnetwork. Když dělám na stránce výpis z databáze podle požadovaných kategorií, prohlížeč mi vyhodí error: Fatal error: Call to a member function execute() on a non-object in /home/users/mik­kuba/mainos.ce­kuj.net/web/Db­.php on line 40

Zde je kus kódu z Db.php kolem řádku 40:

private static function executeStatement($params)
        {
                $query = array_shift($params);
                $statement = self::$connection->prepare($query);
                $statement->execute($params);
                return $statement;
        }

Pokud v kódu stránky ale zablokuji jednu deklaraci proměnné, chyba nevyskočí, ale neprovede se žádný výpis:

<?php
session_start();
require('../../Db.php');
Db::connect('prihlasovaci udaje');

$inzeraty = Db::queryAll('
        SELECT *
        FROM inzeraty
        WHERE kategorie=automobily AND upresneni=nakladni automobily
        ORDER BY inzeraty_id  DESC

');
?>

Pokud tuhle část zakomentuji, tak vše funguje.

Ještě pro úplnost, na stránce mám zatím pouze a jen tabulku, která má takovýto kód:

<table id="vypis">
                                <?php
                                        foreach ($inzeraty as $inzerat)
                                        {
                                                echo('<tr><td><h2>

                                                                ' . htmlspecialchars($inzerat['titulek']) . '</a>
                                                        </h2>' . htmlspecialchars($inzerat['text']));
                                                echo('</td></tr>');
                                        }
                                ?>
                        </table>

Nevidí v tom někdo zkušený na první pohled chybu?

Omlouvám se za další SPAM, ale zdejší komunita se mi osvědčila, že sem chodí slušní lidé, kteří jsou ochotni pomoci. Proto se zde znovu obracím.

PS: našel jsem i nějaké podobná témata na stackoverflow.com, ale tam mi to nepřijde příliš užitečné..

 
Odpovědět
19.1.2015 22:42
Avatar
d4rkw34v3r
Tvůrce
Avatar
d4rkw34v3r:19.1.2015 22:55

Zkontroluj, co si vraci to self::$connection->prepare($query);. Predpokladam, ze to pouziva PDO a pokud se nepodari pripravit prepared statements, tak to vrati FALSE, nad kterym nemuzes zavolat Execute.

Problem asi bude v tom dotazu, nechybej ti tam uvozovky v sekci WHERE?

Editováno 19.1.2015 22:58
 
Nahoru Odpovědět
19.1.2015 22:55
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:19.1.2015 23:03

Na první pohled bych řekl že v tom WHERE vadí ta mezera u "nakladni automobily" jelikož není v uvozovkách nic...

co třeba to přidat do proměnných a ty vložit do příkazu?
Kod by mohl vypadat takto. Je docela pozdě tak jsem se mohl i někde seknout :D

$kategorie = "automobily";
$upresneni = "nakladni automobily";

 $inzeraty = Db::queryAll('
         SELECT *
         FROM inzeraty
         WHERE kategorie=? AND upresneni=?
         ORDER BY inzeraty_id  DESC

 ', $kategorie, $upresneni);

...
Editováno 19.1.2015 23:04
Nahoru Odpovědět
19.1.2015 23:03
Neaktivní uživatelský účet
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :19.1.2015 23:03

Souhlasím s d4rkw34v3r, zkus:

WHERE kategorie="automobily" AND upresneni="nakladni automobily"

Ale lépe je to navazovat mimo dotaz samotný tedy:

WHERE kategorie=? AND upresneni=?

bindValue(1, 'automobily');
bindValue(2, 'nakladni automobily');

Pokud u toho nebude uživatelský vstup tak to, ale nemusíš hrotit. já jenom aby jsi věděl popřípadě do budoucna.. ;)

Nahoru Odpovědět
19.1.2015 23:03
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:20.1.2015 9:38

Ani po přidání uvozovek to nejde - stále to háže stejný error...

 
Nahoru Odpovědět
20.1.2015 9:38
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :20.1.2015 10:53

Tak použij radu Neaktivní uživatel, to by mělo problém vyřešit.

Nahoru Odpovědět
20.1.2015 10:53
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:20.1.2015 11:18

Vyzkouším u pc. Ještě je možné, že mám chybu v php bloku v těle stránky.

 
Nahoru Odpovědět
20.1.2015 11:18
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Michal Kuba
David Hartinger:20.1.2015 13:08

Máš chybu v tom dotazu, nepodaří se ho ani přeložit.

Nahoru Odpovědět
20.1.2015 13:08
New kid back on the block with a R.I.P
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Hartinger
Michal Kuba:20.1.2015 13:10

A v čem? Co to nedokáže přeložit? :/

 
Nahoru Odpovědět
20.1.2015 13:10
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:20.1.2015 13:19

pořád mi to nefunguje, ani podle Neaktivní uživatel , přitom si myslím, že to je docela pochopitelně udělané a že by to mělo jít..

 
Nahoru Odpovědět
20.1.2015 13:19
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Hartinger
Michal Kuba:20.1.2015 13:22

Nemůže to být něco s tím ORDER BY? Protože když odstraním tuhle část, tak to již vypíše správně to, co má..

 
Nahoru Odpovědět
20.1.2015 13:22
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Michal Kuba
David Hartinger:20.1.2015 13:30

Já neznám tvůj datový model, si ten dotaz spusť v PhpMyAdmin.

Nahoru Odpovědět
20.1.2015 13:30
New kid back on the block with a R.I.P
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 12 zpráv z 12.