ホームページ > php教程 > php手册 > PHP の ADOdb クラス ライブラリ入門 (2)

PHP の ADOdb クラス ライブラリ入門 (2)

WBOY
リリース: 2016-06-21 09:08:56
オリジナル
980 人が閲覧しました

アド

クエリのキャッシュ

先月、ADOdb で SELECT、INSERT、UPDATE 操作を実行する方法を簡単に学びました。 ADOdb を初めて使用する場合は、まず先月の記事を読むことをお勧めします。 ADOdb にはさらに多くの高度な機能があり、今月はその一部を見ていきます。

データベースはアプリケーションの非効率性の原因となることがよくあります。データベースへのクエリを最小限に抑えることは、実行効率を向上させる方法の 1 つです。これは通常、ページ全体をキャッシュすることによって実行できます (これを実現する方法は多数あります。たとえば、PEAR->キャッシュ)。または、動的ページを作成する必要があり、クエリ命令のみをキャッシュしたい場合は、次のようにします。 ADOdb を使用してクエリ命令を単純にキャッシュできます。キャッシュによってアプリケーションのパフォーマンスの低下を改善しようとする前に、まずクエリ命令の最適化を試みることをお勧めします。場合によっては、いくつかの単純なインデックスがすべてを変える可能性があります。貧弱なインデックスを使用する、いわゆるプロフェッショナルなソリューションが多すぎます。この記事では、そのような例をたくさん見つけることができます。ここで、ADOdb を使用してデータベース クエリ結果をキャッシュする方法を見てみましょう。この例では、ADOdb は最後のクエリの結果をキャッシュ ファイル /var/tmp/adodb_cache に保存し、10 分間保持します。

include("$adodb_path/db_values.inc.php");
include("$adodb_path/adodb.inc.php");
$db = NewADOConnection('$database_type');
$db->接続("$host", "$user", "$password", "employees");

$ADODB_CACHE_DIR = "/var/tmp/adodb_cache" //キャッシュされたファイルを保存するディレクトリ

$sql = "姓を選択, age FROM 従業員";
$rs = &$db->CacheExecute(600,$sql); // 実行し、結果を 600 秒間キャッシュします
if (!$rs) {
print $db-> ErrorMsg(); // 結果が返されなかった場合にエラー メッセージを表示します
}
else {
while (!$rs->EOF) {
print $rs->fields[0].' ->fields[1].'
';
// field[0] は姓、fields[1] は年齢です
$rs->MoveNext() // 次の行に移動します
} // end while
} // end else


CacheExecute() 関数には 2 つのパラメーターがあります。最初のパラメーターはキャッシュ ファイルが保持される時間 (秒)、2 番目のパラメーターは SQL ステートメントです。 最初のパラメータはオプションであり (開発者によっては 2 番目のパラメータであるべきだと考える人もいるかもしれません)、時間を制限しない場合、デフォルト値は 3600 秒、つまり 1 時間になります。キャッシュ ファイルの名前は adodb_*.cache で、ファイル システムから安全に削除できます。期限切れのキャッシュ ファイルは定期的にクリアする必要があります (UNIX では「crontab 永久カレンダー」を使用し、WINDOWS では「スケジュールされたタスク」を使用します。) 翻訳者注: 永久カレンダーに変換エラーがあるかどうかはわかりません。UNIX を持っていないからです。 )。キャッシュ方法を使用するには、PHP パラメータ magic_quotes_runtime を off に設定する必要があることに注意してください (翻訳者注: php.ini では、値を 0 に設定します)。必要に応じて実行時にその値を変更できます:
set_magic_quotes_runtime(0);
データベースを呼び出す命令の前に上記のコードを置くだけです。 CacheFlush(); を呼び出すことで、いつでもキャッシュをクリアできます。セキュリティ上の理由から、ADOdb は PHP パラメータ register_globals を 0 に設定することも推奨します (これは、PHP の最新バージョンのデフォルト値です)。


クエリ結果の詳細情報

開発者は、取得したい結果について疑問を抱くことがよくあります。最も一般的な質問は、「レコードはいくつあるのか?」というものです。 ADOdb は、RecordCount() を通じてこの質問に簡単に答えることができます。 RowCount() は同義の関数です。

$sql = "従​​業員から姓、年齢を選択";
$rs = &$db->CacheExecute(600,$sql); // 実行し、結果を 600 秒間キャッシュします
print $rs-> RecordCount() . " rows selected]"; // 返された行数を表示します


おそらく、要求リストで 2 番目の質問が生じるでしょう: 返されるフィールドの数は何ですか?心配しないでください。ADOdb には FieldCount() があります。

$sql = "従​​業員から姓、年齢を選択";
$rs = &$db->CacheExecute(600,$sql); // 実行し、結果を 600 秒間キャッシュします
print $rs-> FieldCount() . " 返された列数] " // 返された行数を表示します



結果を制限します

前回は、データベース ライブラリ関数を使用してアプリケーションをよりシンプルにし、移植性を高める方法について説明しました。 MySQL から Informix に移行するとき、私は骨の折れる移行プロセスを経験しました。すべては非 ANSII 標準 LIMIT 句に帰着します (たとえば、次の命令は MySQL で許可されています: SELECT name FROM 従業員 LIMIT 15)。これは非常に便利な機能ですが、Informix ではサポートされていません。 (Informix では、同じ関数を次のように記述する必要があります: Informix では、SELECT FIRST 15 name FROM 従業員。) これは、クエリでの非標準 SQL 命令の使用をやめて真剣に取り組むよう求める、あなたへの警鐘のようです。標準 SQL を学習します。幸いなことに、ADOdb には LIMIT を処理するためのメソッド SelectLimit() があります。

$sql = "従​​業員から姓、年齢を選択";
$rs = &$db->SelectLimit($sql, 10, 100) // 行 100 から始まる 10 行を選択します
if (!$rs ) {
print $db->ErrorMsg(); // 結果が返されなかった場合はエラー メッセージを表示します
}
else {
while (!$rs->EOF) {
print $rs->fields [0].' '.$rs->fields[1].'
'
// field[0] は姓、fields[1] は年齢です
$rs->MoveNext(); // 次の行に移動します
} // end while
} // end else


SelectLimit() は最初のパラメータとして SQL ステートメントを受け取り、2 番目は返される列の数、最後のパラメータはオフセットです(最初の行が返されます)。これは、MySQL ディレクティブの LIMIT 句の引数の順序が逆であることに注意してください。 SelectLimit() は、ページ上に検索結果を部分的に表示する場合に非常に便利です。すべての結果は、「前へ」ボタンと「次へ」ボタンで参照できます。

PHP を使用してデータベースからすべてのクエリ結果をフィルターするコードを何度も見たことがあります。これは、ナイフで鶏を殺すようなものです。この種の結果を保存するには、CacheSelectLimit() 関数を使用できます。


トランザクションの処理

トランザクションの処理は、多くのアプリケーションの重要な機能です。 (まず、トランザクション処理とは、多数のクエリ操作を送信できるプロセスであり、これらのクエリがすべて成功するか一部が失敗するかを考慮する必要があります。
典型的な例は銀行処理です。お金はあなたの口座から送金されます。送金してから他の人の口座に送金する場合、いずれかが失敗した場合、プロセス全体が失敗したと見なされます。そうでない場合、送金は行われませんでした。 、理由もなくチップが相手のアカウントに追加されました)

トランザクションはコードレベルで管理および制御できます。 定期的なエラー チェックは、COMMIT (トランザクションのすべての項目が正しく、正しく実行され、トランザクションを終了する) か ROLLBACK (トランザクションにエラーがあり、すべての変更を元のステータスに復元する必要がある) するかを決定するために使用されます。 ADOdb には、処理操作を正しく動作させるための便利な関数がいくつかあります。次の例では、ある従業員の残高に 10 を加算し、別の従業員の残高から 10 を減算します。プロセス全体には、完全なトランザクションとして 2 つのクエリがあります。

$sql1 = "従​​業員を更新 SET Balance=balance-10 WHERE id=15";
$sql2 = "従​​業員を更新 SET Balance=balance+10 WHERE id=22";
$db->StartTrans();
$db->Execute($sql);
$db->Execute($sql2);
$db->CompleteTrans();



古いコードを参照すると、これらすべてを達成する方法。 BeginTrans()、CommitTrans()、および RollbackTrans() 関数を使用する場合は、エラーを自分で処理する必要があります。 StartTrans() と CompleteTrans() はエラーを自動的に処理し、COMMIT または ROLLBACK を適切に処理します。必要に応じて、FailTrans() を介して ROLLBACK を強制できます。

もちろん、処理が失敗したか成功したかを知る必要があるかもしれません。 ADOdb は、この関数を実装するための HasFailedTrans() を提供します。 エラーが発生した場合 (またはこの場合は FailTrans() を呼び出すことができます)、成功した場合は TRUE が返され、成功した場合は FALSE が返されます。

$sql1 = "従​​業員を更新 SET Balance=balance-10 WHERE id=15";
$sql2 = "従​​業員を更新 SET Balance=balance+10 WHERE id=22";
$db->StartTrans();
$db->Execute($sql);
$db->Execute($sql2);
$db->CompleteTrans();
if ($db->HasFailedTrans()) {
// 何か問題がありました
}


データベースがこれらのトランザクション関数をサポートする必要があることに注意してください。 (ほとんどのデータベースはサポートされていますが、MySQL InnoDB テーブルはサポートされていますが、MySQL MyISAM テーブルはサポートされていません。)

これまで私が行ってきたことで、データベース ライブラリ関数に大きな興味を持っていただければ幸いです。データベース テーブルから HTML を自動的に生成するために使用できる興味深い関数も多数あり、同じ結果を達成するさまざまな方法があります。完全なマニュアルはここで見つけることができます。
頑張ってください!
2003.07.31

元のアドレス: http://www.databasejournal.com/features/php/article.php/2234861




関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート