2013-04-21 65 views
12

我遷移我的PHP代碼從mysql(5.5不建議使用)到PDO_MySQL。但是,mysql_fetch_row返回整數,而PDOStatement::fetch返回數字的字符串。我如何使PDO像前一個一樣行事?爲什麼不是PDO_MySQL返回整數?

結果的mysql_fetch_row

結果的 PDOStatement::fetch
array(1) { 
    ["id"]=> 
    int(1) 
} 

array(1) { 
    ["id"]=> 
    string(1) "1" 
} 

回答

13

設置PDO::ATTR_EMULATE_PREPARES爲false,如果你真的需要它鬆散類型的PHP

如果mysql_fetch_row你INT返回對於SUM(我從來沒有關心檢查) - 然後它做了一些像if (ctype_digit($val)) $row[$key] = (int)$val; - 所以y OU可以在DBAL

做,據我瞭解的方式準備好的語句的作品,它使用相同的包結構,無論是發送和接收數據,而這個數據包中包含的數據類型。

它看起來像該服務器可以在2種格式返回數據 - 本地和mysqlnd,取決於請求類型。後一個可以由客戶端庫解釋以產生結果值。

+0

它工作在大多數情況下,但對於'SELECT SUM不工作(...'此外,正如其名稱所示,預備陳述的好處是否對這個選項無效? – Haocheng 2013-04-21 09:08:18

+0

對於誰在將來讀這個答案:1)不,他沒有誤讀這個問題。 2)是的,它實際上改變了返回值的數據類型。 – 2013-04-21 09:10:50

+0

@Haocheng讀這句話仔細,這是雙重否定;) – 2013-04-21 09:14:08

5

對於記錄,PDO提供了一個功能,它會改變這一點,PDO::ATTR_STRINGIFY_FETCHES

取時將數字值的字符串。需要bool

該設置的基本原理是數據庫引擎可以處理非常大的數字(例如,Oracle允許38位數字),而PHP不能。將這些數字作爲字符串檢索是一種保持安全並防止數據丟失的方法。

不幸,the MySQL driver does not support it

<?php 

$pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 
$sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point'; 
$res = $pdo->query($sql); 
while($row = $res->fetch(PDO::FETCH_ASSOC)){ 
    var_dump($row); 
} 

 

array(2) { 
    ["integer_number"]=> 
    string(1) "1" 
    ["floating_point"]=> 
    string(4) "3.14" 
} 
+0

我喜歡答案的基本原理部分,但如果我看到正確使用,MySQL PDO不支持'PDO :: ATTR_STRINGIFY_FETCHES',因爲_everything_已經作爲'string'數據類型返回,意思是這個'屬性'對於那個驅動來說是相當無用的。 – Jon 2013-04-21 09:02:25

+0

@Jon - 你說得對,我剛剛找到它,我已經更新了我的答案。 – 2013-04-21 09:08:38

相關問題