PHPのプログラムでデータベースの検索結果を利用するなら、fetchAllメソッドを利用されてはいかがでしょうか。fetchAllを利用することで、データベースで検索した全ての結果を一度に取り出せます。
とはいえ、使い方がよく分からない、という方もいるでしょう。今回は、PHPのデータベースを活用するための標準PDOライブラリで使えるfetchAllについて解説します。
目次
PHPでDBの検索結果を受け取るには
PHPを利用してデータベースと連携したWebシステムを開発する場合、CakePHPのようなフレームワークを利用するか、標準で使えるPDOを利用するのが一般的です。
では、データベースの検索結果を、PHPのプログラムの中で利用するにはどうすればいいでしょうか。最も簡単な方法は
データベースから受け取ったデータを全て1つの配列に入れ、それをPHPのプログラム内で加工する方法です。
fetchAllはこのような用途のメソッドですが、このメソッドを解説する前にPHPからデータベースを参照し、そのデータを受け取るまでの処理について解説します。
PHPとデータベースの関係
WebサーバーでPHPがどのように動作しているかご存じでしょうか。通常PHPは、HTTPサーバーとは別のプロセスとして動作し、その結果をHTTPサーバーが受け取ってWebブラウザに送ります。
データベースの管理ソフトもHTTPサーバーやPHPのプロセスとは別に動作しており、プロセス間通信の仕組みを利用して連携しています。そのため
PHPからデータベースを利用する場合、1つのSQLをデータベースに送り、その結果を1回で受け取るのが一般的です。
PHPでDBを操作するならPDO
もしPHP用のフレームワークを利用せずにデータベースと連携するなら、PHPの標準で利用できるPDO(PHP Data Objects)を利用してください。
PHPからデータベースを利用する場合、以前はデータベースに合わせたドライバを組み込み、それによって組み込まれる専用の関数を使っていました。今でもそのような関数を使えますが、PDOを介してデータベースを利用するが一般的です。
また、
PDOには、データベースから受け取ったデータを取り出すためのメソッドが幾つか用意されており、受け取ったデータをまとめて配列に入れて返すメソッドが今回取り上げるfetchAllメソッドです。
フレームワークでも受け取れる
PHPをWeb開発に利用する場合、よくフレームワークが使われています。なおフレームワークとは「枠組み」といった意味があり、Web開発で使われるフレームワークにはWebシステムで必要とされる機能があらかじめ組み込まれています。
そのため組み込まれた機能を組み合わせるだけで簡単にWebシステムが作れる仕組みとしてよく利用される仕組みです。今使われているWebシステムにデータベースは欠かせません。そのため今使われているフレームの多くでデータベースにアクセスする機能が充実しています。
例えばPHPのフレームワークとしてよく利用されていた
CakePHPでは、データベースにアクセスするためのクラスが用意されており、そのクラスに定義されたfetchAllメソッドを利用することで、SQLの結果をまとめて配列に格納することが可能です。
PDOのfetchAllの基本
PDOでデータベースと連携した際、SQLで検索したデータを全て一括で配列に取り込むメソッドがfetchAllです。では、このfetchAllはどのように使えばいいのでしょうか。PDOに詳しくない方に、fetchAllの使い方の基本について解説します。
そもそもfetchとは
今回紹介するfetchAllは、fetchとallの2つの語から作られた造語です。では、fetchとはどういう意味でしょうか。
fetchとは、英語で取ってくる、呼んでくる、連れてくるといった意味の動詞です。そして、PHPのPDOにもfetchというメソッドがあり、その機能はデータベースの結果セットから1行分だけを取ってくるというものです。
つまり、
fetchAllは、fetchメソッドと同じようにSQLの結果を取ってくるメソッドですが、1行ではなく全て(all)の行を一度に取ってくるメソッドです。
fetchAllの文法
fetchAllは、PDOで接続したデータベースで実行したSQLの結果全てを配列として返すメソッドです。なお、このメソッドは単体で使用するのはなく、PDOのqueryメソッドやexecuteメソッドの結果作成されるPDOStatementオブジェクトのメソッドとして実行されます。
PDOのfetchAllの文法
1 |
配列変数 = (PDOStatement オブジェクト)->fetchAll(); |
fetchAllメソッドを使った例
1 2 3 4 5 6 7 8 9 |
$err_flg = false; try { $dpo = new PDO($dsn, $username, $password, $driver_options); $stmt = $pdo->query($sql); $rows = $stmt->fetchAll(); } catch(PDOException $e) { $error_message = $e->getMessage(); $err_flg = true; } |
この例では$dsnなどの変数に格納したデータベースの接続に必要な情報を使ってPDOをインスタンス。
その後$sqlに格納したSQLを使ってデータベースに問い合わせし、その結果をfetchAllメソッドで変数$rowsに取り出す処理です。
CakePHPで使えるfetchAllメソッド
先ほどPHPの標準で使えるPDOのfetchAllメソッドを紹介しましたが、PHP用のフレームワークには専用のデータベース接続機能を備えたフレームワークが利用されています。その中でも以前から使われているフレームワークがCakePHPです。
CakePHPには、PDOのfetchAllメソッドと同じ機能が用意されており、それがfetchallメソッドです。次からのその機能について紹介します。
CakePHPでSQL文を実行するには
CakePHPにはSQLを実行するための機能、ConnectionManagerクラスが用意されています。そしてこの機能を利用することで、SQLを実行し、データベースの検索結果を受け取ることができます。
次にCakePHPでSQLを実行し、その結果をfetchAllメソッドで受け取る例を紹介します。なお、ここで使われるfetchAllメソッドは、先ほど紹介したPDOのfetchAllメソッドとは別の機能なので注意してください。
ConnectionManagerクラスによるSQL実行例
1 2 3 4 |
use Cake\Datasource\ConnectionManager; $connection = ConnectionManager::get('default'); $results = $connection->execute($sql)->fetchAll('assoc'); |
CakePHPのConnectionManagerクラスを利用するには、useステートメントを使って必要なクラスを読み込みます。
そして、ConnectionManagerをインスタンスし、まずはSQLを実行するexecuteメソッド、続いてSQLの結果を全て取り出すfetchAllメソッドを使い、結果を変数$resultに格納しています。
まとめ
今回紹介したようにfetchAllとは、PHPのPDOを利用してSQLサーバーで検索した結果を受け取る際、fetchが1行ずつ取り出すのみ対し、一度にまとめて取り出すメソッドです。
なお、fetchAllで取り出したデータは、繰り返し処理でよく利用される配列に格納されるので、いろいろな処理で利用できます。ぜひ、うまく活用してください。
ただし、SQLの作り方によっては巨大なデータを一度に読み込んでしまい、処理が遅くなることがあります。必要なデータのみ抽出できる効率の良いSQLの結果を受け取る際にfetchAllメソッドを利用しましょう。