简体   繁体   中英

PHP login/registration system error

I was doing a login/registration system by referring this video tutorial: PHP OOP Login/Register System: Database Querying (Part 8/23) :

And I get an error:

Fatal error: Call to a member function count() on a non-object in C:\\wamp\\www\\login-register-systemv2\\index.php on line 6

index.php

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

$user = DB::getInstance()->get('user', array('username', '=', 'mantas'));

if(!$user->count()) {
    echo 'No user';
} else {
    echo 'Ok';
}

DB.php

And here is my DB.php where I think the problem is:

<?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)) {
            self::$_instance = new DB();
        }

        return self::$_instance;
    }

    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()) {


        var_dump(count($where));
        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} {$value} ?";

                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 count() {
        return $this->_count;
    }

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

}

I cant find what is wrong, maybe you can.

You must assure that your method execution is returning you always the object. Your action method may return false in some situations. As an workaround you may change your code to:

require_once 'core/init.php';

$db = DB::getInstance();

$user = $db->get('user', array('username', '=', 'mantas'));

if(!$db->count()) {
    echo 'No user';
} else {
    echo 'Ok';
}

$db = new DB(); $user = $db->get('user', array('username', '=', 'mantas'));

if(!$user->count()) {
    echo 'failed';
} else {
    echo 'success';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM