php PDOの使用法

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

PDO (PHP Data Object) は PHP 5 の新しい機能です。PHP 6 がリリースされると、PHP 6 はデフォルトでデータベースの処理に PDO のみを使用するため、すべてのデータベース拡張機能は PECL に移動されます。私たちのお気に入りの php_mysql.dll などはもうなくなってしまったので、時代に合わせるしかないので、PDO を試してみました。 (この記事は入門レベルです。専門家は読み飛ばしてください、笑)


【PDO とは】

PDO は、PHP 5 に追加された主要な新機能です。なぜなら、PHP 5 より前では、php4/php3 はすべて、データベース MySQL、PostgreSQL、MS SQL Server、SQLite に接続するために、php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll などのさまざまなデータベースに接続して処理するための拡張機能。同様に、ADOdb を使用する必要があります。結局のところ、::DB や PHPlib::DB などの PEAR データベース抽象クラスは非常に面倒で非効率的ですが、C/C++ で直接記述するほど PHP コードの効率が高くなるわけはありません。したがって、PDO の登場は必然であり、誰もが冷静に学習する姿勢でその使用を受け入れる必要があります。おそらく、PDO によって多くの労力が節約されることがわかるでしょう。

【PDO のインストール】

私は Windows XP SP2 を使用しているため、すべてのプロセスは Windows 上で実行されます。Linux/FreeBSD およびその他のプラットフォームについては、情報を見つけて自分でインストールを設定してください。
私のものは PHP 5.1.4 で、すでに php_pdo.dll 拡張機能が付属していますが、使用する前に少しセットアップが必要です。

私の PHP 設定ファイルである c:windowsphp.ini を開き、次の行を見つけます:
extension_dir
これは、私の PHP 5 拡張機能が存在するディレクトリです: C:php5ext を変更します。次の行:

extension_dir = "C:/php5/ext"


次に、php.ini に移動して、次を見つけます。 ;;;;;;
; ;;;;;;;;;;;;;;;;;;; 似たような拡張子がたくさんあります = php_mbstringここで、PHP 拡張機能の読み込みの設定を示します。最後に PDO 拡張機能を追加します。

extension=php_pdo.dll

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

extension = php_pdo_mssql.dll extension=php_pdo_odbc.dll

extension=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll


すべての PDO ドライバーを追加できますが、次の php_pdo_oci8.dll は、アルセデータベース、私これがなかったので、セミコロンを使用してコメントアウトしました。次に、Web サーバー、IIS/Apache を再起動します。私の場合は IIS です。おい、あなたは私を見下しています。Windows では簡単です。
再起動後、Web サーバーのドキュメント ディレクトリに phpinfo.php ファイルを作成し、次の内容を追加します:



そして、素敵な My ブラウザを開きます。 : IE/FireFox、私のは FireFox 2.0 です。今ダウンロードしました。素晴らしいです。不正なソフトウェアは怖くないです (笑)。
ブラウザに「http://localhost/phpinfo.php」と入力します。このページへのパスが一致しない場合は、自分で入力してください。

出力内容で、スムーズに見ることができれば:




PDO
PDO support Enabled
PDO drivers mysql, pgsql, sqlite, mssql, odbc, firebird


最後にさまざまなドライバーの説明があります。
PDO_Firebird、pdo_mssql、pdo_mysql、PDO_ODBC、pdo_pgsql、pdo_sqlite


それでは、インストールが成功しましたらおめでとうございます。そうでない場合は、上記の手順を注意深く確認してください。



【ちょっとした実力テスト】

私は MySQL 4.0.26 を使用していますが、個人的には MySQL 4.1.x または MySQL 5.0.x を使用することをお勧めします。これらのバージョンには学ぶ価値のある興味深いことがたくさんあるからです。 PDO が接続する必要があるのは MySQL 4.0 です。MySQL をインストールしていない場合は、自分でインストールしてください。 MySQL を確立し、id、名前、性別、時刻の 4 つのフィールドを含むテーブル foo をテスト ライブラリに追加しました。


最初の PDO アプリケーションの構築を開始し、Web ドキュメント ディレクトリに pdo.php ファイルを作成します。


$dsn = "mysql:host=localhost;dbname=test"; db = 新しい PDO( $dsn, 'root', '');

$count = $db-> exec("INSERT INTO foo SET name = 'heiyeluren', 性別 = '男性', time=NOW()" );

$count;

;

意味がわからないので、ゆっくり説明しましょう。この行:
$dsn = "mysql:host=localhost;dbname=test";
は、DSN (データ ソース) を構築するためのものです: データベース タイプは mysql、ホスト アドレスは localhost、データベース名は test です。これはほんの一部の情報です。データベースごとにデータソースの構築方法が異なります。

$db = new PDO($dsn, 'root', '');
PDO オブジェクトを初期化します。コンストラクターの最初のパラメーターはデータ ソース、2 番目はデータベース サーバーに接続するユーザー、3 番目はデータベース サーバーに接続するユーザーです。最初のパラメータはパスワードです。接続が成功することは保証できません。例外については後で説明します。ここでは接続が成功したと仮定します。

$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren', 性別='male', time=NOW()");
echo $count;
正常に接続された PDO オブジェクトを呼び出しますクエリを実行すると、このクエリはレコードを挿入する操作です。PDO::exec() メソッドを使用すると、レコードに影響を与える結果が返されるため、この結果を出力します。最後に、オブジェクト リソースを終了する必要があります:
$db = null;

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

これは 1 つでは非常に簡単です操作は以前のものとあまり変わらないかもしれませんが、ADOdb とは少し異なります。

【学び続ける】

データを抽出したい場合は、データ取得関数を使用する必要があります。 (以下で使用する $ DB は上で接続したオブジェクトです)

& & lt;? PHP

Foreach ($ db-& gt; query ("Select*from FOO") {
Print_r ($ row) ;
}
?> while( $row = $rs->fetch()){
print_r( $row) }

?>




すぐにこれを行うことができます:


$rs = $db->query("SELECT * FROM foo")
$result_arr = $rs->fetchAll(); print_r( $result_arr);





配列

(

[0] => 配列

(
) [id ; ヘイエルレン 1 [1] = & gt; ヘイエルレン
[性別] = & gt; [2] = & gt; 2006-10-28 23:14:23
; 2006; 2006 -10-28 23:14:23
)

}



内部のレコードを調べます。これはリソースの無駄です。 :

$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER)

$rs = $db->query("SELECT * FROM foo"); rs->setFetchMode(PDO:: FETCH_ASSOC);

$result_arr = $rs->fetchAll();





上記のコードを見てください。 ) メソッドはいくつかの属性を設定するもので、主な属性は PDO::ATTR_CASE、PDO::ATTR_ERRMODE などです。ここで設定する必要があるのは PDO::ATTR_CASE、つまり、関連付けられたインデックスを使用してデータを取得する場合です。関連するインデックスが大文字であるか小文字であるかに関係なく、いくつかのオプションがあります:

PDO::CASE_LOWER -- 列名を強制的に小文字にする
PDO::CASE_NATURAL -- 元の方法に従った列名
PDO::CASE_UPPER - - 列名を強制的に大文字にする


setFetchMode メソッドを使用して、結果セットを取得するための戻り値のタイプを設定します。同じタイプは次のとおりです。

PDO::FETCH_ASSOC -- 連想配列形式
PDO::FETCH_NUM -- 数値インデックス配列形式
PDO:: FETCH_BOTH -- どちらもデフォルトの配列形式で利用可能です
PDO::FETCH_OBJ -- 前の mysql_fetch_object() と同様のオブジェクトの形式です

もちろん、一般的には PDO::FETCH_ASSOC を使用します。具体的に使用する場合は、必要に応じて他の取得タイプについてのマニュアルを参照してください。

上記のデータ取得方法に加えて、次の方法もあります。


$rs = $db->prepare("SELECT * FROM foo");
$rs- > ;execute();
while( $row = $rs->fetch()){
print_r( $row) }
?>

実際には、ほぼ同じです。指定したレコードのフィールドの結果を取得したい場合は、 PDOStatement::fetchColumn():





$rs = $db->query("SELECT COUNT(*) ) FROM foo" );

$col = $rs->fetchColumn();

echo $col;
?>


一般に、fetchColumn() はカウント統計や、単一のレコードのみを必要とする一部のレコードに使用されます。分野。


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

クエリ操作は主に 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 クラスのエラー情報と例外処理について説明します。

1. オブジェクト指向のアプローチ

まず、オブジェクト指向のアプローチを使用して接続エラーなどに対処する方法を見てみましょう:



try {

$db = new PDO( 'mysql: host=localhost;dbname=test', $user, $pass);

$db = null;
} catch (PDOException $e) {
print "Error: " . "< br/>";
die();
}
?>


ここでは、PHP 5 のオブジェクト指向例外処理機能を使用します。 PDOException を呼び出して例外クラスを初期化します。

PDOException 例外クラスの属性構造:


class PDOException extends Exception

{

public $errorInfo = null; // エラー情報については、PDO::errorInfo() または PDOStatement::errorInfo を呼び出すことができます。 ( )
protected $message にアクセスします。 // 例外情報、
protected $code にアクセスするには Exception::getMessage() を使用できます。 // SQL ステータス エラー コード、
にアクセスするには Exception::getCode() を使用します。
?> ;


この例外処理クラスは、PHP 5 の組み込み例外処理クラスと統合されています。PHP 5 の組み込み例外処理クラス構造を簡単に見てみましょう。& & Lt ;? PHP

クラス例外

{
// 属性
Protected $ message = '不明な例外' // 異常な情報
LotEcted $ code = 0; // ユーザーカスタム異常コード
判明した $ file; / 例外が発生したファイル名
protected $line; getCode(); // 例外コードを返す
Final function getFile(); // 例外が発生したファイル名を返す
() array Final function getTraceAsString(); // 文字列にフォーマットされた getTrace() 情報
} ?>





対応して、getFile() と getLine() はコード内で適切に呼び出すことができます。エラーを見つけます。デバッグを実行する方が便利です。


2. プロセス指向のアプローチを使用します
まずコードを見てください:

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass );

$rs = $db->query("SELECT aa,bb,cc FROM foo");

if ( $db->e​​rrorCode() != '00000'){

print_r( $db-> ;errorInfo( ));

exit;

$arr = $rs->fetchAll();

$db = null; errorCode() は 00000 を返します。それ以外の場合は、いくつかのエラー コードが返されます。 errorInfo() は、PHP および MySQL のエラー コードとエラー メッセージで定義されたエラー コードを含む配列を返します。配列の構造は次のとおりです。 ; 1054
[2] => 'フィールド リスト' の不明な列 'aaa'
)

各クエリの実行後、errorCode() の結果が最新になるため、エラー メッセージを簡単に制御できます私たち自身が示します。



[簡単な概要]

上記の使用法から、PDO が確かに強力であることがわかります。パラメータのバインディング、前処理、ストアド プロシージャ、トランザクション処理など、他にも言及していない機能があります。機能。さらに、Oracle データベース自体にはさまざまなデータ拡張構造があり、詳細な学習と理解を必要とする特殊な機能が多数あります。この記事では、PDO の簡単な理解としていくつかの入門知識について簡単に説明します。



[参考]

Oracle を使用した PHP 5 データ オブジェクト (PDO) 抽象化レイヤー

PDO 関数



PDOとは何ですか?
POD (PHP Data Object) 拡張機能は PHP5 で追加されました。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 が保存されているフォルダーの拡張子ライブラリに配置する必要があります。
マニュアルには、5.0 より前のバージョンでは PDO 拡張機能を実行できないと記載されています。

設定:
pdo をサポートするように php.ini 設定ファイルを変更します (php.ini を理解していない場合は、まず phpinfo() 関数を呼び出すときに表示される php.ini を変更する必要があることを明確にしてください。 . )
PHP 設定ファイルのコメント記号である
extension=php_pdo.dll の前のセミコロンを削除します。この拡張子は必須です。拡張子 = php_pdo.dll
; 拡張子 = php_pdo_informix.dll
; 拡張子 = php_pdo_mysql.dll
; もあります。
; 拡張子 = php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
各拡張子に対応するデータベースは次のとおりです:
ドライバー名サポートされているデータベースPDO_DBLIBFreeTDS / SybasePDO_FIREBIRDFirebird/インターベース 6PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3.x/4.xPDO_OCIOracle 呼び出しインターフェイスPDO_ODBCODBC v3 (IBM DB2、unixODBC および win32 ODBC)PDO_PGSQLPostgreSQLPDO_SQLITESQLite 3 および SQLite 2
どのデータベースを使用するかは、対応する拡張子の前にあるコメント記号「;」を削除するだけです。

■PDO を使用する
ここでは、mysql がインストールされていることを前提としています。そうでない場合は、まずインストールする方法を見つけてください。私のバージョンは mysql5.0.22 ですが、MySQL 4.0.26 を使用している人もそれを使用できます。
★データベース接続:
データベースへの PDO 接続を分析するために次の例を使用します。



$dbms='mysql'; //データベース タイプ Oracle は ODI を使用します。開発者にとっては使用方法が異なります。データベース、これを変更するだけで、多くの関数を覚える必要はありません

$host='localhost';//データベースホスト名$dbName='test'; //使用するデータベース$user='root'; username
$pass=''; //対応するパスワード
$dsn="$dbms:host=$host;dbname=$dbName";
//

try{
$dbh=newPDO($ dsn,$user, $pass);//PDO オブジェクトの初期化とは、データベース接続オブジェクトの作成を意味します $dbh
echo "Connection success
";
/*検索操作を実行することもできます

foreach ($ dbh- & gt; Query ('Select * from FOO') as $ row) {
Print_r ($ row) // echo ($ global) を使用できます;
}catch(PDOException$e){
die("Error !: ".$e->getMessage()."
");
}
//デフォルトでは、これは長くない接続です。長いデータベース接続が必要な場合は、パラメータを追加する必要があります最後に: array(PDO::ATTR_PERSISTENT => true) は次のようになります:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT =>true));

? >



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

$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); //プロパティを設定します
$rs=$db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($result_arr);
?>


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

PDO::ATTR_CASE: 列名を強制的にフォーマットにします。詳細は次のとおりです (2 番目のパラメータ):
PDO::CASE_LOWER: 列名を強制しますPDO::CASE_NATURAL: 列名は元の方法に従います。 PDO::CASE_UPPER: 列名を強制的に大文字にします。
PDO::ERRMODE_SILENT: エラー メッセージを表示しません。 PDO::ERRMODE_WARNING: 警告エラーを表示します。 PDO::ERRMODE_EXCEPTION: 例外をスローします。 PDO::ATTR_ORACLE_NULLS (ORACLE だけでなく、他のデータベースにも有効): によって返される NULL 値に対応する値を php で指定します。データベース。
PDO::NULL_NATURAL: 変更されません。 PDO::NULL_EMPTY_STRING: 空の文字列は NULL に変換されます。 ::ATTR_STATEMENT_CLASS: PDOStatement から派生したユーザー指定のステートメント クラスを設定します。永続的な PDO インスタンス。 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->gt ;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";


classdbextendsPDO{
publicfunction__construct(){
::__construct("$GLOBALS[dsn]",$ GLOBALS['user'],$GLOBALS['pass']);
}catch(PDOException$e){
die("エラー: ".$e-> ;__toString()."
" );
; {
print_r($row);
}
$db->exec('DELETE FROM `xxxx_menu` where mid=43');
?>



転載元: http://www.cnblogs. com/xiaochaohuashengmi/archive/2010/08/12/1797753.html

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