Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> waluty z NBP, klasa, php5
stanik_jr
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 30.03.2005
Skąd: Łódź

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


Witam,
poszukiwałem klasy do obsługi XML'a z kursami walut z NBP i w końcu napisałem sam, może komuś się przyda

  1. <?php
  2. /**
  3.  * Pobieranie kursów walut z NBP
  4.  * 
  5.  * Klasa do obsługi plików xml z kursami walut udostępnianych przez NBP
  6.  * 
  7.  * @author Bartłomiej Staniszczak <b_staniszczak at tlen dot pl>
  8.  * @copyright 2007 Bartłomiej Staniszczak
  9.  * @version 1.0
  10.  *
  11.  */
  12. class WalutyNBP {
  13.  
  14. /**
  15.  * Tablica z wszystkimi kursami zczytanymi z XML
  16.  *
  17.  * @var array
  18.  */
  19. private $arrKursy = array();
  20.  
  21. /**
  22.  * Zmienna zawierająca datę aktualizacji kursów
  23.  *
  24.  * @var string
  25.  */
  26. private $strData;
  27.  
  28. /**
  29.  * Konstruktor parsuje xml'a do tablicy
  30.  *
  31.  * @param string $strEncoding
  32.  * @param string $strUrlXml
  33.  */
  34. public function __construct($strEncoding='UTF-8',$strUrlXml='http://www.nbp.pl/Kursy/xml/'){
  35. $strUrlXml=$strUrlXml.$this->aktualny_xml().'.xml';
  36. $objXml = new XMLReader();
  37. if(function_exists('curl_init')){
  38. $objXml->XML($this->ccurl_fopen($strUrlXml));
  39. }
  40. else{
  41. $objXml->open($strUrlXml);
  42. }
  43. $j=0;
  44. while($objXml->read()){
  45. if($objXml->name === 'data_publikacji' && $objXml->nodeType==1){
  46. $objXml->read();
  47. $this->strData=$objXml->value;
  48. }
  49. if($objXml->depth==3){
  50. if($j==4){
  51. $j=0;
  52. $this -> arrKursy[$arrWaluta[2]]=$arrWaluta;
  53. $arrWaluta=array();
  54. }
  55. if($strEncoding!='ISO-8859-2'){
  56. $arrWaluta[$j]=iconv('ISO-8859-2',$strEncoding,$objXml->value);
  57. }
  58. else{
  59. $arrWaluta[$j]=$objXml->value;
  60. }
  61. $j++;
  62. }
  63. }
  64. }
  65.  
  66. /**
  67.  * Otwieranie pliku
  68.  * 
  69.  * Metoda otwiera plik i zwraca jego zawartość
  70.  *
  71.  * @param string $strUrl
  72.  * @return mixed
  73.  */
  74. private function ccurl_fopen ($strUrl){
  75. $strUser_agent = "Mozilla/8.0 (Windows 2008 SP32 + 3patch)";
  76. $resCh = curl_init();
  77. curl_setopt ($resCh, CURLOPT_URL, $strUrl);
  78. curl_setopt ($resCh, CURLOPT_USERAGENT, $strUser_agent);
  79. curl_setopt ($resCh, CURLOPT_COOKIEJAR, "cookie.txt");
  80. curl_setopt ($resCh, CURLOPT_HEADER, 0);
  81. curl_setopt ($resCh, CURLOPT_RETURNTRANSFER, 1);
  82. curl_setopt ($resCh, CURLOPT_FOLLOWLOCATION, 1);
  83. curl_setopt ($resCh, CURLOPT_TIMEOUT, 120);
  84. $mixResult = curl_exec ($resCh);
  85. curl_close($resCh);
  86. return $mixResult;
  87. }
  88.  
  89. /**
  90.  * Aktualna nazwa pliku XML z danymi
  91.  *
  92.  * @param string $strTabela
  93.  * @return string
  94.  */
  95. private function aktualny_xml($strTabela='a'){
  96. if(function_exists('curl_init')){
  97. $resLista = $this->ccurl_fopen('http://www.nbp.pl//Kursy/xml/dir.txt');
  98. $arrPlikiXML = explode("n",$resLista);
  99. }
  100. elseif(!function_exists('fsockopen') || !function_exists('fputs') || !function_exists('feof') || !function_exists('fgets')){
  101. $resPolalczenie = fsockopen ( "www.nbp.pl", 80 );
  102. $strHeaders = 'GET /Kursy/xml/dir.txt HTTP/1.0' . "rn"; 
  103. $strHeaders .= 'Host: www.nbp.pl' . "rn";
  104. $strHeaders .= 'User-Agent: Mozilla/8.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.7.10) Gecko/20050717 Firefox/1.0.6' . "rnrn";
  105.  
  106. fputs ( $resPolalczenie, $strHeaders );
  107. while ( ! feof ( $resPolalczenie ) ) {
  108. $arrPlikiXML[] = fgets ( $resPolalczenie, 128 ); 
  109. }
  110. fclose ( $resPolalczenie );
  111. }
  112. $arrPlikiXML = array_reverse ($arrPlikiXML);
  113. for($i=0; $i<=3; $i++){
  114. $strNazwa=trim($arrPlikiXML[$i]);
  115. if(substr($strNazwa,0,1)==$strTabela){
  116. $strDzisiejszyXML=trim($arrPlikiXML[$i]);
  117. }
  118. }
  119. return $strDzisiejszyXML;
  120. }
  121.  
  122. /**
  123.  * Zwraca wybrane waluty
  124.  * 
  125.  * Metoda zwraca informacje o podanych w parametrze walutach
  126.  *
  127.  * @param mixed $mixWaluty
  128.  * @return array
  129.  */
  130. public function zwroc_waluty($mixWaluty=array()){
  131. if(is_array($mixWaluty) && count($mixWaluty)==0){
  132. return $this->arrKursy;
  133. }
  134. elseif(!is_array($mixWaluty)){
  135. if(array_key_exists($mixWaluty,$this->arrKursy))
  136. return $this->arrKursy[$mixWaluty];
  137. return FALSE;
  138. }
  139. else{
  140. foreach($this->arrKursy AS $strKlucz => $arrWartosc){
  141. if(in_array($strKlucz,$mixWaluty))
  142. $arrWynikowa[$strKlucz]=$this->arrKursy[$strKlucz];
  143. }
  144. if(count($arrWynikowa)>0) 
  145. return $arrWynikowa;
  146. return FALSE;
  147. }
  148. return FALSE;
  149. }
  150.  
  151. /**
  152.  * Data aktualizacji kursów
  153.  *
  154.  * @return string
  155.  */
  156. public function getData(){
  157. return $this->strData;
  158. }
  159.  
  160. }
  161. ?>


przykładowe użycie:

  1. <?php
  2. $kursy = new WalutyNBP();
  3. $waluta = $kursy -> zwroc_waluty('USD');
  4. print_r($waluta);
  5. ?>


wynik:

Cytat
Array ( [0] => dolar amerykański [1] => 1 [2] => USD [3] => 2,8020 )


  1. <?php
  2. $kursy = new WalutyNBP();
  3. $waluta = $kursy -> zwroc_waluty(array('USD','PLN','EUR'));
  4. echo $kursy->getData().'<br/>';
  5. print_r($waluta);
  6. ?>


wynik:

Cytat
2007-05-22
Array ( [USD] => Array ( [0] => dolar amerykański [1] => 1 [2] => USD [3] => 2,8020 ) [EUR] => Array ( [0] => euro [1] => 1 [2] => EUR [3] => 3,7735 ) )


Ten post edytował stanik_jr 22.05.2007, 13:57:58
Go to the top of the page
+Quote Post
Sokal
post
Post #2





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 8.02.2007

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


A to tak można bez pozwolenia wykorzystywać dane banków? O.o
Go to the top of the page
+Quote Post
kwiateusz
post
Post #3


Admin Techniczny


Grupa: Administratorzy
Postów: 2 072
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




zapewne tak, zwłaszcza że udostępniają jeszcze xmlki z danymi
Go to the top of the page
+Quote Post
arborea
post
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 21.06.2007

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


No pewnie, że można korzystać - ja wrzucam co tylko mogę z http://www.money.pl/webmaster/ bo sami zrobili parę tabelek do wrzucenia na sajty, są też i aktualne kursy walut z wykresikiem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Teraz szukam czegoś z turystyki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Odświeżam topic.
Czy pobierał ktoś z Was kursy z PKO BP? Konkretnie chodzi mi o tą tabelę:
http://www.pkobp.pl/index.php/id=waluty/zone=-1/section=ogol
Nie wiecie poza tym czy PKO BP udostępnia gdzieś xml z kursami? Ja nie namierzyłem niczego takiego, a do pobierania danych ze stron zaufania nie mam :/ Wystarczy, że coś się zmieni w kodzie i regexp może paść...
Pozdrawiam: pion

PS: muszę skorzystać z PKO BP bo Klient twierdzi, że jest tam najwyższy kurs Euro (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) więc przejście na NBP (gdzie kurs jest niższy) nie wchodzi w grę -> strata kasy

Ten post edytował phpion.com 21.10.2007, 20:05:57
Go to the top of the page
+Quote Post
webmasts
post
Post #6





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 5.11.2006
Skąd: Bochnia

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


wywala mi taki błąd

  1. Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /,money/waluty.php on line 5


Wie ktoś o co chodzi
Go to the top of the page
+Quote Post
PawelC
post
Post #7





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

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


Wklej kawałek kodu włącznie z 5 linią
Go to the top of the page
+Quote Post
webmasts
post
Post #8





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 5.11.2006
Skąd: Bochnia

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


  1. <?php
  2.  
  3. class WalutyNBP {
  4.  
  5. private $arrKursy = array();
  6. private $strData;
  7.  
  8. public function __construct($strEncoding='UTF-8',$strUrlXml='http://www.nbp.pl/Kursy/xml/'){
  9. $strUrlXml=$strUrlXml.$this->aktualny_xml().'.xml';
  10. $objXml = new XMLReader();
  11. if(function_exists('curl_init')){
  12. $objXml->XML($this->ccurl_fopen($strUrlXml));
  13. }
  14. else{
  15. ?>
Go to the top of the page
+Quote Post
PawelC
post
Post #9





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

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


  1. <?php
  2.  
  3. class WalutyNBP {
  4.  
  5. private $arrKursy = array();
  6. private $strData;
  7.  
  8. public function __construct($strEncoding='UTF-8',$strUrlXml='http://www.nbp.pl/Kursy/xml/'){
  9. $strUrlXml=$strUrlXml.$this->aktualny_xml().'.xml';
  10. $objXml = new XMLReader();
  11. }
  12. if(function_exists('curl_init')){
  13. $objXml->XML($this->ccurl_fopen($strUrlXml));
  14.  
  15.  }
  16. else{
  17. ?>

Zobacz tak, parse error czyli gdzieś brakuje znaka albo jest wstawiony w złym miejscu.
Go to the top of the page
+Quote Post
webmasts
post
Post #10





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 5.11.2006
Skąd: Bochnia

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


nadal to samo (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)
Go to the top of the page
+Quote Post
ev45ive
post
Post #11





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 9.01.2008

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


zapewne masz php4 a ten kod pisany jest pod php5 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

usuń słowa "public" i "private" które są przed słowami "function", a wszystkie inne ( te po których niema "function") zamień na
"var"

*oczywiście bez cudzysłowiów "" (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
mike
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(ev45ive @ 9.01.2008, 21:31:46 ) *
usuń słowa "public" i "private" które są przed słowami "function", a wszystkie inne ( te po których niema "function") zamień na "var"
To nic nie da. Używany tam jest XMLReader, którego w PHP4 nie ma, więc zmiany te są bezcelowe.
~webmasts zainstaluj siobie PHP5 a nie wspierasz PHP4 - język już nierozwijany.
Go to the top of the page
+Quote Post
corradzisz
post
Post #13





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 22.02.2008

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


Hmm, od dwóch dni caly czas 0 mam na Euro. Coś się zmieniło? Ma ktoś jakieś rozwiązanie?
Go to the top of the page
+Quote Post
jarek_bolo
post
Post #14





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

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


Witaj

Chyba czegoś nie rozumiem, albo masz błąd w kodzie.

Możesz wyjaśnić dlaczego w lini 100, w elseif`ie testujesz czy funkcja fsockopen nie istnieje (inne też tam testujesz), jeśli nie istnieje to wchodzimy do warunku i ... używamy fsockopen oraz reszty innych funkcji plikowych (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Kod
elseif(!function_exists('fsockopen') || !function_exists('fputs') || !function_exists('feof') || !function_exists('fgets'))


Nie powinno być raczej:
Kod
elseif(function_exists('fsockopen') && function_exists('fputs') && function_exists('feof') && function_exists('fgets'))

(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Bład wydaje się elementarny stąd aż wątpie, że możliwy i być może to ja czegoś nie rozumiem.

Pozdrawiam
Jarek Bolo
Go to the top of the page
+Quote Post
bim2
post
Post #15





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Ehm, znak ! to znak "przeciwiństwa". Jeśli dasz
if(!$true)
{

}
to ifka przejdzie jeśli $true = false; Tak samo w przypadku funkcji:
  1. <?php
  2. function test()
  3. {
  4. return false;
  5. }
  6.  
  7. if(!test())
  8. {
  9. echo 'to ci wyswietli';
  10. }
  11. ?>

Rozumiesz? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

EDIT: Ups, nie o to ci chodzi (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) Sorry, posta nie doczytałem. (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Ten post edytował bim2 3.03.2008, 14:25:01
Go to the top of the page
+Quote Post
jarek_bolo
post
Post #16





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

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


Mimo, że nie doczytałeś i błędną odpowiedź dałeś to i tak odpiszę dla wyklarowania o co mi chodzi.

Otóż Twoja funkcja test() zwraca false i jak w ifce sprawdzamy if (!test()) to ifka nas wpusci.
Teraz wracając do WalutyNBP.
function_exist() zwróci false jeśli funkcja nie istnieje, czyli przy takim zapisie if (!function_exist('fsockopen')) zostaniemy wpuszczeni do pętli jeśli fsockopen nie będzie dostępne, a tam w tej pętli używamy fsockopen(), stąd moje niezrozumienie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam
Jarek Bolo
Go to the top of the page
+Quote Post
bim2
post
Post #17





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Rozumiem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jeszcze może wtrące, że można by sprawdzić czy allow_url_wrappers jest dozwolone (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
parzol
post
Post #18





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

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


Pozwolę zadać to pytanie tutaj aby nie otwierać nowego tematu.

Mianowicie chodzi mi o plik: http://www.nbp.pl//Kursy/xml/dir.txt

Ostatnie 6 cyfr to oczywiście data dodania. Analizując jednak plik na prędce widać że są dni w których nie ma aktualizacji.

Jakim cudem? (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
bllitz
post
Post #19





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.01.2006

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


najprawdopodobniej są to weekendy i dni wolne
Go to the top of the page
+Quote Post
soldi
post
Post #20





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 30.09.2007

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


Mi klasa nie działała poprawnie, dopiero poprawienie funkcji aktualny_xml zmusiło klasę do poprawnej pracy.

Kod
     private function aktualny_xml($strTabela='a'){

         $fp = fsockopen("www.nbp.pl", 80, $errno, $errstr, 30);
         if (!$fp) {
             echo "$errstr ($errno) \n";
}         else {
             $out = "GET /Kursy/xml/dir.txt HTTP/1.1\r\n";
             $out .= "Host: www.nbp.pl\r\n";
             $out .= "Connection: Close\r\n\r\n";
             fwrite($fp, $out);
         while (!feof($fp)) {
             $arrPlikiXML[] = fgets($fp, 128);
             }
         fclose($fp);
}
         $arrPlikiXML = array_reverse ($arrPlikiXML);
         for($i=0; $i<=1; $i++){
             $strNazwa=trim($arrPlikiXML[$i]);
             if(substr($strNazwa,0,1)==$strTabela){
                 $strDzisiejszyXML=trim($arrPlikiXML[$i]);
             }
         }
         return $strDzisiejszyXML;
     }


Ten post edytował soldi 23.11.2008, 00:00:04
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 16.09.2025 - 19:33