Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][inne]Błąd w połączeniu API
Nidan23
post 5.06.2019, 12:03:24
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Mam dość spory problem, prawdopodobnie w pętli, którego nie umiem rozwiązać. Otóż chciałbym połączyć się do API dla każdego gracza w klanie z osobna, więc robię takie coś:

  1.  
  2. $members = $datac["membersList"]; // Odwołanie do pliku Json
  3.  
  4. foreach($members as $member)
  5. {
  6.  
  7.  
  8. ini_set('display_errors', 1);
  9. ini_set('display_startup_errors', 1);
  10.  
  11. $playertag = $member["tag"]; // Tag gracza w klanie w pętli aby dla każdego połączyło
  12.  
  13. $url = "https://api.clashofclans.com/v1/players/" . urlencode($playertag);
  14.  
  15. $ch = curl_init($url);
  16.  
  17. $headr = array();
  18. $headr[] = "Accept: application/json";
  19. $headr[] = "Authorization: Bearer ".$token;
  20.  
  21. curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
  22. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  23. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  24. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  25.  
  26. $res = curl_exec($ch);
  27. $data = json_decode($res, true);
  28. curl_close($ch);
  29.  
  30. if (isset($data["reason"])) {
  31. $errormsg = true;
  32. }
  33. }


I wywołuję wynik ponownie w pętli:

  1. <?php
  2. foreach($data as $datan){
  3.  
  4. echo $datan["name"]; // Echo dla testu czy otrzymam wszystkie nicki graczy w klanie
  5.  
  6. }
  7. ?>


I problem pojawia się po wywołaniu, bo jeżeli użyję "echo $data["name"];" w pętli, to otrzymuję nick tego samego gracza * ilość graczy w klanie (gdy użyję bez pętli to otrzymuję ten nick tylko raz) i w każdy przypadku jest to nick ostatniego gracza w klanie, czyli podejrzewam, dane z ostatniego połączenia, a gdy użyję poprawnie "$datan["name"];" to otrzymuję takie cudo:

Warning: Illegal string offset 'name' in /var/www/html/klan.php on line 162
#
Warning: Illegal string offset 'name' in /var/www/html/klan.php on line 162
P
Warning: Illegal string offset 'name' in /var/www/html/klan.php on line 162
mNowa Era
Notice: Undefined index: name in /var/www/html/klan.php on line 162

Notice: Undefined index: name in /var/www/html/klan.php on line 162

Notice: Undefined index: name in /var/www/html/klan.php on line 162

Notice: Undefined index: name in /var/www/html/klan.php on line 162


Linia 162 to linia gdzie używam "echo $datan["name"];"


Jakieś pomysły jak mógłbym to rozwiązać/naprawić?

//Edited

Ten post edytował Nidan23 5.06.2019, 12:05:14
Go to the top of the page
+Quote Post
nospor
post 5.06.2019, 12:05:45
Post #2





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




var_dump($data);
ewentualnie
var_dump($datan); w petli
a wszystko bedzie jasne. Na przyszlosc sam sprawdzaj co zawieraja dane na ktorych pracujesz


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Nidan23
post 5.06.2019, 12:12:53
Post #3





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Niedokońca(?) rozumiem, co to miało dać, bo widzę, że poprawnie wywołałem dane, ponieważ po zastosowaniu "var_dump($data);" fragment tego co chcę wywołać wygląda tak:

  1. ["name"]=> string(8) "POGROMCA"


A więc tak jak się spodziewałem i nie rozumiem co to ma dać, możesz rozjaśnić?


PS. Po wywołaniu w pętli dostaję to samo tylko pomnożone razy ilość graczy w klanie.
Go to the top of the page
+Quote Post
viking
post 5.06.2019, 12:18:31
Post #4





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


Wykonaj sobie kod
  1. <?php
  2. $x = 'abcdef';
  3. $y['name'] = 'ghijk';
  4.  
  5. echo $x['name'], '---', $y['name'];


Jak widzisz dane nie są tym co mówisz że są.


--------------------
Go to the top of the page
+Quote Post
Nidan23
post 5.06.2019, 12:18:55
Post #5





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


I także dotyczy to tylko ostatniego gracza w klanie/połączenia
Go to the top of the page
+Quote Post
nospor
post 5.06.2019, 12:18:57
Post #6





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




Pokaz dokladnie co zwraca ten va-dump nam bo mam nieodparte wrazenie ze zle odczytujesz co dostajesz


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Nidan23
post 5.06.2019, 12:27:25
Post #7





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Dostaję to co dostawałem tam:
Warning: Illegal string offset 'name' in /var/www/html/klan.php on line 164
a---ghijk


No bo nie jest zdefiniowane $x["name"], tylko $x.

Tylko, że tutaj schemat pliku Json wygląda tak:

  1. {
  2. "tag": "string",
  3. "name": "string",
  4. "expLevel": 0,
  5. "league": {
  6. "id": 0,
  7. "name": "string",
  8. "iconUrls": {
  9. "small": "string",
  10. "large": "string",
  11. "medium": "string"
  12. (...)


W gdy wywołuję te same dane, ale w stosunku do jednego gracza, bądź klanu, to to działa, ponieważ inne podstrony śmigają.


// Dokladnie wszystko? Dostaję dokładnie to samo co tutaj wstawiłem, tylko jeszcze więcej (uciąłem, żeby nie śmiecić) + uzupełnione o dane gracza


Dostaję takie coś i jeszcze więcej, ale nie mieści się w poście

  1. array(22) { ["tag"]=> string(10) "#9J9R9Y88Q" ["name"]=> string(8) "POGROMCA" ["townHallLevel"]=> int(9) ["expLevel"]=> int(78) ["trophies"]=> int(501) ["bestTrophies"]=> int(1254) ["warStars"]=> int(497) ["attackWins"]=> int(0) ["defenseWins"]=> int(0) ["builderHallLevel"]=> int(3) ["versusTrophies"]=> int(109) ["bestVersusTrophies"]=> int(109) ["versusBattleWins"]=> int(2) ["role"]=> string(6) "member" ["donations"]=> int(0) ["donationsReceived"]=> int(62) ["clan"]=> array(4) { ["tag"]=> string(10) "#28LJ0Y0LQ" ["name"]=> string(8) "Nowa Era" ["clanLevel"]=> int(5) ["badgeUrls"]=> array(3) { ["small"]=> string(93) "https://api-assets.clashofclans.com/badges/70/o_dDPrTUgFSg7stNzK2WVl4WXcLVaInD_rKlemR7wOQ.png" ["large"]=> string(94) "https://api-assets.clashofclans.com/badges/512/o_dDPrTUgFSg7stNzK2WVl4WXcLVaInD_rKlemR7wOQ.png" ["medium"]=> string(94) "https://api-assets.clashofclans.com/badges/200/o_dDPrTUgFSg7stNzK2WVl4WXcLVaInD_rKlemR7wOQ.png" } } ["achievements"]=> array(35) { [0]=> array(7) { ["name"]=> string(14) "Bigger Coffers" ["stars"]=> int(3) ["value"]=> int(11) ["target"]=> int(10) ["info"]=> string(34) "Upgrade a Gold Storage to level 10" ["completionInfo"]=> string(30) "Highest Gold Storage level: 11" ["village"]=> string(4) "home" } [1]=> array(7) { ["name"]=> string(24) "Get those other Goblins!" ["stars"]=> int(1) ["value"]=> int(27) ["target"]=> int(200) ["info"]=> string(33) "Win 200 Stars on the Campaign Map" ["completionInfo"]=> string(25) "Stars in Campaign Map: 27" ["village"]=> string(4) "home" } [2]=> array(7) { ["name"]=> string(15) "Bigger & Better" ["stars"]=> int(3) ["value"]=> int(9) ["target"]=> int(8) ["info"]=> string(28) "Upgrade Town Hall to level 8" ["completionInfo"]=> string(26) "Current Town Hall level: 9" ["village"]=> string(4) "home" } [3]=> array(7) { ["name"]=> string(13) "Nice and Tidy" ["stars"]=> int(3) ["value"]=> int(1653) ["target"]=> int(500) ["info"]=> string(43) "Remove 500 obstacles (trees, rocks, bushes)" ["completionInfo"]=> string(29) "Total obstacles removed: 1653" ["village"]=> string(4) "home" }


Ten post edytował Nidan23 5.06.2019, 12:28:12
Go to the top of the page
+Quote Post
viking
post 5.06.2019, 12:42:44
Post #8





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


Cytat(Nidan23 @ 5.06.2019, 13:27:25 ) *
Dostaję to co dostawałem tam:
Warning: Illegal string offset 'name' in /var/www/html/klan.php on line 164
a---ghijk


Co daje ci odpowiedź że na którymś etapie iteracji masz do czynienia ze stringiem a nie tablicą.


--------------------
Go to the top of the page
+Quote Post
Nidan23
post 5.06.2019, 12:49:12
Post #9





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(viking @ 5.06.2019, 13:42:44 ) *
Co daje ci odpowiedź że na którymś etapie iteracji masz do czynienia ze stringiem a nie tablicą.

Co jednak nie daje odpowiedzi, jak uzyskać dane o każdym z graczy, a nie o jednym

W przypadku zastosowania takiego czegoś:

  1. <?php echo $data["name"]; ?>


Otrzymuje poprawny zwrot informacji, a połączenie jest inne, lecz jedyną zmianą jest brak pętli oraz konkretny tag, czyli:

  1. $playertag = $_POST['tag'];
  2.  
  3. $url = "https://api.clashofclans.com/v1/players/" . urlencode($playertag);
  4.  
  5. $ch = curl_init($url);
  6.  
  7. $headr = array();
  8. $headr[] = "Accept: application/json";
  9. $headr[] = "Authorization: Bearer ".$token;
  10.  
  11. curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
  12. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  13. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15.  
  16. $res = curl_exec($ch);
  17. $data = json_decode($res, true);
  18. curl_close($ch);
  19.  
  20. if (isset($data["reason"])) {
  21. $errormsg = true;
  22. }
Go to the top of the page
+Quote Post
viking
post 5.06.2019, 13:12:49
Post #10





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak
  1. if (!is_array($datan)) {zapisz wiersz do logu}


--------------------
Go to the top of the page
+Quote Post
Nidan23
post 10.06.2019, 15:09:31
Post #11





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(viking @ 5.06.2019, 14:12:49 ) *
To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak
  1. if (!is_array($datan)) {zapisz wiersz do logu}


Dla 5/32 dostaję zwrot, że jest a dla pozostałych 27, że nie jest, jakieś pomysły? Bo to chyba trochę dziwne, skoro łączę się w petli, dla każdego tak samo, heh
Go to the top of the page
+Quote Post
nospor
post 10.06.2019, 15:12:17
Post #12





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




Napisano ci bys zapisal zwrotke do logow i sprawdzil co jest z nia nie tak. Zrobiles to? Tam bedziesz mial prawdopodobnie komunikat czemu jest zle


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Nidan23
post 10.06.2019, 16:38:10
Post #13





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(nospor @ 10.06.2019, 16:12:17 ) *
Napisano ci bys zapisal zwrotke do logow i sprawdzil co jest z nia nie tak. Zrobiles to? Tam bedziesz mial prawdopodobnie komunikat czemu jest zle


Ale logu jakiego, httpd? Skąd domysł,że korzystam z VPS'a, bo inaczej przecież nie ma dostępu do logów, przynajmniej ja nie umiem, google milczy jak to zrobić w php, jedyne co mówi, to to jak zapisać coś w pliku tekstowym, jeśli to nazywacie logiem, to poproszę po polsku...

I wiersz czego? Bo rozsądnych rozwiązań znalazłem tylko to:

  1. $log = date('[Y-m-d H:i:s] ') . $_SERVER['HTTP_USER_AGENT'] . "n";
  2. file_put_contents('log.txt', $log, FILE_APPEND);
Go to the top of the page
+Quote Post
nospor
post 10.06.2019, 16:40:55
Post #14





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




Cytat
Skąd domysł,że korzystam z VPS'a,
Nas oskarazasz o jakies domysly a sam je robisz... Do jakiegokolwiek logu, moze to byc zwykly plik alamakota.txt. Jaki wiersz? Odpowiedz jaka dostajesz z CURL


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Nidan23
post 10.06.2019, 17:53:22
Post #15





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(nospor @ 10.06.2019, 17:40:55 ) *
Nas oskarazasz o jakies domysly a sam je robisz... Do jakiegokolwiek logu, moze to byc zwykly plik alamakota.txt. Jaki wiersz? Odpowiedz jaka dostajesz z CURL

Jak napisał tak cytuje, poza tym problem z głowy, wrzuciłem zapytanie do bazy, więc dla każdego zapisuje rekordy w bazie i zwyczajnie będę jest "wybierać" z bazy.


Jednak mam malutki problem, czy da się jakoś zastąpić "class" w php? Bo mam takie coś

  1. class DB
  2. {
  3.  
  4. private $dbhost;
  5. private $username;
  6. private $password;
  7. private $dbname;
  8. private $conn;


I gdy wrzucam to w pętle to wiadomo, nie działa, bo nie można zdefiniować kilkukrotnie tej samej klasy, więc wyrzucam poza klasę, ale wtedy nie wprowadza pełnych rekordów, bo to co jest w pliku dla pojedyńczego gracza nie ma w pliku dla klanu i odwrotnie,i czy da się to jakkolwiek zastąpić?

EDIT. Zapytanie do pętli.
Go to the top of the page
+Quote Post
nospor
post 11.06.2019, 09:33:21
Post #16





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




Cytat
Jak napisał tak cytuje
No nie, my ci pisalismu o LOGACH a ty zas zaczales "cytowac" ze ci o VPS mowimy. Jak masz zwidy to pretensje do siebie a nam nie wkladaj w usta slow, ktorych nie powiedzielismy tongue.gif
Dalej w tym temacie strach pisac bo czort wie co tam nam jeszcze wcisniesz wink.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post 11.06.2019, 10:51:06
Post #17





Grupa: Zarejestrowani
Postów: 7 809
Pomógł: 1373
Dołączył: 26.10.2005

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


Pokaż człowiecze że kod...
Go to the top of the page
+Quote Post
Nidan23
post 11.06.2019, 14:29:39
Post #18





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(nospor @ 11.06.2019, 10:33:21 ) *
No nie, my ci pisalismu o LOGACH a ty zas zaczales "cytowac" ze ci o VPS mowimy. Jak masz zwidy to pretensje do siebie a nam nie wkladaj w usta slow, ktorych nie powiedzielismy tongue.gif
Dalej w tym temacie strach pisac bo czort wie co tam nam jeszcze wcisniesz wink.gif



Każecie mi wpisać wiersz do logu, ale jestem początkujący, dlatego piszę tematy w przedszkolu, i z tego ja wiem, to oryginalnie strona/aplikacja webowa nie ma logów, tylko sam serwer Apache ma, więc Logicznie, próbując się domyślić o co wam chodzi, bo tak jest w większości przypadków (podejrzewam, że w obie strony), to zakładam, że wy założyliście, że mam vps'a czy dedykowanego, bo go mam, więc sama myśl była jeszcze krok bliżej mnie, niż gdybym go nie miał. To jest proste, logiczne, niczego wam do ust nie wkładam, gustuję w kobietach, nie mam pretensji, jeżeli tak to odbieracie to serio? Ile macie lat? Tyle co ja, żeby myśleć, że cały świat jest nastawiony przeciwko wam? I nie diaboł wie, tylko ładnie proszę o odpowiedź, czy da się jakoś zastąpić "class" w php.

Jeżeli nie chcecie, żebym pisał w taki a nie inny sposób, to piszcie jasno i wyraźnie co mam zrobić, ale czego mogę użyć, bo wasze wypowiedzi można interpretować na tyle różnych sposobów, a informatyka jest podobno ścisła....


BTW. Czym ma się niby różnić zapisanie wierszu od logu od wywołania czegoś (np. tej zmiennej) przez "echo"?
Go to the top of the page
+Quote Post
nospor
post 11.06.2019, 14:48:58
Post #19





Grupa: Moderatorzy
Postów: 34 718
Pomógł: 5772
Dołączył: 27.12.2004




No i dobrze chlopie. Kazdy ma prawo byc poczatkujacy. Ale nie pisz, ze my cos zakladamy kiedy to ty zakladasz i ze nas doslownie cytujesz w momencie gdy mijasz sie z prawda. O to mi chodzilo. Juz , wporzadku? Melaska wypita? Mozemy isc dalej? smile.gif

Cytat
Czym ma się niby różnić zapisanie wierszu od logu od wywołania czegoś (np. tej zmiennej) przez "echo"?
Mniej wiecej tym samym co wlozenie jablka do koszyka a postawieniu go na taborecie. Rob jak ci wygodniej. Zaproponowano ci koszyk. Skoro wygodniej ci sie przeglada jablko na taborecie to stawiaj na taboret smile.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Nidan23
post 11.06.2019, 22:36:48
Post #20





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 26.04.2019

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


Cytat(nospor @ 11.06.2019, 15:48:58 ) *
No i dobrze chlopie. Kazdy ma prawo byc poczatkujacy. Ale nie pisz, ze my cos zakladamy kiedy to ty zakladasz i ze nas doslownie cytujesz w momencie gdy mijasz sie z prawda. O to mi chodzilo. Juz , wporzadku? Melaska wypita? Mozemy isc dalej? smile.gif

Mniej wiecej tym samym co wlozenie jablka do koszyka a postawieniu go na taborecie. Rob jak ci wygodniej. Zaproponowano ci koszyk. Skoro wygodniej ci sie przeglada jablko na taborecie to stawiaj na taboret smile.gif


Wypita, możemy iść dalej. I dzięki za odpowiedź wink.gif

Temat zamknięty, wszystko działa jak powinno.
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: 17.09.2019 - 18:27