За последние 24 часа нас посетили 54214 программистов и 1724 робота. Сейчас ищут 822 программиста ...

Почему цикл запускается только один раз ?

Тема в разделе "PHP для новичков", создана пользователем Sice, 25 май 2015.

  1. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    Добрый день, друзья.

    Есть код:
    Код (PHP):
    1.     if(mysql_num_rows($query_user) > 0){ // Если Игрок существует... то.. делаем запрос и выводим последние матчи
    2.         $select_matches = "SELECT * FROM lastm WHERE steam_id64=$_GET[steam_id]";
    3.         $query_matches = mysql_query($select_matches);
    4.     
    5.             if(mysql_num_rows($query_matches) == 0){ // 1. Игрок зашёл в первый раз..
    6.                     $url = file_get_contents("https://site.com/?account_id=".$_GET['steam_id']."&key=".$steamauth['apikey'].""); 
    7.                     $match = json_decode($url, true);
    8.                     $result_json = $match['result'];
    9.                         foreach ($result_json['matches'] as $match) { // Добавляем матчи в БД...
    10.  
    11.                         $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]')");
    12.                                 
    13. $url2 = file_get_contents("https://site.com/?match_id=".$match[match_id]."&key=".$steamauth['apikey'].""); 
    14.                                    $match2 = json_decode($url2, true);
    15.                                   $result_json2 = $match2['result'];    
    16.                                     
    17. $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]')");
    18.                                             
    19.                                             foreach ($result_json2['players'] as $players) {
    20.                                              $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]')");
    21.                                         }
    22.                                         
    23.                                     }
    24.  
    25.             }
    26.     }
    27.  
    Данный код парсит данные с сайта, заносит сначала список матчей в БД, потом детали матча. Всё работает правильно, но почему-то последний цикл:
    Код (PHP):
    1.  foreach ($result_json2['players'] as $players) {
    2.                                              $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):
    1.  
    2. {
    3.     "result": {
    4.         "players": [
    5.             {
    6.                 "account_id": 2067850,
    7.                 "player_slot": 0,
    8.                 "hero_id": 99,
    9.                 "item_0": 242,
    10.                 "item_1": 127,
    11.                 "item_2": 34,
    12.                 "item_3": 114,
    13.                 "item_4": 63,
    14.                 "item_5": 0,
    15.                 "kills": 12,
    16.                 "deaths": 1,
    17.                 "assists": 20,
    18.                 "leaver_status": 0,
    19.                 "gold": 2268,
    20.                 "last_hits": 104,
    21.                 "denies": 15,
    22.                 "gold_per_min": 588,
    23.                 "xp_per_min": 632,
    24.                 "gold_spent": 13375,
    25.                 "hero_damage": 15128,
    26.                 "tower_damage": 1715,
    27.                 "hero_healing": 0,
    28.                 "level": 17,
    29.                     {
    30.                         "ability": 5002,
    31.                         "time": 1977,
    32.                         "level": 17
    33.                     }
    34.                 ]
    35.                
    36.             },
    37.             {
    38.                 "account_id": 4294967295,
    39.                 "player_slot": 1,
    40.                 "hero_id": 4,
    41.                 "item_0": 0,
    42.                 "item_1": 71,
    43.                 "item_2": 11,
    44.                 "item_3": 63,
    45.                 "item_4": 137,
    46.                 "item_5": 154,
    47.                 "kills": 15,
    48.                 "deaths": 2,
    49.                 "assists": 21,
    50.                 "leaver_status": 0,
    51.                 "gold": 2715,
    52.                 "last_hits": 93,
    53.                 "denies": 12,
    54.                 "gold_per_min": 595,
    55.                 "xp_per_min": 450,
    56.                 "gold_spent": 12325,
    57.                 "hero_damage": 16657,
    58.                 "tower_damage": 3510,
    59.                 "hero_healing": 1110,
    60.                 "level": 14,
    61.                                 // И ТАК ДАЛЕЕ..., ТАКОГО ЖЕ РОДА ДАННЫЕ...
    В итоге цикл foreach почему-то заносит только первую ячейку в БД, остальные проходит и идёт к следующему $match_id (матчу). Почему так ? Заранее спасибо !
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что памятка по оформлению тем, пункт 7.
     
  3. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    Это официальное API от Steam. Они сами предлагают парсить данные для разработчиков. Тут ничего "полунезаконного" нет.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ок.

    Попробуй сделать var_dump($result_json2) перед циклом, что там у тебя вообще приходит после парсинга?
     
  5. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    Код (Text):
    1.  
    2. 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"]=>
    3.  
    4. 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"] почему-то пропускает..
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну тогда вардампи запросы в цикле. Гляди, чем отличаются, и верно ли строятся.
     
  7. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    Странно, но вывод массива показывает все нужные мне записи, а в БД добавляется почему-то только одна первая ячейка массива..
    Ничего понять не могу... Это же не может быть от того, что я использую
    Код (PHP):
    1. $result_json2[match_id] 
    в запросе.. цикл из-за этого не будет же прерываться.. Сижу голову ломаю уже второй день, а как обычно ответ где-то рядом. Причём как только этот запрос соорудил он сработал, я проверил, в БД именно столько записей было сколько в массиве.. ничего вроде не меняя мистически перестало работать.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А, ну вот и ответ. Что за match_id без знака доллара? Переменные в пхп так не указываются:)
    PHP напарывается на нее, интерпретирует как константу, содержащую свое же имя. При переводе в числовой индекс, она конвертируется в ноль. Вот ты и выхватываешь нонстоп нулевую ячейку.

    Включи вывод ошибок на страницу, будет тебе счастье.
     
  9. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    Я так к массиву обращаюсь. Разве это не правильно ? ошибок никаких не выводит. Если использовать вот так: $result_json2[$match_id], то вообще ничего не добавляется в таблицу.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что она нигде не определена.
    И это не единственный косяк, вероятно.
    Да, если это имя записи в ассоциативном массиве, то это будет проканывать, но так делать нельзя. Ключ надо брать либо в кавычки, либо указывать как переменную. Самоинициализирующиеся константы, которые у тебя используются - это адский ад. Не нужно их применять.

    В общем, что я могу сказать, дебажь. Построчно ли, выводом каждого чиха на страницу ли...

    Добавлено спустя 1 минуту 51 секунду:
    И да, а ты в курсе, что в том вардампе, что ты выдал, действительно всего 1 элемент players?
     
  11. Sice

    Sice Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    45
    Симпатии:
    0
    да, я не правильно выразился. Элемент players один, а вот account_id много. Он добавляет в БД только первый account_id каждого match_id. Не пойму почему.. ) за советы спасибо..
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну а что удивляться, если ты-то перебираешь именно players... А внутри players ты ничего не перебираешь.
    Странно, что оно вообще работает, если честно.