предисловие:вообще не понимаю я этих кук/сессий. мне кажется, что одно спокойно может обходиться без другого для поставленной задачи (авторизации) - но ведь это не так...разжуйте, а? прочёл много, но не въезжаю окончательно. з.ы. скрипты в итоге выдают "na" (последний елсе) handler.php: Код (PHP): session_start(); class authorization{ static public $login; static public $password; static public $users_id; static public function check_log($login, $password){ self::$login = mysqli_real_escape_string(database::get_instance(),$login); self::$password = mysqli_real_escape_string(database::get_instance(),$password); $result = mysqli_query(database::get_instance(), "SELECT `users_id` from users WHERE `users_login`="."'".self::$login."' and `users_password`="."'".self::$password."'"); $tmp = mysqli_fetch_assoc($result); if ($tmp != NULL){ $_SESSION['authorization'] = $tmp[1]; header("location: index.php"); }else{ echo "Такой пользователь не зарегистрирован!"; } } // вызов метода-проверки пользователя if (isset ($_POST['log']) and isset ($_POST['pas'])){ $connect = database::get_instance(); if ($connect){ authorization::check_log($_POST['log'], $_POST['pas']); } } index.php: Код (PHP): session_start(); include 'modal-window.php'; if (isset($_SESSION['authorization'])){ echo "<p>Вы вошли как ".$_SESSION['authorization']."</p>"; }else{ echo "na"; }
Ну вот вы написали функцию authorization::check_log(), завернули ещё в класс. Очень хорошо. А где вызов-то? Добавлено спустя 2 минуты 20 секунд: Ну и потом, сейчас гуру прибегут, и расскажут, что хранить открытый пароль нельзя, что в запросе пароль вообще не должен фигурировать. Но я думаю, сначала вообще надо разобраться, как должно работать Сессии могут обходиться без кук, тут вы правы. Но тогда надо таскать в урлах Session ID. Одними куками тоже, пожалуй, можно попробовать решить задачу.
вызов метода не стал выкладывать, но он присутствовал (добавил в первом посте). вот вардампнул: Код (PHP): .... $result = mysqli_query(database::get_instance(), "SELECT `users_id` from users WHERE `users_login`="."'".self::$login."' and `users_password`="."'".self::$password."'"); $tmp = mysqli_fetch_assoc($result); if ($tmp != NULL){ var_dump($tmp);die(); ..... итог: array(1) { ["users_id"]=> string(1) "3" } , т.е. условие If'a должно выполниться. нужно помаленьку делать, лучше до ума доведу эту проблему, все крутецкие проверки и т.п. прикручу уже потом) вот в том и дело, но большинство источников настоятельно рекомендуют использовать и одно, и другое. и, вообще, описывается всё так, будто это одно и то же с той лишь разницей, что куки хранит браузер, а сессии - сервер, - в итоге у меня в голове охуев**я каша
HTTP протокол stateless https://en.wikipedia.org/wiki/Stateless_protocol Единственный вменяемый способ идентифицировать конкретного человека, его сессию работы с сайтом - это куки. $_SESSION - это способ хранения информации на сервере с привязкой к конкретному пользователю. Но конкретного пользователя как-то нужно идентифицировать? Смотрим куки. По факту в куках уникальный ID, на основании которого интерпретатор PHP достает из нужного файла на диске (по умолчанию) сохраненную ранее информацию. Эту информацию можно было бы класть и напрямую в куку, но кука приходит со стороны пользователя, а значит ей нет доверия. По-этому и используют схему хранения критичной информации на сервере.
правильно ли я понял, что делать нужно примерно так: 1. юзер вводит свои данные в форму 2. при их правильности создается сессия (session_start() ) и ставится cookie (setcookie() ), в которой будет храниться, например, какая-то строка (например связка "логин-пароль" в мд5, для безопасности) 3. при каждом новом заходе на сайт необходимо проверять куку? Добавлено спустя 1 минуту 44 секунды: у меня на самом деле что-то вроде "единой точки входа": 1. главная index.php, которая в зависимости от ?ction= подключает нужные мне страницы. 2. в итоге вид такой: index.php подключает main.php, который подключает default.php, код которого я в начале и указал. session_start() забыл указать, он там был. Добавлено спустя 5 минут 15 секунд: в общем говоря, картина такая: index.php Код (PHP): <?php session_start(); header('Content-Type: text/html; charset=utf8'); include "../classes/router.php"; include "../classes/database.php"; $router = new router; $route = 'default'; //default action (including "default.php") if (isset($_GET['action'])){ $route = $router->parse_route($_GET['action']); } $filePath = "../modules/"."$route".".php"; include '../layouts/main.php'; ?> main.php Код (PHP): <?php if(file_exists($filePath)){ include $filePath; } else{ die('isn\'t require - error'); } ?> default.php Код (PHP): <?php session_start(); include 'modal-window.php'; if (isset($_SESSION['authorization'])){ echo "<p>Вы вошли как ".$_SESSION['authorization']."</p>"; }else{ echo "na"; } ?>
попробовал вот так: handler.php Код (PHP): $tmp = mysqli_fetch_assoc($result); if ($tmp != NULL){ session_start(); //$_SESSION['authorization'] = $tmp[1]; setcookie(kyka, $tmp[1]); header("location: index.php"); index incl. main incl. default.php Код (PHP): <?php session_start(); include 'modal-window.php'; var_dump($_SESSION); // var_dump($_COOKIE['kyka']) === NULL ?wtf var_dump($_COOKIE);die(); рез-ат: array(1) { ["authorization"]=> NULL (??) } array(1) { ["PHPSESSID"]=> string(32) "c713f7eaf681a289d2752c4dd316ec80" } (??)
А, ну так вы вот здесь глупость пишите: Что такое $tmp[1]? Странно, что вы предупреждение не получили. Вы же сами var_dump приводите: В этом массиве нет элемента с индексом 1, есть элемент с индексом "user_id"
бл*******************************************************************************************************************дь!!!!!!!!! спасибо вам Добавлено спустя 3 минуты 8 секунд: а, может, так было бы правильнее? по сути в так ведь и в сессии будет хранится кука? ну, поставиться юзеру в браузер кука, а у меня на сервере в сессии будет хранится такая же кука. или я чушь несу? Код (PHP): if ($tmp != NULL){ session_start(); setcookie(user_id, $tmp['users_id']); header("location: index.php"); }
Нет, механизм сессий php все делает сам за вас. Вам только session_start - а поставится или проверися кука прозрачно.
т.е. просто Код (PHP): session_start(); include 'modal-window.php'; if (isset($_SESSION['login'])){ echo "<p>Вы вошли как ".$_SESSION['login']."</p>"; ?
ага, так действительно работает. т.е. так походу и создаётся некая сессионная кука. хорошо, т.е. авторизация вполне работает на сессиях) эм... а зачем простые куки тогда? Добавлено спустя 2 минуты 50 секунд: практическая цель какая у них может быть?
Ну к примеру галочка "запомнить меня" делается через куку. В куке можно хранить дату последнего захода и ещё много чего
товарищи, не вижу в чём проблема. делаю процесс разлогинивания. алгоритм, примерно, следующий: 1. жмём на кнопку "Выход" (которая есть ТОЛЬКО ТОГДА, когда юзер залогинился) 2. нас перекидывает на handler.php , код которого представлен внизу. handler.php : Код (PHP): class authorization{ static public $login; static public $password; static public $users_id; static public function check_log($login, $password){ self::$login = mysqli_real_escape_string(database::get_instance(),$login); self::$password = mysqli_real_escape_string(database::get_instance(),$password); $result = mysqli_query(database::get_instance(), "SELECT `users_login` from users WHERE `users_login`="."'".self::$login."' and `users_password`="."'".self::$password."'"); $tmp = mysqli_fetch_assoc($result); if ($tmp != NULL){ session_start(); $_SESSION['login'] = $tmp['users_login']; header("location: index.php"); }else{ echo "Такой пользователь не зарегистрирован!"; } } } if (isset ($_POST['log']) and isset ($_POST['pas'])){ $connect = database::get_instance(); if ($connect){ authorization::check_log($_POST['log'], $_POST['pas']); } } } 3. чтобы разлогинивание происходило, я добавляю в конце скрипта handler.php Код (PHP): if ($_SESSION['login'] == TRUE){ session_unset(); header("location: index.php"); }else{ // echo "lal"; и всё действительно разлогинивает, НО потом я не могу залогиниться, он, видимо, сразу создаёт сессию и ломает её. т.е. логика такая: если я попадаю на handler.php с уже существующей переменной сессии login, то нужно ломать сессию. попасть на handler.php с существующей сессией можно только через кнопку "Выйти" (см. скрин)