Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Курс валют
 
 автор: Veresk   (27.06.2008 в 11:30)   письмо автору
 
 

Добрый день, опять возвращаюсь к курсу валют. Решила воспользоваться предоставленным вами кодом
Помогите, пожалуйста, разобрать при помощи регулярных выражений содержимое моего xml файла, вот кусок из него:

<?xml version="1.0" encoding="UTF-8" ?> 
- <ValCurs Date="27.06.2008" name="Официальный курс обмена">
- <Valute ID="47">
  <NumCode>978</NumCode> 
  <CharCode>EUR</CharCode> 
  <Nominal>1</Nominal> 
  <Name>Евро</Name> 
  <Value>15.6087</Value> 
  </Valute>
- <Valute ID="44">
  <NumCode>840</NumCode> 
  <CharCode>USD</CharCode> 
  <Nominal>1</Nominal> 
  <Name>Доллар США</Name> 
  <Value>9.9340</Value> 
  </Valute>
- <Valute ID="36">
  <NumCode>643</NumCode> 
  <CharCode>RUB</CharCode> 
  <Nominal>1</Nominal> 
  <Name>Российский Рубль</Name> 
  <Value>0.4232</Value> 
  </Valute>


Спасибо!

   
 
 автор: Axxil   (27.06.2008 в 11:45)   письмо автору
 
   для: Veresk   (27.06.2008 в 11:30)
 

А точно надо регулярные выражения использовать?
Может с помошью xml парсера проще будет?

   
 
 автор: sim5   (27.06.2008 в 12:51)   письмо автору
 
   для: Veresk   (27.06.2008 в 11:30)
 

На сайте ЦБ РФ есть готовый код.

   
 
 автор: cheops   (29.06.2008 в 14:36)   письмо автору
 
   для: Veresk   (27.06.2008 в 11:30)
 

Возможно вас заинтересует скрипт по ссылке http://www.softtime.ru/scripts/valute.php.

   
 
 автор: Veresk   (30.06.2008 в 09:07)   письмо автору
 
   для: cheops   (29.06.2008 в 14:36)
 

Добрый день,
по правде говоря, я именно этот скрипт и имела в виду, но, так как я не из России, я должна сослаться на xml файл своего нац. банка, а он у меня не отрабатывает, выдает :

Доллар - 
Евро - 

То есть я вставила в ваш код свою ссылку (http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=30.06.2008) и удалила фрагмент с заменой запятой на точку.
Мне очень-очень нужна ваша помощь!
Спасибо!

   
 
 автор: cheops   (30.06.2008 в 09:30)   письмо автору
 
   для: Veresk   (30.06.2008 в 09:07)
 

Хм... странно, посмотрите работает ли у вас следующий скрипт (у меня работает)
<?php
  
// Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru 
  
$content get_content(); 
  
// Разбираем содержимое, при помощи регулярных выражений 
  
$pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"
  
preg_match_all($pattern$content$outPREG_SET_ORDER); 
  
$dollar ""
  
$euro ""

  foreach(
$out as $cur
  { 
    if(
$cur[2] == 840$dollar str_replace(",",".",$cur[4]); 
    if(
$cur[2] == 978$euro   str_replace(",",".",$cur[4]); 
  } 
  echo 
"Доллар - ".$dollar."<br>"
  echo 
"Евро - ".$euro."<br>"
  function 
get_content() 
  { 
    
// Формируем сегодняшнюю дату 
    
$date date("d.m.Y"); 
    
// Формируем ссылку 
    
$link "http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=$date";
    
// Загружаем HTML-страницу 
    
$fd fopen($link"r"); 
    
$text=""
    if (!
$fd) echo "Запрашиваемая страница не найдена"
    else 
    { 
      
// Чтение содержимого файла в переменную $text 
      
while (!feof ($fd)) $text .= fgets($fd4096); 
    } 
    
// Закрыть открытый файловый дескриптор 
    
fclose ($fd); 
    return 
$text
  } 
?>

   
 
 автор: Veresk   (30.06.2008 в 09:40)   письмо автору
 
   для: cheops   (30.06.2008 в 09:30)
 

да, работает.

   
 
 автор: Veresk   (30.06.2008 в 10:43)   письмо автору
7.7 Кб
 
   для: Veresk   (30.06.2008 в 09:40)
 

Или, может быть, вы поможете мне разобраться с этим кодом (приложила файлы).
Выдает ошибку : "!Внимание, курс валют не соответствует текущей дате 30.06.2008!= 00.00.0000".
Не могу понять, в чем дело, раньше все было в порядке.
Спасибо!

   
 
 автор: mihdan   (30.06.2008 в 13:08)   письмо автору
 
   для: Veresk   (30.06.2008 в 10:43)
 

cheops дал вам на 100% работающий вариант, которым я и сам пользуюсь уже давно, а ваш код "неккоректен" и привязан к xml-парсеру, хотя задача проста и решается одним регулярным выражением

   
 
 автор: Veresk   (30.06.2008 в 13:50)   письмо автору
 
   для: mihdan   (30.06.2008 в 13:08)
 

Да, ваш код работает и у меня тоже, но когда я подставляю свою ссылку(http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date), - он не выдает ничего кроме :

Доллар -  
Евро -  

в этом-то и проблема.
помогите, please!!!!

   
 
 автор: AcidTrash   (30.06.2008 в 15:15)   письмо автору
 
   для: Veresk   (30.06.2008 в 13:50)
 

> http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date
У вас date не имеет значения.
Если вы хотите курс за какое-то число присвойте параметру date значение, например
http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=30.06.2008

   
 
 автор: Veresk   (30.06.2008 в 15:30)   письмо автору
 
   для: AcidTrash   (30.06.2008 в 15:15)
 

Ой, точно :)
Большое спасибо!!!
У меня еще вопрос: как часто этот скрипт обращается к банку?
Спасибо!

   
 
 автор: AcidTrash   (30.06.2008 в 15:36)   письмо автору
 
   для: Veresk   (30.06.2008 в 15:30)
 

С той частотой с которой вы будете его запускать.

   
 
 автор: Veresk   (30.06.2008 в 16:35)   письмо автору
 
   для: AcidTrash   (30.06.2008 в 15:36)
 

То есть, если я вывешу скрипт на сайт и 10 пользователей посетят мою страницу, тогда произойдет 10 обращений скрипта к банку?
Как это можно изменить? Мне необходимо одно или два обращения в сутки к банку.
Спасибо!

   
 
 автор: sim5   (30.06.2008 в 18:24)   письмо автору
 
   для: Veresk   (30.06.2008 в 16:35)
 

Записывайте полученный курс в базу. Если в базе храниться курс за прошедшее число - идем за обновлением курса и пишем его в базу, иначе выводим из базы. Зачем дважды за курсом обращаться?

   
 
 автор: Veresk   (02.07.2008 в 10:09)   письмо автору
 
   для: sim5   (30.06.2008 в 18:24)
 

Чего-то у меня не получается: необходимо раз в сутки записывать в файл курс валют и вызывать необходимые данные уже из этого файла, а у меня все время вылезают ошибки :(
Вот код:

<?php
 $content 
get_content(); 
  
$pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"
  
preg_match_all($pattern$content$outPREG_SET_ORDER); 
  
$dollar ""
  
$euro "";
   foreach(
$out as $cur
  { 
    if(
$cur[2] == 840$dollar $cur[4]; 
    if(
$cur[2] == 978$euro   $cur[4];
      } 
  echo 
"Dolar - ".$dollar."<br>"
  echo 
"Euro - ".$euro."<br>";
   function 
get_content() 
  { 
     
$date date("d/m/Y");
     
$time date("H.i"); 
     
$link file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
     
$cash "curs.xml";

  if (
$time = ("08.50") { 
    
$fd fopen($cash"w");
     
fwrite($fd,$link);
     
fclose ($fd); }
   
else (
$fd fopen($cash"r"));

 return 
$cash; }
?>


Помогите, ну ОЧЕНЬ надо!!!
Спасибо!

   
 
 автор: sim5   (02.07.2008 в 10:48)   письмо автору
 
   для: Veresk   (02.07.2008 в 10:09)
 

Можно такой вопрос - почему не в базу? Лучше, по моему, писать в нее, создав поля, например, usd, eur... и cursdate. И почему именно 8:50, вроде курсы валют устанавливаются по окончанию торговой сессии на валютной бирже, но это не как не утро. Почему просто не по дате запрос делать? Кстати в xml файлах это и есть дата, вы, если хотите, можете взять и за период дат, чтобы узнать рост или спад валюты. Просто первый ваш посетитель будет получать новый курс валюты на текущий день, остальные с базы, зачем вам время?

   
 
 автор: Veresk   (02.07.2008 в 12:01)   письмо автору
 
   для: sim5   (02.07.2008 в 10:48)
 

"Не в базу", потому что не работала с базой, вернее работала, но недостаточно, пока мне хотелось бы разобраться с файлами. Время 8:50 я выставила произвольно - для тестирования скрипта :). Если делать запрос по дате, то это необходимо каждый день сравнивать название предыдущего файла с каждым последующим и, затем, удаляя старый, создавать файл с новым именем или как-то иначе?
А что неверно в моем варианте?

   
 
 автор: sim5   (02.07.2008 в 13:33)   письмо автору
 
   для: Veresk   (02.07.2008 в 12:01)
 

У вас нет закрывающей скобки вот в этой строке: if ($time = ("08.50") {
А вообще же:

<?
//все-таки функции лучше по возможности объявлять вверху,
//а не разбрасывать их без надобности где непопадя,
//удобней код восприниматься будет
function getCurs() {
  
$date date("d/m/Y");
  
$pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
  
$link = @file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
  if (
$link) {
    
preg_match_all($pattern$link$outPREG_SET_ORDER);
    foreach(
$out as $cur) {
      if(
$cur[2] == 840$dollar str_replace(",",".",$cur[4]);
      if(
$cur[2] == 978$euro   str_replace(",",".",$cur[4]);
    }
    
$f fopen("curs.txt","w");
    
flock($fLOCK_EX);
    
fputs($f$date "\n"$dollar "\n" $euro);
    
flock($fLOCK_UN);
    
fclose($f);
  }
}
//получаем текущую дату
$date date("d/m/Y");
//получаем курсы валют из файла
//первой строкой в файле курса валют идет дата
//если получать и сравнивать эту дату из файла $curs[0]
//с текущей датой $date, то можно знать,
//обращаться ли за новым курсом и если требуется,
//то выполняем getCurs()
$curs file("curs.txt");
echo 
"Курс валют на: " $curs[0] . 
"<br>Доллар: " $curs[1] . 
"<br>Евро: " $curs[2];
?>

А уж лучше в базу - простая таблица, исключительно для курсов валют и динамике изменения их, вот и будет первая, все равно придется работать с базой когда нибудь.

   
 
 автор: Trianon   (02.07.2008 в 13:42)   письмо автору
 
   для: Veresk   (02.07.2008 в 12:01)
 

>А что неверно в моем варианте?

Ваш скрипт первой же строкой вызывает функцию get_content()
Функция get_content() практически сразу (независимо от того, когда шло последнее обращение)
дергает сервер центробанка. Насколько я понимаю, именно этого поведения Вы и стремитесь избежать.

Формально, Вам необходимо организовать кеширование запрошенных данных.
Фактически же,
а) перед запросом нужно сделать кое какую проверку см.(в)
б) запрашивая документ с сервера центробанка, его нужно записать к себе (в файл или в БД - неважно) , причем записать помимо файла еще и текущее время.
в) точнее п.а) более подробно: до запроса - сравнить текущее время с записанным временем плюс период опроса(в Вашем случае 12...24 часа , а точнее 12*3600 ... 24*3600 секунд)
Если текущее время меньше - взять содержимое из собственной копии
Если больше - см. п.б.
г) взятое содержимое обработать и выдать пользователю.

   
 
 автор: Veresk   (02.07.2008 в 15:07)   письмо автору
 
   для: Trianon   (02.07.2008 в 13:42)
 

Спасибо!
sim5, к сожалению, у меня ваш код не работает, в том смысле, что не создает он файл curs.txt :(
В чем может быть проблема?
Вот, с горя, взялась за mysql: дело в том, что хочу до пятницы решить эту задачу.

   
 
 автор: sim5   (02.07.2008 в 15:26)   письмо автору
 
   для: Veresk   (02.07.2008 в 15:07)
 

Вы уверены, что он не создается? Я ведь вам писал пример, в нем нет условия создания его, а подразумевается уже работа с ним. А вот так (поле функции):

<?
//получем текущую дату
$date date("d/m/Y");
//если нет файла курса, получаем курс валют,
//создавая этот файл
if (!file_exists("curs.txt")) getCurs();
//получаем курсы валют из файла
$curs file("curs.txt");
if (
$date $curs[0]) {
  
//если в файле курсов прошедшая дата,
  //обновляем курс и открываем заново файл
  
getCurs();
  
$curs file("curs.txt");
}
echo 
"Курс валют на: " $curs[0] . 
"<br>Доллар: " $curs[1] . 
"<br>Евро: " $curs[2];
?>

   
 
 автор: Trianon   (02.07.2008 в 16:06)   письмо автору
 
   для: sim5   (02.07.2008 в 15:26)
 

sim5,
блин.. ну нельзя же так... ну не сравнивается дата напрямую ни в каком формате кроме восточного!

   
 
 автор: sim5   (02.07.2008 в 16:29)   письмо автору
 
   для: Trianon   (02.07.2008 в 16:06)
 

Trianon, вы бы вместо того, чтобы ругаться так (я помню ваше, что вы говорили ранее), написали бы даме, свое предложение, включая время (она ведь что-то по времни хочет, а я сомневаюсь в полезности этого)) Ну не могу я пока убрать свой глючный набор (скачал по ссылке с кучей библиотек его), у меня главная проблема сейчас - закачка массива файлов, а время у меня сейчас сравнивается как захочу, я даже проверить то не все могу, ну если только не по mktime(), в этом случае у меня все ОК. Ну не расписывать же все... кто-то обязательно же заметит и пнет, вы же мимо не прошли!))

   
 
 автор: Trianon   (02.07.2008 в 16:56)   письмо автору
 
   для: sim5   (02.07.2008 в 16:29)
 

<?php

    $request_period 
12*60*60// опрос сервера не чаще чем раз в 12 часов.
    
clearstatcache();
    
$saved_time filemtime("rates_file.xml");
    if(
time() > $saved_time $request_period)
    {
        
$url "http://www.bnm.md/md/official_exchange_rates?get_xml=1&date="date('d.m.Y');
        
$file = @file_get_contents($url);
        
file_put_contents('rates_file.xml'$file);
        
$s 'requested:';
    }
    else 
$s 'cached:';
    
$file file_get_contents('rates_file.xml');
?>

to Veresk: После этого кода у Вас в переменной $file оказывается ответ сервера банка.
Либо кешированный либо свежий. Его и надо разбирать.
<?
    
echo $file;
    echo 
$s;
?>


P.S. Код исключительно демонстрационный. Только чтобы показать логику работы.
P.P.S. Конечно, xml нужно разбирать парсером XML, а никакими не регулярками.
Но это уже на совести программиста.

   
 
 автор: Trianon   (02.07.2008 в 17:12)   письмо автору
 
   для: sim5   (02.07.2008 в 16:29)
 

насчет своего набора Вы явно где-то запутались.
Если хотите - стукнитесть в аську, или скиньте свою - попробуем вместе разобраться в чем дело.

   
 
 автор: sim5   (02.07.2008 в 20:01)   письмо автору
 
   для: Trianon   (02.07.2008 в 17:12)
 

Ну вот видите Trianon, чинно и приятно (хотя надо даму подбивать на использование базы) :)
Я не пользуюсь аськой (Скайп, Агент майла). Я не запутался. Бог с ними со строками, верну назад старый пакет, но потом. Если при рабочем (хотя тоже вопрос, все ли работает) пакете копируется в папку только 5 файлов из формы, но если пятый по счету 6-ой после пустого поля формы, то копируется только 4 файла. Но зато в этом глючном пакете скопируется тоже 5, и даже, если 5-ый, это 6-ой по счету (после пустого поля)! Как-то же надо разобраться с чем это связано, потому и не меняю пока. В сети не нашел подобной проблемы, на форуме Котерова тоже глухо как в танке. Если вы знаете о такой проблеме - буду благодарен за инфу.

   
 
 автор: Trianon   (02.07.2008 в 20:44)   письмо автору
 
   для: sim5   (02.07.2008 в 20:01)
 

Нет. мне эта проблема неизвестна.
HTTPheaders в браузере показывает передачу всех файлов или только первых четырех?

   
 
 автор: sim5   (02.07.2008 в 21:54)   письмо автору
 
   для: Trianon   (02.07.2008 в 20:44)
 

Все файлы успешно загружаются на сервер, а вот из папки tmp в папку назначения копируются только 5 из них, и на двух испробованных РНР, результат разный, тот, что я указал выше.

   
 
 автор: Veresk   (02.07.2008 в 16:07)   письмо автору
 
   для: sim5   (02.07.2008 в 15:26)
 

sim5, огромное Вам спасибо!!!
Я, все-таки, попытаюсь и для базы данных соорудить код :)
Trianon, а что вы имеете ввиду: почему так нельзя - код, ведь, работает?

   
 
 автор: Trianon   (02.07.2008 в 16:19)   письмо автору
 
   для: Veresk   (02.07.2008 в 16:07)
 

потому что когда придет время сравнить "31/07/2008" и "01/08/2008" , первая строка окажется больше второй. И код рухнет.

И еще. Национальный банк Молдовы дату в таком формате 02/07/2008 не принимает.
Принимает только таком 02.07.2008. Во всяком случае из двух запросов
http://www.bnm.md/md/official_exchange_rates?get_xml=1&date=02/07/2008
http://www.bnm.md/md/official_exchange_rates?get_xml=1&date=02.07.2008
реальный курс на дату выдает только последний.

   
 
 автор: Veresk   (02.07.2008 в 16:34)   письмо автору
 
   для: Trianon   (02.07.2008 в 16:19)
 

Спасибо, Trianon, а насчет дат, я конечно же все это поменяла, просто тестировала со ссылкой на www.cbr.ru :)
Как же избежать такой жуткой ошибки при сравнении дат?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования