Помогите настроить "гости онлайн"

Тема в разделе "Как сделать...", создана пользователем lirikk, 3 июн 2012.

  1. lirikk

    lirikk Создатель

    Регистр.:
    18 авг 2007
    Сообщения:
    18
    Симпатии:
    3
    Добрый день знатоки php!
    Помогите мне с одной маленькой проблемой если не трудно)
    Хочу сделать вывод гостей (всего онлайн), есть база и сам скрипт online.php
    Вставляю его на страницу index.tpl
    Код:
    {php} include 'online.php'; {/php}
    Но мне выводит, только тех кто просматривает именно главную страницу, а не полностью весь сайт.

    В чем собственно нужна помощь:
    как мне сделать чтоб он считывал инфу со всего сайта, не могу понять как скажем прописать файл online.php скажем в footer.tpl, и естественно сделать вывод только на главной странице (index.tpl)

    ниже сам код файла online.php
    Код:
    $config = array(
    'online_time' => '1', //В минутах
    );
     
    $connect_config = array(
    'host' => 'localhost',
    'user' => 'root',
    'pass' => 'mangos',
    'db' => 'guest_online'
    );
     
    if(!$_COOKIE['uniq_id'])
    {
        $uniq_id = uniqid();
        setcookie('uniq_id',$uniq_id,(time()+3600*24*30));
    }
    else $uniq_id = $_COOKIE['uniq_id'];
     
    $con = mysql_connect($connect_config['host'],$connect_config['user'],$connect_config['pass'],true);
    if($con == false) die('<p style="color:red; font-weight:bold; font-size:14px">Failed to connect with DB '.$connect_config['db'].'!</p>');
    mysql_select_db($connect_config['db'],$con) or die('<p style="color:red; font-weight:bold; font-size:14px">Failed to connect with '.$connect_config['user'].'@'.$connect_config['host'].'!</p>');
     
    mysql_query("delete from online_list where last_time<".(time()-$config['online_time']*60),$con);
     
    if(preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/isU",$_SERVER['REMOTE_ADDR']) and !preg_match("/[^a-zA-Z0-9\_\[\]\.\(\)\-]/isU",$uniq_id))
    {
        $last_time = mysql_result(mysql_query("select last_time from online_list where uniq_id = '".$uniq_id."' and ip = '".$_SERVER['REMOTE_ADDR']."'",$con),0,0);
       
        if(!$last_time) mysql_query("insert into online_list (uniq_id, ip, last_time) values ('".$uniq_id."', '".$_SERVER['REMOTE_ADDR']."', '".time()."')",$con);
        else mysql_query("update online_list set last_time = '".time()."' where uniq_id = '".$uniq_id."' and ip = '".$_SERVER['REMOTE_ADDR']."'",$con);
    }
     
    $online = intval(mysql_result(mysql_query("select count(*) from online_list where last_time>".(time()-$config['online_time']*60),$con),0,0));
    //$online - кол-во гостей на сайте
     
    mysql_close($con);
    unset($con);
     
    echo $online; 
    Может не правильно выразил суть проблемы, сильно не ругайте)

    За ранее спасибо!
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    В скрипте удали последнюю строку: (echo $online;)
    Для страниц, на которых хочешь выводить код, пиши:
    {php}include 'online.php';
    echo $online;
    {/php}

    Для остальных: {php} include 'online.php'; {/php}

    PS: скрипт не очень оптимально написан, создаёт нагрузку, которой можно было бы избежать. :)
     
  3. lirikk

    lirikk Создатель

    Регистр.:
    18 авг 2007
    Сообщения:
    18
    Симпатии:
    3
    возможно ли написать нормальный или оптимизировать)
    ну не бесплатно конечно
     
  4. lirikk

    lirikk Создатель

    Регистр.:
    18 авг 2007
    Сообщения:
    18
    Симпатии:
    3
    Так кто поможет, оптимизировать данный скрипт online, чтоб было минимум нагрузки ?
    И потом вставить его, как рекомендует Latteo
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    С оптимизацией можешь сильно не заморачиваться, если посетителей мало (до нескольких сотен), скрипт лишь сотые доли секунды выполняется.

    И сам я вариант тоже не очень оптимальный привёл :oops: Лучше так подключать:
    {php}
    $echo_online = true;
    include 'online.php';
    {/php}

    В коде online.php вставить строки:
    PHP:
    if(isset($echo_online) &&  $echo_online == true){
    $online intval(mysql_result(mysql_query("select count(*) from online_list where last_time>".(time()-$config['online_time']*60),$con),0,0));
    //$online - кол-во гостей на сайте
    echo $online;
    }
    перед mysql_close($con); удалив из скрипта строчки, которые в фигурных скобках приведены выше.
    Это поможет избежать лишнего запроса, когда скрипт не выводит количество онлайн посетителей.
     
    lirikk нравится это.
  6. lirikk

    lirikk Создатель

    Регистр.:
    18 авг 2007
    Сообщения:
    18
    Симпатии:
    3
    Latteo проверьте, правильно ли я все сделал:
    Я заменяю эту строчку:
    PHP:
    $online intval(mysql_result(mysql_query("select count(*) from online_list where last_time>".(time()-$config['online_time']*60),$con),0,0));
    //$online - кол-во гостей на сайте
    На эту :
    PHP:
    if(isset($echo_online) &&  $echo_online == true){
    $online intval(mysql_result(mysql_query("select count(*) from online_list where last_time>".(time()-$config['online_time']*60),$con),0,0));
    //$online - кол-во гостей на сайте
    echo $online;
    }
    При этом удаляю нижнию строку echo $online; , которая идет после
    PHP:
    mysql_close($con);
    unset(
    $con);
     
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Всё верно, работает у тебя без ошибок?
    У меня варнингами мускуль плюётся на такое использование mysql_result, хотя это не снижает работоспособность, но говорит о не очень качественном коде. Ну и если в движке нет подавления ошибок, то это недопустимо.
     
  8. lirikk

    lirikk Создатель

    Регистр.:
    18 авг 2007
    Сообщения:
    18
    Симпатии:
    3
    Все отлично, спасаибо за помощь, работает великолепно, сам глянь
    Перейти