[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нужно исправить скрипт "Кто онлайн".
Phpprogger
Приветствую всех Гуру этого форума. Вчера поставил на сайт скрипт Кто онлайн вот отсюда: ссылка . Слегка пофиксил скрипт, ибо он не работал и стало все ок.
Сегодня утром решил дописать скрипт, а именно, чтоб отображался список юзеров онлайн.
Типа: В данный момент на сайте N человек(а) онлайн, из них зарегистрированных:
N, где N - это число в первом случае и имена юзеров во втором.
Но однако столкнулся с проблемой: в MySQL я новичок, всего пару дней назад начал изучать. Скрипт выводит только одного зареганого юзера, хотя я знаю, что их (2), т.к. я тестировал скрипт с другом с его и моего компа. user posted image
Код SQL (who_is_online)
ALTER TABLE  `who_is_online` CHANGE  `id`  `id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
CHANGE `ip` `ip` INT( 10 ) NOT NULL ,
CHANGE `dt` `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
CHANGE `users` `users` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `id2` `id2` INT( 11 ) NOT NULL


Код PHP (index.php отрывок кода хто онлайн)
<?php
$stringIp = $_SERVER['REMOTE_ADDR'];
$intIp = ip2long($stringIp);
//Подключаемся к БД
mysql_connect("localhost","admin2","16vbif");
mysql_select_db("other");
// Проверяем отмечен ли посетитель как "онлайн":
$inDB = mysql_query("SELECT * FROM who_is_online WHERE ip=".$intIp);
if(!mysql_num_rows($inDB))
{
// Этого пользователя нет в БД
mysql_query("INSERT INTO who_is_online SET `ip`='".$intIp."'");
}
else
{
// Если пользователь онлайн, просто внести изменения в значение поля dt:
mysql_query("UPDATE who_is_online SET dt=NOW() WHERE ip=".$intIp);
}

// убираем записи, которые не обновлялись в течении 5 минут:
// добавили лимит, чтобы не сильно тормозил скрипт. Если людей достаточно много, можете лимит сделать меньше вплоть до 1.
// так сайт значительно быстрее работать будет.

mysql_query("DELETE FROM who_is_online WHERE dt<SUBTIME(NOW(),'0 0:05:0') LIMIT 20");

// Подсчитываем всех посетителей онлайн:
$query = mysql_query( "SELECT `ip` FROM `who_is_online`" );
$resalt = mysql_num_rows( $query );
####До этого места, весь код - рабочий.####
if ($_SESSION[login] == "") {
}
else {
$lg = $_SESSION[login];
$result2 = mysql_query("INSERT INTO who_is_online (users) VALUES('$lg')");

$query = "SELECT users FROM who_is_online WHERE users='$lg'";
$q = mysql_query($query);
$result = mysql_fetch_array($q);
}
####А это вывод юзеров/гостей####
echo "<center><i>В данный момент на сайте $resalt человек(а) онлайн, из них зарегистрированных: $result[users]</i></center><br>";
?>


Можете поправить весь код...еще раз: пыху я слегка знаю(чутка), а MySQL нет(почти).
Задача: поправить код или ткнуть/подсказать, чтобы выводилось кол-во юзеров сейчас онлайн.

Ошибка-то пустяковая, для гуру раз плюнуть, код после звездочек вообще "никакой"...т.к. майскюэль я не знаю и раньше не сталкивался, работал с файлами+php. В
$_SESSION[login]
храниться логин юзера, если надо что-то еще - спрашивайте.



Спустя 25 минут, 16 секунд (18.08.2011 - 11:59) Invis1ble написал(а):
 // код
$query = "SELECT COUNT(*) FROM who_is_online WHERE users != ''";
$r = mysql_query($query);
$auth_amount = mysql_result($r, 0);
}
####А это вывод юзеров/гостей####
echo '<center><i>В данный момент на сайте ' . $resalt . ' человек(а) онлайн, из них зарегистрированных: ' . $auth_amount . '</i></center><br>';
?>

Спустя 7 минут, 9 секунд (18.08.2011 - 12:06) Phpprogger написал(а):
Спасибо, скрипт работает, но простите, если это уж чересчур много требую:
я просто неправильно сформулировал. Хотел, чтоб были имена пользователей.
А код Invis1ble работает, спасибо тебе.

Поспешил: Первый раз сработало, а потом нет.
Код:
//код для кто онлайн всего
if ($_SESSION[login] == "") {
}
else {
// код
$query = "SELECT COUNT(*) FROM who_is_online WHERE users != ''";
$r = mysql_query($query);
$auth_amount = mysql_result($r, 0);
}
####А это вывод юзеров/гостей####
echo '<center><i>В данный момент на сайте ' . $resalt . ' человек(а) онлайн, из них зарегистрированных: ' . $auth_amount . '</i></center><br>';
?>

Цитата
В данный момент на сайте 1 человек(а) онлайн, из них зарегистрированных: 0

Спустя 5 минут, 55 секунд (18.08.2011 - 12:12) Invis1ble написал(а):
$r = mysql_query("SELECT `users` FROM `who_is_online` WHERE `users` != ''");
while ($row = mysql_fetch_assoc($r))
$users[] = $row['users'];
}
####А это вывод юзеров/гостей####
echo '<center><i>В данный момент на сайте ' . $resalt . ' человек(а) онлайн, из них зарегистрированных: ' . implode(', ', $users) . '</i></center><br>';
?>

У тебя код не будет работать корректно, потому что ты сессиию не открываешь.
session_start(); в самом начале скрипта нужно писать
и индексы массивов нужно заключать в кавычки

Спустя 7 минут, 13 секунд (18.08.2011 - 12:20) Phpprogger написал(а):
В данный момент на сайте 1 человек(а) онлайн, из них зарегистрированных:
Так не может быть. Должно быть:
В данный момент на сайте 1 человек(а) онлайн, из них зарегистрированных: Admin

session_start();
if ($_SESSION[login] == "") {
}
else {
$r = mysql_query("SELECT `users` FROM `who_is_online` WHERE `users` != ''");
while ($row = mysql_fetch_assoc($r))
$users[] = $row['users'];
}
####А это вывод юзеров/гостей####
echo '<center><i>В данный момент на сайте ' . $resalt . ' человек(а) онлайн, из них зарегистрированных: ' . implode(', ', $users) . '</i></center><br>';
?>

сессион_старт сделал и в начало и перед скриптом на всякий случай.

Спустя 10 минут, 41 секунда (18.08.2011 - 12:30) Renden написал(а):
Phpprogger
мб надо добавить стобец для вывода с именем ну типа:

SELECT `users`, `user_name` FROM `who_is_online` WHERE `users` != ''

Спустя 4 минуты, 33 секунды (18.08.2011 - 12:35) Phpprogger написал(а):
Час попробуем...
это надо в бд создать + в пыхе?

Спустя 53 секунды (18.08.2011 - 12:36) Renden написал(а):
Phpprogger
Не, ненадо ниче создавать я просто не понял где у тя имена юзеров хранятся, в стобце users? или где?

Зы код инвисибла должен работать, сделай в конце print_r($users); че выдаст?

Спустя 38 секунд (18.08.2011 - 12:36) Invis1ble написал(а):
Phpprogger
открой для себя error_reporting(E_ALL); - рекомендую smile.gif

Спустя 2 минуты, 23 секунды (18.08.2011 - 12:39) Phpprogger написал(а):
Есть таблицы users - там все что связанно с юзерами, есть таблицы ху ис онлан, там все что связанно с кто онлайн.
users --> login - логин юзера.
Вписал error_reporting(E_ALL); - ни чего не поменялось.
Renden
Ничего не изменилось. dry.gif

Спустя 11 минут, 38 секунд (18.08.2011 - 12:50) Renden написал(а):
Phpprogger
Ничего не вывело, тк массив пустой наверно, тк тебе имена юзеров надо брать из другой таблицы (из Users) а не из who_is_online.
Для этого нужно сделать join, только вот как отслеживать что ето именно тот юзер, по ипу мона, или по айди. Т.е запрос должен быть примерно таким.

SELECT u.login FROM users u LEFT JOIN who_is_online wio ON u.ip=wio.ip

ну и в таблице users должно быть поле с айпи зарегеных юзеров..как-то так..

Спустя 1 минута, 37 секунд (18.08.2011 - 12:52) Phpprogger написал(а):
Я тоже это начал понимать...час думаю, позже отпишусь.
ALTER TABLE  `users` CHANGE  `id`  `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
CHANGE `login` `login` VARCHAR( 15 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `password` `password` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `avatar` `avatar` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `ip` `ip` VARCHAR( 12 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `date` `date` DATETIME NOT NULL ,
CHANGE `col` `col` INT( 1 ) NOT NULL ,
CHANGE `email` `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE `activation` `activation` INT( 1 ) NOT NULL DEFAULT '0',
CHANGE `date2` `date2` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'

SQL таблицы с юзерами

Спустя 6 минут, 33 секунды (18.08.2011 - 12:58) Renden написал(а):
Phpprogger
Я еще раз повторю что в таблице юзерс должен быть либо ип, либо в таблице who_is_online должен писаться id пользователя который зашел, т.е при залогине зарегистрированого пользователя тебе надо писать либо его id в who_is_online, либо его ip в users.

Спустя 15 минут, 42 секунды (18.08.2011 - 13:14) Phpprogger написал(а):
Завтра этим займусь.

Спустя 5 часов, 14 минут, 55 секунд (18.08.2011 - 18:29) Phpprogger написал(а):
Все. Я все таки сделал что хотел, причем очень просто. Завтра еще буду тестить.
Код SQL. Создал таблу online2.

Сделал 2 поля: ip и users, причем в конце ип так и не понадобился.
Php код:
session_start();
mysql_query("DELETE FROM online2 WHERE dt<SUBTIME(NOW(),'0 0:05:0') LIMIT 20");
if ($_SESSION[login] == "") {
}
else {
$usrip = $_SERVER['REMOTE_ADDR'];
$login = $_SESSION[login];
$result2 = mysql_query ("INSERT INTO online2 (users, ip) VALUES('$login', '$usrip')");
$r2 = mysql_query("SELECT users FROM online2 WHERE users='$login'");
$myrow2 = mysql_fetch_array($r2);
list ($u1, $u2, $u3) = $myrow2;
}
####А это вывод юзеров/гостей####
echo '<center><i>В данный момент на сайте ' . $resalt . ' человек(а) онлайн, из них зарегистрированных: ' .$u1. '' .$u2. '' .$u3. '</i></center><br>';

?>

Не знаю правильно или нет, но пока пашет. ;)
Алгоритм: если ты юзер, то записываешься в бд, которая обновляется каждые 5 мин. и выводишься как онлайн.
Все кошмарно просто, что и удивляет и даже напрягает, думается: а вдруг где собака зарыта хз. :D
Завтра утром тестить буду.

Спустя 16 часов, 16 минут, 9 секунд (19.08.2011 - 10:45) Renden написал(а):
Phpprogger
Невижу смысла в создании еще 1 таблицы если все имена содержатся у тя в users, достаточно просто было в who_is_online создать поле user_id и писать туда ид залогиненого юзера из сессии(заместо имени как у тебя сейчас), и спомощью join сопоставить user_id с его именем из users.

Спустя 14 минут, 38 секунд (19.08.2011 - 11:00) Phpprogger написал(а):
Согласен, но уж ладно, потом, когда время будет, переделаю. rolleyes.gif

Спустя 1 час, 26 минут, 10 секунд (19.08.2011 - 12:26) Phpprogger написал(а):
Запросом я не могу получить все ЯЧЕЙКИ ПОЛЯ users!
К примеру их две:
Admin
User2

$r2 = mysql_query("SELECT users FROM online2");
$myrow2 = mysql_fetch_array($r2);

Надо получить в строке их все (сколько будет хоть 2, хоть 200).
Однако $myrow2 =
mysql_fetch_array($r2);
это не удается.

Спустя 3 минуты, 19 секунд (19.08.2011 - 12:29) Invis1ble написал(а):
$r = mysql_query('SELECT * FROM `online2`');
while ($row = mysql_fetch_assoc($r))
$data[] = $row;

echo '<pre>'; print_r($data); echo '</pre>';

Спустя 2 минуты, 13 секунд (19.08.2011 - 12:32) Phpprogger написал(а):
Ок. После обеда потестю.



Спустя 10 минут, 5 секунд Phpprogger написал(а):
Array
(
[
0] => Array
(
[
users] => Admin
[dt] => 2011-08-19 13:40:34
)

[
1] => Array
(
[
users] => Admin
[dt] => 2011-08-19 13:37:31
)

)

вот что написал

Спустя 12 минут, 28 секунд (19.08.2011 - 12:44) Invis1ble написал(а):
Цитата
вот что написал

и? что тебе еще нужно? в $data все данные, о которых ты говорил

Спустя 1 минута, 7 секунд (19.08.2011 - 12:45) Phpprogger написал(а):
Ладно. Буду разбираться. спасибо.



Спустя 16 минут, 57 секунд Phpprogger написал(а):
И еще подскажи последний раз чайнику:
Как вытащить данные из массива.
Типа: Админ, юзер1, юзер2...

Спустя 20 минут, 32 секунды (19.08.2011 - 13:06) Invis1ble написал(а):
$data = array(
'key1' => 'value1',
'key2' => 'value2'
);

echo $data['key1']; // value1
echo $data['key2']; // value2

Совет: скачай какую-нибудь книгу и сиди читай основы.

Спустя 2 минуты, 39 секунд (19.08.2011 - 13:08) Phpprogger написал(а):
Да я массивы плохо выучил...
А книгу надо реально читать, спс. user posted image


_____________
хе-хе.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.