【问题标题】:sprintf bug with php & apache in windows?Windows 中 php 和 apache 的 sprintf 错误?
【发布时间】:2010-06-08 20:24:47
【问题描述】:

我在 WAMP 服务器设置(PHP 版本 5.3.0,Apache 2.2.11)上遇到了一个奇怪的问题。使用 sprintf 输出数字时,我偶尔会在输出字符串中得到错误字符。

示例:(没有从任何内容中修剪,这是脚本中唯一的代码)

$dt1 = new DateTime('now');
$dt2 = new DateTime('now - 10 min');

$interval = $dt1->diff($dt2);

$number = 10.0;
$string = sprintf("%.1f", $number);
echo "number: $number, string: $string\n";

如果我在命令提示符下使用 PHP CLI 运行它,我会得到预期的输出:

数字:10,字符串:10.0

但是,如果我使用 Apache 提供它,我会在浏览器中得到

数字:10,字符串::.0

在应该是“10”的地方加一个冒号。 (请注意,':' 是 '9' 之后的下一个 ascii 字符,如果 $number 是 0-9,则一切正常。大于 10 的数字似乎使用 ascii 等价物 - 所以 11 是 ';',12 是 '

最奇怪的是,上面代码示例中的前四行似乎影响了结果。从逻辑上讲,这些语句应该没有影响,但如果我将它们注释掉或删除它们,问题就会消失。

有什么想法吗?还有其他人可以复制吗?

注意事项:

  • 我尝试过 php 5.3.1 和 5.3.2,两者的行为方式相同
  • 上述脚本工作正常,即使在浏览器中,在重新启动 Apache 后刷新 5-6 次页面。然后错误,如所述,返回

【问题讨论】:

  • error_reporting 开启了吗?将其设置为 E_ALL,并检查错误。
  • 是的,error_reportingdisplay_errors 都已打开 - 没有任何显示

标签: php apache wamp wampserver


【解决方案1】:

尝试在代码setlocale(LC_ALL, 'en_US');上方添加此代码

【讨论】:

  • 好主意,但不幸的是结果没有变化。
【解决方案2】:

试试这个:

echo "number: $number, string: $string\n"; 更改为:

for ($i = 0, $n = strlen($string); $i < $n; $i++) {
    echo ord($string[$i]).' ';
}

它基本上会给你字符串中每个字节的数字字符代码。请注意,我说的是字节。如果是字符集问题,或者 Apache 字节处理问题,您应该在此处看到。预期输出为:49 48 46 48。如果您看到的是58 46 48,那么您确实可能已经发现了 php 的错误并应该提交错误报告。您还应该尝试升级您的 php 版本(5.3.2 已发布)...

【讨论】:

  • 好主意,谢谢。我确实在浏览器中看到“58 46 48”,但在命令行中看到“49 48 46 48”(正如预期的那样,因为它一直在那里工作)。如果是 php 的 bug,有没有一种机制,只有在 Apache 运行时才能显现出来?
  • 在其中添加 var_dump($interval); 以查看每种情况下给出的时间间隔。如果情况不同,那么问题可能出在日期例程中。如果相同,请尝试将 $interval 设置为该值(例如 float: 10.0 将产生 $interval = 10.0)并查看是否可以重现错误...
  • $interval 始终具有相同的值,一个 DateInterval 对象,其字段 (y,m,d,h,i,s,invert,days) 似乎具有正确的值。将 $interval 设置为任何避免执行 DateTime::diff 的常量似乎可以解决问题。 (DateInterval::format 不影响结果)我升级到 php 5.3.1,结果没有变化,接下来会尝试 5.3.2。这样做时,我了解到在重新启动 Apache 后,浏览器中的输出对于此脚本的大约 5-6 次重新加载是正确的,之后“:”重新出现,直到下一次 Apache 重新启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多