2016-05-04 3 views
1

Also das JSON-Objekt, das ich versuche zu erreichen, existiert manchmal nicht.JSON gelegentlich undefined - wie überprüfe ich?

Notice: Undefined index: Filme in C: \ xampp \ htdocs \ Beispiel \ game.php

Ich bin für sie in dem Steam-API mit diesem Code auf game.php erreicht:

$GLOBALS['gameTrailer'] = $game_json[$trimmed]['data']['movies'][0]['webm']['max']; 

echo json_encode(array(
    'gameTrailer' => $GLOBALS['gameTrailer'], 
    //+ other variables 
)); 

ich bin mit AJAX zu stoßen game.php wie so auf index.php:

function returnGame() { 
      $.ajax({ 
       url: "game.php", 
       type: "post", 
       dataType: 'json', 
       success: function(data){ 
        console.log(data); 

        $('#video').removeAttr('src'); 

        ///// Game name ///// 
        $('#gameName').html(data.gameName); 
        /////////////////////     

        ////// Append and load video ///// 
        var videoSrc = data.gameTrailer; 
        var video_block = $('#video'); 
        if (videoSrc !== null && videoSrc !== undefined) { 
         video_block.load(); 
         document.querySelector('video').src = videoSrc; 
        } else { 
         $("#gameTrailer").find("#gameScreenshot").attr("src", data.gameScreenshot); 
        } 
        ////////////////////////////////// 
       }, 
      }); 
     } 

Wenn Filme null ist, t Die AJAX-Funktion tut nichts. Das Video wird nicht leer und der Filmtitel wird nicht auf etwas Neues aktualisiert. Wenn Filme nicht undefiniert sind, funktioniert es perfekt.

Ich kann nicht scheinen, $GLOBALS['gameTrailer'] als undefined zu fangen und wiederholen oder ersetzen mit Screenshot statt Film aber nicht auf game.php oder index.php. Ich habe Dinge wie if(empty()) {} und if($GLOBALS['gameTrailer'] == NULL) {} versucht, aber obwohl der Fehlercode auf Spiel.php mir sagt, dass es undefiniert ist, scheint es zu handeln, als ob es nicht ist.

Alle Ideen werden sehr geschätzt. Vielen Dank.

EDIT: Voll game.php Code:

<?php 

if(isset($_POST)) { 
    fetchGame(); 
} 

function fetchGame() { 
    ////////// ID-picker ////////// 
    $f_contents = file("steam.txt"); 
    $url = $f_contents[mt_rand(0, count($f_contents) - 1)];    
    $answer = explode('/',$url); 
    $gameID = $answer[4]; 
    $trimmed = trim($gameID); 

    ////////// Fetch game ////////// 
    $json = file_get_contents('http://store.steampowered.com/api/appdetails?appids='.$trimmed); 
    $game_json = json_decode($json, true); 

    ////////// Store variables ////////// 
    $GLOBALS['gameName'] = $game_json[$trimmed]['data']['name']; 
    $GLOBALS['gameTrailer'] = $game_json[$trimmed]['data']['movies'][0]['webm']['max']; 
    $GLOBALS['gameScreenshot'] = $game_json[$trimmed]['data']['screenshots'][0]['path_full']; 
    $GLOBALS['gameImage'] = $game_json[$trimmed]['data']['header_image']; 
    $GLOBALS['gameId'] = $trimmed; 
    $GLOBALS['free'] = $game_json[$trimmed]['data']['is_free']; 
    $GLOBALS['price'] = $game_json[$trimmed]['data']['price_overview']['final']; 

    if(!isset($GLOBALS['price']) && ($GLOBALS['gameTrailer'])) { 
     fetchGame(); 
    } 

    if ($GLOBALS['free'] === TRUE) { 
     $GLOBALS['final_price'] = "Free"; 
    } elseif($GLOBALS['free'] === FALSE || $GLOBALS['final_price'] != NULL) { 
     $GLOBALS['final_price'] = $GLOBALS['price']; 
    } else { 
     $GLOBALS['final_price'] = "-"; 
    } 
} 

////////// Return to AJAX (index.php) ////////// 
echo 
    json_encode(array(
     'gameName' => $GLOBALS['gameName'], 
     'gameTrailer' => $GLOBALS['gameTrailer'], 
     'gameImage' => $GLOBALS['gameImage'], 
     'gameId' => $GLOBALS['gameId'], 
     'finalPrice' => $GLOBALS['final_price'], 
     'gameScreenshot' => $GLOBALS['gameScreenshot'] 
    )) 
; 

?> 

Es bricht auf der Leitung 23 ($GLOBALS['gameTrailer'] = $game_json[$trimmed]['data']['movies'][0]['webm']['max']; als undefinierten Index)

+0

'Array_key_exists' wird für solche Zwecke verwendet. – lolbas

+0

Oder "isset" ich finde, wird häufiger verwendet. –

+0

@JonStirling hängt von den Bedürfnissen der OPs ab. [Siehe den Unterschied hier.] (Http://stackoverflow.com/a/700257/3745677) – lolbas

Antwort

1

Okay, hier ist ein Beispiel-Update auf den Code zur Verfügung gestellt werde durch die Kommentare zu der Frage.

Hinweise:

1) Sie $GLOBALS nicht verwenden, wenn Sie wissen, was Sie tun und warum Sie es verwenden. In diesem Fall erscheint es nicht erforderlich. Auf $game aktualisiert, da es Spieldetails enthält.

2) Sie müssen überprüfen, ob etwas existiert vor Sie versuchen und darauf zugreifen. Daher ist das zuvor verwendete Isset nutzlos, da Sie bereits auf ein nicht vorhandenes Array-Element zugegriffen haben. Diese Überprüfung wurde entfernt.

3) Rekursion ist gut, aber Sie müssen wieder wissen, was Sie tun und warum Sie es verwenden. Ich vermute, dass dies sowieso unbeabsichtigt war, wurde aber als Teil von 2 entfernt.

4) Sie sagen, dass ein Video (und der Preis nach Aussehen) eine Voraussetzung für diese Funktion ist, also sollten Sie das im Voraus überprüfen. Beachten Sie, dass das erste, nachdem Sie die ID erhalten haben, ist, ob es ein Video gibt. Warum arbeiten wir nur um zu finden, dass wir es nicht benutzen können?

5) Sie möchten ein anderes Spiel ausprobieren, wenn es kein Video gibt, also wickeln wir den Check und die Zuweisungen in eine Schleife und continue, wenn das Video nicht da ist. Beachte, dass du dies auf eine Anzahl von Versuchen beschränken möchtest, sonst wirst du vielleicht ewig warten, bis dein Skript ein Spiel findet, das ein Video enthält, aber das musst du selbst entscheiden.

<?php 
if(isset($_POST)) { 
    fetchGame(); 
} 

function fetchGame() { 
    $gameFound = false; 

    while(!$gameFound) { 
     ////////// ID-picker ////////// 
     $f_contents = file("steam.txt"); 
     $url = $f_contents[mt_rand(0, count($f_contents) - 1)];    
     $answer = explode('/',$url); 
     $gameID = $answer[4]; 
     $trimmed = trim($gameID); 

     ////////// Fetch game ////////// 
     $json =  file_get_contents('http://store.steampowered.com/api/appdetails?appids='.$trimmed); 
     $game_json = json_decode($json, true); 

     if(!isset($game_json[$trimmed]['data']['movies'][0]['webm']['max']) || !isset($game_json[$trimmed]['data']['price_overview']['final'])) { 
      continue; 
     } 

     $gameFound = true; 

     ////////// Store variables ////////// 
     $game['gameName'] = $game_json[$trimmed]['data']['name']; 
     $game['gameTrailer'] = $game_json[$trimmed]['data']['movies'][0]['webm']['max']; 
     $game['gameScreenshot'] = $game_json[$trimmed]['data']['screenshots'][0]['path_full']; 
     $game['gameImage'] = $game_json[$trimmed]['data']['header_image']; 
     $game['gameId'] = $trimmed; 
     $game['free'] = $game_json[$trimmed]['data']['is_free']; 
     $game['price'] = $game_json[$trimmed]['data']['price_overview']['final']; 

     if ($game['free'] === TRUE) { 
      $game['final_price'] = "Free"; 
     } elseif($game['free'] === FALSE || $game['final_price'] != NULL) { 
      $game['final_price'] = $game['price']; 
     } else { 
      $game['final_price'] = "-"; 
     } 
    } 
} 

////////// Return to AJAX (index.php) ////////// 
echo 
    json_encode(array(
     'gameName' => $game['gameName'], 
     'gameTrailer' => $game['gameTrailer'], 
     'gameImage' => $game['gameImage'], 
     'gameId' => $game['gameId'], 
     'finalPrice' => $game['final_price'], 
     'gameScreenshot' => $game['gameScreenshot'] 
    )); 
?> 

Beachten Sie, dass dieser Code nicht getestet ist, aber ich hoffe, Sie erhalten eine Vorstellung davon, wie Sie vorgehen sollen.

+0

'{" gameName ": null," gameTrailer ": null," gameImage ": null," gameId ": null," finalPrice ": null, "gameScreenshot": null} 'auf allen' json_encode' Zeilen, raten sie, weil sie nicht global sind? Soll ich stattdessen den 'json_encode'-Teil in die while-Schleife einfügen? –

+0

Ja, außerhalb des Geltungsbereichs. Es scheint zu funktionieren, den Kodierungsteil innerhalb der Funktion zu haben. Vielen Dank! 1) - Ja, mir wurde schon gesagt. War nur angemessen. 2) - Macht Sinn, aber da ich ziemlich Anfänger bin, ist es schwer für mich zu sehen. 3) - Welche Rekursion? : o 4) - Das ist in der Tat eine großartige Idee, aber ich wüsste nicht, wie das geht, also werde ich es später tun! 5) - Ich weiß, dass die Schleife ein wenig gefährlich aussieht, aber ein Spiel (in meiner Liste) ohne ein Video ist ein seltenes Ereignis. –

+0

Vielen Dank, du bist ein großartiger Lehrer. Es auf meine Stufe zu bringen ist eine Herausforderung. –