Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Обновление токена (https://javascript.ru/forum/server/69605-obnovlenie-tokena.html)

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

Цитата:

Сообщение от laimas
DISTINCT это же означает, выбрать только одного пользователя

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

Цитата:

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

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

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

DivMan 07.07.2017 10:30

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

laimas 07.07.2017 11:16

Цитата:

Сообщение от DivMan
Проблема в том, что токен не обновляется только в хроме

У вас ничего и не обновляется в браузере, обновление в базе, а проблему нужно искать на клиенте, которая связана с куками.

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

DivMan 07.07.2017 11:53

Почему муть?

laimas 07.07.2017 12:14

Цитата:

Сообщение от DivMan (Сообщение 457914)
Почему муть?

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

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

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

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


Часовой пояс GMT +3, время: 14:27.