Pobranie kursu waluty z NBP za pomocą JSON

0

Witam!
Chciałbym pobrać ze strony NBP aktualny kurs EURO i zapisać go do zmiennej. Na chwilę obecną zrobiłem to w taki sposób ( z JSON mam do czynienia pierwszy raz):

<?php

$dane = @file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/eur?format=json');
$json = json_encode($dane);
$wynik = json_decode($json, true);
 
 echo $wynik;

?>

Wynikiem tego jest tablica:

{"table":"A","currency":"euro","code":"EUR","rates":[{"no":"238/A/NBP/2017","effectiveDate":"2017-12-08","mid":4.2026}]}

No i teraz mam pytanie w jaki sposób wyciągnąć jedynie wartość kursu "mid" tak bym mógł ją zapisać do zmiennej w php?

0
$json->rates->mid
0
mr_jaro napisał(a):
$json->rates->mid

Pobiera 0

0

sry

$json->rates[0]->mid

baw się z debuggerem ewentualnie użyj print_r lub var_dump

0

A po co to json_encode?

0
Maciej Cąderek napisał(a):

A po co to json_encode?

Tak napisałem składnie, wydawało mi się, że powinno być poprawnie, pierwszy raz bawię się JSON. Niestety nadal nie mogę wyciągnąć wartości kursu euro. cały czas zwraca mi 0 albo jak używam var_dump NULL. Chcę żeby skrypt automatycznie pobierał z NBP aktualny kurs waluty a następnie zapisał do zmiennej żebym mógł przeliczyć ze złotówek na euro, Brakuje mi jedynie wyciągnięcia kursu z pobranej tablicy.

0

ehhh, nie znasz podstaw i próbujesz coś zrobić, to chociaż zacznij czytać dokumentacje i kombinować a nie, zeby ktoś za ciebie robił takie banały. łap, działa bez problemu

$dane = file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/eur?format=json');
$json = json_decode($dane);
$mid = $json->rates[0]->mid;

var_dump($mid);
2
Venom888 napisał(a):
<?php

$dane = @file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/eur?format=json');
$json = json_encode($dane);
$wynik = json_decode($json, true);
 
 echo $wynik;

?>
  1. Po co kodujesz jeszcze raz dane json ?
  2. json_decode ustawiasz jako array a wyciągasz jak z object
  3. Twój kod by działać powinien wyglądać tak
 // Serwer NBP zwraca dane w formacie JSON
$nbp = file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/eur?format=json');
 // Ustawiamy dane do dekodowania i ustawiamy wartość TRUE bo na wyjściu chcemy tablicę array
$dane = json_decode($nbp,TRUE);
// Wyciąganie z tablicy
$kurs = $dane["rates"][0]["mid"]; // Jeśli w ``json_decode`` jako drugi parametr nie ustawisz nic lub będzie FALSE to wyciągasz dane tak:
//$kurs = $dane->{'rates'}[0]->{'mid'};
echo $kurs; // Wyświetla wynik 
0

Podbiję. Mimo, że upłynęło trochę czasu od założenia wątku to warto dodać parę informacji.
@PiDev: dzięki za gotowe rozwiązanie. Działa, jest proste w formie i skuteczne, tego szukałem. Warto dodać, że kurs wymiany warto zapisywać regularnie do bazy danych i dopiero z niej pobierać informację. W tym celu najlepiej ustawić na serwerze zadanie dla Cron aby wywoływać skrypt o określonym czasie. Jest to zalecane rozwiązanie.
Przykładowa tabela bazy danych może mieć postać:

CREATE TABLE kursy_walut (
  symbol_waluty CHAR(3) COLLATE ascii_bin NOT NULL PRIMARY KEY,
  kurs_wymiany DOUBLE NOT NULL
);

Wtedy na naszej stronie wystarczy się odwoływać do tabeli i nie zalewać za każdym razem zapytaniami serwera NBP. W przypadku utraty połączenia z NBP wciąż będziemi mieli ostatni kurs wymiany.
Zadanie Cron można ustawić raz na godzinę lub inaczej, zależnie od naszych preferencji.

$sql = "UPDATE kursy_walut SET kurs_wymiany = '$kurs' WHERE symbol_waluty = 'EUR';";

Zmienna $kurs to ta sama zmienna co w poście @PiDev pozyskana z tablicy $dane.

0
sylvi91 napisał(a):

Podbiję. Mimo, że upłynęło trochę czasu od założenia wątku to warto dodać parę informacji.

Oj tam trochę, raptem niecałem pięć lat...

@PiDev: dzięki za gotowe rozwiązanie. Działa, jest proste w formie i skuteczne, tego szukałem.

Przez pięć lat???

Warto dodać, że kurs wymiany warto zapisywać regularnie do bazy danych i dopiero z niej pobierać informację. W tym celu najlepiej ustawić na serwerze zadanie dla Cron aby wywoływać skrypt o określonym czasie. Jest to zalecane rozwiązanie.
Przykładowa tabela bazy danych może mieć postać:

CREATE TABLE kursy_walut (
  symbol_waluty CHAR(3) COLLATE ascii_bin NOT NULL PRIMARY KEY,
  kurs_wymiany DOUBLE NOT NULL
);

Trzymać tabelę z dwiema kolumnami dla jednego rekordu? To już lepiej jest moim zdaniem kupić miotacz ognia i podpalać papierosy tym zamiast zapalniczki.

Wtedy na naszej stronie wystarczy się odwoływać do tabeli i nie zalewać za każdym razem zapytaniami serwera NBP. W przypadku utraty połączenia z NBP wciąż będziemi mieli ostatni kurs wymiany.
Zadanie Cron można ustawić raz na godzinę lub inaczej, zależnie od naszych preferencji.

$sql = "UPDATE kursy_walut SET kurs_wymiany = '$kurs' WHERE symbol_waluty = 'EUR';";

Zmienna $kurs to ta sama zmienna co w poście @PiDev pozyskana z tablicy $dane.

Nie napisałeś jeszcze o sql injection w gratisie :)

A tak na serio? Po co odkopujesz temat sprzed X lat?

0
leonpro778 napisał(a):

Oj tam trochę, raptem niecałem pięć lat...

No tak, ale temat wciąż aktualny i ważne, że sposób opisany w wątku wciąż działa.

Przez pięć lat???

Nie no. Szukałem dzisiaj i na polskojęzycznej stronie znalazłem sprawdzone rozwiązanie. Szukałem po angielsku i radzili aby dane o kursach walut zapisywać do własnej bazy danych w swoich projektach.

Trzymać tabelę z dwiema kolumnami dla jednego rekordu? To już lepiej jest moim zdaniem kupić miotacz ognia i podpalać papierosy tym zamiast zapalniczki.

Bo można pobrać ze strony NBP przelicznik dla innych walut jeśli kogoś to interesuje.
Ja w swoim projekcie używam na razie przelicznika do EURO, ale będę miał zamiar dodać inne waluty.
W tej linijce:

$nbp = file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/eur?format=json');

wystarczy podać kod ISO waluty i wtedy pobierzemy jej kurs.
np: tak

$iso_waluty = "USD";

$nbp = file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/'.$iso_waluty.'?format=json');

A tak na serio? Po co odkopujesz temat sprzed X lat?

To miałem otwierać nowy wątek? Przecież nie był zamknięty przez moderację. Gdyby był zamknięty to bym nie napisał i nie zawracał sobie głowy dodaniem istotnej informacji o sposobie aktualizacji kursów walut na potrzeby własnych projektów.
Ja się tym akurat teraz zajmuję. Dodaje do swojej strony www.akwa-market.pl nową funkcjonalność. Ceny będzię można wyświetlać w wielu walutach. Strona już jest dwujęzyczna, a mam zamiar dodać jeszcze inne języki.

Kursy walut dla własnego projektu trzeba zapisywać do bazy danych tego projektu, Nie można polegać tylko na dynamicznym odczycie na bieżąco. Pobranie danej to jedno, ale trzeba umieć ją wykorzystać. Myślałem, że to po prostu przydatna informacja dla początkujących programistów, aby wykorzystywać sprawdzone sposoby. To tyle z mojej strony. Pozdro.

0

w tej tabeli brakuje daty kiedy obowiązywał dany kurs, i wtedy nie update tylko insert robisz — Miang

@Miang: Akurat kurs wymiany mnie tylko interesował, ale oczywiście można dopisać datę, bo w tablicy $dane jest taka informacja zgodnie z tym co zwraca zapytanie

$nbp = file_get_contents('http://api.nbp.pl/api/exchangerates/rates/a/'.$iso_waluty.'?format=json');

a jest to konkretnie: effectiveDate w formacie json:

{"table":"A","currency":"dolar amerykański","code":"USD","rates":[{"no":"116/A/NBP/2022","effectiveDate":"2022-06-17","mid":4.4630}]} 

Wtedy odwołujesz się do tablicy $dane tak:

$data_kursu = $dane["rates"][0]["effectiveDate"];

Jeśli natomiast chodzi o zapisanie tego do bazy danych to w moim przypadku INSERT stosujesz wtedy gdy rekordu o danej walucie nie ma jeszcze w bazie i zapisujesz go po raz pierwszy, a UPDATE robisz, gdy dane o konkretnej walucie były już w tabeli.
Nie chcę przechowywać informacji o zmianach kursów danej waluty tylko ostatni średni kurs. Jeden rekord dla danej waluty wystarczy mi w projekcie, nie ma potrzeby stosować INSERT z nową datą.

Dla zainteresowanych na stronie NBP jest apisane to API w szczegółach. My w tym przykładzie odwołujemy się do tabeli A - jak average, czyli średni. Ale można pobrać różne dane o kursach walut i nawet kursach złota.

Warto się zapoznać.

http://api.nbp.pl/en.html

Fragment z opisu.

Exchange rate query parameters

{table} – table type (A, B, or C)
{code} – a three- letter currency code (ISO 4217 standard)
{topCount} – a number determining the maximum size of the returned data series
{date}, {startDate}, {endDate} – a date in the YYYY-MM-DD format (ISO 8601 standard)

Queries for complete tables

Templates of enquiries about complete tables of currency exchange rates

Current table of exchange rates of type {table}

http://api.nbp.pl/api/exchangerates/tables/{table}/

Series of latest {topCount} tables of exchange rates of type {table}

http://api.nbp.pl/api/exchangerates/tables/{table}/last/{topCount}/

Exchange rate table of type {table} published today (or lack of data)

http://api.nbp.pl/api/exchangerates/tables/{table}/today/

Exchange rate table of type {table} published on {date} (or lack of data)

http://api.nbp.pl/api/exchangerates/tables/{table}/{date}/

Series of exchange rate tables of type {table} published from {startDate} to {endDate} (or lack of data)

http://api.nbp.pl/api/exchangerates/tables/{table}/{startDate}/{endDate}/

Pozdrawiam.

0

dobra, ale co dalej robisz z tym kursem? tylko pokazujesz ? a może używasz do jakichś obliczen? — Miang

@Miang: Służy tylko do wyświetlania ceny produktów w innych walutach. Podstawowo jest w PLN, ale właśnie wprowadzam EUR i USD. Serwis działać będzie na 3 domenach pod tą samą nazwą akwa-market .
Na tld pl walutą bazową będzie PLN. Na tld EU będzie to EUR (na razie nie wiem jak, ale jest podobne API dostępne z banku ECB), a na tld com walutą bazową będzie USD. A same ceny mam zamiar wyświetlać co najmniej w tych trzech walutach na każdej ze stron. Zatem i tak muszę zapisywać dane o kursach regularnie do bazy danych, aby w razie problemów z serwisem api.nbp.pl albo ecb nie utracić możliwości wyświetlania cen w innych walutach.

1

Najwazniejsze to jest pobrac kurs z dnia poprzedniego, bo tylko taki daje sie na fakture, wiec one sie nie zmieniaja i taki kurs powinienes zapisywac do bazy wraz z zamowieniem. Bo jak wystawisz fakture to kurs ma byc w niej zawarty dlatego nie musisz szukac kursu z danego dnia w przeszlosci. jesli strona z kursem nie dziala to mozesz dac wtedy info przy cenach produktu z kursem z ostatniego zapisanego dnia i informacja ze to cena przyblizona. az nie zostanie prawidlowo pobrany kurs

1 użytkowników online, w tym zalogowanych: 0, gości: 1