0

i started to build oop login/register system by watching tutorial on youtube (phpacademy), i got to one point and the code does not work. i checked it a few time and still nothing. DB is created and working great and i have one user in db(users)-alex. If anyone can see what i did wrong, pls help me :)

i hope i explained my problem right, the error i get is : "Fatal error: Call to a member function count() on a non-object in C:\xampp\htdocs\oopLogin\index.php on line 7"


DB.php

<?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()) {
        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 results() {
        return $this->_results;
    }

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

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

}

index.php

<?php

require_once 'core/init.php';

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

if(!$user->count()) {
    echo 'No user';
} else {
    foreach($user->results() as $user) {
        echo $user->username, '<br>';
    }
}
5
  • 1
    count() is a method in the DB class, not in your result. Commented Sep 22, 2014 at 10:47
  • Consider the comment from @DanFromGermany that is right. I'm not sure that $sql = "($action) FROM ($table) WHERE ($field) ($operator) ?"; will work because of parentheses. Commented Sep 22, 2014 at 10:51
  • 2
    you use return $this in your DB class, check $user returned currectly , vardump($user); before if help you! it seems seted to false instead of $this Commented Sep 22, 2014 at 10:52
  • 1
    @PouyaDarabi is right, $user === false, returned in action(), SQL statement seems to be wrong. Commented Sep 22, 2014 at 10:54
  • 1
    @DanFromGermany yes , sql query was wrong! Commented Sep 22, 2014 at 11:09

1 Answer 1

1

you sql query is wrong!

change this line in DB class

from :

$sql = "($action) FROM ($table) WHERE ($field) ($operator) ?";

to

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
Sign up to request clarification or add additional context in comments.

1 Comment

Yes, it works...that was a problem. Thank you, i was blowing my mind for two days

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.