Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Сохранение сессионных переменных в базе данных MySQL
При разработке Ростовского магазина компьютерной техники, я столкнулся с необходимостью сделать возможность сохранять настройки пользователей. Причём я хотел сделать возможность сохранять настройки как авторизованных пользователей, так и тех, кто зашел на сайт и не зарегистрировался.
Для этого я поступил следующим образом: я сохраняю настройки отображения списка товаров в переменные сессии, и если пользователь авторизован, то и в соответствующее поле базы данных этого пользователя. При следующей регистрации я восстанавливаю перименные из куки или из базы при указании логина и пароля.
Т.к. в массиве сессионных переменных может быть много временных переменных, не имеющих отношения к настроке, то я добавил проверку и переброску во временный массив всех переменных, начинающихся с 'us_'.
Этот код отвечает за сохранение переменных текущей сесии в базе данных:
$ar=[];
foreach($_SESSION as $key => $value) if(substr($key,0,3)=='us_')$ar[$key]=$value;
if(isset($_SESSION['u_id'])){// если авторизованный пользователь
sql('UPDATE '.db_prefix.'user SET param="'.addslashes(serialize($ar)).'" WHERE id="'.$_SESSION['u_id'].'"');}
else // если пользователь неавторизован поставлю ему куку с параметрами настроки
@setcookie("param", urlencode(serialize($ar)), time()+60*60*24*30, "/");
Этот код устанавливает переменные сессии после ввода логина/пароля
// ищу пользователя в базе данных и заполняю массив $data
$ar=unserialize($data['param']); // устанавливает настроки в переменные сессии
foreach($ar as $key => $value) if(substr($key,0,3)=='us_')$_SESSION[$key]=$value;
Этот код устанавливает переменные сессии, если есть кука и пользователь неавторизован
if (isset($_COOKIE['param'])){
$ar=unserialize(urldecode($_COOKIE['param'])); // устанавливает настроки в переменные сессии
foreach($ar as $key => $value) if(substr($key,0,3)=='us_')$_SESSION[$key]=$value;
В этом блоке кода есть небольшая уязвимость. Надеюсь, Вы догадаетесь, как её "залатать".
.
Прокомментировать/Отблагодарить