ホームページ >バックエンド開発 >PHPチュートリアル >php PDOの使用法
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_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;
;
意味がわからないので、ゆっくり説明しましょう。この行:
$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
)
php
$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() と同様のオブジェクトの形式です
上記のデータ取得方法に加えて、次の方法もあります。
$rs = $db->prepare("SELECT * FROM foo");
$rs- > ;execute();
while( $row = $rs->fetch()){
print_r( $row) }
?>
$rs = $db->query("SELECT COUNT(*) ) FROM foo" );
$col = $rs->fetchColumn();
echo $col;
?>
上記の操作の簡単な要約:
クエリ操作は主に PDO::query()、PDO::exec()、PDO::prepare() です。 PDO::query() は主に、記録された結果を返す操作、特に SELECT 操作に使用されます。PDO::exec() は主に、INSERT、UPDATE、DELETE などの結果セットを返さない操作に使用されます。結果は、現在の操作によって影響を受ける列の数を返します。 PDO::prepare() は主に前処理操作です。前処理で SQL ステートメントを実行するには $rs->execute() を使用する必要があります。このメソッドはパラメータをバインドすることができ、これだけでは説明できません。マニュアルやその他のドキュメントを参照できます。
周囲の操作も 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->errorCode() != '00000'){
print_r( $db-> ;errorInfo( ));exit;
$arr = $rs->fetchAll(); $db = null; errorCode() は 00000 を返します。それ以外の場合は、いくつかのエラー コードが返されます。 errorInfo() は、PHP および MySQL のエラー コードとエラー メッセージで定義されたエラー コードを含む配列を返します。配列の構造は次のとおりです。 ; 1054
[2] => 'フィールド リスト' の不明な列 'aaa'
)
各クエリの実行後、errorCode() の結果が最新になるため、エラー メッセージを簡単に制御できます私たち自身が示します。
[簡単な概要]
上記の使用法から、PDO が確かに強力であることがわかります。パラメータのバインディング、前処理、ストアド プロシージャ、トランザクション処理など、他にも言及していない機能があります。機能。さらに、Oracle データベース自体にはさまざまなデータ拡張構造があり、詳細な学習と理解を必要とする特殊な機能が多数あります。この記事では、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 を使用します。開発者にとっては使用方法が異なります。データベース、これを変更するだけで、多くの関数を覚える必要はありません
$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)); ? >
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 で利用可能)。 .
クエリは 1 回解析 (または準備) するだけで済みますが、同じまたは異なるパラメーターを使用して複数回実行できます。クエリの準備が完了すると、データベースはクエリを実行するための計画を分析、コンパイル、最適化します。複雑なクエリの場合、このプロセスには時間がかかり、異なるパラメータを使用して同じクエリを複数回繰り返す必要がある場合、アプリケーションの速度が大幅に低下する可能性があります。準備されたステートメントを使用すると、分析/コンパイル/最適化サイクルの繰り返しを回避できます。簡単に言えば、準備されたステートメントは使用するリソースが少ないため、より高速に実行されます。 準備されたステートメントに指定されるパラメータは引用符で囲む必要はありません。これらはドライバーによって処理されます。アプリケーションが準備されたステートメントを排他的に使用する場合、SQL 侵入は発生しないことが保証されます。 (ただし、クエリの他の部分を依然として信頼できない入力に基づいている場合は、依然としてリスクが存在します)。 プリペアド ステートメントは非常に便利であるため、PDO は目標 4 で設定されたルールを実際に破っています。ドライバーがプリペアド ステートメントをサポートしていない場合、PDO はプリペアド ステートメントをエミュレートします。
声明: この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。 |