TOP書籍連動> メソッド内のコメントの説明
SQLiteの高度な活用術
SQLiteの高度な活用術

第3回:例外処理の注意点

著者:Peter Lavin   2006/4/13
前のページ  1  2
メソッド内のコメントの説明

   それぞれのメソッドの中のコメントは、PHPのWebサイトに記述されているメソッドのプロトタイプです。しかし、プロトタイプの宣言通りに実行しても、うまく機能しない場合もあります。もし、オプションで参照型の文字列変数(&$error_msg)を受け取る基底クラスのメソッドで、その引数を指定すると警告が出ます。例えば、query()メソッドの第3引数に参照型の文字列変数を指定すると以下のようになります。

SQLiteDatabase::query()expects at most 2 parameters, 3 given.    この記事を書いている現時点ではPHP 5.1 RC1なので、ドキュメントは更新されているかもしれませんが、第3引数が必要な理由は以下のように書かれています。(日本語版のドキュメントには記述されていません)...$error_msgはエラーが発生すると値がセットされます。

   SQLのシンタックスエラーはsqlite_last_error()関数では取得することができないので、非常に重要です。まさにその通りで、sqlite_last_error()関数では重要なメッセージを取得することはできず、「SQL logic error or missing database(SQLロジックエラー、または、データベースが存在しません)」となってしまいます。これはどうしようもないのですが、デバッグの時は警告が表示されるので、それを活用することができます。

   存在しないテーブルにアクセスしようとすると、以下のような警告が表示されます。

"Warning: SQLiteDatabase::query()[function.query]:
no such table: tblnonexistent..."

   リスト4の結果セットを作成する5つのメソッドを再び見てください。バッファーされるクエリとされないクエリのメソッドは、MySQLの関数と非常に似ているのでコードをみればわかるでしょう。しかし、MySQLにはsingleQuery()メソッドやqueryExec()メソッド、arrayQuery()メソッドなどにあたるものはありません。これらのメソッドの詳細を見てみましょう。

   singleQuery()メソッドは最近加えられたもので、PHPのWebサイトでもドキュメント化されていない、という警告が表示されています。このメソッドはテーブルのレコード数を調べるためにCOUNT関数を使用するときなどの、結果が1行のクエリを発行する時に特に有効です。

   このメソッドの仕様は、1つのレコードを返し結果セットは作成されない、というものです。第2引数にfalseを設定すると、返却される値は最初の行の配列になります。第2引数をtrueとする場合は、最初の行の1つめのカラムが整数値として返されます。

   このメソッドの仕様については理解できたと思いますが、実際にはこのメソッドはまだ完全には実装されていません。現在ではこのメソッドは最初の行の最初のカラムのみが返却されるようになっています。第2引数をfalseとしても最初のカラムが配列として返され、trueの場合は整数として返されます。

   PHPのWebサイトでは第2引数がfirst_row_onlyと間違って表記されているので注意が必要です。また、返される値の型についてもarrayとなっていますが、本来はmixed となってなければいけません。どちらにしても、まだこのメソッドはきちんと動作しないので注意しましょう。

   query()メソッドのかわりにsingleQuery()メソッドを使用する必要はなく、MySQLのように結果セットを作成し、最初の行を取得したりフィールドを指定して取り出す事も可能です。

   ですが、1つのカラムの値しか必要でないのに、オブジェクトや配列を取得する必要はありません。singleQuery()メソッドは結果セットを取得しないので、データ操作系のクエリや、1つの値だけを取得するクエリの場合には重宝することになります。


結果セットの作成をスキップできるarrayQuery()メソッド

   次にarrayQuery()メソッドを見てみましょう。singleQuery()メソッドと同様に、このメソッドは結果セットの作成をスキップすることで、直接クエリの結果を配列にコピーすることができます。

   このメソッドは取得されるレコード数が限られているクエリの場合、つまりLIMIT 句を使用しているクエリで特に有効です。MySQL ではSQLiteのqueryExec()メソッドと同様の機能を持った関数を持っていません。というのもqueryExec()メソッドはマルチプルクエリを実行するためのものだからです。

   このメソッドを使用すると、セミコロンで分けられた複数のクエリを、一度に実行することができます。このメソッドはmysqliのmulti_query()メソッドと同様の動作をし、繰り返し複数のクエリを実行するときのパフォーマンスをかなり改善することができます。また、もちろん複数のクエリではなく、単一のクエリの実行も行うことができます。

前のページ  1  2


Peter Lavin
著者プロフィール
Peter Lavin
カナダ、トロントでWebデザイナ/Web開発者として働いています。現在、PHPのオブジェクト指向をテーマにした本を執筆しており、No Starch Press社より出版される予定です。


INDEX
第3回:例外処理の注意点
  SQLiteDatabaseの拡張
メソッド内のコメントの説明