[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: [Вопрос]Сравнение с массивом
Xsfd
Здравствуйте. Где-то здесь на форуме девушка подкинула интересную мысль по поводу игрового мониторинга, а именно вывод сервера на котором находится игрок.

Имеется массив с данными всех серверов для мониторинга.
Имеется таблица в БД с зарегистрироваными пользователями. (их пока 4)

Цель - "Если ник пользователя совпал с одним из ников игроков - вывести на каком сервере он находится"


Вот. На этом скриншоте справа в столбике выводятся зарегистрированые на сайте пользователи:
user posted image

У пользователя есть 3 типа статуса ("В сети", "Вне системы" и "Играет в ..."). Нужно заменить статус "Играет в ..." на название сервера на котором игрок находится.

для этого я использовал код, который выложил выше. в результате получил вот это:

user posted image

Теперь в колонке выводятся абсолютно все игроки со всех серверов (но зато с указанием сервера). А мне нужно вывести только тех которые зарегистрированы на сайте (т.е у которых ник в игре и ник на сайте совпадает)

Используется код:


$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 написал(а):
Так и нужно.
Вообщем я решил проблему уже smile.gif

Спустя 3 часа, 52 минуты, 50 секунд (29.07.2012 - 12:47) Xsfd написал(а):
а вот ещё вопрос. имеются 2 переменные.
$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() т.е:

SELECT CONCAT(`name`,' ',`surname`) AS `fullname` FROM ..

ну и на выходе в $row['fullname'] уже все как надо)

Спустя 1 день, 2 часа, 26 минут, 49 секунд (30.07.2012 - 16:51) Xsfd написал(а):
Вот кстати насчёт базы. Никак не могу разобраться со следующим:

В мониторинге выводится счёт игроков и с игрой он растёт (например 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

Спустя 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

Спустя 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']}' , то при каждом обновлении страницы счет будет удваиваться

Как быть?(

Спустя 1 час, 6 минут, 6 секунд (31.07.2012 - 01:53) kamanch написал(а):
Если я правильно понял, то есть 2 типа счета
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` = ...";
Быстрый ответ:

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