PDA

Просмотр полной версии : Сортировка


restart_05
25.08.2009, 20:24
Вопрос
Мне нужно выводить 25 online серверов на 1 странице. Как мне это организовать

P.S. В базе данных информация online offline сервера не хранится

restart_05
26.08.2009, 09:55
Если бы все выводило на 1 странице я знаю как выводить только online сервера

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

restart_05
26.08.2009, 09:56
while ( $row = mysql_fetch_assoc($serv) ) {
...
if ($st = "off") {}
if ($st = "on") { выводит сервера }
...
}

diGriz
26.08.2009, 11:43
Если я правильно тебя понял, ты хочешь сделать постраничный вывод. Гугли по запросам paging на php и php pagination.

restart_05
27.08.2009, 19:28
Постраничный вывод я сделал, но он отображает все сервера как online так и offline а теперь мне нужно убрать offline и выводить только online

Gifts
27.08.2009, 19:42
restart_05 Вы вначале определитесь, чего вы хотите и что у вас есть. Первый пост - вы говорите что онлайн/оффлайн в бд _НЕ_ хранится, в 4 посте что он там есть. Так если есть - то поправьте запрос к бд "SELECT тратата FROM тратата WHERE столбец_онлайна='ON'"

restart_05
27.08.2009, 21:45
Мда... в 4 посте я показал свой запрос к базе если бы хранились то это было бы просто, они там не хранятся поэтому и спрашиваю

restart_05
27.08.2009, 22:01
Бд есть mysql в ней записывается ip port но состояние сервера не сохраняется.
Мне нужно выводить только online сервера

restart_05
27.08.2009, 22:10
$data['status'] = "off";
$data['status'] = "on";
if ($data['status'] = "on") {}
if ($data['status'] = "off") {}

restart_05
27.08.2009, 22:11
Если не постранично то я могу вывести все online сервера а так хЗ чет не получается

restart_05
27.08.2009, 22:18
Я делаю выводить по 25 на страницу. Если я ставлю выводить только online сервера, то к примеру если 15 online на странице выведит 15 из 25 а не все 25, а мне нужно чтобы выводило все 25 online

restart_05
27.08.2009, 22:24
НУ вначале же надо с бд взять а потом уже выводить вот в этом и проблема

d_x
27.08.2009, 22:41
Покажи свой запрос к БД. Если там MySQL или подобное, то достаточно добавить простое условие, давно бы уже помогли. Несколькими постами выше Gifts об этом же сказал.

restart_05
27.08.2009, 22:46
$query_my = "SELECT * FROM `list` where type='$game' ORDER BY golos DESC LIMIT $offset,10";
$serv = mysql_query($query_my, $connect) or die(mysql_error());

while ( $row_my = mysql_fetch_assoc($serv) ) {

}

d_x
27.08.2009, 22:50
Сделай так для вывода только онлайн-серверов (если поле с информацией о статусе сервера называется status):

$query_my = "SELECT * FROM `list` where type='$game' and status='on' ORDER BY golos DESC LIMIT $offset,10";

restart_05
27.08.2009, 22:51
статус не хранится в базе

d_x
27.08.2009, 23:01
Тогда это проблемнее, так как мы не знаем, сколько серверов должно быть отображено на страницах, находящихся перед той, которую мы просматриваем. Как вариант - делать полную выборку всех серверов из БД и работать с полученным массивом. Но если их очень много, то это неоптимально. Еще один вариант - на странице при выводе сделать кнопку "Показать/Скрыть сервера оффлайн" для пользователей, ее функционал реализовать на JavaScript.

d_x
27.08.2009, 23:05
отобразит все серваки в online без серваков offline
Он имеет в виду, что в этом случае на странице будет меньше 10 серверов (т.е. сколько должно было бы быть на странице). Если все сервера на странице будут оффлайн, то вообще пустая страница отобразится, это неприемлемо.

restart_05
27.08.2009, 23:12
Над этим варинатом я думал но вначале мне кажется нужно решить эту проблему

restart_05
27.08.2009, 23:16
Короче ни как да нельзя решить ? надо обязательно выводить в бд

restart_05
27.08.2009, 23:35
Мне нужно вывести online сервера постраничным методом
Статус сервера не хранится в бд. Чтобы определить статус можно воспользоваться таким запросом

$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

restart_05
28.08.2009, 12:13
не у кого нет предложений ???

Pashkela
28.08.2009, 13:24
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 минут"
--------------------------------------------------------------------

$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);)

а вот теперь постраничный вывод

restart_05
28.08.2009, 14:32
if ( $data['status'] == "on") {
$serv[][port] = $row['port'];
$serv[][ip] = $row['ip'];
}

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

Pashkela
28.08.2009, 14:48
if ( $data['status'] == "on") {
$serv[][port] = $row['port'];
$serv[][ip] = $row['ip'];
}

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

в общем понятно, загоняй все, кто онлайн в массив и дальше можно вот так например сделать:


<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. Как сформировать такой массив писано выше


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


заноси в результирующий массив в нужном тебе порядке, я просто пример привёл

restart_05
28.08.2009, 17:47
Все равно не получается мне кажется легче будет создать status cache и cache_time в бд и через определенное время обновлять эти данные