|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Dec 19, 2007, 23:49
|
|
Dupa cum probabil stiti (ma refer la webmasteri) BNR a scos in sfarsit o metoda developer-friendly de verificare a cursului valutar, online. Pana acum toti programatorii luau pagina http://www.bnr.ro/Ro/Info/ si se apucau sa faca asocieri ca sa gaseasca cursul euro sau cursul dolarului. De ceva vreme BNR a pus la dispozitie o un fisier in format XML care usureaza mult treaba programatorilor. Fisierul il puteti gasi la adresa http://www.bnro.ro/nbrfxrates.xmlOK, sa o scurtam. Ca sa simplific treaba unora postez aici codul care l-am facut ca sa citesc valutele. Sunt convins ca sunt si altii care au nevoie  Pentru a functiona trebuie sa existe pe server libraria CURL si SimpleXML. Codul e urmatorul: <?php header('Content-type: text/plain');
// Trebuie sa iau XML-ul de pe bnr.ro si sa-l salvez in $curs; $url = 'http://www.bnro.ro/nbrfxrates.xml';
// Daca exista CURL, folosim CURL. Daca nu, folosim file_get_contents(); if( function_exists('curl_init') ) { $curl_handle=curl_init(); curl_setopt($curl_handle,CURLOPT_URL,$url); curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); $curs = curl_exec($curl_handle); curl_close($curl_handle); } else { $curs = file_get_contents($url); }
// OK, avem fisierul nbrfxrates.xml. Acum trebuie sa il citim // pentru asta avem nevoie de SimpleXML
if( !class_exists('SimpleXMLElement') ){ // Daca nu suporta SimpleXML e naspa // Nu extind ca nu am chef sa ma complic inutil // Oricine vrea sa ma completeze e binevenit :-) echo 'Serverul nu suporta SimpleXML'; exit; }
// Daca am ajuns pana aici toate-s bune si ne putem pune pe treaba :-) $rates = array();
$xml = new SimpleXMLElement($curs); foreach( $xml->Body->Cube->Rate as $rate ){ $final = array(); foreach( $rate->attributes() as $att => $value ){ if( strcmp($att,'currency') == 0 ) $final['currency'] = (string) $value; if( strcmp($att,'multiplier') == 0 ) $final['multiplier'] = (string) $value; } $final['rate'] = (string) $rate; if( empty($final['multiplier']) ) $final['multiplier'] = 1; array_push($rates,$final); }
// Daca am ajuns aici, datele sunt pastrate in $rates print_r($rates); ?> La final, in array-ul $rates se gaseste cate un array pentru fiecare valuta. Am incheiat cu un print_r($rates) ca sa se afiseze continutul array-ului, dar se poate inlocui cu o bucla foreach care afiseaza frumos valutele. Daca vi se pare util si il folositi pe site-ul vostru, va rog sa adaugati si un link catre SkullBox 
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:08 de către Agkelos »
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
Psycho p01nt
 DeconectatMesaje: 85
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Ian 07, 2008, 14:01
|
|
Il voi folosi cu placere... Mai ales ca asteptam demult asa ceva Facusem mai demult un convertor valutar (software) si am renuntat sa il mai imbunatatesc ca aveam probleme cu update-ul la cursul valutar...acum cred ca o sa reusesc  multumesc pt script.Apreciate it !
|
|
|
|
|
Memorat
|
|
|
|
|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Ian 07, 2008, 14:21
|
|
You're welcome, dude 
|
|
|
|
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
tercot
 DeconectatMesaje: 1161
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 04, 2008, 14:20
|
|
fain snippetul ... dar daca l-as si intelege .. Va rog frumos sa imi explice si mie cineva aceste linii <?php foreach( $rate->attributes() as $att => $value ){ if( strcmp($att,'currency') == 0 ) $final['currency'] = (string) $value; if( strcmp($att,'multiplier') == 0 ) $final['multiplier'] = (string) $value; } ?> Va multumesc!
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:08 de către Agkelos »
|
Memorat
|
Crezi in Dumnezeu si nu vei fi dezamagit.
|
|
|
|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 04, 2008, 14:30
|
|
Bucla aia prelucreaza un array care va fi de forma camp=>valoare. Sunt doua if-uri care verifica numele campului. Daca numele campului e currency, $final['currency'] ia valoarea $value.
|
|
|
|
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
vladiii
 DeconectatMesaje: 166
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 05, 2008, 16:26
|
|
Fara nicio clasa e mai mult de muncit, deoarece trebuiesc facute parsarile. Spre exemplu, ca sa afisez ceva genul: AUD: 2.1683, as putea folosi urmatorul script: <?php $url="http://www.bnro.ro/nbrfxrates.xml"; $curs=file_get_contents($url); $aux1=explode("<Rate currency='", $curs); $aux2=explode("</Rate>", $aux1[1]); $aud=str_replace("' >", ": ", $aux2[0]); echo $aud; ?> Pentru celelalte valute se foloseste aceeasi idee, dar e mai mult de munca. Bafta !
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:08 de către Agkelos »
|
Memorat
|
|
|
|
tercot
 DeconectatMesaje: 1161
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 07, 2008, 14:58
|
|
am si eu o alta problema  ... dar nu prea stiu sa o explic(ca de obicei) ... eu vreau de exemplu .. sa fac o lista <select> <option value="scoala">Scoala .. care sa aiba valoarea $rates[nr]['rate'] ... cu fac asta ?
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:09 de către Agkelos »
|
Memorat
|
Crezi in Dumnezeu si nu vei fi dezamagit.
|
|
|
|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 07, 2008, 15:32
|
|
Cu o bucla for folosindu-te de numarul de elemente din array sau cu un foreach  Citeste manualul, ia exemplul de mai sus, si daca nu te descurci spune si iti fac eu codul.
|
|
|
|
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
tercot
 DeconectatMesaje: 1161
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 07, 2008, 18:08
|
|
^ cred ca m-am exprimat eu prost :-) scuze... deci sa schitez ce vreau eu sa fac: Am o pagina din care aleg valuta: voi avea x <select> <option value="valuta">USD(etc) ... daca userul selecteaza USD eu sa am o variabila cu valoarea USD-ului ... si tot asa .. cu fac ca eu sa atribui lui <select> <option value="valuta">USD valoarea USD-ului pe care o iau cu scriptul de mai sus... ? sper ca m-am facut inteles .. Multumesc!
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:09 de către Agkelos »
|
Memorat
|
Crezi in Dumnezeu si nu vei fi dezamagit.
|
|
|
|
AdyX
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Apr 07, 2008, 18:15
|
|
HTML <form action="valuta.php" method="post"> <select name="valuta"> <option value="...">...</option> <option value="...">...</option> </select> </form> valuta.php $valuta = $_POST['valuta'];
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:09 de către Agkelos »
|
Memorat
|
|
|
|
detective
 DeconectatMesaje: 130
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Iun 11, 2008, 02:13
|
|
si cum fac de ex daca vreau sa citesc doar valoarea EUR-ului si USD-ului din acel array si sa le stochez in 2 variabile ca sa le afisez intr-un tabel ?
|
|
|
|
|
Memorat
|
|
|
|
|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Iun 11, 2008, 07:48
|
|
La print_r($rates) poti vedea al catelea element din array e USD. Ca sa afisezi doar valoarea USD folosesti $rates[INDEX] unde INDEX e pozitia citita mai devreme. Daca ai valoarea o poti introduce intr-un tabel in mod normal, cu INSERT.
|
|
|
|
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
|
danieLs
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Iun 11, 2008, 09:13
|
|
Eu am facut ceva de genul asta, nu depinde de nicio librarie, face si caching ptr a miscora timpul de incarcare cu refresh la 1 ora (modificati 3600 cu timpul dorit) <?php
function GetCursValutar() { $xmlUrl = 'http://www.bnro.ro/nbrfxrates.xml'; $cacheFile = './curs_valutar.cache'; $timedif = @(time() - filemtime($cacheFile)); $result = array(); if ($timedif < 3600) { $result = unserialize(join('', file($cacheFile))); } else { if ($f = @fopen($xmlUrl, 'r')) { while (!feof($f)) { $line = fgets($f, 4096); if (preg_match("/(\s)?<Rate currency='([A-Z]{3})' (multiplier='100')?>([0-9\.]+)<\/Rate>/", $line, $out)) { $result = array_merge($result, array($out[2] => $out[4])); } } fclose($f); $serialized = serialize($result); if ($f = @fopen($cacheFile, 'w')) { fwrite($f, $serialized, strlen($serialized)); fclose($f); } } } return $result; }
print_r (GetCursValutar()); ?>
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:09 de către Agkelos »
|
Memorat
|
The only valid measurement of code quality is: WTF's/minute
(\__/) (+'.'+) This is Bunny. Copy and paste bunny into (")_(") your signature to help him gain world domination.
|
|
|
detective
 DeconectatMesaje: 130
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Iun 15, 2008, 14:08
|
|
Ok am ajuns la varianta aceasta : <?php header('Content-type: text/plain');
// Trebuie sa iau XML-ul de pe bnr.ro si sa-l salvez in $curs; $url = 'http://www.bnro.ro/nbrfxrates.xml';
// Daca exista CURL, folosim CURL. Daca nu, folosim file_get_contents(); if( function_exists('curl_init') ) { $curl_handle=curl_init(); curl_setopt($curl_handle,CURLOPT_URL,$url); curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); $curs = curl_exec($curl_handle); curl_close($curl_handle); } else { $curs = file_get_contents($url); }
// OK, avem fisierul nbrfxrates.xml. Acum trebuie sa il citim // pentru asta avem nevoie de SimpleXML
if( !class_exists('SimpleXMLElement') ){ // Daca nu suporta SimpleXML e naspa // Nu extind ca nu am chef sa ma complic inutil // Oricine vrea sa ma completeze e binevenit :-) echo 'Serverul nu suporta SimpleXML'; exit; }
// Daca am ajuns pana aici toate-s bune si ne putem pune pe treaba :-) $rates = array();
$xml = new SimpleXMLElement($curs); foreach( $xml->Body->Cube->Rate as $rate ){ $final = array(); foreach( $rate->attributes() as $att => $value ){ if( strcmp($att,'currency') == 0 ) $final['currency'] = (string) $value; if( strcmp($att,'multiplier') == 0 ) $final['multiplier'] = (string) $value; } $final['rate'] = (string) $rate; if( empty($final['multiplier']) ) $final['multiplier'] = 1; array_push($rates,$final); }
// Daca am ajuns aici, datele sunt pastrate in $rates print_r($rates[18]); E bine imi afiseaza Array ( [currency] => USD [rate] => 2.3959 [multiplier] => 1 ) Bun, acum pe mine ma intereseaza doar rate-ul de la USD, pt ca la currency o sa am eu logo-ul dolarului si in dreapta va fi rate-ul, in acel tabel, apropo ma refer la un tabel HTML nu unul MySql.Deci vreau sa fac un mic tabelas cu USB, EUR si de la aceste 2 valori ( sau mai multe ) ma intereseaza doar rate-ul.
|
|
|
|
« Ultima modificare: Oct 10, 2008, 10:20 de către emi »
|
Memorat
|
|
|
|
|
Agkelos
|
|
Curs BNR cu PHP, varianta XML, folosind SimpleXML, Iun 15, 2008, 14:10
|
|
Ii dai in celula tabelului: echo $rates[18]["rate"];
|
|
|
|
« Ultima modificare: Oct 09, 2008, 12:10 de către Agkelos »
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
|
|
|