Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Кто сейчас на сайте

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проверте пожалуйста
OverNik
Отправлено: 08 Ноября, 2009 - 02:57:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 182
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Решил написать функцию которая будет считывать пользователей которые в данный момент на сайте.
Вот собственно и функция:
PHP:
скопировать код в буфер обмена
  1.  
  2. /*
  3. CREATE TABLE `online` (
  4.   `id` int(9) NOT NULL auto_increment,
  5.   `user` int(9) NOT NULL,
  6.   `time` int(4) default NULL,
  7.   PRIMARY KEY  (`id`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
  9. */
  10.  
  11. function Online()
  12. {
  13.     //Индификатор времени (сейчас)
  14.     $time =  date("Hi");
  15.     //id пользивателя (или его ник)
  16.     $iduser = 1;
  17.     //смотрим есть ли инфа про данный id в базе
  18.     $sql = "SELECT * FROM `online` WHERE `user` = '".$iduser."' LIMIT 1";
  19.     if(mysql_num_rows(mysql_query($sql)) > 0)
  20.     {
  21.         //если даный пользиватель есть в базе, обновляем его time
  22.         $sql = "UPDATE `online` SET `time` = '".$time."' WHERE `user` = ".$iduser." LIMIT 1 ;";
  23.         mysql_query($sql);
  24.     }
  25.     else
  26.     {
  27.         //если пользивателя ещё нету в базе, заносим его туда
  28.         $sql = "INSERT INTO `online` ( `id` , `user` , `time` ) VALUES ('', '".$iduser."', '".$time."');";
  29.         mysql_query($sql);
  30.        
  31.     }
  32.     //дальше нужно удалить старые записи, я взял значения свыше 10 минут
  33.     $delete = 10; //10min
  34.     $sql = "SELECT * FROM online";
  35.     $sql = mysql_query($sql);
  36.     if(mysql_num_rows($sql) > 0)
  37.     {
  38.         $online = mysql_fetch_array($sql);
  39.         do
  40.         {   //Смотрим пользивателей в в которых time больше $delete
  41.             if($time-$online['time']>=$delete)
  42.             {
  43.                 //дальше удаляем этих пользивателей, что будет говорить об их оффлайне
  44.                 $sql1 = "DELETE FROM `online` WHERE `id` = ".$online['id']." LIMIT 1";
  45.                 mysql_query($sql1);
  46.             }  
  47.         }
  48.         while($online = mysql_fetch_array($sql));  
  49.     }  
  50. }
  51. //Запускаем функцию
  52. online();
  53.  


Выложил сюда что бы сказали что к чему, что подправить и так далее. Ведь очень хочется максимально оптимизировать данный скрипт.

(Отредактировано автором: 08 Ноября, 2009 - 03:12:12)

 
 Top
Мелкий Супермодератор
Отправлено: 08 Ноября, 2009 - 13:21:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А почему ключ ид? Зачем он вообще? По user ключ сделать же можно. Или предполагается, что 1 человек может находиться в 2 местах?

Если ключом сделать ид, то можно сократить:
PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT * FROM `online` WHERE `user` = '".$iduser."' LIMIT 1";
  2.     if(mysql_num_rows(mysql_query($sql)) > 0)
  3.     {
  4.         //если даный пользиватель есть в базе, обновляем его time
  5.         $sql = "UPDATE `online` SET `time` = '".$time."' WHERE `user` = ".$iduser." LIMIT 1 ;";
  6.         mysql_query($sql);
  7.     }
  8.     else
  9.     {
  10.         //если пользивателя ещё нету в базе, заносим его туда
  11.         $sql = "INSERT INTO `online` ( `id` , `user` , `time` ) VALUES ('', '".$iduser."', '".$time."');";
  12.         mysql_query($sql);
  13.  
  14.     }

до
PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_query("insert into `online` (`user`,`time`) values ('".$iduser."','".$time."') on dublicate key update `time`='".$time."'");


Удаление тоже ужасно. Почему время интовое? А не DATETIME? Тогда удаление сводится к:
PHP:
скопировать код в буфер обмена
  1.  
  2. $delete = 10*60; //10минут переводим в секунды
  3. mysql_query("delete from `online` where `time`<'".date("Y-m-d H:i:s",time()-$delete)."'");
  4.  

И то это не лучший вариант, лучше вообще использовать родные функции мускула по работе со временем.

(Отредактировано автором: 08 Ноября, 2009 - 13:26:05)



-----
PostgreSQL DBA
 
 Top
OverNik
Отправлено: 08 Ноября, 2009 - 16:23:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 182
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




ID писал по привычке Улыбка
Спасибо так и сделал. Спасибо за метод удаления, и обновления. Очень классно, код поменьше и полнофункциональный!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB