Сортировка

Discussion in 'PHP' started by restart_05, 25 Aug 2009.

  1. restart_05

    restart_05 Member

    Joined:
    5 May 2009
    Messages:
    164
    Likes Received:
    6
    Reputations:
    0
    Мне нужно вывести online сервера постраничным методом
    Статус сервера не хранится в бд. Чтобы определить статус можно воспользоваться таким запросом
    Code:
    $query = "SELECT * FROM `list` where type='cs' ORDER BY golos DESC LIMIT $offset,25";
    $serv = mysql_query($query, $connect) or die(mysql_error());
    while ( $row = mysql_fetch_assoc($serv) ) {
      $ip       = $row['ip'];
      $port   = $row['port'];
      $data     = cs($ip,$port);
      if ( $data['status'] == "off") { }
      if ( $data['status'] == "on") {//Выводим сервер в список }
    }
    
    Отсюда если будут к примеру только 15 серверов из 25 выведит 15 а не 25 а мне нужно чтоб на страницу выводило 25 из 25
     
    #21 restart_05, 27 Aug 2009
    Last edited: 27 Aug 2009
  2. restart_05

    restart_05 Member

    Joined:
    5 May 2009
    Messages:
    164
    Likes Received:
    6
    Reputations:
    0
    не у кого нет предложений ???
     
  3. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    1. В базе данных создаешь новую колонку - status, в которую будешь писать online или offline, или 1 и 0, или как хочешь.

    2. SQL-запрос без лимит 25. Получаем список серверов из БД, делаем процедуру проверки на онлайн (в цикле, каждого сервера), примерный цикл:

    while (ля-ля) {
    тут процедура проверки на онлайн конкретного сервера
    тут процедура обновления БД, вставляем напротив конкретно текущего сервера статус - онлайн/офлайн
    }

    3. Новый SQL-запрос, теперь спокойно выбираем только те, которые online, т.е. select * from lala where status='online'

    а дальше уже стандартная процедура - подсчет кол-ва полученных значений по запросу и вывод на экран с пагинацией, в зависимости от полученных результатов

    PS: Или тоже самое только с первым запросом, но результаты проверки на онлайн/офлайн заносить в массив (только те, кто онлайн), включая название сервера (все данные, что нужны для вывода), делать расчет кол-ва массива (каждый раз может быть разное), и выводить на экран в цикле с пагинацией как обычно (в принципе тоже самое, только без сохранения статуса где либо, что вряд ли имеет значение, ибо такие запросы делать постоянно - прикинь, зашли 100 даже человек одновременно, как думаешь, скоро у них отклик на F5 будет? Проще задать временной промежуток - т.е. создать в БД кроме колонки status еще колонку time, куда заносить последнее время проверки статуса, и при очередном запросе к сприпту проверять, если последнее время проверки было не больше 5 минут назад - просто выплевывать последние данные в соответствии с колонкой status. Ну или любой другой интервал - минута, 2 и т.д.)

    и написать "статус проверяется каждые n минут"
    --------------------------------------------------------------------
    Code:
    $query = "SELECT * FROM `list` where type='cs' ORDER BY golos DESC LIMIT $offset,25";
    $serv = mysql_query($query, $connect) or die(mysql_error());
    while ( $row = mysql_fetch_assoc($serv) ) {
      $ip       = $row['ip'];
      $port   = $row['port'];
      $data     = cs($ip,$port);
      if ( $data['status'] == "off") { }
      if ( $data['status'] == "on") {//Выводим сервер в список }
    }
    
    или (сорри, поздно увидел), по этому коду:

    вот это

    $query = "SELECT * FROM `list` where type='cs' ORDER BY golos DESC LIMIT $offset,25";

    заменить на это:

    $query = "SELECT * FROM `list` where type='cs' ORDER BY golos DESC";

    а дальше так примерно:

    if ( $data['status'] == "on") {
    $serv[][port] = $row['port'];
    $serv[][ip] = $row['ip'];
    }

    т.е. формуруем массив, в котором только те, кто онлайн. И только сейчас считаем кол-во значений полученного массива (т.е. у нас ВСЕ сереверы, кто ОНЛАЙН), а не только первые 25 (print_r ($serv);)

    а вот теперь постраничный вывод
     
    #23 Pashkela, 28 Aug 2009
    Last edited: 28 Aug 2009
  4. restart_05

    restart_05 Member

    Joined:
    5 May 2009
    Messages:
    164
    Likes Received:
    6
    Reputations:
    0
    if ( $data['status'] == "on") {
    $serv[][port] = $row['port'];
    $serv[][ip] = $row['ip'];
    }

    Вначале же берем ип порт с базу чтобы узнать статус on или off
     
  5. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    в общем понятно, загоняй все, кто онлайн в массив и дальше можно вот так например сделать:

    PHP:
    <pre>
    <?php 
    $start 
    = (int)$_GET['start'];
    for (
    $s=0;$s<100;$s++) $serv[] = $s;// Тут типо пример твоего массива с серверами (просто создаем для примера)
    $limit 25// Сколько выводить на страницу
    $count count($serv);
    $b 0;
    for(
    $i=$start;$i $count;$i++) {
      
    $b++;
      echo 
    "сервер" $serv[$i] . "\n"// Тут пишем то, что нужно вывести на экран
      // Ниже делаем навигацию
      
    if ($b == $limit) {
          if (
    $i == ($count-1)) {
             echo 
    "\n <a href = " $_SERVER['PHP_SELF'] . "?start=" . ($i+1-$limit*2) . ">Предыдущие $limit</a>";
             echo 
    " Навигация ";
             exit; 
          }   
          if (
    $i>$limit) {
             echo 
    "\n <a href = " $_SERVER['PHP_SELF'] . "?start=" . ($i+1-$limit*2) . ">Предыдущие $limit</a>"
             echo 
    " Навигация ";
             echo 
    "<a href = " $_SERVER['PHP_SELF'] . "?start=" . ($i+1) . ">Следующие $limit</a>";
          } else {
             echo 
    "\n Навигация ";
             echo 
    "<a href = " $_SERVER['PHP_SELF'] . "?start=" . ($i+1) . ">Следующие $limit</a> \n";
          }      
          
    $i $count;
      }     
    }  

    ?>
    </pre>
    просто запусти этот скрипт и может быть таки поймешь, что к чему. Тоже самое тебе надо сделать со своим массивом, где у тебя будут только сервера ONLINE. Как сформировать такой массив писано выше

    заноси в результирующий массив в нужном тебе порядке, я просто пример привёл
     
    #25 Pashkela, 28 Aug 2009
    Last edited: 28 Aug 2009
  6. restart_05

    restart_05 Member

    Joined:
    5 May 2009
    Messages:
    164
    Likes Received:
    6
    Reputations:
    0
    Все равно не получается мне кажется легче будет создать status cache и cache_time в бд и через определенное время обновлять эти данные