SyLライブラリで使用するDBは、設定ファイルに記述された接続文字列をデフォルトに
同じ接続文字列の場合は、シングルトン形式で接続を取得します。
PDOに似た独自のインターフェイスを持っていて、基本的な操作がより簡単にできるように考慮しています。
また、本ライブラリでは実現できない、または自分には合わないと思った場合は、直接リソースを取得して使用することもできます。
SyL_DBライブラリを使用する場合は、下記3つの手順を行います。
1. 設定ファイル(defines.xml)の SYL_DB_DSN に接続文字列を記述
2. SyL_DBライブラリをインクルードし、getConnection メソッドにより接続を確立する
3. SQLでDBにアクセスする
記述方法は、下記のようになります。
[dbtype]:dbname=[dbname];host=[hostname];port=[port];user=[username]; passwd=[password];client_encode=[client_encode];persistent=[persistent] ---------- [dbtype]: 接続するDBの種類(後述) [dbname]: DB名 [hostname]: ホスト名 [port]: ポート番号 [username]: ユーザー名 [passwd]: パスワード [client_encode]: クライアントエンコーディング [persistent]: 持続的接続 1: on, 0: off ---------- 例) <define name="SYL_DB_DSN">pgsql:dbname=syl_db;host=localhost; port=5432;user=syl_user;passwd=syl_password;client_encode=EUC-JP; persistent=0</define>
接続できるDBの種類は、[dbtype]により判定します。
対応DB | [dbtype] の記述文字列 | 補足 |
---|---|---|
MySQL | mysql mysqli |
|
PostgreSQL | pgsql | |
Sqlite | sqlite | PHP5以上 |
PEAR | pear | 例外的に接続文字列に使用するDBの種類を含めます。 例) pear:dbtype=mysql;dbname=... |
PDO | pdomysql pdopgsql pdosqlite pdosqlite2 |
PHP5以上 |
※ 使用するDBに対するPHP関数を使用していますので、事前にconfigure等で インストールしてください。(インストール状況はphpinfo関数等で確認できます)
設定が完了したら、実際にコードを記述し接続してみます。
まず、事前にDBライブラリをロードします。
SyL_Loader::lib('DB');
※ SyLフレームワークを使用しない場合は、SYL_DIR /include/lib/SyL_DB.php を直接インクルードしてください。
次に、コネクションを取得します。
$conn =& SyL_DB::getConnection();
コネクションが確立できたら、下記のように接続状況を確認してみてください。
$conn =& SyL_DB::getConnection($dsn); // バージョンを取得する echo "version: " . $conn->getVersion() . "\n"; // 接続リソースを取得する var_dump($conn->getResource()); -- // PHP 4.4.7 (CLI) と MySQL 5.0.24 の結果 -- version: 5.0.24a resource(10) of type (mysql link) -- // PHP 5.2.2 (CLI) と PostgreSQL 8.1.4(PDO) の結果 -- version: 8.1.4 object(PDO)#3 (0) { }
DBの接続が確立できたら、実際にSQLを発行してみます。
// コネクションを取得 $conn =& SyL_DB::getConnection($dsn); // データを取得するSQL $sql = "select id, value from ..."; // データ取得を実行し、結果を取得 $result = $conn->query($sql); // 結果を表示 print_r($result); -- Array ( [0] => Array ( [ID] => 1 [VALUE] => あああ ) [1] => Array ( [ID] => 2 [VALUE] => いいい ) )
query メソッドの戻り値は、SELECTであれば配列となり、INSERT/UPDATE/DELETE であれば 影響したレコード件数(ただしDB依存します)となります。
SyL_DBの SELECT 操作の注意点として、
(1) 結果は、各DBのリソース型ではなく、配列で返ります。
(2) デフォルトで、結果フィールド名は大文字になります。
結果を「1カラム」「1レコード」「全レコード」で、状況に応じて取得することも可能です。
// コネクションを取得 $conn =& SyL_DB::getConnection($dsn); // データを取得するSQL $sql = "select id, value from ..."; // 1カラムを取得 $conn->queryRef($sql, $result, 'one'); // 結果を表示 print_r($result); echo "\n"; // 1レコードを取得 $conn->queryRef($sql, $result, 'record'); // 結果を表示 print_r($result); echo "\n"; // 全レコードを取得 $conn->queryRef($sql, $result, 'all'); // 結果を表示 print_r($result); echo "\n"; -- // 1カラムを取得の結果 1 // 1レコードを取得の結果 Array ( [ID] => 1 [VALUE1] => あああ ) // 全レコードを取得の結果 Array ( [0] => Array ( [ID] => 1 [VALUE] => あああ ) [1] => Array ( [ID] => 2 [VALUE] => いいい ) )
また、ページ単位での取得も可能です。
queryPageRefメソッドを実行すると、引数でページオブジェクトが参照で返されます。
そのオブジェクトからページ情報を取得でき、ページリンクの生成にも役立ちます。
// コネクションを取得 $conn =& SyL_DB::getConnection($dsn); // データを取得するSQL $sql = "select id, value from ... order by id"; // ページ単位のデータを取得 // 10ページ毎の2ページ目を取得 // $result は結果を指定ページのデータ配列。 // $pager はSyLページオブジェクトを参照で取得できます。 $conn->queryPageRef($sql, $result, $pager, 10, 2); // 1ページの件数を取得 echo $pager->getCount(); // 全ページの総件数を取得 echo $pager->getCountAll(); // カレントのページ数を取得 echo $pager->getCurrentPage(); // 総ページ数を取得 echo $pager->getTotalPage();
機能が足りない、インターフェイスが合わないなどの場合、 オリジナルのオブジェクトやリソースを取得して処理を続行することもできます。
$conn_org =& $conn->getResource();