由于对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),它确实删除了列名,但返回的所有列似乎都是字符串,而不是数字,因为数据实际上是,所以试试这个,给我正确的数据类型 - 这是 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
允许您在获取时将数值转换为字符串。
我希望有一种内置的方法可以做到这一点,因此我执行了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 加载数据时,我会在表描述中查找父 = 'tablex' 的内容,并使用 switch 语句来键入数据
foreach ( ... ) {
switch ($desc->datatype) {
case 'int': (int) $tablex->data;
break;
}
}
etc.