2012-06-20 53 views
6

由於AJAX相對較新,現在剛開始學習PDO,ReSTler的新增功能讓我非常難以理解。對Restler樣本中的以下代碼進行建模,我不知道如何更改PDO 返回Restler和Highcharts期望的輸出格式。如何正確格式化PDO結果? - 數字結果作爲字符串返回?

如何更改此代碼以從當前格式獲取所需的格式? (結果通常是5K-10K的記錄,如果這是在處理MySQL的結果的一個因素。)

ReSTler API代碼段

$sql = "SELECT ....." 
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $stmt = $this->db->query($sql); 
    return $stmt->fetchAll(); 
} catch (PDOException $e) { 
    throw new RestException(502, 'Listing History: ' . $e->getMessage()); 
} 

電流輸出格式(包括不需要列名):

[ 
    { 
    "chart_date": "1118966400000", 
    "bandwidth": "10.01", 
    "views": "101" 
    }, 
    { 
    "chart_date": "1119225600000", 
    "bandwidth": "20.02", 
    "views": "101" 
    }, 

所需的輸出格式(數字和沒有列名):

[ 
    [ 
    1118966400000, 
    10.01, 
    101 
    ], 
    [ 
    1119225600000, 
    20.02, 
    202 
    ], 

編輯使用建議fetch(PDO::FETCH_NUM)

每從@Ricardo羅曼答案,我想取(PDO :: FETCH_NUM),這並刪除列名稱,但所有返回的列似乎都是字符串,而不是數字,因爲數據實際上是這樣,所以試試這個,給我正確的數據類型 - 這是PDO的這部分單方面返回字符串?

while ($row = $stmt->fetch(PDO::FETCH_NUM)) { 
    $array[$x][0] = intval($row[0]); 
    $array[$x][1] = intval($row[1]); 
    $array[$x][2] = intval($row[2]); 
    $x++; 
} 
return $array; 

回答

12

PDO::FETCH_NUM是要走的路,儘管它並不意味着數字列將保持數字,它只意味着您將獲得索引數組而不是關聯數組(因此,它只會完成列名的省略)。

MySQL的PDO驅動總是返回字符串的數字列,這是a known bug,但不幸的是,在衆多的bug PHP開發者公然漠視爲「謝謝你,但是這是不是一個錯誤」之一。

您可以強制json_encode使用看起來像數字的值的實際數字:json_encode($data, JSON_NUMERIC_CHECK)(自PHP 5.3.3開始)。

+1

啊,有PHP 5.3在我手上,唉,我m堅持5.2持續時間,但感謝你至少澄清「絃樂的事情」......當我在毆打自己試圖對每一個^&^ *((可能的設置!!!) – GDP

0

嘗試設置讀取,而不是使用fetchall模式,如下所示:

return $stmt->fetch(PDO::FETCH_COLUMN); 

你可以看到reference

-1

我曾希望有一個內置的方式來做到這一點,爲什麼我執行了谷歌搜索:v。

我正在構建我自己定製的CMS應用程序,我相信它是'類Drupal'(我從來沒有使用過Drupal,但我使用的是基於Drupal的自定義系統)。通過這個我的意思是我的數據庫中有一張表,基本上描述了其他表中的所有字段,並且當我從這些其他表中檢索字段時,我加載描述和數據類型我的數據。

例如

TableX的字段:姓名,年齡,老夠

tabledescriptions

fieldname | datatype | minlength | parent 
___________|____________|_____________|________ 
Name  | String | 5   | tablex 
Age  | Int  | 1   | tablex 
Old Enough | Boolean | 1   | tablex 

所以,當我從TableX的加載數據,我期待在tabledescription的東西,其中母公司=' tablex'並使用switch語句將數據數據類型化

foreach (...) { 
    switch ($desc->datatype) { 
     case 'int': (int) $tablex->data; 
      break; 
    } 
} 
etc. 
+1

這是多餘的 –

+0

@ YourCommonSense不是當你構建一個系統OOP風格的時候,順便說一下,這只是我使用'tabledescriptions'表的一個片段,我也用它來確定tablex等插入字段是什麼,這意味着在long運行,代碼是更有效率和可靠 –

+0

爲什麼不問dbms關於數據YPE? –

0

我發現繞過這個問題(使用SQLSRV驅動程序)的唯一方法是讓SQL將所有數據類型作爲字符串發送到OUTPUT參數中。然後使用正確的數據類型轉換所有值。這對於大數據集可能很重。

即使PDO developpers說,這是一個驅動程序問題(不是他們的錯),我從來沒有使用沒有PDO的SQLSRV驅動程序這個問題...

相關問題