NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: PHP Fatal error: Call to a member function queryOne() on null

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

Aktivity
Avatar
Vladislav Domin:14.10.2016 22:43

Zdravim,

dnes som sa stretol prvykrat s tymto errorom a absolutne neviem ako to fixnut, prikladam zdrojovy kod

Db.php

public function connect($host, $database, $user, $password)
    {
        if (!isset($this->connection)) {
            $dsn = "mysql:host=$host;dbname=$database";
            $this->connection = new PDO($dsn, $user, $password, $this->options);
        }
    }

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

public function queryOne($query) {
        $statement = $this->executeStatement(func_get_args());
        return $statement->fetch(PDO::FETCH_ASSOC);
    }

General

Class General
{
protected $db;

public function __construct()
    {
        // Načítanie konfiguračného súboru
        include_once('./config/database.php');

        // Uloženie databázového spojenia do premennej
        include_once('Db.php');
        if(isset($db_host) && ($db_name) && ($db_user) && ($db_password)) {
            $this->db = new Db();
            try {
                $this->db->connect($db_host, $db_name, $db_user, $db_password);
            }
            catch (Exception $e) {
                throw new Exception('Je problém s pripojením do databázy');
            }
        }
    }
}

Tu vznika problem ->

require_once('classes/General.php');
        require_once('classes/User.php');

        $user = new User();

        try {
            if($user->register($email, $first_name, $last_name, $password, $accept_terms)) { }

            else { }

        }
        catch(Exception $e) {
            echo ($e->getMessage());
        }
Editováno 14.10.2016 22:44
 
Odpovědět
14.10.2016 22:43
Avatar
VitekST
Člen
Avatar
Odpovídá na Vladislav Domin
VitekST:15.10.2016 17:20

Nebylo by od věci vidět i soubor User.php, který (očividně) volá funkci queryOne.

Zdá se, že proměnnou, která obsahuje instanci třídy "User" (jestli je to vůbec třída, neukázal si celý soubor) je neinicializovaná (je rovna výrazu null).

Zkus na proměnnou, kde se instance nachází, použít funkci var_dump, abys věděl, co to za proměnnou je.
Jestli je to null, tak si ji asi zapomněl někde inicializovat.

Jinak, doporučuji použít pro příště autoloader (více zde: http://www.itnetwork.cz/php/mvc ).

 
Nahoru Odpovědět
15.10.2016 17:20
Avatar
Vladislav Domin:15.10.2016 21:28

Mas pravdu, pri var_dump($db) je tam NULL, ale nerozumiem preco tomu tak je, ked by sa mala inicializovat vdaka konstruktoru...

class User extends General
{

    /**
     * Zaregistruje uživateľa do systému
     *
     * @param $email string E-mail
     * @param $fname string Vlastné jméno
     * @param $lname string Priezvisko
     * @param $pass string Heslo
     *
     * @return bool Úspěšne zaregistrovaný?
     *
     * @throws Exception Nevyplnené pole
     * @throws Exception Nesúhlas s podmienkami
     * @throws Exception Chybný E-mail
     * @throws Exception Slabé heslo
     * @throws Exception Obsadený E-mail
     * @throws Exception Chyba databázy
     */

    public function register($email, $fname, $lname, $pass, $accept_terms)
    {
        // Nejaké pole nie je vyplnené
        if(!isset($email) || !isset($fname) || !isset($lname) || !isset($pass))
            throw new Exception('Niektoré pole nie je vyplnené.');

        // Uživateľ nesúhlasil s podmienkami
        if(!isset($accept_terms))
            throw new Exception('Musíte súhlasiť s podmienkami registrácie');

        // Je chybne zadaný E-mail
        if(!$this->isEmail($email))
            throw new Exception('Bol zadaný chybný E-mail.');

        // Nie je dostatečne silné heslo (nesplňuje podmienky)
        if(!$this->checkPasswordInput($pass))
            throw new Exception('Zadané heslo nie je dostatočne silné.');

        // Je obsadený E-mail
        if(!$this->isEmailAvailable($email))
            throw new Exception('Zadaný E-mail už niekdo používa.');

        // Šifrované heslo
        $hash_pass = password_hash($pass, PASSWORD_DEFAULT);

        $registered = $this->db->query('
           INSERT INTO `users` (`email`, `first_name`, `last_name`, `password`, `token`)
           VALUES (?, ?, ?, ?, ?)
         ', $email, $fname, $lname, $hash_pass, $this->generateRandomBase64String());

        // Nefunkčná databáza
        if(!$registered)
            throw new Exception('Nastala chyba pri komunikácií s databázou');

        return true;
    }

a toto je funkcia queryOne

public function queryOne($query) {
        $statement = $this->executeStatement(func_get_args());
        return $statement->fetch(PDO::FETCH_ASSOC);
    }
 
Nahoru Odpovědět
15.10.2016 21:28
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 3 zpráv z 3.