絵でわかるWebプログラミング入門

PHPフィーチャリングDB!PDO入門

この入門ページでは、PHPのPDOを使ってデータベースにアクセスする方法を簡単に解説します。

PDOとは

データベースにはいくつか種類があります。PHPからデータベースを操作するとき、データベースによってやり方が違うとなると、例えばデータベースを変更した場合にコード修正が多岐に渡るなど、非常に面倒くさいことになります。


PDOを使わない場合

それを防ぐために、PHPにはどんなデータベースでも同じやり方で操作できるPDOという技術が用意されています。


PDOを使う場合
使用しているデータベースが何であるかにかかわらず、同じ 関数を使用してクエリの発行やデータの取得が行えるということです。引用元:http://php.net

PDOとはつまり、データベース受付代理のような技術といえます。

接続する

まずはじめに、PDOのオブジェクトを生成する必要があります。


MySQLに接続する方法です。比較のためにPDOを使う場合と使わない場合のコードを並べています。「d」はデータベース名、「u」はユーザ名、「p」はパスワードです。

		<?php
			// $c=new mysqli('localhost','u','p','d'); // 非PDO
			$c=new PDO('mysql:host=localhost;dbname=d','u','p'); // PDO
		?>

続いてPostgreSQLに接続する方法もついでに見ておきましょう。

		<?php
			// $c=pg_connect('host=localhost dbname=d user=u password=p');
			$c=new PDO('pgsql:host=localhost;dbname=d','u','p'); 
		?>

さらにSQLite3に接続する方法です。

		<?php
			// $c=new SQLite3('d');
			$c=new PDO('sqlite:d');
		?>

PDOを使えば、接続後の操作方法は統一されているので、データベースを変更してもこの接続部分だけを修正すれば済みます。

SQLite3に関してはデータベースはファイルになるので「d」にはファイルのパスを指定します。

大まかな流れ

PDOは基本的に、ひとつのSQLを実行するのに三段階のステップを踏みます。


PDOの処理の流れ

prepareというのは「準備」、executeは「実行」、fetchとは「取得」という意味です。

prepare(準備)

実際にPDOを利用してデータベースにアクセスしてみましょう。

まず「prepare(準備)」ですが、作業をするオブジェクトを生成すると共にSQLをセットします。

ここで特徴的なのが、SQLの一部をパラメータ(変数)化しているところです。これにより、安全で柔軟なデータベースアクセスが可能になります。


具体的な「prepare(準備)」のコードは次のようになります。

「$c」は接続変数(PDOオブジェクト)で、データベース接続後として説明します。

		$s=$c->prepare('SELECT * FROM user WHERE id=:id AND password=:ps');

「:id」と「:ps」の部分がパラメータで頭に「:」を付けます。これは連想配列方式で、連番方式にしたい場合は「?」と書きます。

		$s=$c->prepare('SELECT * FROM user WHERE id=? AND password=?');

この違いは次のステップに影響します。

prepareによって「PDOStatementオブジェクト」が返り、次のステップからは「$c」ではなくこのPDOStatementオブジェクトと呼ばれる「$s」が担当します。

execute(実行)

「execute(実行)」はデータベースに対してSQLを実行します。この時に「prepare(準備)」でパラメータ化した部分に具体的な値を結びつけます。この結びつけを「バインド」と呼びます。

		$s->execute(array(':id'=>2,':ps'=>'1234'));

バインドは配列を渡して行います。連番方式でパラメータ化した場合はキーを付けずに普通の配列で指定します。「?」にはここで指定した値が順番通りにバインドされます。

		$s->execute(array(2,'1234'));

バインドによって実際に実行されるSQLは次のようになります。

		SELECT * FROM user WHERE id=2 AND password='1234';

fetch(取得)

「fetch(取得)」ではexecute(実行)によってデータベースから抽出したデータを変数に取り込みます。データの取り出し方には一行ずつ取り出したり、全部取り出したりなどいくつかの方法が用意されているので、それぞれ適した方法を選びます。

		$data=$s->fetch();

「fetch」は結果から1行だけ取り出すメソッドで、「$data」には次のように結果のデータが代入されます。

		$data=Array(
			[id]=>1,[0]=>1
			[name]=>englion,[1]=>englion
			[password]=>1234,[2]=>1234
			[created]=>0,[3]=>0
		)

よく見ると連番配列と連想配列の2重で抽出したデータが入っています。連想配列だけで良い場合などは「fetch」のオプションで指定することができますが、今回は入門なので割愛します。

「fetch」の他には全てを取得する「fetchAll」や列だけを取得する「fetchColumn」などのメソッドが用意されています。

まとめ

場合によってはprepareをせずにいきなり実行(execやquery)したり、INSERTのようにfetchが必要なかったりしますが、基本的な流れは以上のようになります。


最後に少し修正したコードをまとめておきます。

		<?php
			$c=new PDO('mysql:host=localhost;dbname=d','u','p');
			$id=2;
			$ps='1234';
			$sql='SELECT * FROM user WHERE id=:id AND password=:ps';

			$s=$c->prepare($sql);
			$s->execute(array(':id'=>$id,':ps'=>$ps));
			$data=$s->fetch();

			var_dump($data);
		?>

以上がPDOを使ってデータベースを操作する一連の流れになります。