抛出Php异常错误

时间:2014-02-26 15:13:00

标签: php mysql

我正在为我的网站构建此登录系统。在我遇到更新存储在数据库中的用户详细信息之前,一切似乎都正常。每当我尝试更新虚拟细节时,我都会抛出异常并且无法找出原因。

请你快速浏览一下,如果有错误,请帮我找一个错误?没有语法错误。

update.php

$user = new User();
            if(!$user->isLoggedIn()){
                Redirect::to('index.php');
            }

            // Check whether token is submited and user exists
            if(Input::exists()){
                if(Token::check(Input::get('token'))){

                    $validate = new Validate();
                    $validation = $validate->check($_POST, array(
                        'Name' => array(
                            'required' => true,
                            'min' => 4,
                            'max' => 30
                        ),
                        'email' => array(
                            'required' =>true
                        )
                    ));

                    if($validation->passed()){
                        // Update

                        try{
                            $user->update(array(
                                'Name' => Input::get('Name'),
                                'email' => Input::get('email')
                            ));

                Session::flash('home', 'Your details have been updated');
                Redirect::to('index.php');

                        }catch(Exception $e) {
                            die($e->getMessage());
                        }

                    } else {
                        foreach($validation->errors() as $error){
                            echo ('<p>' . $error . '</p>');
                        }
                    }
                }
            }

User.php类

class User{
    private $_db,
            $_data,
            $_sessionName,
            $_cookieName,
            $_isLoggedIn;

    public function __construct($user = null){
        $this->_db = DB::getInstance();

        $this->_sessionName = Config::get('session/session_name');
        $this->_cookieName = Config::get('remember/cookie_name');


        if(!$user){
            if(Session::exists($this->_sessionName)){
                $user = Session::get($this->_sessionName);

                if($this->find($user)){
                    $this->_isLoggedIn = true;
                } else {
                    // Process Log out
                }
            }
        } else {
            $this->find($user);
        }
    }

    public function update($fields = array(), $id = null){

        if(!$id && $this->isLoggedIn()){
            $id = $this->data()->id;
        }

      if(!$this->_db->update('user', $id, $fields)){
    throw new Exception('Sorry, there was problem updating. Please try again later.');
        }

    }

    public function create($fields = array()){
        if(!$this->_db->insert('user', $fields)){
            throw new Exception('There was a problem creating new account.');
        }
    }

    public function find($user = null){
        if($user){
            $field = (is_numeric($user)) ? 'id' : 'Username';
            $data = $this->_db->get('user', array($field, '=', $user));

            if($data->count()){
                $this->_data = $data->first();
                return true;
            }
        }

        return false;
    }

    public function login($Username = null, $password =  null, $remember = false){



        if(!$Username && !$password && $this->exists()){
            // Log User in

            Session::put($this->_sessionName, $this->data()->id);
        } else {

            $user = $this->find($Username);
            if($user){
                if($this->data()->Password === Hash::make($password, $this->data()->salt)){
                    Session::put($this->_sessionName, $this->data()->id);

                    if($remember){
                        $hash = Hash::unique();
                        $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id));

                        if(!$hashCheck->count()){
                            $this->_db->insert('users_session', array(
                                'user_id' => $this->data()->id,
                                'hash' => $hash
                            ));
                        } else {
                            $hash = $hashCheck->first()->hash;
                        }

                        Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
                    }

                    return true;
                }
            }
        }

        return false;
    }

    public function exists(){
        return (!empty($this->_data)) ? true : false;
    }

    public function logout(){

        $this->_db->delete('users_session', array('user_id', '=', $this->data()->id));

        Session::delete($this->_sessionName);
        Cookie::delete($this->_cookieName);
    }

    public function data(){
        return $this->_data;
    }

    public function isLoggedIn(){
        return $this->_isLoggedIn;
    }
}

if(!$ this-&gt; _db-&gt; update('user',$ id,$ fields)){         抛出新的例外('抱歉,有问题更新。请稍后再试。');             }

这是我得到的例外..感谢一百万

如果有帮助update()是我从

获得错误的方法

这是我的DB类:

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;

            // Check if query has been prepared properly

            if($this->_query = $this->_pdo->prepare($sql)){

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

            // If the query has been prepared successfuly, store the result
                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;
        }

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

        // DELETING DATA FROM DATABASE
        public function delete($table, $where){
            return $this->action('DELETE', $table, $where);
        }

        // INSERTING DATA INTO DATABASE
        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 results(){
            return $this->_results;
        }

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

            foreach($fields as $name => $value){
                $set .= "{$name} = ?";

                if($x < count($fields)){
                    $set .= ', ';
                }
                $x++;
            }


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

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

            return false;
        }

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

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

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

    }

1 个答案:

答案 0 :(得分:1)

如果您尝试返回sql,您会发现它无效,例如:

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

        foreach($fields as $name => $value){
            $set .= "{$name} = ?";

            if($x < count($fields)){
                $set .= ', ';
            }
            $x++;
        }


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

        return $sql;
    }

echo update('table',1,array('f1'=>'v1','f2'=>'v2','f3'=>'v3','f4'=>'v4'));

结果如下:

UPDATE table SET f1 = ?, f2 = ?, f3 = ?, f4 = ? WHERE userID = {ID}

所以你的ID不是我传递的实际整数。

但如果您将声明更改为:

//some code
$sql = "UPDATE {$table} SET {$set} WHERE userID = {$userID}";
return $sql;

结果将是:

UPDATE table SET f1 = ?, f2 = ?, f3 = ?, f4 = ? WHERE userID = 1