Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][inne]Błąd w połączeniu API
Forum PHP.pl > Forum > Przedszkole
Nidan23
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
nospor
var_dump($data);
ewentualnie
var_dump($datan); w petli
a wszystko bedzie jasne. Na przyszlosc sam sprawdzaj co zawieraja dane na ktorych pracujesz
Nidan23
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.
viking
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ą.
Nidan23
I także dotyczy to tylko ostatniego gracza w klanie/połączenia
nospor
Pokaz dokladnie co zwraca ten va-dump nam bo mam nieodparte wrazenie ze zle odczytujesz co dostajesz
Nidan23
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" }
viking
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ą.
Nidan23
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. }
viking
To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak
  1. if (!is_array($datan)) {zapisz wiersz do logu}
Nidan23
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
nospor
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
Nidan23
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);
nospor
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
Nidan23
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.
nospor
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
Pyton_000
Pokaż człowiecze że kod...
Nidan23
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"?
nospor
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
Nidan23
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.
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.