Multumesc pentru ajutor - am reusit acum.
Ideea era asa: cei de la BNR restrictioneaza ip-ul daca accesezi de prea multe ori acel curs valutar. O solutie ar fi sa preiei cursul intr-o baza de date care sa se actualizeze o data pe zi la ora 13. Alta solutie este cum ai facut tu cu fisier cache dar aveam nevoie de integrare in baza de date pentru a pastra un history al cursului si pentru a prelua datele din curs pe care mai apoi prin intermdiul unui javascript sa le folosesc pentru calcularea real time a unor sume in diverse valute.
In legatura cu verificarea eu aveam alta idee pentru a scapa de pericolul de a fi restrctionat ip-ul la BNR: sa pun baza de date sa incarce mereu informatia de curs din fisierul tau "valutarbnr.xml" -era mai simplu pentru mine mai ales ca nu stiam clar cum sa fac verificarea expirarii datei si cautarea unui nou curs in baza de date...
Ultima chestie.
Am gasit pe net un script care ar face acelasi lucru - tirziu ca acum am reusit cu ajutorul tau sa il modific pe acesta dar nu merge..."eroare preluare fisier" - pur didactic ca sa mai invat ceva daca ai timp poti sa imi explici de ce nu merge???
Cod: Selectaţi tot
<?php
//----------------------------------------------------------------------
// CONFIGURARE
//----------------------------------------------------------------------
#-------------------------------------
# DATABASE
#-------------------------------------
define('DATABASE_HOST', 'localhost');
define('DATABASE_USER', 'user');
define('DATABASE_PASSWORD', 'password');
define('DATABASE_NAME', 'database');
#-------------------------------------
define('FISIER_SURSA', 'http://www.bnro.ro/nbrfxrates.xml');
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;
}
?>