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 :: Хранение данных пользователя
Покинул форум
Сообщений всего: 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, и среди них нужный.
Ну вот примерный код
И еще такой вопрос
Вот например если при авторизации пользователя я пишу что-то типа
$_SESSION['user'] = array(бла-блабла);
Но ведь пользователь не один на сайте. Другой пользователь заходит и тоже пишется $_SESSION['user'] = array(бла-блабла); Ну будет ли это затираться? Или для каждого пользователя существует какбы свой массив $_SESSION?
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
DelphinPRO
Отправлено: 18 Августа, 2013 - 14:20:58
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Открою вам секрет: сессия - это тоже файл!! Когда вы пишете $_SESSION['user'] = 'dd'; эта хрень записывается именно в файл. Файл имеет имя PHPSESSID (это уникальный идентификатор сессии, передается через куки или гет-параметр, зависит от настроек php)
примерно такое: sess_48ngg7vbga91aps95p3nndiek3
Возникает вопрос, нафига еще один файл? (Добавление)
Hapson пишет:
Однако... я не кладу в это массив два свойства - email и password(его хеш). Везде говорят, что в сессии не рекомендуется такое хранить.
Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
DelphinPRO пишет:
Открою вам секрет: сессия - это тоже файл!! Когда вы пишете $_SESSION['user'] = 'dd'; эта хрень записывается именно в файл. Файл имеет имя PHPSESSID (это уникальный идентификатор сессии, передается через куки или гет-параметр, зависит от настроек php)
Возникает вопрос, нафига еще один файл? (Добавление)
Hapson пишет:
Однако... я не кладу в это массив два свойства - email и password(его хеш). Везде говорят, что в сессии не рекомендуется такое хранить.
Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.
Ну да, я знаю, что сессия создает файл с тем что я записал в сессию этого пользователя. Я получается сделал тоже самое...
Ну а где же тогда хранить email и хеш пароля? Если в сессии не безопасно, не лезть же за ними в БД при необходимости? (Добавление)
DelphinPRO пишет:
Насчет мыла не скажу, а пароль действительно не зачем хранить в сессии. Ведь если сессия уже открыта, значит пользователь авторизован.
Ну да, пароль не нужен, а за мылом тогда лазить в БД? (Добавление)
Тогда значит пользователь авторизовался -> заполнил поля из БД -> закинул объект в сессию.
При перезагрузке страницы: проверил uid в сессии, если есть, то заполнил поля из сессии и вывожу $user->name
Так наверно?
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
teddy
Отправлено: 18 Августа, 2013 - 15:33:57
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Hapson пишет:
Ну да, пароль не нужен, а за мылом тогда лазить в БД?
Я например записываю только ID при авторизации в сессию и дальше на этой основе все разруливаю. Если что то нужно селектнуть из БД - то id всегда есть под рукой и можно легко манипулировать данными при помощи него
LIME
Отправлено: 18 Августа, 2013 - 15:48:05
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy пишет:
Если что то нужно селектнуть из БД - то id всегда есть под рукой и можно легко манипулировать данными при помощи него
если редко то пожалуй
а если часто нужны некоторые данные то проще в сессию положить чтоб не устать в бд лазать каждый раз
teddy
Отправлено: 18 Августа, 2013 - 16:03:22
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
Может быть - может быть...
Обычно мы заранее знаем какие нам данные понадобятся(при условии что чертеж проекта набросан заранее), поэтому я обычно пишу функцию, которая достает из базы все что нам нужно на основе id для конкретного пользователя. Тоесть все разруливает ОДНА точка.
А так потом путаница помоему может возникнуть при расширении потому что часть данных лежит в сессии, часть по выборке забирается и можно запутаться, записывать ли снова все в сессию или держать часть в сессии а часть забирать по отдельной выборке - как по мне бардачно получается.
Поэтому проще написать функцию и все... и если что то надо поменять - уже делаем небольшие правки в функции или методе класса в зависимости от того в каком стиле написан код ООП или процедурный...
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
чтобы не лазить в БД за данными текущего пользователя при каждом обновлении страницы, я все его данные кладу в сессию, в том числе и мыло (кроме пароля, потому что он нафиг не нужен нигде, кроме процедуры аутентификации) Ну а класс пользователя уже знает, что если запрашиваются данные текущего пользака, то взять их нужно из сессии, иначе лезем в базу по ID. Где здесь может возникнуть путаница - хз.
ЗЫ. Высоконагруженных проектов не пишу. Проблем еще не ловил.
----- Чем больше узнаю, тем больше я не знаю.
Hapson
Отправлено: 18 Августа, 2013 - 17:11:44
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Понятно. Ну получается передавать инфу о пользователе в сессии - наиболее оптимальный вариант.
А вот как быть, если нужно просто передать какие-то данные между скриптами. Данные не относятся к конкретному пользователю. Например это ошибки, которые возникли в процессе авторизации. Скрипт авторизации пишет их в сессию, а форма регистрации их выводит. Так вот, если у пользователя выключены куки, то он даже не получит этих ошибок, не говоря уже об авторизации.
Ну то, что он не сможет авторизоваться - это его проблемы. Но вот скрипты должны отработать как положено, независимо от кук пользователя. Как быть в такой ситуации?
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик? (Добавление)
Или сделать класс-обработчик ошибок в свойства которого и писать массив ошибок? Они и удаляться тогда будут сами (Добавление)
Нет, все равно же между записью ошибок и выводом есть перезагрузка...
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
DelphinPRO
Отправлено: 18 Августа, 2013 - 17:31:48
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Hapson пишет:
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик?
да что вы прикопались к файлам?
пишите в сесию, и не парьтесь. И еще почитайте, как они работают. повнимательнее. я выше писал про PHPSESSID
----- Чем больше узнаю, тем больше я не знаю.
Hapson
Отправлено: 18 Августа, 2013 - 17:34:25
Посетитель
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
DelphinPRO пишет:
Hapson пишет:
Записывать такие данные в .ini файл, например в папку temp, а после их чтения сразу удалять файлик?
да что вы прикопались к файлам?
пишите в сесию, и не парьтесь. И еще почитайте, как они работают. повнимательнее. я выше писал про PHPSESSID
передавать PHPSESSID в адр.строке? А у поисковиков есть куки?
Кстати у меня почему-то не получается передать идентификатор в строке
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
DelphinPRO
Отправлено: 18 Августа, 2013 - 17:35:41
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
Значит там где мне нужно гарантированно использовать сессионные данные, я просто должен дописывать SID ?
PS а в формах появляется скрытое поле если
php_flag session.use_trans_sid 1
php_flag session.use_only_cookies off
раньше не обращал внимания
Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013 Откуда: Ставропольский край
Помог: 10 раз(а)
[+]
caballero пишет:
Цитата:
Геморой...
ну и зачем он вам?
никто куки не отключает
99.9% юзеров даже не знают что это
Ну да в принципе. Нужно наверно просто выводить сообщение о том что надо включить куки - хоть какая-то информативность.
PS
Я тоже когда-то давно не знал, что такое куки. Где-то прочитал, что куки - зло, и полез выключать. Выключил и понял, что что-то я не то сделал - полез и включил обратно))) (Добавление)
PS caballero
Вы правы. Судя по яндекс метрике моего сайта, с февраля этого года, куки включены у 99,33% пользователей. Из 73 546 визитов - 494 без кук
----- ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
caballero
Отправлено: 18 Августа, 2013 - 20:00:28
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.