Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][json] Zczytanie odpowiedzi strony, Przypisanie odpowiedzi wywołanej strony do zmiennych
amatorzphp
post 6.04.2019, 08:44:47
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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ę.

Ten post edytował amatorzphp 6.04.2019, 09:14:03
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 10:24:53
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


W najprostszej postaci file_get_contents.


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 10:57:01
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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?

Ten post edytował amatorzphp 6.04.2019, 11:19:02
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 11:27:26
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


https://stackoverflow.com/questions/2614870...code-1-and-more
To ten sam serwer?


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 12:58:18
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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

Ten post edytował amatorzphp 6.04.2019, 13:03:43
Go to the top of the page
+Quote Post
zdun
post 6.04.2019, 13:23:35
Post #6





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 29.03.2019

Ostrzeżenie: (0%)
-----


"Dolączył dzisiaj"
heehe
I tak kolorowanie ładne umie zobic. Hehe
taaaa... forum zdycha co nie ?
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 13:30:42
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 13:44:49
Post #8





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 14:21:25
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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:/

Ten post edytował amatorzphp 6.04.2019, 16:43:16
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 19:02:51
Post #10





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tak jak ci mówiłem - zwróć uwagę na 2 argument funkcji. teraz masz obiekt.


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 20:40:16
Post #11





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


  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ć?
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 21:14:16
Post #12





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Daj wynik
  1. var_dump(json_decode($zmienna, true));


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 21:45:36
Post #13





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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ć.

Ten post edytował amatorzphp 6.04.2019, 21:57:01
Go to the top of the page
+Quote Post
viking
post 6.04.2019, 21:56:41
Post #14





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Coś mieszasz. Skoro var_dump zwraca null to jednocześnie echo $v nie może zwracać Array


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 6.04.2019, 22:16:05
Post #15





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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.

Ten post edytował amatorzphp 6.04.2019, 22:39:16
Go to the top of the page
+Quote Post
viking
post 7.04.2019, 05:03:14
Post #16





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Wewnątrz foreach musisz zrobić kolejny który będzie zwracał już właściwy klucz wartość.


--------------------
Go to the top of the page
+Quote Post
amatorzphp
post 7.04.2019, 09:11:26
Post #17





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 6.04.2019

Ostrzeżenie: (10%)
X----


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


Ten post edytował amatorzphp 7.04.2019, 07:31:33
Go to the top of the page
+Quote Post
viking
post 7.04.2019, 13:43:33
Post #18





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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ę.


--------------------
Go to the top of the page
+Quote Post
Kshyhoo
post 8.04.2019, 09:22:08
Post #19





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 15:31