PHP-скрипт ведет себя по-разному в браузере

0

Я пытаюсь перечислить текущую цену доллара США для позиции в mBTC (millibitcoin) с использованием API Coinbase. Вот мой код:

<?php
    $string = file_get_contents('https://coinbase.com/api/v1/prices/spot_rate');
    $result = json_decode($string);
    $spot = $result->amount;
    $price = 2; //change this to your USD value
    $whole = substr($price/$spot, 4, -13);
    $dec = substr($price/$spot, 4, -12);
    echo $whole.'.'.$dec.' mBTC';
?>

Он работает безупречно в Coderunner (приложение OS X для разработки), но сбой при запуске на моем сервере хостинга. Ссылка на сценарий браузера: http://bitcoindecals.com/oval-price.php

Я использую Dynadot Advanced хостинг, и он включает поддержку PHP. Я знаю, что PHP используется, потому что "mBTC" правильно повторяется. Кажется, что переменные $whole и $dec по какой-то причине не задаются. Есть ли способ заставить это работать?

  • 0
    Получаете ли вы что-нибудь от вашего звонка в API? Это декодирование правильно?
  • 0
    Да, я могу повторить $spot и это даст мне полную стоимость. По-прежнему кажется, что переменные $whole и $dec как-то портятся на этом сервере. Я только что попытался использовать тот же скрипт на другом сервере и работает точно так же, как в Coderunner, без каких-либо изменений.
Показать ещё 4 комментария
Теги:
echo
hosting

3 ответа

1
Лучший ответ

Вы делаете несколько (крайне ошибочных) предположений в следующих строках:

$whole = substr($price/$spot, 4, -13);
$dec = substr($price/$spot, 4, -12);

$price/$spot рассматривается как строка, и вы предполагаете, что оно будет в формате

'0.0019XXXXXXXXXXXX' // 12 x (unkown numbers)

Что делать, если биткойн делает действительно плохо, и скорость превышает 10 мБТС на доллар США? $price/$spot будет выглядеть примерно так:

'0.0108491827849201'; // (10.8 mBTC)
$whole = substr('0.0108491827849201', 4, -13); // Will be '0'
$dec = substr('0.0108491827849201', 4, -12); // Will be '08'
echo $whole . '.' . $dec . ' mBTC'; // Will echo '0.08 mBTC'

Что, если из-за округления или точности (это то, что вы видите на своем сервере - скорее всего, потому что ваш OSX - 64-битный, ваш сервер 32bit или наоборот!), Длина строки $price/$spot менее 18 символов:

'0.0019564521431';
$whole = substr('0.0019564521431', 4, -13);
// Meaning: start at position 4, stop at 13 characters counting from the end
// 13 characters from the end is here: '0.0019564521431'
//                                       ^
// so the stop-position is before the start-position, resulting in an empty
// string. Same with $dec.
echo $whole . '.' . $dec . ' mBTC'; 
// Will echo empty-string . '.' . empty-string . ' mBTC': '. mBTC'

Короче говоря: никогда не рассматривайте числа как строку (если у вас нет других вариантов, и вы полностью осознаете, что делаете). Следующий код будет работать и даст правильный результат:

echo number_format($price / $spot * 1000, 1);
// multiply by 1000: BTC to milli-BTC
// , 1: One digit after the dot

Полное описание number_format: http://php.net/number_format

  • 0
    Спасибо вам большое! Теперь все имеет смысл. Я просмотрел ссылку, которую вы разместили, и не могу отблагодарить вас.
0

Я просто выполнил точный код на моем сервере WAMP на окнах... Казалось, что он отлично работает!

OUTPUT: 1.19 mBTC Это то, что вы ожидаете????

Я думаю, что ваш сервер не может получить доступ к веб-страницам, поэтому ваши переменные php-кода будут вакантными... попробуйте XAMP и проверьте...

Благодаря....

  • 0
    Да. И так работает в Coderunner и на другом сервере. Мне просто интересно, почему это не работает для этого одного сервера ...
  • 0
    В четвертый раз сервер может получить доступ к ссылке API, и я могу без проблем отобразить значение $spot .
Показать ещё 4 комментария
0

вы не можете обходить данные с https://coinbase.com/api/v1/prices/spot_rate
поэтому строка $ пуста!
do {
$string = file_get_contents(' https://coinbase.com/api/v1/prices/spot_rate ');
} while (!empty($string));
$result = json_decode($string);
$spot = $result->amount;
$price = 2;//change this to your USD value
if (isset($spot) or $spot == 0) {
echo "\$spot is not islet or 0";
} else {
$whole = substr($price/$spot, 4, -13);
$dec = substr($price/$spot, 4, -12);
echo $whole.'.'.$dec.' mBTC';
}

  • 0
    Но я могу. Читай выше. Я могу повторить значение $spot без конфликтов. Оно работает. Просто по какой-то причине $whole и $dec не отображаются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню