トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP4:全般メモ

[カテゴリ:PHP] ←こちらの方がまとまってるかも。
[カテゴリ:Linux]

簡易マニュアル?

php

php言語の特徴

インタープリタ型言語

HTMLへのプログラム埋め込み型

弱いデータ型

大小文字は区別しない。

Apacheと連携させることで拡張子「.php」を
phpソースとして認識させることができる。

コマンドライン版(CLI)というのもある。
/usr/local/bin/php

php.iniで言語の動作環境を変更できる。
→同じソースでも動作が異なることが有り得る。

拡張モジュールとして提供される機能があり、
これの有効無効はphp自身のコンパイルオプション
で決定される。
→拡張機能の有無で動作したりしなかったりすることが有り得る。
→日本語処理機能(mbstring)も拡張モジュールなので、

 「php=絶対日本語処理機能利用可能」ではなく
 「日本語処理機能を有効としてコンパイルされたphp」が必要
 ということである。

変数

変数には「ローカル変数」「グローバル変数」がある。
関数内部からグローバル変数を使う場合、"global $item;" というように
グローバル変数の使用を宣言する必要がある。
なお、この宣言が不要な「オートグローバル変数」というもの($_GETなど)
も存在する。

$val = "abc";
$val{1} = "B";         文字指定 $val="aBc" になる。
isset($val)            変数が初期化されているか?
is_numeric($val)       数値か?

定義済変数

$_GET[]
$_POST[]
$_COOKIE[]
$_REQUEST[] _GET,_POST,_COOKIEをまとめたもの(非推奨)
$_FILES[]   アップロードされたファイル情報
$_SERVER[]  サーバパラメータ
$_ENV[]     環境変数
$_SESSION[] セッション
$_GLOBALS[] 定義済グローバル変数

配列

$array = array(1,2,3);
$array[] = 4;                        配列への自動要素追加
$array = array('a'=>101, 'b'=>102);  連想配列
$array['a']
is_array($item)   配列か?
void list(変数1, 2,...)      配列をスカラーに展開
bool extract(配列)           連想配列のキーを変数名と見立てて展開
array compact(変数1, 2,...)  extractの逆
配列の要素に対して処理を行う
array_filter(), array_map(), array_walk()
usort(), uksort(), uasort()
array_push(), array_pop()
array_shift(), array_unshift()
array_slice(), array_splice()

定数

define(MSG, "message") 定数定義

定義済定数

__FILE__
__LINE__
__FUNCTION__

可変変数

$bar = array(1,2,3);
$var = "bar";
${$var}[1] ・・・ $bar[1] と等価

オブジェクト型

class クラス名 [extends クラス名] {
  var 変数;
  var bar;
  function メソッド名() {
     $this->bar = "hoge";
  }
}

参照

function foo(&$var) {
  $var = "hoge:" . $var;
}
$str = "abc";
foo($str);
echo $str; ・・・ "hoge:abc"

PHPはデフォルトで値渡し。
データサイズが大きい引数のコピーを防ぐ為に参照を使う言語もあるが、
PHPはリファレンスカウンタ機能があるので、このような利用は考えなくてもよい。

拡張モジュール

 拡張モジュールを利用する方法
 ・PHP自身のコンパイルで指定し本体に組み込む方法(静的)
 ・PHP実行時にロードする方法(動的)
   →php.iniのextensionで定義、もしくは
   →Apacheの設定ファイルで定義、もしくは
   →PHPスクリプト中にてdl関数によるロード

動作状況を調べる方法

var_dump(get_defined_vars())      現在スコープの定義済変数のダンプ
var_dump(get_defined_constants()) 現在定義済の定数のダンプ
var_dump(get_loaded_extentions()) 現在ロードされているモジュールのダンプ
var_dump(ini_get_all())           現在のPHP設定をダンプ
extention_loaded('pgsql')         モジュールがロードされているか?
function_exists('funcname')       定義済関数か?

条件分岐

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}
switch (...) {
  case '...' : ...; break;
  case '...' : ...; break;
  default : die('err!!');
}

ループ

while (...) {
  ...;
}
for (...; ...; ...) {
  ...;
}
foreach (配列 as 配列の要素を入れる変数) 文;
foreach (配列 as 配列のキーを入れる変数 => 配列の要素を入れる変数) 文;

3項演算子

if (式1)  式2 else 式3;
式1 ? 式2 : 式3;

論理演算子

「and」と「&&」は基本同じ(違いは優先順位)
「or」と「||」は基本同じ(違いは優先順位)

ワーニングレベルのエラーを有効化

PHPは言語レベルのチェックが甘いので、これでチェック強化できる?
という使い方はできないかな?

error_reporting(E_ALL);  全てのエラーを有効化

シェルコマンド用の文字列エスケープ

 escapeshellcmd()
 escapeshellarg()

文字列演算子

$str = "b";
$strx = $str;
$strx .= "a";
$strx = $strx . "c";

Here Document

$hoge = <<< END
string
string
END;

配列演算子

$array = array(1,2,3);
$arrayx = $array;
$arrayx += array(4,5);

assert

function foo($a) {
  assert(func_num_args() == 1);
}
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_WARNING, true);
foo(1, 2, 3);

ブラウザのヘッダ情報

print_r(getallheaders());

マジッククオート

この設定を有効としている場合、PHPが自動でWebからの入力を
addslashes でエスケープする。
php.ini の magic_quote, magic_quote_runtime にて設定

HTTPファイルアップロード

Webからのファイルアップロードを簡単に扱えるようになっている。
アップロードされたファイルはphp.iniで指定されたディレクトリに
一時ファイルとして保存され、phpスクリプトの終了と伴に自動的に
削除される。必要に応じてコピーする。
$_FILES[], move_uploaded_file()

HTTPレスポンスヘッダ・コンテンツ出力

HTTPレスポンスヘッダ出力
→header(), setcookie()

HTTPコンテンツ
→echo(), print()

出力バッファリング
→php.ini output_handler

文字列置換

$ans = str_replace($from, $to, $src);
$ans = preg_replace($from, $to, $src);

日本語処理

PHP5からはiconv系関数が追加されているが
機能的にはmbstring系の方が勝っているので
こちらを使う。

+--------+
|ブラウザ|
+--------+
(1)↓↑(2)
   ↓↑
+--------+ (4)+-----+
|  PHP   |←←|*.php|
|  (3)   |    +-----+
+--------+
|DBClient|
|  (5)   |
+--------+
   ↓↑
   ↓↑
+--------+
|   DB   |
|   (6)  |
+--------+

(1)HTTP入力文字エンコーディング(EUC-JP,UTF-8,SJIS)
   | php.ini:mbstring.encoding_translation = On --- 自動変換有効
   | php.ini:mbstring.http_input = auto         --- "ASCII,JIS,UTF-8,EUC-JP,SJIS"と等価/"pass"とすると変換無し
(2)HTTP出力文字エンコーディング(EUC-JP,UTF-8,SJIS)
   | php.ini:# mbstring.http_output             --- 定義なしの場合、内部文字エンコーディングのまま出力/定義する場合、output_handler,ob_start()なども理解要
(3)内部文字エンコーディング(ISO-8859-1互換のみ可,EUC-JP,UTF-8)
   | php.ini:mbstring.internal_encoding = UTF-8
(4)スクリプト文字エンコーディング(EUC-JP,UTF-8,SJIS)
   | php.ini:mbstring.script_encoding = UTF-8
(5)DBクライアント文字エンコーディング
   | script:mysql_query("SET NAMES utf8"); --- MySQLの場合
(6)DBサーバ文字エンコーディング

※mbstringは内部でUnicodeで処理している。

補足

マルチバイト対応メール送信関数 mb_send_mail() を使う場合、以下定義も必須
| php.ini:mbstring.language = jJapanese

非mb系、mb系ファンクション

mail() mb_send_mail()
strlen() mb_*()
strpos() mb_*()
strrpos() mb_*()
strtolower() mb_*()
strtoupper() mb_*()
substr_count() mb_*()
ereg() mb_*()
eregi() mb_*()
ereg_replace() mb_*()
eregi_replace() mb_*()
split() mb_*()

文字エスケープ

htmlentities HTMLエスケープ
mysql_real_escape_string MySQLの文字列エスケープ

escapeshellcmd シェルコマンドエスケープ
escapeshellarg シェルコマンド引数をエスケープ

PHPの文字化けを本気で解決する

私も経験上から、自動変換は使うな派になってましたが、
個々の設定がどこに効いてくるのかの理解がまだまだ
足りなかったなぁ。。。と痛感

ってことで、おすすめ。
http://hain.jp/index.php/tech-j/2007/02/13/p125

mbまわりの設定について

mbstring.encoding_translation が Off の場合

EUC-JPで統一したいとき、

入力: (charset=EUC-JP)
↓
↓変換なし
↓
mbstring.internal_encoding: EUC-JP
↓
↓変換なし
↓
出力: (EUC-JP)

mbstring.encoding_translation が On の場合

入力
↓
↓mbstring.detect_orderに基づきエンコーディングを判別し
↓internal_encodingへ変換
↓
mbstring.internal_encoding: EUC-JP
↓
↓internal_encoding から mbstring.http_output へ変換
↓
出力

トラブル?

[PHP-users 29510] UTF-8、正規表現で全角スペースがヒットしないことがある?

http://ns1.php.gr.jp/pipermail/php-users/2006-June/030027.html

[PHP-users 29740] Re: Q.西や表などの一部の漢字がPOSTできないのです。

http://ns1.php.gr.jp/pipermail/php-users/2006-July/030257.html

メモ

pearコマンドでSmartyやphpMyAdminをインストール:phpspot開発日誌
http://phpspot.org/blog/archives/2005/12/pearsmartyphpmy.html
→こういうこともできるんだね。

Tips

WEB+DB PRESS 記事メモ

全般

Vol.22 特集2 PHPケーススタディ
第1章:基礎知識編
第2章:入出力編
第3章:データベース編
第4章:ログとエラー処理編
第5章:キャッシュ編
第6章:ユーティリティ編

PEAR関連

Vol.18 特集2 PEAR実践入門
第1章:PEARの基礎知識
第2章:本格文法解析& 高速テンプレートFlexyを使ってみよう
第3章:PEARで作ろうWebメール
第4章:使ってみよう!作ってみよう!PECL
第5章:MMCacheによるコードの最適化&キャッシュ

Pear::MDB
Vol.16「PHPのDBアクセスはPEAR MDBを使おう!」

Pear::DB,DB_Storage
Vol.9「PHPこども電話相談室〜楽々DBアクセスしましょ」

Pear::DB
Vol.3 特集2 第2章「PHP4標準クラスライブラリPEAR入門」

Pear::Mail
Pear::Mail_Mime
Vol.18

Pear::Log
Vol.10「PHPこども電話相談室〜さらにPEARを探る」

Pear::PHPUnit
Vol.5「PHPこども電話相談室〜テストをしよう!」
当時sourceforge.netで開発されていたPhpUnitベースでの解説

PHPでのXML操作ライブラリは?

以下、かなりいいかげん。。。

SAX

PHP4.1以上???
・expad

DOM

PHP4.3以上のケース
・libxmlを使う
・--with-domを指定
・--with-dom-xsltを指定
Pear::XML_Tree

変数内容の表示

以下関数で出力できる。

print_r() は、配列のキーと値のみ
var_dump() は型などのその他の詳細情報

include,require

include(),include_once()
→Warningを出力し処理は継続

require(),require_once()
→FatalErrorで処理停止

HTMLエンティティ変換

HTMLエンティティ変換

$new = htmlspecialchars("<a>");
------
&lt;a&gt;

HTMLエンティティ逆変換

$trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip($trans);
$original = strtr("&lt;a&gt;", $trans);
------
<a>

エラーメッセージを画面表示する

全てのエラーをレポート&画面に表示

error_reporting  =  E_ALL
display_errors = On

エラーメッセージが画面に表示されるのはセキュリティ上問題があるので、display_errors = Off で運用するのが妥当

エラー処理の方法

以下の4つの方法がとれる。
PHP5では、さらにtry,catchが使えるらしい)

■自前でチェック

関数の前に@でエラー出力を抑制しておき、自前で処理するケース

$xxx = @yyy(zzz);
if (!$xxx) {
  die("err!!");
}

■set_error_handler でハンドリング

エラー時の処理関数を作り、これを set_error_handler で登録する。

PHP: エラー処理およびログ記録関数 - Manual(http://www.php.net/manual/ja/ref.errorfunc.php

■PEAR_Error

PEARの古いエラー処理機構

■PEAR_ErrorStack

PEARの新しいエラー処理機構
(PEAR_Errorの後方互換、PHP5のtry-catchと前方互換があるらしい)

PEAR :: Manual :: PEAR_ErrorStack を用いた高度なエラー処理(http://pear.php.net/manual/ja/core.pear.pear-errorstack.php
Hawk's Laboratory &raquo; PEAR_ErrorStack(http://blog.hawklab.jp/item-8.html?

クラスメソッドを変数で指定できる

# ようは、可変関数、とか、可変変数、とかと同じ感じ

変数で指定した文字列を、メソッドと見立ててCallできる。

$hoge_obj = new HogeClass();

$moge = "display1";
$hoge_obj->$moge();

$moge = "display2";
$hoge_obj->$moge();

PHP5では、存在しないメンバ関数を呼び出そうとした際には
__call メソッドがCallされるらしい。
PHP4では、エラーになるのかな??

日付関連関数メモ

現在年(4桁)取得

date("Y", time())

現在月(頭ゼロなし)取得

date("n", time())

現在日(頭ゼロなし)取得

date("n", time())

妥当性チェック関係メモ

年月日が妥当かチェック

checkdate($m, $d, $y)

数値かチェック

is_numeric($value)

正規表現でチェック

if (!preg_match('/^[0-9\-]+$/', $value)) {
    妥当ではない。
}

MySQL

明示的にクライアントのキャラクターコードを設定

mysql_query("SET NAMES ujis"); 

phpMyAdmin

phpMyAdmin 2.6.4-pl2 - ドキュメント
http://www.phpmyadmin.net/pma_localized_docs/Documentation_ja.html

インストール

phpMyAdmin > Downloads | MySQL Database Administration Tool | www.phpmyadmin.net
http://www.phpmyadmin.net/home_page/downloads.php
ここから、

phpMyAdmin-2.7.0-pl2.tar.gz
をダウンロード

tgzを展開

[root@localhost /]# cd /usr/local/phpmyadmin
[root@localhost phpmyadmin]#

[root@localhost phpmyadmin]# tar xvfz /mnt/phpMyAdmin-2.7.0-pl2.tar.gz
phpMyAdmin-2.7.0-pl2/
phpMyAdmin-2.7.0-pl2/css/
phpMyAdmin-2.7.0-pl2/css/phpmyadmin.css.php
phpMyAdmin-2.7.0-pl2/css/print.css
phpMyAdmin-2.7.0-pl2/Documentation.txt
phpMyAdmin-2.7.0-pl2/CREDITS
:

アクセス権まわり調整

[root@localhost phpmyadmin]# chown -R root:root phpMyAdmin-2.7.0-pl2

シンボリックリンク作成

[root@localhost phpmyadmin]# ln -s /usr/local/phpmyadmin/phpMyAdmin-2.7.0-pl2 /var/www/html/phpmyadmin

ブラウザから表示してみる。
http://hogehoge/phpmyadmin/

以下が表示された。

エラー
MySQLのメッセージ: ドキュメント
#1045 - Access denied for user 'root'@'localhost' (using password: NO) 

/var/www/html/phpmyadmin/config.default.phpを編集
パスワードを記述

:
$cfg['Servers'][$i]['password']      = '******';          // MySQL password (only needed
:

再度ブラウザから表示してみる。

おっけー

Smarty

Smarty : Template Engine
http://smarty.php.net/

Smarty(暫定)
日本語マニュアルあり
http://sunset.freespace.jp/smarty/

インストール

http://smarty.php.net/download.php
から Smarty-2.6.11.tar.gz をダウンロード

[root@localhost /]# cd /var/www/html/php/test
[root@localhost test]# tar xvfz Smarty-2.6.11.tar.gz
Smarty-2.6.11/
Smarty-2.6.11/COPYING.lib
Smarty-2.6.11/BUGS
Smarty-2.6.11/demo/
Smarty-2.6.11/demo/configs/
Smarty-2.6.11/demo/configs/test.conf
:

デモが動作するか確認

http://hogehoge/php/test/Smarty-2.6.11/demo/index.php

あれ、、まっしろ。。

php.iniを編集して、エラーを画面に表示するように設定変更

再度デモ実行

エラー表示された。

Fatal error: Smarty error: unable to write to $compile_dir '/var/www/html/php/test/Smarty-2.6.11/demo/templates_c'.
Be sure $compile_dir is writable by the web server user.
in /var/www/html/php/test/Smarty-2.6.11/libs/Smarty.class.php on line 1095

ちょっと操作

[root@localhost test]# chown apache Smarty-2.6.11/demo/templates_c

再度デモ実行

実行できた。

guesswork classic

guesswork
http://classic.guesswork.jp/

インストール&動作確認

guesswork-classic-0.0.3.tar.gz を解凍

以下表示
http://192.168.0.223/php/guesswork-classic-0.0.3/public_html/mailform/mailform.php

以下エラー発生

Warning: init(/path/to/Smarty.class.php): failed to open stream: No such file or directory in /var/www/html/php/guesswork-classic-0.0.3/lib/Guesswork/SmartyView.php on line 64
Fatal error: init(): Failed opening required '/path/to/Smarty.class.php' (include_path='.:/usr/share/pear') in /var/www/html/php/guesswork-classic-0.0.3/lib/Guesswork/SmartyView.php on line 64

Smartyのクラスパス指定箇所を書換え。
/var/www/html/php/guesswork-classic-0.0.3/public_html/mailform/mailform.php

<?php
require_once "../../lib/Guesswork.php";
require_once "../../examples/mailform/MailFormValidator.class.php";

define("MAILTO", "foo@example.com");

/**
 * メールフォームコントローラ。
 */
class MailFormController extends Controller
{
    var $_gw_default_action = "input";
//    var $_gw_template_class = "/path/to/Smarty.class.php";
    var $_gw_template_class = "/var/www/html/php/Smarty-2.6.11/libs/Smarty.class.php";    var $_gw_template_templates_dir = '../../smarty/templates';
    var $_gw_template_compile_dir = '../../smarty/templates_c';

再表示

以下エラー発生

Fatal error: Smarty error: unable to write to $compile_dir '/var/www/html/php/guesswork-classic-0.0.3/smarty/templates_c'. Be sure $compile_dir is writable by the web server user. in /var/www/html/php/Smarty-2.6.11/libs/Smarty.class.php on line 1095

オーナー変更

chown -R apache guesswork-classic-0.0.3/

再表示

動作したけど文字化けする。

guessworkソースがEUC-JPだから。。。
SmartyテンプレートをUTF-8に変換すればOKでしょう。。。

FlexyView対応

guessworkは標準で、SmartyとPHPのViewに対応している。
Flexy対応してみる。

といっても以下からソースを拝借するだけですが。。。
Page2 よもやま話
http://page2.xrea.jp/index.php/tmp

gw-flexy-0.0.3.4.tgz をダウンロード&解凍

[root@localhost php]# tar xvfz /mnt/gw-flexy-0.0.3.4.tar 
gw-flexy-0.0.3.4/
gw-flexy-0.0.3.4/Flexy.php.use_sub_dirs.patch
gw-flexy-0.0.3.4/FlexyController.php
gw-flexy-0.0.3.4/FlexyView.php
gw-flexy-0.0.3.4/gw-flexy-php.patch
gw-flexy-0.0.3.4/gw-flexy-template.patch
gw-flexy-0.0.3.4/README
[root@localhost php]# ls -al
合計 92
drwxr-xr-x  9 root   root 4096  1月 24 16:47 .
drwxr-xr-x  3 root   root 4096  1月  8 13:00 ..
-rw-r--r--  1 root   root   18  1月  7 22:04 .htaccess
d-wx-wx--x  6 root   root 4096 12月 14 23:28 Smarty-2.6.11
:
drwxr-xr-x  7 apache root 4096  1月 24 15:44 guesswork-classic-0.0.3
drwxr-xr-x  2    501  501 4096  9月 28 21:51 gw-flexy-0.0.3.4
:
[root@localhost php]# chown -R apache:root gw-flexy-0.0.3.4/

READMEを読む

[root@localhost gw-flexy-0.0.3.4]# iconv -f EUC-JP -t UTF-8 README
-- PHP スクリプト --
* FlexyView.php
guesswork classic の SmartyView.php をベースに作ったビュークラス。
テンプレートエンジンに PEAR の HTML_Template_Flexy を使う。
Flexy の最大の特徴である getElements() をサポート。
アクションで getElements() → 加工 → setElements() という流れで使う。
Guesswork ディレクトリに置く。

* FlexyController.php
FlexyView を使うコントローラクラスのサンプル。
任意の場所に置く。

-- パッチファイル --
* gw-flexy-php.patch
* gw-flexy-template.patch
guesswork classic 付属のサンプルアプリケーションで FlexyView を使うためのパッチ。

* Flexy.php.use_sub_dirs.patch
Smarty のようにテンプレートのコンパイル用ディレクトリにサブディレクトリを
作らないようにする Flexy.php へのパッチ。

パッチあて

[root@localhost php]# ls -al
合計 108
drwxr-xr-x  9 root   root 4096  1月 24 17:11 .
drwxr-xr-x  3 root   root 4096  1月  8 13:00 ..
:
drwxr-xr-x  7    501  501 4096  8月 17 05:03 guesswork-classic-0.0.3
drwxr-xr-x  2 apache root 4096  1月 24 16:59 gw-flexy-0.0.3.4
-rw-r--r--  1 root   root 1765  1月 24 17:01 gw-flexy-php.patch
-rw-r--r--  1 root   root 3616  1月 24 17:01 gw-flexy-template.patch
[root@localhost php]# patch -p0 < gw-flexy-php.patch 
patching file guesswork-classic-0.0.3/lib/Guesswork.php
patching file guesswork-classic-0.0.3/public_html/mailform/mailform.php
[root@localhost php]# patch -p0 < gw-flexy-template.patch 
patching file guesswork-classic-0.0.3/smarty/templates/mailform/confirm.html
patching file guesswork-classic-0.0.3/smarty/templates/mailform/input.html
[root@localhost php]# 

FlexyController、FlexyView をコピー

[root@localhost gw-flexy-0.0.3.4]# ls -al
合計 68
drwxr-xr-x  2 apache root 4096  1月 24 16:59 .
drwxr-xr-x  9 root   root 4096  1月 24 17:16 ..
-rw-r--r--  1 apache root 1691  8月 21 03:20 Flexy.php.use_sub_dirs.patch
-rw-r--r--  1 apache root 1552  9月 28 21:59 FlexyController.php
-rw-r--r--  1 apache root 5836  9月 26 03:25 FlexyView.php
-rw-r--r--  1 apache root  706  9月 28 21:58 README
-rw-r--r--  1 apache root 1765  8月 20 01:53 gw-flexy-php.patch
-rw-r--r--  1 apache root 3616  8月 19 20:54 gw-flexy-template.patch
[root@localhost gw-flexy-0.0.3.4]# cp *.php ../guesswork-classic-0.0.3/lib/Guesswork

テンプレートディレクトリ名を変更

[root@localhost guesswork-classic-0.0.3]# ls
ChangeLog  LICENSE  README  examples  lib  public_html  smarty  test
[root@localhost guesswork-classic-0.0.3]# 
[root@localhost guesswork-classic-0.0.3]# mv smarty flexy

PEAR関連

PEAR::標準コーディング規約

http://pear.php.net/manual/ja/standards.php

PEAR::HTML_Template_Flexy

Page2 よもやま話
http://page2.xrea.jp/index.php/tmp

PEAR::HTML_Template_Flexy 高速テンプレートエンジン - PHP::PEAR - dozo PukiWiki
http://dozo.matrix.jp/pear/index.php/PEAR/HTML_Template_Flexy.html

Hawk's W3 Laboratory : PHP : HTML_Template_Flexy
http://www.hawk.34sp.com/stdpls/php/flexy/

HTML_Template_Flexy
http://www.n314.com/Flexy/

ぐらべる・ろぉど でぃ・ばぃ・でぃ
http://2.suk2.tok2.com/user/gravelroad/?y=2005&m=09&all=0

http://66.102.7.104/search?q=cache:UmPMykoV01wJ:usada.rabi-en-rose.net/~tsukimiya/Schedule/src/index.phps+%27HTML/Template/Flexy.php%27&hl=ja

インストール

[root@localhost /]# pear remote-info HTML_Template_Flexy

Notice: Undefined index:  st in RPC.php on line 292
Package details:
================
Latest      1.2.3
Installed   - no -
Package     HTML_Template_Flexy
License     PHP License
Category    HTML
Summary     An extremely powerful Tokenizer driven Template
            engine
Description HTML_Template_Flexy started it's life as a
            simplification of HTML_Template_Xipe,
            however in Version 0.2, It became one of the
            first template engine to use a real Lexer,
            rather than regex'es, making it possible to do
            things like ASP.net or Cold Fusion tags.
            However, it still has a very simple set of
            goals.
            - Very Simple API,
               o easy to learn...
               o prevents to much logic going in templates
            - Easy to write document'able code
               o By using object vars for a template rather
            than 'assign', you
                 can use phpdoc comments to list what
            variable you use.
            - Editable in WYSIWYG editors
               o you can create full featured templates,
            that doesnt get broken every time you edit with
                 Dreamweaver(tm) or Mozilla editor
               o Uses namespaced attributes to add
            looping/conditionals
            - Extremely Fast,
               o runtime is at least 4 time smaller than
            most other template engines (eg. Smarty)
               o uses compiled templates, as a result it is
            many times faster on blocks and loops than
                 than Regex templates (eg. IT/phplib)
            - Safer (for cross site scripting attacks)
               o All variables default to be output as HTML
            escaped (overridden with the :h modifier)
            - Multilanguage support
               o Parses strings out of template, so you can
            build translation tools
               o Compiles language specific templates (so
            translation is only done once, not on every
            request)
            - Full dynamic element support (like ASP.NET),
            so you can pick elements to replace at runtime

            Features:
            - {variable} to echo $object->variable
            - {method()} to echo $object->method();
            - {foreach:var,key,value} to PHP foreach loops
            - tag attributes FLEXY:FOREACH, FLEXY:IF for
            looping and conditional HTML inclusion
            - {if:variable} to PHP If statement
            - {if:method()} to PHP If statement
            - {else:} and {end:} to close or alternate If
            statements
            - FORM to HTML_Template_Flexy_Element's
            - replacement of INPUT, TEXTAREA and SELECT tags
            with HTML_Template_Flexy_Element code
              use FLEXY:IGNORE (inherited) and
            FLEXY:IGNOREONLY (single) to prevent
            replacements
            - FLEXY:START/FLEXY:STARTCHILDREN tags to define
            where template starts/finishes
            - support for urlencoded braces {} in HTML
            attributes.
            - documentation in the pear manual

            - examples at
            http://cvs.php.net/cvs.php/pear/HTML_Template_Fl
            exy/tests/

            ** The long term plan for Flexy is to be
            integrated as a backend for the
            Future Template Package (A BC wrapper will be
            made available - as I need
            to use it too!)
[root@localhost /]# pear install HTML_Template_Flexy

Notice: Undefined index:  st in RPC.php on line 292
downloading HTML_Template_Flexy-1.2.3.tgz ...
Starting to download HTML_Template_Flexy-1.2.3.tgz (118,268 bytes)
..........................done: 118,268 bytes
Optional dependencies:
package `HTML_Javascript' version >= 1.1.0 is recommended to utilize some features.
package `File_Gettext' version >= 0.2.0 is recommended to utilize some features.
package `Translation2' version >= 0.0.1 is recommended to utilize some features.
install ok: HTML_Template_Flexy 1.2.3
[root@localhost /]#
[root@localhost /]# pear install HTML_Javascript

Notice: Undefined index:  st in RPC.php on line 292
downloading HTML_Javascript-1.1.1.tgz ...
Starting to download HTML_Javascript-1.1.1.tgz (8,430 bytes)
.....done: 8,430 bytes
install ok: HTML_Javascript 1.1.1
[root@localhost /]#
[root@localhost /]# pear install File_Gettext

Notice: Undefined index:  st in RPC.php on line 292
No release with state equal to: 'stable' found for 'File_Gettext'
[root@localhost /]#
[root@localhost /]# pear install Translation2

Notice: Undefined index:  st in RPC.php on line 292
No release with state equal to: 'stable' found for 'Translation2'
[root@localhost /]#
[root@localhost /]# pear install -f File_Gettext
Warning: File_Gettext is state 'alpha' which is less stable than state 'stable'
downloading File_Gettext-0.4.0.tgz ...
Starting to download File_Gettext-0.4.0.tgz (5,560 bytes)
.....done: 5,560 bytes
install ok: File_Gettext 0.4.0
[root@localhost /]#
[root@localhost /]# pear install -f Translation2
Warning: Translation2 is state 'alpha' which is less stable than state 'stable'
downloading Translation2-2.0.0beta8.tgz ...
Starting to download Translation2-2.0.0beta8.tgz (52,307 bytes)
.............done: 52,307 bytes
Optional dependencies:
package `Cache_Lite' is recommended to utilize some features.
package `DB_DataObject' is recommended to utilize some features.
package `MDB' is recommended to utilize some features.
package `MDB2' is recommended to utilize some features.
package `I18Nv2' version >= 0.9.1 is recommended to utilize some features.
package `XML_Serializer' version >= 0.13.0 is recommended to utilize some features.
install ok: Translation2 2.0.0beta8
[root@localhost /]#
[root@localhost /]#
[root@localhost /]#
[root@localhost /]# pear install Cache_Lite

Notice: Undefined index:  st in RPC.php on line 292
downloading Cache_Lite-1.6.0.tgz ...
Starting to download Cache_Lite-1.6.0.tgz (25,865 bytes)
.........done: 25,865 bytes
install ok: Cache_Lite 1.6.0
[root@localhost /]#

う〜ん。。。
本当に使ってるのかな?
とりあえず↓このあたりのインストールはやめておこう・・・

package `DB_DataObject' is recommended to utilize some features.
package `MDB' is recommended to utilize some features.
package `MDB2' is recommended to utilize some features.
package `I18Nv2' version >= 0.9.1 is recommended to utilize some features.
package `XML_Serializer' version >= 0.13.0 is recommended to utilize some features.

ハマるところ?

AngelicWing Diary - HTML_Template_Flexyで久々に地雷踏んだ件
http://angelicwing.net/diary/index.php?mode=one&parent_id=4199
引用

そにょ1:メソッドのコール
Flexyではテンプレートに値を渡すとき適当なオブジェクト(stdClassとかのね)に追加してデータを渡していて
ついでにそこで使ったオブジェクトが持ってるメソッドのコールできるんだけど、そこではまった。
・引数は#で囲む
・複数の引数を渡すときはカンマ区切り
☆スペースを入れない
一番最後、トラップ過ぎ。
{object.methodname(#property1#, #property2#)}
だと通らなくて
{object.methodname(#property1#,#property2#)}
だと通る、という・・・。

そにょ2:存在しないメソッドのコール
Flexyでは上記みたいなメソッドのコールをする場合、そのメソッドが存在してるかどうかを確認して
存在してる場合だけ実行するような感じになってます。
一応、この機能がじゃまになった場合のことも考えられていて、設定を変えることで向こうにできます。
その設定が
$options = array("strict" => true);
|x・)strictをtrueにすると、チェックしなくなるんだ・・・。

テンプレートへのデータ引渡しについて (2006/08/18追記)

メンバ変数/メンバ関数へのアクセスは、
php上「->」、テンプレート上「.」

連想配列へのアクセスは、
php上「arr['key']」、テンプレート上「arr[key]」

テンプレートに渡すとき

$this->value = "value";
$this->level1 = new StdClass();
$this->level1->items = array("item1" => "level1->items[item1]");
$this->level1->level2 = new StdClass();
$this->level1->level2->items = array("item1" => "level1->level2->items[item1]");
$this->level1->level2->level3 = new StdClass();
$this->level1->level2->level3->items = array("item1" => "level1->level2->level3->items[item1]");
$this->level1->level2->level3->itemss = array("item1" => array("item11" => "level1->level2->level3->itemss[item1][item11]"));

テンプレートから参照するとき

{level1.value}<br />
{level1.items[item1]}<br />
{level1.level2.items[item1]}<br />
{level1.level2.level3.items[item1]}<br />
{level1.level2.level3.itemss[item1][item11]}<br />

PEAR::MDB

PEAR::MDBでのクエリの実行
http://www.mono-space.net/doc/pear_mdb/

PEAR::DB_DataObject

PHPウォッチ】第15回 O/Rマッピングによるデータベース処理自動化:IT Pro
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050311/157352/?P=3

PEAR::Var_Dump

var_dump($hoge) とすると、$hogeの構造を出力してくれるが
ブラウザ上では見難い。Var_Dumpパッケージを使うことで
見やすく整形表示してくれる。

パッケージ一覧

# pear list-all
All packages:
=============
Package                         Latest    Local
APC                             3.0.8
Cache                           1.5.4
Cache_Lite                      1.6.0
memcache                        2.0.0
apd                             1.0.1
parsekit                        1.0
perl                            0.6
PHP_Compat                      1.5.0
PHP_CompatInfo                  1.0.0
:

リモートのパッケージ情報を表示

# pear remote-info Var_Dump
Package details:
================
Latest      1.0.2
Installed   - no -
Package     Var_Dump
License     PHP License
Category    PHP
Summary     Provides methods for dumping structured
            information about a variable.
Description The Var_Dump class is a wrapper for the var_dump
            function.

            The var_dump function displays structured
            information about expressions that includes its
            type and value. Arrays are explored recursively
            with values indented to show structure.

            The Var_Dump class captures the output of the
            var_dump function, by using output control
            functions, and then uses external renderer
            classes for displaying the result in various
            graphical ways :
            * Simple text,
            * HTML/XHTML text,
            * HTML/XHTML table,
            * XML,
            * ...

インストール

# pear install Var_Dump
downloading Var_Dump-1.0.2.tgz ...
Starting to download Var_Dump-1.0.2.tgz (16,188 bytes)
......done: 16,188 bytes
install ok: Var_Dump 1.0.2

PEAR::XML_Tree 日本語文字化け調査

最新のXML_Treeバージョンメモ
XML_Tree-2.0.0RC2.tgz

 Tree.php      $Id: Tree.php,v 1.35 2004/05/26 14:58:18 davey Exp $
 Tree/Node.php $Id: Node.php,v 1.22 2004/05/26 15:03:25 davey Exp $

日本語のXML読み込みで化ける。

http://cvs.php.net/viewcvs.cgi/pear/XML_Tree/
によると、v1.36 でエンコード指定できるようになってるっぽい。

直接v1.36をダウンロードして使ってみる。
バージョンは以下

 Tree.php      $Id: Tree.php,v 1.36 2004/07/12 20:35:19 davey Exp $

あ、ダメ化ける。。。
以下の様にエンコード指定ができるようになっているのに日本語が化ける。
$node = $xml_tree->getTreeFromString($doc, "UTF-8");

Tree.phpを解析
XML_Parseでパースしたときcdataは $this->cdata に格納され
これを $node->setContent($this->cdata); で $node->content に
データ設定している。

Node.phpを解析
setContent() からは encodeXmlEntities() が呼ばれており
ここでエンコードしているようだが、多分これが日本語対応していないものと
思われる。

状況まとめ・・・
・XML_TreeはXML_Parseを使用している。
・XML_Parseレベルでは日本語化けがないことを確認できた。
・NodeのencodeXmlEntities()が日本語(UTF-8)対応していない。

修正方法は、以下の XML_Tree_Ex.zip(v1.1ベースの日本語対応) を
参考にした。
Hawk's W3 Laboratory : PHP : PEAR :: XML_Treeを使う
http://www.hawk.34sp.com/stdpls/php/pear_xml_tree.html

パッチ的な修正だけど・・・
Node.phpを以下の通り修正

    /**
     * Sets the content for this node.
     *
     * @param  string    content     Node content to assign
     *
     * @access public
     */

    function setContent($content, $use_cdata_section = null)
    {
        $this->use_cdata_section = $use_cdata_section;

        if ($use_cdata_section == true) {
            $this->content = $content;
        } else {
//@@@            $this->content = $this->encodeXmlEntities($content);
            $this->content = $this->_xml_entities($content);    //@@@
        }
    }

//↓@@@
        function _xml_entities($xml) {
                return strtr($xml, array('&' => '&amp;',
                                         '>' => '&gt;',
                                         '<' => '&lt;',
                                         '"' => '&quot;',
                                         "'" => '&#39;' ));
        }
//↑@@@

PEAR::DB(MySQL)

DB_common::affectedRows()

DB_common::affectedRows()
http://pear.php.net/manual/en/package.database.db.db-common.affectedrows.php

INSERT,UPDATE,DELETE で変更された行数を取得できるメソッド

UPDATEにて、既に存在するデータと同じ値でUPDATEした場合も、
「1」で返ってくると思っていたが、実際は「0」で返ってきた。

最終更新時間:2007年02月27日 15時37分22秒