登录/注册系统得到致命的错误PHP

时间:2014-02-09 13:43:48

标签: php

我已经写了一个代码而且有一个错误我得到的任何人都可以告诉我什么错了吗?

错误致命错误:在第6行的C:\ xampp \ htdocs \ loginsistem \ index.php中的非对象上调用成员函数error()

但它应该说好!如果我是对的

的init.php:

<?php
session_start();

$GLOBALS ['config'] = array(
    'mysql' => array(
        'host' => '127.0.0.1',
        'username' => 'root',
        'password' => '',
        'db' => 'lr'
    ),
    'remember' => array(
        'cookie_name' => 'hash',
        'cookie_expiry' => 604800
    ),
    'session' => array(
        'session_name' => 'user'
    )
);

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

});

require_once 'functions/sanitize.php';
?>

的index.php:

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

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

if($user->error()) {
    echo 'No user';
} else {
    echo 'OK!';
}

?>

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

}

2 个答案:

答案 0 :(得分:2)

可能就在这一部分:

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

在我看来,你应该修改它:

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

答案 1 :(得分:0)

将代码拆分为:

// get db instance
$db = DB::getInstance();
// the get function will return $this or false
$users = $db->get('users', array('username', '=', 'grega'));

if($users === false || $db->error()) {
    echo 'No user';
} else {
    echo 'OK!';
}

在分配值时,我在代码中也看到了一些奇怪的东西:

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

如果你删除'我认为它会更好。

如果您在代码上测试错误,也不需要在函数中测试错误。

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

    $this->query($sql, array($value);
    return $this;
}