ホームページ  >  記事  >  バックエンド開発  >  PHP での PDO の概要

PHP での PDO の概要

WBOY
WBOYオリジナル
2016-06-23 14:32:06947ブラウズ

PDOとは何ですか?

POD (PHP Data Object) 拡張機能は PHP5 で追加されました。PHP6 では、データベースへの接続にデフォルトで PDO が使用されます。PHP6 では、PDO 以外の拡張機能はすべて削除されます。この拡張機能は、データベースにアクセスするための PHP 組み込みクラス PDO を提供し、異なるデータベースが同じメソッド名を使用してデータベース接続の不一致の問題を解決します。

Windows での開発用に設定しました。

■PDO の目標
さまざまな RDBMS ライブラリの共通機能を統合し、より高度な機能を排除しない、軽量で明確で便利な API を提供します。 PHP スクリプトを介して、オプションで高度な抽象化/互換性を提供します。

■PDOの特徴:

パフォーマンス。 PDO は、既存のデータベースの拡張における成功と失敗について最初から学びました。 PDO のコードはまったく新しいため、PHP 5 の最新機能を活用するためにパフォーマンスをゼロから再設計する機会があります。 能力。 PDO は、RDBMS の固有の機能に簡単にアクセスできるようにしながら、基盤として一般的なデータベース機能を提供するように設計されています。 単純。 PDO は、データベースの操作を簡単にするように設計されています。 API はコードに強制的に組み込まれることはなく、各関数呼び出しが何を行うのかを明確にします。 実行時に拡張可能。 PDO 拡張機能はモジュール式であるため、PHP プログラム全体を再コンパイルまたは再インストールすることなく、実行時にデータベース バックエンドのドライバーを読み込むことができます。たとえば、PDO_OCI 拡張機能は、PDO 拡張機能の代わりに Oracle Database API を実装します。 MySQL、PostgreSQL、ODBC、Firebird 用のドライバーもあり、さらに多くのドライバーが開発中です。


■PDO のインストール
WINDOWS で開発するための PDO 拡張機能をここに示します。Linux でインストールして設定したい場合は、他の場所を探してください。
バージョン要件:

php5.1 以降のバージョンは既にパッケージに含まれています。

php5.0.x は pecl.php.net からダウンロードして、PHP が存在するフォルダーである拡張ライブラリに配置する必要があります。 ext フォルダーにあります。

マニュアルには、5.0 より前のバージョンでは PDO 拡張機能を実行できないと記載されています。

設定:
pdo をサポートするように php.ini 設定ファイルを変更します (php.ini を理解していない場合は、まず phpinfo() 関数を呼び出すときに表示される php.ini を変更する必要があることを明確にしてください。)

extension=php_pdo.dll の前のセミコロンを削除します。セミコロンは php 設定ファイルのコメント記号です。この拡張子は必須です。

;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll があります=php_pdo _oci.dll
; =php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

各拡張子に対応するデータベースは次のとおりです。


ドライバ名 サポートされているデータベース

PDO_DBLIBPDO_FIREBIRDPDO_INFORMIXPDO_ MYSQLPDO_OCI PDO_ODBCPDO_PGSQLPDO_SQLITE

どのデータベースを使用するかは、対応する展開の前にあるコメント記号「;」を削除するだけです。

■ PDO を使用する
ここでは、mysql がインストールされていることを前提としています。そうでない場合は、最初にインストールする方法を見つけてください。私のバージョンは mysql5.0.22 ですが、MySQL 4.0.26 を使用している人もそれを使用できます。

★データベース接続:
次の例を使用してデータベースへの PDO 接続を分析します。

FreeTDS / Microsoft SQL Server / Sybase
Firebird/Interbase 6
IBM Informix Dynamic Server
MySQL 3.x/4.x
Oracle 呼び出しインターフェイス
ODBC v3 (IBM DB2、unixODBC および win32 ODBC)
PostgreSQL
SQLite 3 および SQLite 2
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER) //属性を設定します

$dbms='mysql'; //データベース タイプ Oracle は開発者向けに ODI を使用します。 、別のデータベースを使用します。これを変更するだけです。多くの関数を覚える必要はありません
$host='localhost';//データベースのホスト名
$dbName='test'; //使用するデータベース
$user=' root'; //データベース接続ユーザー名
$pass=''; =newPDO($dsn,$user,$pass);//PDO オブジェクトの初期化とは、データベース接続オブジェクトの作成を意味します $dbh
echo "接続が成功しました
";
/*検索も実行できます Operation o Foreach ($ dbh- & gt; query ('select * from foo') as $ row) {
proprint_r ($ row); // echo を使用することもできます($ global); */
$dbh=null;
}catch(PDOException$e){
die("エラー!: ".$e->getMessage()."
");
}

// デフォルトでは、これは長い接続ではありません。データベースへの長い接続が必要な場合は、最後にパラメーターを追加する必要があります: array(PDO::ATTR_PERSISTENT => true) :

$db=newPDO($dsn,$user,$pass,array( PDO::ATTR_PERSISTENT=>true));

?>




★データベースクエリ:
すでにクエリを実行しています上記では、次のクエリも使用できます:


$rs=$db-> ;query("SELECT * FROM foo");
$rs->setFetchMode (PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($result_arr);?>PDO::CASE_LOWER: Force列名は小文字です。



上記では setAttribute() メソッドが使用されているため、これら 2 つのパラメータを配置し、フィールド名を強制的に大文字にします。以下は PDO::setAttribute() のパラメータです:



PDO::ATTR_CASE: 列名を強制的にフォーマットにします。詳細は次のとおりです (2 番目のパラメータ):


PDO::CASE_NATURAL: 列名は元の形式です。

PDO::ATTR_ERRMODE: エラー メッセージ。 ERRMODE_SILENT: エラー情報を表示せず、エラー コードのみを表示します。

PDO::ERRMODE_EXCEPTION: 例外をスローします。

PDO::ATTR_ORACLE_NULLS (ORACLE だけでなく、他のデータベースの場合 有効): ) は、データベースから返される NULL 値に対応する値を php で指定します。

PDO::NULL_NATURAL: 変更されません。

PDO::NULL_EMPTY_STRING: 空の文字列は NULL に変換されます。

PDO::NULL_TO_STRING: NULL は空の文字列に変換されます。

PDO::ATTR_STRINGIFY_FETCHES :数値を次のように変換しますRequiresbool.

PDO::ATTR_STATEMENT_CLASS: PDOStatement から派生したユーザー指定のステートメント クラスを設定します。 Requiresarray(string classname, array(mixedconstructor_args)).

PDO::ATTR_AUTOCOMMIT ( OCI、Firebird、MySQL で利用可能): すべてのステートメントを自動コミットするかどうか。

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(MySQL で利用可能): バッファリングされたクエリを使用します。

$rs->setFetchMode(例では PDO::FETCH_ASSOC) ); は PDOStatement::setFetchMode() であり、戻り値の型の宣言です。

以下があります:

PDO::FETCH_ASSOC-- 連想配列形式

PDO::FETCH_NUM -- 数値インデックス配列形式

PDO::FETCH_BOTH -- 両方の配列形式が使用可能で、これがデフォルトです

PDO::FETCH_OBJ - - オブジェクトの形式では、以前の mysql_fetch_object() に似ています

戻り値の型宣言 (PDOStatement::メソッド名) の詳細については、マニュアルを参照してください。

★データの挿入、更新、削除、

$db->exec("DELETE FROM `xxxx_menu` where mid=43");





上記の操作の簡単な要約:

クエリ操作は主に PDO::query()、PDO::exec()、PDO::prepare() です。
PDO::query() は主に記録された結果を返す操作、特に SELECT 操作に使用されます。
PDO::exec() は主に INSERT、UPDATE、DELETE などの結果セットを返さない操作に使用されます。返される結果は、現在の操作によって影響を受ける列の数です。
PDO::prepare() は主に前処理操作です。前処理で SQL ステートメントを実行するには $rs->execute() を使用する必要があります。このメソッドはパラメータをバインドすることができ、単純に説明することはできません。この記事を参照してください。

結果セットを取得するための主な操作は、PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL() です。
PDOStatement::fetchColumn() は、フェッチ結果で指定された最初のレコードのフィールドです。デフォルトは最初のフィールドです。
PDOStatement::fetch() はレコードを取得するために使用され、
PDOStatement::fetchAll() はすべてのレコードを 1 つに取得するために使用されます。結果を取得するには、PDOStatement::setFetchMode を通じて必要な結果セットのタイプを設定できます。 。

周囲の操作も 2 つあり、1 つは PDO::lastInsertId() と PDOStatement::rowCount() です。 PDO::lastInsertId() は最後の挿入操作を返し、主キー列の型は最後の自動インクリメント ID です。
PDOStatement::rowCount() は主に、PDO::query() および PDO::prepare() の DELETE、INSERT、および UPDATE 操作の影響を受ける結果セットに使用され、PDO::exec() には無効です。メソッドと SELECT 操作。



★トランザクションと自動コミット

この時点で、PDO を介して mysql に接続しました。クエリを発行する前に、PDO がトランザクションをどのように管理するかを理解する必要があります。これまでトランザクションに触れたことがない場合は、まずトランザクションの 4 つの特性、つまり原子性、一貫性、分離性、耐久性、つまり ACID を理解する必要があります。平たく言えば、トランザクション内で実行されるすべての作業は、それが段階的に実行される場合でも、作業がデータベースに安全に適用され、作業の送信中に他の接続からのリクエストの影響を受けないことが保証されます。 。 インパクト。トランザクション作業はリクエストに応じて (まだコミットしていない場合) 自動的に取り消すことができるため、スクリプトでのエラー処理がはるかに簡単になります。
トランザクションは通常、変更のバッチを蓄積し、同時に有効にすることによって実装されます。この利点は、これらの更新の効率を大幅に向上できることです。言い換えれば、トランザクションによってスクリプトが高速化され、潜在的により堅牢になる可能性があります (ただし、そのような利点を得るにはトランザクションを正しく使用する必要があります)。
残念ながら、すべてのデータベースがトランザクションをサポートしているわけではありません (Mysql5 はトランザクションをサポートしていますが、mysql4 は知りません)。そのため、最初に接続が開かれたときに、PDO はいわゆる「自動コミット」モードで実行する必要があります。オートコミット モードは、データベースがトランザクションをサポートしている場合、実行するすべてのクエリには独自の暗黙的なトランザクションがあり、データベースがトランザクションをサポートしていない場合、すべてのクエリにはそのようなトランザクションが存在しないことを意味します。トランザクションが必要な場合は、PDO::beginTransaction() メソッドを使用してトランザクションを開始する必要があります。基礎となるドライバーがトランザクションをサポートしていない場合、PDOException がスローされます (エラー処理設定に関係なく、これは常に致命的なエラー状態です)。トランザクション内で実行中のコードが成功したかどうかに応じて、トランザクション内で PDO::commit() または PDO::rollBack() を使用してトランザクションを終了できます。
スクリプトが終了するとき、または接続が閉じられようとするときに、未完了のトランザクションがある場合、PDO は自動的にトランザクションをロールバックします。これは、スクリプトが異常終了した場合に不整合を回避するための安全対策です。トランザクションが明示的にコミットされていない場合は、どこかで不整合が発生すると想定されるため、データのセキュリティを確保するためにロールバックが実行されます。

//http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html の例
try{
$dbh=new PDO('odbc: SAMPLE','db2inst1','ibmdb2',
array(PDO_ATTR_PERSISTENT=>true));
echo "Connectedn";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh ->beginTransaction() ;
$dbh->exec("スタッフ (ID、最初、最後) の値に挿入 (23, 'Joe', 'Bloggs')");
$dbh->exec("給与変更に挿入 ( ID, 金額, 変更日)
値 (23, 50000, NOW())");
$dbh->commit();

}catch(Exception $e){
$dbh->rollBack( );
echo "失敗しました: ".$e->getMessage();
}


上の例では、新しい従業員の一連のエントリを作成すると仮定します。この従業員の ID 番号は 23 です。個人の基本データを入力することに加えて、従業員の給与も記録する必要があります。両方の更新を個別に実行するのは簡単ですが、両方の更新を beginTransaction() 呼び出しと commit() 呼び出しに含めることで、完了するまで他の人が変更を確認できないようにすることができます。エラーが発生した場合、catch ブロックはトランザクションの開始以降に発生したすべての変更をロールバックし、エラー メッセージを出力します。

トランザクション内で更新を行う必要はありません。複雑なクエリを発行してデータを抽出し、その情報を使用してさらなる更新とクエリを構築することもできます。トランザクションがアクティブな場合、作業の進行中に他のユーザーが変更を加えることができないことが保証されます。実際、これは 100% 正しいわけではありませんが、これまでトランザクションについて聞いたことがない場合には、良い入門書となります。

★プリペアド ステートメントとストアド プロシージャ

さらに多くの成熟したデータベースがプリペアド ステートメントの概念をサポートしています。準備済みステートメントとは何ですか?プリペアド ステートメントは、実行する SQL のコンパイルされたテンプレートと考えることができ、変数パラメーターを使用してカスタマイズできます。準備されたステートメントには 2 つの大きな利点があります:

クエリは 1 回だけ解析 (または準備) する必要がありますが、同じまたは異なるパラメーターを使用して複数回実行できます。クエリの準備が完了すると、データベースはクエリを実行するための計画を分析、コンパイル、最適化します。複雑なクエリの場合、このプロセスには時間がかかり、異なるパラメータを使用して同じクエリを複数回繰り返す必要がある場合、アプリケーションの速度が大幅に低下する可能性があります。準備されたステートメントを使用すると、分析/コンパイル/最適化サイクルの繰り返しを回避できます。簡単に言えば、準備されたステートメントは使用するリソースが少ないため、より高速に実行されます。 準備されたステートメントに指定されるパラメータは引用符で囲む必要はありません。これらはドライバーによって処理されます。アプリケーションが準備されたステートメントを排他的に使用する場合、SQL 侵入は発生しないことが保証されます。 (ただし、クエリの他の部分を依然として信頼できない入力に基づいている場合は、依然としてリスクが存在します)。

プリペアド ステートメントは非常に便利であるため、PDO は目標 4 で設定されたルールを実際に破っています。ドライバーがプリペアド ステートメントをサポートしていない場合、PDO はプリペアド ステートメントをエミュレートします。


例: PDO アプリケーションの例:

$dbms='mysql';//データベース タイプ Oracle は、開発者が異なるデータベースを使用するために、このように変更するだけです。それほど多くの関数を覚える必要はありません

$host='localhost';//データベースホスト名

$dbName='test';//使用するデータベース

$user='root';//データベースに接続しますユーザー名

$ pass = ''; // 対応するパスワード

$ dsn = "$ dbms: host = $ Host; dbname = $ dbname"; ,$GLOBALS['user'],$GLOBALS['pass']);
}catch(PDOException$e){
die("エラー: ".$e- >__toString()."
($ sql));
} catch(pdoexception $ e){
echo" $ sql "; $ db- & gt; setttribute (pdo :: Attr_case, pdo :: case_upper);
Foreach ($ DB ->query('SELECT * from xxxx_menu')as$row){
print_r($row);
}
$db->exec('DELETE FROM `xxxx_menu` where mid=43');
?> ;







声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。