7

由于 AJAX 相对较新,现在刚刚开始学习 PDO,增加的 ReSTler 级别让我完全困惑。从 Restler 示例中对以下代码进行建模,我不知道如何将输出格式从 PDO返回的内容更改为 Restler 和 Highcharts 所期望的内容

如何更改此代码以从当前格式变为所需格式?(如果这是处理 MySQL 结果的一个因素,结果通常是 5K-10K 记录。)

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),它确实删除了列名,但返回的所有列似乎都是字符串,而不是数字,因为数据实际上是,所以试试这个,给我正确的数据类型 - 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;
4

5 回答 5

13

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

MySQL PDO 驱动程序总是返回数字列的字符串,这是一个已知的错误,但不幸的是,这是 PHP 开发人员公然无视的众多错误之一,即“谢谢,但这不是错误”。

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

于 2012-06-21T16:16:46.247 回答
0

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

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

你可以看看参考

于 2012-06-20T23:14:46.763 回答
0

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

尽管 PDO 开发人员说这是驱动程序问题(不是他们的错误),但我在使用没有 PDO 的 SQLSRV 驱动程序时从未遇到过这个问题......

于 2016-08-12T17:44:12.440 回答
0

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

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

该属性ATTR_STRINGIFY_FETCHES允许您在获取时将数值转换为字符串。

于 2018-07-05T19:59:16.983 回答
-2

我曾希望有一个内置的方法来做到这一点,这就是我执行谷歌搜索的原因:v。

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

例如

tablex字段:姓名、年龄、够老

表说明

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.
于 2014-03-05T15:36:23.983 回答