以前はPHPからデータベースに接続しようとするとMySQLであれば「mysql_connect」関数、PostgreSQLであれば「pg_connect」関数などと接続するデータベースに合わせて使用する関数を使い分ける必要がありました。
(データベース接続のSQL発行や結果の取得もデータベースごとに関数が設けられていました)
そのため、使用するデータベースが変更となると影響範囲がものすごいことになるという弱点がありました。
しかし、PDOクラスが登場したことにより「データベースが異なる場合でも同じ関数を使用することができる」ためデータベースの変更にも耐えれるようになりました。
今回はこのPDOクラスを使用してmySQLへの接続方法を紹介します。
目次
PHPのPDOクラスとは
PDOとは「PHP Data Objects」の頭文字をとった名称です。
データベースの内容をPHPのオブジェクトのように扱えるようになるクラスになります。
PHPのPDOクラスでMySQLに接続するサンプルコード
いきなりですが、PHPのPDOクラスでMySQLに接続するサンプルコードを下記します。
ちなみにデータベースのテーブルは以下のようなものとします。
■テーブルの構成
■テーブルの内容
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 51 52 53 54 55 56 57 58 59 |
<?php // データベース接続に必要な定数定義 define('DSN', 'mysql:host=localhost;dbname=mydb;charset=utf8'); define('USER', 'root'); define('PASSWORD', 'root'); // データベースに接続失敗すると例外が発生するので、try、catchで囲む try { // データベース接続 $pdo = new PDO(DSN, USER, PASSWORD); echo "データベース接続成功"; echo '<br>'; } catch (PDOException $e) { // エラーメッセージ表示 echo "データベース接続失敗:" . $e->getMessage(); echo '<br>'; // 処理終了 exit(); } // 固定のSQLの場合 $stmt = $pdo->query('SELECT * FROM memos'); // 結果を取得 echo '【固定のSQLの場合】'; echo '<br>'; while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $result['id'] . '<br>'; echo $result['memo'] . '<br>'; } // SQLが可変(WHEHE句等にユーザー入力値が入る等)の場合 // 可変部分を「?」とする場合 $stmt = $pdo->prepare('SELECT * FROM memos WHERE id = ?'); $stmt->execute(array(2)); // 結果を取得 echo '【SQLが可変(WHEHE句等にユーザー入力値が入る等)の場合:可変部分を「?」とする場合】'; echo '<br>'; while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $result['id'] . '<br>'; echo $result['memo'] . '<br>'; } // 可変部分を「:キー値」とする場合 $stmt = $pdo->prepare('SELECT * FROM memos WHERE id = :id OR memo = :memo'); $stmt->bindValue(':id', 5); $stmt->bindValue(':memo', 'メモ3'); $stmt->execute(); echo '【SQLが可変(WHEHE句等にユーザー入力値が入る等)の場合:可変部分を「:キー値」とする場合】'; echo '<br>'; // 結果を取得 while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $result['id'] . '<br>'; echo $result['memo'] . '<br>'; } ?> |
とりあえず上記のデータベースを作成し、コードを実行したらデータベースに接続し、データをSELECTする3パターンの結果が見れます。
では順番に見ていきます。
PHPのクラスでMySQLに接続する方法【接続部分】
MySQL部分の接続部分はサンプルコードの以下の部分になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// データベース接続に必要な定数定義 define('DSN', 'mysql:host=localhost;dbname=mydb;charset=utf8'); define('USER', 'root'); define('PASSWORD', 'root'); // データベースに接続失敗すると例外が発生するので、try、catchで囲む try { // データベース接続 $pdo = new PDO(DSN, USER, PASSWORD); echo "データベース接続成功"; echo '<br>'; } catch (PDOException $e) { // エラーメッセージ表示 echo "データベース接続失敗:" . $e->getMessage(); echo '<br>'; // 処理終了 exit(); } |
ここでポイントになるのが、PDOクラスのインスタンスを作成する以下の部分。
1 2 3 4 5 6 |
$pdo = new PDO(DSN, USER, PASSWORD); // DSN:データソース名(Data Source Name)。データベースに接続するための情報 // MySQLの場合:mysql:host=ホスト名;dbname=データベース名;charset=文字コード // USER:データベースに接続するユーザーID // PASSWORD:データベースに接続するパスワード |
サンプルコードはそれぞれを定数で宣言して指定しています。
これでデータベースへの接続は完了です。
将来的にデータベースが変更になった場合もDSNの部分を変更すればOKです。
注意点としてはデータベース接続時に例外が発生する可能性があるので、tyr、catchで囲む必要があるということですね。
それさえ注意すれば簡単にデータベースへの接続ができます。
PHPのクラスでMySQLに接続する方法【クエリ(SQL発行)】
クエリを発行するには大きく2種類の方法があります。
SQLが固定の場合:queryメソッド
SQLが固定(ユーザー入力などによってSQLの内容が変わらない)場合はサンプルコードの以下の部分がSQL発行にあたります。
1 |
$stmt = $pdo->query('SELECT * FROM memos'); |
返り値はPDOStatmentと呼ばれるオブジェクトで、SQLの結果などが格納されています。
SQLが可変の場合:prepareメソッド(パターン1)
SQLが可変(ユーザー入力などによってSQLの内容が変わる)場合は2パターンの方法があります。
まず1パターン目はSQLの可変部分を「?」で指定する場合です。
サンプルコードでは以下の部分になります。
1 2 |
$stmt = $pdo->prepare('SELECT * FROM memos WHERE id = ?'); $stmt->execute(array(2)); |
- prepareメソッドでSQLを指定。SQLの可変部分を「?」とする
- prepareメソッドで返ってきたPDOステートメントのexecuteメソッドに「?」部分の値を配列で指定する
これでqueryメソッドを実行した状態と同じになります。
SQLが可変の場合:prepareメソッド(パターン1)
SQLが可変の場合の2パターン目はSQLの可変部分を「:キー値」で指定する場合です。
サンプルコードでは以下の部分になります。
1 2 3 4 |
$stmt = $pdo->prepare('SELECT * FROM memos WHERE id = :id OR memo = :memo'); $stmt->bindValue(':id', 5); $stmt->bindValue(':memo', 'メモ3'); $stmt->execute(); |
- prepareメソッドでSQLを指定。SQLの可変部分を「:キー値」とする
- prepareメソッドで返ってきたPDOステートメントのbindValueメソッドでキー値に対応する値をセットする
- PDOステートメントのexecuteメソッドを実行する
これでqueryメソッドを実行した状態と同じになります。
PHPのクラスでMySQLに接続する方法【データ取得】
SQL発行(query、executeメソッド)を実行した後は、PDOステートメントのfetchメソッドを使用してデータを1行ずつ取得していきます。
サンプルコードの以下の部分です。
1 2 3 4 |
while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $result['id'] . '<br>'; echo $result['memo'] . '<br>'; } |
fetchメソッドの引数によってSQLでの取得結果が変わります。
サンプルコードの「PDO::FETCH_ASSOC」はカラム名がキー値となる連想配列で返ってきます。
この引数には色々ありますが、PHPの公式マニュアルを見てもよく分かりません。
以下のQiita記事に色々とまとまっているので、そちらを参照すると分かりやすいかと思います。
PDOフェッチパターン大全
INSERT、UPDATE、DELETEなどを行う場合
これはSELECTする場合と同じで、データがSQLが固定であればqueryメソッド、可変であればprepareメソッドを使用して発行すればOKです。
SELECTとの違いはSQL発行した後のfetch(データ取得)が不要というだけです。
(正しく更新できたかを確認するには、更新後のデータをSELECTする必要があります)
まとめ
いかがだったでしょうか。
今回はMySQLを例に紹介しましたが、PDOを使用すれば簡単にデータベースに接続することができます。
しかもデータベースが変更になっても接続部分のみを変更すれば良いという優れもの。
Webアプリを作成するためには必須の技術なので、しっかりと身につけておきましょう。