我在使用PHPXPath根据登录客户的国家/地区获取汇率时遇到问题。
供参考:PHP XPath是一个用于使用XPath搜索XML文档的php类。
我有一个包含所有客户国家和相关货币值的数据库。
到目前为止我用来获取费率的代码(来自ECB Feed)是这样的:
$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
我尝试了以下解决方案,但我一直收到“意外的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");
我认为这是因为我对语言的了解很少,我会喜欢这一点。
答案 0 :(得分:1)
好的,我不知道PHPXPath是什么,但是因为你似乎在组装字符串时遇到了麻烦,试试
$Rates->getAttributes(
sprintf('//Cube[@currency="%s"]', $user_data->GRUPPO_005),
'rate'
);
请参阅http://us3.php.net/manual/en/function.sprintf.php
在旁注中,有一个PEAR Package for the ECB rates,因此您只需使用它就可以省去编写自己的查询工具的麻烦。
答案 1 :(得分:0)
虽然您的问题可能已经解决,但我会为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'
}