PHP学習している時に、すぐに忘れる「fetch(PDO::FETCH_ASSOC)」についての備忘録です。
fetchとは
fetchとは「連れ[取り]に行ってくる、連れて[取って]くる」といった意味あるので、今回のPHPの場合はデータを取ってくるというイメージになります。
fetch(PDO::FETCH_ASSOC)とは
さっそく本題で「fetch(PDO::FETCH_ASSOC)」とはデータベースから該当した条件のデータを1件だけ取ってきます。
そして、呼び出してきたデータを格納する時にカラム名で添字を付けた配列で返ってきます。
簡単に言うとこんな感じです。次のようなデータがあるとします。
id | 名前 | アドレス | 年齢 |
1 | 太郎 | taro@xxx.com | 44 |
2 | 次郎 | jiro@xxx.com | 33 |
3 | 三郎 | sabro@xxx.com | 22 |
このデータの中で「40歳以下のデータがあるか?」というSQL文でデータを呼び出した時に次のように帰ってきます。
$data = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($data);
- 結果
Array ( [id] => 2 [名前] => 次郎 [アドレス] => jiro@xxx.com [年齢] => 33 )
というように、条件に該当した一番最初の行(2行目)だけ取得します。
メリットは何なのか?
コレだけ見て「だから何?」と思う人もいると思いますが、ちゃんと使い方がありまして、メリットとしては「条件に合致するデータがあるか?ないか?」のバリデーションチェックの時に使ったりします。
ちなみに一覧表示なのですべてのデータを使いたい時は「fetchALL」を使うことですべてのデータを取得できます。
fetchの中にある「PDO::FETCH_ASSOC」とは
もう一つ気になるのが、fetchの中にある「PDO::FETCH_ASSOC」ですが、データを取得する時の、受け取り方を指定してます。
どういうことかと言うと「fetch()」を指定した場合デフォルトでは「PDO::FETCH_BOTH」がセットされています。
つまり「fetch(PDO::FETCH_BOTH)」となっているということです。
「PDO::FETCH_BOTH」とは、データを取得する時に、「カラム名」と「0から始まるカラム番号」の配列を返します。
それに対して「PDO::FETCH_ASSOC」を指定すると「カラム名」の配列を返します。
先ほど使ったデータで名前の部分に対して、「fetch(PDO::FETCH_BOTH)」と「PDO::FETCH_ASSOC」の結果を見てみます。
- fetch(PDO::FETCH_BOTH)の場合
array(3) { [0]=> array(2) { ["name"]=> string(12) "太郎" [0]=> string(12) "太郎" } [1]=> array(2) { ["name"]=> string(6) "次郎" [0]=> string(6) "次郎" } [2]=> array(3) { ["name"]=> string(6) "三郎" [0]=> string(6) "三郎" } }
- fetch(PDO::FETCH_ASSOC)の場合
array(3) { [0]=> array(1) { ["name"]=> string(12) "太郎" } [1]=> array(1) { ["name"]=> string(6) "次郎" } [2]=> array(1) { ["name"]=> string(6) "三郎" } }
fetch(PDO::FETCH_BOTH)の方に「添え字」と「カラム」に対してそれぞれ値が入ってきているのが分かると思います。
それに対して、fetch(PDO::FETCH_ASSOC)の方では「カラム」だけが入ってきています。
どのように使うのか?
「結局、何なのか?」と言うと「fetch(PDO::FETCH_ASSOC)」を使うことで「取得するデータ量が減る」って言うことです。
fetchの場合だと1つのデータしか返してこないのであまりメリットはないですが、fetchALLを使った場合すべてのデータを取得してくるので、データ量が多すぎるとサーバへの負荷も上がります。
そのため、fetchALLを使う時には「fetchALL(PDO::FETCH_ASSOC)」を基本的に使った方がサーバへの負荷が減るので、そういった使い方になると思います。
ちなみに、添え字だけを取得したい場合は「PDO::FETCH_NUM」があります。
参考URL
以下のサイトを参考にさせていただきました。
以上です。ありがとうございました。
コメント