17Th
Developer Camp【T6】 PHPテクニカルセッション「PHP Live! - ゼロから始めるPHP
アプリの構築からデプロイまで」

エンバカデロ・テクノロジーズ
エヴァンジェリスト
高橋智宏

1

アジェンダ• 今回作成するWebアプリ– SQLiteを使ったPHP5.2(5.3)向け、シンプルなもの• RadPHP XEの設定– RPCLの最新版– httpd.conf, php.ini• データベースファイル & テーブル• Webページ– レコードの追加– テーブルの一覧表示– ページの遷移• 配布環境– WampServer 2.1e（32bit）– デプロイ2

17Th
Developer Camp

1

RadPHP XEの設定

3

RPCLの最新版• Sourceforgeから最新版(.tar.gz)を入手– http://vcl4php.svn.sourceforge.net/viewvc/vcl4php/trunk/r
pcl/rpcl/• “Download GNU tarball”をクリック• …¥RadPHP¥3.0¥rpcl– バックアップ– 展開– rpcl¥qooxdoo¥controls.inc.php を修正• RadPHP(RTM)のフォームデザイナはWebKit未対応のため$this->ControlStyle="csVerySlowRedraw=1";…
//$this->ControlStyle="csWebEngine=webkit";4httpd.conf, php.ini• …RadPHP¥3.0¥apache¥conf¥httpd.template.conf– PHP5.xのDLLの衝突防止
PHPIniDir "%PHP_INI_DIR%"
LoadFile "%RPCL_DIR%/php/php5ts.dll"
LoadModule php5_module "%PHP_MODULE%"– SQLiteのデータベースのURL…
SetEnv SQLiteDBPath sqlite:sqlitetest.db• …RadPHP¥3.0¥apache¥conf¥php.ini.template– PDO（PHP Data Objects） ＆ SQLite
extension=php_pdo.dll…
extension=php_pdo_sqlite.dll"– 文字コードは UTF-8

5

17ThDeveloper Camp2

データベースアクセス

6データベースファイル & テーブル• テストページで作成しておきましょう– 文字コード: UTF-8• 外部.phpファイルのrequire_onceは不要ですtry {$dbh = new PDO( apache_getenv('SQLiteDBPath') );$result = $dbh->query('CREATE TABLE JUSHO(ID INTEGER PRIMARY KEY
AUTOINCREMENT, NAME TEXT, ADDRESS TEXT)');if( $result !== false )echo "OK!";elseecho "error!";}catch(PDOException $e) {echo "error!: " . $e->getMessage();}7

レコードの追加• 入力文字列の長さチェック: mb_strlen関数• EditコンポーネントのFilterInputプロパティ: false• PDOStatement->bindParamメソッド…
$dbh = new PDO( apache_getenv('SQLiteDBPath') );$ins = "INSERT INTO JUSHO(NAME, ADDRESS)VALUES(:name, :address)";$stmt = $dbh->prepare($ins);$name = $this->Edit1->Text;$address = $this->Edit2->Text;
if( mb_strlen($name) <= 0 || mb_strlen($address) <= 0 ) {echo "error!";return;}$stmt->bindParam(':name', $name, PDO::PARAM_STR);$stmt->bindParam(':address', $address, PDO::PARAM_STR);
if( $stmt->execute() === true && $stmt->rowCount() === 1 )echo "OK!";
else
echo "error!";…

8

テーブルの一覧表示• PDO->query(SQL文); または• PDO->prepare(SQL文); + PDOStatement->execute();• 出力文字列のサニタイズ: htmlspecialchars関数
try {$dbh = new PDO( apache_getenv('SQLiteDBPath') );$stmt = $dbh->prepare('SELECT ID, ADDRESS FROM JUSHO');if( $stmt->execute() === true ) {$rows = $stmt->fetchAll();foreach($rows as $row) {echo htmlspecialchars($row['ADDRESS'], ENT_QUOTES,mb_internal_encoding());}}
else {
echo "error!";}}catch(PDOException $e) {echo "error!: " . $e->getMessage();}9

ページの遷移 etc…
• LabelコンポーネントのLinkプロパティ: HTTPのGET• RPCLのredirect関数: HTTPのリダイレクト• エラーメッセージの表示

追加したら一覧表示ページへ

10

17Th
Developer Camp

3

配布環境

11

XAMP環境の構築 － Win,Linux,Mac,Solaris• WampServer 2.1e（Windows 32bit）– Apache 2.2.17 + PHP 5.3.5 etc…

• httpd.conf の変更– SetEnv … C:/temp/xxx.db• php.ini の変更– error_reporting = E_ALL & ~E_NOTICE– default_charset = “utf-8”– [mbstring]セクション• mbstring.language = Japanese• mbstring.internal_encoding = UTF-8• mbstring.script_encoding = auto または UTF-8• mbstring.http_input = auto または pass
• mbstring.http_output = UTF-8 または pass
• mbstring.encoding_translation = On または Off• mbstring.detect_order = auto または UTF-8,ASCII,SJIS,JIS,EUC-JP• mbstring.substitute_character = none
• mbstring.func_overload = 0• mbstring.strict_detection = Off

12

Webアプリのデプロイ• unitX.php と unitX.xml.php をコピー
– WampServerの場合は、C:¥wamp¥www¥ に配置• RPCLの配布– 「Deployment Wizard」は問題あり!?
– rpcl/ フォルダを丸ごとコピー• サイズが大きいので、無駄なファイル(フォルダ)は省くのもOK!!
• unitX.phpファイルのサブフォルダの位置に配置するだけ

13

17Th
Developer Camp

Q&A14