PHPフィーチャリングDB!PDO入門
この入門ページでは、PHPのPDOを使ってデータベースにアクセスする方法を簡単に解説します。
PDOとは
データベースにはいくつか種類があります。PHPからデータベースを操作するとき、データベースによってやり方が違うとなると、例えばデータベースを変更した場合にコード修正が多岐に渡るなど、非常に面倒くさいことになります。
それを防ぐために、PHPにはどんなデータベースでも同じやり方で操作できる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を実行するのに三段階のステップを踏みます。
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を使ってデータベースを操作する一連の流れになります。