NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: JSON vrací NULL

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Viktor Kozák:11.11.2016 23:05

Ahoj,

mám určitý kód který tahá z URL json když si to otevřu v prohlížeči vidím vše co potřebuji (http://prntscr.com/d64ri2) ale když si to vytáhnu pomocí PHP tak nevytáhnu nic viz kód

$service_url = "URL";
//initialize a curl session
$curl = curl_init();
//set options for the transfer
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
//execute the session
$curl_response = curl_exec($curl);
//finish off the session
curl_close($curl);
$curl_jason = var_dump(json_decode($curl_response, true));
var_dump($curl_jason); // vrátí null

také jsou zkoušel pomocí file_get_contents() a taky bez úspěchu

 
Odpovědět
11.11.2016 23:05
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Viktor Kozák
Jan Bezdíček:12.11.2016 3:34
$curl_jason = var_dump(json_decode($curl_response, true));
var_dump($curl_jason); // vrátí null

Pouzivas tam 2x var_dump ... kazdopadne, proc takovou trivialnost resis pomoci cURL ? to je dle me trosku overkill :D

Co treba neco na tento zpusob ?

$json = json_decode(file_get_contents($service_url));
var_dump($json);
 
Nahoru Odpovědět
12.11.2016 3:34
Avatar
Odpovídá na Jan Bezdíček
Viktor Kozák:12.11.2016 9:07

var_dump() jsem z toho zapoměl odmazat každopádně to pořád nejde a pomocí cURL je to proto že pomocí file_get_contents() to nešlo také tak jsem zkusil jinou možnost

 
Nahoru Odpovědět
12.11.2016 9:07
Avatar
Odpovídá na Jan Bezdíček
Viktor Kozák:12.11.2016 10:08

dneska ráno jsem si všimul že to někdy vytáhne a někdy ne :-D takže kód bude asi dobrej

 
Nahoru Odpovědět
12.11.2016 10:08
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Viktor Kozák
Jan Bezdíček:12.11.2016 12:13

Pokud to "nekdy vytahne a nekdy ne", tak ta API si zrejme jiz pamatuje vysledky, ktere ti predala a pokud nejsou zadne nove ... tak jednoduse nevrati nic :D vetsina API tak funguje, sice ne automaticky ale ve stylu, ze ji das nejaky timestamp a ona taha data novejsi nez ten timestamp

 
Nahoru Odpovědět
12.11.2016 12:13
Avatar
Odpovídá na Jan Bezdíček
Viktor Kozák:12.11.2016 13:38

a dá se proti tomu nějak "bránit"?

 
Nahoru Odpovědět
12.11.2016 13:38
Avatar
Filip Šedivý:12.11.2016 19:12

Bránit se proti tomu dá.

Zeptáš se API
Předá ti JSON: Ten uložíš do souboru / tak že si výsledek přecachuje /
Nepředá ti JSON: Načteš cache a budeš s ním pracovat

Nahoru Odpovědět
12.11.2016 19:12
Láska je, když si zapamatujete její IP, abyste obešli zpoždění DNS.
Avatar
Odpovídá na Filip Šedivý
Viktor Kozák:13.11.2016 0:14

napadlo mě udělat si v pythonu script ...

python -> zeptá se API -> uloží do souboru na disk -> PHP vytáhne soubor uloží si json do pole a vypíše

bude to takto fungovat?

nebo jak bych si měl načíst cache?

 
Nahoru Odpovědět
13.11.2016 0:14
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Viktor Kozák
gcx11:13.11.2016 0:21

Ahoj, co přidal k tomu tohle?

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, true);
Editováno 13.11.2016 0:21
 
Nahoru Odpovědět
13.11.2016 0:21
Avatar
Odpovídá na gcx11
Viktor Kozák:13.11.2016 0:27

zkusil jsem, ale nic pořád mě to vrací NULL posílám celej script

<?php

$service_url = "http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?key=A8206F692A738A5BC96EA33D36502F6F&steamid=76561198162222572";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_URL, $service_url);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl1, CURLOPT_FRESH_CONNECT, true);
$curl_response = curl_exec($curl);
curl_close($curl);
$curl_jason = json_decode($curl_response);

var_dump($curl_jason);

jde o to že když si to otevřeš v browseru tak ti ukáže vše potřebné, ale v PHP vrací NULL tak to nechápu

 
Nahoru Odpovědět
13.11.2016 0:27
Avatar
Odpovídá na gcx11
Viktor Kozák:13.11.2016 0:32

právě jsem párkrát refrešnul stránku aniž bych dopsal cokoliv do kódu a vrací to už normálně, tak to nechápu opravdu :-D

 
Nahoru Odpovědět
13.11.2016 0:32
Avatar
Viktor Kozák:13.11.2016 0:35

možná tu bude tím že jsem tady měl jedničku

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, true);

curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);

uvidím jak to bude fungovat teď

 
Nahoru Odpovědět
13.11.2016 0:35
Avatar
NouF
Člen
Avatar
Odpovídá na Viktor Kozák
NouF:13.11.2016 2:49

Off topic, co kutíš?

 
Nahoru Odpovědět
13.11.2016 2:49
Avatar
Odpovídá na NouF
Viktor Kozák:13.11.2016 15:39

snažím se spojit API Faceitu(faceit.com) a Steamu dělám takový web kde si lidi můžou sbírat staty

 
Nahoru Odpovědět
13.11.2016 15:39
Avatar
Odpovídá na Viktor Kozák
Filip Šedivý:13.11.2016 16:39

Proč python, když to jde řešit vše pomocí PHP? Zbytečně jdeš na mouchu slonem.

Nahoru Odpovědět
13.11.2016 16:39
Láska je, když si zapamatujete její IP, abyste obešli zpoždění DNS.
Avatar
Odpovídá na Filip Šedivý
Viktor Kozák:13.11.2016 16:41

asi máš pravdu stáhnu JSON vložím do DB a pokud bude vracet NULL tak vytáhnu z DB

 
Nahoru Odpovědět
13.11.2016 16:41
Avatar
Odpovídá na Viktor Kozák
Filip Šedivý:13.11.2016 16:47

Pokud zrovna potřebuješ JSON ukládat do databáze, tak to udělej. Já bych na to šel spíše přes soubor.

Uložím si soubor a pomocí file_get_content + json_decode bych s ním pak pracoval. Je to rychlejší než pracovat s databází. Ale to jen za předpokladu že nepotřebuješ nějaké složitější filtrování.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
13.11.2016 16:47
Láska je, když si zapamatujete její IP, abyste obešli zpoždění DNS.
Avatar
NouF
Člen
Avatar
Odpovídá na Viktor Kozák
NouF:13.11.2016 20:55

Když to pak budeš chtít testnout, napiš. Hraju jak csgo tak faceit

 
Nahoru Odpovědět
13.11.2016 20:55
Avatar
Odpovídá na NouF
Viktor Kozák:13.11.2016 23:49

OK, pokud nezapomenu ozvu se díky

 
Nahoru Odpovědět
13.11.2016 23:49
Avatar
Odpovídá na Filip Šedivý
Viktor Kozák:13.11.2016 23:54

jsem tu zpět a posílám kus kodu který mě na lokálu vrátí normálně ale na webhostingu prostě nefunguje viz

        public function getApiData($username){

                $faceitApiUrl = 'https://api.faceit.com/api/nicknames/'. $username;
                $result = file_get_contents($faceitApiUrl);
                $faceitData = json_decode($result, true);

                $steamApiUrl = 'https://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?key='.self::APP_STEAM_API_KEY.'&steamid='. $faceitData['payload']['steam_id_64'] . '/r=' . mt_rand(0, 9999);
                $resultSteam = file_get_contents($steamApiUrl);
                $steamData = json_decode($resultSteam, true);

                if($steamData['response']['games']){
                        foreach($steamData['response']['games'] as $var){
                                if($var['appid'] == '730'){             // 730 = CSGO
                                        $temp1 = $var['playtime_forever'];
                                        $totalHours = number_format( $temp1 / 60 );

                                        $temp2 = $var['playtime_2weeks'];
                                        $past2Weeks = number_format( $temp2 / 60 );
                                }
                        }
                }else{
                        $totalHours = 'UNKNOWN';
                        $past2Weeks = 'UNKNOWN';
                }

                $array = array(
                        'nickname'      => $faceitData['payload']['nickname'],                                  // FACEIT USERNAME
                        'steamid64' => $faceitData['payload']['steam_id_64'],                           // STEAM ID 64
                        'country' => $faceitData['payload']['country'],                                         // FACEIT COUNTRY
                        'steamid' => $faceitData['payload']['platforms']['steam'],                      // STEAM ID
                        'level' => $faceitData['payload']['games']['csgo']['skill_level'],      // FACEIT LEVEL
                        'elo' => $faceitData['payload']['games']['csgo']['faceit_elo'],         // FACEIT ELO
                        'membership' => $faceitData['payload']['membership']['type'],           // FACEIT MEMBERSHIP
                        'avatar' => $faceitData['payload']['avatar'],                                           // FACEIT AVATAR
                        'csgo_total' => $totalHours,                                                                            // STEAM CSGO HOURS
                        'csgo_past2weeks' => $past2Weeks,                                                                       // STEAM CSGO HOURS PAST 2 WEEKS
                );

                return $array;
        }

// na lokálu mě steam API vrátí v pořádku ale na serveru mě vrátí NULL kod je uplně totožný
// na konec proměné do URL $steamApiUrl jsem přidal generovat náhodný číslo abych to nezkoušelo cachovat nebo tak něco
// vypadá to že problém bude někde hluboko v php.ini?
 
Nahoru Odpovědět
13.11.2016 23:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.