2012-06-04 34 views
0

我使用它來創建在我的店裏每一件產品的唯一代碼,PHP從數據庫中返回float而不是字符串?

echo base_convert(uniqid(),16,10); 

例如,

1403802682572650 

我的查詢是簡單的像這樣,

 $sql = " 
      SELECT * 
      FROM page AS p 

      LEFT JOIN stock AS o 
      ON o.id = p.page_id 

      WHERE p.type = ? 
      AND p.hide != ? 
      ORDER BY p.backdated_on 
     "; 

當我想獲得產品代碼,我這樣做,

var_dump($product->code); 

但PHP返回float(1.4038026825726E+15)代替1403802682572650

爲什麼PHP返回float代替string?我怎樣才能得到這個號碼?

或者,在從db表中請求結果之前,我應該在我的SQL查詢中將數字轉換/轉換爲字符串還是varchar?

編輯: 找到我的代碼中的錯誤。

我有一條線,JSON轉換成陣列,並且轉換成字符串轉換成浮動,例如,

echo json_decode("1403802682572650", true); // 1.4038026825726E+15 
+0

什麼是代碼表字段的數據類型? –

+0

'varchar(255)\t utf8_general_ci'所以它應該是正確的? – laukok

+2

該數字太大:php> echo 1403804750765990; // 1.403804750766E + 15 –

回答

1

該值超出範圍。

PHP曼:

的整數的大小是依賴於平臺的,雖然約兩十億的最大值是通常的值(這是32位帶符號的)。 64位平臺的最大值通常約爲9E18。 PHP不支持無符號整數。整數大小可以使用常量PHP_INT_SIZE確定,最大值使用自PHP 4.4.0和PHP 5.0.5以來的常量PHP_INT_MAX。

如果PHP遇到超出整數類型邊界的數字,它將被解釋爲float。此外,導致超出整數類型範圍的數字的操作將返回一個float。

+0

超出範圍的字符串?不要這樣想。 –

+1

不知何故,它被轉換爲int,然後解釋爲float。我想它發生在你的DB對象中。 –

+1

有趣的是,你使用PDO,它應該將int和float轉換爲字符串.... –

1

號,您應該列本身更改爲VARCHAR,因爲它不被用作真的一個號碼。

+0

db表列被設置爲'varchar(255)\t utf8_general_ci',我看不到錯誤在哪裏...... – laukok

+0

驗證數據在當時沒有被炸。 –

1

您可以執行兩件事之一,而不會對數據庫模式造成可能有害的更改。

可以先類型轉換$產品 - >代碼:

var_dump((string) $product->code); 

或者你可以投/轉換的選擇查詢:

SELECT CAST(columnName as char) as code ... 

我一直處理的風扇如果數據庫引擎不支持您的查詢,大多數情況下會通過代碼而不是查詢進行更改。

+0

謝謝。我試圖在查詢中選擇該選擇,但仍然將該數字作爲浮點數 - 「1.403804750766E + 15」。...... – laukok

+0

PHP的哪個版本? –

+0

另一種選擇是,選擇CONCAT(columnNAME,'')作爲列名... –

相關問題