LoginSignup
0
0

More than 1 year has passed since last update.

fetch(PDO::FETCH_ASSOC)を学んだ

Posted at

概要

作業中にDBにあるデータを扱う部分があったが、データ量が多すぎた。
いつものようにfetchで使っていたところ、PDO::FETCH_ASSOCを使ったほうがいいというレビューコメントを受けた。
実際にFETCH_ASSOCで効率的にデータを扱うことができた。
今日はFETCH_ASSOCについて述べたい。

fetch(PDO::FETCH_ASSOC)

PDO::FETCH_ASSOCは、結果セットに 返された際のカラム名で添字を付けた配列を返します。

id product number price
1 A001 100
2 A002 300
3 A003 500
4 A004 700
5 A005 1000

上のTABLEで「priceが600以下のデータがあるか?」というSQL文でデータを呼び出した時に次のように帰ってきます。

$result = $stmt->fetch(PDO::FETCH_ASSOC); 
Array (
    [id] => 1,
    [product number] => A001,
    [price] => 100,
)

結果は上記のように出る
priceが800以下のデータはidが1,2,3に該当するが、id=1のデータだけが結果として出た。
それは、fetchが該当するデータを1行返すからだ。

fetchAllで、該当するすべてのデータを配列で返す必要がある。

$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
Array
(
  [0] => array
    (
      [id] => 1,
      [product number] => A001,
      [price] => 100
    ),
  [1] => array
    (
      [id] => 2,
      [product number] => A002,
      [price] => 300
    ),
  [2] => array
    (
      [id] => 3,
      [product number] => A003,
      [price] => 500
    )
)

結果は上記のように出る。
こうすることで、出したデータがわかりやすいし、使いも楽になる。

PDO::FETCH_ASSOCを使ってみたら、別の種類もあったので述べる。

PDO::FETCH_BOTH

結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。
上記のテーブルで「priceが900以上ののデータ」を出すと、

$result = $stmt->fetchAll(PDO::FETCH_BOTH); 
Array
(
  [0] => array
    (
      [id] => 1,
      [0] => 1,
      [product number] => A001,
      [1] => A001,
      [price] => 100,
      [2] => 100
    )
)

結果は上記のように出る。

PDO::FETCH_NUM

結果セットに返された際の 0 から始まるカラム番号を添字とする配列を返します。
上記のテーブルで「priceが600以下のデータ」を出すと、

$result = $stmt->fetchAll(PDO::FETCH_NUM); 
Array
(
  [0] => array
    (
      [0] => 1,
      [1] => A001,
      [2] => 100
    ),
  [1] => array
    (
      [1] => 2,
      [2] => A002,
      [3] => 300
    ),
  [2] => array
    (
      [1] => 3,
      [2] => A003,
      [3] => 500
    )
)

結果は上記のように出る。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0