PHP脚本在浏览器中的行为有所不同

时间:2013-12-01 07:20:03

标签: php html hosting echo

我正在尝试使用Coinbase API列出mBTC(millibitcoin)中商品的当前美元价格。这是我的代码:

<?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变量。有没有办法让这个工作?

3 个答案:

答案 0 :(得分:1)

您在以下几行中做了一些(极端错误的)假设:

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

$price / $spot被视为字符串,您认为它的格式为

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

如果比特币做得非常糟糕并且每美元的利率为10 mBTC怎么办? $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位,你的服务器是32位,反之亦然!),字符串长度为{{1少于18个字符:

$price / $spot

长话短说:永远不要将数字视为字符串(除非你没有其他选择,而且你完全了解你在做什么)。以下代码将起作用,并将提供正确的输出:

'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'

有关number_format的完整说明,请参阅:http://php.net/number_format

答案 1 :(得分:0)

您无法从https://coinbase.com/api/v1/prices/spot_rate抓取数据 所以$ string是空的!
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';
}

答案 2 :(得分:0)

我刚刚在Windows上的WAMP服务器中执行了确切的代码.... 它看起来非常顺利!

输出:1.19 mBTC这是你期望的吗?

我认为您的服务器无法访问网页,因此,您的PHP代码变量将空置...尝试XAMP并检查....

...谢谢