Drukowana wersja tematu
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ś:
$members = $datac["membersList"]; // Odwołanie do pliku Json
foreach($members as $member)
{
http://www.php.net/ini_set('display_errors', 1);
http://www.php.net/ini_set('display_startup_errors', 1);
http://www.php.net/error_reporting(E_ALL);
$playertag = $member["tag"]; // Tag gracza w klanie w pętli aby dla każdego połączyło
$url = "https://api.clashofclans.com/v1/players/" . http://www.php.net/urlencode($playertag);
$ch = curl_init($url);
$headr = http://www.php.net/array();
$headr[] = "Accept: application/json";
$headr[] = "Authorization: Bearer ".$token;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
$data = json_decode($res, true);
curl_close($ch);
if (http://www.php.net/isset($data["reason"])) {
$errormsg = true;
}
}
I wywołuję wynik ponownie w pętli:
<?php
foreach($data as $datan){
http://www.php.net/echo $datan["name"]; // Echo dla testu czy otrzymam wszystkie nicki graczy w klanie
}
?>
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 162Linia 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:
["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
<?php
$x = 'abcdef';
$y['name'] = 'ghijk';
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:
{
"tag": "string",
"name": "string",
"expLevel": 0,
"league": {
"id": 0,
"name": "string",
"iconUrls": {
"small": "string",
"large": "string",
"medium": "string"
(...)
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
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ś:
<?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:
$playertag = $_POST['tag'];
$url = "https://api.clashofclans.com/v1/players/" . http://www.php.net/urlencode($playertag);
$ch = curl_init($url);
$headr = http://www.php.net/array();
$headr[] = "Accept: application/json";
$headr[] = "Authorization: Bearer ".$token;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
$data = json_decode($res, true);
curl_close($ch);
if (http://www.php.net/isset($data["reason"])) {
$errormsg = true;
}
Napisany przez: viking 5.06.2019, 13:12:49
To dodaj sobie w pętli jakieś logowanie i zobaczysz co jest nie tak
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
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:
$log = http://www.php.net/date('[Y-m-d H:i:s] ') . $_SERVER['HTTP_USER_AGENT'] . "n";
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ś
class DB
{
private $dbhost;
private $username;
private $password;
private $dbname;
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
Dalej w tym temacie strach pisac bo czort wie co tam nam jeszcze wcisniesz
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
Dalej w tym temacie strach pisac bo czort wie co tam nam jeszcze wcisniesz
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?
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
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?
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
Wypita, możemy iść dalej. I dzięki za odpowiedź
Temat zamknięty, wszystko działa jak powinno.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)