ホームページ >php教程 >php手册 >PEAR: 中間データベース アプリケーション レイヤ 2 の作成

PEAR: 中間データベース アプリケーション レイヤ 2 の作成

WBOY
WBOYオリジナル
2016-06-21 09:09:16823ブラウズ

作成|データ|データベース

function errorMessage($dbcode)
DB エラー テキスト メッセージを返します。

function &raiseError($code = DB_ERROR, $mode = false, $level = false,$debuginfo = false, $nativecode = false)
エラーをスローします。この関数はDBから呼び出されます。

function setFetchMode($fetchmode)
デフォルトのフェッチモードを設定します。

fetchmod には以下のタイプがあります:
DB_FETCHMODE_DEFAULT: デフォルトモードを使用します。
DB_FETCHMODE_ORDERED: 各レコードのデータ列は、0 から始まる数値インデックスを使用します。
DB_FETCHMODE_ASSOC: 各レコードのデータ列は、フィールド名インデックスを使用します。クエリ内のフィールド名は一貫しています
DB_FETCHMODE_FLIPPED: 結果セットが複数のレコードと複数のフィールドを含む多次元の場合、通常、最初の次元はレコード番号であり、どのレコードであるかを示します。フィールド名または数値インデックスとして 2 次元配列が使用されます。 DB_FETCHMODE_FLIPPED はこの順序を交換します。つまり、最初の層はフィールド名、2 番目の次元はレコード番号です。

function setOption($option, $value)
バックエンド データベース オプションを設定します。 $options と $value は、それぞれオプション名と対応する値です。

通常、この関数はDB_Commonとそのサブクラスの構築関数内で呼び出されます。

function getOption($option)
オプションの値を取得する

function prepare($query)
execute() のクエリをコンパイルする準備をします。一部のバックエンド データベースでは、これはエミュレーションによって実現されます。コンパイルされたクエリ ハンドルを返すか、エラーが発生した場合は DB_Error オブジェクトを返します。

functionexecute($stmt, $data = false)
コンパイルされたクエリを実行します。 $stmt は、prepare によって返されるハンドルです。 $data はパラメータ データです。パラメータ クエリを使用している場合、$data にはそれぞれの?が含まれます。パラメータ値

例:
/**
* 以下は、指定したユーザーの記事レコードを記事テーブルから削除する削除クエリを実行します
*/
$sql = "delete from artilce wherearticle.userid =$userid";
$qh = $db->prepare($ sql );
if(DB::isError($qh)){
return $qh;
}
$result = $db->e​​xecute($qh);
return $result;
?>



functionexecuteEmulateQuery($stmt, $data = false)
内部関数の準備と実行をシミュレートするときに使用する実際のクエリ文字列を返します。エラーが発生した場合は、DB_Error オブジェクトが返されます。

functionexecuteMultiple( $stmt, &$data )
同じクエリ ハンドルで複数のクエリを実行します。 $data は 0 から始まる配列である必要があります。この関数は、配列内のデータの各行に対して順番に実行を呼び出します。この関数は通常、パラメータのクエリに使用されます。クエリを一度コンパイルし、さまざまなパラメータ値を $data 配列に入力して、クエリを同時に実行できます。クエリの 1 つでエラーが発生した場合、残りのクエリは続行されず、エラーが返されることに注意してください。

functionmodifyQuery($query)
バックエンドデータベースのクエリを変更するために使用される内部関数。バックエンドデータベースはこの関数を実装し、最適化および変更されたクエリ文字列を返します。例: これは DB_mysql の実装です。
functionmodifyQuery($query)
{
if ($this->options['optimize'] == 'portability') {
"DELETE FROM table " mysqlで影響を受けた行を与えます。クエリが成功すると、結果セットのあるクエリの場合は DB_Result オブジェクトが返され、結果セットのないクエリがある場合は DB_OK が返されます。

エラーが発生した場合はDB_Errorオブジェクトが返されます。

function &getOne($query, $params = array())
クエリを実行し、結果セットの最初の行と最初の列のデータを返します。 $params はパラメータ値です。バックエンド データベースがサポートしている場合は、これらのパラメータを使用するために prepare/execute が呼び出されます。

例:
$sql = "userid= $userid orderby date の記事から id,date を選択";
$last = $db->getOne($sql);
if(DB::isError($last)){
echo "エラー: ".DB::errorMessage($last);
}
echo "id:".$last;
?>



function &getRow($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array() )
クエリを実行し、結果セットの最初のレコードを返してください。

$fetchmod はフェッチモードを指定します。省略した場合は、デフォルトのモードが使用されます。

例:
$sql = "select * from items order by date desc";
$row = $db->getRow($sql);
if(DB::isError($row) ){
echo "Error:".DB::errorMessage($row);
}
for($i=0;$i echo "$row[ $i]";
}

?>



function &getCol($query, $col = 0, $params = array())
クエリを実行し、指定されたフィールドを返します。結果セット 列値の配列

$col は返される列のインデックスであり、整数またはキー フィールド名にすることができます

例:
$sql = "select id,userid。 ,date from items order by date desc limit 100";
//ユーザーリストのみを返します
$row = $db->getCol($sql,1);
if(DB::isError($row)){
echo "エラー :".DB::errorMessage($row);
}

for($i=0;$i echo "$row[$ i]< /tr>";
}

?>



function &getAssoc($query, $force_array = false, $params = array())
クエリを実行し、連想配列を返します。 $force_arry 強制的に配列を返します。 true の場合、結果セットにフィールドが 2 つしかない場合でも、キー フィールドに対応する値は要素が 1 つだけの配列になります。 false の場合、キー フィールドに対応する値は次のようになります。この関連付けられた配列は少し特殊であることに注意してください:
"Select Userid, name, reg_date from user" をクエリすると、レコード セットは次のようになります:
Userid Name Reg_date
test Testor 2001-07-05Test2 Teest2 2001-07 -06
その後、返される配列は次のようになります:
array( 'test' => array('testor','2001-0705'),
'test2'=> array('teest2','2001-07 -06 '
)

例:

$sql = "ユーザー制限 100 からユーザー ID、名前、登録日、最終ログインを選択";
$userinfo = $db->getAssoc($sql);
if( DB::isError($userinfo)){
die "エラー! ".DB::errorMessage($userinfo);
}
if(empty($userinfo)){
echo "warning:NO users!";
return;
}
/*userinfo にはユーザー情報が含まれています */
function getUserInfo($user_id=''){
$info = $userinfo[$user_id];
if (empty($info){
echo "そのようなユーザー情報はありません!";
}
return $info;
}
?>



function &getAll($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array())
結果セット内のすべてのレコードを含む配列を返します。注意: 結果セットが次の場合はこれを使用しないでください。この関数。

例:
$sql ="select * from users limit 1000";
$list = $db->getAll($sql);
if(DB::isError( $list )){
die "データベースエラー:".DB::errorMessage($list);
}
for ($i=0;$i $user = $ list[ $ i]; h echo "& lt; troc & gt;"
for ($ j = 0; $ j & lt; count ($ user); $ j ++) {
echo "& lt; td & gt;". $ user [$ j].. "";
}
echo "";
_

関数 commit() はサポートされていません。
現在のトランザクションをコミットします

関数 rollback()
現在のトランザクションをロールバックする

関数 numRows($result)
結果セット内のレコード数を返す

関数affectedRows()
前のクエリを返す 操作されたレコードの数

関数 nextId($ seq_name、$ondemand = true)
指定されたシーケンスの次の値を返す

関数 createSequence($seq_name)
シーケンスを作成する

関数 dropSequence($seq_name)
シーケンスを削除する


5. したがって、さらに進んで、独自の中間データベース アプリケーション層を作成します
, DB クラスの機能についての理解が深まりました。 DB クラスに基づいて独自のデータベース アプリケーション層を作成できます。もしかしたら、なぜ新しいクラスを作成する必要があるのか​​と疑問に思われるかもしれません。アプリケーションで DB を直接使用するのは良いことではないのですか?答えはもちろんですが、お勧めしません。

まず第一に、DB は非常に強力ですが、クラスはアプリケーション指向である必要があります。データベース層は、必要のない機能を保護する必要があります。同時に、アプリケーションがデータベースに接続してリソースを解放しないようにする必要があります。その後、これらのタスクはクラスによって完了されます。

第二に、DB にはまだいくつかの欠陥があります。それよりも優れたものを見つけたら、すぐにアップグレードできます。変更する必要があるのは、このクラスのメソッドの実装方法だけであり、アプリケーションの他のモジュールは影響を受けません。

独自のクラスを設計するときは、次のガイドラインに従っていただければ幸いです:

基本的な無料のクエリ インターフェイスを提供します。クエリと実行が含まれます。これらは、それぞれ結果セットのあるクエリと結果セットのないクエリに対応します。
特定のデータベースの特定の機能は、コード サイズが増加する場合でも使用しないでください。
データベースへの接続、リソースの解放など、データベース操作の詳細の一部を保護するようにしてください。
6. DB の欠点
上記では、DB の利点とその使用方法とテクニックについて説明しました。しかし、完璧なものはありません。特に DB クラスは開発期間が長くないため、DB は最終的に完成するわけではなく、使用中に多かれ少なかれバグや設計上の問題を発見して修正する必要があります。 。

MYSQL の問題
質問 1: 以前プロジェクトを開発していたときに、DB の MYSQL クラスに問題があることに気づきました。つまり、接続すると、MYSQL クラスが現在のデータベースを $ のデータベース名に自動的に設定します。 DSN。今後クエリを使用する場合は、現在のデータベースが使用されます。以下は元の接続コードです:
if ($dsninfo["database"]) {
if (!mysql_select_db($dsninfo["database"], $conn)) {
if ($dsninfo["database"]) return $this->raiseError(); / / Testが私のメインデータベースですが、最初のデータベースのユーザーからユーザー情報を取得し、ユーザーの権限情報をtestに保存したいと考えています。この目的のために、データベース層を実装するために中間クラス CV_DB を作成しました。 CV_DB の作成関数では、指定したデータベースに接続するので、次のように使用できます:

$db1 = new CV("user");

$db2 = new CV("test");

その後実行したところ、あるユーザーの情報を問い合わせたところ「テーブルが存在しません」というDBエラーが発生しました。しかし、実際にはこのテーブルは存在します。最後に、DB/mysql.php に問題があることがわかりました。そのクエリでは、mysql_db_query ではなく mysql_query が使用されていました。このとき、実行すると、MYSQL の現在のデータベースが 2 番目のデータベースになりました。最初のデータベースに対するクエリでは、当然エラーが発生します。

解決策は 2 つあります。CV の作成時にデータベースに接続しない、クエリ時に接続する、クエリの完了後に切断します。または、DB/Mysql.php を変更します。私は後者を選択し、上記の行をコメントアウトして、SimpleQuery の mysql_query を mysql_db_query に置き換えました。

問題 2: mysql には実行がないため、DB_common のシミュレーション メソッドを継承しますが、残念ながら、これにより新たな問題が発生します。一部の更新クエリで、更新するデータに 2 つの特殊文字が含まれている場合、問題が発生します。これは、prepare がこれらの文字をパラメータ クエリの文字とみなして分析するため、データを更新できなくなります。

解決策は 2 つあります: 交換しますか?と & ですが、考慮すべきことがたくさんあります。または: simpleQuery を使用するか、直接クエリを実行します。

私が後者を選択したのは、他のクラスが中間データベース アプリケーション クラスである CV のみを処理するためです。そのため、バックエンド データベースが mysql の場合は、それを直接 simpleQuery として呼び出します。それ以外の場合は、バックエンド データベースの準備と実行を呼び出します。このようにして、実際のバックエンド データベースはプロジェクト内の他のアプリケーション クラスに対して透過的になるため、対応する調整を簡単に行うことができます。これはデータベース アプリケーション層を設計する当初の目的でもあります。

DBの開発状況
DB は現在も継続的に開発中です。DB/ の下に STATUS ファイルがあり、DB クラスの機能と各バックエンド データベースの実装が説明されています。以下はリリースにおける PHP4.0.6 の開発状況です。 x" - 実装されていますが、テストは実装されていませんが、テストはありません
"t" - 実装されていますが、1 つ以上のテストは失敗します 実装されますが、1 つ以上のテストは実装に失敗し、すべてのテストに合格します
"e" - エミュレートされた実装、エミュレートされたテストはありません、テストなし
「E」 - エミュレートされた実装、エミュレートされ、すべてのテストに合格
「n」 - 「機能なし」を返します、この機能を提供する機能はありません
" -" -to は FBSQL IFX MSSQL OCI8 を実装しませんでしたPGSQL
機能 | Sybase
simplequery X X X T T x T x inumro WS x e x e e T e e
シーケンスs x n n n 自動コミット
tableInfo x n n n Pan Fan (Night Sailer) : 北京賽迪データ有限公司エンジニア彼の主な研究対象は、Perl、PHP、および XML のアプリケーション、PHP の MVC 開発モデル、および PERL-GTK の使用です。 nightsailer@hotmail.com まで連絡してください。









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