KAHOとは?

概要

KAHOとはPHPを利用したWebシステム・フレームワークである。

Kindly...利用者にとって親切なシステムであること

Adaptability...適応性、融通性の優れたシステムであること

Handy...非常に便利なシステムであること

Objective...これらを目的として開発し続けること

有効性

KAHOを利用することで以下の有効性を得られる。

1.プログラムコードを意識する事無くウェブデザインを行うことができ、プログラマとウェブデザイナの完全分業を実現します。

2.作成したプログラムは独立しているため、他のシステムにも組み込むことが出来ます。

3.既に完成したライブラリを利用するので、開発期間の向上、品質の向上に繋がります。

構成

主な構成は下記のとおり。

1.HTMLファイル
実際にWeb上で閲覧できるHTMLファイル。

2.プログラムモジュール
必要なプログラムを作成。

3.KAHOモジュール
ログイン機能、表示機能、データの受け渡しなどを共通して行えるKAHOライブラリモジュール。

4.設定ファイル
ファイルパス、DBの種類などを指定する。

5.メッセージファイル
表示するメッセージを指定。必要に応じて書き加える(ファイル保管場所:/modules/<module_name>/langs/ )。

ディレクトリ構成


設定

動作用件

入手方法

トラクション株式会社(http://www.traction.jp/)より入手できます。

アップロード先の指定

下記を参考にファイルをアップロードする。
セキュリティ上、必要に応じてファイル名を変えることをお勧めします。

KAHO
config (サイト設定情報及び汎用関数用ディレクトリ)
  def.php
PHPの汎用的な設定情報を記述する
     
modules (モジュール用ディレクトリ)
 
<module_name> (モジュール使用データ保管ディレクトリ)
<module_name>.php
モジュールスクリプト
   
deta (モジュール用データ保管ディレクトリ)
langs (モジュール用メッセージ保管ディレクトリ)  
   <lang_name>.mes
モジュール用・メッセージファイル
 
       
admin.php
モジュール用管理プログラム(オプション)
 
   
<public_html> (スキンファイル用ディレクトリ) ユーザ作成
.htaccess
サイト設定情報及び汎用関数読み込みの定義を行う
AddType application/x-httpd-php .php .php3 .htm .html
AddType application/x-httpd-php-source .phps
php_value auto_prepend_file "/var/www/config/def.php"
php_value output_handler "mb_output_handler"
php_flag output_buffering On
php_flag magic_quotes_gpc on
php_value mbstring.language "Japanese"
php_flag mbstring.encoding_translation On
php_value mbstring.http_input "auto"
php_value mbstring.http_output "UTF-8"
php_value mbstring.internal_encoding  "UTF-8"
php_value mbstring.script_encording "UTF-8"
php_flag session.use_cookies "Off"
php_flag session.use_trans_sid "On"
php_flag session.cache_limiter "public"
<html_name>.html
スキンファイル

def.phpの設定方法

変数の説明
def.phpの保存先は /config/

$MAIN_DIR="/home/traction/kaho";
KAHOモジュールのあるディレクトリを指定します。

$MAIN_LANG="UTF8-JP";
文字コードを指定します。

$MAIN_DB['DB']="postgres";
DBの種別を指定します。
(Postgresql="postgres"、MySQL="mysql"、ORACLE="oracle")

$MAIN_DB['HOST'] = 'localhost';
DBサーバの位置を指定します。

$MAIN_DB['PORT'] = '5432';
DBサーバへのポートを指定します。

$MAIN_DB['DB_NAME'] = 'traction';
データベース名を指定します。

$MAIN_DB['DB_USER'] = 'traction';
DBへのユーザ名を指定します。

$MAIN_DB['DB_PASS'] = 'Password';
DBへのパスワードを指定します。

$MAIN_DB['DB_LANG'] = 'UTF-8';
DBの文字コードを指定します。

$MAIN_SESSION_TIMEOUT=3600;
ログイン時のタイムアウト秒数を指定します。

サイト制作

作成の流れ

大まかには下記の流れで作成する。

サイト設計
DB設計
モジュール設計
ブロック設計
メッセージ設計
 ページデザイン   ブロック設計 
スキンデザイン コーディング
______ ...共通作成項目
______ ...プログラマ作成項目
______ ...デザイナ作成項目

どんな機能をサイトに組み込むか決める

サイトにて使用する必要な機能を抽出し、大まかにどういった機能を組み込むか決める。
一般的なWebサイトの設計を行い、ページ構成や、各ページの概要、リンク先等を画面遷移図を作成し、設計する。
その後に必要な機能を抽出する。

このMAP1はサイト制作において大まかにどういったページ内容にするのかを記したものです。

map1

 

MAP1で赤丸で囲んだBBSの画面推移図です。
このようにきちんと書いておけばページ構成がわかるだけでなく
どのページでどのような機能を使えばいいのかわかりやすくなる。

map1

モジュールの選択

サイト設計時にて作成した画面遷移図などをもとに、どのモジュールを使用するか選択する。
(必要な機能が無い場合は、新たにモジュールを開発する事になる。)
既存で使用できるモジュールがあれば積極的に活用する。

●既存モジュール一覧
Login ログイン関連
Input_Out 入出力関連
Bbs BBS関連
Chat チャット関連
Point_Charge ポイント管理、課金処理
News ニュースリリース関連
FileManager ファイル管理関連
Mobbile_Image_Conv 写真自動変換機能
PhotoAlbum フォトアルバム関連
Mail メール関連

入出力表について

既存モジュールの入出力表は
./modules/<module_name>/Block_<module_name>.sxcに保管されています。

*中身を見るにはOpenOfficeが必要です。
http://ja.openoffice.org/download/
でインストールしてください。

KAHOにより制御しているのはPHPモジュールというものです。
./module/<module_name>/<module_name>.phpに保管されているPHPファイルと
入出力表を比べてみると

PHPファイル(例:news.php)
<?php
class News {
function NewsAdd ($parm){ 〜

とあります。
このclass Newsの"News"がモジュール
function NewsAddの"NewsAdd"がブロックにあたります。
そしてKAHOのタグをHTML内に記述することでこのPHPのブロックを実行することができます。
このKAHOのタグについての書き方等は後述に記載しています。

入出力表を見ると一番最初のページはBlockListとなっておりブロックの一覧が記載してあります。
NewsAddの概要を見てみると追加と書かれています。
NewsAddは追加についての処理を実行するブロックだということがわかります。

入出力表のNewsAddのタブに切り替えるとNewsAddの入出力表が出ます。
変数名とその概要を見れば入出力の内容及び変数名、メソッド等がわかります。
_
たとえば記事本文を追加するという実行を行うときには
NewsAddブロック変数News_Textを使えばいいということがわかります。

画面遷移及び使用モジュール/ブロックの選択

ページ毎の連携を把握するために画面遷移図を作成する。
さらにモジュール設計及び、サイト設計を元に、プログラミングが必要な機能について細分化する。
表示個所毎にブロック名を定義、ブロック内で行う処理概要を作成する。

どんな機能をサイトに組み込むか決めるで
大まかな機能が決まったので次は細分化していきます。
そして使用モジュール/ブロックを選択をしていきます。
MAP2で赤丸で囲んだところを例にしています。

MAP3

モジュールの設定

新規で作成するモジュールであれば、ブロックの機能を設定する。
あらかじめ用意されているモジュールを利用する際には、どのモジュールのどのブロックを使用するかを定義しておく。
モジュール作成については後述に記載している。

LANGファイルの設定

対応した文字コードのファイル内に記載する。
移植性を考えて他の文字コード名のファイル内にも同様に記載する。

$MESSAGE_モジュール名[エラーメッセージの種類]="エラーメッセージ" ;
任意のエラーメッセージを記入します。

グローバル変数の宣言
global $xxxx ;
コード内で利用するグローバル変数があれば宣言する。
(セキュリティ上は好ましくない)

スキンの書き方

ページ作成方法

Webページを作成する時には、デザイナーが仕上げたHTMLコードの中にスキンを埋め込んでいく。
一度ページのデザインを決めてしまえば、プログラムの変更があってもスキンの内部コードを変えるだけでページの更新が出来る。

スキンの書き方

下記は一例

<% block(module,module_block,parm1=a&parm2=b&parm3=c) %>

<% skin(module,module_block) %>

<% def(MESSAGE) %>
<!--エラー処理 -->
<% val(MESSAGE,xss) %>

<% /def %>


<% undef(MESSAGE) %>
<!--プログラム実行処理 -->
<% each(List) %>

<% val(List/Name) %>

<% /each %>

<% /undef %>

<% /skin %>

まずblockタグにて利用したいモジュールのブロックを実行させます。
引数は左からモジュール名、ブロック名、引数。
引数は複数指定する場合は「&」で接続する。
※引数を指定しない場合でも block(module, module_block,)とカンマをつけることに注意する。

skinタグでblockタグの結果を出力する場所をくくります。
引数は左からモジュール名、ブロック名。

def(MESSAGE)はMESSAGEが真の場合か何らかの値が代入されていれば(エラーがある場合)エラー処理を行い。
val(MESSAGE,xss)はエラーメッセージを出力します。
危険なタグや記号を出力しないようにXSSサニタナイズを実行し出力します。

undef(MESSAGE)はエラーが無い場合は正常処理を行うように記述する。
each(List)は繰り返し処理。
List配列の内容を繰り返して、配列がNULLになったらループ処理を終了する。
val(List/Name)は表示処理。
この場合はList[i][Name]の’i’をeachのループカウンタに設定し、繰り返し処理にて毎回異なるデータを表示させている。
’/’で区切ると配列扱いとされます。

KAHOのタグ一覧

HTMLファイル内で用いるKAHOのタグを下記に示す。
KAHOタグは"<% で始まり %>"で閉じる。
タグによってパラメータも指定できる。
なお、ここでの斜体文字は任意の文字列を表す。


blockタグ

<% block(module_name,block_name,parameter) %>

module_name  :実行したいブロック名(関数)を含むモジュール名(クラス名)を指定する。
block_name   :実行したいブロック名(関数名)を指定する。
parameter   :ブロック(関数)に渡す引数を指定する。引数が複数の場合は"&"で接続する。

blockタグはmodule_name内のblock_nameを実行する。blockタグはプログラムの実行に特化したタグで、実行した際のデータの受け渡しは後に説明するskinタグ内で利用するタグにて行うことができる。
引数は可変個であり省略も可能。引数を指定しない場合でも block(module_name,block_name,)とカンマをつけることに注意する。
複数の引数を渡す場合は"&"で接続する。これはGETメソッドとしてhttp://xxx.xx.jp?a=10&b=20&c=30などURLの最後にパラメータを接続させることと同様である。

blockタグの例
<% block(Login,User_List,ROW=10) %>
Loginクラス内User_List関数を実行、ROWに10を代入している。

skinタグ

<% skin(module_name,block_name) %> 〜 <% /skin %>

module_name  :blockタグで実行したクラス名を指定。
block_name  :blockタグで実行した関数名を指定。

skinタグはblockタグで実行したプログラムの出力したデータを利用する範囲を定めるもので
blockタグにて先にブロックの実行をしたあと
開始時に<% skin() %>、終了時に<% /skin %>を宣言します。

skinタグの例
<% skin(Login,Session) %>
<% val(MESSAGE) %>
<% /skin %>
blockタグにて実行したLoginモジュールSessionブロックの結果を出力します。
Sessionブロックの結果中のMESSAGEの内容を出力します。

skinタグにはタグ同士で範囲を指定するほかに下記のような書き方も出来る。
<% skin(module_name,block_name,file_name) %>

module_name  :blockタグで実行したクラス名を指定。
block_name   :blockタグで実行した関数名を指定。
file_name     :出力したいファイル名を指定。

先述の場合はタグで囲った範囲が変数の利用範囲となっていたが、この場合は指定したファイル内全てがデータの適用範囲となる。
複数のページで共通部分がある場合その部分を外部ファイルにすると
各パーツをいちいち書き換える必要がなくなりその外部ファイルだけを修正すればいいので便利です。
このような使い方もできます。

<% skin(Login,Session,session.html) %>
session.htmlファイルを読み込み、blockタグにて実行したLoginモジュールSessionブロックの結果を
session.htmlに記述されている内容に出力します。
(session.htmlファイル内では、他のタグを使用することもできます。)

setタグ

<% set(data,METHOD,parameter) %>

data     :前プログラムの変数名
METHOD  :メソッド
parameter :次のプログラムの変数名dataMETHODで指定したメソッドでparameterに代入する。

block(Input_Out, Post,) %>
<% set(ID, POST, UserID) %>
<% block(module_name, block_name,) %>
Input_OutモジュールのPostブロックの実行結果である変数IDを、変数 UserIDに代入し、module_nameモジュール
block_nameブロック実行に引き継いでいる。

使い方としてはユーザーとその対応した画像を載せるような時に使います。


出力タグ

<% val(parameter1,parameter2) %>

parameter1   :モジュール内で設定した出力変数名。
parameter2   :出力オプション (raw, url, xss, js(複数同時に使用可能))。


<% val(parameter1) %>

parameterに代入された値を出力する。
出力の際には改行コードを<br>タグに変換して出力する。

例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合)
<% val(MESSAGE) %>
出力は
TEST1<br>TEST2<br>TEST3
となる。
ブラウザは
TEST1
TEST2
TEST3

<% val(parameter1,raw) %>

parameterに代入された値を出力する。
データ内の値を変換せずにそのまま出力する。

例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合)
<% val(MESSAGE,raw) %>
出力は
TEST1 TEST2<br>TEST3
となる。
ブラウザは
TEST1 TEST2
TEST3

<% val(parameter1,xss) %>

parameterに代入された値を出力する。
値に対してXSSサニタナイズを実行し危険な記号やタグを変換して出力する。
<>のようなタグ記号を&lt;&gt;等に変換して出力します
Cookieの漏洩やスクリプトの埋め込みなどを防ぎます。(XSS対策)

例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合)
<% val(MESSAGE,xss) %>
出力は
TEST1<br>TEST2&lt;br&gt;TEST3
となる。
ブラウザは
TEST1
TEST2<br>TEST3

<% val(parameter1,url) %>

parameterに代入された値を出力する。
値に対してURIエンコーディングを実行し出力する。

例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合)
<% val(MESSAGE,url) %>
出力は
TEST1%0ATEST2%3Cbr%3ETEST3
となる。
ブラウザは
TEST1%0ATEST2%3Cbr%3ETEST3

<% val(parameter1,xss.raw) %>

parameterに代入された値を出力する。
値に対してXSSサニタナイズを実行し、改行を変換せずに出力する

例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合)
<% val(MESSAGE,xss,raw) %>
出力は
TEST1 TEST2&lt;br&gt;TEST3
となる。
ブラウザは
TEST1 TEST2
TEST3

<% val(parameter1,js) %>

parameterに代入された値を出力する。
Javascript用に改行コードを\nに変換して出力する


*現在は下記のような書き方もできるがサポートしなくなる予定です。

<% rval() %>  raw
<% xval() %> xss
<% uval() %> url
<% xrval() %> xss,raw

出力タグの機能早見表
改行→<br> XSSサニタナイズ URIエンコーディング
val × ×
rval × × ×
xval ×
uval × ×
xrval × ×

繰り返しタグ

<% list(LIST) %> 〜 <% /list %> <% each(LIST) %> 〜 <% /each %>

LIST  :モジュール内で値を設定された配列

配列を内部ループカウンタによって繰り返し、その間は<% list(LIST) %> 〜 <% /list %>(もしくは<% each(LIST) %> 〜 <% /each %>)の間を繰り返し出力する。配列の終端がくれば繰り返し処理を終了する。
’/’で区切ると配列扱いとされる。

*<% each() %>は現在はサポートしていますがサポートしなくなる予定です。

例:配列”LIST”の終端までを出力する処理を行う。
値を以下のように設定。

LIST[0][" MESSAGE"] = "一番目" ;
LIST[1][" MESSAGE"] = "二番目" ;
LIST[2][" MESSAGE"] = "三番目" ;

<% list( LIST) %>
<% val( LIST/ MESSAGE) %>
<br>
<% /list %>
出力は


一番目<br>
二番目<br>
三番目<br>


となる。

多重ループも可能。

例:配列”LIST”の終端までを出力する処理を行う。
値を以下のように設定。

LIST[0]["CLASS"] = "1−1" ;
LIST[0]["CLASS"][0]["NAME"] = "中山" ;
LIST[0]["CLASS"][1]["NAME"] = "森崎" ;
LIST[0]["CLASS"][2]["NAME"] = "坂戸" ;
LIST[1]["CLASS"] = "1−2" ;
LIST[1]["CLASS"][0]["NAME"] = "大島" ;
LIST[1]["CLASS"][1]["NAME"] = "志村" ;
LIST[1]["CLASS"][2]["NAME"] = "桑原" ;

<% list( LIST) %>
<% val( LIST/CLASS) %>
<br>
<% list( LIST/CLASS) %>
<% val(LIST/CLASS/NAME) %>
<br>
<% /list %>
<br>
<% /list %>

出力は


1−1<br>
中山<br>
森崎<br>
坂戸<br>

1−2<br>
大島<br>
志村<br>
桑原<br>
<br>

となる。

条件指定タグ

<% if(MESSAGE) %> 〜 <% /if %> <% def(MESSAGE) %> 〜 <% /def %>
<% undef(MESSAGE) %> 〜 <% /undef %>

MESSAGE :条件式。変数の代わりに数式も使用できる。 if、defはMESSAGEに何らかの値が代入されていれば、タグ間が出力される。ifとdefは機能は全く一緒である。undefはMESSAGEがNULL(値がない)の時に実行される。if(あるいはdef)タグと同じ変数を指定すればelseのような使い方が出来る。

変数の代わりに式を用いることも出来る。
<% if(A,COMP ,B) %> 〜 <% /if %>

Aは左辺、Bは右辺、COMPは比較演算子である。
比較演算子は文字列扱いとする。入力した値がそのまま採用されるのでダブルクォートやシングルクォートで囲む必要は無い。
右辺、演算子、左辺それぞれの間を ,(カンマ) で区切る。上記例では if を使用しているが、def、undef の場合も同様の書式で記述できる
比較演算子を下記に示す。

比較演算子
A = B  AとBが等しい場合、真
A == B  AとBが等しい場合、真
A != B  AとBが等しくない場合、真
A <> B  AとBが等しくない場合、真 
A > B  AがBより大きい場合、真
A >= B  AがB以上の場合、真
A < B  AがBより小さい場合、真
A <= B  AがB以下の場合、真
例1:MESSAGE=NULLの場合。
<% def(MESSAGE) %>
<% val(MESSAGE) %> <% /def %>
<% undef(MESSAGE) %>
エラーはありません。
<% /undef %>
出力は

エラーはありません。

となる。
例2:TBLにonが設定されているとき
<% if(TBL,=,on) %>
<TABLE><Tbody><TR>
<TD>テーブル表示中</TD>
</TR></Tbody></TABLE>
<% /if %>
ブラウザは
テーブル表示中
となる。

モジュール制作

本当に必要なモジュールなの?

KAHOモジュールには既にいくつかの機能がある。
開発期間を短くするためにもこれらを積極的に利用していくべきである。

すでに用意されているモジュールに重複する機能は無いか、モジュールを作らずとも他の機能で代替できないか、検討する。

モジュールの新規作成と拡張について

モジュールを作成するときは、後ほど仕様変更があっても対応できるように冗長性をもたせて作成しておく。
既存のモジュールもクラスの継承を行うことによって拡張させることができる。

モジュールを作成する上での決まりごと

他の変数やブロック名と重複しないように以下のように定める。

ブロック名の命名規約

<module_name> _ <block_name>
モジュール名   ブロック名

入力と出力について

モジュールのブロックごとに入出力を定める。

入力にはGet、Postメソッドなどのほか、引数として$param配列を利用する。
出力は$out配列を利用する。

ブロックの入出力は仕様変更などがあった際に管理しやすいように入出力表を作っておくと便利。

例:
Login::Login_Check
メソッド> I/O 変数名 概要
Post In Login_ID ユーザID
    Login_EMAIL ユーザE-mail
    Login_PASSWORD ユーザパスワード
       
Session Out Login_UID ユーザID
       
Output   MESSAGE エラーメッセージ
    EMAIL ユーザE-mail
    ID ユーザID
    NAME ユーザ名

変数命名基準

モジュール共有のメッセージ変数

$MESSAGE_ <module_name> [ <message_name>']
  モジュール名 モジュール共有メッセージ

グローバル変数が必要な場合には下記命名規約に沿って変数を設定する。

 <module_name> _ <var_name>
モジュール名 変数名

DBの操作について

PHPのPDOを使い、プリペアドステートメントを用いて、SQLインジェクション対策を行う。

pdoSelect($sql, $bindObjs)

SQL文のSELECTを実行する。
サンプル1: 検索条件が静的でかつ単一
フルネーム: Ichiro Suzuki で検索
テーブルデータは以下のとおり
UserID fullname score available
1 Taro Yamada 55.6 TRUE
2 Ichiro Suzuki 33 TRUE
3 Daisuke Sato 45 TRUE
          //sql
          $sql ="SELECT US.userID, US.fullname ,US.score";
          $sql.=" FROM Users US";
          $sql.=" WHERE US.available =TRUE";

          //bindObjs
          $bindObjs = array();        //プレースホルダーにバインドする配列を初期化

          //fullname
          $sql.=" AND US.fullname = :fullname";   //プレースホルダー付きのSQL文 :fullname がプレースホルダー

          //プレースホルダーと検索値をバインド key: プレースホルダー名, value: バインドする値, type: 値のデータ型
          array_push($bindObjs, array('key' => ':fullname', 'value' => 'Ichiro Suzuki', 'type' => PDO::PARAM_STR) );

          //実行
          $list_value = pdoSelect($sql, $bindObjs);
          if( strlen($list_value['MESSAGE']) ){
            $message.=$list_value['MESSAGE'];   //異常時は MESSAGEキーに文字列が格納される。
          }

          /*
            $list_value[0][0]・・・ 2
            $list_value[0][1]・・・ Ichiro Suzuki
            $list_value[0][2]・・・ 33
          */
          
サンプル2: 検索条件が動的でかつ複数
ユーザーIDが3未満で、scoreが40以上で検索
テーブルデータはサンプル1と同一
          //検索条件
          $userID_below = 3;
          $score_above = 40;

          //sql
          $sql ="SELECT US.userID, US.fullname ,US.score";
          $sql.=" FROM Users US";
          $sql.=" WHERE US.available =TRUE";

          //bindObjs
          $bindObjs = array();        //プレースホルダーにバインドする配列を初期化

          //userID_below
          if( isset($userID_below) ){
            $sql.=" AND US.userID < :userID_below";   //プレースホルダー付きのSQL文 :userID_below がプレースホルダー

            //プレースホルダーと検索値をバインド key: プレースホルダー名, value: バインドする値, type: 値のデータ型
            array_push($bindObjs, array('key' => ':userID_below', 'value' => $userID_below, 'type' => PDO::PARAM_INT) );
          }

          //score_above
          if( isset($score_above) ){
            $sql.=" AND US.score >= :score_above";
            array_push($bindObjs, array('key' => ':score_above', 'value' => $score_above, 'type' => PDO::PARAM_INT) );
          }

          //実行
          $list_value = pdoSelect($sql, $bindObjs);
          if( strlen($list_value['MESSAGE']) ){
            $message.=$list_value['MESSAGE'];   //異常時は MESSAGEキーに文字列が格納される。
          }

          /*
            $list_value[0][0]・・・ 1
            $list_value[0][1]・・・ Taro Yamada
            $list_value[0][2]・・・ 55.6
          */
          

pdoRun($sql, $bindObjs)

SQL文の INSERT / UPDATE を実行する。
サンプル1: INSERT (データ追加)
ユーザーIDが4、フルネームが Kei Araki、スコアが 70 のデータを追加
            //プレースホルダー付きのSQL文
            $sql ="INSERT INTO Users(";
            $sql.="    userID, fullname, score";
            $sql.=") VALUES (";
            $sql.="    :userID, :fullname, :score";
            $sql.=")";

            //bindObjs
            $bindObjs = array();     //プレースホルダーにバインドする配列を初期化
            $bindObjs[] = array('key' => ':userID',     'value'=> 4,            'type' => PDO::PARAM_INT);  //:userID をバインド
            $bindObjs[] = array('key' => ':fullname',   'value'=> 'Kei Araki',  'type' => PDO::PARAM_STR);  //:fullname をバインド
            $bindObjs[] = array('key' => ':score',      'value'=> 70,           'type' => PDO::PARAM_INT);  //:score をバインド

            //実行
            $fld_value=pdoRun($sql, $bindObjs);
            if( strlen($fld_value['MESSAGE']) ){
              $message.=$fld_value['MESSAGE'];    //異常時は MESSAGEキーに文字列が格納される。
            }

            /*
              $fld_value・・・ TRUE
            */
          
サンプル2: UPDATE (データ更新)
ユーザーIDが4のデータを、フルネームは Kei Araki から Satoru Tanaka へ、スコアは 70 から 65 へデータを更新
          $userID = 4;   //対象ユーザーID
          $fullname = 'Satoru Tanaka';    //新フルネーム
          $score = 65;    //新スコア

          $sql ="UPDATE Users";
          $bindObjs=array();

          //fullname
          $sql.=" SET fullname = :fullname";
          $bindObjs[] = array("key" => ":fullname", "value" => $fullname, "type" => PDO::PARAM_STR );

          //score
          if( isset($score)){
            if( is_numeric($score) ){
              $sql.="    ,score = :score";
              $bindObjs[] = array("key" => ":score", "value" => $score, "type" => PDO::PARAM_INT );
            } else {
              $sql.="    ,score = :score";
              $bindObjs[] = array("key" => ":score", "value" => NULL, "type" => PDO::PARAM_NULL );    //NULL値に更新する場合。データタイプは、PDO::PARAM_NULL になる。
            }
          }

          $sql.=" WHERE userID = :userID";
          $bindObjs[] = array("key" => ":userID", "value" => $userID, "type" => PDO::PARAM_INT );

          //実行
          $fld_value=pdoRun($sql, $bindObjs);
          if( strlen($fld_value['MESSAGE']) ){
            $message.=$fld_value['MESSAGE'];  //異常時は MESSAGEキーに文字列が格納される。
          }

          /*
            $fld_value・・・ TRUE
          */
          

データーベース毎のSQL文の切替

PDOを用いることにより、データーベース接続およびSQL実行のインターフェイスは統一されるが、SQL文自体のDB毎の差異は吸収しない。SQL文自体はそのまま実行される。よってDB種別に応じてSQL文を書き分ける必要が生じる。
サンプル: PostgreSQLとMySQLでSQL文の書き分け
テーブルデータは以下のとおり
userID fullname score birthdate available
1 Taro Yamada 55.6 1990/01/02 13:01 TRUE
2 Ichiro Suzuki 33 1991/03/04 14:02 TRUE
3 Daisuke Sato 45 1992/05/06 15:03 TRUE
          global $MAIN_DB;    //DB種別登録グローバル変数

          switch($MAIN_DB['DB']){
            case 'postgres':        //PostgreSQL用のSQL文。PostgreSQLでは時間を文字列表記するためにTO_CHAR関数を使用する。
              $sql ="SELECT US.userID, US.fullname ,US.score";
              $sql.="    ,TO_CHAR(US.birthdate, 'YYYY-MM-DD'), TO_CHAR(US.birthdate, 'HH24:MI:SS')";    //
              $sql.=" FROM Users US";
              $sql.=" WHERE US.available =TRUE";
            break;
            case 'mysql':          //MySQL用のSQL文。MySQLでは時間を文字列表記するためにDATE_FORMAT関数を使用する。
              $sql ="SELECT US.userID, US.fullname ,US.score";
              $sql.="    ,DATE_FORMAT(US.birthdate, '%Y-%m-%d'), DATE_FORMAT(US.birthdate, '%H:%i:%s')";
              $sql.=" FROM Users US";
              $sql.=" WHERE US.available =TRUE";
            break;
          }

          //userID
          $sql.=" AND US.userID = :userID";
          $bindObjs=array();
          $bindObjs[]=array('key'=>':userID', "value" => 1, "type" => PDO::PARAM_INT );

          //SQL文実行
          $list_value=pdoSelect($sql, $bindObjs);
          if( strlen($list_value['MESSAGE']) ){
            $message.=$list_value['MESSAGE'];   //異常時はMESSAGEキーに文字列が代入される。
          }

          /*
            $list_value[0][0]・・・ 1
            $list_value[0][1]・・・ Taro Yamada
            $list_value[0][2]・・・ 55.6
            $list_value[0][3]・・・ 1990-01-02
            $list_value[0][4]・・・ 13:01:00
          */
          

データーバインディングのデータ型

バインドする値には型指定をする必要があるが、主に以下を基準にて行う。
定数名 値の種類
PDO::PARAM_BOOL Boolean型
PDO::PARAM_NULL NULLの時は、明示的にこの型を指定する
PDO::PARAM_INT 数値。小数点も可能
PDO::PARAM_STR 文字列。日時もこの型にて使用可能
詳細については以下を参照。
PHP: Predefined Constants - Manual: http://php.net/manual/en/pdo.constants.php

その他

作成したモジュールの公開

KAHOのコアモジュールのライセンスは修正BSDライセンスとなっております。
自由に改変して利用、販売頂いて構いません。
強制ではありませんが、汎用的な改変内容等フィードバック頂き、
よりKAHOの発展に寄与頂ければと願います。
その他各モジュールにつきましては、モジュール毎のライセンスとなりますので
ご確認下さい(主にBSD及びGPLが使用されております)。

以上