Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Правильно написал код или нет..., но вроде работает
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




Приветствую Форумчане!

Решил сделать для сайта виджет курса валют.

Для Казахстана парсир гугл www.google.com/finance/converter

Написал вот такой код
<?php

define('KEY', true);
//////////////////////////////////////////////////

$from[1] = 'USD';
$from[2] = 'EUR';
$from[3] = 'RUB';
$to = 'KZT';
$i = 0;

// Рисуем табличку
$kurs = "<div class=\"kursy\">\n";

while($i <= 2) {
$i++;
$get = file_get_contents("https://www.google.com/finance/converter?a=1&from=$from[$i]&to=$to");
$get = explode("<span class=bld>",$get);
$get = explode("</span>",$get[1]);
$converted_amount = preg_replace("/[^0-9\.]/", null, $get[0]);
$converted_amount = round($converted_amount,2);

switch($from[$i]){

case 'USD':
$flags = "usa.png";
break;
case 'EUR':
$flags = "euro.png";
break;
case 'RUB':
$flags = "rus.png";
break;
}

$kurs .= "<table>\n";
$kurs .= "<tr>\n";
$kurs .= "<td class=\"krs\">".$from[$i]."</td>\n";
$kurs .= "<td class=\"krs1\"><img src=\"http://olm.kz/skins/images/".$flags."\" /></td>\n";
$kurs .= "<td class=\"krs2\">".$converted_amount." тг<br/></td>\n";
$kurs .= "</tr>";
$kurs .= "</table>";
}
$kurs .= "</div>\n";

echo json_encode($kurs);


На сайт я его подгружаю через аякс. Но вот в логах порой появляется ошибка вида
Цитата
PHP Warning:  file_get_contents(https://www.google.com/finance/converter?a=1&amp;from=EUR&amp;to=KZT) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: Connection timed out in /home/c/cl12605/rinat/public_html/php/kurs.php on line 17

Как раз ссылается на file_get_contents

Немного погуглив понял что нужно использовать не file_get_contents, а CURL.

Посмотрев мануал попробовал написать на CURL, но конечно получилось
не с первого раза.
Написал код вот так
<?php

define('KEY', true);
//////////////////////////////////////////////////

$from[1] = 'USD';
$from[2] = 'EUR';
$from[3] = 'RUB';
$to = 'KZT';
$i = 0;

// Рисуем вывод
$kurs = "<div class=\"kursy\">\n";

while($i <= 2) {
$i++;
$pars = curl_init();
curl_setopt($pars, CURLOPT_URL, "https://www.google.com/finance/converter?a=1&from=$from[$i]&to=$to");
curl_setopt($pars, CURLOPT_HEADER, false);
curl_setopt($pars, CURLOPT_RETURNTRANSFER, true);
curl_setopt($pars, CURLOPT_CONNECTTIMEOUT, 5);
$get = curl_exec($pars);
curl_close($pars);
$get = explode("<span class=bld>",$get);
$get = explode("</span>",$get[1]);
$converted_amount = preg_replace("/[^0-9\.]/", null, $get[0]);
$converted_amount = round($converted_amount,2);

switch($from[$i]){

case 'USD':
$flags = "usa.png";
break;
case 'EUR':
$flags = "euro.png";
break;
case 'RUB':
$flags = "rus.png";
break;
}

$kurs .= "<table>\n";
$kurs .= "<tr>\n";
$kurs .= "<td class=\"krs\">".$from[$i]."</td>\n";
$kurs .= "<td class=\"krs1\"><img src=\"http://olm.kz/skins/images/".$flags."\" /></td>\n";
$kurs .= "<td class=\"krs2\">".$converted_amount." тг<br/></td>\n";
$kurs .= "</tr>";
$kurs .= "</table>";
}
$kurs .= "</div>\n";

echo json_encode($kurs);


Вроде работает, причем намного быстрее чем с file_get_contents

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


_





PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1618
Пользователь №: 28976
На форуме: 6 лет, 20 дней
Карма: 102




	$url = 'http://kazfin.info/kazakhstan/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_NOBODY, 0 );
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$content = curl_exec($ch);
curl_close ( $ch );

$start = '<div class="panel panel-default" id="short">';
$finish = '<div class="panel-separator"></div>';

//Вырезаем нужный блок
$position = strpos($content, $start);
$content = substr($content, $position);
$position = strpos($content, $finish);
//Вырезаем код
$content = substr($content, 0, $position);

// картинки
$content = str_replace('/i/sf/', 'http://kazfin.info/i/sf/', $content);

// Перекодировка
$content = iconv("utf-8", "windows-1251", $content);

echo $content;
ответ
Курсы валют к казахстанскому тенге Курсы основных валют в Казахстане 28.04.2016
Все валюты
Официальные курсы основных валют к казахстанскому тенге
в Казахстане на 28.04.2016

Курс доллара США к казахстанскому тенге USD Доллар США 331,08 ↓ −2,1800
Курс евро к казахстанскому тенге EUR Евро 374,58 ↓ −1,4700
Курс российского рубля к казахстанскому тенге RUR Российский рубль 5,08 ↑ +0,0600
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1618
Пользователь №: 28976
На форуме: 6 лет, 20 дней
Карма: 102




у тебя идет 3 запроса подряд, в цикле. Это не хорошо.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9006
Пользователь №: 26630
На форуме: 6 лет, 5 месяцев, 17 дней
Карма: 615




Astin
а вашему центра банку доверия нет?
http://www.nationalbank.kz/rss/rates_all.xml
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




Цитата
а вашему центра банку доверия нет?
http://www.nationalbank.kz/rss/rates_all.xml

killer8080 НЕт есть, я просто не знал где у них брать это

Цитата
у тебя идет 3 запроса подряд, в цикле. Это не хорошо.

Kusss А как тогда сделать лучше
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




Нашел обмен нашего банка http://www.nationalbank.kz/?docid=747&switch=russian
только вот не пойму как использовать ихнее, у них метод передачи ПОСТ

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




Kusss извини не заметил код выше, спасибо. Но немного не так отображается,
попробую переделать
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7





Короче, чтоб переделать вывод под свой стиль ничего умнее не нашел чем str_replace

В итоге получилось вот так
<?php

define('KEY', true);
//////////////////////////////////////////////////

$url = 'http://kazfin.info/kazakhstan/';
$ch = curl_init($url);

curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_NOBODY, 0 );
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$content = curl_exec($ch);
curl_close ( $ch );


$start = '<table class="table table-striped">';
$finish = '</div>';

//Вырезаем нужный блок
$position = strpos($content, $start);
$content = substr($content, $position);
$position = strpos($content, $finish);
//Вырезаем код
$content = substr($content, 0, $position);

$content = str_replace('<table class="table table-striped">', '<div class="kursy"><table>', $content);

$content = str_replace('<img src="/i/sf/usd.png" alt="Курс доллара США к казахстанскому тенге" class="flag" />', '', $content);
$content = str_replace('<img src="/i/sf/eur.png" alt="Курс евро к казахстанскому тенге" class="flag" />', '', $content);
$content = str_replace('<img src="/i/sf/rur.png" alt="Курс российского рубля к казахстанскому тенге" class="flag" />', '', $content);

$content = str_replace('<td> <small>', '<td class="krs"><small>', $content);

$content = str_replace('<td>Доллар США</td>', '<td class="krs1"><img src="http://olm.kz/skins/images/usa.png" /></td>', $content);

$content = str_replace('<td>Евро</td>', '<td class="krs1"><img src="http://olm.kz/skins/images/euro.png" /></td>', $content);

$content = str_replace('<td>Российский рубль</td>', '<td class="krs1"><img src="http://olm.kz/skins/images/rus.png" /></td>', $content);

$content = str_replace('<td class="r">', '<td class="krs2">', $content);

$content = str_replace(' </td>', ' тг</td>', $content);

$content = str_replace('<td class="krs2"><span class="n">0,00</span></td>', '<tr></tr>', $content);

$content = str_replace('</table>', '</table></div>', $content);


echo json_encode($content);
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9006
Пользователь №: 26630
На форуме: 6 лет, 5 месяцев, 17 дней
Карма: 615




Astin
а xml чем не угодил?



Спустя 11 минут, 37 секунд killer8080 написал(а):
$xml = simplexml_load_file('http://www.nationalbank.kz/rss/rates_all.xml');
$currency = ['USD', 'EUR', 'RUB'];

if (!$xml) {
return;
}

foreach ($xml->channel->item as $item) {
if (in_array($item->title, $currency)) {
echo "{$item->title} - {$item->description}<br />";
}
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




Цитата
а xml чем не угодил?

killer8080 а я не знал как правильно сделать с xml

Позже попробую и его
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




С xml получилось вот так
<?php

define('KEY', true);

define('HOSTS', 'http://'. $_SERVER['HTTP_HOST'] .'/');
/////////////////////////////////////////////////////////

$xml = simplexml_load_file('http://www.nationalbank.kz/rss/rates_all.xml');
$currency = array('USD', 'EUR', 'RUB');


if (!$xml) {
return;
}

// Рисуем вывод
$kurs = "<div class=\"kursy\">\n";

foreach ($xml->channel->item as $item) {
if (in_array($item->title, $currency)) {

switch($item->title)
{
case 'USD':
$flags = "usa.png";
break;
case 'EUR':
$flags = "euro.png";
break;
case 'RUB':
$flags = "rus.png";
break;
}

$kurs .= '<table>';
$kurs .= '<tr>';
$kurs .= '<td class="krs">'.$item->title.'</td>';
$kurs .= '<td class="krs1"><img src="'.HOSTS.'skins/images/'.$flags.'" /></td>';
$kurs .= '<td class="krs2">'.$item->description.' тг<br/></td>';
$kurs .= '</tr>';
$kurs .= '</table>';

}
}

$kurs .= "</div>\n";

echo json_encode($kurs);


Главное чтоб у них этот xml файл обновлялся

_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 9006
Пользователь №: 26630
На форуме: 6 лет, 5 месяцев, 17 дней
Карма: 615




Цитата (Astin @ 2.05.2016 - 17:46)
Главное чтоб у них этот xml файл обновлялся

врядли он обновляется чаще чем раз в сутки. В любом случае дергать все время сторонний ресурс не хорошо, нужно кешировать полученный результат, а обновлять по крону, например.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




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

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

Я вообще о
подгружаю файл через ajax и им же обновляю, но вот думаю отключить обновление через него.

Наверно лучше сделать так:

1) На крон повесить событие чтоб он обновлял данные раз в сутки

2) А уже в файл вывода курсов валют разместить данные из БД

Так наверно правильнее будет раз вы говорите что лучше не дергать
каждый раз информацию с другого сайта.

Че то вроде сообщение Kusss написал, а теперь не вижу его
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16220
Пользователь №: 6543
На форуме: 8 лет, 10 месяцев, 15 дней
Карма: 304

Трезвый :
6 лет, 7 месяцев, 25 дней


Цитата (Astin @ 30.04.2016 - 11:04)
Но вот в логах порой появляется ошибка вида

Центробанк не особо любит, когда его часто дергают. Потому и банит. Курл тут тоже до поры до времени. killer8080 прав, нужен кэш. Глянь вот тут, давно правда писано, но работает несколько лет как часики.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 6 месяцев, 7 дней
Карма: 7




twin Огромное СПАСИБО!
Я что то подобное искал, чуть позже обязательно разберусь что к чему

Сейчас пока сделал так:

Записал данные в бд и поставил обновление на крон раз в сутки
Код
<?php

define('KEY', true);

$link = mysql_connect( 'localhost', 'xxx', 'xxx' ) or die('NO_CONNECT');
mysql_select_db('xxx', $link) or die ('NO_DB_SELECT');

mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');
mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"');
///////////////////////////////////////////////////////////
function escapStr($data)
{
return mysql_real_escape_string($data);
}
///////////////////////////////////////////////////////////
$xml = simplexml_load_file('http://www.nationalbank.kz/rss/rates_all.xml');
$currency = array('USD', 'EUR', 'RUB');

if (!$xml) {
return;
}

foreach ($xml->channel->item as $item) {
if (in_array($item->title, $currency)) {

$query = mysql_query("UPDATE `kurs`
SET `title` = '"
.escapStr($item->title) ."',
`itog` = '"
.escapStr($item->description)."'
WHERE `title` = '"
.escapStr($item->title) ."'
"
);

}
}


Пхп файл где вывожу
<?php

define('KEY', true);

// Устанавливаем соединение с сервером MySQL
include_once $_SERVER['DOCUMENT_ROOT'].'/connects/config.php';

// Подключаем файл функций MySQL
include_once ROOT.'connects/mysql.php';

// Подключаем файл общих функций
include_once ROOT.'libs/default.php';
/////////////////////////////////////////////////////////

//Получаем данные
$query = mysqlQuery("SELECT `title`, `itog`
FROM `kurs`"
) or die("Ошибка данных!");

if (mysql_num_rows($query) > 0){

// Рисуем вывод
$kurs = "<div class=\"kursy\">\n";

while ($result = mysql_fetch_assoc($query)) {

switch($result['title'])
{
case 'USD':
$flags = "usa.png";
break;
case 'EUR':
$flags = "euro.png";
break;
case 'RUB':
$flags = "rus.png";
break;
}

$kurs .= '<table>';
$kurs .= '<tr>';
$kurs .= '<td class="krs">'.html($result['title']).'</td>';
$kurs .= '<td class="krs1"><img src="'.HOST.'skins/images/'.$flags.'" /></td>';
$kurs .= '<td class="krs2">'.html($result['itog']).' тг<br/></td>';
$kurs .= '</tr>';
$kurs .= '</table>';

}
$kurs .= "</div>\n";

echo json_encode($kurs);

}


Ну и подгружаю его ajax-ом
var inProcess = false;
$(document).ready(function(){
if (inProcess) return;
inProcess = true;
$.ajax({
url: "./php/kurs.php",
cache: false,
dataType: 'json',
success: function(data){
inProcess = false;
$("#kursi").html(data);
}
});
});


А с классом обязательно разберусь что к чему
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Закрытая темаСоздание новой темыСоздание опроса