Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][json] Zczytanie odpowiedzi strony
Forum PHP.pl > Forum > PHP
amatorzphp
Cześć,

Mam następujący problem: napisałem większy skrypt, który na zapytanie:

https:// adres12345. pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2 // spacje zrobione w adresie, żeby na forum się dobrze wyświetlało

Prawidłowo zwraca następujące możliwe odpowiedzi:

[{"zmienna3":"wartosc3","zmienna4":"wartosc4"}] // powstaje przez "return print json_encode($rows);"
lub
[{"zmienna3":"wartosc3","zmienna5":"wartosc5","zmienna6":"wartosc6","zmienna7":"wartosc7"}] // powstaje przez "return print json_encode($rows);"
lub
Odpowiedz_tekstowa_w_przypadku_bledu

(wyświetla je na stronie - jak otworzę przez przeglądarkę to tak się to wyświetli)

PROBLEM:

Chciałbym w innym pliku, móc skorzystać z tego skryptu.

Logika mówi tak:

$czytajZmienne = https:// adres12345. pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2 ;
// spacje zrobione w adresie, żeby na forum się dobrze wyświetlało

Ale nie działa...

Perfekcyjne rozwiązanie to takie, które te parametry zrzucałoby do tablicy asocjacyjnej
$tablica["komunikat"] = "w_przypadku_zwrocenia_stringa";
$tablica["zwrocona_zmienna1"] = "wartosc1";
$tablica["zwrocona_zmienna2"] = "wartosc2";
itd.


Serdeczna prośba o pomoc. Z góry dziękuję.
viking
W najprostszej postaci file_get_contents.
amatorzphp
Dziękuję viking za zainteresowanie problemem.

W pliku odbierającym mam teraz kod:
  1. <?php
  2. $zmienna = file_get_contents("https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2") ;
  3. echo "To jest zmienna: ".$zmienna;
  4. ?>


i efekt wywołania:

  1. Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /home/serwer/ftp/test2.php on line 2
  2. Warning: file_get_contents(): Failed to enable crypto in /home/serwer/ftp/test2.php on line 2
  3. Warning: file_get_contents(https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2): failed to open stream: operation failed in /home/serwer/ftp/test2.php on line 2
  4. To jest zmienna: <pusto, nic nie wyświetliło>


Odwołałem się do adresu względnego na serwerze:

  1. Warning: file_get_contents(/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2dsffAFDfdsf3s4r4acxvcvcvrTCzhnfsMr5yu65dfDfDFGfdgdgGrg4eet55555555gdfdgd
    fgdgdgGdgfd456qgrdahghdsffAFDfdsf3s4r4acxvcvcvrTCzhnfsMr5yu65dfDfDFGfdgdgGrg4eet5
    5555555gdfdgdfgdgdgGdgfd456qgrdahghdsffAFDfdsf3s4r4acxvcvcvrTCzhnfsMr5yu65dfDfDFG
    fdgdgGrg4eet55555555gdfdgdfgdgdgGdgfd456qgrdahghdsffAFDfdsf3s4r4acxvcvcvrTCzhnfsM
    r5yu65dfDfDFGfdgdgGrg4eet55555555gdfdgdfgdgdgGdgfd456qgrdahgh): failed to open stream: File name too long in /home/serwer/ftp/test2.php on line 2
  2. To jest zmienna: <pusto, nic nie wyświetliło>


Skróciłem zmienną - choć nie chciałbym tego robić

  1. Warning: file_get_contents(wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2dsffAF): failed to open stream: No such file or directory in /home/serwer/ftp/test2.php on line 2
  2. To jest zmienna:<pusto, nic nie wyświetliło>


Dodałem adres domeny na początku i wróciłem do błędu z pierwszego wywołania (o SSL) :/

Co mogę spróbować teraz?
viking
https://stackoverflow.com/questions/2614870...code-1-and-more
To ten sam serwer?
amatorzphp
Nie, hosting (nie dedyk) jest na nazwa.pl

W linku, który podesłał viking było kilka propozycji rozwiązań:

  1. function file_get_contents_curl( $url ) {
  2.  
  3. $ch = curl_init();
  4. curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
  5. curl_setopt( $ch, CURLOPT_HEADER, 0 );
  6. curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  7. curl_setopt( $ch, CURLOPT_URL, $url );
  8. curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );
  9. $data = curl_exec( $ch );
  10. curl_close( $ch );
  11. return $data;
  12. }
  13. $zmienna = file_get_contents_curl("https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2");
  14. echo "To jest zmienna: ".$zmienna;


oraz

  1. function file_get_contents_curl( $url ) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE ); curl_setopt( $ch, CURLOPT_HEADER, 0 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE ); $data = curl_exec( $ch ); curl_close( $ch ); return $data; }
  2. $zmienna = file_get_contents_curl("https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2") ;
  3. echo "To jest zmienna: ".$zmienna;


Żadna nie zwraca błędu, ale też niestety żadna nie pobiera treści.

ALE za to trzecia opcja na tej stronie:

  1.  
  2. $arrContextOptions=array(
  3. "ssl"=>array(
  4. "verify_peer"=>false,
  5. "verify_peer_name"=>false,
  6. ),
  7. );
  8. $zmienna = file_get_contents("https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2", false, stream_context_create($arrContextOptions));
  9. echo "To jest zmienna: ".$zmienna;


ZWRÓCIŁA POPRAWNE DANE - dziękuję viking za wsparcie.

Kontynuując wątek główny:
Jak przerobić to:

[{"zmienna3":"wartosc3","zmienna4":"wartosc4"}]
lub
[{"zmienna3":"wartosc3","zmienna5":"wartosc5","zmienna6":"wartosc6","zmienna7":"wartosc7"}]
lub
Odpowiedz_tekstowa_w_przypadku_bledu

na to:

$tablica["komunikat"] = "w_przypadku_zwrocenia_stringa";
$tablica["zwrocona_zmienna1"] = "wartosc1";
$tablica["zwrocona_zmienna2"] = "wartosc2";
itd.

questionmark.gif
zdun
"Dolączył dzisiaj"
heehe
I tak kolorowanie ładne umie zobic. Hehe
taaaa... forum zdycha co nie ?
amatorzphp
Wcześniej mnie tu nie było, więc nie mam porównania, ale 5 godzin na rozwiązanie problemu mnie w pełni satysfakcjonuje:)
Pozostało tylko dopełnienie.

Mam nadzieję, że ktoś w wolnej chwili skrobnie jakąś gotową metodę na to.
viking
Generalnie zależy co chcesz zwrócić. Jeśli masz tam JSON to na stronie gdzie pobierasz odwróć operację przez json_decode() - zwróć uwagę na 2 argument funkcji. Błędy też zależy jakie. Najlepiej na 1 stronie dać odpowiedni błąd od razu do odpowiedzi.
amatorzphp
Strukturę / typ odpowiedzi mam jak poniżej:

[{"zmienna3":"wartosc3","zmienna4":"wartosc4"}] // powstaje przez "return print json_encode($rows);"
lub
[{"zmienna3":"wartosc3","zmienna5":"wartosc5","zmienna6":"wartosc6","zmienna7":"wartosc7"}] // powstaje przez "return print json_encode($rows);"
lub
Odpowiedz_tekstowa_w_przypadku_bledu

Niestety mi to nie wyszło.
Chciałbym tak:

  1. $zmienna = file_get_contents("https://adres12345.pl/wsZrobSwoje.php?zmienna1=wartosc1&zmienna2=wartosc2", false, stream_context_create($arrContextOptions));
  2.  
  3. echo $zmienna."<br><br>";
  4.  
  5. $tablica=json_decode($zmienna);
  6.  
  7. if (zwrócono tekst) wyświetl go.
  8. echo "wartośc dla kolumna 1:".$tablica["Nazwa1Kolumny"]."<br>";
  9. echo "wartość dla kolumna 2: ".$tablica["Nazwa2Kolumny"]."<br>";


$zmienna się wyświetla, wartości dla nazw kolumn już nie:/
viking
Tak jak ci mówiłem - zwróć uwagę na 2 argument funkcji. teraz masz obiekt.
amatorzphp
  1. echo $zmienna."<br><br>"; // <<== ta linia zwraca jsona
  2.  
  3. $tablica1=json_decode($zmienna);
  4. $tablica2=json_decode($zmienna, true);
  5.  
  6. echo "kolumna1: ".$tablica1->{'status'}."<br>";
  7. echo "kolumna1: ".$tablica1['status']."<br>";
  8. echo "kolumna2: ".$tablica2->{'status'}."<br>";
  9. echo "kolumna2: ".$tablica2['status']."<br>";
  10.  
  11. $tablica3 = (array) json_decode($zmienna,true);
  12. echo "<br><br>tablica 3: ".$tablica3['status'];
  13.  
  14. $arr = json_decode($zmienna, true);
  15. foreach ($arr as $k=>$v){
  16. echo $v; // <<== ta linia zwraca "Array"
  17. }


W żadnej konfiguracji nic nie jest zwracane:/

Jak tego użyć?
viking
Daj wynik
  1. var_dump(json_decode($zmienna, true));
amatorzphp
Nie wykombinowałem. Napisz prosze jak się mam dostać do konkretnej zmiennej, gdyż:

  1. $arr = json_decode($zmienna, true);
  2. foreach ($arr as $k=>$v){
  3. echo $v; // zwraca słowo Array
  4. }
  5. echo "<br>1: ";
  6. print_r($arr); // zwraca wszystko z zerem na początku
  7. echo "<br>2: ";
  8. print_r($arr[0]); // zwraca wszystko bez zera na początku


I pomysły mi się skończyły jak do tej zmiennej dotrzeć:/


var_dump pisze: NULL

Minuta przerwy - WS zaczął mi dziwnie odpowiadać. Dam znać.
viking
Coś mieszasz. Skoro var_dump zwraca null to jednocześnie echo $v nie może zwracać Array
amatorzphp
Prawdę mówisz, var_dump zwracało null jak było ponad $zmienną w kodzie biggrin.gif
Poniżej zmiennej wygląda tak:

var_dump:
array(1) { [0]=> array(4) { ["kolumna1"]=> string(17) "wartosc1" ["kolumna2"]=> string(10) "wartosc2" ["kolumna3"]=> string(19) "wartosc3" ["kolumna4"]=> string(19) "wartosc4" } }


Nie wiem co zepsulem chwilę temu, ale przywróciłem się z backupu:)

Dodatkowo:

print_r($arr); zwraca:Array ( [0] => Array ( [kolumna1] => wartosc1 [kolumna2] => wartosc2 [kolumna3] => wartosc3 [kolumna4] => wartosc4 ) )
print_r($arr[0]); zwraca: Array ( [kolumna1] => wartosc1 [kolumna2] => wartosc2 [kolumna3] => wartosc3 [kolumna4] => wartosc4 )

var_dump zwraca wartości z cudzysłowami, a te pozostałe bez.
viking
Wewnątrz foreach musisz zrobić kolejny który będzie zwracał już właściwy klucz wartość.
amatorzphp
Sukces

Wpis bardziej dla kolejnych poszukujących rozwiązań.

Nie wiem co się zmieniło przez noc, ale działa - i to po pierwszej pętli - druga daje te same wyniki, więc chyba jest zbędna:

  1. echo "<br>07.04.2019: ";
  2. $arr2 = json_decode($zmienna, true);
  3. foreach ($arr2 as $k=>$v){
  4. echo "pierwszy for each: ".$v."<br>"; // zwraca słowo "Array"
  5. echo "petla1 zmienna1: ".$v['kolumna1']."<br>"; // zwraca zmienną i wartość poprawnie
  6. echo "petla1 zmienna2: ".$v['kolumna2']."<br>"; // zwraca zmienną i wartość poprawnie
  7. echo "petla1 zmienna3: ".$v['kolumna3']."<br>"; // zwraca zmienną i wartość poprawnie
  8. echo "petla1 zmienna4: ".$v['kolumna4']."<br>"; // zwraca zmienną i wartość poprawnie
  9.  
  10. foreach ($arr2 as $k2=>$v2){ // zwraca słowo "Array"
  11. echo "petla2 zmienna1: ".$v2[kolumna1']."<br>"; // zwraca zmienną i wartość poprawnie
  12. echo "petla2 zmienna2: ".$v2['kolumna2']."<br>"; // zwraca zmienną i wartość poprawnie
  13. echo "petla2 zmienna3: ".$v2['kolumna3']."<br>"; // zwraca zmienną i wartość poprawnie
  14. echo "petla2 zmienna4: ".$v2['kolumna4']."<br>"; // zwraca zmienną i wartość poprawnie
  15. }
  16. }


Pozostał tylko problem jeśli skrypt nagle nie zwróci Jsona tylko łańcuch znaków.
Funkcja, która zwykle daje wynik w postaci jsona, może dawać komunikat błędu, co daje:

  1. return print "Treść komunikatu błędu";



1. Jak tą linijkę zamienić na Jsona, żeby powyższa funkcja mogła ją wyświetlić?
2. Jak się wtedy do niej odwołać?

Pytam i odpowiadam biggrin.gif

1.

  1. return print json_encode("Komunikat błędu");


2.

  1. echo "Komunikat błędu :".$arr2."<br>";



A teraz jak rozróżnić, czy jsona zrobiono ze stringa czy z wielu wartości (w sensie, że to tablica asocjacyjna)? - samo foreach kiedy mamy pojedyńczy string zwraca błąd

Jak na moje, to potrzebna jest funkcja typu: "czy_tablica_asocjacyjna(arr2)" // tak/nie
i wtedy albo robię tak:

  1. echo $v2['kolumna1']


albo tak:

  1. echo $arr2;



Dla dwóch wartości wygląda to tak:

var_dump(json_decode($zmienna, true));
// array(1) { [0]=> array(4) { ["kolumna1"]=> string(17) "wartosc1" ["kolumna2"]=> string(10) "wartosc2" ["kolumna3"]=> string(19) "wartosc3" ["kolumna4"]=> string(19) "wartosc4" } }
// string(34) "Komunikat błędu"

Odpowiedź:

  1. is_array($tablica)


Temat zakończony.
Serdeczne podziękowania dla użytkownika viking



@Kshyhoo
Drogi Użytkowniku / Opiekunie.
Większy autorytet ma się pomagając niż utrudniając zdobywanie wiedzy na tym forum, zamykając kolejne wątki merytoryczne, które otwierałem aby podzielić problem na części pierwsze.
Jak możesz w wątku przeczytać również odpowiadam merytorycznie i opisuję co i jak zrobiłem, że zadziałało.
Tamten wątek zamknąłeś, więc piszę tutaj.
Ten wątek uważam merytorycznie za zakończony - szkoda m tylko, że z taką zaciekłością jak pilnowanie czy ktoś nie otworzył wątku za dużo, nie pomagasz.

Najlepiej bierz przykład z użytkownika viking - czysta merytoryka i chęć pomocy - chyba taka jest idea tego forum, prawda?

Pomijam już kwestię wycieczek personalnych.
Zamiast wycieczek personalnych typu http://forum.php.pl/index.php?showtopic=262589
viking
Generalnie zobacz https://prophp.pl/advice/show/17/jak_przygo...dan_xhr_json%3F akurat dotyczy ajaxa ale zasada działania jest gra ta sama wszędzie (w końcu to tylko żądanie i odpowiedź). W curl możesz odczytać nagłówki i po kodzie błędu zrobić lepszą obsługę.
Kshyhoo
Cytat(amatorzphp @ 7.04.2019, 10:11:26 ) *
@Kshyhoo
Drogi Użytkowniku / Opiekunie.
Większy autorytet ma się pomagając niż utrudniając zdobywanie wiedzy na tym forum, zamykając kolejne wątki merytoryczne, które otwierałem aby podzielić problem na części pierwsze.
Jak możesz w wątku przeczytać również odpowiadam merytorycznie i opisuję co i jak zrobiłem, że zadziałało.
Tamten wątek zamknąłeś, więc piszę tutaj.
Ten wątek uważam merytorycznie za zakończony - szkoda m tylko, że z taką zaciekłością jak pilnowanie czy ktoś nie otworzył wątku za dużo, nie pomagasz.

Najlepiej bierz przykład z użytkownika viking - czysta merytoryka i chęć pomocy - chyba taka jest idea tego forum, prawda?

Pomijam już kwestię wycieczek personalnych.
Zamiast wycieczek personalnych typu http://forum.php.pl/index.php?showtopic=262589

Zakładając konto, potwierdziłeś przestrzeganie regulaminu, więc go przestrzegaj...
Nie mam takiej wiedzy jak Viking, więc nie mogę w żaden sposób pomóc, ale mam obowiązki wynikające z nadanej mi rangi Opiekuna, z której się należycie wywiązuję.

P.S. to Forum umiera, więc nie spodziewaj się szybkiej pomocy, Admini tu nie zaglądają, Modzi są sporadycznie. Niemniej jednak regulamin Forum wciąż obowiązuje wraz z punktem o jednym wątku dotyczącym jednego problemu... i tyle na temat.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.