0

I am querying usernames from database using the get() function in the DB class.. its always returning 'No users' even if there are users existing in the database.. here is my 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, $params);
                    $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();
$user->get('users', array('username', '=', 'alex'));

if(!$user->count()) {
    echo 'No user';
} else {
    foreach ($user->results() as $user) {
        echo $user->username, '<br>';
    }
}

Am getting 'No user' even if there is existing user in the the DB if I use this..

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

but it is returning correct usernames(including 'alex') if I replace get() with query()

$user = DB::getInstance()->query("SELECT * FROM users");

3
  • just show us SELECT usernames FROM users; output please? Commented Jan 28, 2015 at 20:33
  • @kim it returns two usernames as there are only two users in the db i.e.. Alex, Sami Commented Jan 29, 2015 at 0:42
  • if it is Alex, that is not equal alex Commented Jan 29, 2015 at 2:34

3 Answers 3

3

In your query function when binding you do:

foreach ($params as $param) {
    $this->_query->bindValue($x, $params);
    $x++;
}

You are binding $params which is an array, not the value. Change $params to $param (singular) and it will likely work.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks jonathan.. this fixed the error notice.. but still returning 'no user' using get() function .. :(
1

Please look at this answer Row count with PDO

PDO has PDOStatement::rowCount(), which apparently does not work in MySql. What a pain.

Comments

-1

Try changing

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

to

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} {$value}";

1 Comment

I tried that too.. its still returning 'No users'...! :(

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.