За последние 24 часа нас посетили 18154 программиста и 1651 робот. Сейчас ищут 1583 программиста ...

Скрипт "Список посетителей OnLine"

Тема в разделе "Решения, алгоритмы", создана пользователем Sofia, 3 апр 2009.

  1. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    967
    Симпатии:
    2
    Возможно для кого-то будет полезно:
    [sql]CREATE TABLE session (
    id_session tinytext NOT NULL,
    putdate datetime NOT NULL default '0000-00-00 00:00:00',
    user tinytext NOT NULL
    ) TYPE=MyISAM;[/sql]

    Скрипт регистрации посетителей в таблице session
    PHP:
    1. <?php
    2.   // Начинаем сессию
    3.   // Получаем уникальный id сессии
    4.   $id_session = session_id();
    5.   // Устанавливаем соединение с базой данных
    6.   include "config.php";
    7.   // Проверяем, присутствует ли такой id в базе данных
    8.   $query = "SELECT * FROM session
    9.            WHERE id_session = '$id_session'";
    10.   $ses = mysql_query($query);
    11.   if(!$ses) exit("<p>Ошибка в запросе к таблице сессий</p>");
    12.   // Если сессия с таким номером уже существует,
    13.   // значит пользователь online - обновляем время его
    14.   // последнего посещения
    15.   if(mysql_num_rows($ses)>0)
    16.   {
    17.     $query = "UPDATE session SET putdate = NOW(),
    18.                                 user = '$_SESSION[user]'
    19.              WHERE id_session = '$id_session'";
    20.     mysql_query($query);
    21.   }
    22.   // Иначе, если такого номера нет - посетитель только что
    23.   // вошёл - помещаем в таблицу нового посетителя
    24.   else
    25.   {
    26.     $query = "INSERT INTO session
    27.              VALUES('$id_session', NOW(), '$_SESSION[user]')";
    28.     if(!mysql_query($query))
    29.     {
    30.       echo $query."<br>";
    31.       echo "<p>Ошибка при добавлении пользователя</p>";
    32.       exit();
    33.     }
    34.   }
    35.   // Будем считать, что пользователи, которые отсутствовали
    36.   // в течении 20 минут - покинули ресурс - удаляем их
    37.   // id_session из базы данных
    38.   $query = "DELETE FROM session
    39.            WHERE putdate < NOW() -  INTERVAL '20' MINUTE";
    40.   mysql_query($query);
    41. ?>
    42.  
    Выводим содержимое таблицы session
    PHP:
    1. <?php
    2.   // Устанавливаем соединение с базой данных
    3.   include "config.php";
    4.   // Выводим имена всех посетителей, записи о которых имеются
    5.   // в таблице session
    6.   $query = "SELECT * FROM session";
    7.   $ath = mysql_query($query);
    8.   if(!$ath) exit("<p>Ошибка в запросе к таблице сессий</p>");
    9.   // Если хоть кто-то есть - выводим таблицу
    10.   if(mysql_num_rows($ath)>0)
    11.   {
    12.     echo "<table>";
    13.     while($author = mysql_fetch_array($ath))
    14.     {
    15.       // Если посетитель не зарегистрирован
    16.       // выводим вместо его имени - "аноним"
    17.       if(empty($author['user'])) echo "<tr><td>аноним</td></tr>";
    18.       else echo "<tr><td>".$author['user']."</td></tr>";
    19.     }
    20.     echo "</table>";
    21.   }
    22. ?>
    23.  
    Конфигурационный файл config.php
    PHP:
    1. <?php
    2.   // сейчас выставлен сервер локальной машины
    3.   $dblocation = "localhost";
    4.   // Имя базы данных, на хостинге или локальной машине
    5.   $dbname = "dbase";
    6.   // Имя пользователя базы данных
    7.   $dbuser = "root";
    8.   // и его пароль
    9.   $dbpasswd = "";
    10.  
    11.   // Устанавливаем соединение с базой данных
    12.   $dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    13.   if (!$dbcnx) {
    14.    exit( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
    15.   }
    16.   // Выбираем базу данных
    17.   if (! @mysql_select_db($dbname,$dbcnx) ) {
    18.     exit( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
    19.   }
    20.  
    21.   // Определяем версию сервера
    22.   $query = "SELECT VERSION()";
    23.   $ver = mysql_query($query);
    24.   if(!$ver) exit("Ошибка при определении версии MySQL-сервера");
    25.   $version = mysql_result($ver, 0);
    26.   list($major, $minor) = explode(".", $version);
    27.   // Если версия выше 4.1 сообщаем серверу, что будем работать с
    28.   // кодировкой cp1251
    29.   $ver = $major.".".$minor;
    30.   if((float)$ver >= 4.1)
    31.   {
    32.     mysql_query("SET NAMES 'cp1251'");
    33.   }
    34. ?>
    35.  
    Так-же есть таблица users :
    [sql]CREATE TABLE `users` (
    `id` int(11) NOT NULL auto_increment,
    `email` varchar(255) NOT NULL,
    `pwd` varchar(255) NOT NULL,
    `auth` enum('yes','no') NOT NULL default 'no',
    `f` varchar(255) NOT NULL,
    `i` varchar(255) NOT NULL,
    `o` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;[/sql]

    вот у меня проблема, не могу сделать простейшую регистрацию и авторизацию с использованием md5, подскажите пожалуйста
     
  2. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Ээ, скрипт не смотрел. Можно отказаться от if(SELECT) UPDATE else INSERT в пользу INSERT ON DUPLICATE KEY UPDATE

    + я предпочитаю хранить время в unix timestamp (правильно ли это - я не знаю, что думают камрады?)
    + не интересно без ООП 8)
     
  3. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    а что в $_SESSION[user] хранится?
    и сколько там запросов получается? :)
     
  4. kas1e

    kas1e Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    Много кода. Конструкции $_SESSION[user], пусть даже без конкатикации работают на 300% медленнее $_SESSION['user'].

    У меня реализация данной функции на сделанной до этого системе авторизации заняла пара строк коду.

    Без авторизации вообще запросов в базу данных не было. Только работа с сессиями и подсчет их в сессионной директории.

    *задумался*
     
  5. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Аналогично.
     
  6. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    При регистрации пользователя получаем md5 от пароля, заносим в БД.
    При авторизации получаем md5 от введенного в форму пароля и сравниваем с хешем, хранящимся в БД.
     
  7. kas1e

    kas1e Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    юниксовый штамп времени универсален, и из него можно без особых усилий что угодно скрутить функцией date, зато с ним же можно производить массу преобразований легких("DELETE * WHERE date < ".(time() - 300) - удаляем все старше 5 минут и тд)

    короче мой выбор )
     
  8. поржал, спасибо
     
  9. kas1e

    kas1e Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    чем же он вам не универсален?
     
  10. нука, представь мне 31 декабря 1969 года в нем?
     
  11. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    ))))))

    http://ru.wikipedia.org/wiki/UNIX-%D0%B ... 0%BC%D1%8F

     
  12. [sql]DELETE FROM `table` WHERE NOW() - INTERVAL 5 MINUTE > `date`[/sql]
     
  13. kas1e

    kas1e Активный пользователь

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    я привык все хранить в секундах, так как время измеряю секундами -> минутами -> часами :)

    и для прошлых веков сайтов не делаю, если что-то такое предстоит - то тогда и извращусь =)

    для запоминания времени постов, заходов, комментов и прочего-прочего мне хватает unix штампа.
     
  14. оу. т.е. даты рождения ты не хранишь нигде? нуну. Повидали мы таких чудосайтоделов. Все оптимизации в голове от безделья.
     
  15. kostyl

    kostyl Guest

    Sofia
    мы вроде бы обсуждали уже эту тему...
    кстате я б хранил время сессии именно в юникс. а вот даты рождения в дате....
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Не нужно путать метку времени и дату. Не даром метка именуется "штамп". Дата -- это день рождения, а метка времени -- это когда ты купил хлеб и когда его съел.
     
  17. kostyl

    kostyl Guest

    Kreker
    а может ктото знает точные секунды рождения :)
     
  18. однохерственно! однохерственно они внутрях хранятся как целые числа!
    Но для работы с датой-временем есть удобные функции и оптимизация поиска по ним, и выборок разных.
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Вот поэтому и нужно различать.
     
  20. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    если это пара строк, может кто покажет их?
    что за сессионная директория?
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не сложно написать функцию, которая бы понимала временную отметку в секундах хоть от рождества христова и возвращала дату в заданом формате. Только секунды надо будет хранить в float.
     
  22. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [vs]
    от тебя не ожидал. что мешает хранить два инта?
     
  23. kukich

    kukich Активный пользователь

    С нами с:
    4 июн 2010
    Сообщения:
    1
    Симпатии:
    0
    Решил использовать этот скрипт ,но работает он весьма посредственно:
    Во первых непонятно где определяется авторизирован человек или нет ,ведь БД users нигде не используется.Кроме того скрипт генерирует ошибку :
    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at Z:\home\test1.ru\www\autorization.php:19) in Z:\home\test1.ru\www\insert_session.php on line 5.

    Я разместил скрипт у себя на денвере ,если сайт несколько раз перезагрузить ,то выписывается несколько АНОНИМОВ.Буду признателен если кто поможет разобраться,я новичок в этом деле.
     
  24. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    тут должен быть ник пользователя из таблицы users. Ты его долже положить туда в скрипте авторизации.