Парсер курсов валют в базу

348
12 января 2017, 05:06

Ситуация такая - вот код парсера:

<?php
include "dbc.php";
$dbcnx = @mysql_connect($DB_HOST,$DB_USER,$DB_PASSWORD);
mysql_query("SET character_set_results = 'utf8'", $dbcnx);
mysql_set_charset('utf8');
mysql_select_db($DB_NAME, $dbcnx);
  $date = date("d/m/Y"); // Сегодняшняя дата в необходимом формате
  $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; // Ссылка на XML-файл с курсами валют
  $content = file_get_contents($link); // Скачиваем содержимое страницы
  $dom = new domDocument("1.0", "cp1251"); // Создаём DOM
  $dom->loadXML($content); // Загружаем в DOM XML-документ
  $root = $dom->documentElement; // Берём корневой элемент
  $childs = $root->childNodes; // Получаем список дочерних элементов
  $data = array(); // Набор данных
  for ($i = 0; $i < $childs->length; $i++) {
    $childs_new = $childs->item($i)->childNodes; // Берём дочерние узлы
    for ($j = 0; $j < $childs_new->length; $j++) {
      /* Ищем интересующие нас валюты */
      $el = $childs_new->item($j);
      $code = $el->nodeValue;
      if (($code == "USD") || ($code == "EUR")) $data[] = $childs_new; // Добавляем необходимые валюты в массив
    }
  }
  /* Перебор массива с данными о валютах */
  for ($i = 0; $i < count($data); $i++) {
    $list = $data[$i];
    for ($j = 0; $j < $list->length; $j++) {
      $el = $list->item($j);
      /* Выводим курсы валют */

      if ($el->nodeName == "Name") {
        // echo $el->nodeValue;
        if ($el->nodeValue == "Доллар США") $cur = "USD";
        if ($el->nodeValue == "Евро") $cur = "EUR";
        echo $cur;
      }
      elseif ($el->nodeName == "Value") {
        // echo $el->nodeValue."<br>";
        $val = $el->nodeName;
      }
    mysql_query("UPDATE `law_all_currency` SET `$cur` = '$val'");
    }
  }
mysql_close($dbcnx);
?>

Все до боли понятно, но у меня не получается по-человечески запихнуть значение USD в колонку USD и значение EUR в колонку EUR таблицы "law_all_currency"

Прошу о помощи. Спасибо заранее!

Answer 1

Надо писать заместо:

$val = $el->nodeName;

это

$val = $el->nodeValue;
Answer 2

Добавлю сюда вариант кода слегка попроще вашего для получения данных, может пригодится.

Для начала получаем курс валют в XML на текущую дату (без параметра):

$url = "http://www.cbr.ru/scripts/XML_daily.asp";
$content = file_get_contents($url);

Далее используем SimpleXML для работы.

$xml = new SimpleXMLElement($content);

Поскольку идентификаторы ID валют не изменяются, то нам нужно извлечь узлы cо значениями R01235и R01239. Для этих целей используем XPath выражение вида "/ValCurs/Valute[@ID='R01235']/Value". Для получения текстового значения узла его необходимо явно или неявно привести к типу string:

$cfg = ['usd' => 'R01235', 'eur' => 'R01239'];
$data = [];
foreach($cfg as $k => $id){
    $v = (string) $xml->xpath("/ValCurs/Valute[@ID='$id']/Value")[0];
    $data[$k] = floatVal(str_replace(',', '.', $v));
}

При необходимости заменяя запятую в значении на нужный нам разделитель. На выходе имеем массив:

Array
(
    [usd] => 59.9533
    [eur] => 63.5445
)

Если необходимо использовать DOM, то код будет следующим:

$xml = new DOMDocument();
$xml->loadXML($content);
$xp = new DOMXPath($xml);
foreach($cfg as $k => $id){
    $data[$k] = $xp->query("/ValCurs/Valute[@ID='$id']/Value")->item(0)->nodeValue;
}
READ ALSO
SELECT с блокировкой FOR UPDATE

SELECT с блокировкой FOR UPDATE

Имеется запрос такого вида:

296
Entity Framework и большая база данных Mysql

Entity Framework и большая база данных Mysql

Делаю приложение, которое работает server side и показывает таблицу со 120000 книгами

423
Сортировка коллекции. Интерфейс Comparator

Сортировка коллекции. Интерфейс Comparator

Возникла необходимость избавиться от второго метода сравнения compareоднако после его удаления программа не компилируетсяПодскажите в чем...

265
Клиент-серверная архитектура Android [требует правки]

Клиент-серверная архитектура Android [требует правки]

Мне нужно построить клиент-серверную архитектуруКлиентом выступает Android приложение, однако в будущем планируется и создание web-страницы...

252