【T5】Delphi for PHPテクニカルセッション「Delphi for PHPによるビジュアルWebアプリケーション開発」
CodeGear
高橋智宏

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

1アジェンダ• Update 2• Delphi for PHP のおさらい• サンプルアプリケーションの作成• セッションデータをMySQLへ• PEARライブラリとの統合• データベースコンポーネントとMySQL• FormValidatorコンポーネント

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2

1

Update 2（Version 1.0.2.539）• 8月23日にリリース• http://www.codegear.com/jp/downloads/regusers/delphiphp• トライアル版(14日)も Update 2 対応済み
• http://www.codegear.com/jp/downloads/free• 大量の不具合修正• コンポーネントの追加• ドキュメント内容の改善

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

3Update 2 のインストール• Apache 2.0.52• PHP 5.2.2• デバッガ （NuSphere DBG Listener 2.15.5）• VCL for PHP Ver1.2• gettext 拡張• <Windows>¥System32にインストール• libmySQL.dll

MySQL5.0, Ver 5.0.22• gds32.dll

InterBase 2007, Ver 8.1.0.257

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

42

VCL for PHP Ver1.2
追加されたもの• Uploadコンポーネント• FormValidatorコンポーネント• JQSliderコンポーネント• PearDataGridコンポーネント• MySQL専用コンポーネント群

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

5

Delphi for PHP のおさらい
日本語を利用するためには
イベントハンドラの書き方

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

63

初期設定
• 新規作成するファイルはUTF-8で• IDE設定 Æ [Use UTF-8 to create new units and forms] を ON
• フォームのソース(.php)、デザイン情報のファイル(.xml.php)• エディタのフォントを変更• 予約語の Bold, Italic を OFFに
• php.ini をUTF-8用に設定変更• IDE設定 Æ php.ini.template Æ php.ini• フォーム（Pageクラス）の Encoding プロパティを「utf-8」に• <meta http-equiv="Content-Type" content="text/html;charset=utf-8">• KB: http://support.codegear.com/jp/article/34195
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

7

UTF-8特有の問題点• 以下の問題点を認識しています…
• ソースコードにBOMが付いてしまう• カスタムコンポーネントの実装・登録• JPEGデータを出力する場合• VCL for PHP のデータモジュール
etc…

• デバッガでUTF-8の文字列が表示できない

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

84

イベントハンドラの記述• コンポーネントの[Events]のイベントハンドラ• 例：Buttonコンポーネントの[Events] - [OnClick]• PHPコードのみを記述<?php...
class Unit1 extends Page{
public $Label1 = null;public $Edit1 = null;public $Button1 = null;function Button1Click($sender, $params){$this->Label1->Caption = $this->Edit1->Text . ‘さん、こんにちは’;}
}
...
...
?>

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

9

イベントハンドラの記述（続き）• コンポーネントの[Javascript]のイベントハンドラ• 例：Pageコンポーネントの[Javascript] - [OnLoad]• PHPコードと、クライアント側向けJavaScriptソースの両方を記述可能 <?php...
class Unit1 extends Page{
public $Edit1 = null;function Unit1JSLoad($sender, $params){?>
var fullname = "<?php echo $this->Edit1->Text; ?>";
if( fullname.length > 0 ) {var msg = fullname + "さん、こんにちは";alert(msg);}
return true;<?php}}...
?>
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

JavaScriptとPHPが混在

105

ページの遷移方法• redirect 関数を使用 - VCL for PHP のランタイム rtl.inc.php/*** Redirects the browser to a project file
* @param string $file File to redirect to*/function redirect( $file ){$host = $_SERVER[ 'HTTP_HOST' ];$uri = rtrim( dirname( $_SERVER[ 'PHP_SELF' ] ), '/¥¥' );header( 'Location: http://' . $host . $uri . '/' . $file );exit();}• リダイレクト先のURLにリクエストを埋め込む – ‘xxx.php?id=123’• $_SESSION 変数でデータを共有...
class Unit1 extends Page{
public $Edit1 = null;function Button1Click($sender, $params){$_SESSION['fullname'] = $this->Edit1->Text;
redirect("unit2.php");}}...
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

11

PHPのfilter機能• 入力文字列のサニタイズ - VCL for PHP のランタイム system.inc.php
例：EditコンポーネントのTextプロパティ• “Æ &#34;• ‘Æ &#39;• &, > Æ &, > のまま• <Æ < 以降を削除!!

• 生の入力データを取得する方法...
function Button1Click($sender, $params){
global $input;$inputparam = $input->{$this->Edit1->Name};if( is_object($inputparam) ){$raw_str = $inputparam->asUnsafeRaw();
}
...
}
...

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

126

セッションデータをMySQLへMySQLのテーブル構造
session_set_save_handler関数とサンプル実装

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

13MySQLのテーブル構造
CREATE TABLE sstable (sid varchar(255) NOT NULL,
sdata text,
stimestamp timestamp,
PRIMARY KEY (sid)) ENGINE=MyISAM DEFAULT CHARSET=latin1;• MySQLのtimestamp型は、行の更新時、自動的に現在時刻にアップデートされる
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

147

session_set_save_handler関数とサンプル実装<?php
global $ss_host;global $ss_user;
global $ss_pass;global $ss_db;
global $ss_table;
global $ss_connection;$ss_host = "192.168.1.1";$ss_user = "username";$ss_pass = "password";$ss_db= "ssdb";$ss_table = "sstable";$ss_connection = null;function ss_open($sessionPath, $sessionName) {global $ss_host, $ss_user, $ss_pass, $ss_db, $ss_connection;$ss_connection = mysql_connect($ss_host, $ss_user, $ss_pass);
mysql_select_db($ss_db, $ss_connection);
return true;}
function ss_close() {global $ss_connection;
mysql_close($ss_connection);
return true;}…
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

15

session_set_save_handler関数とサンプル実装
function ss_read($sessionID) {global $ss_table, $ss_connection;$query = "SELECT sdata FROM $ss_table WHERE sid = '$sessionID'";$result = mysql_query($query, $ss_connection);$data = "";if( mysql_num_rows($result) > 0 ){$row = mysql_fetch_object($result);$data = $row->sdata;}
return $data;}
function ss_write($sessionID, $sessionData) {global $ss_table, $ss_connection;$test_query = "SELECT * FROM $ss_table WHERE sid = '$sessionID'";$test_result = mysql_query($test_query, $ss_connection);if( mysql_num_rows($test_result) > 0 ){$update_query = "UPDATE $ss_table SET sdata = '" . mysql_escape_string($sessionData) . "' WHERE sid = '$sessionID'";$update_result = mysql_query($update_query, $ss_connection);}
else{$insert_query = "INSERT INTO $ss_table (sid, sdata) VALUES('$sessionID', '" . mysql_escape_string($sessionData) . "')";$insert_result = mysql_query($insert_query, $ss_connection);}
return true;}…
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

168session_set_save_handler関数とサンプル実装…
function ss_destroy($sessionID) {global $ss_table, $ss_connection;$query = "DELETE FROM $ss_table WHERE sid = '$sessionID'";$result = mysql_query($query, $ss_connection);
return true;}
function ss_gc($sessionLife) {global $ss_table, $ss_connection;$query = "DELETE FROM $ss_table WHERE UNIX_TIMESTAMP(stimestamp) + $sessionLife < UNIX_TIMESTAMP(NOW())";$result = mysql_query($query, $ss_connection);
return true;}
session_set_save_handler("ss_open", "ss_close", "ss_read", "ss_write", "ss_destroy", "ss_gc");?>

セッションを利用するすべてのソースの先頭でロードする<?php
require_once("session_table_mysql.php");//Includes
require_once("vcl/vcl.inc.php");...
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

17$_SESSIONの中身• フォームの情報もすべて保存される!!

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

18

9PEARライブラリとの統合
PEAR概要Delphi for PHP へのインストール
CAPTCHAの利用例

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

19PEAR概要• PEAR（ペア） ＝ PHP Extension and ApplicationRepository• http://pear.php.net/• 様々なオープンソースのライブラリを提供• 日本語のマニュアルがあります• ライブラリ(パッケージ)の管理ツールもあります• PHPに自前で追加インストールする必要があります
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2010Delphi for PHP へのインストール
管理ツールのインストール• cd <D4PHP>¥1.0¥php• go-pear.bat• 各種選択項目はデフォルトでOK• php.ini.template の include_path を以下のように編集
include_path = ".;%VCLPATH%;%VCLPATH%php¥PEAR;%VCLPATH%vcl¥PEAR"• 生成されたPEAR_ENV.regをダブルクリック• pear channel-update pear.php.net

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

21

Delphi for PHP へのインストール（続き）
ライブラリ（例：Text_CAPTCHA,Image_Text）のインス
トール• pear install Text_CAPTCHA-0.3.0• pear install Image_Text-0.6.0beta• pear list

で確認

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

22

11

CAPTCHAでJPEGを生成• TrueTypeフォントが必要!!
• JPEGを生成する.phpを作成（BOMは削除すること）• CAPTCHA文字列を$_SESSIONに格納<?php
require_once("Text/CAPTCHA.php");$options = array("font_size"=> 24,"font_path"=> "C:¥¥","font_file"=> "sazanami-gothic.ttf","text_color"=> "#DDFF99","lines_color"=> "#CCEEDD","background_color" => "#555555");$captcha = Text_CAPTCHA::factory('Image');$captcha->init(200, 100, null, $options);$str = $captcha->getPhrase();session_start();$_SESSION['captcha'] = md5($str);header("Content-Type: image/jpeg");
print $captcha->getCAPTCHAAsJPEG();exit();?>
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

23

データベースコンポーネントとMySQL[MySQL]カテゴリと[Data Access]カテゴリ
Tableコンポーネント
トランザクション

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2412

[MySQL]カテゴリと[Data Access]カテゴリ• [MySQL]カテゴリ• mysql_connectを直接利用• [Data Access]カテゴリ• オープンソースの ADOdb をラップ
• ドライバ名等の変更のみで、様々なRDBMSに接続可能

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

25[Data Access]カテゴリを利用する• データモジュールを作成（UTF-8ならBOMは削除!!）• [Data Explorer]からテーブルをD&D• Databaseコンポーネントの各種プロパティを確認• TableコンポーネントのTableNameを確認• MySQLでは、接続後に文字コードを設定• DatabaseコンポーネントのCharsetプロパティは、ADOdbのMySQLドライバでは利用されないので注意!!
• DatabaseコンポーネントのOnAfterConnectイベント$this->dbriken1->execute('set character set utf8');

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

26

13

テーブルに行を追加• データモジュールをロード(require_once)• global変数宣言で、データモジュールのインスタンスを参照• Tableコンポーネントを利用• Appendメソッド• フィールド(カラム)に値を代入• Postメソッド• Databaseを明示的に接続• Tableを明示的にオープン

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

27

パフォーマンスに関するポイント• データモジュールのロード(require_once等)• データモジュールは読み込むだけで、デザイン時のデータベースの処理が走ります• DatabaseコンポーネントのConnectedプロパティは false に• TableコンポーネントのActiveプロパティも false に• TableコンポーネントのLimitCountプロパティに注意!!
• INSERT向けに LimitCount を 0 にしておく• TableコンポーネントのFilterプロパティを活用しよう!!

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

28

14

トランザクション• ADOdbの mysql ドライバはトランザクション未実装• mysqli ドライバを利用• php.ini(php.ini.template)で、php_mysqli.dll を有効化
extension=php_mysqli.dll• Databaseコンポーネント• BeginTransメソッド• CompleteTransメソッド（戻り値はtrue/false）

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

29

FormValidatorコンポーネント• クライアントサイドのJavaScriptによる入力データ検証• 正規表現等を利用可能• エラーメッセージのダイアログボックスを表示可能• オープンソースの「jsVal」(ライセンスはLGPL)をラップ• http://jsval.fantastic-bits.de/• フォームの[Javascript]-[OnSubmit]イベント• return FormValidator名_validate(); を記述

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

30

15

全部をまとめて

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

31

Delphi for PHP（VCL for PHP）の情報• 英語のみ• Quality Central• http://qc.codegear.com/wc/qcmain.aspx?p=360• VCL for PHP Forum• http://www.qadram.com/vcl4php/forums/index.php• Sourceforge Bug Tracking• https://sourceforge.net/tracker/?group_id=189419&atid=929250• 米Borlandのニュースグループ( newsgroups.borland.com )• 日本語• 米Borlandのニュースグループ内の日本語グループ• CDN（CodeGear Developer Network）• http://dn.codegear.com/• ナレッジベース• http://support.codegear.com/php
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

32

16

Q&A
Any question?

Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

33

17