ホームページ  >  記事  >  php教程  >  php pdo:php pdoの勉強ノート

php pdo:php pdoの勉強ノート

WBOY
WBOYオリジナル
2016-06-21 08:51:401400ブラウズ

■pdoとは? pod (php データ オブジェクト) 拡張機能は 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 データベース 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 を変更する必要があることをまず明確にしてください。) 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;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll 各拡張子に対応 データベース

どのデータベースを使用するかは、対応する展開の前にあるコメント記号「;」を削除するだけです。 driver name supported databases
pdo_dblib freetds / microsoft sql server / sybase
pdo_firebird firebird/interbase 6
pdo_informix ibm informix dynamic server
pdo_mysql mysql 3.x/4.x
pdo_oci oracle call interface
pdo_odbc odbc v3 (ibm db2, unixodbc and win32 odbc)
pdo_pgsql postgresql
pdo_sqlite sqlite 3 and sqlite 2
■pdo を使用します
ここでは、mysql がインストールされていることを前提としています。そうでない場合は、まずインストールする方法を見つけてください。私の場合は mysql5.0.22 を使用しており、暗い夜に通りかかる人は mysql 4.0.26 を使用しています。 。 ★データベース接続:
次の例を使用して、データベースへの PDO 接続を分析します。
$dbms='mysql'; //データベース タイプ oracle は odi を使用します。開発者が別のデータベースを使用する場合、これを変更するだけでよく、それほど多くのことを覚える必要はありません。 function
$dbms='mysql'; //数据库类型 oracle 用odi,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
$host='localhost'; //数据库主机名
$dbname='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbname";
//
try {
$dbh = new pdo($dsn, $user, $pass); //初始化一个pdo对象,就是创建了数据库连接对象$dbh
echo "连接成功
";
/*你还可以进行一次搜索操作
foreach ($dbh->query('select * from foo') as $row) {
print_r($row); //你可以用 echo($global); 来看到这些值
}
*/
$dbh = null;
} catch (pdoexception $e) {
die ("error!: " . $e->getmessage() . "
");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(pdo::attr_persistent => true) 变成这样:
$db = new pdo($dsn, $user, $pass, array(pdo::attr_persistent => true));
?>
$host='localhost'; //データベースホスト名$dbname='test'; //使用するデータベース$user='root'; //データベース接続ユーザー名 = ''; // 対応するパスワード$dsn="$dbms:host=$host;dbname=$dbname";//try {$dbh = new pdo($dsn , $user, $pass); //pdo オブジェクトの初期化とは、データベース接続オブジェクトの作成を意味します $dbhecho "Connection success
";<🎜>/*検索操作を実行することもできます <🎜 > foreach ($dbh->query('select * from foo') as $row) {<🎜>print_r($row) //これらの値を確認するには echo($global); <🎜> */<🎜>$dbh = null;<🎜>} catch (pdoException $e) {<🎜>die ("error!: " . $e->getmessage() . "< br/> ;");<🎜>}<🎜>//デフォルトでは、これは長い接続ではありません。データベースへの長い接続が必要な場合は、最後にパラメータを追加する必要があります: array(pdo::attr_persistent = > true) 次のようになります: $db = new pdo($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);
?>
$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::attr_errmode: エラー プロンプト。
pdo::errmode_silent: エラー情報は表示されず、エラー コードのみが表示されます。

pdo::errmode_warning: 警告エラーを表示します。

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: フェッチに bool が必要な場合、数値を文字列に変換します。

pdo::attr_statement_class: pdostatement から派生したユーザー指定のステートメント クラスを設定するには、array(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 -- 連想配列形式
$db->exec("delete from `xxxx_menu` where mid=43");
pdo::fetch_num -- 数値インデックス配列形式 pdo::fetch_both -- 両方の配列形式が使用可能ですが、どちらかが欠落しています保存されたpdo::fetch_obj -- 前の mysql_fetch_object() と同様のオブジェクトの形式で戻り値の型宣言 (pdostatement::メソッド名) の詳細については、マニュアルを参照してください。 ★データの挿入、更新、削除、 テーブル>
上記の操作の簡単な要約:
クエリ操作は主に、pdo::query()、pdo::exec()、および pdo::prepare() です。
pdo::query() は、主に記録された結果を返す操作、特に選択操作に使用されます。
pdo::exec() は、主に挿入、更新などの結果セットを返さない操作に使用されます。 、削除 他の操作の場合、返される結果は、現在の操作の影響を受ける列の数です。
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() の削除、挿入、および更新操作の影響を受ける結果セットに使用され、pdo::exec( ) メソッドと選択操作。
★トランザクションと自動コミット
この時点で、pdo を介して mysql に接続しました。クエリを発行する前に、pdo がトランザクションをどのように管理するかを理解する必要があります。これまでトランザクションに触れたことがない場合は、まずトランザクションの 4 つの特性、つまりアトミック性、一貫性、分離性、耐久性、つまり Acid を理解する必要があります。平たく言えば、トランザクション内で実行されるすべての作業は、それが段階的に実行される場合でも、作業がデータベースに安全に適用され、作業の送信中に他の接続からのリクエストの影響を受けないことが保証されます。 。 影響。トランザクション作業はリクエストに応じて (まだコミットしていない場合) 自動的に取り消すことができるため、スクリプトでのエラー処理がはるかに簡単になります。
トランザクションは通常、変更のバッチを蓄積し、同時に有効にすることによって実装されます。この利点は、これらの更新の効率を大幅に向上できることです。言い換えれば、トランザクションによってスクリプトが高速化され、潜在的により堅牢になる可能性があります (ただし、そのような利点を得るにはトランザクションを正しく使用する必要があります)。
残念ながら、すべてのデータベースがトランザクションをサポートしているわけではありません (mysql5 はトランザクションをサポートしていますが、mysql4 はわかりません)。そのため、初めて接続を開いたとき、pdo はいわゆる「自動コミット」モードで実行する必要があります。下に。オートコミット モードは、データベースがトランザクションをサポートしている場合は、実行するすべてのクエリに独自の暗黙的なトランザクションがあり、データベースがトランザクションをサポートしていない場合は、すべてのクエリにそのようなトランザクションが存在しないことを意味します。トランザクションが必要な場合は、 pdo::begintransaction() メソッドを使用してトランザクションを開始する必要があります。基礎となるドライバーがトランザクションをサポートしていない場合、pdoException がスローされます (エラー処理設定に関係なく、これは常に致命的なエラー状態です)。トランザクション内で実行中のコードが成功したかどうかに応じて、トランザクション内で pdo::commit() または pdo::rollback() を使用してトランザクションを終了できます。
スクリプトが終了するとき、または接続が閉じられようとするときに、未処理のトランザクションがある場合、PDO は自動的にトランザクションをロールバックします。これは、スクリプトが異常終了した場合に不整合を回避するための安全対策です。トランザクションが明示的にコミットされていない場合は、どこかで不整合が発生すると想定されるため、データのセキュリティを維持するためにロールバックが実行されます。
$db->e​​xec("mid=43 の `xxxx_menu` から削除");
テーブル>上の例では、ID 番号 23 を持つ新入社員用の一連のエントリを作成するとします。個人の基本データを入力することに加えて、従業員の給与も記録する必要があります。両方の更新を個別に実行するのは簡単ですが、両方の更新を begintransaction() 呼び出しと commit() 呼び出しに含めることで、完了するまで他の人が変更を確認できないようにすることができます。エラーが発生した場合、catch ブロックはトランザクションの開始以降に発生したすべての変更をロールバックし、エラー メッセージを出力します。
トランザクション内で更新を行う必要はありません。複雑なクエリを発行してデータを抽出し、その情報を使用してさらなる更新とクエリを構築することもできます。トランザクションがアクティブな場合、作業の進行中に他のユーザーが変更を加えることができないことが保証されます。実際、これは 100% 正しいわけではありませんが、これまでトランザクションについて聞いたことがない場合には、良い入門書となります。
★プリペアド ステートメントとストアド プロシージャ
さらに多くの成熟したデータベースが、プリペアド ステートメントの概念をサポートしています。準備済みステートメントとは何ですか?プリペアド ステートメントは、実行する SQL のコンパイル済みテンプレートと考えることができ、変数パラメーターを使用してカスタマイズできます。準備済みステートメントには 2 つの大きな利点があります:
クエリは 1 回だけ解析 (または準備) する必要がありますが、同じパラメーターまたは異なるパラメーターを使用して複数回実行できます。クエリの準備が完了すると、データベースはクエリを実行するための計画を分析、コンパイル、最適化します。複雑なクエリの場合、このプロセスには時間がかかり、異なるパラメータを使用して同じクエリを複数回繰り返す必要がある場合、アプリケーションの速度が大幅に低下する可能性があります。準備されたステートメントを使用すると、分析/コンパイル/最適化サイクルの繰り返しを回避できます。簡単に言えば、準備されたステートメントは使用するリソースが少ないため、より高速に実行されます。
準備されたステートメントに提供されるパラメーターは引用符で囲む必要はありません。ドライバーがこれらを処理します。アプリケーションが準備されたステートメントを排他的に使用する場合、SQL 侵入は発生しないことが保証されます。 (ただし、クエリの他の部分が信頼できない入力に基づいている場合は、依然としてリスクが存在します)。
プリペアド ステートメントは非常に便利なので、pdo は実際に目標 4 で設定されたルールを破ります。ドライバーがプリペアド ステートメントをサポートしていない場合、pdo はプリペアド ステートメントをエミュレートします。
例: PDO のアプリケーション例:
//http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html からの例
//例子来自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("insert into staff (id, first, last) values (23, 'joe', 'bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, now())");
$dbh->commit();
} catch (exception $e) {
$dbh->rollback();
echo "failed: " . $e->getmessage();
}
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, first, last) の値に挿入 (23, 'joe', 'bloggs')"); $ dbh->exec("salalchange (id, amount, changedate) に挿入 値 (23, 50000, now())"); $dbh->commit();} catch (例外 $e) { $dbh->rollback(); echo "失敗しました: " . $e->getmessage();}
$dbms='mysql'; //数据库类型 oracle 用odi,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
$host='localhost'; //数据库主机名
$dbname='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbname";
class db extends pdo {
public function __construct(){
try {
parent::__construct("$globals[dsn]", $globals['user'], $globals['pass']);
} catch (pdoexception $e) {
die("error: " . $e->__tostring() . "
");
}
}
public final function query($sql){
try {
return parent::query($this->setstring($sql));
}catch (pdoexception $e){
die("error: " . $e->__tostring() . "
");
}
}
private final function setstring($sql){
echo "我要处理一下$sql";
return $sql;
}
}
$db=new db();
$db->setattribute(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');
?>
$dbms='mysql'; //データベース タイプ oracle は odi を使用します。別のデータベースを使用する開発者は、これを変更するだけで、多くの関数を覚える必要はありません。$host ='localhost'; //データベースホスト名$dbname='test'; //使用するデータベース$user='root' //データベース接続ユーザー名$pass= '';対応するパスワード$dsn="$dbms:host=$host;dbname=$dbname"; class db extends pdo {public function __construct(){try {parent: :__construct("$globals[dsn]", $globals['user'], $globals['pass']); } catch (pdoException $e) { die( "error: " . $ e->__tostring() . "
");}}public Final function query($sql){try {returnparent:: query($this->setstring($sql));}catch (pdoException $e){die("error: " . $e->__tostring() . "
setattribute(pdo::attr_case, pdo::case_upper);foreach ($db->query('select * from xxxx_menu') as $row) {print_r($row);}$db->e​​xec('delete from `xxxx_menu` wheremid=43'); テーブル>
4.php マニュアル
★ この時点で、pdo を介して mysql に接続しました。クエリを発行する前に、pdo がトランザクションをどのように管理するかを理解する必要があります。これまでトランザクションに触れたことがない場合は、まずトランザクションの 4 つの特性、つまりアトミック性、一貫性、分離性、耐久性、つまり Acid を理解する必要があります。平たく言えば、トランザクション内で実行されるすべての作業は、それが段階的に実行される場合でも、作業がデータベースに安全に適用され、作業の送信中に他の接続からのリクエストの影響を受けないことが保証されます。 。 影響。トランザクション作業はリクエストに応じて (まだコミットしていない場合) 自動的に取り消すことができるため、スクリプトでのエラー処理がはるかに簡単になります。 トランザクションは通常、変更のバッチを蓄積し、それらを同時に有効にすることによって実装されます。この利点は、これらの更新の効率を大幅に向上できることです。言い換えれば、トランザクションによってスクリプトが高速化され、潜在的により堅牢になる可能性があります (ただし、そのような利点を得るにはトランザクションを正しく使用する必要があります)。 残念ながら、すべてのデータベースがトランザクションをサポートしているわけではありません (mysql5 はトランザクションをサポートしていますが、mysql4 は知りません)。そのため、最初に接続が開かれたときに、pdo をいわゆる「自動コミット」モードで実行する必要があります。オートコミット モードは、データベースがトランザクションをサポートしている場合は、実行するすべてのクエリに独自の暗黙的なトランザクションがあり、データベースがトランザクションをサポートしていない場合は、すべてのクエリにそのようなトランザクションが存在しないことを意味します。トランザクションが必要な場合は、 pdo::begintransaction() メソッドを使用してトランザクションを開始する必要があります。基礎となるドライバーがトランザクションをサポートしていない場合、pdoException がスローされます (エラー処理設定に関係なく、これは常に致命的なエラー状態です)。トランザクション内で実行中のコードが成功したかどうかに応じて、トランザクション内で pdo::commit() または pdo::rollback() を使用してトランザクションを終了できます。 スクリプトが終了するとき、または接続が閉じられようとするときに、未処理のトランザクションがある場合、pdo はトランザクションを自動的にロールバックします。これは、スクリプトが異常終了した場合に不整合を回避するための安全対策です。トランザクションが明示的にコミットされていない場合は、どこかで不整合が発生すると想定されるため、データのセキュリティを維持するためにロールバックが実行されます。 この記事へのリンク http://www.cxybl.com/html/wlbc/Php/20120531/27131.html



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