Использование переменных для анализа XML-канала с помощью PHP-XPath - PullRequest
2 голосов
/ 18 января 2011

У меня проблема с использованием PHPXPath для извлечения курсов валют в зависимости от страны, в которой зарегистрирован клиент.

Для справки: PHP XPath - это класс php для поиска в XMLдокумент с использованием XPath.

У меня есть база данных со всеми нациями клиентов и соответствующими значениями валют.

Код, который я использую до сих пор для получения курсов (из канала ECB), таков:

$Rates = new XPath();
$Rates->importFromFile("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"); 
$userRate = $Rates->getAttributes("//Cube[@currency='USD']","rate"); 

Теперь я хочу передать переменную в качестве значения валюты (USD в приведенном выше примере).Моя проблема в том, что, поскольку я совершенно новичок в XPath, это синтаксис для этого.Предполагая, что имя переменной

$user_data->GRUPPO_005

Я пробовал следующие решения, но я получаю сообщение об ошибке «UNEXPECTED T_VARIABLE»:

$userRate = $Rates->getAttributes("//Cube[@currency='"$user_data->GRUPPO_005"']","rate"); 
$userRate = $Rates->getAttributes("//Cube[@currency='".$user_data->GRUPPO_005."']","rate"); 
$userRate = $Rates->getAttributes("//Cube[@currency='.$user_data->GRUPPO_005.']","rate"); 

Я думаю, что это из-за моих скудных знанийязыка, я хотел бы небольшой намек на это.

Ответы [ 2 ]

1 голос
/ 18 января 2011

Хорошо, я понятия не имею, что такое PHPXPath, но, поскольку у вас, похоже, возникают проблемы при сборке строки, попробуйте

$Rates->getAttributes(
    sprintf('//Cube[@currency="%s"]', $user_data->GRUPPO_005),
    'rate'
);

См. http://us3.php.net/manual/en/function.sprintf.php

В sidenote есть Пакет PEAR для ставок ECB , так что вы можете избавить себя от некоторых проблем при написании собственного инструмента запросов, просто воспользовавшись им.

0 голосов
/ 10 июля 2013

Хотя ваша проблема может быть решена, я предоставлю некоторый альтернативный код для ecb.int, на тот случай, если вам или другому пользователю понадобится собрать обновленные тарифы.

    function getCurrencyRates( $url ){
      $doc = new DOMDocument();
      ini_set('display_errors','Off'); 
      $doc->load( $url );
      ini_set('display_errors','On'); 
      $list = $doc->getElementsByTagName( 'Cube' );

      foreach( $list as $node )
        if( $node->getAttribute( 'currency' ) )
          $rates[
            strtoupper( $node->getAttribute( 'currency' ) )] =
            floatval( $node->getAttribute( 'rate' ) );

      return $rates;
    }

    $url = 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml';
    $currencies_array=getCurrencyRates( $url );

    if($currencies_array > ''){
      reset($currencies_array);
    }

    if($currencies_array['USD'] > 0)
    {
      $eurtousd = 1 / $currencies_array['USD'];
    }

    if($eurtousd > 0)
    {

        $sql_update_currencies=mysql_query("UPDATE currencies SET per1usdollar='" . $eurtousd . "', lastupdated=now() WHERE iso='EUR'");

        if($sql_update_currencies){}
    }

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

    $sql_rates_cycle=mysql_query("SELECT iso FROM currencies group BY iso ORDER BY iso ASC");

    while(list($iso)=mysql_fetch_row($sql_rates_cycle))
    {
       //...Put code here similar to that above, 
       //using the variable $iso in place of 'USD'
    }
...