Добрый день, друзья. Есть код: Код (PHP): if(mysql_num_rows($query_user) > 0){ // Если Игрок существует... то.. делаем запрос и выводим последние матчи $select_matches = "SELECT * FROM lastm WHERE steam_id64=$_GET[steam_id]"; $query_matches = mysql_query($select_matches); if(mysql_num_rows($query_matches) == 0){ // 1. Игрок зашёл в первый раз.. $url = file_get_contents("https://site.com/?account_id=".$_GET['steam_id']."&key=".$steamauth['apikey'].""); $match = json_decode($url, true); $result_json = $match['result']; foreach ($result_json['matches'] as $match) { // Добавляем матчи в БД... $sql = mysql_query("INSERT INTO lastm (match_id, steam_id64, start_time, lobby_type) VALUES ('$match[match_id]','$_GET[steam_id]','$match[start_time]','$match[lobby_type]')"); $url2 = file_get_contents("https://site.com/?match_id=".$match[match_id]."&key=".$steamauth['apikey'].""); $match2 = json_decode($url2, true); $result_json2 = $match2['result']; $sql = mysql_query("INSERT INTO matches (radiant_win, duration, start_time, match_id, match_seq_num, tower_status_radiant, tower_status_dire, barracks_status_radiant, barracks_status_dire, cluster, first_blood_time, lobby_type, human_players, leagueid, positive_votes, negative_votes, game_mode) VALUES ('$result_json2[radiant_win]','$result_json2[duration]','$result_json2[start_time]','$result_json2[match_id]','$result_json2[match_seq_num]','$result_json2[tower_status_radiant]','$result_json2[tower_status_dire]','$result_json2[barracks_status_radiant]','$result_json2[barracks_status_dire]','$result_json2[cluster]','$result_json2[first_blood_time]','$result_json2[lobby_type]','$result_json2[human_players]','$result_json2[leagueid]','$result_json2[positive_votes]','$result_json2[negative_votes]','$result_json2[game_mode]')"); foreach ($result_json2['players'] as $players) { $sql = mysql_query("INSERT INTO account (match_id, account_id, player_slot, hero_id, item_0, item_1, item_2, item_3, item_4, item_5, kills, deaths, assists, leaver_status, gold, last_hits, denies, gold_per_min, xp_per_min, gold_spent, hero_damage, tower_damage, hero_healing, level) VALUES ('$result_json2[match_id]','$players[account_id]','$players[player_slot]','$players[hero_id]','$players[item_0]','$players[item_1]','$players[item_2]','$players[item_3]','$players[item_4]','$players[item_5]','$players[kills]','$players[deaths]','$players[assists]','$players[leaver_status]','$players[gold]','$players[last_hits]','$players[denies]','$players[gold_per_min]','$players[xp_per_min]','$players[gold_spent]','$players[hero_damage]','$players[tower_damage]','$players[hero_healing]','$players[level]')"); } } } } Данный код парсит данные с сайта, заносит сначала список матчей в БД, потом детали матча. Всё работает правильно, но почему-то последний цикл: Код (PHP): foreach ($result_json2['players'] as $players) { $sql = mysql_query("INSERT INTO account (match_id, account_id, player_slot, hero_id, item_0, item_1, item_2, item_3, item_4, item_5, kills, deaths, assists, leaver_status, gold, last_hits, denies, gold_per_min, xp_per_min, gold_spent, hero_damage, tower_damage, hero_healing, level) VALUES ('$result_json2[match_id]','$players[account_id]','$players[player_slot]','$players[hero_id]','$players[item_0]','$players[item_1]','$players[item_2]','$players[item_3]','$players[item_4]','$players[item_5]','$players[kills]','$players[deaths]','$players[assists]','$players[leaver_status]','$players[gold]','$players[last_hits]','$players[denies]','$players[gold_per_min]','$players[xp_per_min]','$players[gold_spent]','$players[hero_damage]','$players[tower_damage]','$players[hero_healing]','$players[level]')"); } Срабатывает один раз, и заносит данные только с первой ячейкой данных массива $players. Сам массив $players в JSON выглядит вот так: Код (Text): { "result": { "players": [ { "account_id": 2067850, "player_slot": 0, "hero_id": 99, "item_0": 242, "item_1": 127, "item_2": 34, "item_3": 114, "item_4": 63, "item_5": 0, "kills": 12, "deaths": 1, "assists": 20, "leaver_status": 0, "gold": 2268, "last_hits": 104, "denies": 15, "gold_per_min": 588, "xp_per_min": 632, "gold_spent": 13375, "hero_damage": 15128, "tower_damage": 1715, "hero_healing": 0, "level": 17, { "ability": 5002, "time": 1977, "level": 17 } ] }, { "account_id": 4294967295, "player_slot": 1, "hero_id": 4, "item_0": 0, "item_1": 71, "item_2": 11, "item_3": 63, "item_4": 137, "item_5": 154, "kills": 15, "deaths": 2, "assists": 21, "leaver_status": 0, "gold": 2715, "last_hits": 93, "denies": 12, "gold_per_min": 595, "xp_per_min": 450, "gold_spent": 12325, "hero_damage": 16657, "tower_damage": 3510, "hero_healing": 1110, "level": 14, // И ТАК ДАЛЕЕ..., ТАКОГО ЖЕ РОДА ДАННЫЕ... В итоге цикл foreach почему-то заносит только первую ячейку в БД, остальные проходит и идёт к следующему $match_id (матчу). Почему так ? Заранее спасибо !
Это официальное API от Steam. Они сами предлагают парсить данные для разработчиков. Тут ничего "полунезаконного" нет.
Ок. Попробуй сделать var_dump($result_json2) перед циклом, что там у тебя вообще приходит после парсинга?
Код (Text): array(18) { ["players"]=> array(10) { [0]=> array(24) { ["account_id"]=> int(2067850) ["player_slot"]=> int(0) ["hero_id"]=> int(99) ["item_0"]=> int(242) ["item_1"]=> int(127) ["item_2"]=> int(34) ["item_3"]=> int(114) ["item_4"]=> int(63) ["item_5"]=> int(0) ["kills"]=> int(12) ["deaths"]=> int(1) ["assists"]=> int(20) ["leaver_status"]=> int(0) ["gold"]=> int(2268) ["last_hits"]=> int(104) ["denies"]=> int(15) ["gold_per_min"]=> int(588) ["xp_per_min"]=> int(632) ["gold_spent"]=> int(13375) ["hero_damage"]=> int(15128) ["tower_damage"]=> int(1715) ["hero_healing"]=> int(0) ["level"]=> int(17) ["ability_upgrades"]=> array(17) { [0]=> array(3) { ["ability"]=> int(5549) ["time"]=> int(403) ["level"]=> int(1) } [1]=> array(3) { ["ability"]=> int(5550) ["time"]=> int(515) ["level"]=> int(2) } [2]=> array(3) { ["ability"]=> int(5549) ["time"]=> int(605) ["level"]=> int(3) } [3]=> array(3) { ["ability"]=> int(5550) ["time"]=> int(689) ["level"]=> int(4) } [4]=> array(3) { ["ability"]=> int(5550) ["time"]=> int(820) ["level"]=> int(5) } [5]=> array(3) { ["ability"]=> int(5551) ["time"]=> int(973) ["level"]=> int(6) } [6]=> array(3) { ["ability"]=> int(5549) ["time"]=> int(1021) ["level"]=> int(7) } [7]=> array(3) { ["ability"]=> int(5549) ["time"]=> int(1102) ["level"]=> int(8) } [8]=> array(3) { ["ability"]=> int(5550) ["time"]=> int(1264) ["level"]=> int(9) } [9]=> array(3) { ["ability"]=> int(5548) ["time"]=> int(1321) ["level"]=> int(10) } [10]=> array(3) { ["ability"]=> int(5551) ["time"]=> int(1330) ["level"]=> int(11) } [11]=> array(3) { ["ability"]=> int(5548) ["time"]=> int(1649) ["level"]=> int(12) } [12]=> array(3) { ["ability"]=> int(5548) ["time"]=> int(1650) ["level"]=> int(13) } [13]=> array(3) { ["ability"]=> int(5548) ["time"]=> int(1719) ["level"]=> int(14) } [14]=> array(3) { ["ability"]=> int(5002) ["time"]=> int(1816) ["level"]=> int(15) } [15]=> array(3) { ["ability"]=> int(5551) ["time"]=> int(1905) ["level"]=> int(16) } [16]=> array(3) { ["ability"]=> int(5002) ["time"]=> int(1977) ["level"]=> int(17) } } } [1]=> array(24) { ["account_id"]=> int(4294967295) ["player_slot"]=> int(1) ["hero_id"]=> int(4) ["item_0"]=> int(0) ["item_1"]=> int(71) ["item_2"]=> int(11) ["item_3"]=> int(63) ["item_4"]=> int(137) ["item_5"]=> int(154) ["kills"]=> int(15) ["deaths"]=> int(2) ["assists"]=> int(21) ["leaver_status"]=> int(0) ["gold"]=> int(2715) ["last_hits"]=> int(93) ["denies"]=> int(12) ["gold_per_min"]=> int(595) ["xp_per_min"]=> int(450) ["gold_spent"]=> int(12325) ["hero_damage"]=> int(16657) ["tower_damage"]=> int(3510) ["hero_healing"]=> int(1110) ["level"]=> int(14) ["ability_upgrades"]=> array(14) { [0]=> array(3) { ["ability"]=> int(5015) ["time"]=> int(399) ["level"]=> int(1) } [1]=> array(3) { ["ability"]=> int(5017) ["time"]=> int(510) ["level"]=> array(24) { ["account_id"]=> int(4294967295) ["player_slot"]=> int(2) ["hero_id"]=> int(87) ["item_0"]=> int(108) ["item_1"]=> int(0) ["item_2"]=> int(180) ["item_3"]=> int(0) ["item_4"]=> int(0) ["item_5"]=> int(0) ["kills"]=> int(3) ["deaths"]=> int(3) ["assists"]=> int(27) ["leaver_status"]=> int(0) ["gold"]=> int(2597) ["last_hits"]=> int(13) ["denies"]=> int(0) ["gold_per_min"]=> int(367) ["xp_per_min"]=> int(324) ["gold_spent"]=> int(6405) ["hero_damage"]=> int(8200) ["tower_damage"]=> int(556) ["hero_healing"]=> int(0) ["level"]=> int(12) ["ability_upgrades"]=> array(12) { [0]=> array(3) { ["ability"]=> int(5458) ["time"]=> int(375) ["level"]=> int(1) } [1]=> array(3) { ["ability"]=> int(5460) ["time"]=> int(537) ["level"]=> int(2) } [2]=> array(3) { ["ability"]=> int(5458) ["time"]=> int(628) ["level"]=> int(3) } [3]=> array(3) { ["ability"]=> int(5460) ["time"]=> int(722) ["level"]=> int(4) } [4]=> array(3) { ["ability"]=> int(5458) ["time"]=> int(866) ["level"]=> int(5) } [5]=> array(3) { ["ability"]=> int(5461) ["time"]=> int(1045) ["level"]=> int(6) } [6]=> array(3) { ["ability"]=> int(5458) ["time"]=> int(1133) ["level"]=> int(7) } [7]=> array(3) { ["ability"]=> int(5459) ["time"]=> int(1209) ["level"]=> int(8) } [8]=> array(3) { ["ability"]=> int(5459) ["time"]=> int(1536) ["level"]=> int(9) } [9]=> array(3) { ["ability"]=> int(5460) ["time"]=> int(1642) ["level"]=> int(10) } [10]=> array(3) { И так далее.. Он добавляет только первый ["account_id"] со всеми данными, остальные ["account_id"] почему-то пропускает..
Странно, но вывод массива показывает все нужные мне записи, а в БД добавляется почему-то только одна первая ячейка массива.. Ничего понять не могу... Это же не может быть от того, что я использую Код (PHP): $result_json2[match_id] в запросе.. цикл из-за этого не будет же прерываться.. Сижу голову ломаю уже второй день, а как обычно ответ где-то рядом. Причём как только этот запрос соорудил он сработал, я проверил, в БД именно столько записей было сколько в массиве.. ничего вроде не меняя мистически перестало работать.
А, ну вот и ответ. Что за match_id без знака доллара? Переменные в пхп так не указываются PHP напарывается на нее, интерпретирует как константу, содержащую свое же имя. При переводе в числовой индекс, она конвертируется в ноль. Вот ты и выхватываешь нонстоп нулевую ячейку. Включи вывод ошибок на страницу, будет тебе счастье.
Я так к массиву обращаюсь. Разве это не правильно ? ошибок никаких не выводит. Если использовать вот так: $result_json2[$match_id], то вообще ничего не добавляется в таблицу.
Потому что она нигде не определена. И это не единственный косяк, вероятно. Да, если это имя записи в ассоциативном массиве, то это будет проканывать, но так делать нельзя. Ключ надо брать либо в кавычки, либо указывать как переменную. Самоинициализирующиеся константы, которые у тебя используются - это адский ад. Не нужно их применять. В общем, что я могу сказать, дебажь. Построчно ли, выводом каждого чиха на страницу ли... Добавлено спустя 1 минуту 51 секунду: И да, а ты в курсе, что в том вардампе, что ты выдал, действительно всего 1 элемент players?
да, я не правильно выразился. Элемент players один, а вот account_id много. Он добавляет в БД только первый account_id каждого match_id. Не пойму почему.. ) за советы спасибо..
Ну а что удивляться, если ты-то перебираешь именно players... А внутри players ты ничего не перебираешь. Странно, что оно вообще работает, если честно.