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 開発者が「ありがとうございますが、これはバグではありません」としてあからさまに無視している多くのバグの 1 つです。

json_encode数値のように見える値に実際の数値を強制的に使用することができますjson_encode($data, JSON_NUMERIC_CHECK)(PHP 5.3.3 以降)。

于 2012-06-21T16:16:46.247 に答える
0

次のように、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 に答える
-2

これを行うための組み込みの方法があることを望んでいたので、なぜGoogle検索を実行したのですか:v。

「Drupal に似ている」と思われる独自のカスタム CMS アプリケーションを構築しています (Drupal を使用したことはありませんが、Drupal に基づくカスタム システムを使用しています)。これは、基本的に他のテーブルのすべてのフィールドを説明するテーブルが DB にあり、これらの他のテーブルからフィールドを取得するときに、説明とデータ型のデータをロードすることを意味します。

例えば

tablexフィールド: Name、Age、Old Enough

テーブルの説明:

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 に答える