Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оцените плз код "Сколько человек на сайте" 
:(
    Опции темы
mr.Anderson
Дата 9.11.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Только начал учить MySQL, решил нарисовать скриптик, который выводит циферку, сколько человек в данный момент на сайте (по IP-адресам). Прошу оценить код...
Код

<?php

//++++++++++++++++++++++++++++++++++++++++++++++//
//++++++++++ Copyright (c) Sim7 ++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++//

DEFINE( "ACTIVE_TIME", 120 ); //время в секундах, в течение которого
                               //юзер считается активным

$dbname = "howmuch"; //имя базы данных
$table = "users"; //название таблицы

mysql_connect( "localhost", "root" );

mysql_query( "Create Database IF NOT EXISTS $dbname" )
  or Die( mysql_error() ); //создаем БД, если ее еще не существует
mysql_select_db( $dbname ); //и подключаемся к ней

//создаем таблицу с тремя полями:
// 1) IP юзера
// 2) Время последнего запуска им страницы
// 3) Активен/неактивен ( 1 или 0 соответственно )
$res = mysql_query( "Create Table IF NOT EXISTS $table( `ip` TEXT NOT NULL,
                                                         `time` TEXT NOT NULL;" );

$currentIP = getenv( 'REMOTE_ADDR' ); //получаем IP посетителя

//для начала ищем его в таблице
$res = mysql_query( "Select * From $table Where `ip`='$currentIP';" );
if( $res != '' )
{
  //получаем ассоциативный массив в соответствии с запросом
  $array = mysql_fetch_assoc( $res );
  //прибавляем к уже имеющемуся времени захода на страницу время, заданное константой ACTIVE_TIME
  $newTime = $array[ 'time' ] + ACTIVE_TIME;
   unset( $array ); //удаляем ненужную переменную

  //обновляем значение времени захода в поле time в записи, где IP равен текущему
  mysql_query( "Update $table Set `time`=$newTime Where `ip`='$currentIP';" );
}
else //если такого IP в таблице нет, добавляем его
  mysql_query( "Insert Into $table( `ip`, `time` ) Values( '$currentIP', ".( time() + ACTIVE_TIME )." );" );

//дальше удаляем из таблицы все записи, время посещения в которых меньше текущего
mysql_query( "Delete From $table Where `time`<".time().";" );

//а теперь надо в качестве итога создать переменную, содержащую количество активных юзеров
$res = mysql_query( "Select `ip` From $table;" );
$result_array = mysql_fetch_row( $res );


$HowMuchInSite = count( $result_array );
echo $HowMuchInSite;

mysql_close();

?>

Код подробно документирован.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 9.11.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 2
Всего: 360



Середину кода можно выполнить примерно так, если у тебя база mySQL.
Код

mysql_query( "Insert Into $table( `ip`, `time` ) Values( '$currentIP', ".( time() + ACTIVE_TIME )." )  ON DUPLICATE KEY UPDATE `time`=time+".ACTIVE_TIME .";" );


Вместо этого куска:
Код

//для начала ищем его в таблице
$res = mysql_query( "Select * From $table Where `ip`='$currentIP';" );
if( $res != '' )
{
  //получаем ассоциативный массив в соответствии с запросом
  $array = mysql_fetch_assoc( $res );
  //прибавляем к уже имеющемуся времени захода на страницу время, заданное константой ACTIVE_TIME
  $newTime = $array[ 'time' ] + ACTIVE_TIME;
   unset( $array ); //удаляем ненужную переменную
  //обновляем значение времени захода в поле time в записи, где IP равен текущему
  mysql_query( "Update $table Set `time`=$newTime Where `ip`='$currentIP';" );
}
else //если такого IP в таблице нет, добавляем его
  mysql_query( "Insert Into $table( `ip`, `time` ) Values( '$currentIP', ".( time() + ACTIVE_TIME )." );" );




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 9.11.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Объясните плз почему. smile

Добавлено @ 18:01 
В смысле как это работает.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Aliance
Дата 9.11.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



29 строчка замени на:
Код

$sql = "SELECT * FROM " . $table . " WHERE `ip`= '" . mysql_real_escape_string($currentIP) . "' LIMIT 1";
$res = mysql_query( $sql );


30 строчку наверное лучше написать так:
Код

if(!empty($res))

PM MAIL WWW ICQ Skype   Вверх
sergejzr
Дата 9.11.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 2
Всего: 360



Только надо ключ на IP посадить уникальный.


Цитата(sim7 @  9.11.2006,  17:00 Найти цитируемый пост)
Объясните плз почему. smile

Добавлено @ 17:01 
В смысле как это работает. 


Это замена: INSERT IF NOT EXISTS ELSE UPDATE. Чтото вроде триггера.

Добавлено @ 18:07 
Код

$res = mysql_query( "Select `ip` From $table;" );
$result_array = mysql_fetch_row( $res );
$HowMuchInSite = count( $result_array );
echo $HowMuchInSite;


заменяется на:

Код


$result_array = mysql_fetch_row(mysql_query( "Select COUNT(`ip`) as cnt From $table;" ) );

echo $$result_array[0];



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 9.11.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Так. С учетом поправок от Aliance, имеем следующее:
Код

<?php
//++++++++++++++++++++++++++++++++++++++++++++++//
//++++++++++ Copyright (c) Sim7 ++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++//
DEFINE( "ACTIVE_TIME", 120 ); //время в секундах, в течение которого
                               //юзер считается активным
$dbname = "howmuch"; //имя базы данных
$table = "users"; //название таблицы
mysql_connect( "localhost", "root" );
mysql_query( "Create Database IF NOT EXISTS $dbname" )
  or Die( mysql_error() ); //создаем БД, если ее еще не существует
mysql_select_db( $dbname ); //и подключаемся к ней
//создаем таблицу с тремя полями:
// 1) IP юзера
// 2) Время последнего запуска им страницы
// 3) Активен/неактивен ( 1 или 0 соответственно )
$res = mysql_query( "Create Table IF NOT EXISTS $table( `ip` TEXT NOT NULL,
                                                         `time` TEXT NOT NULL;" );
$currentIP = mysql_real_escape_string( getenv( 'REMOTE_ADDR' ) ); //получаем IP посетителя
//для начала ищем его в таблице
$res = mysql_query( "Select * From $table Where `ip`='$currentIP';" );
if( ! empty( $res ) )
{
  //получаем ассоциативный массив в соответствии с запросом
  $array = mysql_fetch_assoc( $res );
  //прибавляем к уже имеющемуся времени захода на страницу время, заданное константой ACTIVE_TIME
  $newTime = $array[ 'time' ] + ACTIVE_TIME;
   unset( $array ); //удаляем ненужную переменную
  //обновляем значение времени захода в поле time в записи, где IP равен текущему
  mysql_query( "Update $table Set `time`=$newTime Where `ip`='$currentIP';" );
}
else //если такого IP в таблице нет, добавляем его
  mysql_query( "Insert Into $table( `ip`, `time` ) Values( '$currentIP', ".( time() + ACTIVE_TIME )." );" );
//дальше удаляем из таблицы все записи, время посещения в которых меньше текущего
mysql_query( "Delete From $table Where `time`<".time().";" );
//а теперь надо в качестве итога создать переменную, содержащую количество активных юзеров
$res = mysql_query( "Select `ip` From $table;" );
$result_array = mysql_fetch_row( $res );
$HowMuchInSite = count( $result_array );
echo $HowMuchInSite;
mysql_close();
?>



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 9.11.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 2
Всего: 360



Создать таблицу так:
Код

$res = mysql_query( "CREATE TABLE IF NOT EXISTS $table  (
  `ip` varchar(32) collate latin1_german2_ci NOT NULL,
  `time` text,
  PRIMARY KEY  (`ip`)
);" );



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 9.11.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



sergeizr, тогда код просто неприлично уменьшится. smile Это и правда работает так же, что и мой код?

Тогда так:
Код

<?php
//++++++++++++++++++++++++++++++++++++++++++++++//
//++++++++++ Copyright (c) Sim7 ++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++//
DEFINE( "ACTIVE_TIME", 120 ); //время в секундах, в течение которого
                               //юзер считается активным
$dbname = "howmuch"; //имя базы данных
$table = "users"; //название таблицы
mysql_connect( "localhost", "root" );
mysql_query( "Create Database IF NOT EXISTS $dbname" )
  or Die( mysql_error() ); //создаем БД, если ее еще не существует
mysql_select_db( $dbname ); //и подключаемся к ней
//создаем таблицу с тремя полями:
// 1) IP юзера
// 2) Время последнего запуска им страницы
// 3) Активен/неактивен ( 1 или 0 соответственно )
$res = mysql_query( "Create Table IF NOT EXISTS $table( `ip` TEXT NOT NULL,
                                                         `time` TEXT NOT NULL, PRIMARY KEY( `ip` );" );
$currentIP = mysql_real_escape_string( getenv( 'REMOTE_ADDR' ) ); //получаем IP посетителя
//для начала ищем его в таблице
mysql_query( "Insert Into $table( `ip`, `time` ) Values( '$currentIP', ".( time() + ACTIVE_TIME )." )  ON DUPLICATE KEY UPDATE `time`=time+".ACTIVE_TIME .";" );
//дальше удаляем из таблицы все записи, время посещения в которых меньше текущего
mysql_query( "Delete From $table Where `time`<".time().";" );
//а теперь надо в качестве итога создать переменную, содержащую количество активных юзеров
$result_array = mysql_fetch_row( mysql_query( "Select COUNT(`ip`) AS CNT From $table;" ) );
 echo $result_array[ 0 ];
mysql_close();
?>


И можно вопрос? В строчке
Код

$result_array = mysql_fetch_row(mysql_query( "Select COUNT(`ip`) as cnt From $table;" ) );

Код

as cnt

Это что?

Добавлено @ 18:26 
Стоп! Наисправлял тут, а теперь у меня скрипт выводит, что на сайте 0 человек, хотя там я! Что-то не так!

Это сообщение отредактировал(а) sim7 - 9.11.2006, 18:24


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 9.11.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 2
Всего: 360



Ключа на таблице нет наверное. Ты ведь её ещё раньше создал. 
Где то так должна быть таблица создана.
Код

$res = mysql_query( "CREATE TABLE IF NOT EXISTS $table  (
  `ip` varchar(32)  NOT NULL,
  `time` text,
  PRIMARY KEY  (`ip`)
);" );


Добавлено @ 18:32 
Цитата(sim7 @  9.11.2006,  17:13 Найти цитируемый пост)
Выделить всёкод SQL
1:
    
as cnt

Это что?

Это алиас. Хотя он не используется.. По идее можно делать 

Код

echo $result_array[ 'cnt' ];



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 9.11.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Как нет создания?! Строки с 13-й:
Код

//создаем таблицу с тремя полями:
// 1) IP юзера
// 2) Время последнего запуска им страницы
// 3) Активен/неактивен ( 1 или 0 соответственно )
$res = mysql_query( "Create Table IF NOT EXISTS $table( `ip` TEXT NOT NULL,
                                                         `time` TEXT NOT NULL, PRIMARY KEY( `ip` );" );



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
sergejzr
Дата 9.11.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 2
Всего: 360



Цитата(sim7 @  9.11.2006,  18:50 Найти цитируемый пост)
Как нет создания?! Строки с 13-й:

А ты её до того убил?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
mr.Anderson
Дата 10.11.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



О... нет. Надо попробовать


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Aliance
Дата 11.11.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



А я вообще не понимаю смысла создания таблиц в скрипте (если ты скриптом сам пользуешься, естественно). Я всегда с БД работаю с PHPMyAdmin, а в скрипте только работаю с данными БД, но не с ее структурой.
PM MAIL WWW ICQ Skype   Вверх
Eugene_Bond
Дата 12.11.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 3.9.2006

Репутация: нет
Всего: 4



А зачем так сложно?
Добавление адресов, сохранение даты активности и т.п..

Проще переписать сессионный хендлер чтобы сессии в базе лежали. Добавить избыточное поле IP и потом просто выборкой SELECT COUNT(*) .. GROUP BY ip все получать.
+ бонусы типа имен залогиненых пользователей можно иметь.

и главное сессии сами будут следить за созданием всех нужных записей и за очисткой gc следить будет он же..

http://php.net/session_set_save_handler

Добавлено @ 20:25 
Цитата(sergejzr @  9.11.2006,  18:05 Найти цитируемый пост)
Это замена: INSERT IF NOT EXISTS ELSE UPDATE. Чтото вроде триггера.

см. REPLACE
PM MAIL   Вверх
mr.Anderson
Дата 12.11.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Не понял.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.