curs valutar in baza de date

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
barbacot
Mesaje: 2

curs valutar in baza de date

Salutare la toti acesta fiind primul meu post pe forum.

In legatura cu scriptul de aici: https://marplo.net/php-mysql/curs_valutar-s.php poate cineva sa imi arate cum introduc rezultatele intr-o baza de data mysql???

MarPlo
Salut
Acel script nu e conceput sa adauge cursul in baza de date, pentru asta trebuie cateva adaugari in script.
Iti scriu ca idee ce trebuie, daca stii PHP-MySQL te descurci.
Intai trebuie creat un tabel in baza de date, cu 5 coloane: data, dolari, euro, lires, aur.
Apoi, unde e codul acesta:

Cod: Selectaţi tot

if (count($curs_v)>=1) {
  for($i=0; $i<count($curs_v); $i++) $rezult .= '<tr><td><b>'.$curs_v[$i][0].'</b></td><td>'.$curs_v[$i][1].'</td><td>Lei</td></tr>';
}
Sa fie cam asa (vezi comentariile din cod):

Cod: Selectaţi tot

if (count($curs_v)>=1) {
  for($i=0; $i<count($curs_v); $i++) $rezult .= '<tr><td><b>'.$curs_v[$i][0].'</b></td><td>'.$curs_v[$i][1].'</td><td>Lei</td></tr>';

  // Conectare la baza de date
  // Se face Select in Tabel, pt. verificare daca a fost deja adaugat cursul azi
     //   SELECT `data` FROM `nume_tabel` WHERE `data`=data_de_azi LIMIT 1
  // Doar daca Select-ul nu returneaza vreun rezultat, se face Insert
     //   INSERT INTO `nume_tabel` (data, dolari, euro, lires, aur) VALUES (data_de_azi, $curs_v[0][1], $curs_v[1][1], $curs_v[2][1], $curs_v[3][1])
}
 

barbacot
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;
}
?>

MarPlo
In codul pe care l-am scris in raspunsul de mai sus, datele care sunt adaugate in baza de date sunt cele preluate din fisierul .txt, deci nu se acceseaza site-ul BNR in acea parte de cod, ci se folosesc datele care mai inainte au fost citite din fisierul cache.

- Despre scriptul pe care l-ai postat, habar nu am, prea mult cod, nu stau de verificarea lui.

ggza
MarPlo scrie:
15 Iul 2012
In codul pe care l-am scris in raspunsul de mai sus, datele care sunt adaugate in baza de date sunt cele preluate din fisierul .txt, deci nu se acceseaza site-ul BNR in acea parte de cod, ci se folosesc datele care mai inainte au fost citite din fisierul cache.

- Despre scriptul pe care l-ai postat, habar nu am, prea mult cod, nu stau de verificarea lui.
Domnule Marplo!
Dupa ce stochez cursurile BNR in baza de date cum pot calcula variatia de curs fata de ziua precedenta, si cum pot afisa aceasta variatie?
Multumesc!
Si inca ceva. As vrea sa afisez multiplier-ul din tabelul xml al BNR. Cum introduc multiplier-ul in acest cod? https://marplo.net/php-mysql/curs_valutar

MarPlo
Salut,
Acea aplicatie de curs valutar e un script vechi, facut ca proiect in studiu de invatare php, fara optiuni de modificari,
Ca sa calculeze si sa afiseze variatia de curs valutar sunt necesare prea multe modificari in acel script.
Practic ar fi o noua versiune, refacuta.

MarPlo
O noua aplicatie de curs valutar plus conversii monede e la pagina:
marplo.net/php-mysql/curs_valutar_conversii

- Datele pot fi salvate in baza de date MySQL, foloseste fisiere cache, afiseaza variatia de curs fata de ziua precedenta (cu: indicator ascendent /descendent, valoare numerica si procente).
Pot fi afisate oricate valute din cele care sunt in fisierul xml de la bnr.
- La converseii se poate calcula cu sau fara TVA.

Subiecte similare