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: POMOC PDO :(

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

Aktivity
Avatar
smoukey
Člen
Avatar
smoukey:3.12.2014 21:30

Zdravím, už pracuji na tom, abych se naučil PDO.

Ovšem jak jinak, že mám potíže.

Nyní jsem narazil na problém:

mám třídu databáze, kterou jsem obšlehnul ze zdejších tutoriálů.

V té třídě mám metodu

public static function insert($table, $data) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        INSERT INTO `$table` (`" . implode('`, `', $keys) . "`)
                        VALUES (" . str_repeat('?,', count($data) - 1) . "?)
                ";
                $params = array_merge(array($query), array_values($data));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

a nepochopil jsem, jak mám zavolat dotaz do db.

Zkusil jsem toto, ale nic to neudělalo.

Db::insert("jidla",$hodnoty);

Na začátku nechybí...

Db::connect('localhost','jidelna','admin', '');

Kde je schovaná chyba? :(

Editováno 3.12.2014 21:32
 
Odpovědět
3.12.2014 21:30
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 21:51

Zdar,

nevím, jak je to ve zdejších tutoriálech, ale metoda executeStatement() podle mě volá SQL dotaz. V tom případě by Db::insert("jidla", $hodnoty) mělo fungovat.
Nemáš vypnuté hlášení chyb? Ještě bych se podíval, co obsahuje proměnná $hodnoty a co potom obsahuje $params. Taky jestli ten formát $paranms sedí s formátem, který přijímá funkce executeStatement (jestli to pole vypadá tak, jak má).

Nahoru Odpovědět
3.12.2014 21:51
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:3.12.2014 21:57

btw: když to spustím, tak mi to háže:

Array
(
    [0] =>

                        INSERT INTO `jidla` (`0`, `1`, `2`, `3`, `4`)

                        VALUES (?,?,?,?,?)


    [1] => Svíčková s knedlíkem
    [2] => Palačinky
    [3] => Boloňské špagety
    [4] => Vepřový řízek s bramborovou kaší
    [5] => Čína s rýží
)
<br />
<b>Fatal error</b>:  Call to a member function prepare() on a non-object in <b>H:\web\jidelna\tridy\Db.php</b> on line <b>60</b><br />

přehodnotil jsem to.

nyní to vypadá

$vysledek=$ulozit->zapis_jidla($_SESSION['login'],$_GET,$_SESSION['group']);
        Db::insert("jidla",$vysledek);

ve $vysledek je, to co má být, akorát mi to vyhodí error, jak jsem psal výše.

 
Nahoru Odpovědět
3.12.2014 21:57
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 22:00

Co je na řádcích 55 - 65 v souboru Db.php?
Hází to error, že voláš metodu execute() na proměnné, která není objektem. S největší pravděpodobností proto, že je špatně napsaný SQL dotaz a PDO nevytvoří objekt.

Nahoru Odpovědět
3.12.2014 22:00
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
smoukey:3.12.2014 22:03

Řádek 55-65

* @return \PDOStatement PDO statement
         */
        private static function executeStatement($params)
        {
                $query = array_shift($params);
                $statement = self::$connection->prepare($query);
                $statement->execute($params);
                return $statement;
        }

        /**
 
Nahoru Odpovědět
3.12.2014 22:03
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 22:06

Nejspíš bude chyba v tom query dotazu. Co obsahuje proměnná $query?

Nahoru Odpovědět
3.12.2014 22:06
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:3.12.2014 22:15

$query obsahuje:

INSERT INTO `jidla` (`0`, `1`, `2`, `3`, `4`)

                        VALUES (?,?,?,?,?)
 
Nahoru Odpovědět
3.12.2014 22:15
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 22:19

To jsou názvy sloupců to 0 - 4? Zkontroluj si, co se tam dosadí za ty otazníky. Něco tam musí být špatně, protože ti výsledek hodí FALSE místo objektu.

Nahoru Odpovědět
3.12.2014 22:19
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:3.12.2014 22:28

$params obsahuje, to co by měla. pro jistotu přidávám pod to.

public static function insert($table, $data) {
        $keys = array_keys($data);
        self::checkIdentifiers(array($table) + $keys);
        //print_r($keys);
        //print_r($table);

        $query = "
                INSERT INTO `$table` (`" . implode('`, `', $keys) . "`)
                VALUES (" . str_repeat('?,', count($data) - 1) . "?)
        ";
        //print_r($query);
        $params = array_merge(array($query), array_values($data));
        print_r($params);
        $statement = self::executeStatement($params);
        //print_r($statement);
        //return $statement->rowCount();
}
Array
(
    [0] =>

                        INSERT INTO `jidla` (`0`, `1`, `2`, `3`, `4`)

                        VALUES (?,?,?,?,?)


    [1] => Svíčková s knedlíkem
    [2] => Palačinky
    [3] => Boloňské špagety
    [4] => Vepřový řízek s bramborovou kaší
    [5] => Čína s rýží
)

a proměnná $statement v metodě insert neobsahuje vůbec nic.

Tudíž za otazníky se mi nedosadí nic.

Editováno 3.12.2014 22:28
 
Nahoru Odpovědět
3.12.2014 22:28
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 22:34

Aha, já koukám blbě, sorry. Atribut $connection není objektem. Buď před tím insertem nemáš zavolanou metodu Db::connect(), nebo se neuloží instance do té proměnné.
Jak vypadá ta metoda Db::connect()?

Nahoru Odpovědět
3.12.2014 22:34
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:3.12.2014 22:34

Jinak 0-4 si to dosadilo samo, jako názvy sloupců, sloupce se v DB jmenují jinak.

 
Nahoru Odpovědět
3.12.2014 22:34
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:3.12.2014 22:35
public static function connect($host, $database, $user, $password)
        {
                if (!isset(self::$connection)) {
                        $dsn = "mysql:host=$host;dbname=$database";
                        self::$connection = new PDO($dsn, $user, $password, self::$options);
                }
        }
 
Nahoru Odpovědět
3.12.2014 22:35
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):3.12.2014 22:56

Tak to nevím. Dle chyby proměnná $connection není objekt.
Jinak s těmi názvy sloupců to musíš nějak upravit, jinak ti to bude házet chyby, protože sloupce 0, 1, ..., 4 neexistují.
Aby ti to fungovalo, mělo by to pole, které předáváš metodě insert(), vypadat ve tvaru

array(
  "nazev_sloupce" => "hodnota",
  "nazev_sloupce2" => "hodnota",
  ...
)
Nahoru Odpovědět
3.12.2014 22:56
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
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 13 zpráv z 13.