2010-06-08 71 views
2

我遇到了WAMP服務器設置(PHP版本5.3.0,Apache 2.2.11)上的一個奇怪的問題。當使用sprintf輸出一個數字時,我偶爾會在輸出字符串中得到錯誤的字符。在Windows中使用php和apache的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.0

以冒號其中 '10' 應。 (請注意,「:」是在序列中的下ASCII字符後「9」,如果是$number 0-9,一切正常數大於10出現使用ASCII當量 - 所以圖11是「;」,12爲「<」。等)

最奇怪的是,前四行上述代碼示例中似乎影響的結果。從邏輯上講,這些陳述應該沒有影響,但如果我將它們評論或刪除,問題就會消失。

任何想法?任何人都可以複製這個?

注:

  • 我試過PHP 5.3.1和5.3.2,雙方的行爲方式相同
  • 以上腳本的正常工作,甚至在瀏覽器中,5-6頁面刷新重啓Apache之後。然後錯誤,如上所述,返回
+0

是'error_reporting'打開?將其設置爲E_ALL,並檢查錯誤。 – ircmaxell 2010-06-08 20:43:09

+0

是的,'error_reporting'和'display_errors'都打開了 - 什麼也沒有顯示 – potatoe 2010-06-08 20:55:39

回答

0

嘗試增加這個上面的代碼setlocale(LC_ALL, 'en_US');

+0

好想法,但不幸的是結果沒有改變。 – potatoe 2010-06-08 21:12:49

0

試試這個:

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

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

這將基本上給你的數字字符串中每個字節的字符代碼。請注意,我說的是字節。如果是字符集問題或Apache mangling字節有問題,您應該在這裏看到。預計產出爲:49 48 46 48。如果您改爲看到58 46 48,那麼您確實可能發現了一個php的錯誤,並且應該提交一個錯誤報告。你也應該嘗試升級您的PHP版本(5.3.2超出)...

+0

好主意,謝謝。我確實在瀏覽器中看到了「58 46 48」,但在命令行看到了「49 48 46 48」(正如所料,因爲它一直在那裏工作)。 如果它是一個PHP的bug,是否有一個機制,它可以體現自己,只有當運行Apache? – potatoe 2010-06-09 16:11:35

+0

在這裏添加'var_dump($ interval);'來查看每種情況下發出的時間間隔。如果這是不同的,那麼問題可能在日期例程中。如果相同,嘗試將$ interval設置爲該值(例如'float:10.0'將產生'$ interval = 10.0')並查看是否可以重現該錯誤... – ircmaxell 2010-06-09 16:30:04

+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重新啓動。 – potatoe 2010-06-09 16:59:48