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

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

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

備考

編集

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

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

注釈

編集

出典

編集

関連項目

編集

外部リンク

編集

📚 Artikel Terkait di Wikipedia

PHP (プログラミング言語)

rfc:multiple-catch”. php.net (2016年3月6日). 2023年6月30日閲覧。 ^ “PHP: rfc:object-typehint”. wiki.php.net. 2024年1月23日閲覧。 ^ “PHP: rfc:libsodium”. wiki.php.net. 2024年1月23日閲覧。

オブジェクト指向プログラミング

オブジェクト指向プログラミング(オブジェクトしこうプログラミング、英: object-oriented programming, OOP)とは、データの状態とそれを操作する処理を一体として扱う「オブジェクト」を基本単位にソフトウェアを構築するプログラミングパラダイムである。

Common Object Request Broker Architecture

lk、Java、COBOL、PL/I、Python である。標準に組み込まれていないが、Perl、PHP、Ruby、Visual Basic、Tcl、Delphi へのマッピングを実装したObject Request Brokerが存在する。 下図はCORBA基盤で生成されたコードが使われる様子を示したものである。

JSON

JSON(ジェイソン、JavaScript Object Notation)はデータ記述言語の1つである。軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する。 JSONはウェブブラウザなどでよく使われているECMA-262

プロセス間通信

IPCとして使われているAPIはいくつかある。プラットフォームに依存しない主なAPIの例を挙げる。 無名パイプ(英語版)と名前付きパイプ Common Object Request Broker Architecture (CORBA) Freedesktop.orgのD-Bus Distributed Computing

プログラミング言語一覧

notation) Perl PHP Pic Piet Pike PL/0 PL/I Planner Pnuts(英語版) Pony(英語版)(ponylang) PostScript PowerShell Processing Prograph Prolog Proto Pure Data PureScript

COinS

COinSはOpenURLのバージョン1.0からシリアル化フォーマットのKEVを、OpenURLの実装ガイドラインからContextObjectのメタデータフォーマットを一部借用した。COinSのContextObject実装ガイドラインには4種類の出版物(記事とそれをさらに細分化した種類、書籍、特許、ジェネリック)と簡単な

ECMAScript

esdiscuss.org (2008年8月13日). 2025年1月14日閲覧。 ECMAScript for XML (E4X) JavaScript Object Notation (JSON) CommonJS TypeScript: JavaScriptの構文を保ちつつ、型に関する機能を外部的に追加したプログラミング言語