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

Posted

技术标签:

【中文标题】如何正确格式化 PDO 结果? - 以字符串形式返回的数字结果?【英文标题】:How to properly format PDO results? - numeric results returned as string? 【发布时间】:2012-06-23 03:16:45 【问题描述】:

AJAX 相对较新,现在刚开始学习 PDO,增加的 ReSTler 水平让我完全不知所措。从 Restler 示例中对以下代码进行建模,我不知道如何将输出格式从 PDO is 返回到 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;

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

啊,我可以使用 PHP 5.3,唉,我一直坚持使用 5.2,但谢谢你至少澄清了“字符串的东西”......当我受伤时尝试每一个 ^&^*(( 可能的设置!!!【参考方案2】:

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

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

你可以看到reference。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

我曾希望有一种内置方法可以做到这一点,因此我执行了 Google 搜索: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.

【讨论】:

@YourCommonSense 在构建系统 OOP 风格时不是这样。顺便说一句,这只是我使用'tabledescriptions'表的一个sn-p。我还用它来确定 tablex 等的插入字段是什么,这意味着从长远来看,代码更高效、更可靠 为什么不直接向 dbms 询问数据类型?

以上是关于如何正确格式化 PDO 结果? - 以字符串形式返回的数字结果?的主要内容,如果未能解决你的问题,请参考以下文章

重定向,常用转义字符

PHP pdo 将结果回显到表中

正确的地址格式以从 google GeoCoding API 获得最准确的结果

PDO中获取结果集

当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?

如何在 Hadoop 中编写 HQL 表达式以验证特定格式的字母数字字段的格式,例如 X9999