こんにちは、
webデザインについても特訓中のサトウです。
さて、本題に入りたいと思います。
phpやデータベースの学習を進めていくと「fetch」というワードを目にする機会も増えてくるのではないでしょうか。何となく「クエリの実行後に書くもの」ということは分かっていても、詳細について理解できない方も少なくないのでは、、、。と思い、今回は「fetch」について分かりやすく説明していきます。
phpやデータベースについて学び始めた方や、「fetch」について分からない方は、是非読んでみてくださいね。
目次
「fetch」とは
fetchとは、PDOオブジェクトでデータベースからデータを取り出した際に「配列の形式を指定できる」ことを指します。SQLを実行してその結果を取得する時に「どのような形式で結果が欲しいか」に合わせて指定する必要があります。PDOオブジェクトを使用した際は以下の流れの中でfetchを使用します。
(例)データベースからデータを取得する場合
・SQLの実行準備
・SQL文(データベースへの指示内容)の作成
・SQLの実行
・クエリの実行結果を取得(FETCH_ASSOCやFETCH_ALLで取得形式を指定)
またfetchを指定しなくてもデータ取得可能ですが(デフォルトのfetchモードが適用されます)、データの取得形式を指定することで無駄なく必要なデータだけ取り出すことが可能です。
データベースから配列を取得してみよう!
ここからはfetchを使って実際にデータベースからデータを取得してみましょう。
以下の情報を元にfetchでデータ取得する方法を解説していきます。
テーブル情報
テーブル名:users
usersテーブルの各カラム:id,username,livingarea,age,create_date
usersテーブルのデータ情報
処理の流れ
(2)PDOオブジェクトを生成してDB接続
(3)SQL文の作成
(4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる
(5)取得結果をfetchを使って指定する
(6)結果があれば、print_rで表示。中身がなければ’結果なし’と表示
参考:ユーザー入力が伴う場合はprepareメソッド、プレースホルダ、executeメソッド等も併せて使用しましょう。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php // ログの表示 ini_set('log_errors','On'); ini_set('error_log','php.log'); try{ // (1)DBへ接続の準備 $dsn = 'mysql:dbname=mysql_test2;host=localhost;charset=utf8'; $user = 'root'; $password = パスワード; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); // (2)PDOオブジェクトを生成してDB接続 $dbh = new PDO($dsn,$user,$password,$options); // (3)SQL文の作成 // 取得する内容によってSQL文を記述 // (4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる $stmt = $dbh->query($sql); // (5)取得結果をfetchを使って表示する // クエリの結果が$stmtの中に入っている // (6)結果があれば、print_rで表示。中身がなければ'結果なし'と表示 if(!empty($result)){ echo '<pre>'; var_dump($result); echo '</pre>'; }else{ echo '結果なし'; } }catch(Exception $e){ error_log('エラー発生:' .$e->getMessage()); } ?> |
※fetchの書き方が変わるため(3)(5)の部分を変えて、以下のケースに応じて解説していきます。
「カラム名」と「連番」を返す場合(デフォルト)
「カラム名」と「連番」を表示する場合は「fetchAll」と「FETCH_BOTH」を使用します。
以下ではidが3のユーザーを抽出してみます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
// (3)SQL文の作成 // usersテーブルでidが3の行を返す $sql = 'SELECT * FROM users WHERE id = 3'; // (4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる $stmt = $dbh->query($sql); // (5)取得結果をfetchを使って指定する // クエリの結果が$stmtの中に入っている $result = $stmt->fetchAll(PDO::FETCH_BOTH); |
※(5)でFETCH_BOTHを指定しています。
実行結果
MySQL上での結果画面
MySQL上で実行した結果は対象の行が1行ですが、画面出力するとカラム名と併せて連番[1]〜[4]も併せて取得できていますね。
FETCH_BOTHでもデータ取得可能ですが、データを2倍保持することになるのでリソースを無駄にしてしまいます。
1行だけデータを取得したい場合
1行だけ結果を取得したい場合は「fetch」「FETCH_ASSOC」を使用します。
以下では「idが2」のユーザーを取得してみます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
// (3)SQL文の作成 // usersテーブルでidが「2」のレコードを取得 $sql = 'SELECT * FROM users WHERE id = 2'; // (4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる $stmt = $dbh->query($sql); // (5)取得結果をfetchを使って指定する // クエリの結果が$stmtの中に入っている $result = $stmt->fetch(PDO::FETCH_ASSOC); |
※(5)がFETCH_ASSOCを指定している箇所です。
実行結果
MySQL上での結果画面
今回はSQLで「idが2」の条件を指定し、対象の行が取得できていますね。
テーブルから特定のユーザーだけ取り出したい時は非常に効果的な書き方です。
結果を取得しそれが複数存在する場合
条件に合う行が複数存在する場合は「fetchALL」と「FETCH_ASSOC」を使用します。
fetchではこの書き方が最もベーシックな記述方法です。以下ではlivingareaが「北海道」のユーザーを抽出してみます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
// (3)SQL文の作成 // usersテーブルでlivingareaが「北海道」のレコードを取得 $sql = 'SELECT * FROM users WHERE livingarea = "北海道"'; // (4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる $stmt = $dbh->query($sql); // (5)取得結果をfetchを使って指定する // クエリの結果が$stmtの中に入っている $result = $stmt->fetchAll(PDO::FETCH_ASSOC); |
※(5)がFETCH_ASSOCを指定している箇所です。
実行結果
MySQL上での結果画面
livingareaが北海道のユーザーだけ抽出できました。
取得した値の中身は、2次元配列になっています。([0][1][2]を添字にした配列の中にさらに配列が入っている状態です。)
指定した1行だけ1次元配列で取得したい場合
指定した1つのカラムだけ取得したい場合は「fetchAll」「FETCH_COLUMN」を使用します。
以下ではユーザーの「age」というカラム情報だけ取得してみます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
// (3)SQL文の作成 // usersテーブルのageの情報だけ取得する $sql = 'SELECT age FROM users'; // (4)SQLの実行:queryメソッドで実行し、変数stmt(statementの略)に結果を入れる $stmt = $dbh->query($sql); // (5)取得結果をfetchを使って指定する // クエリの結果が$stmtの中に入っている $result = $stmt->fetchAll(PDO::FETCH_COLUMN); |
※(5)がFETCH_COLUMNを指定している箇所です。
実行結果
MySQL上での結果画面
テーブルから各ユーザーの「age」に関するデータだけ取得できましたたね。
概ねfetchでこの4パターンを書き分けることができれば、データベースから必要なデータは取得することができます。
テーブルから「どのデータをどの形式で取得したいか」に応じて、使い分けながら練習してみてください。
まとめ
いかがでしたか?今回は、「fetch」について説明しました。
プログラミングを学び始めた頃は、「fetch」の書き方や「どのパターンで値(配列)を取得するのが良いか」難しく感じることあると思います。ですが、まずは今回のような情報が少ないテーブルを使ってコード書いていけば簡単に使えることができる日が来ると思うので、焦らずにゆっくりと理解を深めていってくださいね
この記事が、皆様のプログラミング学習に役立つと嬉しいです。