PDO和OOP登录

时间:2014-05-01 13:06:53

标签: oop pdo

我正在使用PDO和OOP编写我的第一个网站。我之前只使用过MySQL / MySQLi和标准PHP。

我使用phpacademy的OOP注册/登录教程系列创建了一个登录/注册系统。

现在我对此有疑问。我如何添加一个isOwner或者我可以用来检查登录用户是否在其自己的配置文件上等等。我将尝试创建一个pm系统然后我需要这个以确保你不能发送下午给自己:))

以下是代码:

的login.php

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

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

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Log in</title>
    <link rel="icon" href="favicon.ico" type="image/x-icon">
    <link rel="stylesheet" href="style/global.css">
    <link rel="stylesheet" type="text/css" href="css/font-awesome.css">
    <script src="js/main.js"></script>
</head>
<body>
    <?php require_once 'includes/header.php'; ?>
    <form action="" method="post">
        <h1>Log in</h1>
        <div class="inset">
        <?php
        if (input::exists()) {
            if (Token::check(Input::get('token'))) {

                $validate = new Validate();
                $validation = $validate->check($_POST, array(
                    'username' => array(
                        'required' => true,
                        'name' => 'Username'
                    ),
                    'password' => array(
                        'required' => true,
                        'name' => 'Password'
                    )
                ));

                if ($validation->passed()) {
                    $user = new User();

                    $remember = (Input::get('remember') === 'on') ? true : false;
                    $login = $user->login(Input::get('username'), Input::get('password'), $remember);

                    if ($login) {
                        Redirect::to('index.php');
                    } else {
                        echo '<p>Sorry, logging in failed </p>';
                    }

                } else {
                    foreach ($validation->errors() as $error) {
                        echo '<i class="fa fa-exclamation-triangle"></i>&nbsp;&nbsp;', $error, '<br>';
                        echo '<br />';
                    }
                } 

            }
        }
        ?>
        <p>
            <label for="username">USERNAME</label>
            <input type="text" name="username" id="username" value="<?php echo escape(Input::get('username')); ?>">
        </p>
        <p>
            <label for="password">PASSWORD</label>
            <input type="password" name="password" id="password">
        </p>
        <p>
            <input type="checkbox" name="remember" id="remember">
            <label for="remember">Remember me for 1 month</label>
        </p>
        </div>

        <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
        <p class="p-container">
            <span>Forgot password?</span>
            <input type="submit" name="go" id="go" value="Log in">
        </p>
    </form>
</body>
</html>

Validate.php

<?php
        class Validate {
            private $_passed = false,
                    $_errors = array(),
                    $_db = null;

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

            public function check($source, $items = array()) {
                foreach ($items as $item => $rules) {
                    foreach ($rules as $rule => $rule_value) {

                        $value = trim($source[$item]);
                        $item = escape($item);

                        if ($rule === 'required' && empty($value)) {
                            $this->addError("{$rules['name']} is required");
                        } else if(!empty($value)) {
                            switch ($rule) {
                                case 'min':
                                    if (strlen($value) < $rule_value) {
                                        $this->addError("{$rules['name']} must be a minimum of {$rule_value} characters.");
                                    }
                                break;
                                case 'max':
                                    if (strlen($value) > $rule_value) {
                                        $this->addError("{$rules['name']} must be a maximum of {$rule_value} characters.");
                                    }
                                break;
                                case 'matches':
                                    if ($value != $source[$rule_value]) {
                                        $this->addError("{$rule_value} must match {$rules['name']}");
                                    }
                                break;
                                case 'unique':
                                    $check = $this->_db->get($rule_value, array($item, '=', $value));
                                    if ($check->count()) {
                                        $this->addError("{$rules['name']} already exists.");
                                    }
                                break;
                            }
                        }

                    }
                }

                if (empty($this->_errors)) {
                    $this->_passed = true;
                }

                return $this;
            }

            private function addError($error) {
                $this->_errors[] = $error;
            }

            public function errors() {
                return $this->_errors;
            }
            public function passed() {
                return $this->_passed;
            }
        }

user.php的

<?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 logout
                        }
                    }
                } else {
                    $this->find($user);
                }
            }

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

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

                if (!$this->_db->update('users', $id, $fields)) {
                    throw new Exception('There was a problem updating');
                }
            }

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

            public function find($user = null) {
                if ($user) {
                    $field = (is_numeric($user)) ? 'id' : 'username';
                    $data = $this->_db->get('users', 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()) {
                    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 hasPermission($key) {
                $group = $this->_db->get('groups', array('id', '=', $this->data()->group));

                if ($group->count()) {
                    $permissions = json_decode($group->first()->permissions, true);

                    if ($permissions[$key] == true) {
                        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;
            }
        }

有人可以帮帮我吗?

提前致谢, Busarna

0 个答案:

没有答案