Avatar
smoukey
Člen
Avatar
smoukey:

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

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
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:

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

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
Avatar
smoukey
Člen
Avatar
smoukey:

Řá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):

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

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

$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):

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
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:

$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):

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
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:

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

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