コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「PHP Data Object」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Dest (会話 | 投稿記録)
データベースへの接続を抽象化していることを明記, もう少し直したいが時間が無いので簡単に
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
4行目: 4行目:
[[2005年]]11月24日にリリースされたPHP 5.1.0から標準でバンドルされるようになった拡張モジュール([[PECL]])であり、データソース名(DSN)によって使用する内部エンジンを切り替えることで各種データベースに対する統一的なアクセスインターフェイスを提供する。
[[2005年]]11月24日にリリースされたPHP 5.1.0から標準でバンドルされるようになった拡張モジュール([[PECL]])であり、データソース名(DSN)によって使用する内部エンジンを切り替えることで各種データベースに対する統一的なアクセスインターフェイスを提供する。


<source lang="php" line="1">
<syntaxhighlight lang="php" line="1">
<?php
<?php
try {
try {
13行目: 13行目:
}
}
?>
?>
</syntaxhighlight>
</source>


例えば、上記のコードではPDOクラスの第一引数にDSNを与えており、<code>mysql:</code>がMySQL或いはMariaDBに接続するための内部エンジンを使用することを表している。
例えば、上記のコードではPDOクラスの第一引数にDSNを与えており、<code>mysql:</code>がMySQL或いはMariaDBに接続するための内部エンジンを使用することを表している。

2020年7月5日 (日) 22:58時点における版

PHP Data Object (PDO) とはPHPに拡張モジュールとして標準で提供されているデータベース抽象化レイヤであり、各種データベース(DBMSRDBMS)への接続を抽象化する。

概要

2005年11月24日にリリースされたPHP 5.1.0から標準でバンドルされるようになった拡張モジュール(PECL)であり、データソース名(DSN)によって使用する内部エンジンを切り替えることで各種データベースに対する統一的なアクセスインターフェイスを提供する。

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=pdotest",
                   "username", "password");
} catch(PDOException $e){
    var_dump($e->getMessage());
}
?>

例えば、上記のコードではPDOクラスの第一引数にDSNを与えており、mysql:がMySQL或いはMariaDBに接続するための内部エンジンを使用することを表している。 この部分をpgsql:などに変更することで使用するデータベースをMySQLからPostgreSQLなどに変更することが出来る。

多くのデータベースに対応する必要のあるシステム開発や、システムを異なるデータベースに移行するときなどに、特に威力を発揮する。 またDoctrineやEloquentのようなORMライブラリの内部でデータベース接続を行うバックエンドとして利用されている。

機能

PDOは、以下の機能を提供している[1]

  • INSERT・UPDATE・DELETEなどのSQLクエリの実行
  • 以下の形式でのデータベースからの値の取得
  • 複数次元の配列でのすべての行の取得
  • プリペアードステートメントの実行及びエミュレーション
  • トランザクションの使用
  • オートコミットのサポート
  • テーブルのカラムの一般化機能

プリペアードステートメントを使ったプログラム例

例えば userテーブルに変数$nameに'ウィキペディア'という文字列をSQLに挿入する例(prepareメソッド):

<?php
$names = 'ウィキペディア';
$stmt = $pdo->prepare('INSERT INTO user (name) VALUES (:name)');
$stmt->bindValue(':name', $names, PDO::PARAM_STR);
$stmt->execute();
?>
または:
<?php
$names = 'ウィキペディア';
$stmt = $pdo->prepare('INSERT INTO user (name) VALUES (:name)');
$stmt->execute([':name' => $names]);
?>

実装までの経緯

PHPはWebアプリケーション作成の開発に適した言語であり、Webアプリケーションと連携する多くのデータベースにアクセスする機能も、モジュールとして標準で備えている。しかし、その接続するための関数とそれに渡す引数はそれぞれのデータベース毎に異なっていた。

MySQLMariaDBではmysql_connect関数に代表されるMySQLモジュール[2](PHP7.0現在はmysqli_connnectに代表されるMySQLi[3]に置き換えられた[4])、PostgreSQLではpg_connect関数に代表されるPostgreSQLモジュール[5]など、データベース毎に実装が異なっていた。また、関数に渡すパラメータなども各データベースによって異なるなど、複数のデータベースをサポートする開発者にとって多大な負担になっていた[1]

PHP4では、PEARの1つとして、PEAR::DBがあり、これがデータベースへのアクセス機能をまとめ、共通のAPIを提供していた。しかし、この機能はPHPスクリプトで書かれているため、速度面で遅くなりがちという欠点を抱えていた[6]。中小規模のシステムならともかく、大規模なシステムではその速度の遅さが欠点となっていた。

そこで、PHP5からはC言語で書かれた拡張モジュールとしてPDOが作成・提供されることとなった。

備考

PDOはデータベースへの接続を抽象化するライブラリであり、SQLに対する抽象化は殆ど行わないことに注意が必要である。 すなわちデータベース毎の独自拡張の利用やSQL構文の差異の吸収はプログラマが手で行うか、クエリビルダやORMなどのより高度な抽象化を行うライブラリを利用する必要がある。

また、プリペアドステートメントを用いることでSQLインジェクションの脆弱性をより安全に回避することができるが、環境によっては対応が不完全で問題が発生したケースもある[7]

脚注

  1. ^ a b ThinkIT 第1回:PDOの概要 (1/3)
  2. ^ http://php.net/manual/ja/book.mysql.php
  3. ^ http://php.net/manual/ja/book.mysqli.php
  4. ^ http://php.net/manual/ja/migration70.removed-exts-sapis.php
  5. ^ http://php.net/manual/ja/book.pgsql.php
  6. ^ PDOでサクサクDB開発:CodeZine
  7. ^ PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり

関連項目

外部リンク