主な機能 - dfwLib
dfwLib 主な機能
DBアクセスクラス
DBにアクセスするためのPDOラッパークラスを提供しています
- CONFIG設定
define( 'DFW_DB_DSN', 'mysql:dbname=databesedatabse;host=localhost' );
define( 'DFW_DB_USER', 'useruser' );
define( 'DFW_DB_PASS', 'passpass' );
DBクラスに自作メソッドを追加
DBクラスを継承したクラスを定義し、そこに自作のメソッドを追加します。
class MyDB extends DB {
public function hoge() {
/* hoge処理 */
}
}
簡単な使い方
DB接続
$db = new DB(); // CONFIGに設定したDSN情報でDB接続
SQL定義
$db->setSql('SELECT * FROM memo WHERE name=:name AND flag=:flag');
SQLパラメータ設定(通常のやり方)
$db->set('name', 'tatenosystem'); $db->set('flag', 1);
SQLパラメータ設定(連想配列で一度に設定)
$params = array(); $params['name'] ='tatenosystem'; $params['flag'] = 1; $db->sets( $params );
SQL INコマンド
$db->setSql('SELECT * FROM memo WHERE name IN (:names)');
$db->setIn( 'names', array('tatenosystem', 'mahata', 'hoge') );
- SQL実行(1レコードずつ取得)
$db->exec();
while( true ) {
$item = $db->fetch();
if( empty($item) ) break;
var_dump( $item );
}
- SQL実行(10レコードずつ取得)
$db->exec();
while( true ) {
$item = $db->fetchNum( 10 );
if( empty($item) ) break;
var_dump( $item );
}
- SQL実行(1レコード取得)
$item = $db->execFetchOne();
var_dump( $item );
- SQL実行(全レコード取得)
$items = $db->execFetchAll();
var_dump( $items );
- DB切断
$db->close();
デバッグ用メソッド
- 直前に実行したSQL文確認 - getSqlメソッド(exec実行後に有効)
$db->exec();
echo $db->getSql(); // SQL文出力
- PDOエラー時にエラーメッセージを確認 - getErrorMessageメソッド(execエラー時に取得)
$rtn = $db->exec();
if ($rtn === false) {
echo $db->getErrorMessage(); // エラーメッセージ出力
}
- PDOエラー時にエラーメッセージを確認 - getErrorMessageメソッド(DBコネクトエラー時に取得)
$db = new DB();
if (! $db->isConnect()) {
echo $db->getErrorMessage(); // エラーメッセージ出力
}
- EXPLAIN を実行(execの代わりにexplain使用)
$db->setSql('SELECT * FROM ipmes');
var_dump($db->explain()); exit; // デバッグ出力
複数のDB接続
通常CONFIGに設定したデフォルトDSN情報でDB接続します。
複数のDBに接続する場合は、CONFIGに連想配列でDSN情報を記載してキー名で接続します
- CONFIG設定(「sonota」という名前でDSN定義)
// === 特殊オプション(DB個別設定)
$DFW_DB_DSN = array(
'sonota' => array(
'dsn' =>'mysql:dbname=sonotadatabase;host=localhost',
'user'=>'sonotauser',
'pass'=>'sonotapass'
),
);
- 接続
$db = new DB('sonota');
便利なINSERTメソッド
INSERT命令はSQL文を書かずに実行できるメソッドがあります。
戻り値は最後に挿入された行のID(PDO::lastInsertId値)となります。
$db = new DB();
$params = array( 'title'=>'ほげタイトル', 'description'=>'ほげんほげん' );
$ret = $db->insert( 'my_table', $params ); // INSERT実行
上記実行のSQLは、
INSERT INTO my_table ( title, description ) VALUES ( "ほげタイトル", "ほげんほげん" );
となります。
NOW()関数が使えます。
$db = new DB();
$params = array( 'title'=>'ほげタイトル', 'created_at'=>'NOW()' );
$ret = $db->insert( 'my_table', $params ); // INSERT実行
上記実行のSQLは、
INSERT INTO my_table ( title, created_at ) VALUES ( "ほげタイトル", NOW() );
となります。
マルチINSERT
マルチINSERT命令はSQL文を書かずに実行できるメソッドがあります。
戻り値は「INSERTされたレコード数」となります。
$db = new DB();
$params[] = array( 'title'=>'ほげ1', 'description'=>'ほげん1' );
$params[] = array( 'title'=>'ほげ2', 'description'=>'ほげん2' );
$ret = $db->multiInsert( 'my_table', $params ); // INSERT実行
上記実行のSQLは、
INSERT INTO my_table ( title, description ) VALUES ( "ほげ1", "ほげん1" ),( "ほげ2", "ほげん2" );
となります。
- インサート(insert)の処理方式別のパフォーマンスを検証
http://www.inter-office.co.jp/contents/194/
詳細マニュアル
DBクラス エラー処理
DB操作メソッド
DBメソッドエラー時は false(boolean) が返却されます。
$rtn = $db->exec();
if ($rtn === false) {
echo 'DB execエラー';
var_dump($db->getErrorMessage());
}
fetch系メソッドでは取得レコードがこれ以上ない場合「空のarray」が返却されます(ver1.1以降)
$rtn = $db->fetch();
if ( empty($rtn) ) {
break;
}
$rtn = $db->fetch();
if ( count($rtn) == 0 ) {
break;
}
※ Ver1.0まではfetch系メソッドでは取得レコードがこれ以上ない場合 false(boolean) が返却されます。
以下の関数のエラー時は false(boolean) が返却されます。
- exec
- fetch
- fetchAll
- execFetchAll
- execFetchOne
- insert
- multiInsert
insertメソッド成功時は insertされたレコードの件数が返却されます(ver1.1)。
multiInsertメソッド成功時は insertされたレコード件数が返却されます。
DBコンストラクタ
コンストラクタのエラーチェックは isConnect メソッドを使用します。
$db = new DB();
if (! $db->isConnect()) {
echo 'DBコネクトエラー'
var_dump($db->getErrorMessage());
}
VIEWでの自動エスケープ
モジュールPHPで設定したVIEWへの情報はエスケープ処理されます
setView( 'name', '<p>tatenosystem</p>' );
エスケープしたくない情報は、setViewRaw() で設定してください
setViewRaw( 'name', '<p>tatenosystem</p>' );
VIEWへの情報の渡し方(1)
PHPモジュール
setView( 'name', 'tatenosystem' );
ビューでの出力(Smarty)
{$name}
ビューでの出力(PHP)
<?php echo getView('name'); ?> <?php v('name'); ?>
VIEWへの情報の渡し方(2)
PHPモジュール
$param = array(); $param['name'] = 'tatenosystem'; $param['desc'] = 'kami'; setView( 'user', $param );
ビューでの出力(Smarty)
{$user.name} {$user.desc}
ビューでの出力(PHP)
<?php $user = getView('name'); echo $user['name']; echo $user['desc']; ?>
VIEWへの情報の渡し方(3)
- PHPモジュール
$param = array();
$param['name'] = 'tatenosystem';
$param['desc'] = 'kami';
setViews( $param );
- ビューでの出力(Smarty)
{$name}
{$desc}
- ビューでの出力(PHP)
<?php echo getView('name'); ?>
<?php v('name'); ?>
<?php echo getView('desc'); ?>
<?php v('desc'); ?>
URLマッピング
URLのパス情報をGETパラメータとして取得出来ます。
- CONFIG設定
// === URLマッピングの使用
define( 'USE_URL_MAPPING', 'yes' );
- .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
URL例
http://hogehoge.jp/view/0123/tatenosystem/
- モジュール名は「view」になります
- CGIパラメータ「get1」で「0123」が取得出来ます( $_GET['get1'] )
- CGIパラメータ「get2」で「tatenosystem」が取得出来ます( $_GET['get2'] )
- パス情報が存在すれば同様にCGIパラメータ「get3、get4、~」が取得できます。
セッション処理・認証処理
通常の使い方
特に dfwLib関数を利用する必要はありません。
PHP関数でセッションを開始してください。
session_start();
設定ファイルにセッション名を定義してある場合は下記のコードでセッションを開始してください。
session_name( SESSION_NAME );
session_start();
セッション開始後、PHP関数でセッション処理をしてください。
$_SESSION['hoge'] = 'hogehoge';
認証が必要な場合
ログイン機能があるWEBアプリケーションを作成する場合は dfwLib関数を利用してください。
セッションオープンと同時に正しく認証が行われているかチェックする機能があります。
またフィンガープリント(ブラウザ情報チェック)によるセッションハイジャック検出機能を提供します。
- ログイン成功後に一回だけ実行
startFirstSession();
セッションが開始されフィンガープリントがセッションに保持(認証OK)されます。
- 各モジュール毎に実行(1)
startSession();
セッションが開始され startFirstSession() で認証がなされているかチェックします。
認証OKで無い場合は、「HTTP/1.1 403 Forbidden」となります。
- 各モジュール毎に実行(2)
startSession('top');
セッションが開始され startFirstSession() で認証がなされているかチェックします。
認証OKで無い場合は、引数で指定したモジュール名にリダイレクトします。
セッション開始後、dfwLibセッション関数 又は PHP関数でセッション処理をしてください。
$_SESSION['hoge'] = 'hogehoge';
setSession( 'hoge', 'hogehoge' );
setSession( 'hoge' ); // セッション情報を削除
CSRF対策機能
(1)情報送信ページ
モジュールで getCsrfCode関数 を実行してCSRF対策コードを取得します。
取得したコードをビューに渡します。
setView( 'csrfCode', getCsrfCode() );
ビューでは POST の HIDDEN データとして、CSRF対策コードを設定します。
<form name="hoge" method="post" action="">
……
<input type="hidden" name="csrfCode" value="{$csrfCode}">
……
</form>
(2)情報受信ページ
HIDDEN データとして設定したCSRF対策コードを取得します。
checkCsrf関数で、正しいCSRF対策コードかチェックを行います。
戻り値は true false となります。
if ( checkCsrf( $_POST['csrfCode'] ) ) {
// 正しい
} else {
// CSRFチェックエラー
}
第2引数にモジュール名を指定すると、CSRFチェックエラー時にそのモジュールに移動します。
下記の場合はエラー時に topモジュール に移動します。
checkCsrf( $_POST['csrfCode'], 'top' );
第2引数にモジュール名を空文字指定すると、CSRFチェックエラー時に「HTTP/1.1 403 Forbidden」となります。
checkCsrf( $_POST['csrfCode'], '' );
バリデーション
バリデーションパターン(正規表現チェック)
データの妥当性をチェックする関数(validate関数)を利用します。
以下のバリデーションパターンが定義されています。
定義文字列 | 内容 | 正規表現 |
---|---|---|
NUMBER | 0~9 数字 | /^[0-9]$/ |
ALPHA | A~Z アルファベット(小文字含む) | /^[a-zA-Z]$/ |
ASCII | ASCIIコード(半角英数字記号) | /^[\x20-\x7E]$/ |
HEX | 16進数表記(小文字含む) | /^[0-9A-Fa-f]$/ |
SPACE | 半角スペース | /^[ ]$/ |
HYPHEN | ハイフン(マイナス記号) | /^[-]$/ |
UNDERBAR | アンダーバー | /^[_]$/ |
※ 正規表現で文末は \z です。$ は(改行を含む)行末です。
- $_GET['year']が「数字」であるかどうかチェック
if ( ! validate('NUMBER', $_GET['year']) ) {
// NG処理
}
定義文字列は , (カンマ) または - (ハイフン)で連結して使用ができます。
連結した場合 OR条件 で評価されます。
- $_GET['code']が「数字」か「アルファベット」であるかどうかチェック
if ( ! validate('NUMBER,ALPHA', $_GET['code']) ) {
// NG処理
}
定義文字列がない場合は「正規表現」でバリデーションパターンを定義できます。
if ( ! validate('/^[0-9A-C]$/', $_GET['code']) ) {
// NG処理
}
文字列長チェック
データの長さを妥当性をチェックする場合は、validate関数の第3引数と第4引数に長さの範囲を指定します。
1文字の全角文字も長さは1文字となります。
- $_GET['code']が「数字」か「アルファベット」で、長さが3~7文字であるかどうかチェック
if ( ! validate('NUMBER,ALPHA', $_GET['code'], 3, 7) ) {
// NG処理
}
正規表現のチェックは省略可能です。
正規表現チェックを行わない場合は、バリデーションパターンに空文字を設定します。
- $_GET['code']の長さが3~7文字であるかどうかチェック
if ( ! validate('', $_GET['code'], 3, 7) ) {
// NG処理
}
文字列長のチェックを「バイト単位」で行いたい場合は、「validateByte関数」利用します。
引数は「validate関数」と一緒です。
正規表現チェックを行わない場合は、バリデーションパターンに空文字を設定します。
- $_GET['code']の長さが3~7バイトであるかどうかチェック
if ( ! validateByte( '', $_GET['code'], 3, 7 ) ) {
// NG処理
}
バリデーションエラーの取得
「validate関数」でデータの妥当性がNGだった場合、エラーの詳細は「getValidateError関数」で取得できます。
「getValidateError関数」では配列を取得できます。
取得した配列で、「正規表現チェック」、「最小長チェック」「最大長チェック」のどのチェックでNGだったのかが確認できます。
if ( ! validateByte('ALPHA-NUMBER-SPACE', $str, 2, 3)) {
echo '<p>データエラー</p>';
var_dump( getValidateError() );
}
getValidateError() の戻り値は失敗したチェック項目がキーとなる連想配列で取得されます。
値は「1」が入っています。上記プログラムですべてのチェックがエラーに成った場合は、以下の var_dump が表示されます。
array
'pattern' => int 1
'min' => int 1
'max' => int 1
チェック項目と連想配列のキーは、以下のとおりです。
連想配列キー | エラー内容 |
---|---|
pattern | 正規表現チェックエラー |
min | 最小値チェックエラー |
max | 最大値チェックエラー |
ログ出力
config設定ファイルに以下の記述をすると、ログ出力関数が使用できます。
define の 'LOG_APP_NAME' にはプロダクト名を記述します(省略可能)。
define の 'LOG_LEVEL' には出力ログレベルを設定します。出力ログレベル未満のログは出力されません。
ログ出力は PEAR:Log を使用しています。
// === ログ出力の使用
define('USE_LOG_OUT', 'yes');
// === ログ出力(USE_LOG_OUT yes の時に使用)
define('LOGFILE_PATH', realpath(dirname(__FILE__)).'/'.date('Y/m/d').'/out.log');
define('LOG_APP_NAME', '-');
define('LOG_LEVEL', 'debug');
ログ出力は writeLog関数を使用します。
引数でエラーレベルを指定します。無指定の場合のエラーレベルは info です。
writeLog('エラー内容', 'debug');
writeLog('エラー内容', 'd');
writeLog('エラー内容');
writeLog('エラー内容', 'info');
writeLog('エラー内容', 'i');
writeLog('エラー内容', 'warning');
writeLog('エラー内容', 'w');
writeLog('エラー内容', 'error');
writeLog('エラー内容', 'e');
writeLog('エラー内容', 'critical');
writeLog('エラー内容', 'c');
モジュール呼び出し
callModule関数
モジュール内で callModule関数 を使用すると、HTTPリダイレクトを利用して指定したモジュールに移動します。
callModule('moduleName');
リダイレクト先へのモジュールにGET情報を送る場合は、CGIパラメータを記述します。
callModule('moduleName&site=hoge&user=ore');
設定ファイル(dfwConfig.php)記述のTOPモジュールに移動する場合
callModule(DFW_TOP_MODULE_NAME);
includeModule関数
モジュール内で includeModule関数 を使用すると、指定したモジュールをrequire_onceします。
includeModule('moduleName');