Neautentificat.
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.xml
OK, 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 ![]()
Offline

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 !
Editat ultima oară de Psycho p01nt (07 Jan 08 15:01)
Offline
You're welcome, dude ![]()
Offline
fain snippetul ... dar daca l-as si intelege .. :d
Va rog frumos sa imi explice si mie cineva aceste linii
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!
Offline
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.
Offline
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 !
Offline
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 ?
Offline
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.
Offline
^ 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!
Offline
HTML
<form action="valuta.php" method="post">
<select name="valuta">
<option value="...">...</option>
<option value="...">...</option>
</select>
</form>valuta.php
$valuta = $_POST['valuta'];
Offline
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 ?
Offline
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.
Offline
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());
?>Editat ultima oară de danieLs (11 Jun 08 11:33)
Offline
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.
Offline
Ii dai in celula tabelului:
echo $rates[18]["rate"];
Offline
Am reusit, ms mult
Offline
