Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> sessions+cookie, Связка сессии+куки
Lunberg88  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 43155
На форуме: 4 месяца, 29 дней
Карма:




Добрый вечер!
Начал изучать php, изучал тему сессии и куки и застопорился. Перечитал php.net, смотрел разные скрипты авторизации и никак не могу понять принцип работы связки сессия+кука.
Учусь по видео-урокам (inpost - school-php(*)com), что очень удобно и понятно, там по урокам по ходу изучения языка пишеться свой-первый учебный сайт, и в домашних заданиях есть такие вот задачки по типу: сделать авто-авторизацию (работа с куками). Как я уже не крутил ни черта не могу понять как же правильно сделать.

Вот есть код контроллера(обработчика) - auth.php
Код auth.php
<?php

if(isset($_POST['login'],$_POST['password'])) {
$res=q("
SELECT * FROM `users`
WHERE `login`='"
.es($_POST['login'])."'
AND `password`='"
.myHash($_POST['password'])."'
AND `active`=1
LIMIT 1
"
);

if(mysqli_num_rows($res)) {
$_SESSION['user']=mysqli_fetch_assoc($res);
$status = "OK";
/*
$login=$_SESSION['user']['login'];
$access=$_SESSION['user']['access'];
//

setcookie('login','',time()+3600*24,'/');
setcookie('access','',time()+3600*24,'/');

$_COOKIE['login']=$_SESSION['user']['login'];
$_COOKIE['access']=$_SESSION['user']['access'];
*/

header('location: index.php');
} else {
$error='Wrong login or password';
}


}




?>

И вид, view - auth.tpl

Код auth.tpl
<div style="padding:100px;">
<?php
if(!isset($status) || $status !='OK') { echo @$error ?>



<form
action="" method="post">
Login: <input type="text" name="login"><br>
Pass: <input type="password" name="password"><br>
<input
type="radio" name="rem">Запомнить меня</input><br>
<input
type="Submit" name="Submit" value="Enter">
</form>



<?php
} else { ?>
Wrong pass or login
<?php } ?>
</div>


Все мои потуги безуспешны, хотя ничего сложного вроде здесь нет, *setcookie -создает,редактирует,удаляет куку у клиента), а вот с глобальной $_COOKIE['ключ'] - уже проблема, этой переменной я так понимаю присваивается название или значение - от setcookie?
Пробовал работать только с сессиями, но после закрытия браузера сессия сразу умирает. Как-то ковырялся с куками, вродь сделал, но после открытия браузера кука считывалась а вот сессия мертва была...

В общем если можете, помогите разобраться, хочу понять какой же принцип работы.

Это сообщение отредактировал Lunberg88 - 8.07.2016 - 19:28
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 9 дней
Карма: 77




в закоментариемом коде ты устанавливаешь пустые куки
может в этом трабла ?

Это сообщение отредактировал Kusss - 8.07.2016 - 21:17
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Lunberg88  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 43155
На форуме: 4 месяца, 29 дней
Карма:




Цитата (Kusss @ 8.07.2016 - 20:54)
в закоментариемом коде ты устанавливаешь пустые куки
может в этом травбла ?

В за комментированой области уже (отчаяние), перебрав кучу способов дошел до такого...

В целом, я пробовал создавать переменные $login и $password внутри условия if(проверки на соответствие введенного логина и пароля) если они верни, создавал куки
setcookie('login',$login,...);
setcookie('password',$password,...);
И присваивал суперглобальным $_COOKIE['login/password'] значения массива $_SESSION['user']['login/password']. Так как авторизация прошла успешно, была создана сессия юзерс и ей дали значения из таблицы `user`.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 9 дней
Карма: 77




логика такая:
Если есть кука 
ДА:
Если НЕТ авторизации
ДА : ничего не делать
НЕТ : авторизируемся и перезагружает страницу
(
Тут проверяем правильность куки,
желательно хранить в базе и куке контрольную сумму с последней авторизации см. код ниже
die();
)
НЕТ: форма авторизации
Тут сохраняем кэш IP и даты, в базе храним только time().
Это как пример.
$cookie = md5($_SERVER['REMOTE_ADDR'].time());


этот код должен запускаться на всех страницах где требуется авторизация


p.s. Ни разу не делал созранение с куками, но сделал бы так.

Это сообщение отредактировал Kusss - 8.07.2016 - 21:58
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Lunberg88  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 43155
На форуме: 4 месяца, 29 дней
Карма:




Цитата (Kusss @ 8.07.2016 - 21:43)
логика такая:<pre class="sh_sourceCode" rel="code">Если есть кука
    ДА:
Если НЕТ авторизации
  ДА : ничего не делать
  НЕТ : авторизируемся и перезагружает страницу
  (
   Тут проверяем правильность куки,
   желательно хранить в базе и куке контрольную сумму с последней авторизации см. код ниже
   die();
  )
НЕТ: форма авторизации
</pre> Тут сохраняем кэш IP и даты, в базе храним только time().
Это как пример.
<pre class="sh_sourceCode" rel="php"><span class="sh_variable">$cookie</span> <span class="sh_symbol">=</span> <span class="sh_function">md5</span><span class="sh_symbol">(</span><span class="sh_variable">$_SERVER</span><span class="sh_symbol">[</span><span class="sh_string">'REMOTE_ADDR'</span><span class="sh_symbol">].</span><span class="sh_function">time</span><span class="sh_symbol">());</span></pre>

этот код должен запускаться на всех страницах где требуется авторизация


p.s. Ни разу не делал созранение с куками, но сделал бы так.

Смотрите, как я понимаю принцип работы куки.
Сначала (к примеру после ввода верного логина и пароля мы создаем куку на стороне клиента с ключем к примеру 'login' и со значением $_POST['login']. После чего нужно присвоить суперглобальной переменной $_COOKIE этот ключ(или значение, ещё не уверен точно...), после чего на сервере эта переменная будет хранить наше значение/ключ.

Далее что бы считывать это значение (кука клиента == супер.глоб.перем. $_COOKIE[ключ]) и после чего уже выводим то что нам нужно...

Но как показала моя никчемная практика(и попросту ещё отсутствие знаний php) в контроллере auth.php я делаю манипуляции с установкой куки с помощью (setcookie) и ($_COOKIE). Далее в виде(auth.tpl) я делаю проверку:
Если сущесвтует $_COOKIE['login'] то выводим значение, которое было записано в куки ранее, если же $_COOKIE не существует или не имет никаких данных, то присвоим ей пустое значение...

Что-то вроде этого:
<?php 
if(isset($_COOKIE['login']) && $_COOKIE['login']==$_SESSION['user']['login']) {
//Выводим инфу о пользователе...
}
?>

Но к сожалению мои идеи не верны, так как потом в виде(view) вечно выскакивают ошибки по типу: Notice undefine index 'login/....' in ... some.tpl.

Тоесть в контроллере эти переменные и их значения есть а уже в виде оно ругается на то что это неизвестные переменные.

Это сообщение отредактировал Lunberg88 - 8.07.2016 - 22:12
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 9 месяцев, 25 дней
Карма: 7




Я так понимаю файл auth.php это автоизация да?
Если да то примерно вот так и если взять именно твой код
<?php
session_start(); //Стартуем сессию

if(isset($_POST['login'] && $_POST['password']))
{

$cookie = md5($_SERVER['REMOTE_ADDR'].time());

$res=q("
SELECT * FROM `users`
WHERE `login`='"
.es($_POST['login'])."'
AND `password`='"
.myHash($_POST['password'])."'
AND `active`=1
LIMIT 1
"
);

if(mysqli_num_rows($res) > 0) // Если такой существуют продолжаем
{
$_SESSION['user']= mysqli_fetch_assoc($res);

if ($_POST['rem']) // Если выбран чек-бокс запоминаем в куку юсера
{
setcookie('cookies', $cookie, time() + 3600 * 24 * 30, '/');
}

header('location: index.php'); //При успешной авторизации перенаправляем на index.php

} else {
$error='Wrong login or password';
}
}


Теперь в файле auth.tpl делаем такую проверку к примеру если юсер зайдет на сайт на
следующий день. Логика проверки:
Если есть куки и нет сессии то устанавливаем сессию и автоматом авторизируем

Пример с твоим кодом
<div style="padding:100px;">
<?php

if (!isset($_SESSION['user']) && isset($_COOKIE['cookies'])) //Если есть куки и нет сессии
{
$_SESSION['user'] = $_COOKIE['cookies']; //Записываем в сессию куки юсера

echo 'Привет Юсер! Где шлялся';

} else { //Если нет кук и сессии показываем форму авторизации

echo @$error
?>


<form action="" method="post">
Login: <input type="text" name="login"><br>
Pass: <input type="password" name="password"><br>
<
input type="radio" name="rem">Запомнить меня</input><br>
<
input type="Submit" name="Submit" value="Enter">
</
form>


<?php } ?>
</div>

А так вообще проверка должна быть во всех файлах касающихся юсера,
как говорил Kusss выше

_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Пользователь
Сообщений: 121
Пользователь №: 42899
На форуме: 7 месяцев, 9 дней
Карма: 3




Lunberg88 проведи черту между cookie и session, первое для долгосрочного запоминания (несколько и более сеансов), второе для кратковременного запоминания(один сеанс).

прим: Слово "сеанс" понимать в общепринятом значении - типа "сеанс посещение сайта/кинотеатра/массажа и т.п.".

на пальцах: Пока ты находишься на первом сеансе просмотра фильма или сеансе массажа, то одного билета (одного платежа за сеанс) достаточно, что бы досмотреть фильм до конца или получить обещанный массаж (в сознании у администратора кинозала или массажиста запущен session механизм запоминания, то есть по "роже" laugh.gif );

если у тебя есть бесплатный талон на три сеанса кино или три сеанса массажа, то это механизм cookie (при каждом новом посещении талон придется предъявить);

вполне логично, что при использовании механизма cookie, на каждом отдельном сеансе если спрашивать при каждом взгляде на посетителя талончик cookie, могут за идиота принять. Поэтому, в пределах одного сеанса, логичнее использовать кратковременное запоминание по механизму session. Долгосрочное - проверяем талончик cookie и запоминаем рожу (session) "халявщика" или запоминаем что эта рожа к скидкам отношения не имеет laugh.gif (если не предъявлен талон на скидку) .

p.s. пост адресован для новичков, кто хочет покритиковать - welcom
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Lunberg88  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 43155
На форуме: 4 месяца, 29 дней
Карма:




Летом был в командировках и немного затормозил обучение.
Вот опять начал обучаться и вернулся к старой проблеме (сессии+куки).

Сел накидал простой примитивный код лля понятия принципа работы куков:
Свернутый текст
<?php
session_start();
if(isset($_POST['login'])) {
if($_POST['login']=='psi') {
setcookie ('login',$_POST['login'],time()+3600*24,'/');
header('location: '.$_SERVER['PHP_SELF'].'/main.php');
}
}

if(isset($_COOKIE['login'])){
echo 'Hello '.$_COOKIE['login'];
} else {
echo 'You are not loggin!';
echo '<form name=auth method=post><input type=text name=login><br><input type=password name=password><br><input type=submit name=ok></form>';
}
?>

И он таки работает) Тупо, но работает.

Но перед этим со старыми мыслями пытался связать сессию+куки,как ни странно - без успехов.

Основная проблема в том что куки работают, а вот по кукам поднять сессию которая была открыта до закрытие браузера не получается. Я так понимаю что нужно в таблице "юзерс" создать ещё одно поле к примеру (auth_key) и генерировать его при авторизации и записывать в бд.
Вопрос таков, как тогда с помощью этого ключа поднять сессию?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса