Имеется массив с данными всех серверов для мониторинга.
Имеется таблица в БД с зарегистрироваными пользователями. (их пока 4)
Цель - "Если ник пользователя совпал с одним из ников игроков - вывести на каком сервере он находится"
Вот. На этом скриншоте справа в столбике выводятся зарегистрированые на сайте пользователи:
У пользователя есть 3 типа статуса ("В сети", "Вне системы" и "Играет в ..."). Нужно заменить статус "Играет в ..." на название сервера на котором игрок находится.
для этого я использовал код, который выложил выше. в результате получил вот это:
Теперь в колонке выводятся абсолютно все игроки со всех серверов (но зато с указанием сервера). А мне нужно вывести только тех которые зарегистрированы на сайте (т.е у которых ник в игре и ник на сайте совпадает)
Используется код:
$timer = time();
$fres = mysql_query("SELECT * FROM users ORDER BY visit DESC,id");
while ($array = mysql_fetch_assoc($fres))
{
$resTime = $timer - $array['visit'];
$avatar = $array['avatar'];
foreach ($server_list as $server)
{
$server_list = lgsl_sort_servers($server_list);
foreach ($server['p'] as $player)
{
if (strpos($player['name'], $array['nickname']) !== FALSE)
{
$db_stat = 2;
$stat = "online";
$stat2 = "online";
}
else if($resTime < 300)
{
$db_stat = 1;
$stat = "playing";
$stat2 = "online";
}
else
{
$db_stat = 0;
$stat = "offline";
$stat2 = "offline";
}
if ($array['dolznost'] == "Лидер клана")
{$cl = "<img src='modules/img/cl.png' style='width:10px;' title='Лидер клана ".$array['team']."'>";}
else
{$cl = "";}
// Где ingame - числовое поле, обязательно. tinyint например
mysql_query("UPDATE users SET ingame=$db_stat WHERE id=$id_user", $db);
echo "
<li id='comcenter-2832660339291615977' class='comcenter-friend-item comcenter-friend comcenter-friend-$stat2 ' rel='2832660339291615977'>
<div class='comcenter-friend-draggable'></div>
<div class='comcenter-avatar'>
<div rel='2832660339291615977' class='base-avatar-container base-avatar-size-small'>
<div class='base-avatar-status-overlay base-avatar-status-overlay-$stat'>
<img src='profile/avatars/".$avatar."' width='22' height='22' onerror=\"this.src='profile/avatars/noAvatar.png'\">
</div></div></div>
<div class='comcenter-username comcenter-username-idle'>
<a class='comcenter-username-link' href='profile.php?id=".$array['id']."' >".$player['name']." $cl $key
</a>
<div class='comcenter-username-away'>
";
if($stat == "playing")
{
if($array['ccstatus'] == "2")
{
echo "<font color='orange'>Отошел</font>";
}
else if($array['ccstatus'] == "3")
{
echo "<font color='red'>Занят</font>";
}
else
{
echo "<font color='steelblue'>В сети</font>";
}
}
else if($stat == "online")
{
echo "<font color='#5bb138'>{$server['s']['name']}</font>";
}
else
{
echo "Вне системы";
}
echo "</div>
</div>
<div class='comcenter-interact-container'>
<a href='http://bfgc.agh.su/find-players2.php?search=".$array['xuid']."&searchtype=3' target='_blank'><button title='Совпадения по XUID' class='bubble-title-left comcenter-interact-chat'></button></a>
</div>
</li>
"; }
}
}
echo"
это уже измененный. Мне надо лишь сделать так, чтобы из массива не выводились ники, противоречащие условию:
if (strpos($player['name'], $array['nickname']) !== FALSE)
Допустим имеем массив игроков, ноходящихся на сервере
$players = array( "player1","server1", "player2","server2", "player3","server3", "player4","server4" );
Имеем базу данных с таблицей users, содержащую ники: player2, player5, player6 и выводим их столбиком:
player2
player5
player6
Как сделать следующее: "Если один из ников из БД совпал с одним из ников игроков на сервере - вывести в колонке рядом с ником сервер на котором игрок" ?
т.е получить следующее:
player2 - server 2
player5 - offline
player6 - offline
Спустя 5 часов, 36 минут, 30 секунд (28.07.2012 - 21:39) rooor написал(а):
Цитата |
if (strpos($player['name'], $array['nickname']) !== FALSE) |
в том топике уже было сказано - если ник play, то player, player2, players и т.д. будут TRUE
Спустя 11 часов, 14 минут, 50 секунд (29.07.2012 - 08:54) Xsfd написал(а):
Так и нужно.
Вообщем я решил проблему уже
Вообщем я решил проблему уже
Спустя 3 часа, 52 минуты, 50 секунд (29.07.2012 - 12:47) Xsfd написал(а):
а вот ещё вопрос. имеются 2 переменные.
$name - Никита
$sername - Морозов
Как их объеденить чтобы по переменной $fullname выводило "Никита Морозов"?
$name - Никита
$sername - Морозов
Как их объеденить чтобы по переменной $fullname выводило "Никита Морозов"?
Спустя 1 минута, 58 секунд (29.07.2012 - 12:49) Winston написал(а):
$fullname = $name . ' ' . $sername;
Спустя 1 час, 35 минут, 18 секунд (29.07.2012 - 14:24) Renden написал(а):
Xsfd
Как вариант, если из базы то можно и CONCAT() т.е:
ну и на выходе в $row['fullname'] уже все как надо)
Как вариант, если из базы то можно и CONCAT() т.е:
SELECT CONCAT(`name`,' ',`surname`) AS `fullname` FROM ..
ну и на выходе в $row['fullname'] уже все как надо)
Спустя 1 день, 2 часа, 26 минут, 49 секунд (30.07.2012 - 16:51) Xsfd написал(а):
Вот кстати насчёт базы. Никак не могу разобраться со следующим:
В мониторинге выводится счёт игроков и с игрой он растёт (например 100, 200, 300, 500).
я его записываю в базу данных
Проблема в UPDATE он заменяет счёт в базе, а мне нужно чтобы счёт складывался.
И ещё как можно избавиться от такого последствия. Допустим у игрока счёт 1200 и он записался в БД, через 5 минут счёт уже 1400 и чтобы БД не сложила эти числа а высчиталась разность (200) и её уже записывала?
Была мысль высчитать разность на уровне РНР, но опять загвоздка: допустим в базе у игрока счет 100, а на следующей карте он набил 300 в итоге всчёт идёт в минус.
В мониторинге выводится счёт игроков и с игрой он растёт (например 100, 200, 300, 500).
я его записываю в базу данных
mysql_query("UPDATE users SET score_user='{$player['score']}' ") or die ("<p>ошибка запроса</p>");
Проблема в UPDATE он заменяет счёт в базе, а мне нужно чтобы счёт складывался.
И ещё как можно избавиться от такого последствия. Допустим у игрока счёт 1200 и он записался в БД, через 5 минут счёт уже 1400 и чтобы БД не сложила эти числа а высчиталась разность (200) и её уже записывала?
Была мысль высчитать разность на уровне РНР, но опять загвоздка: допустим в базе у игрока счет 100, а на следующей карте он набил 300 в итоге всчёт идёт в минус.
Спустя 28 минут, 58 секунд (30.07.2012 - 17:20) kamanch написал(а):
При таком запросе обновится поле score_user для ВСЕХ записей таблицы users на значение $player['score'], т.к. отсутсвует условие WHERE
Если тебе надо ссумировать, то пишешь:
Если тебе надо ссумировать, то пишешь:
mysql_query("UPDATE `users` SET `score_user` = `score_user` + " . $player['score'] . " WHERE `user_id` = ...." )при условии, что поле score_user имеет числовой тип
Цитата |
И ещё как можно избавиться от такого последствия. Допустим у игрока счёт 1200 и он записался в БД |
Как я понял, в базе текущий счет игрока хранится в score_user?
Цитата |
Через 5 минут новый счет 1400 |
- откуда это значение берется / где хранится?
Цитата |
чтобы БД не сложила эти числа а высчиталась разность (200) и её уже записывала |
Куда записывала? В какое поле?
Спустя 43 минуты, 59 секунд (30.07.2012 - 18:04) Xsfd написал(а):
Цитата |
откуда это значение берется / где хранится? |
Берется с сервера, сохраняется кэшированым массивом в БД и меняется каждые 40 секунд
Цитата |
Куда записывала? В какое поле? |
вот тут ещё проблемка
mysql_query("INSERT INTO players (nick, score, server, id) VALUES ('{$player['name']}','{$player['score']}','{$server['s']['name']}','{$server['o']['id']}') ") or die ("<p>ошибка запроса</p>") ;
Нужно записывать в score. но вот этот запрос создаёт в БД дубликаты строк при каждом обновлении. Как это исправить?
Спустя 25 минут, 25 секунд (30.07.2012 - 18:29) kamanch написал(а):
Цитата |
Нужно записывать в score. но вот этот запрос создаёт в БД дубликаты строк при каждом обновлении. Как это исправить? |
Перед записью проверять наличие в таблице пары server, id
Если есть, то не добавлять, а обновлять значения.
Спустя 14 минут, 34 секунды (30.07.2012 - 18:44) Xsfd написал(а):
Вот. score_user` + " . $player['score'] . " даёт такой результат, который я и предполагал.
К примеру в базе у игрок какой либо счёт и туда добавили его текущий счет (пусть 4500) в результате чего стало 60000, но когда счет игрока стал 4600, то эти 4600 и идут в базу и выходит 64600, хотя надо чтобы шла разность между прошлым 4500 и текущим 4600 т.е 100, чтобы получить 60100
К примеру в базе у игрок какой либо счёт и туда добавили его текущий счет (пусть 4500) в результате чего стало 60000, но когда счет игрока стал 4600, то эти 4600 и идут в базу и выходит 64600, хотя надо чтобы шла разность между прошлым 4500 и текущим 4600 т.е 100, чтобы получить 60100
Спустя 15 минут, 18 секунд (30.07.2012 - 18:59) kamanch написал(а):
Xsfd
Ну так ты противоречишь сам себе.
Знаешь, есть такая пословица: Херню загрузил - херню получил.
У тебя так и произошло.
Ты четко написал:
Ну так ты противоречишь сам себе.
Знаешь, есть такая пословица: Херню загрузил - херню получил.
У тебя так и произошло.
Ты четко написал:
Цитата |
Проблема в UPDATE он заменяет счёт в базе, а мне нужно чтобы счёт складывался. |
Ты точно задачу поставь. У тебя понятие "счет" очень расплывчато.
Спустя 2 минуты, 57 секунд (30.07.2012 - 19:02) Xsfd написал(а):
Цитата |
И ещё как можно избавиться от такого последствия. Допустим у игрока счёт 1200 и он записался в БД, через 5 минут счёт уже 1400 и чтобы БД не сложила эти числа а высчиталась разность (200) и её уже записывала? |
я сразу написал что такое будет)
Спустя 15 минут, 28 секунд (30.07.2012 - 19:18) Xsfd написал(а):
вообщем вот что придумал.
создаю поля: oldscore, score_user, newscore
в score_user будет заноситься разность newscore-oldscore
только не понятно как сделать так чтобы цифра из newscore перешла в oldscore
создаю поля: oldscore, score_user, newscore
в score_user будет заноситься разность newscore-oldscore
только не понятно как сделать так чтобы цифра из newscore перешла в oldscore
Спустя 5 часов, 29 минут, 39 секунд (31.07.2012 - 00:47) Xsfd написал(а):
Нет. то что выше я написал - полный бред.
Мне нужно следующее. Привожу пример.
Идет карта, у игрока счет растёт и при этом записывается в БД: 0, 100, 200, 300, 400
Потом карта меняется и у игрока счет идёт заново: 0, 100, 200
Но нужно чтобы в базе данных продолжало плюсовать: 500, 600, 700
Если использовать SET score_user = '{$player['score']}' то при смене карты счёт в базе обнуляется
А если использовать SET score_user = score_user + '{$player['score']}' , то при каждом обновлении страницы счет будет удваиваться
Как быть?(
Мне нужно следующее. Привожу пример.
Идет карта, у игрока счет растёт и при этом записывается в БД: 0, 100, 200, 300, 400
Потом карта меняется и у игрока счет идёт заново: 0, 100, 200
Но нужно чтобы в базе данных продолжало плюсовать: 500, 600, 700
Если использовать SET score_user = '{$player['score']}' то при смене карты счёт в базе обнуляется
А если использовать SET score_user = score_user + '{$player['score']}' , то при каждом обновлении страницы счет будет удваиваться
Как быть?(
Спустя 1 час, 6 минут, 6 секунд (31.07.2012 - 01:53) kamanch написал(а):
Если я правильно понял, то есть 2 типа счета
1. глобальный счет игрока.
2. счет игрока на текущей карте.
Глобальный счет хранится в базе. поле 'score_user'
Счет игрока на текущей карте
1. глобальный счет игрока.
2. счет игрока на текущей карте.
Глобальный счет хранится в базе. поле 'score_user'
Счет игрока на текущей карте
Цитата |
Берется с сервера, сохраняется кэшированым массивом в БД и меняется каждые 40 секунд |
Если всё так, то можно сделать следующее:
1. Игрок перешел на карту. В сессию записали его глобальный счет. $SESSION['start_map_score']
2. Во время игры на этой карте у игрока нарaстает текущий счет (который раз в 40 секунд меняется) $curet_map_score
3. Когда тебе надо обновить в базе глобальный счет игрока (поле 'score_user'), делаешь:
$query = "UPDATE `users` SET `score_user` = `score_user` - " . $SESSION['start_map_score'] . " + " . $curet_map_score . " WHERE `user_id` = ...";