Problém s registrací - Call to a member function query() on null in – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s registrací - Call to a member function query() on null in – PHP – Fórum – Programujte.comProblém s registrací - Call to a member function query() on null in – PHP – Fórum – Programujte.com

 

kiCkZ0
Newbie
19. 7. 2017   #1
-
0
-

Ahoj,

nevíte někdo kde by mohla být chyba, stabilně mam tuto hlášku a nemohu přijít na problém:

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\cms\app\model\UserManager.php:19 Stack trace: #0 C:\xampp\htdocs\cms\app\controllers\user\user.php(18): CMS\Model\UserManager->create('test', 'test@test.cz', 'test') #1 C:\xampp\htdocs\cms\admin\register.php(49): CMS\Controllers\User\User->createAction('test', 'test@test.cz', 'test') #2 {main} thrown in C:\xampp\htdocs\cms\app\model\UserManager.php on line 19

Register.php

<?php 
    require_once $_SERVER['DOCUMENT_ROOT'].'/cms/vendor/autoload.php'; 
    session_start();
    
    use CMS\Controllers\Database\Connection;
    use CMS\Controllers\User\User;
    
    $database = new Connection;
    $user = new User($database);
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scal=1">
        <meta name="description" content="">
        <meta name="author" content="">
        <title></title>
        <link rel="stylesheet" href="../admin/css/admin.css">
        <script src="../admin/js/tinymce/tinymce.js"></script>
        <script src="../admin/js/tinymce/init-tinymce.js"></script>
    </head>
    <body>
    <div id="main" class="layout-column-main">
        <div class="admin-bar clearfix">
            <a class="logo-wrapper" href="" title="Anywhere System"><span class="logo-system"></span></a>
                <ul class="admin-bar-ul">
                    <li class="admin-bar-list-li">
                        <a href="login.php" class="admin-bar-list-inside">Přihlášení</a>
                    </li>
                    <li class="admin-bar-list-li">
                        <a href="register.php" class="admin-bar-list-inside">Registrace</a>
                    </li>
                    <li class="admin-bar-list-li">
                        <a class="admin-bar-list-inside" href="../index.php">Hlávní stránka</a>
                    </li>
                </ul>
        </div>
        <div class="flex-column">
<?php include_once 'templates/content.php'; ?>
<?php 
    if(isset($_POST['register'])){  
        $username = $_POST['username'];
        $email = $_POST['email'];
        $password = $_POST['password'];
        $confirm_password = $_POST['confirm_password'];
        if ($password == $confirm_password){
            $register = $user->createAction($username, $email, $password);
            if($register) {
                echo "Registrace proběhla úspěšně";
            }
        } 
    } 
?>
<form method="post" action="" class="form_align">
    <input class="input-login-reg" type="text" name="username" placeholder="&nbsp;&nbsp;Uživatelské jméno" required />
    <input class="input-login-reg" type="email" name="email" placeholder="&nbsp;&nbsp;Zadejte váš email" required />
    <input class="input-login-reg" type="password" name="password" placeholder="&nbsp;&nbsp;Zadejte vaše heslo" required />
    <input class="input-login-reg" type="password" name="confirm_password" placeholder="&nbsp;&nbsp;Potvrďte vaše heslo" required />
    <button class="btn-login-reg" type="submit" name="register">Zaregistrovat se</button>
</form>
<?php include_once 'templates/footer.php'; ?>

Connection.php

<?php

namespace CMS\Controllers\Database;

/*
 * Database connection class
 */
class Connection {
    
    /*
     * 
     */
    private $pdo;
    
    public function __construct() {
        $this->pdo = $this->connect();
    }
    
    /*
     * connection function with database
     */
    public function connect() {
        try {
            $config = parse_ini_file($_SERVER['DOCUMENT_ROOT'].'/cms/app/config/config.ini');
            $this->pdo = new \PDO($config['dbtype'].":host=".$config['dbhost'].";dbname=".$config['dbname'], $config['dbuser'], $config['dbpass']);
            $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
            // echo "Připojení k databázi proběhlo úspěšně";
        } catch (\Exception $e) {
            echo "Připojení k databazi se nezdařilo: ".$e->getMessage();
        }
        return $this->pdo;
    }
    
    public function disconnect() {
        $this->pdo = null;
    }
    
    public function query($sql,...$params) {        
        $query = $this->pdo->prepare($sql);
        return $query->execute(array($params));
    }
    
    public function fetch($sql,$params) {
        return $this->pdo->query($sql,$params)->fetch();
    }
    
    public function fetchAll($sql,$params) {
        return $this->pdo->query($sql,$params)->fetchAll();
    }
}

 UserManager.php

<?php

namespace CMS\Model;

use CMS\Controllers\Database\Connection;

class UserManager {
    
    private $database;
    
    public function __construct(Connection $database) {
        $this->database = $database;
    }
    
    public function create($username,$email,$password) {
        $hashed_password = password_hash($password, PASSWORD_BCRYPT);
        $sql = "INSERT INTO users(username, email, password) VALUES (?,?,?)";
        $params = array($username,$email,$hashed_password);    
        $query = $this->database->query($sql,$params);
        return $query;
    }
    
}

User.php

<?php

namespace CMS\Controllers\User;

use CMS\Controllers\Database\Connection;
use CMS\Model\UserManager;

class User extends UserManager{
    
    private $database;
    
    public function __construct(Connection $database) {
        $this->database = $database;
    }
    
    public function createAction($username,$email,$password){
        return $this->create($username, $email, $password);
    }  
}

Díky

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #2
-
0
-

#1 kiCkZ
Vypadá to, že sis zapomněl otevřít databázi. S takovou se špatně prauje...

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kiCkZ0
Newbie
19. 7. 2017   #3
-
0
-

#2 Kit
Počkat otevřít kde ale ? Vždyť jsem i testoval připojení a je to připojené.

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #4
-
0
-

#3 kiCkZ
V parametru třídy UserManager dostává kobstruktor null.

BTW: Nesnáším slovo "Manager" v názvu třídy. Nemá tam co pohledávat.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kiCkZ0
Newbie
19. 7. 2017   #5
-
0
-

#4 Kit
Předtím v příspěvku si mi tvrdil, že když to předám parametrem, tak to bude ok. Co mam teda na tomhle ještě víc měnit ? Tomu fakt nerozumim.

    
public function __construct(Connection $database) {
    $this->database = $database;;
}
    
Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #6
-
+1
-
Zajímavé

#5 kiCkZ
Třeba zavolat konstruktor rodiče nebo rovnou spojit ty dvě třídy, neboť User není UserManager. Dědičnost zde nedává smysl.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kiCkZ0
Newbie
19. 7. 2017   #7
-
0
-

#6 Kit
V tom případě pak nechápu, proč je používané MVC, když tímto chci oddělit logiku od databáze.

Přijde mi to PHP jak neobjevený svět..

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #8
-
0
-

#7 kiCkZ
Pokud oddělíš logiku od databáze, tak dostaneš MVCS. Jenže to jsi neudělal.

Oddělování logiky od databáze nedává smysl.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kiCkZ0
Newbie
19. 7. 2017   #9
-
0
-

#8 Kit
Ok, jinak přidal jsem to + jsem ještě musel opravit výstup na pole a už to vše funguje.

Díky moc za tvůj čas :) 

Předělávám to na to PDO celé + se snažim to lépe navrhnout. Jsem začátečník, takže promiň zda mam "lehčí" dotazy   

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
kiCkZ0
Newbie
19. 7. 2017   #10
-
0
-

#8 Kit
Myslíš, že je lepší začít už s frameworkem ? Nebo spíše ject takto základy + něco udělat a až následně se dát touto cestou ?

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #11
-
0
-

#10 kiCkZ
Nejdřív si zkus odpovědět na otázku, co pohledává databáze v controlleru, když patří do modelu. Proč máš view slepený s controllerem. Proč se pokoušíš rozdělit User a UserManager, když to pak slepuješ dohromady přes extends - mezi komponentami MVC nesmí být použita dědičnost, vznikla by tím jejich vzájemná závislost.

Opakuji, že User není UserManager, proto je zde použití dědičnosti zcela nesmyslné.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kiCkZ0
Newbie
19. 7. 2017   #12
-
0
-

#11 Kit
Rozumim, takže jediné co mezi nima je použité je jmenný prostor ? Aby nevznikala závislost tříd.

Nahlásit jako SPAM
IP: 2001:1ae9:19e:c200:28de:5...–
Kit+15
Guru
19. 7. 2017   #13
-
0
-

#12 kiCkZ
Jestli chceš míchat komponenty modelu mezi controllery a naopak, tak tím zanikají všechny výhody MVC a máš to v jedné hromadě. Zejména pokud do controlleru máš vlepený celý view.

Nejdřív si to rozděl tak, abys každou komponentu MVC mohl udržovat zvlášť, aby nebyly na sobě závislé.

Upozorňuji, že z modelu nesmíš volat ani controller, ani view. Model pouze reaguje na jejich požadavky. Controller modelu pouze přikazuje, view se modelu pouze ptá.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý