PDO (PHP Data Object) は PHP 5 の新しい機能です。PHP 6 がリリースされようとしているとき、PHP 6 はデフォルトでデータベースの処理に PDO のみを使用し、すべてのデータベース拡張機能を PECL に移動するため、デフォルトは使用されなくなります。 . php_mysql.dll など、時代に合わせるしかないので、PDO を試してみました。 (この記事は単なる入門レベルです。専門家は読み飛ばしていただいても大丈夫です、笑)
[PDO とは]
PDO は、PHP 5 に追加された主要な新機能です。PHP 5 より前では、php4/php3 にはそれぞれのデータベース拡張機能と通信するための多数のデータベース拡張機能があったからです。データベースの接続と処理、php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll、および MySQL、PostgreSQL、MS SQL Server、SQLite に接続するためのその他の拡張機能、同様に、ADOdb、PEAR::DB、PHPlib を使用する必要があります。結局のところ、DB などのデータベース抽象クラスは非常に面倒で非効率的ですが、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 の下で見つけます。
;;;;;;;;;;;;;;;;;;;;;;;;
; 動的拡張機能
;;;;;;;;;;;;;;;;;;;;;;
以下に、;extension=php_mbstring.dll に似たものがたくさんあります。
PDO 拡張子:extension=php_pdo.dll
を最後に追加します。
拡張子=php_pdo_mysql.dll
拡張子=php_pdo_pgsql.dll
拡張子=php_pdo_sqlite.dll
拡張子=php_pdo_mssql.dll
拡張子=php_pdo_odbc.dll
拡張子=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll
さまざまな PDO ドライバを追加できますが、次の php_pdo_oci8.dll は、Oralce データベースをインストールしていないため、これがありませんので、セミコロンを使用してコメントアウトしています。次に、Web サーバー、IIS/Apache を再起動します。私の場合は IIS です。おい、あなたは私を見下しています。Windows では簡単です。
再起動後、Web サーバーのドキュメント ディレクトリに phpinfo.php ファイルを書き込み、次の内容を追加します
。
phpinfo();
?>
次に、素敵なブラウザ IE/FireFox を開きます。私のブラウザは FireFox 2.0 です。ダウンロードしたばかりです。素晴らしいです。不正なソフトウェアは怖くないです (笑)。
ブラウザにhttp://localhost/phpinfo.phpと入力します。このページへのパスが一致しない場合は、自分で入力してください。
出力内容が正常に表示されている場合:
PDO
PDO サポートが有効になっている
PDO ドライバー 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 ファイルを作成しました:
<?php
$dsn = "mysql:host=localhost;dbname=test";
$db = 新しい PDO($dsn, 'root', '');
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
エコー $count;
$db = null;
?>
意味が分かりません、ゆっくり説明しましょう。
$dsn = "mysql:host=localhost;dbname=test";
という行は
、DSN (データ ソース) を構築するためのものです。データベース タイプは mysql、ホスト アドレスは localhost、データベース名です。ほんの一部の情報です。データベースごとにデータソースの構築方法が異なります。
$db = new PDO($dsn, 'root', '');
PDO オブジェクトを初期化します。コンストラクターの最初のパラメーターはデータ ソース、2 番目のパラメーターはデータベース サーバーに接続するユーザー、3 番目のパラメーターはパスワードです。 。接続が成功することは保証できません。例外については後で説明します。ここでは接続が成功したと仮定します。
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='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));
これは非常に単純な操作です。前のものとは異なりますが、ADOdb に多少似ています。
[学習を続ける]
データを抽出したい場合は、データ取得機能を使用する必要があります。 (以下で使用される $db は、上で接続されているすべてのオブジェクトです)
<?php
foreach($db->query("SELECT * FROM foo")){
print_r($row);
}
?>
次の取得方法も使用できます:
<?php
$rs = $db->query("SELECT * FROM foo");
while($row = $rs->fetch()){
print_r($row);
}
?>
すべてのデータを配列に一度に取得したい場合は、次のようにすることができます:
<?php
$rs = $db->query("SELECT * FROM foo");
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>
配列
([0] => 配列(
[id] => 1
[0] => 1
[名前] => ヘイエルレン
[1] =>ヘイエルレン
[性別] =>男性[2] =>男性[時間] =>2006-10-28 23:14:23
[3] => 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();
print_r($result_arr);
?>
上記のコードを見てください。setAttribute() メソッドはいくつかの属性を設定するためのものです。主な属性は、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 を使用します。具体的に何を使用するかは、必要に応じて異なります。その他の取得タイプのリファレンス マニュアルを参照してください。
データを取得するには上記の方法以外に、次のような方法もあります:
<?php
$rs = $db->prepare("SELECT * FROM foo");
$rs->execute();
while($row = $rs->fetch()){
print_r($row);
}
?>
実はほぼ同じなんです。指定したレコードのフィールドの結果を取得したい場合は、PDOStatement::fetchColumn():
<?php
を使用できます。
$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
エコー $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. オブジェクト指向のアプローチ
まず、接続エラーなどに対処する方法を見て、それを処理するためにオブジェクト指向のアプローチを使用します
。
試す {
$db = 新しい PDO('mysql:host=localhost;dbname=test', $user, $pass);
$db = null;
} キャッチ (PDOException $e) {
print "エラー: " . $e->getMessage() "<br/>";
死ぬ();
}
?>
ここでは、PHP 5 のオブジェクト指向例外処理機能を使用します。例外が発生した場合は、PDOException を呼び出して例外クラスを初期化することで、例外を初期化します。
PDOException例外クラスの属性構造:
<?php
クラス PDOException は例外を拡張します
{
public $errorInfo = null; // エラー情報については、PDO::errorInfo() または PDOStatement::errorInfo() を呼び出して protected $message にアクセスできます。 // 例外情報については、Exception::getMessage() を試してください。 access protected $code ; // SQL ステータス エラー コード。Exception::getCode() を使用してアクセスできます。
}
?>
この例外処理クラスは、PHP 5 の組み込み例外処理クラスと統合されています。PHP 5 の組み込み例外処理クラスの構造を簡単に見てみましょう
。
クラス例外
{
// プロパティ protected $message = '不明な例外'; // 例外メッセージ protected $code = 0; // 例外が発生したファイル名 protected $line;例外が発生した場所 行番号
// メソッドfinal function getMessage(); // 例外情報を返すfinal function getCode() // 例外が発生したファイル名を返すfinal function getLine; (); // 例外が発生したコード行番号を返します。 Final function getTrace() // backtrace() 配列 Final function getTraceAsString(); // getTrace() 情報を文字列に変換します。
}
?>
同様に、コード内で getFile() と getLine() を適切に呼び出してエラーを特定し、デバッグをより便利にすることができます。
2. プロセス指向のアプローチを使用して、
最初にコードを確認します
。
$db = 新しい 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());
出口;
}
$arr = $rs->fetchAll();
print_r($arr);
$db = null;
?>
PDO オブジェクトと PDOStatement オブジェクトには errorCode() メソッドと errorInfo() メソッドがあります。エラーがない場合、errorCode() は 00000 を返します。それ以外の場合は、いくつかのエラー コードが返されます。 errorInfo() は、PHP および MySQL のエラー コードとエラー情報で定義されたエラー コードを含む配列を返します。配列の構造は次のとおりです
。
(
[0] => 42S22
[1] => 1054
[2] => 「フィールドリスト」に不明な列「aaa」があります
)
各クエリの実行後、errorCode() の結果が最新になるため、エラー メッセージの表示を自分で簡単に制御できます。
[簡単なまとめ]
上記の使用法から、PDO が確かに強力であることがわかります。また、パラメータのバインド、前処理、ストアド プロシージャ、トランザクション処理など、他にも言及していない機能がいくつかあります。さらに、Oracle データベース自体にはさまざまなデータ拡張構造があり、詳細な学習と理解を必要とする特殊な機能が多数あります。この記事では、PDO の簡単な理解としていくつかの入門知識について簡単に説明します。