UNIX,Linux,Retele,Programare

20 Dec 07 00:49

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Curs BNR cu PHP, varianta XML, folosind SimpleXML



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 smile

Pentru a functiona trebuie sa existe pe server libraria CURL si SimpleXML. Codul e urmatorul:

Cod:

<?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 smile


Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

» Think fast, try hard, die young...

tutoriale unix,tutoriale linux,tutoriale bsd

Scuze de offtopic


<- tare

07 Jan 08 15:01

Psycho p01nt
Apprentice
Locaţie: Inside your mind...
Înregistrat: 06 Jan 08
Mesaje: 85

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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 lol

multumesc pt script.Apreciate it !

Editat ultima oară de Psycho p01nt (07 Jan 08 15:01)

Offline

 

07 Jan 08 15:21

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

You're welcome, dude wink


Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

04 Apr 08 16:20

tercot
Knight
Înregistrat: 27 May 07
Mesaje: 799

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

fain snippetul ... dar daca l-as si intelege .. :d
Va rog frumos sa imi explice si mie cineva aceste linii

Cod:

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!


Daca crezi in Dumnezeu si El nu exista, nu pierzi nimic.Dar daca El exista si tu nu crezi, pierzi totul.
Hristos S-a Inaltat !

Offline

 

04 Apr 08 16:30

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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.


Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

05 Apr 08 18:26

vladiii
Initiate
Înregistrat: 30 Jun 07
Mesaje: 164

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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:

Cod:

<?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

 

07 Apr 08 16:58

tercot
Knight
Înregistrat: 27 May 07
Mesaje: 799

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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 ?


Daca crezi in Dumnezeu si El nu exista, nu pierzi nimic.Dar daca El exista si tu nu crezi, pierzi totul.
Hristos S-a Inaltat !

Offline

 

07 Apr 08 17:32

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

Cu o bucla for folosindu-te de numarul de elemente din array sau cu un foreach smile

Citeste manualul, ia exemplul de mai sus, si daca nu te descurci spune si iti fac eu codul.


Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

07 Apr 08 20:08

tercot
Knight
Înregistrat: 27 May 07
Mesaje: 799

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

^ 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!


Daca crezi in Dumnezeu si El nu exista, nu pierzi nimic.Dar daca El exista si tu nu crezi, pierzi totul.
Hristos S-a Inaltat !

Offline

 

07 Apr 08 20:15

AdyX
Moderator
Locaţie: Bucuresti
Înregistrat: 21 Nov 06
Mesaje: 861

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

HTML

Cod:

<form action="valuta.php" method="post">
  <select name="valuta">
    <option value="...">...</option>
    <option value="...">...</option>
  </select>
</form>

valuta.php

Cod:

$valuta = $_POST['valuta'];

http://i4.photobucket.com/albums/y113/AdyX/userbar.jpg
Always be yourself.

Offline

 

11 Jun 08 04:13

detective
Apprentice
Înregistrat: 09 Apr 08
Mesaje: 84

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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

 

11 Jun 08 09:48

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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.


Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

11 Jun 08 11:13

danieLs
Initiate
Locaţie: Over The Edge
Înregistrat: 13 Feb 08
Mesaje: 139
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

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)

Cod:

<?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)


The only valid measurement of code quality is: WTF's/minute

Offline

 

15 Jun 08 16:08

detective
Apprentice
Înregistrat: 09 Apr 08
Mesaje: 84

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

Ok am ajuns la varianta aceasta :

Cod:

<?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

Cod:

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

 

15 Jun 08 16:10

Agkelos
SkullBox Guardian
Locaţie: Ouranos
Înregistrat: 22 Sep 06
Mesaje: 3953
Site web

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

Ii dai in celula tabelului:

Cod:

echo $rates[18]["rate"];

Blogu' meu

PM - Modalitate de a trimite mesaje private/personale utilizatorilor; aici nu se rezolva probleme si nu se dau sfaturi.
Forum - Locul in care se cer sfaturi si se rezolva probleme; aici nu se dau datele personale/confidentiale.

"Science without religion is lame, religion without science is blind." - Albert Einstein

Offline

 

16 Jun 08 03:35

detective
Apprentice
Înregistrat: 09 Apr 08
Mesaje: 84

Re: Curs BNR cu PHP, varianta XML, folosind SimpleXML

Am reusit, ms mult

Offline

 

» Failure is not an option, it's built-in

tutoriale unix,tutoriale linux,tutoriale bsd

Scuze de offtopic


38.103.63.16 <- te-am prins

Antet forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson



Ethical hacking and programming community