概要
作業中に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
)
)
結果は上記のように出る。