Перейти к содержимому


Курсы валют


Сообщений в теме: 8

#1 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 11 Ноябрь 2012 - 17:49

кто нибудь пробовал решать задачу получения курсов от ЦБ и вставки в таблицу?

к примеру ЦБР ежедневно выдает таблицу
http://cbr.ru/curren..._req=10.11.2012

как я понимаю она стандартная.
было бы здорово вытаскивать оттуда заданный (скажем по коду валюты) курс и впихивать в табличку в ClientBase, конечно по датам

если никак, то подскажите где можно подредактировать шапку в SAAS - места там много - я бы хоть информер от рбк втиснул туда (или в SAAS никак?)

Сообщение отредактировал UmaCat: 11 Ноябрь 2012 - 17:50


#2 SysLink

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений
  • Пол:Мужчина
  • Город:г.Москва

Отправлено 11 Ноябрь 2012 - 18:23

Данные лучше вытаскивать из XML файла, на том же cbr.ru - http://www.cbr.ru/sc..._req=11/11/2012
Вот краткое описание, с примерами - http://www.cbr.ru/sc....asp?Prtid=SXML

Сделайте скрипт, который запускается по Cron'y, например, который в свою очередь распарсит XML файл и запишет нужный курс в таблицу.
Основатель и экс-директор интернет-магазина с оборотом более миллиарда рублей. Автор книги "Успешный интернет-магазин с нуля". Автор персонального блога, пишу об электронной коммерции и бизнесе в целом. Бизнес-практик и наставник. Куратор и идейный вдохновитель ряда корпоративных веб-разработок. Да и просто хороший позитивный человек! ;)

#3 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 11 Ноябрь 2012 - 22:02

Просмотр сообщенияSysLink (11 Ноябрь 2012 - 18:23) писал:

Данные лучше вытаскивать из XML файла, на том же cbr.ru - http://www.cbr.ru/sc..._req=11/11/2012
Вот краткое описание, с примерами - http://www.cbr.ru/sc....asp?Prtid=SXML

Сделайте скрипт, который запускается по Cron'y, например, который в свою очередь распарсит XML файл и запишет нужный курс в таблицу.

Спасибо за подсказку.
Буду копаться :) (я вообще умею только читать PHP писать с 0 я не умею :) ) насколько я понимаю копать надо в сторону парсинга DOM или SimpleXML - поищем примеры

#4 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 21 Декабрь 2012 - 16:04

реализовал по другому, пришлось гуглить усиленно (распарсивание конечно не мое, но подобный метод пригодился)
не хочу крон, хочу чтобы обновлялось по кнопке Доп.Действия
только две просьбы, я запутался в форматах данных и надо чтобы выполнялось только 1 раз, а программа говорит что выполнится для всех записей в таблице.

помогите с форматами при записи в таблицу
в конце кода
переменная $dollar=30.7592 (с точкой!!) - и если проверять isnumeric - выдает true
переменная $eur=40.6544 (с точкой!!) - и если проверять isnumeric - выдает true

а в базу записывается просто 30,0000 и 40,0000 (с запятыми)
дата вообще не записывается

а дату он почему-то записал как 20.12.2020, хотя должно было 20.12.2012
а следующую дату записал как 20.12.2021, а должно было 21.12.2012
запутался :(

Пожалуйста просветите с форматами - самое важное (и как сделать, чтобы один раз скрипт выполнялся, а не для всех записей? и чтобы предупреждения не было)


//находим максимальную дату
$sqlQuery = "SELECT max(`f1495`) AS maximumdate FROM `".DATA_TABLE."122` WHERE `status`<>'2'";
$result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
$row = mysql_fetch_assoc($result);
$dol=$row['maximumdate'];

//получаем сегодняшнюю дату
$todaydate=date("Y-m-d"); // 2001-03-10 (the MySQL DATETIME format)

//Разница дат в UNIX формате деленное на количество секунд в сутках -
$differencedate=(strtotime($todaydate)-strtotime($dol))/3600/24;

//цикл для пересчета даты с последней в базе до текущей
for ($i = 1; $i <= $differencedate ; $i++) {
//Определяем дату в формате, который используется на сайте cbr.ru
  $sleddate=date("d.m.Y",(strtotime($dol)+($i*3600*24)));

//Определим код нашей валюты на сайте cbr.ru
//Америконский доллар
$codeusd='R01235';
$codeeur='R01239';

//Выполняем первый пункт, считываем страницу с курсами валют в переменную

$filekurs = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".$sleddate);

//Разбираем страницу с помощью регулярок:
preg_match("/\<Valute ID=\"".$codeusd."\".*?\>(.*?)\<\/Valute\>/is", $filekurs, $m);
preg_match("/<Value>(.*?)<\/Value>/is", $m[1], $r);

//Запятую, отделяющую дробную часть заменяем на точку, и у нас в переменной $dollar находится курс доллара.
$dollar = str_replace(",", ".", $r[1]);	
//$dollar =$r[1];	

//EUR
//Разбираем страницу с помощью регулярок:
preg_match("/\<Valute ID=\"".$codeeur."\".*?\>(.*?)\<\/Valute\>/is", $filekurs, $m);
preg_match("/<Value>(.*?)<\/Value>/is", $m[1], $r);

//Запятую, отделяющую дробную часть заменяем на точку, и у нас в переменной $dollar находится курс доллара.
$eur= str_replace(",", ".", $r[1]);	
//$eur=$r[1];	

//вот здесь какая-то фигня с форматами
$data['Дата'] = $sleddate;
$data['EUR/USD'] = number_format($eur/$dollar, '/4');
$data['USD/RUR'] = number_format($dollar, 4, ',', ' ');
$data['EUR/RUR'] = number_format($eur, 4, ',', ' ');
insert_query($data,"Курс ЦБ");


}

Сообщение отредактировал UmaCat: 21 Декабрь 2012 - 16:08


#5 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 21 Декабрь 2012 - 18:05

с форматом даты разобрался

$datetothebase = new DateTime($sleddate);
$data['Дата'] = date_format($datetothebase, 'Y-m-d H:i:s') ;
а вот с цифрами пока никак - не могу понять почему в переменной одно написано, а пишется в базу только целое число

с цифрами тоже разобрался
$data['USD/RUR'] =floatval($dollar);
$data['EUR/RUR'] = floatval($eur);

кто подскажет как сделать чтобы код был на доп.действии в таблице, и не выполнялся для всех записей?

Сообщение отредактировал UmaCat: 21 Декабрь 2012 - 18:17


#6 Oleg_

    Активный участник

  • Пользователи
  • PipPipPip
  • 118 сообщений

Отправлено 21 Декабрь 2012 - 18:50

А в настройке поля указано возможность писать дробное значение?

#7 Oleg_

    Активный участник

  • Пользователи
  • PipPipPip
  • 118 сообщений

Отправлено 21 Декабрь 2012 - 18:54

Цитата

кто подскажет как сделать чтобы код был на доп.действии в таблице, и не выполнялся для всех записей?
думаю что надо указать
WHERE "id=".$ID


#8 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 21 Декабрь 2012 - 18:56

Просмотр сообщенияOleg_ (21 Декабрь 2012 - 18:50) писал:

А в настройке поля указано возможность писать дробное значение?

конечно, у меня же там данные уже внесены - до этого руками вносились (у меня версия 1.9.5)
Тип поля - число
Число знаков всего / после запятой: 10/4

но я уже разобрался через floatval заношу

более того разобрался чтобы не над всеми записями производилось вычисление - вставил в самом конце вот это
и страница обновляется и скрипт заканчивается

header("Location: http://data.ХХХХХХХХХХ.com/fields.php?table=122&page=1");
die();

как вот теперь отключить грозное сообщение о том что действия скрипта будет для всех записей?
хотя это уже не принципиально, все равно не выполнится, видимо это настройки самой Базы, а для других таблиц это важно (я бы не хотел совсем отключать это сообщение, а только в одной таблице)

Всем спасибо.
PS: ура, гугль спасет мир!? и умеющий только читать, начнет иногда писать (ну и частично копипастить :) )

Сообщение отредактировал UmaCat: 21 Декабрь 2012 - 19:02


#9 Dinak

    Активный участник

  • Пользователи
  • PipPipPip
  • 207 сообщений
  • Пол:Мужчина
  • Город:Новосибирск

Отправлено 05 Декабрь 2013 - 07:18

Люди добрые ) а для не "въезжаюЩих" распишите как по крону получать курс валют для версии 1,9,9 Local





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных