読者です 読者をやめる 読者になる 読者になる

リスを倒す 『初めてのPHP,MySQL,JavaScript&CSS』

『初めてのPHP,MySQL,JavaScript&CSS』勉強奮闘記

10-2. PHPからデータベースを操作する②PDOの利用

10章進めていきます。
昨日はPHPのプログラム内からのデータベースへの接続方法について勉強しました。

mysqliクラスもしくはPODクラスにオブジェクトを生成することでデータベースへの接続ができました。
ここで出てきた「POD」について、もう少し掘り下げて勉強します。


1-1. PODとは


PODはPHP Data Objectの略称です。PODとは、PHPからデータベースに接続して様々な処理をするための機能をまとめたクラスです。
mysqliクラスはMySQLサーバーのみ対象としていますが、PODはドライバ(データベースを制御する機能)を切り替えることで、MySQLだけではなく、PostgreSQLSQLiteなど複数のデータベースを操作できます。
このような機能の集まりをデータベース抽象化レイヤと呼びます。
PODの利点のひとつとして、別の種類のデータベースに変わってもほとんどプログラムに変更を加えずに利用できる点があげられます。


1-2. ハンドラ


PODによりデータベースに接続するときには、new演算子でPODクラスからオブジェクトを生成します。
このオブジェクトを「データベースハンドラ」または「データベースハンドル」といいます。
「ハンドラ」とは、いつも待機していて必要なときに起動されるプログラムのことです。

データベースを操作するためのメソッドがいくつか定義されており、PODクラスの詳細は、
http://www.php.net/manual/ja/class.pdo.php
で確認できます。

1-3. 属性の変更


PDOクラスの「setAttributeメソッド」を使用するとMySQLサーバに接続するときにデータベースハンドラの属性を設定できます。

設定方法は以下。

PDOのオブジェクト変数->setAttribute(
属性名,属性値);

エラー属性を取得するモードをこの属性名「PDO::ATTR_ERRMODE」に設定します。
この属性に設定できる値は以下3つです。

PDO::ERRMODE_SILENT エラーコードのみを設定します
PDO::ERRMODE_WEARNING E_WARNINGを発生させます
PDO::ERRMODE_EXCEPTION 例外を投げます

また、SQL文のテンプレート(プリペアドステートメント)を利用できるように「PDO::ATTR_EMULATE_PREPARES」に「false」を設定します。
プリペアドステートメントは速度面と安全性を向上させる仕みです。

<?php
$pdo = new PDO('mysql:host=localhost;dbname=sampledb;charaset=utf8', 'ユーザー名','パスワード');

$pdo->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$pdo ->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
?>


1-4. 接続エラーの表示


PDOによりデータベースへ接続して操作しているときに発生する異常(エラー)を「try-catch構文」を使って捕捉できます。
この機能は「例外処理」と呼ばれ、エラーが発生すると現在の正常な処理を中断して別の処理を実行します。

設定方法は以下。

try{
//異常が発生する可能性のある処理を記述します。
throw new 例外クラス('エラーが発生しました');

}catch(例外クラス 変数){

//例外の時の処理を記述します。
print 変数->メソッド();
}

以上のことをふまえ、接続エラーを表示する機能を作成します。

<?php

try{
$pdo = new PDO('mysql:host=localhost;dbname=sampledb;charaset=utf8', '間違ったユーザー名','パスワード');

//print'PDOクラスによる接続に成功しました';//

$pdo->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$pdo ->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
print "接続しました";
}catch(PDOException $Exception){
die('接続エラー:' . $Exception->getMessage());
}
?>

結果はこちら。
f:id:taro-blog2323:20160922221302p:plain

いじょー

次回はSQL文の発行をやります。

ふーーー