05.07.2017, 22:50
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Обновление токена
Кто сталкивался, с подобной ситуацией?
На сайте сделал автоматический вход, если был закрыт браузер.
Проблема в том, что, при входе, токен перезаписывается в мозиле и в опере, а в хроме, не перезаписывается, почему так?
function authCookie() {
$sql = "SELECT DISTINCT `id`, `login`, `password`, `avatar` FROM users WHERE token = :tok";
$queryUser = $this->db->prepare($sql);
$queryUser ->bindValue(':tok', trim($_COOKIE['user']), PDO::PARAM_STR);
$queryUser->execute();
$queryUser->setFetchMode(PDO::FETCH_ASSOC);
$userArray = $queryUser->fetchAll();
if(!empty($userArray[0]['login'])) {
$userLogin = $userArray[0]['login'];
$userId = $userArray[0]['id'];
$userAvatar = $userArray[0]['avatar'];
$salt = 'szdfsdfgg';
$tokenstr = strval(date('s')) . $salt;
$token = md5($tokenstr);
$sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2";
$queryToket = $this->db->prepare($sql);
$queryToket->bindValue(':log2', trim($userLogin), PDO::PARAM_STR);
$queryToket->execute();
$_SESSION['token'] = $token;
$_SESSION['user'] = $userLogin;
$_SESSION['id'] = $userId;
$_SESSION['avatar'] = $userAvatar;
output_add_rewrite_var('token', $token);
header('Location: ./index.php?token='.$_SESSION['token']);
}
}
|
|
06.07.2017, 01:55
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
"SELECT DISTINCT `id`, `login`, `password`, `avatar` FROM users WHERE token = :tok" - то есть у одного и того же пользователя может быть множество id, login и password?
|
|
06.07.2017, 22:17
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
DISTINCT это же означает, выбрать только одного пользователя
|
|
06.07.2017, 22:22
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Почему, вы пишите, что у одного и того же пользователя может быть множество id, login и password?
Вообще этого не понимаю
|
|
06.07.2017, 22:26
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Я понял, ваше предложение, но если убрать DISTINCT, то ситуация же не изменится?
|
|
07.07.2017, 02:33
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от laimas
|
DISTINCT это же означает, выбрать только одного пользователя
|
А зачем это писать, если каждый пользователь уникален. Должен быть уникальным!
Сообщение от DivMan
|
Почему, вы пишите, что у одного и того же пользователя может быть множество id, login и password?
|
Потому что DISTINCT и fetchAll() предполагает множество, чего ну никак не должно быть!
Ваш запрос должен запрашивать пользователя по токену, и если запрос вернул одну запись, значит пользователь есть, а нет, значит нет такого. Если у вас по токену возвращается туева туча пользователей, значит у вас не токены, а лажа. Токен это также обязательно уникальность, и токен привязывается к уникальности пользователя, а не как сбоку случайная припарка.
|
|
07.07.2017, 10:30
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Проблема в том, что токен не обновляется только в хроме, в остальных браузерах, всё нормально.
|
|
07.07.2017, 11:16
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от DivMan
|
Проблема в том, что токен не обновляется только в хроме
|
У вас ничего и не обновляется в браузере, обновление в базе, а проблему нужно искать на клиенте, которая связана с куками.
Что касается кода представленного, то это полнейшая муть.
|
|
07.07.2017, 11:53
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Почему муть?
|
|
07.07.2017, 12:14
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от DivMan
|
Почему муть?
|
Потому что DISTINCT и fetchAll(). Должно быть
if($userArray = $queryUser->fetch(PDO::FETCH_ASSOC)) {
.... есть изер
} иначе нет
и никаких DISTINCT, в противном случае у вас близнецы в базе.
$queryUser->setFetchMode(PDO::FETCH_ASSOC) - это не обязательно. Установите сразу в настройках подключения предпочтительный режим
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
если им пользуетесь, и более нигде упоминать не придется, а если индивидуально для разбора какого либо запроса потребуется иной, то его можно указать и в fetch().
|
|
|
|