Вход

Просмотр полной версии : Обновление токена


DivMan
05.07.2017, 22:50
Кто сталкивался, с подобной ситуацией?

На сайте сделал автоматический вход, если был закрыт браузер.

Проблема в том, что, при входе, токен перезаписывается в мозиле и в опере, а в хроме, не перезаписывается, почему так?


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']);
}


}

laimas
06.07.2017, 01:55
"SELECT DISTINCT `id`, `login`, `password`, `avatar` FROM users WHERE token = :tok" - то есть у одного и того же пользователя может быть множество id, login и password?

DivMan
06.07.2017, 22:17
DISTINCT это же означает, выбрать только одного пользователя

DivMan
06.07.2017, 22:22
Почему, вы пишите, что у одного и того же пользователя может быть множество id, login и password?

Вообще этого не понимаю

DivMan
06.07.2017, 22:26
Я понял, ваше предложение, но если убрать DISTINCT, то ситуация же не изменится?

laimas
07.07.2017, 02:33
DISTINCT это же означает, выбрать только одного пользователя

А зачем это писать, если каждый пользователь уникален. Должен быть уникальным!

Почему, вы пишите, что у одного и того же пользователя может быть множество id, login и password?

Потому что DISTINCT и fetchAll() предполагает множество, чего ну никак не должно быть!

Ваш запрос должен запрашивать пользователя по токену, и если запрос вернул одну запись, значит пользователь есть, а нет, значит нет такого. Если у вас по токену возвращается туева туча пользователей, значит у вас не токены, а лажа. Токен это также обязательно уникальность, и токен привязывается к уникальности пользователя, а не как сбоку случайная припарка.

DivMan
07.07.2017, 10:30
Проблема в том, что токен не обновляется только в хроме, в остальных браузерах, всё нормально.

laimas
07.07.2017, 11:16
Проблема в том, что токен не обновляется только в хроме
У вас ничего и не обновляется в браузере, обновление в базе, а проблему нужно искать на клиенте, которая связана с куками.

Что касается кода представленного, то это полнейшая муть. :)

DivMan
07.07.2017, 11:53
Почему муть?

laimas
07.07.2017, 12:14
Почему муть?

Потому что DISTINCT и fetchAll(). Должно быть

if($userArray = $queryUser->fetch(PDO::FETCH_ASSOC)) {
.... есть изер
} иначе нет

и никаких DISTINCT, в противном случае у вас близнецы в базе.

$queryUser->setFetchMode(PDO::FETCH_ASSOC) - это не обязательно. Установите сразу в настройках подключения предпочтительный режим
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
если им пользуетесь, и более нигде упоминать не придется, а если индивидуально для разбора какого либо запроса потребуется иной, то его можно указать и в fetch().