Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP][inne]Błąd w połączeniu API

Napisany przez: Nidan23 5.06.2019, 12:03:24

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. http://www.php.net/ini_set('display_errors', 1);
  9. http://www.php.net/ini_set('display_startup_errors', 1);
  10. http://www.php.net/error_reporting(E_ALL);
  11.  
  12. $playertag = $member["tag"]; // Tag gracza w klanie w pętli aby dla każdego połączyło
  13.  
  14. $url = "https://api.clashofclans.com/v1/players/" . http://www.php.net/urlencode($playertag);
  15.  
  16. $ch = curl_init($url);
  17.  
  18. $headr = http://www.php.net/array();
  19. $headr[] = "Accept: application/json";
  20. $headr[] = "Authorization: Bearer ".$token;
  21.  
  22. curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
  23. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  24. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  26.  
  27. $res = curl_exec($ch);
  28. $data = json_decode($res, true);
  29. curl_close($ch);
  30.  
  31. if (http://www.php.net/isset($data["reason"])) {
  32. $errormsg = true;
  33. }
  34. }


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

  1. <?php
  2. foreach($data as $datan){
  3.  
  4. http://www.php.net/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

Napisany przez: nospor 5.06.2019, 12:05:45

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

Napisany przez: Nidan23 5.06.2019, 12:12:53

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.

Napisany przez: viking 5.06.2019, 12:18:31

Wykonaj sobie kod

  1. <?php
  2. $x = 'abcdef';
  3. $y['name'] = 'ghijk';
  4.  
  5. http://www.php.net/echo $x['name'], '---', $y['name'];


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

Napisany przez: Nidan23 5.06.2019, 12:18:55

I także dotyczy to tylko ostatniego gracza w klanie/połączenia

Napisany przez: nospor 5.06.2019, 12:18:57

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

Napisany przez: Nidan23 5.06.2019, 12:27:25

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. http://www.php.net/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"]=> http://www.php.net/array(4) { ["tag"]=> string(10) "#28LJ0Y0LQ" ["name"]=> string(8) "Nowa Era" ["clanLevel"]=> int(5) ["badgeUrls"]=> http://www.php.net/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"]=> http://www.php.net/array(35) { [0]=> http://www.php.net/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]=> http://www.php.net/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]=> http://www.php.net/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]=> http://www.php.net/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" }

Napisany przez: viking 5.06.2019, 12:42:44

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

Napisany przez: Nidan23 5.06.2019, 12:49:12

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 http://www.php.net/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/" . http://www.php.net/urlencode($playertag);
  4.  
  5. $ch = curl_init($url);
  6.  
  7. $headr = http://www.php.net/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 (http://www.php.net/isset($data["reason"])) {
  21. $errormsg = true;
  22. }

Napisany przez: viking 5.06.2019, 13:12:49

To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak

  1. if (!http://www.php.net/is_array($datan)) {zapisz wiersz do logu}

Napisany przez: Nidan23 10.06.2019, 15:09:31

Cytat(viking @ 5.06.2019, 14:12:49 ) *
To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak
  1. if (!http://www.php.net/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

Napisany przez: nospor 10.06.2019, 15: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

Napisany przez: Nidan23 10.06.2019, 16:38:10

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 = http://www.php.net/date('[Y-m-d H:i:s] ') . $_SERVER['HTTP_USER_AGENT'] . "n";
  2. file_put_contents('log.txt', $log, FILE_APPEND);

Napisany przez: nospor 10.06.2019, 16:40:55

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

Napisany przez: Nidan23 10.06.2019, 17:53:22

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.

Napisany przez: nospor 11.06.2019, 09:33:21

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

Napisany przez: Pyton_000 11.06.2019, 10:51:06

Pokaż człowiecze że kod...

Napisany przez: Nidan23 11.06.2019, 14:29:39

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"?

Napisany przez: nospor 11.06.2019, 14: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

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

Napisany przez: Nidan23 11.06.2019, 22:36:48

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)