0

It's not different as the same error listed here, but I followed every advise I got from it and still didn't find the mistake I made, so therefore it's different

I'm following a series of videos on phpacademy.org, ([https://www.youtube.com/watch?v=G3hkHIoDi6M&index=15&list=PLfdtiltiRHWF5Rhuk7k4UAU1_yLAZzhWc][1])

In the video above (number 15), after following it, I get this error

Fatal error: Call to a member function insert() on a non-object in D:\xampp\htdocs\scorpio to do\classes\user.php on line 10

my code is: user.php:

<?php
class user{
    private $_db;

    public function __construct(){
        $this->_db = db::getInstance();
    }


    //PROBLEM MIGHT BE HERE!!!!!!!!!!!!!!!

    public function create($fields = array()){
        if(!$this->_db->insert('gebruikers', $fields)){
            throw new Exception('Er is een probleem opgetreden bij het maken van de     nieuwe gebruiker.');
            }
        }
    }
?>

register.php:

<?php
require_once 'core/init.php';

if(input::exists()){
    if(token::check(input::get('token'))){

        $validate = new validate();
        $validation = $validate->check($_POST, array(
            'gebruikersnaam' => array('required' => true, 'min' => 2, 'max' => 20,     'unique' => 'gebruikers'),
            'paswoord' => array('required' => true, 'min' => 6),
            'paswoord_2' => array('required' => true, 'matches' => 'paswoord'),
            'naam' => array('required' => true, 'min' => 2, 'max' => 50),
        ));

        if($validation->passed()){
            $user = new user();
            $salt = hash::salt(32);



            //I THINK THE PROBLEM IS IN THIS TRY CATCH OR IN USER.PHP!!!!!!!!!!!!!!!!!

            try{                    
                $user->create(array(
                    'gebruikersnaam' => input::get('gebruikersnaam'),
                    'paswoord' => hash::make(input::get('paswoord'), $salt),
                    'salt' => $salt,
                    'voornaam' => input::get('naam'),
                    'aangemaakt' => date('Y-m-d H:i:s'),
                    'groep' => 1
                ));

                session::flash('home', 'Je bent geregistreerd en kan je nu aanmelden.');
                header('Location: index.php');
            }catch(Exception $e){
                die($e->getMessage());
            }
        }else{
            foreach($validation->errors() as $error){
                echo $error, '<br />';
            }
        }
    }
}
?>

<form action="" method="post">
    <div class="field">
        <label for="gebruikersnaam">Gebruikersnaam</label>
        <input type="text" name="gebruikersnaam" id="gebruikersnaam" value="<?php echo     escape(input::get('gebruikersnaam')); ?>" autocomplete="off" />
    </div>

    <div class="field">
        <label for="paswoord">Paswoord</label>
        <input type="password" name="paswoord" id="paswoord" />
    </div>

    <div class="field">
        <label for="paswoord_2">Paswoord herhalen</label>
        <input type="password" name="paswoord_2" id="paswoord_2" />
    </div>

    <div class="field">
        <label for="naam">Voornaam</label>
        <input type="text" name="naam" id="naam" value="<?php echo     escape(input::get('naam')); ?>" />
    </div>

    <input type="hidden" name="token" value="<?php echo token::generate(); ?>">
    <input type="submit" value="Registreren" />
</form>

everything worked fine until about min 13 of video, where he does an echo of the hash of salt (I see the hash, so that works), so I think the mistake is somewhere in the create function in user.php or in the try/catch of register.php, it's probably a stupid mistake, comma or something I forgot, but I looked over the video and my code a few times, but can't find it, hope you guys can help me out

database is loaded automaticly in db file and that works, cause I also have done validation file already and those db functions work just fine

edit: I don't think something went wrong in the db code, but just to make shure, here's the code:

<?php
class db{
    private static $_instance = null;
    private $_pdo, 
            $_query, 
            $_error = false, 
            $_results, 
            $_count = 0;

    private function __construct(){
        try{
            $this->_pdo = new PDO('mysql:host='. config::get('mysql/host') .';dbname='. config::get('mysql/db'), config::get('mysql/username'), config::get('mysql/password'));
        } catch(PDOException $e){
            die($e->getMessage());
        }
    }

    public static function getInstance(){
        if(!isset(self::$_instance)){
            return self::$_instance = new db();
        }
    }

    public function query($sql, $params = array()){
        $this->_error = false;
        if($this->_query = $this->_pdo->prepare($sql)){
            $x = 1;
            if(count($params)){
                foreach($params as $param){
                    $this->_query->bindValue($x, $param);
                    $x++;
                }
            }

            if($this->_query->execute()){
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            }else{
                $this->_error = true;
            }
        }

        return $this;
    }

    public function action($action, $table, $where = array()){
        if(count($where) === 3){
            $operators = array('=', '>', '<', '>=', '<=');

            $field = $where[0];
            $operator = $where[1];
            $value = $where[2];

            if(in_array($operator, $operators)){
                $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

                if(!$this->query($sql, array($value))->error()){
                        return $this;
                }
            }
        }
        return false;
    }

    public function get($table, $where){
        return $this->action('SELECT *', $table, $where);
    }

    public function delete($table, $where){
        return $this->action('DELETE', $table, $where);
    }

    public function insert($table, $fields = array()){
            $keys = array_keys($fields);
            $values = '';
            $x = 1;

            foreach($fields as $field){
                $values .= '?';
                if($x < count($fields)){
                    $values .= ', ';
                }
                $x++;
            }

            $sql = "INSERT INTO {$table} (`". implode('`,`', $keys) ."`) VALUES ({$values})";

            if(!$this->query($sql, $fields)->error()){
                return true;
            }
        return false;
    }

    public function update($table, $id, $fields){
        $set = '';
        $x = 1;

        foreach($fields as $name => $value){
            $set .= "{$name} = ?";
            if($x < count($fields)){
                $set .= ', ';
            }
            $x++;
        }

        $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";

        if(!$this->query($sql, $fields)->error()){
            return true;
        }

        return false;
    }

    public function results(){
        return $this->_results;
    }

    public function first(){
        return $this->results()[0];
    }

    public function error(){
        return $this->_error;
    }

    public function count(){
        return $this->_count;
    }
}
?>

init.php:

<?php
session_start();

ini_set('display_errors', 1);
error_reporting(E_ALL);

$GLOBALS['config'] = array(
    'mysql' => array(
    'host' => 'localhost',
    'username' => '*****',
    'password' => '*****',
    'db' => '*****'
),
'remember' => array(
    'cookie_name' => 'hash',
    'cookie_expiry' => 604800
),
'session' => array(
    'session_name' => 'user',
    'token_name' => 'token'
)
);

spl_autoload_register(function($class){
require_once 'classes/' . $class . '.php';
});

require_once 'functions/sanitize.php';
?>
user3906610
  • 99
  • 1
  • 10

1 Answers1

-1

Change "db" by "DB" like here : https://phpacademy.org/topics/ooplr-dbgetinstance-insert-not-working-while-select-and-update-are-working/32903

Portekoi
  • 1,087
  • 2
  • 22
  • 44
  • The person who give me "-1" can explain why please? it's not the solution? – Portekoi Sep 01 '14 at 14:27
  • This isn't the solution (I didn't gave you the -1 though), also because, unlike in the video I didn't name the file DB (in capital), but db (in small) – user3906610 Sep 01 '14 at 16:02
  • The file but the class name inside? – Portekoi Sep 01 '14 at 21:14
  • nope classname is also small letters, but I do get null with the var_dump as you said above, therefore I edited the article with the code of db, just to make shure I didn't make a mistake there, but I doubt that, gonna leave the code for a day or so and maybe the night sleep over it will grant me the inside of the mistake. You're still welcome to find it for me though ;), but the day after tomorrow I'll be searching for it again myself (and also, I don't have time tomorrow :P) – user3906610 Sep 02 '14 at 18:40
  • Complete your question with the core/init.php code please. – Portekoi Sep 02 '14 at 22:24
  • Do you have exactly "getInstance" static method like here : http://desfurets.free.fr/photo/upload/94vtsxj415259dqgbgbudaztwzd5em.jpg ? Becarefull about DB and db. A Class name is always in Upper case like "DB" – Portekoi Sep 02 '14 at 22:34
  • only thing I have different, is that I put the return in front of the statement inside the if instead of a separate statement, like so: if(...){return self::...} – user3906610 Sep 05 '14 at 11:13