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/)より入手できます。
下記を参考にファイルをアップロードする。
セキュリティ上、必要に応じてファイル名を変えることをお勧めします。
![]()
|
![]()
|
変数の説明
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で赤丸で囲んだBBSの画面推移図です。
このようにきちんと書いておけばページ構成がわかるだけでなく
どのページでどのような機能を使えばいいのかわかりやすくなる。
サイト設計時にて作成した画面遷移図などをもとに、どのモジュールを使用するか選択する。
(必要な機能が無い場合は、新たにモジュールを開発する事になる。)
既存で使用できるモジュールがあれば積極的に活用する。
●既存モジュール一覧 | ||||||||||||||||||||
|
既存モジュールの入出力表は
./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で赤丸で囲んだところを例にしています。
新規で作成するモジュールであれば、ブロックの機能を設定する。
あらかじめ用意されているモジュールを利用する際には、どのモジュールのどのブロックを使用するかを定義しておく。
モジュール作成については後述に記載している。
対応した文字コードのファイル内に記載する。
移植性を考えて他の文字コード名のファイル内にも同様に記載する。
$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のループカウンタに設定し、繰り返し処理にて毎回異なるデータを表示させている。
’/’で区切ると配列扱いとされます。
HTMLファイル内で用いるKAHOのタグを下記に示す。
KAHOタグは"<% で始まり %>"で閉じる。
タグによってパラメータも指定できる。
なお、ここでの斜体文字は任意の文字列を表す。
<% 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(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(data,METHOD,parameter) %>
data :前プログラムの変数名
METHOD :メソッド
parameter :次のプログラムの変数名dataをMETHODで指定したメソッドで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サニタナイズを実行し危険な記号やタグを変換して出力する。
<>のようなタグ記号を<>等に変換して出力します
Cookieの漏洩やスクリプトの埋め込みなどを防ぎます。(XSS対策)
例 (parameterに"TEST1\nTEST2<br>TEST3"と設定されている場合) |
<% val(MESSAGE,xss) %> |
出力は TEST1<br>TEST2<br>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<br>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配列を利用する。
ブロックの入出力は仕様変更などがあった際に管理しやすいように入出力表を作っておくと便利。
例: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
モジュール共有のメッセージ変数
$MESSAGE_ | <module_name> | [ | <message_name>'] |
モジュール名 | モジュール共有メッセージ |
グローバル変数が必要な場合には下記命名規約に沿って変数を設定する。
<module_name> | _ | <var_name> |
モジュール名 | 変数名 |
PHPのPDOを使い、プリペアドステートメントを用いて、SQLインジェクション対策を行う。
$bindObjs = array( array('key' => ..., 'value' => ... , 'type' => ... ) ,array('key' => ..., 'value' => ... , 'type' => ... ) , ... );各キーは以下のとおり
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 */
//検索条件 $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 */
$bindObjs = array( array('key' => ..., 'value' => ... , 'type' => ... ) ,array('key' => ..., 'value' => ... , 'type' => ... ) , ... );各キーは以下のとおり
//プレースホルダー付きの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 */
$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 */
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 | 文字列。日時もこの型にて使用可能 |
KAHOのコアモジュールのライセンスは修正BSDライセンスとなっております。
自由に改変して利用、販売頂いて構いません。
強制ではありませんが、汎用的な改変内容等フィードバック頂き、
よりKAHOの発展に寄与頂ければと願います。
その他各モジュールにつきましては、モジュール毎のライセンスとなりますので
ご確認下さい(主にBSD及びGPLが使用されております)。
以上