Курсы валют

Тема в разделе "Как сделать...", создана пользователем able, 28 янв 2009.

  1. able

    able

    Регистр.:
    5 апр 2008
    Сообщения:
    226
    Симпатии:
    66
    Необходимо получить курсы валют в скрипте на php..
    В конкректном случае - ЦБ РФ.

    Добавлено через 26 минут
    сам нашёл :) вот решение:


    PHP:
    <?
    define('PATH','downloads/');

    function 
    getTodayFileName(){
      return 
    PATH.'kurs_valut_'.date('dmy').'.htm';
    }
    function 
    getYesterdayFileName(){
      return 
    PATH.'kurs_valut_'.date("dmy",mktime(0,0,0,date("m") ,date("d")-1,date("Y"))).'.htm';
    }
    function 
    getValKurs(&$val,$date=null){ 
      if(
    $date==null$date date("d/m/Y"); 
      
    $link "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"
      
    // Загружаем HTML-страницу 
      
    $fd fopen($link"r"); 
      
    $content=""
      if(
    $fd){ 
        
    // Чтение содержимого файла в переменную $content
        
    while(!feof ($fd)) $content .= fgets($fd4096); 
      } else return;
        
    // Закрыть открытый файловый дескриптор 
        
    fclose ($fd);
      
    // Разбираем содержимое, при помощи регулярных выражений 
      
    $pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"
      
    preg_match_all($pattern$content$outPREG_SET_ORDER); 
      
    $val['dollar'] = ""
      
    $val['euro'] = ""
      foreach(
    $out as $cur){ 
        if(
    $cur[2] == 840$val['dollar'] = doubleVal(str_replace(",",".",$cur[4]));
        if(
    $cur[2] == 978$val['euro'] = doubleVal(str_replace(",",".",$cur[4])); 
      }
    }


    if(!
    file_exists(getTodayFileName())){
      
    $val_today = array();
      
    $val_yesterday = array();
      
    // получаем курсы валют 
      
    getValKurs($val_today); 
      
    getValKurs($val_yesterday,date("d/m/Y",mktime(0,0,0,date("m") ,date("d")-1,date("Y")))); 
      
    // ставим признак, поднялся курс или нет 
      
    $dollar_up = ($val_today['dollar']-$val_yesterday['dollar'] > true false);
      
    $euro_up = ($val_today['euro']-$val_yesterday['euro'] > true false);
      
    tempnam('downloads',getTodayFileName());
      
    $fp fopen(getTodayFileName(), "w");
      
    // пошел HTML код со вставкой полученных данных курсов валют, имените его как вам необходимо
      
    fwrite($fp,'
    <table border="1" cellpadding="5" cellspacing="0">
    <tr>
    <td colspan="2">Курс валют на '
    .date('d/m/Y').'</td>
    </tr>
    <tr>
    <td>'
    .($dollar_up 'поднялся' 'опустился').'&nbsp;&nbsp;&nbsp;&nbsp;<strong>USD</strong> ЦБ РФ </td>
    <td align="center"><strong>'
    .$val_today['dollar'].'</strong></td>
    </tr>
    <tr>
    <td>'
    .($euro_up 'поднялся' 'опустился').'&nbsp;&nbsp;&nbsp;&nbsp;<strong>EUR</strong> ЦБ РФ </td>
    <td align="center"><strong>'
    .$val_today['euro'].'</strong></td>
    </tr>
    </table>
      '
    );
      
    fclose($fp);
      if(
    file_exists(getYesterdayFileName())) unlink(getYesterdayFileName());


    readfile(getTodayFileName());
    ?> 

    Чтобы вставить это все в html, в том месте где Вам нужны курсы валют напишите следующее:
    <? require 'имя файла с этим скриптом';?>
     
  2. Красавчег

    Красавчег Завсегдатай

    Регистр.:
    15 мар 2010
    Сообщения:
    902
    Симпатии:
    298
    Скажите, в этом скрипте есть кеширование в файл, чтоб он каждый раз к центробанку не обращался (я в пхп полный нуб) и как его запускать, или он при открытии страницы с инклудом этого скрипта, сам срабатывает?
     
  3. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    кеширование в этом скрипте реализовано на основании сегоднящней даты.
    как только наступит новый день первый клиент инициирует создание кеш-файла.
    Это должно стать ясным если посмотриш код в районе
    if(!file_exists(getTodayFileName())){
    файл будет вида kurs_valut_XXXXXX.htm
     
    aaproletarskiy и Красавчег нравится это.
  4. Красавчег

    Красавчег Завсегдатай

    Регистр.:
    15 мар 2010
    Сообщения:
    902
    Симпатии:
    298
    Что-то не работает у меня этот скрипт. Может у кого есть аналогичный, только 100% рабочий?
     
  5. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    все работает директорию downloads с правами на запись 777 создал? файлы кеша будут храниться в ней ну или переименуй вот эдесь на ту какая тебе нравится
    PHP:
    define('PATH','downloads/');
    ну и подключается вставкой
    PHP:
    <? require 'имя файла с этим скриптом';?>
     
    Красавчег нравится это.
  6. KPACHODAP

    KPACHODAP DELETED

    Регистр.:
    21 дек 2009
    Сообщения:
    640
    Симпатии:
    111
    как округлить данный курс валюты чтобы номинал отображался до сотых а не до тысячных как сейчас!

    Добавлено через 43 минуты
    все сделал сам:

     
  7. Красавчег

    Красавчег Завсегдатай

    Регистр.:
    15 мар 2010
    Сообщения:
    902
    Симпатии:
    298
    Вот только у меня файлы "TMP" каждый день собираются. Может как-то можно в скрипт дописать, чтоб старые удалялись?
     
  8. AutoRun

    AutoRun Создатель

    Регистр.:
    8 окт 2011
    Сообщения:
    22
    Симпатии:
    5
    Красавчег

    Вроде так работает:

    PHP:
    function DelTmpFile($kol_save_day) {
        
    $file_list scandir(PATH);
        
    $mktime_kol_save_day mktime(0,0,0,date("m"),date("d")-$kol_save_day,date("Y"));
     
        foreach (
    $file_list AS $k=>$file_name) {
            if (
    $file_name=='..' OR $file_name=='.') {
                continue;
            }
     
            if (
    preg_match('#(\d\d)(\d\d)(\d\d).htm#'$file_name$out)) {
                
    $mktime_file_name mktime(0,0,0,$out[2],$out[1],'20'.$out[3]);
                if ( 
    $mktime_file_name $mktime_kol_save_day ) {
                    
    unlink (PATH.$file_name);
                }
            }
        }
     
    }
     
    DelTmpFile(7);