как вариант Код (PHP): $day = $_POST['day']; $month = $_POST['month']; $year = $_POST['year']; $now_date = date("Y-n-j"); $now_date1 = new DateTime($now_date); $date = new DateTime($year.'-'.$month.'-'.$day); $date->modify("+1826 day"); $date1 = new DateTime($year.'-'.$month.'-'.$day); $now_date2 = new DateTime($now_date); $now_date2->modify("-54787 day"); if($date >= $now_date1) { echo '<meta http-equiv="refresh" content="1;http://php1.890m.com/main/registration?year=toyang">'; } else if($date1 <= $now_date2) { echo '<meta http-equiv="refresh" content="1;http://php1.890m.com/main/registration?year=toold">'; }
У меня они успевают отдать счетчик и кнопку, а потом скрыть их и редиректнуть. Пока что костыльно, автор. Проверять пользователя постфактум - не тру. Добавлено спустя 3 минуты 26 секунд: Использование GET для отображения ошибки? О_о Работает все просто крайне долго. Уж не знаю, хостинг ли слабый, либо тысяча переадресаций случаются. Добавлено спустя 1 минуту 37 секунд: Когда кликаю по кнопке, меня кидает на страницу increment, после чего меня кидает с нее на страницу с числом...воу... Друже, за что ты так свой сервер не любишь, что сам бомбишь его запросами? Добавлено спустя 7 минут 16 секунд: Разлогинился, решил залогиниться обратно - тупо пустая страница. Вообще ничего не происходит. А ведь я еще не начал ломать-ковырять ничего... Добавлено спустя 26 секунд: Дорабатывай, автор
Не, ну это же защита от повторного добавления. Если кнопка, значит - форма, а значит надо редиректить, без задействования JavaScript по-другому и не сделать. Другое дело, у него редиректы все через теги meta refresh... Alex_1984, для редиректа нужно использовать Код (Text): header("Location: /new-url"); die; // или exit die после него обязательно - зачем браузеру ещё какой-то контент отдавать, если уже редиректить решил. Редирект через мета-тег для других вещей используется. Допустим, если по 404 ошибке заказчик просит показать текст ошибки на 10 секунд, а потом перекинуть на главную
по этому пункту не понял, если пользователь не авторизован счетчик не будет работать Чем плохо через GET ошибки отображать и как по другому? хостинг и echo '<meta http-equiv="refresh" content="1;http://php1.890m.com/main/user">'; )) с header("Location: http://php1.890m.com/main/user"); работает заметно быстрей исправлено предыдущим пунктом насчет пустой страницы даже не знаю что сказать, 23 пользователя нарегал, ни с одним такого небыло)) может хостинг mkramer спасибо за подсказку ))
Если пользователь не авторизован, он эту страницу даже видеть не должен. А у тебя я попадаю на нее, вижу кнопки секунду, после чего попадаю на страницу входа. Надо сразу отдавать корректную страницу. Тем, что GET сделан не для этого. Ты, по факту, на сервере формируешь URL, после чего отдаешь его браузеру, после чего браузер посылает по нему запрос, после чего ты формируешь ответ, после чего ты отдаешь его браузеру. При том, что данные, по которым ты сформировал конечный ответ, были тебе известны с самого начала. Нашел ошибку->отдал браузеру страницу с сообщением об ошибке. Вот и вся цепочка. Никакой GET не нужен.
аа, ну это исправил уже. а с гетом получается есть 2 файла, registration и reg, registration это форма которая отправляет имя и пароль в reg, если данные не корректны reg отправляет гет запрос в registration в котором собственно он и отображается. reg в общем то не должен ничего показывать, он только обрабатывает. а, ну в сессию же можно еще писать. Переделал без гет, хотя по моему то же самое осталось, грузится та же страница, только ей гет параметры не передаются
Добрый день! Учу PHP, понравилось это задание, вот решил выполнить. Посмотрите, пожалуйста ссылка Исходники чуть позже покажу
всё работает.. пытался наипать форму - не получилось)) но мне показалось что там js задействован. В ТЗ было запрещенно это...
https://github.com/rewert60/task По поводу возраста - проходит от 5 полных лет (день рождения учитывается) и до 150 (включительно)
для меня - нейтрально. для тебя - показатель низкого скила в английском языке. хорошо это или плохо - тебе решать.
У меня уже в двух проектах такое реализовано на собственном framework, при чём я собрал собственную уневерсальную авторизацию, позволяющая создавать да едрешкёной кучи разнообразных авторизаций. При чём их можно крутить как хочешь Можно мне куда нибудь устроитсья на работу хочу 50к получать
Это как так Оо. Научи. Я сижу сейчас на окладе 30к. Но кажись это контора больше не позволит мне платить. Поэтому пока не нашёл не чего нового, пишу им сайт и заодно свой framework. ДУмаю когад закончу, с началом своего framework буду подыскивать новую работку. --- Добавлено --- Но я во Владивостоке, тут не так много работы, она есть но не так много по айти. --- Добавлено --- Но я во Владивостоке, тут не так много работы, она есть но не так много по айти, в Почему нет. Вот авторизация. Так это контроллер PHP: namespace App\Controllers\Auth; use System\Http\Controller\Controllers; class Auth extends Controllers { private $login; public function login() { $this->controller('Admin\\Users\\Users->login'); $this->prepareArray('login'); $this->executeData('login', '/Admin'); } public function register() { $this->controller('Admin\\Users\\Users->register'); $this->prepareArray('register'); $this->executeData('login', '/Admin'); } } Такс, а это модель. PHP: namespace App\Models\Admin\Users; use System\Http\Model\Auth\Users As RegisterUser; use System\Http\Model\Model; class Users extends Model { public function login () { $register = new RegisterUser(); $register->getId('id') ->submit('submit') ->login('user_email') ->password('user_password') ->getLogin('Users', 'user_email','user_password', 'user_group'); } public function register () { $register = new RegisterUser(); $register->getRegistration(); } } Ну и собственно сами методы под капотом. Это метод самого класса авторизации. PHP: <?php /** * Created by PhpStorm. * User: askanim * Date: 21.06.2016 * Time: 11:24 */ namespace System\Http\Model\Auth; use System\Gabriel\AuthProtect; use System\Gabriel\CFE; use System\Gabriel\CFESession; use System\Http\Model\Model; use System\Gabriel\Gabriel; class Users extends AuthProtect { private $db; private $id; public function __construct() { $this->db = new Model(); } public function getId($id) { /* * Где $id это имя столбца таблицы которая является уникальным идентификатором строки пользователя в бд, для хеша * * Обычно уникальное число пользователя * * */ $this->id = $id; return $this; } public function getLogin($nameTable, $login, $password, $group = Null) { /* * * Данная модель преднозначена * Для проверки наличия пользователя * в системе GABRIEL * Где $login, это имя столбца поле по которому будем вычислять юзера в бд * Где $password, это имя столбца таблицы, пароля, в бд * $nameTable - это имя таблицы пользователей * * * */ if(isset($this->submit)) { $this->password = trim($this->password); if (empty($this->cfe->getError())) { $result = $this->db->table($nameTable)->where([ $login.'="'.$this->email.'"' ])->get(); if(!empty($result) && password_verify($this->password, $result[0][$password])) { $id = $result[0][$this->id]; if ($group != Null) { $group = $result[0][$group]; } $hash = Gabriel::Hash($id); $hashCrypt = Gabriel::HashCrypt($hash); $this->db->table($nameTable)->where([$this->id,'=','"'.$id.'"'])->Update([$this->hash=>$hashCrypt]); CFESession::start(); CFESession::cfeSession($hash, 'hash', SESSION); CFESession::cfeSession($id, 'id', SESSION); if ($group != Null) { CFESession::cfeSession($group, 'group', SESSION); } header("Location: /admin/manual"); exit(); } else { echo 'Неверный логин или пароль'; exit(); } } else { echo '<pre>'; print_r($this->cfe->getError()); echo '</pre>'; } } } public function getRegistration () { /* * Данная модель преднозначена * для регистрации нового пользователя * в системе GABRIEL * * * */ if (isset($_POST['submit'])) { # Проверяем данные полей $cfe = new CFE(); $cfe->getName($_POST['user_name']) ->getLogin($_POST['user_login']) ->getEmail($_POST['email']) ->getPassword($_POST['user_password']) ->getCPassword($_POST['confirmPassword']) ->getCheck($_POST['check_license']) ->register(); # Конец проверки if (empty($cfe->getError())){ # Если нет ошибок проверяем есть ли такой пользователь в базе данных $result = $this->table('Users') ->where(['user_email="'.$_POST['email'].'"', 'или', 'user_login="'.$_POST['user_login'].'"']) ->get(); if (!empty($result)) { echo 'Такой пользователь в базе существует'; exit(); } #Если пользователя в базе нет, то добовляем его в базу. //Шифруем полученный пароль $password = trim($_POST['user_password']); $password = password_hash($password, PASSWORD_DEFAULT); $hash = Gabriel::Hash($_POST['user_password']); $hashCrypt = Gabriel::HashCrypt($hash); // Теперь добавляем все данные о пользователе в бд $this->table('Users')->Insert([ 'user_group' => 0, 'user_name' => $_POST['user_name'], 'user_description' => 'Я новый пользователь'.$_POST['user_name'], 'user_login' => $_POST['user_login'], 'user_email' => $_POST['email'], 'user_password' => $password, 'user_hash' => $hashCrypt ]); // Теперь получим id Пользователя $result = $this->table('Users')->where(['user_login="'.$_POST['user_login'].'"'])->get(['id']); $group = $result[0]['user_group']; $id = $result[0]['id']; // Теперь добавляем пользователя в группу пользователей $this->table('UserGroup')->Insert([ 'group_id' => $group, 'user_id' => $id ]); CFESession::start(); CFESession::userParameters($id, $group); CFESession::cfeSession($hash, 'hash', SESSION); header("Location: /admin/manual"); exit(); } else { print_r($cfe->getError()); exit(); # Если есть ошибки значит вернём массив ошибок return $cfe->getError(); } } } public function getUser () { } } --- Добавлено --- Всё не влезло ща ещё докидываю
Обычно в нормальных конторах поднимают зарплату раз в пару месяцев по результатам и постоянно её пересматривают, ищи такую, переезжай в Москву, устраивайся удалённо, будешь перебирать варианты и постепенно найдёшь что-то хорошее.
Пока что переписал тока саму авторизацию под разнообразную тему, в данный момент переписываю регистрацию, так вот капот cfe session, но тут я ещё свою задумку до ума не довёл рук всё не хватает до вести так что пока там много не исполняемых строк. Но если они не задействованы при загрузке страницы, так что не думаю что это страшно. Блин файлы большие сюда не влазят (((( --- Добавлено --- cfeSession.php PHP: <?php /** * Created by PhpStorm. * User: askanim * Date: 22.06.2016 * Time: 11:59 */ namespace System\Gabriel; use System\Http\Model\Model; /* * Не доделал * Подумать и доделать реализацию с сессиями * Оставил в связи с нехваткой времени * Нужно доделать эту аутентификацию будет * * * */ class CFESession { static private $DB; static private $cfeName; static private $cfeType; static private $cfeHash; static private $userId; static private $userGroup; static private $cfeId; static private $cfeDeath; public static function start () { /* * Стартует сессию * * * */ session_start(); static::$DB = new Model(); } public static function userParameters ($id, $group) { self::$userId = $id; self::$userGroup = $group; } public static function cfeSession ($value, $string, $type) { /* * Добавляет новую сессию * и записывает её в массив текущих переменных * $this->currentToken * Также кладём значение сесси в базу данных. * * * */ if ($type == SESSION) { $_SESSION[$string] = $value; } elseif ($type == CFE_SESSION) { $_SESSION[$string] = $value; self::$cfeName = $value; self::$cfeType = $type; self::$cfeHash = Gabriel::Hash($value); self::addCFESession(); } elseif ($type == CFE_USERSESSION) { } elseif ($type == CFE_VAR) { } } private static function addCFESession() { static::$DB->table('CFESession')->Insert([ 'cfe_name' => static::$cfeName, 'cfe_type' => static::$cfeType, 'cfe_hash' => static::$cfeHash ]); } public static function getSession ($string) { /* * Получение сессии * * * */ if (!empty($_SESSION[$string])) return $_SESSION[$string]; else return 'Не опознанная сессия '.$string; } public function getCurrentToken ($string) { /* * Возвращает токен; * $this->currentToken; * Указаный в $string; * * * */ } public static function cfeAuthProtect($value, $id) { /* * Проверка расхождения выданной пользователю сессии * С сессией в бд * * * */ if(!empty($_SESSION[$value]) && $_SESSION[$id]) { $DB = new Model(); $result = $DB->table('Users')->where(['id="'.$_SESSION[$id].'"']) ->get(); if (!empty($result)) { if(password_verify($_SESSION[$value], $result[0]['user_hash'])) { } else { header("Location: /Whoops"); exit(); } } } else { header("Location: /Whoops"); exit(); } } public static function cfeGroupProtect ($value, $group) { /* * Проверка на группы пользователей. * * */ } public static function delSession() { session_unset(); } } --- Добавлено --- Дальше идёт капот AuthProtect PHP: <?php /** * Created by PhpStorm. * User: askanim * Date: 30.06.2016 * Time: 11:49 */ namespace System\Gabriel; class AuthProtect { protected $submit; protected $login; protected $firstName; protected $secondName; protected $email; protected $tel; protected $password; protected $checkPassword; protected $input; protected $text; protected $check; protected $hash; protected $cfe; public function __construct() { $this->cfe = new CFE(); } public function submit($string) { if (isset($_POST[$string])){ $this->cfe->enString($_POST($string)); $this->submit = $_POST[$string]; return $this; } else { exit('<h1 align="center">WARNING 42 line in System/Http/Model/Auth/Users.php || code: Кнопка для отправления формы отправки не определена</h1>'); } } public function login($string) { $string = strip_tags($_POST[$string]); $this->cfe->enLengthString($string); $this->login = $string; return $this; } public function fName($string, $min = 3, $max = 30) { $string = strip_tags($_POST[$string]); $this->cfe->enRusString($string); $this->cfe->lengthString($string, $min, $max); $this->firstName = $string; return $this; } public function sName($string, $min = 3, $max = 30) { $string = strip_tags($_POST[$string]); $this->cfe->enRusString($string); $this->cfe->lengthString($string, $min, $max); $this->secondName = $string; return $this; } public function email($string) { $string = strip_tags($_POST[$string]); $this->cfe->emailString($string); $this->email = $string; return $this; } public function tel ($string) { $string = strip_tags($_POST[$string]); $this->cfe->telString($string); $this->tel = $string; return $this; } public function password($string, $min = 8, $max = 30) { $string = strip_tags($_POST[$string]); $this->cfe->enLengthString($string, $min, $max); $this->password = $string; return $this; } public function checkPassword($string) { $string = strip_tags($_POST[$string]); return $this; } public function input($string) { $string = strip_tags($_POST[$string]); return $this; } public function text($string) { $string = strip_tags($_POST[$string]); $this->text = $string; return $this; } public function check($string) { $check = $_POST[$string]; $this->cfe->checked($check); $this->check = $check; return $this; } public function hash($string) { $this->hash = $string; return $this; } } --- Добавлено --- Короче два остальных капота функций, которые наследуют мои контроллеры и модели сюда не влезают большие сильно обидно. Ну короче модуль я скинул вот он --- Добавлено --- Регистрацию сейчас делаю думаю ща до конца рабочего дня допилю и будет автоматический сбор форм авторизации.