Хеш, cookie в браузере и хранилище в базе данных не работают

Я следую этому руководству https://thewikihow.com/video_zvXgsouIzVg&t=15310s о том, как создать форму регистрации с подключением к базе данных. По какой-то причине сохранение Hash Cookie в браузере и в базе данных у меня не работает, даже если в код включена опция запоминания, и все равно кажется, что она ничего не делает.

Опция запоминания начинается в 3:26:00, после этого я делал все, как он показывает, но в какой-то момент хеш Cookie не отображается в моем браузере

Я не знаю, что делаю не так, так что, может быть, кто-нибудь укажет мне на это.

Я знаю, что руководство устарело, но мне в некотором роде нравится, как парень объясняет, что он делает, я в этом новичок, но в какой-то момент мне пришлось начать.

У меня были некоторые проблемы с функцией Hash :: make, так как PHP 7.2.2 в наши дни работает по-другому, но я решил это другим способом, как показано в учебнике, и теперь я думаю, что у меня проблемы с файлом Hash.php.

Еще одна вещь, которую я сделал, это то, что я установил WORDPRESS каждую неделю и мне пришлось вносить некоторые изменения привилегий в базу данных, может ли это быть причиной того, что он не работает должным образом ???, даже в том случае, если я не использую таблицы, созданные WORDPRESS в базе данных, но все еще работающие с той же таблицей, созданной в соответствии с руководством

Это код файла Config.php

<?php
class Config {
    public static function get($path = null) {
        if ($path) {
            $config = $GLOBALS['config'];
            $path = explode('/', $path);

            foreach($path as $bit) {
                if (isset($config[$bit])) {
                    $config = $config[$bit];
                }
            }

            return $config;
        }

        return false;

    }
}

Это код файла Cookie.php

<?php
class Cookie {
    public static function exists($name) {
        return (isset($_COOKIE[$name])) ? true : false;
    }

    public static function get($name) {
        return $_COOKIE[$name];
    }

    public static function put($name, $value, $expiry) {
        if (setcookie($name, $value, time() + $expiry, '/')) {
            return true;
        }
        return false;
    }

    public static function delete($name) {
        self::put($name, '', time() -1);
    }
}

Это код файла 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 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 update($table, $id, $fields) {
        $set = '';
        $x = 1;

        foreach($fields as $name => $value) {
            $set .= "{$name} = ?";
            if ($x < count($fields)) {
                $set .= ', ';
            }
            $x++;
        }

        $sql = "UPDATE {$table} SET {$set} WHERE id = ($id)";

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

        return false;
    }

    public function results() {
        return $this->_results;
    }

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

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

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

Это код файла Hash.php

<?php
class Hash {

    public static function make($string, $salt = '') {
        return hash('sha256', $string . $salt);
    }

    public static function salt($length) {
        #return mcrypt_create_iv($length);
        return substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", $length)), 0, $length);
    }

    public static function unique() {
        return self::make(uniqid());
    }
}

Это код файла Input.php

 <?php
class Input {
    public static function exists($type = 'post') {
        switch($type) {
            case 'post':
                return (!empty($_POST)) ? true : false;
            break;
            case 'get':
                return (!empty($_GET)) ? true : false;
            break;
            default:
                return false;
            break;
        }
    }

    public static function get($item) {
        if (isset($_POST[$item])) {
            return $_POST[$item];
        } else if (isset($_GET[$item])) {
            return $_GET[$item];
        }
        return '';
    }
}

Это код файла Redirect.php

<?php
class Redirect {
  public static function to($location = null) {
      if ($location) {
          if (is_numeric($location)) {
              switch($location) {
                  case 404:
                      header('HTTP/1.0 404 Not Found');
                      include 'includes/errors/404.php';
                      exit();
                  break;
              }
          }
          header('Location:' . $location);
          exit();
      }
  }
}  

Это код файла Session.php

<?php
class Redirect {
  public static function to($location = null) {
      if ($location) {
          if (is_numeric($location)) {
              switch($location) {
                  case 404:
                      header('HTTP/1.0 404 Not Found');
                      include 'includes/errors/404.php';
                      exit();
                  break;
              }
          }
          header('Location:' . $location);
          exit();
      }
  }
}  

Это код файла Token.php

<?php
class Token {
    public static function generate() {
        return Session::put(Config::get('session/token_name'), md5(uniqid()));
    }

    public static function check($token) {
        $tokenName = Config::get('session/token_name');

        if (Session::exists($tokenName) && $token === Session::get($tokenName)) {
            Session::delete($tokenName);
            return true;
        }

        return false;
    }
}

Это код файла 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 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) {
        $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 logout() {
        Session::delete($this->_sessionName);
    }

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

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

Это код в файле 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("{$item} is required");
                } else if (!empty($value)){
                    switch($rule) {
                        case 'min':
                            if (strlen($value) < $rule_value) {
                                $this->addError("{$item} must be a minimun of {$rule_value} vcharacters.");
                            }
                        break;
                        case 'max':
                            if (strlen($value) > $rule_value) {
                                $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                            }
                        break;
                        case 'matches':
                            if ($value != $source[$rule_value]) {
                                $this->addError("{$rule_value} must match {$item}");
                            }
                        break;
                        case 'unique':
                            $check = $this->_db->get($rule_value, array($item, '=', $value));
                            if ($check->count()) {
                                $this->addError("{$item} 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;
    }
}

Это код файла init.php

<?php
session_start();

$GLOBALS['config'] = array(
    'mysql' => array(
        'host' => 'localhost',
        'username' => '******',
        'password' => '******',
        'db' => 'users-pass'
    ),
    'remember' => array(
      'cookie_name' => 'hash',
      'cookie_expiry' => 604800
    ),
    'session' => array(
        'session_name' => 'user',
        'token_name' => 'token'
    )
);

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

require_once 'functions/sanitize.php';

if (Cookie::exists(Config::get('remember/cookie_name')) && !Session::exists(Config::get('session/session_name'))) {
    echo 'User asked to be remembered';
}

Это код файла sanitize.php

<?php
function escape($string){
    return htmlentities($string, ENT_QUOTES, 'UTF-8');
}

Это код файла index.php

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

if (Session::exists('home')) {
    echo '<p>' . Session::flash('home') . '</p>';
}

 $user = new User();
if ($user->isLoggedIn()) {
?>
    <p>Hello <a href = "#"><?php echo escape($user->data()->username); ?></a>!</p>

    <ul>
        <li><a href = "logout.php">Log out</a></li>
    </ul>

<?php
} else {
    echo '<p>You need to <a href = "login.php">log in</a> or <a href = "register.php">register</a></p>';
}

Это код файла login.php

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

if (Input::exists()) {
    if (Token::check(Input::get('token'))) {

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

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

            $remember = (Input::get('remeber') === '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 $error, '<br>';
              }
          }

    }
}
?>

<form action = "" method = "post">
    <div class = "field">
        <label for = "username">Username</label>
        <input type = "text" name = "username" id = "username" autocomplete = "off">
    </div>

    <div class = "field">
        <label for = "password">Password</label>
        <input type = "password" name = "password" id = "password" autocomplete = "off">
    </div>

    <div class = "field">
        <label for = "remember">
            <input type = "checkbox" name = "remember" id = "remember"> Remember me
        </label>
    </div>

    <input type = "hidden" name = "token" value = "<?php echo Token::generate(); ?>">
    <input type = "submit" value = "Log in">
</form>

Это код файла logout.php

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

$user = new User();
$user->logout();

Redirect::to('index.php');

Это код файла register.php

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

if (Input::exists()) {
    if (Token::check(Input::get('token'))) {

        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'username' => array(
                'required' => true,
                'min' => 2,
                'max' => 20,
                'unique' => 'users'
            ),
            'password' => array(
                'required' => true,
                'min' => 6
            ),
            'password_again' => array(
                'required' => true,
                'matches' => 'password'
            ),
            'name' => array(
                'required' => true,
                'min' => 2,
                'max' => 50
            )
        ));

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

            $salt = Hash::salt(32);

            try {

                $user->create(array(
                    'username' => Input::get('username'),
                    'password' => Hash::make(Input::get('password'), $salt),
                    'salt' => $salt,
                    'name' => Input::get('name'),
                    'joined'=> date('Y-m-d H:i:s'),
                    'group' => 1
                ));

                Session::flash('home', 'You have been registered and can now log in!');
                Redirect::to('index.php');

            } catch(Exception $e) {
                die($e->getMessage());
            }
        } else {
            foreach($validation->errors() as $error) {
                echo $error, '<br>';
            }
        }
    }
}
?>

<form action = "" method = "post">
    <div class = "field">
        <label for = "username">Username</label>
        <input type = "text" name = "username" id = "username" value = "<?php echo escape(Input::get('username')); ?>" autocomplete = "off">
    </div>

    <div class = "field">
        <label for = "password">Choose a password</label>
        <input type = "password" name = "password" id = "password">
    </div>

    <div class = "field">
        <label for = "password_again">Enter your password again</label>
        <input type = "password" name = "password_again" id = "password_again">
    </div>

    <div class = "field">
        <label for = "name">Enter your name</label>
        <input type = "text" name = "name" value = "<?php echo escape(Input::get('name')); ?>" id = "name">
    </div>

    <input type = "hidden" name = "token" value = "<?php echo Token::generate(); ?>">
    <input type = "submit" value = "Register">
</form>

Любая помощь?

Что происходит с кодом? Здесь много кода. Вы также должны везде использовать параметризованные. DELETE * неверен, вы удаляете целую строку, а не столбцы, поэтому * там не должно быть.

user3783243 20.06.2018 01:08

это учебник youtube.com/watch?v=zvXgsouIzVg&t=15310s в 3:38:30, хеш у меня не работает

Randy Baez 20.06.2018 01:26

Можете ли вы упростить это до Минимальный, полный и проверяемый пример?

Max von Hippel 20.06.2018 04:44

Извините, у меня нет 3 часов, чтобы понять, что должно произойти.

user3783243 20.06.2018 06:36

Есть сотни строк кода, и я уверен, что большинство из них не связаны с вашей проблемой. как сказал MaxvonHippel, вы должны сократить свой код до минимального экзамена, чтобы нам было легче вам помочь

ᴄʀᴏᴢᴇᴛ 20.06.2018 14:34

@MaxvonHippel, это код

Randy Baez 20.06.2018 14:37

@CROZET, я бы хотел это сделать, но опять же, я думаю, что оставлю некоторую важную информацию, так как я не знаю, что я могу удалить и что мне нужно сохранить

Randy Baez 20.06.2018 14:41

Рэнди, процесс создания MCVE покажет вам, что вам нужно, а что нет. Начните с нуля и добавляйте код, пока не получите ошибку.

Max von Hippel 21.06.2018 07:33

@MaxvonHippel (решено)

Randy Baez 27.06.2018 01:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
48
1

Ответы 1

Мне не хватало (m) в коде файла login.php

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

решается путем изменения его на:

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

Спасибо, в любом случае.

Другие вопросы по теме