Привожу простейший сниппет, выводящий курсы доллара и евро на основе данных Банка России. Рекомендуется перед использованием доработать сниппет под свои нужды. Также есть широкий простор для оптимизации – сейчас сниппет явно не оптимален, но работает правильно. Пример вывода результата можно посмотреть на странице
примера курсов валют.
Выводится приблизительно такой текст:
Сегодня четверг, 27 декабря 2007 года, курсы валют по отношению к рублю установлены на торгах, состоявшихся 26 декабря 2007 года.
Курс доллара США: 24.7019, снижение на 0.0177.
Курс евро: 35.6152, рост на 0.0313.
Итак, исходный текст (используется кодировка UTF-8):
<?php
setlocale (LC_ALL, ’ru_RU.UTF8’);
$url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=";
$content = file_get_contents ($url.date("d/m/Y"));
function XMLToArray($xml) {
$parser=xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser,$xml,$values);
xml_parser_free($parser);
$return = array();
$stack = array();
$return["Date"] = $values[0]["attributes"]["Date"];
foreach($values as $val) {
if($val[’type’] == "open") {
if($val[’tag’] == "Valute") $val[’tag’].=$val[attributes][ID];
array_push($stack, $val[’tag’]);
} elseif($val[’type’] == "close") {
array_pop($stack);
} elseif($val[’type’] == "complete") {
array_push($stack, $val[’tag’]);
setArrayValue($return, $stack, $val[’value’]);
array_pop($stack);
}
}
;
return $return;
}
function setArrayValue(&$array, $stack, $value) {
if ($stack) {
$key = array_shift($stack);
setArrayValue($array[$key], $stack, $value);
return $array;
} else {
$array = $value;
}
}
$array = XMLToArray($content);
$dollarmain=str_replace(",",".",$array[’ValCurs’][’ValuteR01235’][’Value’]);
$euromain=str_replace(",",".",$array[’ValCurs’][’ValuteR01239’][’Value’]);
$mdate=str_replace(".","/",$array[’Date’]);
$date = explode("/",$mdate);
$prev = mktime(1,0,0,$date[1],$date[0],$date[2])-86400;
$contentp = file_get_contents ($url.date("d/m/Y", $prev));
$arrayp = XMLToArray($contentp);
$dollarchange=$dollarmain-str_replace(",",".",$arrayp[’ValCurs’][’ValuteR01235’][’Value’]);
$eurochange=$euromain-str_replace(",",".",$arrayp[’ValCurs’][’ValuteR01239’][’Value’]);
if (($dollarchange) < 0) {$dollarct = ’, снижение на ’;} else {$dollarct = ’, рост на ’;}
if (($eurochange) < 0) {$euroct = ’, снижение на ’;} else {$euroct = ’, рост на ’;}
$ret= ’<p>Сегодня <strong>’.mb_strtolower (strftime("%A, %d %B %Y"),’UTF-8’).’ года</strong>, курсы валют по отношению к рублю установлены на торгах, состоявшихся ’.mb_strtolower (strftime("%d %B %Y", $prev),’UTF-8’).’ года.</p>’;
$ret.= ’<p>Курс доллара США: <strong>’.$dollarmain.’</strong>’.$dollarct.number_format(abs($dollarchange), 4).’.</p>’;
$ret.= ’<p>Курс евро: <strong>’.$euromain.’</strong>’.$euroct.number_format(abs($eurochange), 4).’.</p>’;
return $ret;
?>
Quote from: security at Feb 28, 2008, 09:51 AM
Все работало до того момента, пока хостер не поставил PHP5 
Дело не в PHP5 – у меня именно в этой версии все работает. Скорее изменились настройки PHP, может, какие-то модули не установлены. Как вариант, возможно отсутствует поддержка mbstring.
или сконфигурировали без XML
--disable-xml
поглядите, что phpinfo() показывает
Нашел только вот это-
’--with-libxml-dir=/usr/local’
libXML support active
libXML Version 2.6.31
libXML streams enabled
Где смотреть поддерживается ли mbstring?
Quote from: security at Feb 29, 2008, 02:37 PM
Где смотреть поддерживается ли mbstring?
Проверить, extension_loaded(’mbstring’) выдает истину или ложь. Но вообще-то проблема может и в другом быть - нужно смотреть, что конкретно не работает. Но версия PHP точно не влияет.
Не знаю, что и почему не работает. Надо на конкретном хостинге отлавливать ошибку. Скорее или не читаются исходные данные с сайта или XML неверно преобразуется, но конкретно сказать трудно.