オープンソース協議会 – IBM i
2015年度 第1回勉強会
PHP on IBM i 実践 ~後編~
2015/7/17
株式会社オムニサイエンス
田中昌宏・加邉真也
アジェンダ
会社紹介
サンプルソースの概要
データベース更新の基礎
~休憩~
jQueryの基礎
jQueryの基本的な使い方
PDF出力
サンプルソース解説
会社紹介
会社紹介
会 社 名
創
業
所 在 地
社 員 数
事 業 内 容
:
:
:
:
:
株式会社オムニサイエンス
1987年6月18日
東京都千代田区内神田1-5-4 ミヤコビル7F
40名
・システム受託開発/ソリューション販売/技術サポート
・技術者派遣サービス
株式会社オムニサイエンス システム開発部 田中昌宏・加邉真也 [email protected] [email protected] 03-5217-2311オープン
IBM i
サンプルソースの概要
機能イメージ
1.商品マスタ一覧 商品マスタ 2.新規登録 更新処理 CL(RPG) 3.更新 4.削除 5.PDF出力(一覧) 商品マスタIFS
※IFS上に商品画像をアップロードサンプルソースの概要
画面イメージ(デモ)
サンプルソースの概要
ポイント
• バリデーションチェック
サーバーサイド(PHP)でバリデーションのチェックを行っています。
• トランザクション制御
データベース更新処理の途中でエラーが発生した場合、
ロールバック処理を行っています。
• jQuery
jQueryを用いてAjax、オブジェクト操作を実装しています。
• PDF出力
TCPDF + FPDIを用いて、テンプレートからPDFを出力しています。
サンプルソースの概要
前提となる環境
サーバー
クライアント
ハードウェア
IBM Power Systems
IBM i ( System i、i5、iSeries )
オペレーティングシステム
i5/OS V5R4 以降
Webサーバー
Zend Server for IBM i Version5.1 以降
PHP 5.3 以降
サンプルソースの概要
使用するライブラリー等
ライブラリ
説明
jQuery 1.11.2
Javascriptを容易に記述できるように設計されたjavascripライブラリで
す。
DataTables 1.10.6
HTMLのテーブルにソートやページング、フィルタリングなどの動きをつ
けるjQueryのプラグインです。
Bootstrap 3.3.4
見た目を整えたり、レスポンシブなWebデザインを簡単に作成できる
CSSのフレームワークです。
DataTableBootstrap
DataTablesの見た目をBootstrapに合わせたデザインに変更できる
DataTablesのプラグインです。
TCPDF
PHPでPDFを作成するPHPライブラリーです。
FPDI
PHPで既存のPDFファイルを読み込む為のライブラリです。
サンプルソースの概要
処理詳細
• 商品マスタ一覧画面(shouhin.php)
検索条件入力・検索クリック Ajaxリクエスト・レスポンス 商品マスタ 一覧表示PHP shouhin_listAjax.php SQL レスポンスされたJSONデータを グリッドに一覧表示する 削除ボタン Ajaxリクエスト・レスポンス 商品マスタ削除処理 shouhin_delete_ajax .php ストアドプロシージャ SHN001P 商品マスタ更新CL SHN001C SQL 新規登録・更新処理 削除モードで実行 【RPG処理】※削除モード 渡された商品コードをキーに 商品マスタをCHAINしてDELETEサンプルソースの概要
登録 or 更新ボタン Ajaxリクエスト・レスポンス バリデーション/存在 チェック shouhin_registercheck .php バリデーションエラーの場合、 エラー内容を表示 Ajaxリクエスト・レスポンス 商品マスタ更新処理 shouhin_register_ajax .php ストアドプロシージャ SHN001P 商品マスタ更新CL SHN001C 商品マスタ SQL 商品マスタ更新RPG SHN001R• 商品詳細画面(shouhin_register.php)
エラー無しの場合、更新処理を実行 【RPG処理】※登録・更新モード パラメータで渡された画面入力値を基に、 商品マスタを WRITE or UPDATE ※登録時のみ、商品コードの存在チェック行う 商品マスタ SQLIFS
商品画像をIFSフォルダにアップロードAjaxリクエスト・レスポンス
サンプルソースの概要
PDF出力実行 PDF出力処理 pdf.php 商品マスタ PDF生成OKの場合、ダウンロード要求 PDFダウンロード downloadpdf.php レスポンス リクエスト SQL TCPDF + FPDI でPDFファイルを生成 ダウンロードを開始 テンプレートのPDFを読み込み、 商品マスタ一覧 テンプレート• PDF出力
サンプルソースの概要
プログラム構成(Web)
omniwork ajax ajaxファイル common common.php config.php msg.php image lib phplib PDF fpdi ipag00303 tcpdf Weblib Bootstrap DataTables DataTableBootstrap Jquery osc temp 画面PHPファイル ajax ajax通信で使用するファイルを格納しています。 common PHPで共通でインクルードするファイルを格納しています。 image システムで使用する画像を格納しています。 lib システムで使用するライブラリを格納しています。 temp PDFダウンロードファイルを一時的に格納しています。データベース更新の基礎
バリデーションチェック
• バリデーションチェックの重要性
Webシステムにおける、フォームに入力された内容のチェックは非常に
重要です。
「マスターに存在するか?」等の論理的なチェック以前に
入力された値(バリデーション)自体の属性や桁数などチェックが必要です。
最終的にデータベース更新の前に必ず全ての項目について、
バリデーションのチェックを行うようにします。
• チェックの流れは以下の通りです。
ブラウザでのチェックは突破される危険性があります。
サーバー(PHP)でのチェックはデータ整合性の最後の砦ですので、
必ず行うようにしましょう。
ブラウザでの バリデーション チェック サーバー(PHP)での バリデーション チェック (必須) データベース 更新データベース更新の基礎
例) PHP(サーバー)での正規表現を用いた、取り得る値のチェック
preg_match('正規表現', チェックしたい値); でチェックします
共通関数として作成すると便利です
<?php
//数値チェック関数(ユーザー関数)
function checkNum($data) {
if(
preg_match('/^[-+]?¥d+(¥.¥d+)?$/', $data)
){
return true;
}
return false;
}
//入力値が数値か?
if (isset($_POST['num'])){
if(checkNum($_POST['num'])){
$errmsg='numは数値ではありません';
}
}
データベース更新の基礎
当サンプルに含まれるPHP(サーバー)でのバリデーションチェック関数の種類と内容
・checkByte
IBM i 上でのバイト数を返す
※全角文字の場合、SI/SOを考慮
・checkMaxLenNum
数値(整数部、小数部)のレングスチェック
・checkMaxLen
文字列のレングスチェック
・checkNuturalNum
値が数値(0~9)で構成されているかのチェック
・checkPositiveNum
値が数値(0~9)と"."小数点で構成されているかのチェック
・ IsHalfWidthText
値が半角文字のみで構成されているかのチェック
・ checkAlphaNum
値が英数字(記号不可)のみで構成されているかのチェック
データベース更新の基礎
参考) ブラウザでのバリデーションチェック
サーバーに入力データを送信する前にブラウザ側でバリデーションをある程度
制御することは可能です。
1.MaxLength(最大入力文字数)、IMEモード(全角or半角)の設定等
2.キー入力制御
入力フィールドでキーが押された時のイベントをJavascriptで制御し、
特定の文字のみを入力される等・・・
3.Javascriptでのバリデーションチェックや値の変換
作成するアプリケーションの要件に合わせて、サーバー(PHP)でのチェック
と組み合わせて使用する。
データベース更新の基礎
トランザクション制御
• トランザクションとは
データベースに対する複数の操作(挿入、更新、削除)を
実行している途中に仮にエラー発生したとしても、
データの整合性を保証するデータベースシステムのメカニズムです。
複数のデータベース操作を一つの処理単位(トランザクション)とし、
確定(コミット) or 元に戻す(ロールバック)という考え方を基本とします。
データベース更新の基礎
PHP on IBM i でのトランザクション処理 1.ジャーナルの作成と開始(IBM i コマンド) トランザクション処理を行うには、IBM i 側でジャーナルを開始しておく 必要があります。 ジャーナルとはIBM i 上で、データベースの更新履歴を記録する仕組みです。/*ジャーナルレシーバーの作成*/
CRTJRNRCV JRNRCV(OMNIWORK/OMNJRNRCV)
/*ジャーナルの作成*/
CRTJRN JRN(OMNIWORK/OMNJRN) JRNRCV(OMNIWORK/OMNJRNRCV)
DLTRCV(*YES)
/*物理ファイルのジャーナル開始*/
STRJRNPF FILE(OMNIWORK/SHNMST) JRN(OMNIWORK/OMNJRN)
IMAGES(*BOTH) OMTJRNE(*OPNCLO)
データベース更新の基礎
2.PHPでデータベース接続後にトランザクションを開始
以下のオプションを指定して、トランザクションを開始します。
・自動コミットをOFF
・分離レベルを指定して、トランザクションを開始
<?php
//データベースへの接続
$db=db2_connect('*LOCAL', '', '',
array('i5_naming'=>DB2_I5_NAMING_ON,
'i5_libl'=>'QGPL QTEMP OMNIWORK'));
//自動コミットをOFF
db2_autocommit($db, DB2_AUTOCOMMIT_OFF);
//分離レベルを指定してトランザクションを開始
db2_exec($db, 'SET TRANSACTION ISOLATION
データベース更新の基礎
3.コミット or ロールバック
db2_commit, db2_rollbackの何れかが発行されると、トランザクションが終了します。
db2_commitを発行せずにdb2_closeすると自動的にrollbackされます
・・・前ページより
//データベースの更新①
db2_exec($db, 'DELETE FROM SHNMST');
// ロールバック
db2_rollback($db);
//再度、分離レベルを指定してトランザクションを開始
db2_exec($db, 'SET TRANSACTION ISOLATION
LEVEL READ COMMITTED');
//データベースの更新②
db2_exec($db, "INSERT INTO SHNMST VALUES('00002','佐藤',29)");
// コミット
db2_commit($db);
データベース更新の基礎
参考) PHP→RPGで更新処理を行う場合"COMMIT"定義が必要です
データベース更新の基礎
参考) トランザクションの分離レベル
複数のユーザーが同じデータベースに対して操作を行う場合に、
データアクセスを制御し、望ましくない現象を発生させないようにすることも、
トランザクションの重要なメカニズムです。
これをトランザクションの分離レベルといいます。
分離レベルには以下の4つの指定があります。
SET TRANSACTION
ISOLATION LEVEL
xxxx
略称
ダーティーリード
反復不能読み取り
ファントムリード
READ UNCOMMITTED
UR
ありえる
ありえる
ありえる
READ COMMITTED
CS
安全
ありえる
ありえる
REPEATABLE READ
RS
安全
安全
ありえる
SERIALIZABLE
RR
安全
安全
安全
並行性が高い 整合性が高いjQueryはオープンソースのJavaScriptライブラリの一つで、
JavaScript上で動作します。
他のprototype.jsなどのライブラリと比較して、
非常に軽量で高速であることが特徴で、現在最も利用されている
ライブラリです。
ライブラリとは、よく使う機能をいくつも纏めてあるものを示します。
jQueryを利用することで、シンプルなコードでWebページに効果や
アニメーション、ユーザインターフェース要素などを追加でき、
Ajaxによる通信も容易に実装できるようになります。
また、様々な機能を実現する豊富な対応プラグインも公開されています。
jQueryの利用にはJavaScriptの基礎知識が必要です。
jQueryの基礎
1.オブジェクト操作の記述簡略化
例えば・・・
上記のようなラジオボタンから、選択されている要素の値を取得する場合
<input type="radio" name="fruit" value="リンゴ" checked> リンゴ
<input type="radio" name="fruit" value="いちご"> いちご
<input type="radio" name="fruit" value="みかん"> みかん
//JavaScriptで記述すると・・・
var fruit = document.getElementsByName("fruit");
for(var i=0; i<fruit.length; i++){
if (fruit[i].checked) {
val = fruit[i].value;
break;
}
}
jQueryの基礎
上記のように jQueryを利用することで、オブジェクト操作の
ロジック記述を簡略化することが可能です。
2.タブやカレンダーの実装
jQuery UI(プラグイン) を利用してタブやカレンダーなどの
実装が容易に行えます。
//jQueryで記述すると
var val = $('[name="fruit"]:checked').val();
jQueryの基礎
3.Ajaxの実装
Ajaxとは
JavaScriptを用いて非同期でサーバーと通信を行い、
その結果から動的にHTMLを書き換える技法を指します。
リクエスト→レスポンスの度に、ページ全体の読込が発生
Ajaxを使わない場合jQueryの基礎
JavaScriptがバックグラウンドでサーバーと通信を行い、
結果ページの一部を書き換える
→ページ全体の読込が発生しない
Ajaxを使った場合