PHP は Web システムを構築するための強力なツールですが、データベースにアクセスする PHP の機能は標準化されておらず、各データベースは異なる互換性のないアプリケーション プログラミング インターフェイス (API) を使用しています。このギャップを埋めるためにADODBが登場しました。データベースにアクセスするためのインターフェースが標準化されると、さまざまなデータベース間の違いが隠蔽され、他の異なるデータベースへの切り替えが非常に簡単になります。
現在、ADODB の最新バージョンは V4.62 で、MySQL、PostgreSQL、Interbase、Informix、Oracle、MS SQL 7、Foxpro、Access、ADO、Sybase、DB2、および一般的な ODBC (このうち、PostgreSQL、Informix、および Sybase 用のドライバーは、フリー ソフトウェア コミュニティの開発によって提供されました)。
ADODB を使用する最大の利点の 1 つは、バックエンド データベースが何であっても、データベースへのアクセス方法が同じであるため、開発者と設計者は、特定のものに対して別の一連の異なるアクセス方法を学習する必要がないことです。これにより、開発者の知識の負担が大幅に軽減され、データベース プラットフォームを移行しても、プログラム コードを大幅に変更する必要がなくなります。
実際、ADODB の開発コンセプトは ADODB よりも先に登場したものではありません。DBI は、データベースにアクセスする際の一貫した API 呼び出しインターフェイスを Perl に提供します。 Perl DBI を使用したことのある友人は、再び ADODB を使用するときに親しみを感じると思います。
また、ASP を使用したことがある人には ADODB が馴染みがあり、そのような友人は ADODB を容易に受け入れることができるはずです。
Adodb 公式: http://adodb.sourceforge.net/
PHP では、最小限の労力で最も楽しく動的 Web サイトを構築できます。動的 Web サイトを構築するには、データベースを使用してログイン アカウント情報を取得する必要があります。 , 動的なニュースを公開し、ディスカッション フォーラムに記事を保存します。 あなたの会社は、利用可能な最も汎用性の高い MySQL データを使用して、あなたの Web サイトを想像以上に有名にする素晴らしい仕事をしました。その後、MySQL が実際のワークロードに対処できなくなったこともわかり、データベース システムを置き換える時期が来ました。
残念ながら、PHP でのすべてのデータベース アクセスは若干異なります。 MySQL に接続するには、mysql_connect() を使用します。Oracle または Microsoft SQL Server にアップグレードする場合は、それぞれ ocilogon() または mssql_connect() を使用する必要があります。さらに悪いことに、リンクごとに使用されるパラメータも異なるということです。
諦めないでください
プログラムの移植性を確保する必要がある場合、ADODB と呼ばれるデータベース パッケージ リンク ライブラリが登場しました。サポートされているすべてのデータベースと通信するための共通 API が提供されるため、諦める必要はありません。
ADODB は、Active Data Object DataBase の略称です (申し訳ありません! コンピューターをプレイする人は、あまり独創的ではない場合があります)。 ADODB は現在、MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC、および ADO をサポートしています。ADODB は http://php.weblogs.com/adodb からダウンロードできます。
MySQL の例
PHP で最も一般的なデータベースは MySQL なので、次のプログラム コードが気に入っていただけると思います。このプログラム コードはローカルホスト上の MySQL サーバーに接続し、データベース名は mydab で、SQL 選択コマンド クエリを実行します。 、クエリ結果が 1 つずつ出力されます。
$db = mysql_connect("localhost", "root", "パスワード");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM 従業員",$ db);
if ($result === false) die("失敗");
while ($fields = mysql_fetch_row($result)) {
for ($i=0, $max=) sizeof($fields); $i print $fields>}
}
上記のプログラム コードは、色付きのセグメントに分割されています。最初のセグメントはリンク部分であり、2 番目のセグメントは SQL コマンドを実行し、最後のセグメントは各列をスキャンします。結果と for ループで各列のフィールドをスキャンします。
次のステップでは、ADODB プログラム コードを使用して同じ結果を取得します。
include("adodb.inc.php");
$db = NewADOConnection('mysql'); db-> ;Connect("localhost", "root", "password", "mydb");
$result = $db->Execute("SELECT * FROM 従業員"); result == = false) die("failed");
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $ i < $max; $i )
$result->MoveNext(); ;
}
次に、プログラム コードの 2 行目を NewADOConnection('oracle') に変更します。
データベースに接続します
include(" adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root") , "password", "mydb");
より洗練される必要があるため、リンクされたプログラム コードは元の MySQL プログラム コードよりも洗練されています。 ADODB では、オブジェクト指向のアプローチを使用してさまざまなデータベースの複雑さを管理し、さまざまなクラスを使用してさまざまなデータベースを制御します。オブジェクト指向プログラミングが初めてでも、心配する必要はありません。すべての複雑さは NewADOConnection() 関数の背後に隠されています。
メモリを節約するために、接続しているデータベースに関連する PHP プログラム コードのみをロードします。これは、Mysql、mssql、oracle、oci8、postgres、sybase などの NewADOConnection(databasedriver) を呼び出して行います。 、vfp、access、ibase、その他多くのドライバー。
次に、NewADOConnection() を呼び出して接続クラスから新しいオブジェクト エンティティを生成し、最後に $db->Connect() を使用してデータベースに接続します。
SQL コマンドを実行します
$result = $db->Execute("SELECT * FROM 従業員");
if ($result === false) die("failed"); SQL コマンドがサーバーに送信され、Execute() が正常に実行されると、上記の $result を確認できます。
初心者にとって混乱しやすい問題は、ADODB には接続オブジェクトとレコードセット オブジェクトという 2 種類のオブジェクトがあり、これらのオブジェクトをいつ使用するかということです。
接続オブジェクト ($db) は、データベースへの接続と SQL クエリのフォーマットを担当します。レコードセット オブジェクト ($result) は、結果を取得し、応答データをテキストまたは配列に正規化する役割を果たします。
唯一付け加えておきたいのは、ADODB には、INSERT 命令と UPDATE 命令を簡単にする多くの便利な関数が用意されているということです。これについては、上級の章で説明します。
データを取得
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i print $result->fields[$i].';
$result->MoveNext();
print "
";データを取得する前述の例は、ファイルからデータを読み取る場合と非常に似ています。各行で、最初にファイルの終わり (EOF) に到達したかどうかを確認し、到達していない場合は、フィールドをループします。各列に移動してから次の行に移動し (MoveNext )、同じことを繰り返します。
$result->fields[] 配列は、PHP データベース拡張システムによって生成されます。一部のデータベース拡張システムでは、配列を名前で強制的にインデックス付けするには、$ADODB_FETCH_MODE 一般変数を使用します。 。
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute( 'select * from table');
print_r($rs1->fields); // 配列を表示します([0]=>'v0',[1] =>'v1')
print_r ($rs2->fields); // 配列を示します(['col1']=>'v0',['col2'] =>'v1')
上の例でわかるように、 2 各レコードセットは保存され、Execute() によってレコードセットが生成された後に $ADODB_FETCH_MODE が設定されます。
ADOConnection
データベースに接続し、SQL コマンドを実行するオブジェクト。また、相関コマンドや日付形式コマンドなど、SQL コマンドを標準形式にする一連のツール関数を備えています。
その他の便利な関数
$recordset->Move($pos) は、データベース全体の前方スクロールをサポートしていますが、これは当てはまりません。一時レコードをキャッシュに使用することで逆スクロールをシミュレートできるため、問題はありません。
$recordset->RecordCount() は、SQL コマンドによってアクセスされたレコードの数を返します。一部のデータベースは、それをサポートしていないため、-1 を返します。
$recordset->GetArray() は結果を配列の形式で返します。
rs2html($recordset) 関数は、渡されたレコードセットを HTML テーブル形式に変換します。関連する使用法は次の例で太字で示されています。
include('adodb.inc.php');
include('tohtml.inc.php'); /* rs2html 関数が含まれます */
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->実行( 'select * from table');
rs2html($rs); /* HTML テーブルへのレコードセット */
ファイルには他にも多くの便利な関数がリストされており、次の URL で見つけることができます。 : //php.weblogs.com/adodb_manual
高度なテーマ
追加と更新
次のデータをデータベースに追加するとします。
ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 2001 年 8 月 31 日 */
Note= Sugar なぜ中止しないのですか
いつ別のデータベースに切り替えると、新しいデータを追加できなくなる可能性があります。
最初の問題は、各データベースのデフォルトの日付形式が YYYY-MM-DD 形式であるのに対し、ADODB は異なるデータベース間で変換するための DBDate() 関数を提供していることです。間の日付の形式。
次の問題は、一重引用符の表現です (使用しないでください)。MySQL では一重引用符を直接使用できますが、Sybase、Access、Microsoft SQL Server などの他のデータベースでは、単一引用符を 2 つ使用できます。引用符が使用されていることを示します (使用しない)。qstr() 関数がこの問題を解決できます。
これらの機能はどのように使用するのですか?次のように:
$sql = "INSERT INTO table (id, thedate,note) names ("
. $ID . ','
. $db->DBDate($TheDate) . ' ,'
. $db->qstr($Note).")";
$db->Execute($sql);
ADODB には $connection->Affected_Rows( ) 関数は、最後の更新または削除コマンドによって影響を受けたデータ列の数を返します。$recordset->Insert_ID() 関数は、最後の挿入コマンドによって自動的に生成されたデータ列の数を返します。データベースはこの 2 つの機能を提供します。
MetaTypes
レコードセット メソッド FetchField($fieldoffset) を通じてオブジェクトの 3 つの属性 (name、type、max_length) を返すことで、フィールドに関する詳細情報を取得できます。
例:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0); >name の内容は「adata」、$f0->type は「date」になります。max_length が不明な場合、その内容は -1 になります。
異なるデータベースを扱う場合の問題の 1 つは、各データベースが同じデータ型に対して異なる名前を持っていることです。たとえば、タイムスタンプ型は、あるデータベースでは datetime と呼ばれ、別のデータベースでは time と呼ばれるため、ADODB は MetaType($type, $max_length) 関数を使用して、次のデータ型を標準化します:
C: 文字型および varchar 型
X: テキストまたは長い文字 (例: 幅 255 バイトを超える)
B: blob またはバイナリ イメージ
D: 日付
T: タイムスタンプ
L: 論理値 (ブール値)
I: 整数
N: 数値 (float、double、money)
が前 この例では、
$recordset = $conn->Execute("テーブルから日付を選択");
$f0 = $recordset->FetchField(0);
$type = $recordset-> ;MetaType($f0- >type, $f0->max_length);
print $type; /* 'D' を出力する必要があります */
Select コマンドの制限と上位のサポート
ADODB には $connection->SelectLimit があります($sql,$nrows,$offset) 関数を使用すると、Microsoft 製品の SELECT TOP の使用法と、PostgreSQL および MySQL の SELECT...LIMIT の使用法に基づいて、レコードセットの部分的なコレクションを取得できます。元のデータベースではこの使用法が提供されていないため、この関数もこの使用法を提供することをシミュレートします。
キャッシュ サポート
ADODB を使用すると、レコードセット データをファイル システムに一時的に保存し、$connection->CacheExecute($secs2cache,$sql) および $connection->CacheSelectLimit($secs2cache) で次の関数を実行できます。 、$sql、$nrows、$offset) などの設定された時間間隔に達すると、時間を節約するために実際にデータベースにクエリを実行します。
PHP4 セッションのサポート
ADODB は、PHP4 セッション ハンドラーもサポートしています。関連する機能については、http://php.weblogs.com/adodb-sessions を参照してください。
お勧めします。商用利用
販売用の商用 PHP アプリケーション ソフトウェアを作成する予定がある場合は、ADODB を GPL に基づいて公開しています。つまり、商用アプリケーション ソフトウェアで ADODB を合法的に引用し、プログラム コードの所有権を保持することができます。 ADODB の商用利用は強く推奨されており、このため社内で ADODB を使用しています。