PHP での PDO の概要

Jun 23, 2016 pm 02:32 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP状況調査の発表 2025 PHP状況調査の発表 Mar 03, 2025 pm 04:20 PM

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています

See all articles