簡體   English   中英

如何正確格式化PDO結果? - 數字結果以字符串形式返回?

[英]How to properly format PDO results? - numeric results returned as string?

隨着AJAX的相對新穎,現在剛剛開始學習PDO,ReSTler的額外水平讓我完全厭惡。 從建模樣本Restler下面的代碼,我不知道如何改變從什么PDO 久違什么Restler和Highcharts期待的輸出格式。

如何更改此代碼以從當前格式獲取所需格式? (結果通常是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 Lohmann的回答,我嘗試了fetch(PDO :: FETCH_NUM),DID刪除了列名,但所有返回的列似乎都是字符串,而不是數字,因為數據實際上是,所以試試這個,給我一個正確的數據類型 - 這是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;

PDO::FETCH_NUM是要走的路,雖然它並不意味着數字列將保持數字,但它只意味着你將獲得一個索引數組而不是一個關聯數組(因此,它只能完成列名的省略)。

MySQL PDO驅動程序總是返回數字列的字符串,這是一個已知的錯誤 ,但不幸的是,PHP開發人員公然忽視的許多錯誤之一是“謝謝你,但這不是一個錯誤”。

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

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

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

你可以看到參考

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

即使PDO開發人員說這是一個驅動程序問題(而不是他們的錯誤),我在沒有PDO的情況下使用SQLSRV驅動程序從未遇到過這個問題...

您可以按如下方式設置下一個屬性:

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

使用屬性ATTR_STRINGIFY_FETCHES可以在獲取時將數值轉換為字符串。

我原本希望有一種內置的方法可以做到這一點,這就是為什么我要執行谷歌搜索:v。

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

例如

tablex字段:名稱,年齡,足夠

tabledescriptions

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

所以當我從tablex加載數據時,我會在tabledescription中查找parent ='tablex'的內容並使用switch語句對數據進行數據類型化

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM