Я следую этому руководству 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>
Любая помощь?
это учебник youtube.com/watch?v=zvXgsouIzVg&t=15310s в 3:38:30, хеш у меня не работает
Можете ли вы упростить это до Минимальный, полный и проверяемый пример?
Извините, у меня нет 3 часов, чтобы понять, что должно произойти.
Есть сотни строк кода, и я уверен, что большинство из них не связаны с вашей проблемой. как сказал MaxvonHippel, вы должны сократить свой код до минимального экзамена, чтобы нам было легче вам помочь
@MaxvonHippel, это код
@CROZET, я бы хотел это сделать, но опять же, я думаю, что оставлю некоторую важную информацию, так как я не знаю, что я могу удалить и что мне нужно сохранить
Рэнди, процесс создания MCVE покажет вам, что вам нужно, а что нет. Начните с нуля и добавляйте код, пока не получите ошибку.
@MaxvonHippel (решено)






Мне не хватало (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);
Спасибо, в любом случае.
Что происходит с кодом? Здесь много кода. Вы также должны везде использовать параметризованные.
DELETE *неверен, вы удаляете целую строку, а не столбцы, поэтому*там не должно быть.