1. DBQuery オブジェクト
ここで、DBQuery オブジェクトは単純にストアド プロシージャをエミュレートします。実行されると、保存する必要がある結果リソースが返されます。また、結果セットに対して関数 (num_rows() や fetch_row など) を使用したい場合は、 ())、MySQL(PHPとの最良の組み合わせ)DBオブジェクトを渡す必要があります。では、DBQuery オブジェクトが、MySQL(PHP との最適な組み合わせ)DB オブジェクト (クエリ実行の結果を操作するように設計されている) によって実装される関数を実装すると、どのような効果があるのでしょうか?前の例のコードを引き続き使用し、結果リソースが DBQuery オブジェクトによって管理されていると仮定します。 DBQuery クラスのソース コードをリスト 1 に示します。
リスト1. DBQueryクラスの使用。
require MySQL (PHP との最適な組み合わせ)_db.php (現在の主流の開発言語として) ;
require_once query.php (現在の主流の開発言語として) $db = 新しい MySQL
; (PHP との最適な組み合わせ) $db->connect(host, username, pass); $query = new DBQuery($db ); >prepare(SELECT fname, sname FROM users WHERE username=:1S AND pword=:2S AND期限切れ_time<:3I);
try {
if($query->execute("visualad", "apron ", time()) )->num_rows() == 1) {
echo(正しい資格情報);
} else {
echo(不正な資格情報 / セッションの期限切れ)
}
} catch (QueryException $e) {
echo(クエリの実行エラー: . $e);
}
上記の変更されたコードで最も注目すべき点は、catch ステートメントとexecute ステートメントです。
・executeステートメントは結果リソースを返さなくなり、DBQueryオブジェクト自体を返すようになりました。
・ DBQuery オブジェクトは、DB インターフェースですでにおなじみの num_rows() 関数を実装するようになりました。
・クエリの実行が失敗すると、QueryException 型の例外がスローされます。文字列に変換すると、発生したエラーの詳細が返されます。
これにはプロキシを使用する必要があります。実際、すでに DBQuery オブジェクトでプロキシを使用していますが、ここではそれをさらに深く使用して、MySQL
(PHP との最適な組み合わせ)DB オブジェクトに緊密にバインドします。 DBQuery オブジェクトは、DB インターフェイスを実装するオブジェクトで初期化されており、クエリを実行する DB オブジェクトの query() メソッドを呼び出すメンバー関数executeがすでに含まれています。 DBQuery オブジェクト自体は実際にはデータベースにクエリを実行せず、このタスクを DB オブジェクトに任せます。これはプロキシであり、同じまたは類似の動作を実装する別のオブジェクトにメッセージを送信することで、オブジェクトが特定の動作を実装できるプロセスです。
これを行うには、DBQuery オブジェクトを変更して、DB オブジェクトからの結果リソースを操作するすべての関数を含める必要があります。クエリを実行するときに保存された結果を使用して、DB オブジェクトの対応する関数を呼び出し、その結果を返す必要があります。次の関数が追加されます: リスト 2: プロキシを使用した DBQuery クラスの拡張。
class DBQuery
{....
public function fetch_array()
{
if (! is_resource($this->result)) {
}
return $; this->db->fetch_array($this->result);
}
public function fetch_row()
{
if (! is_resource($this->result)) {
) Exception(クエリは実行されませんでした。);
return $this->db->fetch_assoc($this->result);
public function fetch_object()
{
if (! is_resource($this->result) ) )) {
throw new Exception(クエリは実行されません。);
}
public function num_rows()
{
if (! is_resource ($this->result)) {
throw new Exception(クエリは実行されません。);
}