Script pentru preluarea cursului valutar de pe site-ul BNR si introducerea acestuia intr-o baza de date, de unde poate fi apoi afisat cind este nevoie.
La afisarea datelor se pot face comparatii cu datele din zilele anterioare pentu a se afisa si variatiile cursului fata de ziua (sau zilele) precedenta.
Scriptul preia datele pentru toate valutele comunicate zilnic de BNR
Limbaje programare: php4+, MySQL
Baza de date MySQL trebuie sa contina 2 tabele, unul in care se afla denumirile valutelor (tabelul 'valuta'), respectiv simbolurile acestora, si unul in care se va stoca cursul valutar pe zile (tabelul 'curs').
Scriptul pentru crearea celor 2 tabele mysql este urmatorul:
/*Table structure for table `curs` */ CREATE TABLE `curs` ( `curs_id` int(11) NOT NULL auto_increment, `curs_valuta_id` int(11) default NULL, `curs_data` date default NULL, `curs_valoare` decimal(11,4) default NULL, `curs_date_added` datetime default NULL, PRIMARY KEY (`curs_id`), UNIQUE KEY `data_id` (`curs_data`,`curs_valuta_id`), KEY `data` (`curs_data`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; /*Table structure for table `valuta` */ CREATE TABLE `valuta` ( `valuta_id` int(11) NOT NULL auto_increment, `valuta_denumire` varchar(100) character set utf8 collate utf8_romanian_ci default NULL, `valuta_simbol` varchar(10) character set utf8 collate utf8_romanian_ci default NULL, `valuta_simbol_bnr` varchar(10) character set utf8 collate utf8_romanian_ci default NULL, `valuta_status` int(1) default '1', `valuta_sort_order` int(11) default NULL, PRIMARY KEY (`valuta_id`) ) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; /*Data for the table `valuta` */ insert into `valuta` (`valuta_id`, `valuta_denumire`, `valuta_simbol`, `valuta_simbol_bnr`, `valuta_status`, `valuta_sort_order`) values (1,'Euro','EUR','EUR',1,10), (2,'Dolarul SUA','USD','USD',1,20), (3,'gramul de aur','XAU','XAU',1,30), (4,'Dolarul australian','AUD','AUD',1,40), (5,'Dolarul canadian','CAD','CAD',1,50), (6,'Francul elvetian','CHF','CHF',1,60), (7,'Coroana ceha','CZK','CZK',1,70), (8,'Coroana daneza','DKK','DKK',1,80), (9,'Lira egipteana','EGP','EGP',1,90), (10,'Lira sterlina','GBP','GBP',1,100), (11,'100 Forinti maghiari','100HUF','100HUF',1,110), (12,'100 Yeni japonezi','100JPY','100JPY',1,120), (13,'Leul moldovenesc','MDL','MDL',1,130), (14,'Coroana norvegiana','NOK','NOK',1,140), (15,'Zlotul polonez','PLN','PLN',1,150), (16,'Coroana suedeza','SEK','SEK',1,160);
<?php // Script php preluare curs valutar // 09.05.2007 // http://www.heliosdesign.ro/ //---------------------------------------------------------------------- // CONFIGURARE //---------------------------------------------------------------------- #------------------------------------- # DATABASE #------------------------------------- define('DATABASE_HOST', 'localhost'); define('DATABASE_USER', 'nume_utilizator'); define('DATABASE_PASSWORD', 'parola'); define('DATABASE_NAME', 'denumire_baza_date'); #------------------------------------- define('FISIER_SURSA', 'http://www.bnr.ro/ro/info/curs_ext.asp'); define('EMAIL_ERRORS', 'webmaster@example.tld'); define('SUBIECT_EMAIL_ERRORS', 'Erori preluare curs valutar'); //---------------------------------------------------------------------- // FUNCTII //---------------------------------------------------------------------- function connect() { mysql_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD) or die('Eroare la conectarea la baza de date'); mysql_select_db(DATABASE_NAME) or die('Eroare la selectarea bazei de date'); } function convert_date_format($date) { $denumire_luni = array( 'ian' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'mai' => 5, 'iun' => 6, 'iul' => 7, 'aug' => 8, 'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12, ); $needle = '/([0-9]{1,2})[\s]+([a-zA-Z]+)[\s\S]+([0-9]{2,4})/i'; preg_match($needle, $date, $matches); $day = $matches[1]; $month = $denumire_luni[$matches[2]]; $year = $matches[3]; return mktime(0, 0, 0, $month, $day, $year); } function preluare_curs() { // preluare continut fisier intr-un string $file_content = @file_get_contents(FISIER_SURSA); // modificarea textului pentru a fi scris unitar, // cu litere mici (in special tagurile HTML) $file_content = strtolower($file_content); // verificare preluare completa fisier curs valutar if (strpos($file_content, '<html>') and strpos($file_content, '</html>')) { //--------- aflare data ultimului curs afisat --------------------------// $needle = '%<tr>[\s]*<th>[\s]*Valuta[\s]*/[\s]*Data</th>[\s\S]*<th>([\s\S]+)</th>[\s]*</tr>%i'; preg_match($needle, $file_content, $matches); if (empty($matches[1])) { $result['errors'][] = 'EROARE PRELUARE CURS - imposibilitate prelucrare date - ultima data afisata'."\n"; $result['errors_status'] = 1; return $result; } else { $data_ultimul_curs_afisat = $matches[1]; $data_ultimul_curs_afisat = convert_date_format($matches[1]); $result['content'] .= date('d.m.Y', $data_ultimul_curs_afisat)."\n"; // verificare daca a fost afisat cursul valutar pentru ziua de astazi if (date('d.m.Y', $data_ultimul_curs_afisat) == date('d.m.Y')) { // extragere curs pentru fiecare valuta $sql = "SELECT * FROM valuta WHERE valuta_status = 1"; $res = mysql_query($sql); while ($row = mysql_fetch_array($res)) { $needle = '%<tr>[\s]*<th><img[^<]*</th><td>'.$row['valuta_simbol'].'</td>[\s]*<td>[^<]*</td>[\s]*<td>[^<]*</td>[\s]*<td>[^<]*</td>[\s]*<td>[^<]*</td>[\s]*<td[^>]*>([0-9,]*)</td>[\s]*</tr>%i'; preg_match($needle, $file_content, $matches); if (empty($matches[1])) { // atentionare fisier corupt sau structura fisier schimbata $result['errors'][] = 'EROARE PRELUARE CURS VALUTAR - imposibilitate prelucrare date - (verifica structura fisier BNR) '.$row['valuta_simbol']."\n"; $result['errors_status'] = 1; } else { // afisare rezultat preluare $result['content'] .= $row['valuta_simbol'].' - '.$matches[1]."\n"; // inserare in baza de date a cursului pentru fiecare valuta in parte // tabelul 'curs' nu permite doua inregistrari cu aceeasi data pentru o valuta // se modifica separatorul de zecimale din virgula in punct $sql = "INSERT INTO curs SET curs_valuta_id = '".$row['valuta_id']."', curs_data = '".date('Y-m-d', $data_ultimul_curs_afisat)."', curs_valoare = '".str_replace(',', '.', $matches[1])."', curs_date_added = NOW() "; mysql_query($sql); } } } else { // cursul pentru ziua de astazi nu a fost inca afisat exit(); } } } else { // fisierul nu a putut fi citit // avertizare webmaster prin email pentru a verifica daca nu cumva a fost schimbat URL-ul fisierului $result['errors'][] = 'EROARE PRELUARE CURS - fisier inaccesibil (de verificat daca nu s-a schimbat locatia fisierului/URL)'."\n"; $result['errors_status'] = 1; } return $result; } //------------------------------------------------------------------- // conectare si selectia bazei de date @connect(); // interogheaza baza sql pentru a afla daca exista inregistrari cu data de azi, // respectiv daca a fost sau nu preluat cursul valutar $sql = "SELECT COUNT(*) FROM curs WHERE curs_data = '".date('Y-m-d')."'"; $res = mysql_query($sql); $data = mysql_fetch_array($res); if ($data[0] > 0) { // in cazul in care exista inregistrari cu data de azi inseamna ca // datele au fost preluate cu succes exit(); } else { $rezultat_preluare = preluare_curs(); $display .= $rezultat_preluare['content']; $display .= "\n"; $display .= '---------------------------------------------------------'; $display .= "\n"; if ($rezultat_preluare['errors_status']) { foreach ($rezultat_preluare['errors'] as $value) { $display .= $value; } // trimite email erori pentru supraveghere schimbari in URL sau in structura fisierului mail(EMAIL_ERRORS, SUBIECT_EMAIL_ERRORS, $display); } echo $display; } ?>
Nu uitati sa inlocuiti datele de conectare la baza de date (sectiunea 'Configurare') cu cele corespunzatoare setarilor dvs.: username, parola si denumire baza de date.
De asemenea, trebuie inlocuita adresa de email la care se vor trimite erorile, cind si daca va fi cazul.
Scriptul poate fi rulat periodic cu ajutorul unui Cron Job
Exemplu de script de rulare cu ajutorul cron (sistem Debian GNU/Linux)
Se creeaza un fisier in directorul /etc/cron.d/ cu urmatorul continut:
(Denumirea fisierului nu este importanta, trebuie doar sa fie sugestiva, toate fisierele din directorul /et/cron.d/ sint citite de sistem iar sarcinile sint executate la termenele prevazute.)
# m h dom mon dow user command */15 14-15 * * 1-5 root /usr/bin/php5 /var/www/ ... calea completa catre fisier ... /preluare_curs.php */30 16-17 * * 1-5 root /usr/bin/php5 /var/www/ ... calea completa catre fisier ... /preluare_curs.php 30 17,18 * * 1-5 root /usr/bin/php5 /var/www/ ... calea completa catre fisier ... /preluare_curs.php
In exemplul de mai sus scriptul este rulat de luni pina vineri, la urmatoarele intervale:
In cazul in care aveti instalat php4 schimbati in cronjob /usr/bin/php5 cu /usr/bin/php4
De mentionat ca scriptul nu genereaza trafic dupa preluarea cursului, prima operatiune este sa verifice daca datele pentru ziua de astazi au fost preluate in baza de date, caz in care scriptul se opreste din executie.
Data postarii: 09.05.2007