api — конвертер валют USD в GBP в переполнении стека

Я пытаюсь сделать конвертер валют, используя Google API в PHP, но он дает мне пустую страницу.

index.php:

<div id='output'></div>
<form action='convert.php' method='post'>
Amount: <input name='amount' type='text'><br/>
From: <select name='from'>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
</select><br/>
To: <select name='to'>
<option value='GBP'>GBP</option>
<option value='USD'>USD</option>
</select><br/>
<input name='submit' type='submit' value='submit'>
</form>

convert.php:

    <?php

function currency($from, $to, $amount) {
$content = file_get_contents('https://www.google.com/finance/converter?a='.$amount.'&from='.$from.'&to='.$to);
$doc = new DOMDocument;
@$doc->loadHTML($content);
$xpath = new DOMXpath($doc);
$result = $xpath->query('//*[@id="currency_converter_result"]/span')->item(0)->nodeValue;
return str_replace(' '.$to, '', $result);
}

if(!empty($_POST) && isset($_POST['submit'])) {
$output = currency($_POST['from'], $_POST['to'], $_POST['amount']);
echo "<script>document.getElementById('output').innerHTML = '<p>" . $output . "</p>'></script>";
}

?>

-1

Решение

Это пусто, потому что вы публикуете данные на новой странице.

В index.php у вас есть линия

<div id='output'></div>

где вы ожидаете, что результат в конечном итоге. Но когда вы нажимаете кнопку отправить в форме, вы фактически переходите на совершенно другую страницу. Если вы посмотрите на URL, теперь он заканчивается convert.php

Если вы нажмете «Отправить» и взгляните на источник страницы, на самом деле он содержит именно то содержание, о котором вы сказали.

Просто замените строку 14 в output.php следующим образом:

echo $output;

Вы увидите свой результат тогда.

Поскольку вы ожидали, что выходные данные появятся на той же странице, что и форма, на которой находится форма, вы можете захотеть использовать AJAX.

В качестве альтернативы вы можете поместить логику для получения результата на той же странице, выполнив что-то вроде следующего:

<?php

function currency($from, $to, $amount) {
$content = file_get_contents('https://www.google.com/finance/converter?a='.$amount.'&from='.$from.'&to='.$to);
$doc = new DOMDocument;
@$doc->loadHTML($content);
$xpath = new DOMXpath($doc);
$result = $xpath->query('//*[@id="currency_converter_result"]/span')->item(0)->nodeValue;
return str_replace(' '.$to, '', $result);
}

if(!empty($_POST) && isset($_POST['submit'])) {
$output = currency($_POST['from'], $_POST['to'], $_POST['amount']);
}

?>

<div id='output'><?php if(isset($output)) { echo $output; } ?></div>
<form action='index.php' method='post'>
Amount: <input name='amount' type='text'><br/>
From: <select name='from'>
<option value='USD'>USD</option>
<option value='GBP'>GBP</option>
</select><br/>
To: <select name='to'>
<option value='GBP'>GBP</option>
<option value='USD'>USD</option>
</select><br/>
<input name='submit' type='submit' value='submit'>
</form>
0

Другие решения

Вам нужно передать параметры в функцию ниже, которая попадает в URL-адрес Google, и получить конвертированный ответ в валюте.

Параметры:
$from_Currency = В котором вы хотите ответ.
$to_Currency = Из которого нужно конвертировать.
$amount = Сумма, которую вы хотите пересчитать.

<?php

function get_currency($from_Currency, $to_Currency, $amount) {

$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);

$url = "http://www.google.com/finance/converter?a=$amount&from=$from_Currency&to=$to_Currency";

$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$rawdata = curl_exec($ch);
curl_close($ch);
$data = explode('bld>', $rawdata);
$data = explode($to_Currency, $data[1]);
return round($data[0], 2);
}

// Call the function to get the currency converted
echo get_currency('USD', 'INR', 1);

?>

Отклик:

65,24 (на сегодняшний день курс доллара США)

0

Google обновил ссылку, т. Е. Она была перемещена на новый сайт. Так что это может быть полезно:

function currencyConvert($from,$to,$amount){
$url = "https://finance.google.com/finance/converter?a=$amount&from=$from&to=$to";
$request = curl_init();
$timeOut = 0;
curl_setopt ($request, CURLOPT_URL, $url);
curl_setopt ($request, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($request, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($request, CURLOPT_CONNECTTIMEOUT, $timeOut);
$response = curl_exec($request);
curl_close($request);

$rawdata = str_replace('</span>','',str_replace('<span class="bld">','',$response));
list(,$val) = explode("bld>",$rawdata);
list($raw2,) = explode("<input",$val);
return (float) $raw2;
}

Для вызова этой функции:

echo currencyConvert('USD','NPR',1);

Это преобразует 1 доллар в непальские рупии.

Подобное можно использовать для USD к GBP.

0

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

function convertCurrency($amount, $from, $to){
$conv_id = "{$from}_{$to}";
$string = file_get_contents("http://free.currencyconverterapi.com/api/v5/convert?q=$conv_id&compact=ultra");
$json_a = json_decode($string, true);

return $amount * round($json_a[$conv_id], 4);
}
//EXAMPLE convert 29 euro in $
echo(convertCurrency(29, "EUR", "USD"));
0

finance.google.com более не поддерживается, Попробуйте это:

// google API - Load time: 558 ms
function google_money_convert($from, $to, $amount)
{
$url = "https://www.google.com/search?q=".$from.$to;
$request = curl_init();
$timeOut = 0;
curl_setopt($request, CURLOPT_URL, $url);
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($request, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $timeOut);
$response = curl_exec($request);
curl_close($request);

preg_match('~<span [^>]* id="knowledge-currency__tgt-amount"[^>]*>(.*?)</span>~si', $response, $finalData);
$finalData=str_replace(',', '.', $finalData);
return (float)$finalData[1]*$amount;
}// free.currencyconverter API - Load time: 95ms
function money_convert($from, $to, $amount)
{
$url = "http://free.currencyconverterapi.com/api/v5/convert?q=$query&compact=ultra";
$request = curl_init();
$timeOut = 0;
curl_setopt($request, CURLOPT_URL, $url);
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($request, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $timeOut);
$response = curl_exec($request);
curl_close($request);
$response = json_decode($response, true);
$responseOld=$response;
// print_r($response);
return $response[$query]*$amount;
}
0