Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Небольшой скрипт, который выводит, дату последнего посещения сайта пользователем (https://javascript.ru/forum/server/71292-nebolshojj-skript-kotoryjj-vyvodit-datu-poslednego-poseshheniya-sajjta-polzovatelem.html)

DivMan 07.11.2017 21:50

Небольшой скрипт, который выводит, дату последнего посещения сайта пользователем
 
Нормальный ли у меня алгоритм получился?

<?php
/*
    В первую куку записывается первый визит и она означает последний визит, при повторном входе, проверяется,
    есть ли сессия юзера, если есть то создать вторую куку с визитом и сравнить их и удалить первую куку
    и так каждый раз
*/
    session_start();
   
    $_SESSION['user'] = 'Dima';
   
    $lastVisit = date('d-m-Y');
   
    if(!empty($_SESSION['user'])) {
        if(!isset($_COOKIE['lastVisit'])) {
            setcookie('lastVisit', $lastVisit, time() + 3600*24*30);
        }
        else {
            setcookie('lastVisit2', $lastVisit, time() + 3600*24*30);
           
            $lastArr = explode('-', $_COOKIE['lastVisit']);
            $newArr = explode('-', $lastVisit);
           
            echo 'Последний визит был ' . (mktime(0, 0, 0, $newArr[1], $newArr[0], $newArr[2]) - mktime(0, 0, 0, $lastArr[1], $lastArr[0], $lastArr[2])) / 86400 . ' дней назад.';
           
            setcookie('lastVisit', '', time());
        }
    }
?>

DivMan 07.11.2017 21:51

Не просто выводит дату, а пишет, сколько дней отсутствовал

laimas 07.11.2017 23:12

Цитата:

Сообщение от DivMan
Нормальный ли у меня алгоритм получился?

Нет. Браузер записывает куки на диск когда пользователь покидает страницу, до этого момента они содержатся в памяти. Вот почему кука установленная клиентом доступна ему сразу, а для сервера только после следующего посещения страницы. Вы же устанавливаете куку сервером и сразу пытаетесь ее использовать. Здесь же, в условии, повторная установка куки вообще непонятный маневр.

Последнее посещение 8 ноября и текущее 9 ноября, совсем еще не означает, что прошли сутки, это могут быть и секунды. Оперировать надо датой/временем.

Ну и пора бы ознакомиться с разделом дата/время руководства не только с функциями, но и с классом DateTime, в частности http://fi2.php.net/manual/ru/datetime.diff.php.

Получать дату шиворот навыворот, затем ее компоненты переворачивая, это моветон.

DivMan 08.11.2017 00:14

date_diff?

DivMan 08.11.2017 00:23

Почему повторная установка куки вообще непонятный маневр?
А как по другому сохранять последний визит?

laimas 08.11.2017 00:23

Это псевдоним функции класса DateTime. Глубже в раздел окунитесь, полезно.

laimas 08.11.2017 00:27

Цитата:

Сообщение от DivMan
Почему повторная установка куки вообще непонятный маневр?

Если кука не установлена, то считать ничего не надо, просто установка. Если установлена, то считать разницу между текущим временем и сохраненным, обновить эту же установленную куку текущим временем. А у вас:

setcookie(...)
сразу же
$_COOKIE['lastVisit'] - что уже лажа
и затем
setcookie(...)

Vlasenko Fedor 09.11.2017 00:32

Цитата:

Сообщение от laimas
Браузер записывает куки на диск когда пользователь покидает страницу

нет сразу. При этом js доступны куки сразу
запустите с сервера
<?php
setcookie('myCookie', 'test');
?>
<script>
    console.log( document.cookie );
</script>

laimas 09.11.2017 01:24

Цитата:

Сообщение от Poznakomlus
нет сразу.

С каких пор такое стало?

Цитата:

Сообщение от Poznakomlus
При этом js доступны куки сразу
запустите с сервера


Доступны потому, что в памяти, серверу нет.

Vlasenko Fedor 09.11.2017 01:37

куки приходят в заголовках
когда браузер получает страницу он записывает куки сразу
убейте процесс браузера, данные будут записаны


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