PHPでPDOを使ってMysqlへ アクセスする方法

PHPとmysqlはほとんどセットで扱われており、オープンソースのCMSで最もよくある組み合わせの1つではないでしょうか。レンタルサーバーもこの2点が利用できるサーバーが大半を締めていると思います。

PHPのver5.1からPDOでのデータベース接続が利用できるようになりました。

それまでは、各DB毎に関数を使い分ける必要があり、mysqlに接続するなら、mysql_connect、PostgreSQLへ接続するならpg_connectと関数を使い分ける必要がありました。

しかし、これら関数は、PHP5.5で非推奨となり将来的には削除される予定で、現在は、PDOを使ってデータベースに接続するのがより簡単、かつ安全です。

PDOとは?

PDOは「PHP Data Objects」の略で、特徴としては、どのデータベースを利用する場合でも関数を使い分ける必要がなく、将来的にデータベースの変更をする場合でも、PDOオブジェクトを作成する時に指定したパラメーターの変更だけで済むので、柔軟な記述が可能となります。

PDOを利用してPHPからMysqlに接続する。

まずPDOを使ってデータベースへ接続してみます。PDOにおいてはデータベースへの接続とは、PDOクラスのオブジェクトを作成することで行います。

その際、DSNを引数として設定する事で、データベースを変更する場合でも、DSNの記述を変更するのみで、処理は変えずに対応する事が可能となります。

DSNとは?

DSNという新しい単語が出てきましたが、IT用語辞典では以下のように記述されています。

DSNとは、ODBCなどのデータベース接続機構において、プログラムからデータベースを操作する際に対象となるデータベースを指定するための識別名。

OSのコントロールパネルなどから登録することができ、データベースの所在を示すファイル名などのほかに、管理しているデータベース管理システム(DBMS)の種類や、接続を仲介するドライバソフト、ログインに使うユーザ名やパスワード、バッファメモリの容量などのパラメータなどがまとめて保存される。

プログラムからそのデータベースを操作したい場合には、これらの詳細な設定などを省略してDSNを指定するだけでデータベースを開くことができるようになる。

単にDSNといった場合には一般的にはODBCのそれを意味するが、PHPなどでは独自のデータベース接続指定書式のことをDSNと呼んでいる場合がある。

引用元:DSN 【 Data Source Name 】

DSNの記述例

DSNの記述は以下のようにデータベース名、ホスト名、ポート番号を指定します。これらの情報を変数に代入する事で再利用しやすくします。

mysql:dbname=DB名;host=ホスト名;port=ポート番号

$dsn = 'mysql:dbname=test;host=localhost';

PDOを利用したMysql接続サンプル

先ほどのDSNに加え、mysqlのユーザー名・パスワードを変数に代入しておきます。
try/catch文でのエラー処理を行う事でMysqlへ接続します。

<?php
//DBにMysql、データベース名・testを指定。
$dsn = 'mysql:dbname=test;host=localhost';

//DBに接続するためのユーザー名・パスワードを設定
$user = 'testuser';
$password = 'testuser';


try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);

    //ここに処理を記載

    //接続終了
    $pdo = null;
}

//接続に失敗した際のエラー処理
catch (PDOException $e){
    print('エラーが発生しました。:'.$e->getMessage());
    die();
}
?>

データベースへの接続と、終了

$pdo に値を代入する事でデータベースへの接続を開始し、 $pdoにNULLを明示的に代入することで接続終了となります。

NULLを明示的に代入せずとも、スクリプト終了時にデータベースへの接続は自動的に終了します。

try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);

    //ここに処理を記載

    //接続終了
    $pdo = null;
}

データベースへの持続的な接続を行う場合

データベースへプログラム毎に接続、終了の処理を行うと無駄な処理が発生し、パフォーマンスを犠牲にする場合があります。

キャッシュを利用する事で、他のスクリプトが同じ内容の接続を要求してきた際に再利用する事が可能です。

<?php
$pdo = new PDO($dsn, $user, $password, array(
    PDO::ATTR_PERSISTENT => true
));
?>

PDOでSELECT文(検索)を利用する

データベースの処理で最も利用頻度の高いものがSELECT文による、データの表示だと思います。
以下は、SELECT文で取得した全データをループさせるサンプルです。

<?php
try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);

    $sql = 'select * from テーブル名';
    $stmt = $pdo->query($sql);

    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
        print($result['id'].':');
        print($result['name'].'<br>');
    }
}?>

while関数の代わりにforeach関数を利用する場合、以下のように記述でき、よりシンプルに利用する事が可能です。

try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);

    $sql = 'select * from テーブル名';
    $stmt = $pdo->query($sql);

    foreach ($stmt as $result) {
        print($result['id'].':');
        print($result['name'].'<br>');
    }
}

queryメソッドとprepareメソッド

先ほど、SQL文を発行する際に、$stmt = $pdo->query($sql);というqueryメソッドを利用しましたが、実際はこのような使い方よりも、変数を用いて、代入された値に対し、SQLを実行する場合が多いと思います。

その場合、以下のように「?」を変数のように用いて、SQL文を作成し、該当したIDだけを取得する事が可能です。

注意すべき点は、executeメソッドに配列で代入する値を指定しないとエラーになるという点です。

また、先ほどはテーブルに登録されたデータをすべてforeachでループさせましたが、今回は該当するIDと名前のみを取得するため、$result = $stmt->fetch(PDO::FETCH_ASSOC); で連想配列に代入しています。

try{
//データーベースに接続
    $pdo = new PDO($dsn, $user, $password);

    $sql = 'select * from tbl where id = ?';
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array($id));

    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    print($result['id'].':');
    print($result['name'].'<br>');
    
}

PDOを用いたデータベース接続について、簡単にまとめてみましたが、理解が足りていない点もあるかと思いますのでおかしい点がありましたら、コメントにてご指摘頂けると助かります。