Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kursy NBP - szukałem szukałem i nieznalazłem działającego...
Forum PHP.pl > Forum > PHP
niko
było wielokrotnie - potrzebuje zczytać kursy NBP - ale jak nad tym siedze to niestety niedziała mi i nie wiem dlaczego - używam tego skryptu:
  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. ?> 
  162.  
  163. <?php
  164. $kursy = new WalutyNBP();
  165. $waluta = $kursy -> zwroc_waluty(array('USD','PLN','EUR'));
  166. echo $kursy->getData().'<br/>';
  167. print_r($waluta);
  168. ?>


i wywala mi błąd:

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /mounted-storage/XXX/XXX/xxx/katalog/test/kasa10.php on line 82
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /mounted-storage/XXX/XXX/xxx/katalog/test/kasa10.php on line 82

używałem też tego :
  1. <?php
  2. $tabela_kursow = simplexml_load_file('http://www.nbp.pl/kursy/xml/a125z070629.xml'); 
  3. foreach($tabela_kursow->pozycja as $pozycja) {
  4. echo 'nazwa waluty : ' ,$pozycja->nazwa_waluty.'<br />';
  5. echo 'kod waluty : ' ,$pozycja->kod_waluty.'<br />';
  6. echo 'kurs średni : ' , $pozycja->kurs_sredni.'<br />';
  7. }
  8. ?>


to dziala ale chyba trzeba to co jakiś czas aktualizowac a mnie interesowałby automat;

wie ktoś może jak przerobić powyższe - lub co sie zmieniło że nie działa teraz ?
atomek4
Hej,

ponieważ ta nazwa pliku xml się zmienia to trzeba ją pobierać ze strony:

  1. <?php
  2. $link= file_get_contents("http://www.nbp.pl/kursy/kursya.html"); 
  3.  
  4. // Wycinanie linku
  5. $link1 = strstr($link, 'xml');
  6. $link2 = substr($link1, '0', '19');
  7. $link = "http://www.nbp.pl/kursy/".$link2; //przechowuje scieżkę do pliku
  8. ?>


Podałem takie rozwiązanie bo chyba z CURL nie możesz skorzystać
niko
no ok dziala a teraz jak mam kodowanie całego serwisu na windows-1250 to jak mozna przekodować te dane wyciągane ? bo mam krzaczki w nazwach sad.gif
atomek4
Zobacz może to lub to pomoże. Chyba, że ktoś będzie znał jakieś inne rozwiązanie smile.gif
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.