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

PHP PHP PHP Fatal error: Call to a member function queryOne() on null American English version English version

Avatar
sunspinx
Člen
Avatar
sunspinx:

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. října 22:44
 
Odpovědět 14. října 22:43
Avatar
VitekST
Člen
Avatar
Odpovídá na sunspinx
VitekST:

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. října 17:20
Avatar
sunspinx
Člen
Avatar
sunspinx:

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. října 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.