【问题标题】:PHP script behaves differently in browserPHP 脚本在浏览器中的行为不同
【发布时间】:2013-12-01 19:46:56
【问题描述】:

我正在尝试使用 Coinbase API 以 mBTC(毫比特币)列出项目的当前美元价格。这是我的代码:

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

【问题讨论】:

  • 您是否从对 API 的调用中获得任何回报?是否正确解码?
  • 是的,我可以回显$spot,它会给我全部价值。看来$whole$dec 变量仍然在此服务器上以某种方式搞砸了。我只是尝试在不同的服务器上使用相同的脚本,并且在 Coderunner 中的工作方式与它在 Coderunner 中的工作方式完全相同。
  • 如果$string 填充不正确(这似乎是原因),那么很可能file_get_contents() 函数的 url 包装器在该 php 中 not 启用配置。所以它只允许读取本地文件(服务器本身的文件)。检查一下,如果是这种情况,您必须实施不同的策略来获取远程数据。最简单的是使用curl php 扩展。
  • 我可以在这台服务器上使用file_get_contents 没有问题。我能够毫无问题地获得echo $spot; 的输出。 $whole$dec 让事情变得很奇怪。
  • 如果你没有得到 $price/$spot$price/$spot 的 int 值,它不会得到正确的结果。所以我可能猜你需要将$spot 值转换为int。

标签: php html hosting echo


【解决方案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 位,反之亦然!),字符串长度为 $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

【讨论】:

  • 非常感谢!现在一切都很有意义。我查看了您发布的链接,非常感谢您。
【解决方案2】:

我刚刚在 Windows 上的 WAMP 服务器中执行了确切的代码...... 它似乎工作得非常顺利!!!

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

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

谢谢....

【讨论】:

  • 是的。它在 Coderunner 和另一台服务器上以这种方式工作。我只是想知道为什么它不适用于这台服务器......
  • 第四次服务器可以访问API链接,我可以回显$spot的值没有问题。
  • 我认为您的服务器无法访问网页,因此,您的 php 代码变量将出现空缺...尝试 XAMP 并检查 ....
  • 第五次服务器可以访问API链接,我可以回显$spot的值没有问题。
  • 我知道是的。我在我原来的帖子里说过。但这显然还不够“好”。我需要一些关于 $whole$dec 变量的帮助。该脚本无法在我正在运行我的站点的服务器上回显这两个变量的值:bitcoindecals.com/oval-price.php
【解决方案3】:

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

【讨论】:

  • 但是,我可以。阅读以上部分。我能够无冲突地回显$spot 的值。有用。只是由于某种原因,$whole$dec 没有显示。
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多