如何正确格式化PDO结果? - 数字结果以字符串形式返回?

时间:2012-06-20 22:00:37

标签: php json pdo restler

随着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;

5 个答案:

答案 0 :(得分:12)

PDO::FETCH_NUM是要走的路,虽然它并不意味着数字列将保持数字,但它只意味着你将获得一个索引数组而不是一个关联数组(因此,它只能完成列的省略)名)。

MySQL PDO驱动程序总是返回数字列的字符串,这是a known bug,但不幸的是,PHP开发人员公然忽略了许多错误之一“谢谢你,但这不是一个错误“。

您可以强制json_encode将实际数字用于看起来像数字的值:json_encode($data, JSON_NUMERIC_CHECK)(自PHP 5.3.3起)。

答案 1 :(得分:0)

尝试设置提取模式而不是fetchall,如下所示:

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

您可以看到reference

答案 2 :(得分:0)

我发现绕过此问题(使用SQLSRV驱动程序)的唯一方法是让SQL将所有数据类型作为OUTPUT参数中的字符串发送。然后使用正确的数据类型转换所有值。对于大数据集来说,这可能很重要。

尽管PDO开发人员说这是一个驱动程序问题(而不是他们的错误),但我没有使用没有PDO的SQLSRV驱动程序出现这个问题......

答案 3 :(得分:0)

您可以如下设置下一个属性:

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

属性ATTR_STRINGIFY_FETCHES可让您在获取数据时将数值转换为字符串。

答案 4 :(得分:-1)

我原本希望有一种内置的方法可以做到这一点,这就是我执行Google搜索的原因:v。

我正在建立自己的自定义CMS应用程序,我相信它是像Drupal一样的' (我从未使用过Drupal,但我使用的是基于Drupal的自定义系统)。我的意思是我在我的数据库中有一个表基本上描述了其他表中的所有字段,当我从这些其他表中检索字段时,我加载了数据的描述和数据类型。

e.g。

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.