CakePHP 2.0.5のバグ報告をしたメモ

そろそろCakePHP2系を使ってみようと思って、CakePHP2の勉強会に参加しつつ、cakeコンソールでプロジェクトを作ろうとしたら、なんか大量のNoticeが出てきました。Noticeだけなので動かない事はないかもとは思ったけど、あまりに大量に出てcakeコンソールが使えたもんじゃないので、色々と調べてみて原因が分かったのでバグ報告をしました。

で報告したところ、対応してもらってステータスはresolvedになりました。といっても、コードが取り込まれたとかじゃないんだけど。

概要

php 5.2.6にあるバグを、CakePHP2が踏んでいたようです。CakePHPの動作環境がちょうどphp5.2.6以上で、ちょうど自分のMacBookに入っていたphpも5.2.6だったので踏んでしまった形です。phpのバグが原因という事と、5.2.6は他にもPDO周りにバグがあるという事で、修正ではなくCakePHP2はphp 5.2.8以上と、動作環境の変更になりました。多分CakePHP 2.0.6から。

バグの内容

$ ./cake
Notice: Undefined index: tag in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 196
Notice: Undefined index: error in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: warning in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: info in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: success in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: comment in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: question in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 211
Notice: Undefined index: text in /path/to/cakephp/lib/Cake/Console/ConsoleOutput.php on line 214
以下略

cakeコンソールを使うと、こんな感じでNoticeが大量にでます。ざっと見たところ、上記の8個のNoticeが繰り返し10回程度出ているみたい。

原因となったphp 5.2.6のバグ

PHP :: Bug #45748 :: preg_replace_callback : named subpattern not implemented

名前付きサブパターン*1が使えないというバグがありました。名前付きサブパターンは、キャプチャ用のサブパターンで、(?)(?'name')(?P)と書くと、$matches['name']となるように連想配列でキャプチャできるもの。今回のバグを追うまで知らなかったけど、添字配列よりも分かりやすくなるし便利かも。

php 5.2.6にあるPDOのバグ

PHP :: Bug #44251 :: Question mark and an escaped singel quote lead to an exception

今回のバグを報告したら、php 5.2.6にはPDO周りにもバグがあるから、動作環境をphp 5.2.8以上にしようというコメントがつきました。

$sth = $db->prepare("SELECT * FROM `TABLE` WHERE (login = '?\'')");

どうやら?\'というはてなマークと、エスケープしたシングルクォートを使うとエラーになってしまうバグらしい。ハテナマークはプリペアドステートメントプレースホルダとして使うし、はまるとめんどくさそう。

環境

Mac Mac OS X 10.5.8(Leopard
MAMP 1.7.2
php 5.2.6
CakePHP 2.0.5

*1:名前付きキャプチャ、名前付き捕獲式集合とも