Monthly Archives: 9月 2007

Zend Frameworkで多対多のテーブルを簡単に扱うの追記。

Zend Frameworkで多対多のテーブルを簡単に扱うの記事中で使用しているマッチテーブルの取得方法ですが

[php]
$products = new Products();
$bug_list = $products->find(10)->current()
->findManyToManyRowset(‘Bugs’, ‘BugsReports’);
[/php]

この指定だと、上手く拾ってくれないことがあるようです。
#/library以下にZend Frameworkのコーディング規約に則ったclass名をつけていないと駄目?

その場合は、インスタンスを直接渡せばOKです。上記の例でいえば、

[php]
$products = new Products();
$bugs = new Bugs();
$bugs_reports = new BugsReports();
$bug_list = $products->find(10)->current()
->findManyToManyRowset($bugs, $bugs_reports);
[/php]

とか、

[php]
$products = new Products();
$bug_list = $products->find(10)->current()
->findManyToManyRowset(new Bugs(), new BugsReports());
[/php]

とかですね。無事に取得できましたでしょうか。

xdebug追加をphp.iniに記述するとき、zend_extension=か zend_extension_ts=なのかを見極めるには。

表題の、Xdebug追加時のモジュール指定、LinuxだったりWindowsだったりでも違ったりするので入れる度に迷ってしまっていた昨日にFarewell!(さらば!)です。
Eclipse用xdebug pluginについてくるマニュアルPDFに詳しく書かれていました。

If you don’t get this and you are sure the path is correct then you need to make
sure you have the correct entry for zend_extension in your PHP.INI file. When
you do PHP –i or run a script with phpinfo() in it you need to look for 2 entries
Debug Build => no
Thread Safety => enabled

phpinfo()などで、以下の2行を確認すべし。
Debug Build => no
Thread Safety => enabled

The above output shows a non debug build that has thread safety so you should
use “zend_extension_ts”.

Debug Build がnoで、Thread Safetyが有効の場合は、

zend_extension_ts

If thread safety was “disabled” then you should have the php.ini entry of
zend_extension=

thread safetyが無効の場合は、

zend_extension

if it was a debug build you need to have the entry
zend_extension_debug=

Debug buildが有効なら、

zend_extension_debug

If you are running a thread safe debug version of PHP, then your ini entry must
be of the form
zend_extension_debug_ts=

thread sageもdebugも有効なら

zend_extension_debug_ts

を使いなさい。

In summary the rule is (in the stated order)
1. start with “zend_extension”
2. if you have a debug build: Debug Build => yes , add “_debug”
3. if you have thread safety: Thread Safety => enabled , add “_ts”

まとめると、
1.zend_extensionに
2.もしデバッグビルドが有効なら、_debugを付けて、
3.もし、スレッドセーフが有効なら、_tsを付ける。

ということらしいです。
モジュールファイルを指定する時は、パスを通すか、絶対パスで書くのを忘れないようにしてくださいね。

SQLite用のAdminツール、SQLiteManager

MySQLを使うとき、ブラウザからphpMyAdminで操作すると楽ちんですので、SQLiteを使うときも同様にAdminツールを使いたくなる私です。
SQLiteManagerが、日本語にも対応しているので使いやすいと思います。

UTF-8で使う場合は、日本語設定ファイルである lang/japanese.inc.php を開いて、10行目あたりにある$charsetをutf-8に、$langSuffixをja-utf-8に変更します。
そしてjapanese.inc.phpの文字コードをUTF-8に変換して保存します。

Windows版で使う場合、テーブルが読めないバグのがあります。include フォルダ内の add_database.php の17行目あたり

[php]
if(isset($_POST['dbpath'])) $dbFilename = stripslashes($_POST['dbpath']);
[/php]

を以下に変更します。

[php]
if(isset($_POST['dbpath'])) $dbFilename = str_replace(“\\”, ‘/’,
$_POST['dbpath']);
[/php]

無事にAdminにれましたでしょうか。

参考ページ

http://project-p.jp/halt/anubis/blog_show/525

create_functionで匿名関数の作成。

PHPマニュアルに載っているだけで、かなり充実しています。
array_warkなどでよく使います。

[php]
array_walk($a, create_function('&$v,$k', '$v = "+" . $v;'));
print_r($a);
?>
[/php]

ただ要素の前に+を付けているだけですが。
匿名関数の使い方の例ということで。

Zend Frameworkでリクエストを取得する方法。

このブログでも今まで、Zend FrameworkでRequestを取得する時に

[php]
$id = $this->getRequest->getParam(‘id’);
[/php]

とか

[php]
$data = $this->getRequest->getParams();
[/php]

とかアクションコントローラ内でしていたのですが、もっと簡潔に

[php]
$id = $this->_getParam(‘id’);
[/php]

でいいんですね。
全体を取得する場合は、

[php]
$id = $this->_getAllParams(‘);
[/php]

で。冗長でしたね。

Smartyで数値を3桁毎にカンマで区切るには。

Smartyで通貨などの数値を出力する時に、

1,234,567

などとカンマをつけて出力したい時に一番簡単な方法は、PHPのnumber_format関数を使うことです。
SmartyはPHPの関数をそのまま修飾子に使えますので、
[smarty]
{$num|number_format}
[/smarty]
これでOKです!

ArrayObjectの引数にArrayIeratorを渡せる。

ArrayObjectを色々と掘り下げられている記事ですが、

[php]
class OddArrayIterator extends ArrayIterator{
 public function next(){
  if( parent::valid() ){
   parent::next();
  }
  if( parent::valid() == false ){
   return;
  }
  return parent::next();
 }
}
$array = array( "a", "b", "c" );
$array = new ArrayObject( $array , 0 , "OddArrayIterator" );
foreach( $array as $value ){
 print( $value );
}
?>
[/php]

$array = new ArrayObject( $array , 0 , “OddArrayIterator” );

こういうコトが出来るのを知らなかったです。
SPLのリファレンスにもちゃんと載ってますね。
勉強になります。

PDT1.0がリリースされたようです。

Eclipse、PHP用の開発環境「PDT 1.0」をリリースということで、1.0 Release バージョンがリリースされています。

http://download.eclipse.org/tools/pdt/downloads/

今まで別バージョンを使っていた方は、今回からEclipse3.3が必要になりましたので、とりあえず別ディレクトリにインストールして試してみてはどうでしょうか。

PHPで「文字識別」ではないCAPTCHAと、感動したCAPTCHAの話

アシアルの中の人が文字識別でないCATPTCHAの中で紹介していたPEAR::Text_CAPTCHA_Numeralという計算結果を入力させるCAPTCHAライブラリが面白いです。
CAPTCHAは入力するほうとしてはあまり楽しいものではありませんので、こういった遊び心を感じさせるシステムは良いと思います。

CAPTHCAといえば思い出すのはreCAPTCHA – キャプチャを利用した人力高性能OCRですね。
・紙からOCRで読み込む時に認識に失敗した、機械が読み取りにくい文字をCAPTCHAとして出力、
・そもそも認識しづらい文字なのだからCAPTCHAとして優秀
・人間に正解を入力させてCAPTCHA認証
・そのデータを元に、紙のスキャンデータにフィードバック
というシステムなのです。これを知った時は感動しました。まさに三方一両損、今風に言うならWin-Win。世の中には本当に面白いことを考える人間がいますね。

ページの有効期限切れ問題

「ページの有効期限切れ」問題で、ページの有効期限切れ警告を表示せず、かつ戻るボタンを押してもフォームの中身が消えない設定を解決されています。
ブラウザによって挙動が違うのは本当に困りますね。