2016-09-14 44 views
7

今天我發現我們的代碼似乎與PDO中的更改不兼容。在PHP < 5.6中,從PDOStatementfetchfetchAll的結果集都返回了其值爲字符串或空值的行。我們的代碼依賴於這個屬性。PHP:7 PDO提取(全部)嘗試將類型轉換爲關聯類型

前一段時間我們更新到PHP 7.事實證明,PDO現在試圖將的某些數據類型轉換爲其他關聯類型。例如,FLOAT列在PDOStatement結果集中創建浮點值。並且TINYINT列在結果集中創建一個整數值。有趣的是,一個BIGINT或一個大的INT UNSIGNED顯示爲一個字符串,當它不能被顯示爲一個整數時,某些其他類型(如DECIMAL)不會被轉換爲任何東西。他們仍然是絃樂。我認爲這是一個普遍認同的原則,即將數據類型從MySQL數據庫轉換爲PHP數據類型是有問題的,不應該由PHP本身執行,但顯然PHP 7決定不然。

因此,PHP 7的PDO引入了一組轉換規則,它在內部使用它來轉換從數據庫中選擇的值,但是這使我的代碼庫變得困難,並且由於這些轉換規則的不一致性,我寧願不更改我的代碼庫適合他們。有沒有可能的某種設置或標誌,我可以切換,以防止PDO轉換它提取的值?

+0

之前,我可以發誓,至少數在那裏投入實際的數字相當長一段時間......!? – deceze

+4

@deceze你可以隨時查看我的[PDO百科全書](https://phpdelusions.net/pdo#returntypes)的說明:) –

+0

那麼他們可能已經開始使用ND而不會注意到了嗎? :P –

回答

6

它不是PHP7,而是底層驅動程序mysqlnd
此外,它不是一組轉換規則,而是傳輸協議的工作方式:當使用mysqlnd和本地預先準備好的語句時,使用二進制傳輸協議,意味着總是有關於數據類型的信息。因此,數據只是從二進制格式解壓縮到正確類型的變量 - 當PHP有適當的一個,即INTs和FLOATs(請注意,由於此類型的性質,返回DECIMAL類型的字符串)。

如果你不希望這種行爲,對於這種

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); 

配置選項將恢復這種行爲只是字符串和空值作爲