Posql - API Reference - クラスメソッド リファレンス


目次

Posql 概要

Posql (ポスキューエル) は、 ピュア PHP (標準バンドル以外に必要なモジュールなし) で作られた、
1 つのファイルを 1 つのデータベースとして扱う データベースエンジン のクラス (ライブラリ系 DBMS) です。
PHP のバージョンに関係なく動作し、 SQLite より気軽に扱えることを目標とされています。
基本的な SQL 文法をサポートし SQL-92 に準拠した設計で作られています。 パッケージには GUI でデータベースを操作できる PosqlAdmin (データベースマネージャ) が付属されています。
また、PEAR::DB, PEAR::MDB2 抽象化レイヤーを使用して Posql を操作できるドライバや、PHP フレームワーク CakePHP から Posql をデータベースとして扱える DBO ドライバもパッケージに同梱されています。
SQL ステートメントは、 PDO と互換性のある プリペアドステートメントや、 バインドメカニズムを使用することができます。
Posql データベースは、多数の同時アクセスに耐えられる 排他機構 (ロック) を実装しています。 複数のプロセスからの同時アクセスにより競合が発生するような場合でも、 アトミック操作に加え テスト・アンド・セット方式によって、 常にデータベースの安定性を保持します。

Posql は、 評価式 (WHERE 句など) で PHP 構文を使用することができます。
SQL92 - 99 標準の関数、文法を使用し SQL 構文で評価することも可能です。
評価エンジン切り替え機能によって、 その式の評価のされかたを PHP モード、SQL モードと、 その時に応じて切り替えることができます。

Posql は他のライブラリやフレームワークと衝突しないよう、 グローバル空間を汚さず設計されています。
定義されるものはクラス数個のみで、 Posql* (Posql_Config, Posql_Utils, etc.) 等のクラスが定義されます。

Posql バージョン 2.11 から、 SELECT サブクエリ (副問い合わせ) が実装され 扱える SQL が大幅に広がりました。 サブクエリは SELECT, INSERT, UPDATE または DELETE の各ステートメントの中の評価式など、 式が使えるところであればどこにでも使用できます。 それにあわせて EXISTS, ANY, SOME, ALL 演算子が実装されています。 バージョン 2.15 から、 UNION, INTERSECT, EXCEPT 演算子が実装されています。 また、今まではエイリアス名を指定する演算子が AS のみだったのを改善し、 ホワイトスペース区切りでも適応可能となりました。 バージョン 2.16 では、 GROUP BY 句において、 今までは 1 つのカラム名のみ指定可能だったのを改善し、 任意の評価式を複数 指定できるようになりました。 また、日時を扱う strftime や extract 関数が実装されました。 最新バージョン 2.17 では、 SELECT の速度が 約 80% 向上したという劇的な改善がされています。 また、JavaScript の関数 escape/unescape, encodeURI/decodeURI, encodeURIComponent/decodeURIComponent が互換実装され、PHP と JavaScript 間の連携をとる際に便利になりました。 JavaScript 関数の互換実装については API マニュアル を参照ください。 クエリーキャッシュ機能も実装されています。 setUseQueryCache(true/false) をコールすることによって、 クエリをキャッシュし 高速に結果セットが得られる仕組みになっています。 その他、いくつかのバグや不具合に対して より 標準 SQL に準じた修正がされ、 広く普及している MySQL, PostgreSQL, SQLite などの DBMS, RDBMS との互換性が 高くなっています。

このドキュメントは、PHP から Posql を API として扱うため、 またクラスメソッド、プロパティの用途についてのリファレンスです。

このドキュメントは Posql で実装されている API の全てではありません。
ドキュメントに収まらない詳細は、 ソースコード "posql.php" 内の各クラスを参照してください。
Posql ソースコードは、できるかぎりわかりやすい (変数名の省略や三項演算子を控えた) コーディングがされています。
PHPDoc と呼ばれるコメント形式も可能な限りされています。
そのためにソースコードのサイズが大きくなることは、この限りではありません。

index

どうやって使うの?

Posql は 現バージョン (Version 2.17) では、 グローバル関数空間を使っていません。
クラスのインスタンスを生成する必要があります。

$posql = new Posql;

ここで、引数に対象のデータベースとなるファイル名を渡すと データベースを新規で作ります。
もしすでにデータベースが存在している場合は、単にスキップされます。 コンストラクタの詳細は Posql (コンストラクタ) を参照してください。

Posql は SQL 文法を除けば query(), fetch(), isError(), lastError() 最低限このメソッドのみで扱うことができます。
query() は 任意の SQL クエリを実行します。 fetch() は 結果セットから 1 つの列を 取り出します。 isError() は、エラーが発生しているかどうかを調べます。 lastError() は、直前のエラーメッセージを取得します。

  $posql = new Posql('foo.db');
  $sql = "CREATE TABLE foo (
    id   INTEGER      PRIMARY KEY,
    name VARCHAR(255) DEFAULT ''
  )";
  $posql->query($sql);
  if ($posql->isError()) {
    die($posql->lastError());
  } 

上のような流れで SQL ステートメントを実行することができます。

Posql がサポートする SQL 文法については、 同梱されている マニュアル Posql SQL Reference を参照してください。

続いてデータを挿入 (INSERT) します。

  $sql = "INSERT INTO foo (name) VALUES ('Hello!')";
  $posql->query($sql);
  if ($posq->isError()) {
    die($posql->lastError());
  } 

テーブル foo に 1 列 データを挿入しました。 それを取得 (SELECT) します。

  $sql = 'SELECT * FROM foo';
  $stmt = $posql->query($sql);
  if ($posq->isError()) {
    die($posql->lastError());
  }
  print "<pre>";
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  print "</pre>"; 

上の例では、テーブル foo から データを取得し、 ループに fetch() を使用し、 各列のデータを表示します。

index

Posql クラスのメソッド

以下に各メソッドの説明を記します。

index

Posql (コンストラクタ)

new Posql ([string path = null [, string table = null [, array fields = array() ]]]) ;
Posql のクラスを初期化し、インスタンスを生成します。
   $db_path = 'foo.db';
   $posql = new Posql($db_path); 

上の例のようにすると、'foo.db' をファイル名として (実際には その後に拡張子 .php が付加され) データベースをオープンします。

データベースは 1 つのファイルとして物理的に生成されます。
対象のディレクトリに対し 書き込み権限 (パーミッション) がない場合は、接続タイムアウト、またはエラーになる可能性があります。 データベースとしてファイルが生成されると、
そのパーミッションは 666 (rw-rw-rw-) に設定されます。 データベースにはヘッダー情報とメタ情報が書き込まれます。

データベースの作成時、Posql はデータベースの拡張子を .php に修正しようと試みます。 これはデータベースに対し、 ダイレクトにアクセスされた場合のセキュリティ上の対処です。
データベースは、サーバーのドキュメントルート外に置くことを推奨しますが、 環境によってはそれが不可能かもしれません。 その場合は拡張子を .php にすることが好ましいです。
必要に応じ、 setExt(), getExt() メソッドを使用し、拡張子を変更することができます。

引数 table が文字列として、 fields が連想配列として渡されると、 table をテーブルとみなし CREATE TABLE コマンドを実行します。 もし、すでにテーブルが存在する場合でもエラーになりません。 これは IF NOT EXISTS 制約と同じ働きをします。

   $db_path  = 'foo.db';
   $table    = 'foo';
   $defaults = array(
     'name' => '',
     'data' => NULL
   );
   $posql = new Posql($db_path, $table, $defaults); 

このように引数を指定してインスタンスを生成すると、 次のような流れで処理されます。

データベース (foo.db) が存在しなかった場合は 以下のように処理されます。

  1. foo.db という データベース名で CREATE DATABASE コマンドを実行。
  2. 連想配列 $defaults の キーを フィールド名、 値を DEFAULT 制約 としてのデフォルト値、
    そして foo というテーブル名で CREATE TABLE コマンドを実行。

データベース (foo.db) がすでに存在している場合は 以下のような処理になります。

  1. foo.db という データベースが有効な形式かどうか調べます。
  2. foo.db が 無効なファイル形式だった場合、処理をスキップ。
  3. 連想配列 $defaults の キーを フィールド名、 値を DEFAULT 制約 としてのデフォルト値、
    そして foo というテーブル名で CREATE TABLE コマンドを実行。
index

SQL クエリを実行

mixed Posql->query (string query) ;
SQL ステートメントを実行します。 戻り値は 各 SQL コマンドによって変わります。 実行した、または実行しようとパースの途中などでエラーが発生すると 全ての処理はスキップされ、FALSE を返します。

戻り値は 各 SQL コマンドによって異なります。 SELECT のような結果が配列となる問い合わせを実行すると、 Posql_Statement オブジェクトのインスタンスが返ります。 Posql_Statement クラスは PHP 5 にバンドルされている PDO (PDOStatement) クラスをモデルに設計されています。
ステートメントは PDO と互換性がある操作が可能です。 PDO の詳細については、 PHP マニュアル (PDOStatement) を参照してください。
PDO との互換性 についての様々な操作に限らず、 PDO::FETCH_* 定数が Posql_Statement においても 同様に扱うことができます。
ステートメントの詳細は、下で解説する Posql_Statement クラスのメソッド を参照してください。

   $posql = new Posql;
   $sql = "SELECT 100 * 100, 'hoge' AS hoge";
   $stmt = $posql->query($sql);
   print $stmt->fetchAllHTMLTable(); 

上の例は、FROM 句を省略した SELECT コマンドを実行します。 この例の取得方法の詳細は、 下で解説する fetchAllHTMLTable を参照してください。

   $posql = new Posql('foo.db');
   $sql = "CREATE TABLE foo (id PRIMARY KEY, name)";
   $result = $posql->query($sql);
   var_dump($result); 

上の例は CREATE TABLE コマンドを実行します。 この場合、出力される戻り値は TRUE もしくは FALSE になります。 基本的に Posql 側から エラーを出力することはありません。 エラーについては下で解説する isError(), lastError(), getErrors() を参照してください。

index

エラー処理

boolean Posql->isError ( void ) ;
isError メソッドは、内部でエラーが発生しているかどうかを調べます。 エラーが発生している場合、TRUE を返します。 エラーが発生していない場合は FALSE を返します。
   $sql = 'hoge';
   $result = $posql->query($sql);
   if ($posql->isError()) {
     die('エラーです');
   } 

上の例は、不正な SQL コマンドを発行し 明示的にエラーを発生させています。 この場合、"エラーです" と出力されスクリプトは終了します。


string Posql->lastError ([boolean detail = false]) ;
lastError メソッドは、最後に発生したエラーメッセージを取得します。 エラーが発生していない場合は 空の文字列 ('') が返されます。 detail が 真の値 (TRUE) として渡されると、 エラーメッセージの他に エラーが発生したファイル名、 エラーが起きたスクリプトの行数値が 戻り値の文字列に付加されます。
   $sql = 'hogehoge';
   $result = $posql->query($sql);
   if ($posql->isError()) {
     die($posql->lastError());
   } 

上の例は、最後のエラーメッセージと共にスクリプトを終了させます。

Posql のエラー情報は スタッカブルに保持しています。 lastError() によって取得したメッセージは、 次にコールした時にはすでに破棄されています。 仮に再度 lastError をコールすると、空の文字列 ('') が返されます。


array Posql->getErrors ([boolean detail = false]) ;
getErrors メソッドは、保持しているエラーメッセージを配列ですべて取得します。 エラーが発生していない場合は 空の配列 が返されます。 detail が 真の値 (TRUE) として渡されると、 エラーメッセージの他に エラーが発生したファイル名、 エラーが起きたスクリプトの行数値が 戻り値の文字列に付加されます。
   $posql = new Posql;
   $posql->query('hello!');
   $posql->query('how are you?');
   if ($posql->isError()) {
     foreach ($posql->getErrors() as $error) {
       echo $error, "<br/>\n";
     }
     die;
   } 

上の例は、全てのエラーメッセージと共にスクリプトを終了させます。

index

主なメソッド

boolean Posql->open ( string path [, string table = null [, array fields = array() ]] ) ;
Posql データベースをオープンします。 データベースが存在しない場合は作成します。

引数 path をデータベースのファイル名とし、接続を試みます。 もしファイル path が存在しない場合、 createDatabase() がコールされます。 ファイルがある場合は、isDatabase() により path が有効な Posql データベースであるかチェックされます。 引数 table および fields が渡されると、 createTable() が呼ばれます。 テーブルがすでに存在する場合でもエラーと扱われません。 テーブルがない場合は、table を テーブル名、 fields を テーブルのカラム、および DEFAULT 制約 の値として作成を試みます。 成功すると TRUE、失敗時に FALSE を返します。

   $posql = new Posql;
   $result = $posql->open('/path/to/file.ext');
   var_dump($result); 

上の例は、/path/to/file.ext をデータベースファイルとして オープンまたは作成します。


boolean Posql->createDatabase ( string path [, number perms = 0666 ] ) ;
Posql データベースを作成します。 CREATE DATABASE コマンドを実行することと同じです。

引数 path をデータベースのファイル名とし、作成を試みます。 ファイルが物理的に生成されるため、 対象のディレクトリに書き込み権限がないとエラーになるかもしれません。 データベースが生成されると、ヘッダー情報とメタ情報が書き込まれます。

また、その後のカレントのデータベースは 生成されたファイルが対象にされます。 対象のデータベースは setPath(), を使用することで変更できます。 引数 perms はデータベースのファイル属性 (パーミッション) です。 デフォルトは 666 (rw-rw-rw-) ですが、 perms に任意の数値を 与えることで変更することができます。

データベースの作成時、Posql はデータベースの拡張子を .php に修正しようと試みます。 これはデータベースに対し、 ダイレクトにアクセスされた場合のセキュリティ上の対処です。
データベースは、サーバーのドキュメントルート外に置くことを推奨しますが、 環境によってはそれが不可能かもしれません。 その場合は拡張子を .php にすることが好ましいです。
必要に応じ、 setExt(), getExt() メソッドを使用し、拡張子を変更することができます。

成功すると TRUE、失敗時に FALSE を返します。

   $posql = new Posql;
   $result = $posql->createDatabase('new_db');
   var_dump($result); 

上の例は、new_db を Posql データベースとして新規に 作成します。 物理的には その new_db の後に拡張子 .php が付加され、 new_db.php というファイルが作成されます。


boolean Posql->createTable ( string table [, array fields = array() [, string primary_key = null ] ] ) ;
新規テーブルを作成します。 CREATE TABLE コマンドを実行することと同じです。

引数 table をテーブル名、 引数 fields は連想配列として キーを フィールド名、 値を DEFAULT 制約 としてのデフォルト値として テーブルを定義します。

PRIMARY KEY (主キー) を指定するには、 最初のカラム名を 引数 primary_key として渡します。 主キーであるプライマリキーは、 下で解説される rowid の参照として値を保持します。 主キーは、意図的に変更しない限り 数値型であり auto increment, UNIQUE 制約として扱われます。

成功すると TRUE、失敗時に FALSE を返します。

   $db_path = 'foo.db';
   $table_name = 'foo';
   $defaults = array(
     'id'   => 0,
     'name' => 'anonymous',
     'text' => ''
   );
   $primary_key = 'id';
   $posql = new Posql;
   $posql->createDatabase($db_path);
   if ($posql->isError()) {
     die($posql->lastError());
   }
   $result = $posql->createTable($table_name, $defaults, $primary_key);
   var_dump($result); 

上の例は、'foo.db' というデータベースを作成後、 そのデータベース上に foo というテーブルを作成します。

現バージョン (2.17) では、 単独での INDEX, UNIQUE, CHECK 等は実装されていません。 そのかわり Posql には、以下の 3 つの特別なカラムがあります。

rowid
ユニークな列の ID を保持します。 SQLite の ROWID と似ています。 rowid は常に auto increment および primary key として扱われます。
ctime
生成 (created) された時間 (time) を UNIX 時刻 (PHP での time()) として保持します。
utime
更新 (updated) された時間 (time) を UNIX 時刻 (PHP での time()) として保持します。 列が変更されると、utime は常にその時の UNIX 時刻で値を更新します。

これらの特別なカラムはレコードが変化するとき、常に更新/追加されます。 また、同じ名前のカラム (例えば rowid) を生成しようとする場合、 その名前空間は Posql 側に常に上書きされます。 この 3 つの特別なカラムは、テーブル作成時にカラムの最後に追加されます。

  CREATE TABLE foo (
    id   integer PRIMARY KEY,
    name string  DEFAULT '',
    addr int(10) DEFAULT 0,
    text string  DEFAULT NULL
  ); 

上のSQLを実行すると、foo の持つカラムは

  1. id
  2. name
  3. addr
  4. text
  5. rowid
  6. ctime
  7. utime

このような順序で生成されます。
最初のカラム id に PRIMARY KEY を指定していることで、 id は rowid の参照として働きます。

describe() メソッドを使用することで、 テーブルの定義を参照することができます。

あるテーブルにおいて、カラム数や制約数が勝手に制限されることはありません。 単一の行に格納できるデータのサイズは、デフォルトで 約 2 GB です。 この数値は、行に限らず最大の列数にも影響します。 この値は getMax(), setMax() により取得、設定できます。

テーブルを削除するには dropTable() メソッドを使用します。


boolean Posql->createFunction ( string funcname , callback callback ) ;
SQL ステートメントで使用可能な ユーザ定義関数を登録する

Posql に PHP 関数 を UDF (ユーザ定義関数) として登録します。 登録された関数は、SQL ステートメントの中からコールできます。 UDF は、SELECT および UPDATE ステートメント、主な 評価式の中など、 関数をコールできる全ての SQL ステートメントで使用可能です。

注意: SQL モード の中でのみ利用できます。
SQL モード、および PHP モードについては getEngine(), setEngine() を参照してください。

引数 funcname は、SQL ステートメントで使用する関数名 として 文字列で渡します。 引数 callback は、定義された SQL 関数を処理するためのコールバック関数 を指定します。 sqlite_create_function() と同じ指定の仕方で登録できます。

注意: コールバック関数は Posql で有効な型 (例えば スカラー型) を返す必要があります。

   // The function is defined beforehand.
   function posql_udf_crc32($value = null){
       // The CRC32 function of interchangeable MySQL.
       $result = null;
       if ($value !== null) {
           $result = sprintf('%u', crc32($value));
       }
       return $result;
   }
   // Register the UDF function as CRC32.
   $posql = new Posql('foo.db');
   $posql->setEngine('SQL');
   $result = $posql->createFunction('crc32', 'posql_udf_crc32');
   if (!$result || $posql->isError()) {
       die($posql->lastError());
   }
   $sql = "SELECT CRC32('abc')";
   $stmt = $posql->query($sql);
   var_dump($stmt->fetchAll()); 

上の例では、MySQL 互換の CRC32 チェックサムを生成する関数を登録し、 それを実行します。 あらかじめ、setEngine() によって SQL モードにしておきます。


boolean Posql->dropDatabase ( [ string path = null [,boolean force = false ] ) ;
対象のデータベースを削除します。 DROP DATABASE コマンドを実行することと同じです。

対象のデータベースを物理削除します。 物理削除とは、データベース (ファイル) そのものを削除するということです。 削除後、Posql によりそれを復旧することはできません。

引数 path が渡されると、 path を対象のデータベースとします。 省略された場合は、カレントのデータベースが対象になります。 カレントのデータベースは getPath(), setPath() メソッドを使用することで 取得、変更できます。

引数 force が FALSE の場合は、データベースがロック中だった場合、 ロックが解除されるまで待機します。 force が TRUE の場合、ロック状態に関係なくデータベースを削除します。 force のデフォルト値は FALSE です。

成功すると TRUE、失敗時に FALSE を返します。

   $db_path = 'foo.db';
   $posql = new Posql;
   $posql->createDatabase($db_path);
   if ($posql->isError()) {
     die($posql->lastError());
   }
   $result = $posql->dropDatabase($db_path);
   var_dump($result); 

上の例は foo.db というデータベースを作成し、 作成されたとたんに削除します。


boolean Posql->dropTable ( string table ) ;
テーブルを削除します。 DROP TABLE コマンドを実行することと同じです。

引数 table として渡されたテーブルを削除します。 データベースのメタ情報と、テーブルデータ全てが物理的に完全に削除されます。

成功すると TRUE、失敗時に FALSE を返します。


int Posql->insert ( string table [, array rows = array() ] ) ;
対象のテーブルに新規の列を追加します。
   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $data = array(
     'name' => 'foo',
     'text' => 'Hello!'
   );
   $affected_rows = $posql->insert('foo', $data);
   var_dump($affected_rows); 

引数の rows は上の例のように、連想配列で渡します。 また、2 次元の配列を渡すこともできます。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $data = array(
     array('name' => 'foo', 'text' => 'Hi!'),
     array('name' => 'bar', 'text' => 'Hello!')
   );
   $affected_rows = $posql->insert('foo', $data);
   var_dump($affected_rows); 

このようにして渡すことにより、 メモリ領域を使用するかわりに、 大量のデータを追加する際に高速化がはかれます。

また、書き込み時に ctime, utime の特殊カラムにおいて値が変化します。 それぞれ、その時の time() 値がセットされます。

影響を受けた (挿入された) 列の数が返ります。


int Posql->update ( string table [, array row = array() [, mixed expr = true ] ] ) ;
対象のテーブルのデータを変更します。

対象のデータベースにおいて、 引数 table をテーブルとし、 引数 expr が 真 になる列を 引数 row の値どおりに変更 (アップデート) します。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $data = array('name' => 'bar');
   $expr = 'rowid = 1';
   $affected_rows = $posql->update('foo', $data, $expr);
   var_dump($affected_rows); 

引数 expr が SQL ステートメント上での WHERE 句 になります。 expr のデフォルト値は TRUE です (すべて更新されます)。

更新された列において、 特殊カラム utime の値が変化します。 その時の time() 値がセットされます。

影響を受けた (変更された) 列の数が返ります。


int Posql->delete ( string table [, mixed expr = false ] ) ;
対象のテーブルのデータを削除します。

対象のデータベースにおいて、 引数 table をテーブルとし、 引数 expr が 真 (TRUE) になる列を 物理削除します。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $expr = 'rowid = 1';
   $affected_rows = $posql->delete('foo', $expr);
   var_dump($affected_rows); 

引数 expr が SQL ステートメント上での WHERE 句 になります。 expr のデフォルト値は FALSE です (削除されません)。

影響を受けた (削除された) 列の数が返ります。


int Posql->replace ( string table [, array row = array() ] ) ;
対象のテーブルに新規の列を追加または置換します。

replace メソッドは、引数も含め 基本的に insert() と同じです。 違いとして、 UNIQUE 制約違反が起こった場合 制約違反の原因となった既存の行は、 現在行の INSERT に先立って削除されます。 そのため、INSERT は常に行われコマンドは通常動作を続けます。 Posql の UNIQUE 制約違反は PRIMARY KEY の衝突です。 引数である配列 row のカラムが省略された場合は デフォルト値が使われます。 デフォルト値が存在しない場合は NULL になります。

影響を受けた列の数が返ります。 これは、削除、挿入された行の総数です。 もし返り値が 1 であれば、 行が 1 つ挿入され、削除された行はないという事になります。 もし返り値が 1 よりも大きければ、 新しい行が挿入される前に、 1 つまたはそれ以上の行が削除されたという事になります。


object Posql->select ( string table [, string columns = '*' [, mixed expr = true [, mixed group = null [, mixed having = true [, mixed order = null [, mixed limit = null ]]]]]] ) ;
対象のデータベースにおいて、テーブルからデータを取得します。

対象のデータベースにおいて、 第一引数 table をテーブルとし、 テーブルの列を走査し、引数 expr が 真 (TRUE) になる列を取得します。

戻り値は 結果セットを保持する Posql_Statement オブジェクトのインスタンスです。

select メソッドでは 結合 (JOIN) はできません。
テーブルを結合するには、 multiSelect() メソッド を使用します。

select メソッドは引数を 1 つの連想配列として渡すことができます。 引数が多いため、配列で渡すことは有用です。

   $args = array();
   $args['select'] = '*';
   $args['from']   = 'foo';
   $args['where']  = 'rowid = 1';
   $stmt = $posql->select($args);
   while ($row = $stmt->fetch()) {
     print_r($row);
   } 

上の例のように、キーを 句として 連想配列で渡すことができます。 配列のキーは、それぞれの『句』(例えば 'from') または 引数名 (例えば table) などが解釈できます。

columns は任意の評価式、カラム名を指定します。 複数指定する場合は、カンマ (,) 区切りで渡します。 columns が指定された場合は、指定されたカラム 以外を除いた配列が返ります。 また、結果セットは columns の並び順どおりになります。 columns に * を指定すると、 その 1 つの評価式は指定されたすべてのテーブルのすべてのカラムで置き換えられます。

expr は WHERE 句として扱われます。 expr が指定された場合、結果セットは expr の評価式が 真 (TRUE) となる列のみに限定されます。

group を指定すると、 結果セットの中の 1 つ以上の行を結合し、 出力時に 1 行とすることができます。 これは結果セットの中に集約関数がある場合、特に有用です。

having を指定することで、 group によってグループ化された結果セットを 評価式が真となるレコードのみに更に絞り込むことができます。 group を使用しないで having を使用することもできます。

order が指定された場合は、 結果セットは 指定されたカラムを基準に昇順 (ASC)、または降順 (DESC) にソートされます。

limit が指定された場合、 結果配列の数を limit 通りの数に限定された配列が返ります。 カンマ (,) で区切った値を指定すると、 結果セットのオフセット (,) 上限数 と、結果セットの先頭からスキップする行数を指定できます。

table (最初の引数) 以外は省略可能です。

結果は、下で解説する Posql_Statement クラスのインスタンスが返ります。

以下にいくつか例をあげます。 これらの例で使用されている 結果セットの取得方法は、 例を簡潔にするために 簡単な方法を使用しています。 結果セットの取得方法の詳細については、 fetch(), fetchAll(), fetchAllHTMLTable(), を参照してください。 (foo.db にはあらかじめ適当な列があることを想定します。)

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);

   $stmt = $posql->select('foo');
   print $stmt->fetchAllHTMLTable(); 

上の例は、条件式なしで全ての列が結果セットに含まれます。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array();
   $args['table'] = 'foo';
   $args['cols'] = 'name, text';
   $args['expr'] = "name = 'foo'";

   $stmt = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、name というカラムが 'foo' という値に限定された結果になります。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array(
     'from' => 'foo',
     'col'  => 'COUNT(*)'
   );
   $stmt = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、全ての列数が結果セットに含まれます。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array(
     'from' => 'foo',
     'cols' => 'COUNT(*) AS cnt'
   );
   $stmt = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、全ての列数を cnt という別名として結果セットに含みます。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array();
   $args['from'] = 'foo';
   $args['select'] = 'name, MAX(rowid) AS max_rowid';
   $args['group'] = 'name';
   $stmt = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、rowid の最大値を name カラムでグループ化し、取得します。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array();
   $args['from'] = 'foo';
   $args['order'] = 'utime DESC, ctime DESC';
   $stmt = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、全ての列を取得し、 それを utime, ctime の順で降順にソートした結果セットが返ります。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $args = array();
   $args['table'] = 'foo';
   $args['order'] = 'rowid';
   $args['limit'] = 1;
   $args['offset'] = 2;
   $result = $posql->select($args);
   print $stmt->fetchAllHTMLTable(); 

上の例は、オフセット 2 、 上限値 1 として結果を限定します。


object Posql->multiSelect ( string tables [, string columns = '*' [, mixed expr = true [, mixed group = null [, mixed having = true [, mixed order = null [, mixed limit = null ]]]]]] ) ;
対象のデータベースにおいて、複数のテーブルからデータを取得します。

対象のデータベースにおいて、 第一引数 tables を複数のテーブルとし、 データベースの列を走査し、引数 expr が 真 (TRUE) になる列を 結合し、連想配列として取得します。

multiSelect() メソッドも select() メソッドと同様に 引数を 1 つの連想配列として渡すことができます。 引数が多いため、配列で渡すことは有用です。

   $args = array();
   $args['select'] = '*';
   $args['from']   = 'foo LEFT JOIN bar ON foo.col = bar.col';
   $args['order']  = 'rowid DESC';

   $stmt = $posql->multiSelect($args);
   while ($row = $stmt->fetch()) {
     print_r($row);
   } 

select メソッドとの違いは、tables に複数のテーブルを指定することです。 複数のテーブルは 結合演算子 (JOIN 等) を使用して結合します。

戻り値は 結果セットを保持する Posql_Statement クラスのインスタンスです。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $data = array(
     array('name' => 'foo', 'text' => 'Hi!'),
     array('name' => 'bar', 'text' => 'Hello!')
   );
   $affected_rows = $posql->insert('foo', $data);

   $posql->createTable('bar', $defaults);
   if ($posql->isError()) {
     die($posql->lastError());
   }

   $data = array(
     'name' => 'bar',
     'text' => 'hi, bar!'
   );
   $posql->insert('bar', $data);
   if ($posql->isError()) {
     die($posql->lastError());
   }

   $tables = 'foo LEFT JOIN bar USING(name)';
   $stmt = $posql->multiSelect($tables);
   print $stmt->fetchAllHTMLTable(); 

上の例では、USING(name) を使用して 結合します。


int Posql->count ( string table [, mixed expr = true ] ) ;
対象のデータベースにおいて、テーブルの列数を取得します。

カレントのデータベースにおいて、 引数 table をテーブルを対象とし、 データベースの列を走査し、 引数 expr が 真 (TRUE) になる列数を数値で取得します。

count メソッドは、 SELECT COUNT(*) のショートカットと扱えます。

列のカウント数が数値 (int) として返ります。

   $defaults = array(
     'name' => '',
     'text' => ''
   );
   $posql = new Posql('foo.db', 'foo', $defaults);
   $data = array(
     array('name' => 'foo', 'text' => 'Hi!'),
     array('name' => 'bar', 'text' => 'Hello!')
   );
   $affected_rows = $posql->insert('foo', $data);
   printf('<p>affected_rows: %d</p>', $affected_rows);
   $count = $posql->count('foo');
   printf('<p>count: %u</p>', $count); 

上の例は、テーブル foo の全ての列数を取得し、表示します。


object Posql->describe ( [ string table = null ] ) ;
対象のデータベースにおいて、テーブル情報を取得します。

カレントのデータベースにおいて、 引数 table をテーブルを対象とし、 テーブルの情報を連想配列で取得します。 table が省略されると すべてのテーブルの情報を取得します。

テーブル名が指定されると、 結果セットには そのテーブルのカラム名、 CREATE TABLE 時の DEFAULT 制約の値が含まれます。

戻り値は 結果セットを保持する Posql_Statement クラスのインスタンスです。

   $posql = new Posql('foo.db');
   $stmt = $posql->describe();
   var_dump($stmt->fetchAll()); 

上の例は、データベース foo.db の各情報を出力します。


mixed Posql->queryf ( string query [, mixed parameter [, mixed ... ] ] ) ;
sprintf() 形式でフォーマットした SQL ステートメントを実行する。

queryf メソッドは、query() メソッドと、 sprintf() 関数を合わせたようなものです。 第一引数を フォーマット文字列、 次の引数はフォーマット文字列の引数 (変換指定子) となり、 その次の引数は、 次の変換指定子となります。 つまり可変引数になります。 引数を 1 つのみで呼び出すと、 query() メソッドを呼び出したことと同じ動作になります。

戻り値は query() メソッドと同じく、 SELECT コマンドのような結果セットが配列となる場合は すべての結果セットを保持する Posql_Statement クラスのインスタンスが返ります。 列を操作するような (INSERT, UPDATE 等の) コマンドの場合は、 影響を受けた列の数が返ります。

queryf() メソッドは sprintf() 関数の フォーマットの変換指定子のほかに、 いくつか拡張した変換指定子が利用できます。

  1. オプションの精度指定子。 これは、文字列に対して切り捨て位置として働きます。 この文字数を超える文字を切り捨てられます。 単位は Byte 単位で扱われます。 マルチバイトに対しても適切に処理されます。
  2. オプションのパディング指定子。 これは、文字列が正しい長さになるまで どんな文字で埋めるかということを指定します。 デフォルトではドット (.) で埋められます。 1 つのドットを置くと、 3 つのドット (...) に変換されます。 これ以外のパディング文字を指定するには、 次の型指定子の前に任意の文字を指定します。 その文字の前に シングルクォート (') を置くと、 パーサーのヒントになるかもしれません。
  3. 型指定子。引数を何の型として扱うかを指定します。 拡張された型を以下に示します。 それ以外の型は sprintf() の型と同等に扱うことができます。
%
パーセント (%) 文字。 パーセント文字を表すには 2 つのパーセント文字 (%%) を使用します。
a
引数の型を自動で解釈し、文字列の場合は適切にエスケープします。 これは、エスケープが必要な場合 もっとも簡単な方法です。
B
引数をバイナリ文字列と扱い、base64 形式でエンコードします。 エンコードされた文字列を base64_decode('encoded_string') のように SQL ステートメントに変換します。 これは、あらゆる文字列を崩さずに 使用することが可能となります。 特に、BLOB のようなデータに有用です。
n
引数を numeric (数えられる値) として扱います。 PHP の整数の限界を超えるような大きな数値に対しては、 引用符で囲い、数値文字列として扱われるようにします。
s
sprintf() フォーマットの s とほとんど同じです。 違うところは、フォーマット変換指定子 自体が引用符で囲われていた場合、 なおかつ、引数の実態も引用符でエスケープされていた場合、 2 重で エスケープされてしまっているのを 1 重の引用符に修正します。
q
引数を文字列と扱い、シングルクォート (') で囲います。 引数の値は、quote() メソッドによって適切にエスケープされます。
   $posql = new Posql('foo.db');
   $sql = "SELECT * FROM %s WHERE strlen(%s) == %1n OR %s = %q";
   $stmt = $posql->queryf($sql, "foo", "bar", 123456789, "baz", "value");
   var_dump($stmt->fetchAll());
   // It is to be converted as follows.
   //     "SELECT * FROM foo WHERE strlen(bar) == 1 OR baz = 'value'"; 

上の例は、123456789 が、%1n によって 1 に変換されています。 また、 value に対して引用符でクォートされています。

   $posql = new Posql('foo.db');
   $sql = "INSERT INTO foo (name, text) VALUES (%10n, %.10q)";
   $ret = $posql->queryf($sql, "123456789123456789", str_repeat("abc", 100));
   var_dump($ret);
   // It is to be converted as follows.
   //     "INSERT INTO foo (name, text) VALUES (1234567891, 'abcabc...')"; 

上の例は、"123456789123456789" (18 桁) が、%10n によって 10 桁 に変換されています。 また、 str_repeat("abc", 100) (300 Bytes) に対して %.10q を使用することで、 'abcabc...' となり、 ドット(.) をあわせても 10 Bytes 以下に変換されています。

   // example: handle binary data
   $posql = new Posql('foo.db');
   $posql->createTable('image', array('name' => '', 'type' => '', 'data' => ''));
   $path = "http://example.com/hoge.gif";
   $type = "image/gif";
   $name = "hoge.gif";
   $sql = "INSERT INTO image (name, type, data) VALUES(%q, %q, %B)";
   $ret = $posql->queryf($sql, $name, $type, file_get_contents($path));
   // it will be like convert below
   // "INSERT ... VALUES('hoge.gif', 'image/gif', base64_decode('omit...'))"; 

上の例は、%B を使用することで BLOB を base64 で一旦エンコードしてから、 パーサーに渡す文字列は 自動的にデコードされるように変換されます。

   $posql = new Posql('foo.db');
   $sql = "INSERT INTO foo (text) VALUES (%q)";
   $ret = $posql->queryf($sql, "I'm feeling happy!");
   var_dump($ret);
   // to  "INSERT INTO foo (text) VALUES ('I\'m feeling happy!')"; 

上の例は、 シングルクォート (') を含む文字列がエスケープされ、その文字列を 引用符で囲いクォートしています。


int Posql->exec (string query ) ;
SQL ステートメントを実行し、作用した行数を返します。

exec メソッドは INSERT, UPDATE のような、 結果セットを含まない SQL ステートメントを実行する際に使用します。

query() メソッドでも 同じ結果になる場合が殆どかもしれません。 このメソッドは必ず スカラー型 (数値) を返す点が異なります。 また、PDO との互換性のために実装されたメソッドでもあります。


object Posql->prepare ( string query ) ;
SQL ステートメントを実行する準備を行い、 SQL ステートメント オブジェクトを返します。

Posql_Statement::execute() メソッドによって実行される SQL ステートメントを準備します。 SQL ステートメントは、文が実行されるときに実際の値に置き換えられる 0 個もしくはそれ以上の名前 (:name) もしくは疑問符 (?) パラメータマークを含むことができます。

PDO と同等の扱いができます。

戻り値は、 SQL ステートメントを保持する Posql_Statement オブジェクトが返ります。

  $sql = 'SELECT name, colour, calories
          FROM fruit
          WHERE calories < :calories AND colour = :colour';
  $stmt = $posql->prepare($sql);
  $stmt->execute(array(':calories' => 150, ':colour' => 'red'));
  $red = $stmt->fetchAll();
  $stmt->execute(array('calories' => 175, 'colour' => 'yellow'));
  $yellow = $stmt->fetchAll(); 

上の例は、名前付きパラメータを用いて SQL ステートメントを準備します。

  $sql = 'SELECT name, colour, calories
          FROM fruit
          WHERE calories < ? AND colour = ?';
  $stmt = $posql->prepare($sql);
  $stmt->execute(array(150, 'red'));
  $red = $stmt->fetchAll();
  $stmt->execute(array(175, 'yellow'));
  $yellow = $stmt->fetchAll(); 

上の例は、疑問符パラメータを用いて SQL ステートメントを準備します。


string Posql->quote ( string string ) ;
query メソッド で使用するために文字列をエスケープします。

SQL ステートメントの中で 文字列が安全に処理できるようにエスケープします。

対象の文字列 string を渡します。 渡された値は、その型によって適切にエスケープされます。 文字列の場合は、引用符(') で囲われます。

エスケープされた文字列が返ります。


boolean Posql->vacuum ( void ) ;
データベースを物理的に最適化します。

vacuum メソッドは SQLite における拡張機能であり、 それは PostgreSQL における同様のコマンドをモデルにした機能であり、 その機能をモデルにした Posql の拡張機能です。 vacuum が実行されると、そのときに対象とされているデータベースを 物理的に最適化することとみなし、それを実行します。

vacuum は、スクリプトの終了時に自動的に呼ばれます。 何か特別な処理をしない限り、明示的に実行する必要はありません。

成功時に TRUE、失敗時に FALSE が返ります。


boolean Posql->beginTransaction ( void ) ;
トランザクションを初期化し、そのブロックを開始します。

トランザクションを開始します。 トランザクションブロックが開始された以降の SQL ステートメントは全て、 明示的な commit() もしくは rollBack() が実行されるまで、 単一のトランザクションブロックの中で実行されます。

Posql は Version 2.09 から、ロールバックやアトミックなコミットを伴う トランザクションをサポートしました。

トランザクションは、そのブロック間のデータベースの処理が 『全て実行される』か、『全て実行されない』かのどちらかになります。

Posql は現時点 (Version 2.17) では ネストしたトランザクションをサポートしていません。 トランザクションの中で別のトランザクションを開始しようとすると エラーになります。

トランザクション中の createDatabase(), dropDatabase() は例外であり、トランザクションのサポート対象にはなりません。

トランザクションのブロック内で 複数の SQL ステートメントを実行することは、 確実にデータの一貫性を保つために役立ちますが、 トランザクション開始時および終了時には 一時的に処理速度や、ディスク使用量に影響がでます。

Posql は現時点 (Version 2.17) で 一時ファイルを生成することはありません。 それはトランザクション時も同じで、 すべて 1 つのデータベース (ファイル) 内で 一時的なバックアップ領域や更新、削除領域を作り、処理しています。 そのため、とくにトランザクションでは処理速度の低下などに影響がでてしまいます。

データベースの操作時に、適切なロック処理 (排他処理) は自動的に行われます。 一貫性を保つための必要性がない限り、 Posql を扱う上でトランザクションは頻繁に行う必要ありません。

成功時に TRUE、失敗時に FALSE が返ります。


boolean Posql->commit ( void ) ;
beginTransaction() によって開始された トランザクションをコミットします。

現在のトランザクション ブロック内で行われた全ての処理を 恒久的なものとして確定し、 処理結果が全てデータベースに実際に反映され、トランザクションを終了します。

トランザクションをアボートするには rollBack() を使用してください。 トランザクションが開始されていない状態で commit() を実行しても特に問題はありませんが、エラーが発生します。

成功時に TRUE、失敗時に FALSE が返ります。


boolean Posql->rollBack ( void ) ;
データベースを現在のトランザクションが開始される前の状態に戻します。

beginTransaction() によって開始された トランザクションをロールバックし、 そのトランザクション ブロック内で行われた全ての更新を廃棄し、 トランザクションを終了します。

トランザクションを正常に終了させるには commit() を使用してください。 トランザクションが開始されていない状態で rollBack() を実行しても問題はありませんが、エラーが発生します。

成功時に TRUE、失敗時に FALSE が返ります。


object Posql->getPager ( [ number total_count = null [, number curpage = null [, number perpage = null [, number range = null ]]]] ) ;
ページャーを設定・取得します。

getPager メソッドは、 デフォルトで組み込まれているページャークラス Posql_Pager のオブジェクトインスタンスを設定・取得します。

引数 total_count は、列の総数を渡します。 引数 curpage は、現在のページ番号を渡します。 引数 perpage は、1 ページ内のアイテム数を渡します。 引数 range は、ウィンドウ内のページャーリンクの個数を渡します。

ページャーのページ番号は 1 から始まります。

Posql_Pager オブジェクトのインスタンスが返ります。

Posql_Pager クラスのプロパティは以下のように構成されています。


number Posql_Pager->totalCount
引数 total_count として渡した列の総数
number Posql_Pager->currentPage
引数 curpage として渡した現在のページ番号
number Posql_Pager->perPage
引数 perpage として渡した 1 ページ内のアイテム数
number Posql_Pager->range
引数 range として渡した ウィンドウ内のページャーリンクの個数
number Posql_Pager->totalPages
ページの総数
array Posql_Pager->pages
表示すべきページャーのリンク番号リストを持つ配列
number Posql_Pager->startPage
ウィンドウ内の最初のページ番号
number Posql_Pager->endPage
ウィンドウ内の最後のページ番号
number Posql_Pager->prev
1 つ前のページ番号
number Posql_Pager->next
1 つ次のページ番号
number Posql_Pager->offset
SELECT ステートメントで使用するための OFFSET
number Posql_Pager->limit
SELECT ステートメントで使用するための LIMIT

以下はページャーの設置例です。

  <?php
  $posql = new Posql('pager_sample');
  $sql = "CREATE TABLE IF NOT EXISTS pages (
    id  INTEGER PRIMARY KEY,
    msg TEXT
  )";
  $posql->exec($sql);
  $stmt = $posql->query("SELECT COUNT(*) FROM pages");
  $count = $stmt->fetchColumn(0);
  if (!$count) {
    // 1000 件インサート
    $data = array();
    for ($i = 1; $i <= 1000; $i++) {
      $data[] = array(
        'msg' => sprintf('current page is %d.', $i)
      );
    }
    $count = $posql->insert('pages', $data);
  }
  $curpage = 1;
  if (isset($_GET['page']) && is_numeric($_GET['page'])) {
    $curpage = $_GET['page'];
  }
  // 1 ページに表示する件数
  $perpage = 5;

  // ページ内のリンクの個数
  $range = 10;

  // ページャーを生成
  $pager = $posql->getPager($count, $curpage, $perpage, $range);

  // データを取得
  $sql = "SELECT * FROM pages LIMIT ? OFFSET ?";
  $stmt = $posql->prepare($sql);
  $stmt->execute(array($pager->limit, $pager->offset));
  $stmt->setFetchMode('assoc');
  ?>
  <html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Posql Pager Sample</title>
  <style>
  * {
    font-family: verdana;
  }
  .pager li {
    display: block;
    float: left;
    margin: 5px;
    padding: 0;
    border: 1px solid #999;
  }
  .pager a {
    display: block;
    margin: 0;
    padding: 4px 8px;
    font-size: x-small;
    text-decoration : none;
    color: #333;
  }
  .pager a:hover {
    color: #333;
    background: #ccccff;
    text-decoration: none;
  }
  </style>
  </head>
  <body>
  <h1>Posql Pager Sample</h1>
  <hr>
  <?php while ($row = $stmt->fetch()): ?>
  <div>
    <?php printf('id:%d msg:%s', $row['id'], $row['msg']) ?>
  </div>
  <hr>
  <?php endwhile; ?>

  <?php /* ここからページャー */ ?>
  <ul class="pager">

  <?php if ($pager->currentPage != 1): ?>
    <li><a href="index.php?page=1">&lt;&lt;</a></li>
  <?php endif; ?>

  <?php if ($pager->prev): ?>
    <li><a href="index.php?page=<?php echo $pager->prev ?>">&lt;</a></li>
  <?php endif; ?>

  <?php foreach ($pager->pages as $page): ?>
    <li><a href="index.php?page=<?php echo $page?>"><?php echo $page?></a></li>
  <?php endforeach; ?>

  <?php if ($pager->next): ?>
    <li><a href="index.php?page=<?php echo $pager->next ?>">&gt;</a></li>
  <?php endif; ?>

  <?php if ($pager->currentPage != $pager->totalPages): ?>
    <li><a href="index.php?page=<?php echo $pager->totalPages ?>">&gt;&gt;</a></li>
  <?php endif; ?>

  </ul>
  <?php /* ここまでページャー */ ?>
  </body>
  </html>
 

number Posql->lastInsertId ( void ) ;
直近に挿入されたレコードの rowid の値を取得します。

Posql データベース に直近に挿入されたレコードの rowid の値を返します。 接続上において、まだ挿入されていない場合は NULL が返ります。

このメソッドで返される値は、下で解説する getLastInsertId() と同じです。 PDO との互換性のために提供されています。

index

Posql_Statement クラスのメソッド

Posql_Statement クラスは、 SQL ステートメントの結果セットの操作や バインドメカニズム (bind*) を可能とするクラスです。

Posql_Statement は PHP 5.1* から標準でバンドルされている PDO をモデルに設計されています。 PDO の詳細については、 PHP マニュアル (PDOStatement) を参照してください。
PDO との互換性 についての様々な操作に限らず、 PDO::FETCH_* 定数が Posql_Statement においても 同様に扱うことができます。


mixed Posql_Statement->fetch ( [ mixed fetch_mode = null [, mixed args_1 = null [, mixed args_2 = null ]]] ) ;
結果セットから次の行を取り出します。

引数 fetch_mode に 取得方法を指定することができます。 取得方法には、文字列で直接指定することができます。(例: 'ASSOC') 文字列で渡した際に 大文字小文字の区別はされません。
fetch_mode に、PDO::FETCH_* 定数を使用することも可能です。

引数 args_1, args_2 は、それぞれの取得方法に渡す引数を指定します。

主な取得方法として以下の値が利用可能です。 デフォルトの取得方法は 'BOTH' です。
'ASSOC'
PDO::FETCH_ASSOC
ASSOC は、結果セットに返された際のカラム名で添字を付けた配列を返します。
'BOTH'
PDO::FETCH_BOTH
結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。 BOTH はデフォルトの取得方法です。
'CLASS'
PDO::FETCH_CLASS
結果セットのカラムが クラス内の名前付けされたプロパティにマッピングされている、 要求されたクラスの新規インスタンスを返します。 最初の引数に クラス名 を指定します。 次の引数に クラスのコンストラクタに渡される引数を 配列で指定できます (省略可)。
'COLUMN'
PDO::FETCH_COLUMN
結果セットの次の行から指定された 一つのカラムのみを返します。 通常、その値はスカラー型になります。 引数に、行から処理したい 0 で始まるカラム番号、 または カラム名を文字列で指定することができます。 引数が省略された場合は 最初 (0 番目) のカラムが返ります。
'NUM'
PDO::FETCH_NUM
結果セットに返された際の 0 から始まるカラム番号を添字とする配列を返します。
'OBJ'
PDO::FETCH_OBJ
結果セットに返された際のカラム名と同名のプロパティを有する 匿名のオブジェクトを返します。

返り値は、取得形式によって異なります。 失敗した場合は FALSE を返します。

  $stmt = $posql->prepare('SELECT name, colour FROM fruit');
  $stmt->execute();

  print 'FETCH_ASSOC:';
  $result = $stmt->fetch('assoc'); // or PDO::FETCH_ASSOC
  var_dump($result);

  print 'FETCH_BOTH:';
  $result = $stmt->fetch('both'); // or PDO::FETCH_BOTH
  var_dump($result);

  print 'FETCH_COLUMN';
  $result = $stmt->fetch('column'); // or PDO::FETCH_COLUMN
  var_dump($result);

  print 'FETCH_OBJ';
  $result = $stmt->fetch('obj'); // or PDO::FETCH_OBJ
  var_dump($result); 

上の例は、いくつかの異なる取得方法で行を取得します。


mixed Posql_Statement->fetchAll ( [ mixed fetch_mode = null [, mixed args_1 = null [, mixed args_2 = null ]]] ) ;
全ての結果行を含む値を配列または文字列で取り出します。

引数 fetch_mode は、 上で解説されている fetch() メソッドと 同じ取得方法を指定することができます。
fetch_mode に PDO::FETCH_* 定数を渡すこともできます。

Posql では、拡張された取得方法として 'HTMLTable' を渡すことができます。 (大文字小文字の区別はされません)

'HTMLTable'
結果セットに含まれる全ての列を HTML <table> 要素として 文字列で取得します。

'HTMLTable' についての詳細は、下で解説する fetchAllHTMLTable() を参照してください。 結果として、このメソッドを使用した場合と同じになります。

返り値は、取得形式によって異なります。 失敗した場合は 空の配列 ( array() ) が返ります。

  $stmt = $posql->prepare('SELECT name, colour FROM fruit');
  $stmt->execute();
  $result = $stmt->fetchAll();
  var_dump($result); 

上の例は、結果セットに残っている全ての行を表示します。


string Posql_Statement->fetchAllHTMLTable ( [ mixed caption = null [, mixed attr = array('border' => 1) ]] ) ;
全ての結果行を HTML <table> 要素として文字列で取得します。

引数 caption に <caption> 要素を指定することができます。 引数 attr には、<table> 要素の属性 (attributes) が指定できます。 この 2 つの引数は、順序が異なっていても適切に処理されます。

列に含まれる 文字列は HTML 実体 (entity) として escapeHTML() メソッドによってエスケープされます。

返り値は、全ての列を含む table 要素の文字列です。

  $sql = "SELECT 1, NULL, TRUE, FALSE, 'hoge', 'I''m feeling happy!' AS happy";
  $stmt = $posql->prepare($sql);
  $stmt->execute();
  $result = $stmt->fetchAllHTMLTable($sql,
                                array(
                                    'border' => 1,
                                    'class'  => 'my-class',
                                    'style'  => array(
                                        'padding'    => '5px',
                                        'color'      => '#333',
                                        'background' => '#fff'
                                    )
                                )
  );
  print $result; 

上の例のように属性を設定することができます。 属性は 'border=1' のような文字列でも適応されます。


boolean Posql_Statement->execute ( [ array params = array() ] ) ;
プリペアドステートメントを実行します。

準備されたプリペアドステートメントを実行します。 引数 params を指定する場合は、 実行される SQL 文の中のバインドパラメータと同数の要素からなる 値の配列を渡します。

他のメソッドと同様に PDOStatement::execute() と同じ操作ができます。

成功すると TRUE, 失敗時に FALSE を返します。

  $sql = "SELECT * FROM foo WHERE name = ? OR rowid = ? ";
  $stmt = $posql->prepare($sql);
  $stmt->execute(array('foo', 1));
  print $stmt->fetchAll('HTMLTable'); 

上の例は、疑問符(?) プレースホルダ を伴う プリペアドステートメントを実行します。


boolean Posql_Statement->bindParam ( mixed param , mixed &var [, mixed type = null [, number length = null ]] ) ;
指定された PHP 変数にパラメータをバインドします。

準備された SQL ステートメント中で、 対応する名前 (:name) もしくは 疑問符 (?) プレースホルダに パラメータをバインドします。 bindValue() と異なり、 変数は参照としてバインドされ、 execute() がコールされたときのみ評価されます。

他のメソッドと同様に PDOStatement::bindParam() と同じ操作ができます。
※ 引数 type, length は実装されていません。指定しても単に無視されます。

成功すると TRUE, 失敗時に FALSE を返します。

  $calories = 150;
  $colour = 'red';
  $stmt = $posql->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
  $stmt->bindParam(':calories', $calories);
  $stmt->bindParam(':colour',   $colour);
  $stmt->execute(); 

上の例は、名前付けされたプレースホルダ (:name) を用いて バインドされた PHP 変数によって プリペアドステートメントを実行します。

  $calories = 150;
  $colour = 'red';
  $stmt = $posql->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
  $stmt->bindParam(1, $calories);
  $stmt->bindParam(2, $colour);
  $stmt->execute(); 

上の例は、疑問符 (?) プレースホルダを用いて バインドされた PHP 変数によって プリペアドステートメントを実行します。


boolean Posql_Statement->bindValue ( mixed param , mixed value [, mixed type = null [, number length = null ]] ) ;
指定された 値をパラメータにバインドします。

プリペアドステートメントで使用する SQL 文の中で、 対応する名前 (:name) あるいは疑問符 (?) のプレースホルダに値をバインドします。

他のメソッドと同様に PDOStatement::bindValue() と同じ操作ができます。
※ 引数 type, length は実装されていません。指定しても単に無視されます。

成功すると TRUE, 失敗時に FALSE を返します。

  $calories = 150;
  $colour = 'red';
  $stmt = $posql->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
  $stmt->bindValue(':calories', $calories);
  $stmt->bindValue(':colour', $colour);
  $stmt->execute(); 

上の例は、 名前付けされたプレースホルダ (:name) を用いて バインドされた値によって プリペアドステートメントを実行します。

  $calories = 150;
  $colour = 'red';
  $stmt = $posql->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
  $stmt->bindValue(1, $calories);
  $stmt->bindValue(2, $colour);
  $stmt->execute(); 

上の例は、疑問符 (?) プレースホルダを用いて バインドされた 値によって プリペアドステートメントを実行します。


boolean Posql_Statement->bindColumn ( mixed column , mixed &var [, mixed type = null [, number length = null ]] ) ;
指定された カラムを PHP 変数にバインドします。

SQL クエリからの結果セット中にある カラムにバインドされた 特定の値を取得するための準備をします。 fetch() もしくは fetchAll() がコールされる度に、 カラムにバインドされた全ての変数は更新されます。

注意: カラムに関する情報は ステートメントが実行 (execute) されるまで利用できません。

他のメソッドと同様に PDOStatement::bindColumn() と同じ操作ができます。
※ 引数 type, length は実装されていません。指定しても単に無視されます。

引数 column には、 結果セットに含まれる ( 1 から始まる) カラム番号 もしくはカラム名を指定します。 カラム名を使用する場合、 大文字小文字が一致する必要があります。

引数 var は、参照渡しとなり カラムがバインドされる PHP 変数を指定します。

成功すると TRUE, 失敗時に FALSE を返します。

  // Declare the variables beforehand.
  $id    = null;
  $name  = null;
  $utime = null;

  // Execute the prepare-statements
  $posql = new Posql('foo.db');
  $sql = "SELECT id, name, utime FROM foo";
  $stmt = $posql->prepare($sql);
  $stmt->execute();

  // Bind with the columns index 
  $stmt->bindColumn(1, $id);
  $stmt->bindColumn(2, $name);

  // Bind with the columns name
  $stmt->bindColumn('utime', $utime);

  // Loop by fetch
  while ($stmt->fetch()) {
    print '[id]    ' . $id;
    print '[name]  ' . $name;
    print '[utime] ' . $utime;
    print '<hr>';
  } 

上の例は、バインドした結果セットを PHP 変数に出力します。 (あらかじめ foo.db には何らかのデータがあることを想定します)


boolean Posql_Statement->setFetchMode ( [ mixed fetch_mode = null [, string args_1 = null [, array args_2 = null ]] ) ;
現在のステートメントにおけるフェッチモードを設定します。

setFetchMode メソッドでデフォルトフェッチモードを設定しておくと、 fetch(), fetchAll() をコールする際に引数を渡す必要がなくなります。 引数 fetch_mode で設定されたフェッチモードがデフォルトとなり、 各フェッチメソッドに設定が引き継がれます。

引数 fetch_mode に 取得方法を指定することができます。 取得方法には、文字列で直接指定することができます。(例: 'ASSOC') 文字列で渡した際に 大文字小文字の区別はされません。
fetch_mode に、PDO::FETCH_* 定数を使用することも可能です。

引数 args_1, args_2 は、 それぞれの取得方法に渡す引数を指定することができます。

他のメソッドと同様に PDOStatement::setFetchMode() と同じ操作ができます。

成功すると TRUE, 失敗時に FALSE を返します。

  class Posql_Fetch_Class_Sample {
    function Posql_Fetch_Class_Sample($arg1 = null, $arg2 = null){
      print ' new Posql_Fetch_Class_Sample(';
      var_dump($arg1);
      var_dump($arg2);
      print ')';
    }
  }

  $posql = new Posql;
  $sql = "SELECT 1 c1, 2 c2, 3 c3
          UNION
          SELECT 4, 5, 6
          UNION
          SELECT 7, 8, 9
          UNION
          SELECT 10, 11, 12
          UNION
          SELECT 13, 14, 15";
  $stmt = $posql->prepare($sql);
  $stmt->execute();

  print 'FETCH_ASSOC:';
  $stmt->setFetchMode('assoc'); // or PDO::FETCH_ASSOC
  $result = $stmt->fetch();
  var_dump($result);

  print 'FETCH_BOTH:';
  $stmt->setFetchMode('both'); // or PDO::FETCH_BOTH
  $result = $stmt->fetch();
  var_dump($result);

  print 'FETCH_COLUMN';
  $stmt->setFetchMode('column'); // or PDO::FETCH_COLUMN
  $result = $stmt->fetch();
  var_dump($result);

  print 'FETCH_OBJ';
  $stmt->setFetchMode('obj'); // or PDO::FETCH_OBJ
  $result = $stmt->fetch();
  var_dump($result);

  print 'FETCH_CLASS';
  $stmt->setFetchMode('class', // or PDO::FETCH_CLASS
                      'Posql_Fetch_Class_Sample',
                      array('arg1_sample', 'arg2_sample'));
  $result = $stmt->fetch();
  var_dump($result);

上の例は、いくつかの異なる取得方法で行を取得します。


mixed Posql_Statement->fetchColumn ( [ mixed column_key = 0 ] ) ;
結果セットの次行から単一カラムを取り出します。

引数 column_key には、 行から処理したい 0 から始まるカラム番号、 または文字列でカラム名を指定します。 省略された場合は最初のカラムをフェッチします。

行がもうない場合は FALSE を返します。

fetchColumn メソッドは、 fetch('column', column_key); と指定してフェッチしたことと同じです。

他のメソッドと同様に PDOStatement::fetchColumn() と同じ操作ができます。


mixed Posql_Statement->fetchObject ( [ mixed class_name = null [, array class_args = null ]] ) ;
結果セットから次の行を取り出し、それをオブジェクトとして返します。

引数 class_name には、生成するクラス名を渡します。 引数 class_args には、クラスのコンストラクタに与えたい引数を配列で渡します。

class_name のデフォルトは stdClass です。

行がもうない場合、あるいはエラー時に FALSE を返します。

fetchObject メソッドは、
fetch('class', class_name, class_args);
または
fetch('object'); と指定してフェッチしたことと同じです。

他のメソッドと同様に PDOStatement::fetchObject() と同じ操作ができます。


number Posql_Statement->rowCount ( void ) ;
直近の SQL ステートメントによって作用した行数を返します。

rowCount は 相当する ステートメント オブジェクトによって実行された 直近の DELETE, INSERT, UPDATE 文によって作用した行数を返します。

他のメソッドと同様に PDOStatement::rowCount() と同じ操作ができます。


number Posql_Statement->columnCount ( void ) ;
結果セット中のカラム数を返します。

ステートメント オブジェクトに相当する結果セットにあるカラム数を返します。

他のメソッドと同様に PDOStatement::columnCount() と同じ操作ができます。


その他

Posql_Statement クラスは PDO (PDOStatement) と互換性がありますが、 PEAR::MDB2 と互換性のあるメソッドも含まれています。 このドキュメントでは解説されていませんが、 getColumnNames(), fetchRow(), numRows(), numCols(), hasRows(), free() 等のメソッドが利用できます。

より詳しい情報については、ソースコード 内の Posql_Statement クラスを参照してください。

index

Posql_Charset クラスのメソッド

Posql_Charset クラスは、文字コードを扱うライブラリです。 拡張モジュール mbstring, iconv の順で、 どちらかが有効であれば優先して使い、どちらも無効の場合は PHP コードで書かれた独自メソッドを使い文字コードの判別を行います。

mbstring ライブラリは、特定の Unicode (UTF-16, UTF-32) に対応していなかったり、サロゲートペアの妥当性があったりします。 iconv ライブラリは、正当な文字しか認識しないため 不正なキャラクタが現れるとエラーを発生させたりします。 Posql_Charset クラスは、それぞれの特徴を補完して 文字コードを判断、もしくは変換します。

mbstring では 'SJIS-win'、 iconv では 'CP932' (SJIS-open) という違いについても Posql_Charset クラスは広くマッピングし、 どちらの指定でも対応できる実装をしています。

Posql_Charset クラスは、Posql のインスタンスから pcharset としてアクセスできるため、
メソッドの定義には Posql->pcharset->method() と表現します。

index

string Posql->pcharset->detectEncoding ( string string [, mixed encodings = 'auto' ] ) ;
引数 string の文字コードを検出します。

引数 encodings が単一の文字コードを示す文字列で渡されると、 その文字コードかどうかが検出されます。 encodings が省略されるか、'auto' として渡されると 自動で文字コードを検出します。 'auto' の大文字小文字の区別はされません。 複数の文字コードを指定するには、配列 またはカンマ(,) で区切った文字列で指定します。

検出された文字コードが返ります。 失敗またはエラー時に FALSE が返ります。

以下は、戻り値となる文字コードのリストです。

  1. ASCII
  2. EUC-JP
  3. SJIS
  4. JIS (ISO-2022-JP)
  5. ISO-8859-1
  6. UTF-8
  7. UTF-16
  8. UTF-16BE
  9. UTF-16LE
  10. UTF-32
  11. BIG5
  12. EUC-CN (GB2312)
  13. EUC-KR (KS-X-1001)
  14. Binary

string Posql->pcharset->convert ( string string [, string to = 'UTF-8' [, string from = 'auto' ]] ) ;
文字エンコーディングを変換して返します。

引数はすべて文字列として扱います。 引数 string を 文字エンコーディング from から to に変換して返します。

引数 to を省略すると 'UTF-8' に変換されます。 引数 from を省略、または 'auto' を渡すと 自動で内部文字エンコーディングを検出し、to に変換します。 'auto' の大文字小文字の区別はされません。

拡張モジュール mbstring が有効なら、 mb_convert_encoding() を使います。mbstring が無効で 拡張モジュール iconv が有効の場合は iconv() によって変換されます。 変換できなかった場合は FALSE が返ります。

このメソッドは、mb_convert_encoding() と同じ引数の渡しかたができます。

  $posql = new Posql;
  $encodings = array(
    'EUC-JP',
    'SJIS',
    'JIS',
    'UTF-8',
    'UTF-16',
    'UTF-32'
  );
  $string = 'あいうえおabcdef';
  foreach ($encodings as $charset) {
    $string   = $posql->pcharset->convert($string, $charset);
    $encoding = $posql->pcharset->detectEncoding($string);
    $result   = array(
      "to_encoding"      => $charset,
      "detect_encoding"  => $encoding,
      "converted_string" => $string
    );
    // All right, if "to_encoding" equaled "detect_encoding".
    print "<pre>";
    var_dump($result);
    print "</pre>";
  } 
index

Posql_ECMA クラスのメソッド

Posql_ECMA クラスは、 PHP 上で JavaScript の関数・メソッドを互換実装したクラスです。 (ECMA-262 3rd edition)

Posql Version 2.17 現在、 UTF-8 での妥当性を確認しています。

ソースのほとんどは、 SpiderMonkey からヒントを得ています。

Posql_ECMA は、PHP と JavaScript 間の値の渡し合い、 連携を行う際に有用かつ便利なライブラリです。

Posql_ECMA クラスは、Posql のインスタンスから プロパティ ecma としてアクセスできるため、
メソッドの定義には Posql->ecma->method() と表現します。

なお、ドキュメントに不足と思われる項目については Core JavaScript リファレンス から参照ください。

index

string Posql->ecma->charAt ( string string [, number index = 0 ] ) ;
指定された添え字の文字を返します。
パラメータ
string
対象の文字列。
index
0 と文字列の長さの間の整数。

文字列における文字は左から右の方向にインデックス化されます。 一番最初の文字のインデックスは 0 です。 与える index が範囲外の場合、空文字列を返します。

以下の例は、'c' という文字列を返します。

  $posql = new Posql;
  echo $posql->ecma->charAt('abcde', 2);

number Posql->ecma->charCodeAt ( string string [, number index = 0 ] ) ;
与えられた添え字の文字の Unicode の値を示す数を返します。
パラメータ
string
対象の文字列。
index
0 と文字列の長さの間の整数。指定されなかった場合のデフォルトは 0 です。

Unicode コードポイントの範囲は、0 から 1,114,111 (0x10FFFF) です。 最初の 128 の Unicode コードポイントは、ASCII 文字エンコーディングに直接対応しています。 charCodeAt は常に 65,536 (2 の16乗) より小さい値を返すであろうことに注意してください。 与えられたインデックスが 0 と 文字列の長さの間にない場合、charCodeAt は NaN を返します。


string Posql->ecma->fromCharCode ( number num [, number ... ] ) ;
Unicode の値の指定されたシーケンスによって生成された文字列を返します。
パラメータ
num ...
Unicode の値の数のシーケンス。

Unicode の値の指定のシーケンスを使用することによって生成された文字列を返します。

以下の例は、'ABC' という文字列を返します。

  $posql = new Posql;
  echo $posql->ecma->fromCharCode(65, 66, 67);

number Posql->ecma->indexOf ( string string , string search [, number offset = 0 ] ) ;
文字列の中で、指定された値が最初に現れる添え字を返します。 指定された値が見つからない場合は、-1 を返します。
パラメータ
string
対象の文字列。
search
検索する値を表す文字列。
offset
呼び出す文字列内の検索を始めるための位置。 0 とその文字列の長さの間にある整数を指定できます。デフォルトの値は 0 です。

文字列 string の中で、 指定された値 search が最初に現れたインデックスを返します。 offset から検索を始め、値が見つけられない場合、-1 を返します。 最初の文字の位置は 0 です。

  $posql = new Posql;
  echo $posql->ecma->indexOf('abcde', 'a');    // output: 0
  echo $posql->ecma->indexOf('abcde', 'c');    // output: 2
  echo $posql->ecma->indexOf('abcde', 'c', 2); // output: 2

number Posql->ecma->lastIndexOf ( string string , string search [, number offset = 0 ] ) ;
文字列の中で、指定された値が最後に現れる添え字を返します。 指定された値が見つからない場合は、-1 を返します。
パラメータ
string
対象の文字列。
search
検索する値を表す文字列。
offset
呼び出す文字列内の検索を始めるための位置。 0 とその文字列の長さの間にある整数を指定できます。 デフォルトの値は 0 です。

文字列 string の中で、 指定された値が最後に現れるインデックスを返します。 値が見つけられない場合、-1 を返します。 呼び出す文字列は、offset から検索を始め、逆方向に検索されます。 最初の文字の位置は 0 です。

  $posql = new Posql;
  echo $posql->ecma->lastIndexOf('foobarbaz', 'a');    // output: 7
  echo $posql->ecma->lastIndexOf('foobarbaz', 'z');    // output: 8
  echo $posql->ecma->lastIndexOf('foobarbaz', 'a', 5); // output: 4
  echo $posql->ecma->lastIndexOf('foobarbaz', 'x');    // output: -1

number Posql->ecma->length ( string string ) ;
文字列の長さを Unicode 単位の文字数で返します。
パラメータ
string
対象の文字列。

length は JavaScript/ECMAScript では、 プロパティですが、メソッドとして実装されています。

文字列における文字の数を Unicode 単位で返します。 空文字列の場合、length は 0 です。

  $posql = new Posql;
  echo $posql->ecma->length('abcdef');    // output: 6
  echo $posql->ecma->length('あいう');    // output: 3

string Posql->ecma->slice ( string string , number begin [, number end = null ] ) ;
文字列の一部分を取り出し、新しい文字列を返します。
パラメータ
string
対象の文字列。
begin
取り出しを開始する、0 から始まるインデックス。
end
取り出しを終了する、0 から始まるインデックス。 省略された場合、slice メソッドは、文字列の最後までを取り出します。

slice メソッドは、1 つの文字列からテキストを取り出し、新しい文字列を返します。 一方の文字列におけるテキストへの変更は、他の文字列に影響を与えません。 slice メソッドは、end を含まずにテキストを取り出します。 slice($string, 1, 4) は、2 番目から 4 番目までの文字 (1 番目、2 番目、3 番目にインデックスされた文字) を取り出します。 負の数のインデックスを指定したときは、end は文字列の最後からのオフセットを示します。 slice($string, 2, -1) は、3 番目の文字から、 文字列の最後の文字から数えて 2 番目の文字までを取り出します。

  $posql = new Posql;
  echo $posql->ecma->slice('abcdef', 1);      // output: bcdef
  echo $posql->ecma->slice('abcdef', -2);     // output: ef
  echo $posql->ecma->slice('abcdef', 2, 4);   // output: cd
  echo $posql->ecma->slice('abcdef', -2, 5);  // output: e

array Posql->ecma->split ( string string , string separator [, number limit = -1 ] ) ;
文字列を複数の部分文字列に区切り、文字列を配列に分割します。
パラメータ
string
対象の文字列。
separator
文字列を区切ることに使用するための文字を指定します。
limit
見つかった分割結果の数の制限を指定する整数。

split メソッドは、新しい配列を返します。 split メソッドが新しい配列を文字列から取り出すとき、 separator は文字列から削除され、部分文字列から成る配列が返ります。 separator が空の文字列 ('') であるとき、 split メソッドは、空の配列ではなく、1 つの空文字列を含む配列を返します。

  $posql = new Posql;
  var_export($posql->ecma->split('foo bar baz', ' '));
  // output:
  //  array ( 0 => 'foo', 1 => 'bar', 2 => 'baz', )

  var_export($posql->ecma->split('foo bar baz', 'a'));
  // output:
  //  array ( 0 => 'foo b', 1 => 'r b', 2 => 'z', )

  var_export($posql->ecma->split('foo bar baz', ''));
  // output:
  //  array ( 0 => 'f', 1 => 'o', 2 => 'o', 3 => ' ', 
  //          4 => 'b', 5 => 'a', 6 => 'r', 7 => ' ', 
  //          8 => 'b', 9 => 'a', 10 => 'z', )

string Posql->ecma->substr ( string string , number start [, number length = null ] ) ;
文字列において、指定された位置から指定された文字数の文字を返します。
パラメータ
string
対象の文字列。
start
文字を取り出す位置 ( 0 から文字列の長さ以下までの整数)。
length
取り出す文字の数。

start は文字のインデックスです。 一番最初の文字のインデックスは 0 で、 最後の文字のインデックスは、文字列の長さから 1 を引いた数です。 substr は start から文字の取り出しを開始し、length 個の文字を集めます (start から文字列の最後までの長さが指定した length より短かった場合は、 length より少ない数の文字を返します)。

start が正の数かつ文字列の長さ以上である場合、substr は空の文字列を返します。 start が負の数である場合、substr はそれを文字列の最後から数えた文字のインデックスとして使用します。 start が負の数かつ start の絶対値が文字列の長さより大きい場合、 substr は開始インデックスとして 0 を使用します。

length が 0 あるいは負の数の場合、 substr は空の文字列を返します。 length が省略された場合、start から文字列の最後までの文字を取り出します。

  $posql = new Posql;

  $string = 'abcdefghij';
  var_dump($posql->ecma->substr($string, 1, 2));   // output: 'bc'
  var_dump($posql->ecma->substr($string, -2, 2));  // output: 'ij'
  var_dump($posql->ecma->substr($string, 1));      // output: 'bcdefghij'
  var_dump($posql->ecma->substr($string, -20, 2)); // output: 'ab'
  var_dump($posql->ecma->substr($string, 20, 2));  // output: ''

string Posql->ecma->substring ( string string , number begin [, number end = null ] ) ;
文字列において、文字列内の 2 つの添え字の間にある文字を返します。
パラメータ
string
対象の文字列。
begin
0 と 文字列の長さから 1 引いた数の間にある整数。
end
(任意) 0 と文字列の長さの間にある整数。

substring は begin から end 未満の文字を取り出します。特に、

  • begin が end と等しい場合、 substring は空の文字列を返します。
  • end が省略された場合、substring は文字列の最後までの文字を取り出します。
  • 両方の引数が 0 未満、あるいは、 数字ではないデータ型 (NaN) だった場合、 それは 0 だったものとして扱われます。
  • 両方の引数が string の length より大きかった場合、 それは string の length だったものとして扱われます。

begin が end より大きかった場合、substring は 2 つの引数が交換されたものとして実行されます。
例えば、substring($string, 1, 0) == substring($string, 0, 1) です。

  $posql = new Posql;

  $string = 'abcdefghij';
  var_dump($posql->ecma->substring($string, 1));     // output: 'bcdefghij'
  var_dump($posql->ecma->substring($string, -2));    // output: 'abcdefghij'
  var_dump($posql->ecma->substring($string, 2, 5));  // output: 'cde'
  var_dump($posql->ecma->substring($string, 5, 2));  // output: 'cde'
  var_dump($posql->ecma->substring($string, -2, 5)); // output: 'abcde'
  var_dump($posql->ecma->substring($string, 0, 0));  // output: ''
  var_dump($posql->ecma->substring($string, 20, 2)); // output: 'cdefghij'

string Posql->ecma->toLowerCase ( string string ) ;
文字列の値を小文字に変換して返します。
パラメータ
string
対象の文字列。

toLowerCase メソッドは、小文字に変換された文字列の値を返します。 toLowerCase メソッドは、文字列の値、それ自身には影響を与えません。

  $posql = new Posql;
  var_dump($posql->ecma->toLowerCase('ABCdefG')); // output: 'abcdefg'

string Posql->ecma->toUpperCase ( string string ) ;
文字列の値を大文字に変換して返します。
パラメータ
string
対象の文字列。

toUpperCase メソッドは、大文字に変換された文字列の値を返します。 toUpperCase メソッドは、文字列の値、それ自身には影響を与えません。

  $posql = new Posql;
  var_dump($posql->ecma->toUpperCase('abcDEFg')); // output: 'ABCDEFG'

string Posql->ecma->toString ( mixed object ) ;
指定された値の文字列表現を返します。
パラメータ
object
対象の値。

引数で与えられた値を表す文字列を返します。

toString メソッドは、コードとして有効な表現を返すとは限りません。 文字列として表現を返すだけです。 JavaScript/ECMAScript との互換性のため提供されています。


string Posql->ecma->escape ( string string ) ;
文字列をエンコードします。
パラメータ
string
対象の文字列。

escape および unescape 関数は文字列をエンコードしたりデコードしたりします。 escape 関数は ISO Latin 文字セットで表された引数の 16 進エンコーディングを返します。 unescape は指定した 16 進エンコーディングの値に対する ASCII 文字列を返します。

escape および unescape 関数は 非 ASCII 文字に対しては正しく機能せず、非推奨です。 互換性のため提供されています。


string Posql->ecma->unescape ( string string ) ;
文字列をデコードします。
パラメータ
string
対象の文字列。

escape および unescape 関数は文字列をエンコードしたりデコードしたりします。 escape 関数は ISO Latin 文字セットで表された引数の 16 進エンコーディングを返します。 unescape は指定した 16 進エンコーディングの値に対する ASCII 文字列を返します。

escape および unescape 関数は 非 ASCII 文字に対しては正しく機能せず、非推奨です。 互換性のため提供されています。


string Posql->ecma->encodeURI ( string string ) ;
完全な URI の特定の文字のそれぞれを、 その文字の UTF-8 エンコーディングしたものを表すエスケープシーケンスに置き換えます。
パラメータ
string
対象の文字列。

特定の文字の実体を UTF-8 文字エンコーディングで表された 1 つ、2 つ、 あるいは、3 つのエスケープシーケンスに置き換えることで、 統一資源識別子 (Uniform Resource Identifier (URI)) をエンコードします。

URI は完全な URI であることが想定されます。 そして、URI において特別な意味を持つ予約された文字 (reserved characters) はエンコードされません。

encodeURI は、以下を除く全ての文字を 適切な UTF-8 エスケープシーケンスで置き換えます:
予約された文字
; , / ? : @ & = + $
エスケープされない文字
アルファベット、数字、- _ . ! ~ * ' ( )
スコア
#

encodeURI は、それ自身では、XMLHttpRequest などのための、 適切な HTTP GET 及び POST リクエストを作成できないことに注意してください。 なぜなら、encodeURI では、GET 及び POST リクエスト において特別な文字として扱われる、 '&', '+', '=' がエンコードされないからです。 ですが、encodeURIComponent は、 これらの文字をエンコードします。


string Posql->ecma->encodeURIComponent ( string string ) ;
URI の一部分の特定の文字のそれぞれを、 その文字の UTF-8 エンコーディングしたものを表すエスケープシーケンスに置き換えます。
パラメータ
string
対象の文字列。

特定の文字の実体を、UTF-8 文字エンコーディングで表された 1 つ、2 つ、あるいは、 3 つのエスケープシーケンスに置き換えることで、 統一資源識別子 (Uniform Resource Identifier (URI)) の要素をエンコードします。

URI は完全な URI であることが想定されます。 そして、URI において特別な意味を持つ予約された文字 (reserved characters) はエンコードされません。

encodeURIComponent は、 次を除く全ての文字をエスケープします: アルファベット、数字、- _ . ! ~ * ' ( )


string Posql->ecma->decodeURI ( string string ) ;
encodeURI でエンコードされた URI をデコードします。
パラメータ
string
対象の文字列。

encodeURI、 もしくはそれに類似したルーチンによって作成された 統一資源識別子 (Uniform Resource Identifier (URI)) をデコードします。

エンコードされた URI 内のエスケープシーケンスをそれぞれが表す文字に置き換えます。 encodeURI によってエンコードされていないであろうエスケープシーケンスは、デコードされません。


string Posql->ecma->decodeURIComponent ( string string ) ;
encodeURIComponent でエンコードされた URI をデコードします。
パラメータ
string
対象の文字列。

encodeURIComponent、 もしくはそれに類似したルーチンによって作成された 統一資源識別子 (Uniform Resource Identifier (URI)) の要素をデコードします。

エンコードされた URI の要素内のエスケープシーケンスをそれぞれが表す文字に置き換えます。

index

Posql_Archive クラスのメソッド

Posql_Archive クラスは、圧縮・解凍やアーカイブを扱うクラスです。

Posql Version 2.17 現在、 AlphamericHTML を実装しています。

AlphamericHTML は、 文字列を LZ77 アルゴリズムにより圧縮・解凍し、 エンコードされた値は英数字 [0-9A-Za-z_] (AlphamericString) のみからなる文字列になります。

Posql_Archive クラスは、Posql のインスタンスから プロパティ archive としてアクセスできるため、
メソッドの定義には Posql->archive->method() と表現します。

index

string Posql->archive->encodeAlphamericString ( string s ) ;
文字列を AlphamericString にエンコードします。

引数 s を対象の文字列とし、 AlphamericHTML 形式でエンコードします。

AlphamericHTML は、 文字列を LZ77 アルゴリズムにより圧縮・解凍し、 エンコードされた値は英数字 [0-9A-Za-z_] (AlphamericString) のみからなる文字列になります。

エンコードされた文字列が返ります。


string Posql->archive->decodeAlphamericString ( string a ) ;
AlphamericString にエンコードされている文字列をデコードします。

引数 a を対象の文字列とし、 AlphamericHTML 形式でデコードします。

デコードされた文字列が返ります。

下の例では、 文字列が圧縮され AlphamericString に変換されていることがわかります。

  $posql = new Posql;

  $string = 'Hello,Hello,abcabcabcabcabcabc';
  echo '<div>original string:</div>';
  var_dump($string); // 'Hello,Hello,abcabcabcabcabcabc'

  $encode = $posql->archive->encodeAlphamericString($string);
  echo '<div>encodeAlphamericString:</div>';
  var_dump($encode); // 'Y8Z5CCFXC_v4Z123_yD'

  $decode = $posql->archive->decodeAlphamericString($encode);
  echo '<div>decodeAlphamericString:</div>';
  var_dump($decode); // 'Hello,Hello,abcabcabcabcabcabc'

  echo '<div>compare:</div>';
  var_dump($string === $decode); // true
index

設定とオプション

Posql は、現バージョン (2.17) では設定ファイルや .ini ファイルなど 外部ファイルによる 初期設定を一切 必要としません。

もし何かしらの設定変更が必要な場合は、 以下で解説する各メソッドから変更することができます。

index

string Posql->getPath ( void ) ;
カレント (現在対象) のデータベースのファイルパスを取得します。

void Posql->setPath ( string path ) ;
カレント (現在対象) のデータベースのファイルパスを設定します。 相対パスが指定された場合、絶対パスに変換されます。

string Posql->getEngine ( [ boolean tolower = false ] ) ;
現在の SQL ステートメントにおける評価式の実行エンジンを取得します。

引数 tolower が 真 (TRUE) として渡された場合は、 すべて小文字で返されます。 デフォルト (FALSE) はすべて大文字で返されます。

現バージョン (Version 2.17) では、以下のエンジンがサポートされています。

PHP
PHP の構文がそのまま評価されます。 これは、Version 2.05 以前のデフォルトモードです。 バリデートとして、指定した関数を禁止することができます。 詳細は getDisableFunctions(), setDisableFunctions() を参照してください。
SQL
SQL 言語として評価されます。 Posql がどのくらい SQL 言語についてサポートしているか、 またはしていないのかは、同梱されているマニュアル Posql SQL Reference を参照してください。 createFunction() メソッドは、 SQL モードのみ利用できます。

デフォルトの評価エンジンは SQL モード です。


string Posql->setEngine ( string engine ) ;
SQL ステートメントにおける評価式の実行エンジンを設定します。

実行エンジンは、 SQL ステートメント中以外なら、どのタイミングでも 何度でも切り替え可能です。 複雑な処理が必要になった場合は PHP。 セキュリティのために、また SQL 文法の互換性のため SQL、と自由に変更できます。

大文字小文字の区別はされません。

設定に成功すると 設定する前の実行エンジン を文字列で返します。 失敗 (サポートされていないエンジン) の場合は、FALSE を返します。


array Posql->getDisableFunctions ( void ) ;
PHP モードでの SQL ステートメントにおける禁止関数を配列で取得します。

Posql の PHP モード中での SQL ステートメントで使える関数は、 すべて 実行中の PHP に依存します。 関数の中には 意図しない関数が多く含まれるかもしれません。 そのため、ファイル IO、入出力、その他のプログラム制御関数の一部は デフォルトで使用不可になっています。 これは最低限の SQL ステートメントに対するバリデートです。 これらの関数についての詳細は ソースコード内のクラス 'Posql_Config' における $disableFuncs にデフォルト状態が記されていますが、 このメソッドを利用することで取得できます。

戻り値は、禁止関数が全て含まれた配列です。


int Posql->setDisableFunctions ( [ mixed func = array() ] ) ;
PHP モードでの SQL ステートメントにおける禁止関数を設定します。

Posql の PHP モード中での SQL ステートメントで禁止する関数を設定します。 配列で 1 つ以上の、または 文字列として関数名 func を渡します。

禁止関数をすべてクリア (削除) するには、引数に何も渡さずにコールします。

戻り値は、追加または削除された禁止関数の数です。

   $posql = new Posql('foo.db');
   $posql->setEngine('PHP');
   $funcs = $posql->getDisableFunctions();

   print '<pre>';
   print "disable functions:\n";
   print_r($funcs);

   $affected = $posql->setDisableFunctions('hoge');
   print "disable functions: After:\n";

   $funcs = $posql->getDisableFunctions();
   print_r($funcs);

   $affected = $posql->setDisableFunctions();
   print "affected disable functions:\n";
   var_dump($affected);

   $disable_funcs = array('eval', 'exit', 'fopen');
   $affected = $posql->setDisableFunctions($disable_funcs);
   print "After the disable functions:\n";

   $funcs = $posql->getDisableFunctions();
   print_r($funcs);
   print "\n---------------\n";
   print "Try calls fopen() function on expression:\n";

   $stmt = $posql->query("SELECT fopen('somefile', 'r')");
   print "results:\n";
   var_dump($stmt->fetchAll());
   print "errors: \n";
   print $posql->lastError(); 

上の例では、いくつかの設定テストの後、禁止関数の実行を試みます。


string Posql->getCharset ( void ) ;
現在、Posql で設定されている文字コードを取得します。

設定されている文字コードのデフォルトは UTF-8 です。 この文字コードは、SQL ステートメントにおける一部の関数でヒントのため利用されます。 実行中のスクリプトの文字コードに合わせることを推奨します。


void Posql->setCharset ( string charset ) ;
Posql 内部で使用する文字コードを設定します。

boolean Posql->getAutoAssignEquals ( void ) ;
autoAssignEquals プロパティは、PHP モードで SQL ステートメントを評価する際に、 1 つのイコール記号 (=) を 2 つ並んだ イコール記号 (==) に透過的に変換するかどうかの値です。

この設定は PHP モードでも、SQL 構文を違和感なく記述できるようにするため、 また、1 つの イコール記号 (=) の前に $var などと (仮に外部から) 記述されてしまった場合、 PHP は、変数名から関数をコールすることができるためのバリデートにもなっています。

この設定はデフォルトで ON (有効) になっています。

SELECT ($func = 'unlink') AND $func('somefile');

上のように SQL ステートメントが外部から実行された場合、 PHP モードでは関数を実行してしまうかもしれません。 この設定を ON (TRUE) にしておくと、

SELECT ($func == 'unlink') AND $func('somefile');

上の例は比較演算子に変わるため、ある程度は関数のコールを制御することができます。

SELECT ... WHERE rowid = 1

上の例の場合は 1 つの イコール記号 (=) が 2 つになり、 比較演算子に変わるため、比較する際に 有用かもしれません。

SELECT ... WHERE rowid == 1

void Posql->setAutoAssignEquals ( boolean auto_assign_equals ) ;
上で解説した設定を ON (TRUE) または OFF (FALSE) に設定します。

string Posql->getExt ( void ) ;
データベース作成時に自動的に付加される拡張子を取得します。 デフォルトは 'php' です。

mixed Posql->setExt ( string ext ) ;
データベース作成時に自動的に付加される拡張子を設定します。 成功すると 前に設定されていた拡張子を返します。 失敗すると FALSE を返します。

callback Posql->getEncoder ( void ) ;
現在 設定されている エンコード 関数名を取得します。

Posql 内部では、データの格納時に PHP 関数の serialize, unserialize でエンコードおよび デコードをしています。 このプロパティの設定により、挙動を変えることができます。 デフォルトのエンコード関数は、serialize です。


callback Posql->setEncoder ( callback encoder ) ;
データ格納時に呼び出されるエンコード関数を設定します。

引数として渡す関数は PHP のリソース以外の型を文字列に変換できなければなりません。 成功すると 前に設定されていたエンコード関数名を返します。 失敗すると FALSE を返します。


callback Posql->getDecoder ( void ) ;
現在 設定されている デコード 関数名を取得します。

Posql 内部では、データの格納時に PHP 関数の serialize, unserialize でエンコードおよび デコードをしています。 このプロパティの設定により、挙動を変えることができます。 デフォルトのデコード関数は、unserialize です。


callback Posql->setDecoder ( callback decoder ) ;
データ格納時に呼び出されるデコード関数を設定します。

引数として渡す関数は 文字列から 有効な PHP の型に変換できなければなりません。 成功すると 前に設定されていたデコード関数名を返します。 失敗すると FALSE を返します。

   // This example might function as a compression database
   function posql_extra_encode($value){
       return gzcompress(serialize($value));
   }

   function posql_extra_decode($value){
       return unserialize(gzuncompress($value));
   }

   // If the argument is given, it will be an error.
   $posql = new Posql;

   $posql->setEncoder('posql_extra_encode');
   $posql->setDecoder('posql_extra_decode');
   if ($posql->isError()) {
       die($posql->lastError());
   }

   // Begin setting here. 
   $posql->open('foo.db');
   $posql->exec("CREATE TABLE foo (col)");
   if ($posql->isError()) {
       die($posql->lastError());
   }

   $posql->exec("INSERT INTO foo (col) VALUES('abcabcabcabc')");
   if ($posql->isError()) {
       die($posql->lastError());
   }

   $stmt = $posql->query("SELECT * FROM foo");
   print $stmt->fetchAllHTMLTable(); 

上の例は、列ごとにデータを圧縮し、圧縮データベースとして利用できます。 拡張モジュール zlib が有効になっている必要があります。

   // This example might function as a compression database
   // PHP5+ will be warned "Strict non-static"
   class Posql_Extra_Serializer {
       function encode($value){
           $value = serialize($value);
           if (extension_loaded('lzf')) {
               $value = lzf_compress($value);
           } else if (extension_loaded('zlib')) {
               $value = gzcompress($value, 9);
           } else if (extension_loaded('bz2')) {
               $value = bzcompress($value);
           }
           return $value;
       }
       function decode($value){
           if (extension_loaded('lzf')) {
               $value = lzf_decompress($value);
           } else if (extension_loaded('zlib')) {
               $value = gzuncompress($value);
           } else if (extension_loaded('bz2')) {
               $value = bzdecompress($value);
           }
           $value = unserialize($value);
           return $value;
       }
   }

   // If the argument is given, it will be an error.
   $posql = new Posql;

   // assign the serializer function
   $posql->setEncoder(array('Posql_Extra_Serializer', 'encode'));
   $posql->setDecoder(array('Posql_Extra_Serializer', 'decode'));

   if ($posql->isError()) {
       die($posql->lastError());
   }

   // Begin setting here. 
   $posql->open('foo.db');
   $posql->exec("CREATE TABLE foo (col)");
   if ($posql->isError()) {
       die($posql->lastError());
   }

   $posql->exec("INSERT INTO foo (col) VALUES('abcabcabcabc')");
   if ($posql->isError()) {
       die($posql->lastError());
   }

   $stmt = $posql->query("SELECT * FROM foo");
   print $stmt->fetchAllHTMLTable(); 

上の例は、クラスメソッドを利用する方法です。


number Posql->getMax ( void ) ;
Posql の 主な最大値を取得します。 この値は、単一の行に格納できるデータのサイズ、最大の列数などに影響します。 デフォルト値は 0x7FFFFF00 (2,147,483,392) です。

mixed Posql->setMax ( number max ) ;
Posql の主な最大値を設定します。 引数 max には、numeric (数えられる) 値であり、 0 より大きい値を渡します。 int、float 型、もしくは数値文字列が有効な型です。 成功すると、前に設定されていた値を返します。 エラー時には FALSE を返します。

number Posql->getDeadLockTimeout ( void ) ;
デッドロック (開放されないままのロック) として扱われるまでのタイムアウトを分数で取得します。

Posql は、排他ロック中のみ一時的に空のディレクトリを生成します。 ロック用ディレクトリはデータベースファイルと同じ場所に生成され 瞬時に削除されますが、 これは対象の (データベースファイルがある) ディレクトリに 「書き込み権限」が必要となることを示しています。 ロック用ディレクトリ名の命名規則は、

 '.' + データベース名 + '.lock' 

となります。データベース名が

 'my_database' 

の場合、ロック用ディレクトリ名は

 '.my_database.lock' 

となります。名前の衝突については通常、考慮する必要はありません。

デッドロックとみなされるまでのタイムアウトは デフォルトで 10 分です。 タイムアウトを過ぎるとロック用ディレクトリは破棄され、 処理が続行されます。


boolean Posql->setDeadLockTimeout ( [ number timeout = 10 ] ) ;
デッドロック (開放されないままのロック) として扱われるまでのタイムアウトを分数で設定します。

引数の timeout は、分数で扱われます。 timeout のデフォルト値は 10 です。 timeout は 1 より大きい値を数値で渡します。

成功すると TRUE を、失敗またはエラー時に FALSE を返します。


boolean Posql->getUseQueryCache ( void ) ;
クエリキャッシュを使用するかどうかの現在の真偽値を取得します。

Posql で現在実装されているクエリキャッシュは、 SELECT ステートメントの結果セットを保存しておき、 同じクエリが要求された場合 検索を行わずキャッシュに保存されている結果を返す機能です。 テーブルが更新されると、キャッシュはそれに合わせて 新しい結果セットに更新されます。

クエリキャッシュを利用することにより、 処理時間のかかる複雑なステートメントなどが 2 回目以降、 少しの処理だけで結果セットとして返されるため高速化につながります。 そのかわり、キャッシュ記憶領域を必要とするためディスク容量が増します。 クエリキャッシュはデータベース内のプライベートな領域に保存されるため、 基本的に外側から操作など必要としません。

クエリキャッシュを使用している場合は TRUE を、 使用していない場合は FALSE を返します。

この値のデフォルトは FALSE (使用しない) に設定されています。

clearQueryCache() メソッドを利用することで 全てのクエリキャッシュをクリア (物理的に削除) することができます。


void Posql->setUseQueryCache ( boolean use_query_cache ) ;
クエリキャッシュを使用するかどうかの現在の真偽値を設定します。

クエリキャッシュを使用する場合は TRUE を、 使用しない場合は FALSE を渡します。


number Posql->getQueryCacheMaxRows ( void ) ;
クエリキャッシュの上限となる列数を取得します。

クエリキャッシュの上限となる列数 (キャッシュの数) が数値で返ります。

デフォルトの上限値は 1024 です。

この値を超えて新しいクエリキャッシュが保存されようとする場合、 古いクエリキャッシュから順に削除されシフトします。


void Posql->setQueryCacheMaxRows ( number query_cache_max_rows ) ;
クエリキャッシュの上限となる列数を設定します。

引数にはクエリキャッシュの上限となる列数 (キャッシュの数) を数値で渡します。

index

その他のメソッド

number Posql->clearQueryCache ( void ) ;
保存されているクエリキャッシュをクリアします。

クエリキャッシュについての詳細は getUseQueryCache() を参照ください。

clearQueryCache メソッドは、 保存されている全てのクエリキャッシュをクリア (物理的に削除) します。

削除されたクエリキャッシュの列数が返ります。


float Posql->getMicrotime ( void ) ;
現在の Unix タイムスタンプをマイクロ秒まで含めて取得します。

getMicrotime メソッドは、 PHP5 での microtime(true); と同じ値を返します。 PHP のバージョン互換性のため提供されています。

マイクロ秒まで含めた現在の Unix タイムスタンプを float で返します。


boolean Posql->isDatabase ( [ string path = null ] ) ;
対象のファイルが有効な Posql データベースかどうか調べます。 引数の path が省略されると、 カレント (現在対象) のデータベースに対しチェックします。

有効な Posql データベースファイルだった場合は TRUE、 無効な形式だった場合は FALSE が返ります。


string Posql->getDatabaseName ( void ) ;
カレント (現在対象) のデータベース名を取得します。

戻り値は、ファイルパスではなく、データベース名が返ります。 ファイルパスを取得したい場合は getPath() メソッドを使用してください。


number Posql->getLastInsertId ( void ) ;
直近に挿入されたレコードの rowid の値を取得します。

Posql データベース に直近に挿入されたレコードの rowid の値を返します。 接続上において、まだ挿入されていない場合は NULL が返ります。


number Posql->getVersion ( [ boolean major = false ] ) ;
使用している Posql のバージョンを取得します。

引数 major が 真 (TRUE) として渡された場合、 メジャーバージョン (例えば '2') が返ります。 デフォルトは (FALSE) です。 引数を省略した場合、'2.17' のようなバージョンが返ります。


boolean Posql->existsTable ( string tablename ) ;
テーブルが存在するか確認します。

引数で与えられた tablename がテーブルとして存在していれば TRUE、 存在しない場合は FALSE が返ります。


boolean Posql->existsClass ( string class ) ;
__autoload() を呼ばずにクラスが存在するか調べます。

引数 class が存在しているかどうかを、 __autoload() のコールを抑制して (オートロードしないで) 調べます。

クラスが存在する場合は TRUE、存在しない場合は FALSE を返します。


string Posql->escape ( string string [, boolean escape_wildcards = false [, mixed enclose = false ]] ) ;
文字列を SQL ステートメントで使用できるよう適切にエスケープします。

引数 string が SQL ステートメントで有効な表現になるよう 適切にエスケープして返します。

引数 escape_wildcards が 真 (TRUE) で渡された場合、 LIKE 演算子のワイルドカードも同時にエスケープします。

引数 enclose が 真 (TRUE) で渡された場合、 文字列 string 全体を シングルクォート (') で囲って返します。

LIKE ワイルドカードのエスケープが必要な場合や 文字列のクォートが不要な場合を除いて、 quote() メソッドのほうが 適切という可能性が高いことに注意してください。

LIKE ワイルドカード文字を含むエスケープの例:

  $posql = new Posql('math_db');
  $posql->exec("DROP TABLE IF EXISTS math");
  $posql->exec("CREATE TABLE IF NOT EXISTS math (
    id   integer,
    expr varchar(255),
    res  integer,
    primary key(id)
  )");
  for ($i = 1; $i <= 10; $i++) {
    $expr = sprintf('%d %% %d / %d + %d', $i, $i, $i, $i);
    $stmt = $posql->queryf('SELECT %s', $expr);
    $res  = $stmt->fetchColumn(0);
    $stmt = $posql->prepare("INSERT INTO math (expr, res) VALUES(?, ?)");
    $stmt->execute(array($expr, $res));
  }
  $search = $posql->escape('5 % 5', true);
  $sql = "SELECT id, expr, res FROM math WHERE expr LIKE '" . $search . "%'";
  $stmt = $posql->query($sql);
  echo $stmt->fetchAllHTMLTable();

string Posql->escapePattern ( string pattern ) ;
LIKE ワイルドカード文字をエスケープします。

引数 pattern 内に含まれる LIKE ワイルドカード文字を エスケープして返します。

LIKE ワイルドカードは '%' と '_' の文字です。

このメソッドは、LIKE ワイルドカード文字をエスケープするだけの機能です。 ほとんどの場合、 quote() または escape() メソッドのほうが 適切という可能性が高いことに注意してください。


mixed Posql->escapeHTML ( mixed html [, string charset = null ] ) ;
HTML エンティティをエスケープします。

引数で与えられた html が HTML もしくは XML 文字列だった場合、 htmlspecialchars() 関数に ENT_QUOTES オプションを付加し、実行します。 結果、HTML および XML 特殊文字をエンティティに変換して返します。 html が配列だった場合は、再帰的に処理されます。 引数 charset が与えられると、それを文字コードとして処理します。 省略された場合は 内部文字コード getCharset(), setCharset() で使用されるプロパティが代用されます。


boolean Posql->sortByTemplate ( array & array [, mixed templates = array() ] ) ;
可変引数の値をテンプレートとし、配列を キーでソートします。

引数 array を対象とし、 1 つ以上の引数をソートに使用するテンプレートと解釈し、 配列 array のキーを中心にソートします。

   $array = array(
     'id'   => 1,
     'name' => 'foo',
     'text' => 'hello!'
   );
   print "<br/><b>original:</b><br/><pre>\n";
   print_r($array);

   $template = array('name', 'id', 'text');

   $posql = new Posql;
   $posql->sortByTemplate($array, $template);

   print "\n<b>after:</b><br/>\n";
   print_r($array);
   print "</pre>";

   // output:
   //  array(
   //     [name] => foo
   //     [id]   => 1
   //     [text] => hello!
   //  ); 

上の例は、最後のコメントのような結果になります。


string Posql->fullPath ( string path [, boolean check_exists = false ] ) ;
ファイルパスをフルパスで取得します。

引数 path をファイルパスとみなし、それをフルパスにして返します。

引数 check_exists が 真 (TRUE) で渡された場合、 戻り値となるファイルパスに実際にファイルが存在するかどうか調べ 存在しなかった場合、戻り値は FALSE となります。


number Posql->appendFileLine ( string filename , mixed append_data , number line_number [, string glue = '' ] ) ;
文字列をファイルの任意の行に追加します。

ファイル filename 内の行番号 line_number に 文字列または配列として渡す引数 append_data を追加します。

引数 append_data が配列で渡されると、引数 glue によって連結されます。

ファイルに追加された (書き込まれた) バイト数が返ります。

このメソッドは、 memory_limit を超えるような巨大なファイルに対しても 正常に書き込めるよう設計されています。

  1,100,one
  2,200,two
  3,300,three

上のような CSV ファイル sample.csv に対しての例:

  $posql = new Posql;

  $filename = 'sample.csv';
  $append_data = ',Append';
  $line_number = 2;

  $written_bytes = $posql->appendFileLine(
    $filename,
    $append_data,
    $line_number
  );

  echo '<pre>', file_get_contents($filename), '</pre>';

結果は以下のようになります。

  1,100,one
  2,200,two,Append
  3,300,three

number Posql->insertFileLine ( string filename , mixed insert_data , number line_number [, string glue = '' ] ) ;
文字列をファイルの任意の行に挿入します。

ファイル filename 内の行番号 line_number に 文字列または配列として渡す引数 insert_data を挿入します。

引数 insert_data が配列で渡されると、引数 glue によって連結されます。

ファイルに挿入された (書き込まれた) バイト数が返ります。

このメソッドは、 memory_limit を超えるような巨大なファイルに対しても 正常に書き込めるよう設計されています。

  1,100,one
  2,200,two
  3,300,three

上のような CSV ファイル sample.csv に対しての例:

  $posql = new Posql;

  $filename = 'sample.csv';
  $insert_data = '2,150,Insert';
  $line_number = 2;

  $written_bytes = $posql->insertFileLine(
    $filename,
    $insert_data,
    $line_number
  );

  echo '<pre>', file_get_contents($filename), '</pre>';

結果は以下のようになります。

  1,100,one
  2,150,Insert
  2,200,two
  3,300,three

number Posql->replaceFileLine ( string filename , mixed replacement , number line_number [, string glue = '' ] ) ;
ファイルの任意の行の文字列を置換します。

ファイル filename 内の行番号 line_number の文字列を、 文字列または配列として渡す引数 replacement に置換します。

引数 replacement が配列で渡されると、引数 glue によって連結されます。

書き込まれたバイト数が返ります。

このメソッドは、 memory_limit を超えるような巨大なファイルに対しても 正常に書き込めるよう設計されています。

  1,100,one
  2,200,two
  3,300,three

上のような CSV ファイル sample.csv に対しての例:

  $posql = new Posql;

  $filename = 'sample.csv';
  $replacement = '2,222,Replace';
  $line_number = 2;

  $written_bytes = $posql->replaceFileLine(
    $filename,
    $replacement,
    $line_number
  );

  echo '<pre>', file_get_contents($filename), '</pre>';

結果は以下のようになります。

  1,100,one
  2,222,Replace
  3,300,three
index

その他のドキュメントとマニュアル

主なドキュメント、およびマニュアルは以下のリンクに含まれています。