Helios Design - Agentie web design si grafica publicitara
Contact

Resurse PHP/MySQL

Script php preluare curs valutar BNR

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').

Cod MySQL

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

Cod PHP

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

Cron Job

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:

  • intre orele 14-15 la fiecare 15 minute (cursul este publicat de catre BNR in jurul orei 14)
  • intre orele 16-17 la fiecare 30 de minute
  • o data la ora 17.30 si o data la ora 18.30

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

servicii tarife portofoliu contact resurse Copyright© Helios Design - Agentie web design Helios Design