Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: kharkovforum.com@gmail.com

Таблица сессий php

Статус: Офлайн
Реєстрація: 04.07.2008
Повідом.: 677
Таблица сессий php

Как будет лучше сделать таблицу сессий?
Чтобы каждое обращение к странице создавало новую строку с тем же сидом. Чтобы потом можно было вести статистику сколько раз пользователь заходил?С какого ип?И на какой странице последний раз был.
Или второй вариант, это просто апдейтить уже одну строку в таблице сессий, и записывать например последний айпишник юзера и браузер.
Или просто ничего не делать?
Но мне почему то хочется 1 вариант.
Но тогда же будет большая база?Например на сайте 200 страниц, и пользователь за день зайдет на все страницы грубо говоря))Это будет 200 записей в базе только с одного пользователя:(
Вообщем как лучше поступить?
 
гугл аналитикс? не, не слышал
 
Вообщем как лучше поступить?
stepqa.jpg
 
Может просто для каждого ип одна запись, а в ней счетчик, номер последней страницы и т.д.....
 
Вот у меня получается такие вот поля в таблице сессий:
1 sid
2 user_id
3 expire
4 id
5 ip
6 ref
7 modified
8 browser
Вот вопрос, при каждом шаге юзверя добавлять в таблицу сессий поле,
или просто апдейтить существующее уже?
 
Пиши в файл... только не забывай ротейтить его
это по сути access log апача, только чуть модифицированный...
 
делай апдейт.
если нужно статистика посещений страниц, то для них сделай отдельно счетчики
 
А почему каждый раз поле вставлять плохо?
Так получается что при каждом заходе на страницу я создаю новую куку (Удаляю старую) и добавляю новую запись\редактирование в таблицу сессий.
 
Вот так

PHP:
<?php
/**
 * @author LOGAN
 * @copyright 2012
 */
require_once ($_SERVER["DOCUMENT_ROOT"] . "/connect.php");
class Session
{
    private $sessiong_sid; //ид сессии
    private $ip_address; // ип юзера
    private $user_agent; // браузер агента
    private $last_activity; //последний заход юзера
    private $user_ref; // откуда пришел
    private $user_expire; //истечении сессии
    private $cookieName; //Название кукиса
    private $date_now; //time and date now!

    function __construct()
    {
        mysql_query("set character_set_client='utf8'");
        mysql_query("set character_set_results='utf8'");
        mysql_query("set collation_connection='utf8_general_ci'");
        mysql_query("SET NAMES utf8");
        mysql_set_charset('utf8');
        //constructor
        $this->date_now = date("Y-m-d H:i:s"); //time and date
        $this->cookieName = "hash"; //Название куки пользователя
        $this->sessiong_sid = $_COOKIE[$this->cookieName]; //cookie's name'
        $this->ip_address = $_SERVER["REMOTE_ADDR"]; //user's ip'
        $this->last_activity = $this->date_now; //last activity
        $this->user_agent = $_SERVER["HTTP_USER_AGENT"]; //web-browser
        if (isset($_SERVER["HTTP_REFERER"]))
            $this->user_ref = $_SERVER["HTTP_REFERER"]; //referer or empty, just address
        else
            $this->user_ref = "https://$_SERVER[SERVER_NAME]/";
        session_start();
    }


    public function get_cookie()
    {
        //Если работа идет на сесиях
        if(isset($_SESSION['auth']) && isset($_SESSION['id']) && !empty($_SESSION['id'])&& !empty($_SESSION['auth']) )
        {
            if(is_numeric($_SESSION['id'])){
            $user_id_session=$_SESSION['id'];
              $user_exist_session = mysql_query("select id from `users` where id='$user_id_session' limit 1 ");
               if (mysql_num_rows($user_exist_session) > 0) {
                        mysql_query("update `users` set last_login='$this->date_now' where id='$user_id_session'");
                        require_once ($_SERVER["DOCUMENT_ROOT"] . "/functions/functions.php");
                        visit_counter($user_id_session); //add 1 to our user's counter 
                    } //else Юзер с указанным СИД не найден $_SESSION['auth']=false; Удалить куку
              }
              
        }//Если работаем через куку
        else if (!empty($this->sessiong_sid) and ctype_alnum($this->sessiong_sid)) {
            //Если кука есть тогда выбираем ид пользователя
            //Проверим есть ли юзверь с таким сидом и не просрочена ли сессия у нас относительно времени
            $user_id = "select * from `session` where sid='$this->sessiong_sid' and expire>'$this->date_now' limit 1";
            $result_query_id = mysql_query($user_id);
            if (mysql_num_rows($result_query_id) > 0) {
                while ($data = mysql_fetch_array($result_query_id)) {
                    $_SESSION['id'] = ""; //Обнуляем нашу переменную на всякий пожарный :)
                    $_SESSION['auth'] = false; //Обнуляем нашу переменную на всякий пожарный :)
                    //Проверим а есть ли такой юзер в табличке юзеров
                    $user_exist = mysql_query("select id from `users` where id='$data[user_id]' limit 1 ");
                    if (mysql_num_rows($user_exist) > 0) {
                        mysql_query("update `users` set last_login='$this->date_now' where id='$data[user_id]'");
                        require_once ($_SERVER["DOCUMENT_ROOT"] . "/functions/functions.php");
                        visit_counter($data["user_id"]); //add 1 to our user's counter
                        $_SESSION['id'] = $data['user_id']; //Записываем в сессию ид пользователя)))
                        //restart our cookie
                        //  setcookie('$this->cookieName', '', time() - 360000, "/", $_SERVER['HTTP_HOST']); //Удаление старой
                        $this->erase($this->cookieName); //Удаление старой
                        //set the new cookie with old User_id
                        setAutologin($data["user_id"], "$_SERVER[REMOTE_ADDR]", "$this->user_ref"); //Добавление в таблицу сессий
                        $_SESSION['auth'] = true; // it's all ok :)
                    } //else Юзер с указанным СИД не найден $_SESSION['auth']=false; Удалить куку
                    else {
                        $_SESSION["err_auth"] =
                            "Пользователь не найден, пожалуйста авторизуйтесь заново.";
                        //$_SESSION['auth'] = false;
                        //$_SESSION['id'] = "";
                        //$this->erase($this->cookieName);
                        Header("Location: https://$_SERVER[SERVER_NAME]/log/unregister.php");
                    }
                }


            } else {
                $_SESSION["err_auth"] =
                    "Сессия устарела или удалена, пожалуйста авторизуйтесь заново.";
              //  $_SESSION['auth'] = false;
              //  $_SESSION['id'] = "";
               // $this->erase($this->cookieName);
                Header("Location: https://$_SERVER[SERVER_NAME]/log/unregister.php");
            }
        } else {
            //ЭТО ГОСТЬ!!!!!!!!!!!!!!
           // $_SESSION["err_auth"] = "";
          //  $_SESSION['auth'] = false;
           // $_SESSION['id'] = "";
            //$this->erase($this->cookieName);

        }
        
    }
    public function error_view($view) //DebuGGer)))$this-> error_view(true);

    {
        if ($view == true) {
            ini_set('display_errors', 1);
            error_reporting(E_ALL);
            echo ('[' . mysql_errno() . '] [' . mysql_error() . ']');
            /* echo "<br /> ID: " . $_SESSION['id'] . " Auth: " . $_SESSION['auth'] .
            " Session: " . $this->sessiong_sid . "<br />";*/
        }
    }
    public function erase($key)
    {
        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
            // удаление куки в IE
            setcookie($key, "", time() + 20000);
            unset($key); //Удаление старой}
        } else {
            // удаление куки в других браузерах
            setcookie($key, "", time() - 20000, "/");
            unset($key); //Удаление старой}
        }

    }


}/*
$s = new Session();
$s->get_cookie();*/

?>
 
Останнє редагування:
Ну это не класс, а просто)))Можно обычную функцию сделать.
Не в этом дело.Что тут неправильно?
 
тс а зачем тебе записывать сколько юзер перелистал страниц (твой первый вариант). Если необходимо вести подобную статистику так добавь в таблицу поле "Время проведенное на сайте" и "Количество входов", затем редактируй эти ячейки.
 
1. установить GA, передавать ему user_id. потом импортить данные с гугла в свою базу.
2. не знаю возможно такое в пхп. повесить листенер который по окончании сессии скидывает накопленные данные(ip, браузер, просмотренные страницы) в базу.

собственно непонятно в чем проблема у ТСа?
 
А правильный ли код размещенный свыше?
То есть сама логика?
Например я думал так:
Заходя на страницу смотрим куку, если есть кука, тогда вытягиваем Айдишник в массив сессий, и ставим $_SESSION['auth']=true и запоминаем айдишник в сессиях;
Если юзер зарегистрировался без куки (Не поставил галочку на Запомнить) тогда вынимаем айдишник из сессии, и $_SESSION['auth']=true
Если нет ни куки ни $_session['id'], тогда посылаем юзеря на регистрацию или даем права типо Гость.
Правильно?
А зачем добавлять каждый раз новое поле в таблицу сессий, Я хотел чтобы была полная статистика на сервере об пользователе.Хотя сейчас просто поменяю на Апдейт поля в таблице сессии.
Хотел еще вопрос задать, а что делать например если куку своруют, и подставят на своем компе, соответственно сайт выберет все по куке :(
Привязку по ип делать глупо - так как ип почти у всех динамические, по браузеру разве что?Какие есть еще варианты?
Заранее всем спасибо.
 
Заходя на страницу смотрим куку, если есть кука, тогда вытягиваем Айдишник в массив сессий, и ставим $_SESSION['auth']=true и запоминаем айдишник в сессиях;

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
еще раз повторюсь пиши в файл ну или в какаю нить nosql базу
почему? представим себе ситуацую, что твой сайт стал пользоваться сильно большой популярность... пришло одновременно 1000 активных пользователей... mysql отвалится и сайт ляжет. Только файл обязательн ротировать надо
а статистику по пользователю тебе grep по файлу выдаст
 
еще раз повторюсь пиши в файл ну или в какаю нить nosql базу
почему? представим себе ситуацую, что твой сайт стал пользоваться сильно большой популярность... пришло одновременно 1000 активных пользователей... mysql отвалится и сайт ляжет. Только файл обязательн ротировать надо
а статистику по пользователю тебе grep по файлу выдаст

а встроенный механизм хранения сессий в файлах чем плох?
 
Назад
Зверху Знизу