Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Хранение данных пользователя

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (6): [1] 2 3 4 5 6 »   

> Описание: оцените вариант
Hapson
Отправлено: 18 Августа, 2013 - 14:09:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Изобрел я шестеренку для своего велосипедика))) Ну наверное я не первый.
Смысл в чем - где хранить данные пользователя.
Например есть класс Users, в одном из методов которого, реализована проверка авторизации.
Авторизация держится на сессии в основном, ну и плюс кука.
Я сделал что-то типа:

При авторизации я записываю в $SESSION["user"] массив данных пользователя, ну и в классе Users заполняю свойства аналогичными данными. В этом массиве также лежит уникальный идентификатор, который генерируется при успешной авторизации.
Далее по коду я вывожу данные пользователя таким образом:
$_SESSION["user"]->name

Однако... я не кладу в это массив два свойства - email и password(его хеш). Везде говорят, что в сессии не рекомендуется такое хранить.

Поэтому я решил попробовать хранить данные пользователя в .ini файлах. То есть, пользователь авторизовался - для него сгенерировался уникальный идентификатор - uid. Этот идентификатор я кладу в $_SESSION["users"], а также записываю файл uid.ini
Дальше, при перезагрузке страницы метод в классе Users проверяет наличие идентификатора в сессии и наличие файла с таким именем. Если и то и то есть, то файл зачитывается и заполняются свойства.
Далее по коду я уже смогу писать $user->name
А также в этих файлах я думаю можно хранить и email юзера.
Естественно, при выходе файл удаляется.

Я посчитал, на операцию поиска файла, его зачитывания и заполнения полей уходит примерно 0,00045 сек. Для реалистичности я создал в папке 1000 файлов с именами от 1 до 1000, и среди них нужный.
Ну вот примерный код

PHP:
скопировать код в буфер обмена
  1.                 //$_SESSION['sessid'] = 'akybfjsgbwsygvhsbjsshnctr52hb17fg5f';
  2.                 class Users{
  3.                         public $name = null;
  4.                         public $email = null;
  5.                         public $password = null;
  6.                         public $city = null;
  7.                         public $status = null;
  8.                        
  9.                         function check($sessid){
  10.                                 $file = $_SESSION['sessid'] .'.ini';
  11.                                 if(isset($_SESSION['sessid']) && file_exists($file)){
  12.                                         $file = $_SESSION['sessid'] .'.ini';
  13.                                         $user_data = parse_ini_file($file, true);
  14.                                         $this->name = $user_data['name'];
  15.                                         $this->email = $user_data['email'];
  16.                                         $this->password = $user_data['password'];
  17.                                         $this->city = $user_data['city'];
  18.                                         $this->status = $user_data['status'];
  19.                                 }else{
  20.                                         $this->name = 'Guest';
  21.                                         $this->email = 'No';
  22.                                         $this->password = 'No';
  23.                                         $this->city = 'No';
  24.                                         $this->status = 'Guest';
  25.                                 }
  26.                         }
  27.                 }
  28.                
  29.                 $start = microtime(true);
  30.                 $user = new Users();
  31.                 for($i = 0; $i < 1000; $i++){
  32.                         $user->check($_SESSION['sessid']);
  33.                 }
  34.                 echo $user->name ."<br>";
  35.                 echo $user->email ."<br>";
  36.                 echo $user->password ."<br>";
  37.                 echo $user->city ."<br>";
  38.                 echo $user->status ."<br>";
  39.                 $stop = microtime(true);
  40.                
  41.                 echo "<hr>";
  42.                 echo $stop - $start .' sec';
  43.                
  44.                 /*for($i = 1; $i < 1000; $i++){
  45.                         $arr = array('name' => 'Vasya', 'email' => 'vasya@mail.loc', 'password' => '12345678', 'city' => 'Moscow', 'status' => 'Admin', );
  46.                         foreach($arr as $key => $val){
  47.                                 $file = $i .'.ini';
  48.                                 $str = "$key = $val\n";
  49.                                 file_put_contents($file, $str, FILE_APPEND);
  50.                         }
  51.                 }*/


И еще такой вопрос
Вот например если при авторизации пользователя я пишу что-то типа
$_SESSION['user'] = array(бла-блабла);
Но ведь пользователь не один на сайте. Другой пользователь заходит и тоже пишется $_SESSION['user'] = array(бла-блабла); Ну будет ли это затираться? Или для каждого пользователя существует какбы свой массив $_SESSION?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DelphinPRO
Отправлено: 18 Августа, 2013 - 14:20:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Открою вам секрет: сессия - это тоже файл!! Когда вы пишете $_SESSION['user'] = 'dd'; эта хрень записывается именно в файл. Файл имеет имя PHPSESSID (это уникальный идентификатор сессии, передается через куки или гет-параметр, зависит от настроек php)
примерно такое: sess_48ngg7vbga91aps95p3nndiek3

Возникает вопрос, нафига еще один файл? Улыбка
(Добавление)
Hapson пишет:
Однако... я не кладу в это массив два свойства - email и password(его хеш). Везде говорят, что в сессии не рекомендуется такое хранить.

Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.

(Отредактировано автором: 18 Августа, 2013 - 14:26:29)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 14:25:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DelphinPRO пишет:
Открою вам секрет: сессия - это тоже файл!! Когда вы пишете $_SESSION['user'] = 'dd'; эта хрень записывается именно в файл. Файл имеет имя PHPSESSID (это уникальный идентификатор сессии, передается через куки или гет-параметр, зависит от настроек php)

Возникает вопрос, нафига еще один файл? Улыбка
(Добавление)
Hapson пишет:
Однако... я не кладу в это массив два свойства - email и password(его хеш). Везде говорят, что в сессии не рекомендуется такое хранить.

Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.

Ну да, я знаю, что сессия создает файл с тем что я записал в сессию этого пользователя. Я получается сделал тоже самое...
Ну а где же тогда хранить email и хеш пароля? Если в сессии не безопасно, не лезть же за ними в БД при необходимости?
(Добавление)
DelphinPRO пишет:
Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.

Ну да, пароль не нужен, а за мылом тогда лазить в БД?
(Добавление)
Тогда значит пользователь авторизовался -> заполнил поля из БД -> закинул объект в сессию.
При перезагрузке страницы: проверил uid в сессии, если есть, то заполнил поля из сессии и вывожу $user->name
Так наверно?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
teddy
Отправлено: 18 Августа, 2013 - 15:33:57
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Hapson пишет:
Ну да, пароль не нужен, а за мылом тогда лазить в БД?

Я например записываю только ID при авторизации в сессию и дальше на этой основе все разруливаю. Если что то нужно селектнуть из БД - то id всегда есть под рукой и можно легко манипулировать данными при помощи него
 
 Top
LIME
Отправлено: 18 Августа, 2013 - 15:48:05
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




teddy пишет:
Если что то нужно селектнуть из БД - то id всегда есть под рукой и можно легко манипулировать данными при помощи него
если редко то пожалуй
а если часто нужны некоторые данные то проще в сессию положить чтоб не устать в бд лазать каждый раз
 
 Top
teddy
Отправлено: 18 Августа, 2013 - 16:03:22
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




LIME
Может быть - может быть...

Обычно мы заранее знаем какие нам данные понадобятся(при условии что чертеж проекта набросан заранее), поэтому я обычно пишу функцию, которая достает из базы все что нам нужно на основе id для конкретного пользователя. Тоесть все разруливает ОДНА точка.

А так потом путаница помоему может возникнуть при расширении потому что часть данных лежит в сессии, часть по выборке забирается и можно запутаться, записывать ли снова все в сессию или держать часть в сессии а часть забирать по отдельной выборке - как по мне бардачно получается.

Поэтому проще написать функцию и все... и если что то надо поменять - уже делаем небольшие правки в функции или методе класса в зависимости от того в каком стиле написан код ООП или процедурный...

Мое мнение...

(Отредактировано автором: 18 Августа, 2013 - 16:14:00)

 
 Top
DelphinPRO
Отправлено: 18 Августа, 2013 - 17:06:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




чтобы не лазить в БД за данными текущего пользователя при каждом обновлении страницы, я все его данные кладу в сессию, в том числе и мыло (кроме пароля, потому что он нафиг не нужен нигде, кроме процедуры аутентификации) Ну а класс пользователя уже знает, что если запрашиваются данные текущего пользака, то взять их нужно из сессии, иначе лезем в базу по ID. Где здесь может возникнуть путаница - хз.
ЗЫ. Высоконагруженных проектов не пишу. Проблем еще не ловил.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 17:11:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Понятно. Ну получается передавать инфу о пользователе в сессии - наиболее оптимальный вариант.
А вот как быть, если нужно просто передать какие-то данные между скриптами. Данные не относятся к конкретному пользователю. Например это ошибки, которые возникли в процессе авторизации. Скрипт авторизации пишет их в сессию, а форма регистрации их выводит. Так вот, если у пользователя выключены куки, то он даже не получит этих ошибок, не говоря уже об авторизации.
Ну то, что он не сможет авторизоваться - это его проблемы. Но вот скрипты должны отработать как положено, независимо от кук пользователя. Как быть в такой ситуации?
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик?
(Добавление)
Или сделать класс-обработчик ошибок в свойства которого и писать массив ошибок? Они и удаляться тогда будут сами
(Добавление)
Нет, все равно же между записью ошибок и выводом есть перезагрузка...


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DelphinPRO
Отправлено: 18 Августа, 2013 - 17:31:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Hapson пишет:
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик?

да что вы прикопались к файлам? Улыбка
пишите в сесию, и не парьтесь. И еще почитайте, как они работают. повнимательнее. я выше писал про PHPSESSID


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 17:34:25
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


DelphinPRO пишет:
Hapson пишет:
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик?

да что вы прикопались к файлам? Улыбка
пишите в сесию, и не парьтесь. И еще почитайте, как они работают. повнимательнее. я выше писал про PHPSESSID

передавать PHPSESSID в адр.строке? А у поисковиков есть куки? Улыбка
Кстати у меня почему-то не получается передать идентификатор в строке


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
DelphinPRO
Отправлено: 18 Августа, 2013 - 17:35:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




что прочесть
http://www.php.net/manual/ru/ses...on.idpassing.php
http://www.php.net/manual/ru/ses...ion.security.php
(Добавление)
Добавлю по поводу передачи SID
я просто пишу сообщение на сайте, что для авторизованных пользователей необходимо включить печеньки...


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 17:46:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Значит там где мне нужно гарантированно использовать сессионные данные, я просто должен дописывать SID ?
PS а в формах появляется скрытое поле если
php_flag session.use_trans_sid 1
php_flag session.use_only_cookies off
раньше не обращал внимания

PPS

А если у меня в случае провала авторизации передается URI типа http://exemple[dot]org/register или более правильно ведь http://exemple[dot]org/register/
Сюда тоже можно дописать SID?
Тогда будет
http://exemple[dot]org/register/?PHP[dot][dot][dot]ID=kabakjdnalkcj
(Добавление)
Значит сделал так
PHP:
скопировать код в буфер обмена
  1. header('Location: '. SITE_URL .'/users/authorization'. SID);

получил вот
PHP:
скопировать код в буфер обмена
  1. http://blog/users/authorizationPHPSESSID=rg9b0o4tsis1h8e388vuenl4o6

Значит нужно еще знак вопроса дописывать, если нет кук... как я это узнаю до перезагрузки?
(Добавление)
PHP:
скопировать код в буфер обмена
  1. if(SID)$sid = '?'. SID;
  2. header('Location: '. SITE_URL .'/users/authorization'. $sid);


Вроде работает...
(Добавление)
наверно лучше так
PHP:
скопировать код в буфер обмена
  1. $sid = (SID != '') ? '?'. SID : '';
  2. header('Location: '. SITE_URL .'/users/authorization'. $sid);


Геморой...
(Добавление)
Но чтобы использовать SID нужно выключить session.use_only_cookies

(Отредактировано автором: 18 Августа, 2013 - 17:51:10)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 18 Августа, 2013 - 19:39:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Геморой...

ну и зачем он вам?
никто куки не отключает
99.9% юзеров даже не знают что это


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hapson
Отправлено: 18 Августа, 2013 - 19:52:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


caballero пишет:
Цитата:
Геморой...

ну и зачем он вам?
никто куки не отключает
99.9% юзеров даже не знают что это

Ну да в принципе. Нужно наверно просто выводить сообщение о том что надо включить куки - хоть какая-то информативность.

PS
Я тоже когда-то давно не знал, что такое куки. Где-то прочитал, что куки - зло, и полез выключать. Выключил и понял, что что-то я не то сделал - полез и включил обратно)))
(Добавление)
PS
caballero
Вы правы. Судя по яндекс метрике моего сайта, с февраля этого года, куки включены у 99,33% пользователей. Из 73 546 визитов - 494 без кук


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
caballero
Отправлено: 18 Августа, 2013 - 20:00:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Из 73 546 визитов - 494 без кук

боты которые курлом ходят


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (6): [1] 2 3 4 5 6 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB