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 = '?\'')");
どうやら?\'
というはてなマークと、エスケープしたシングルクォートを使うとエラーになってしまうバグらしい。ハテナマークはプリペアドステートメントのプレースホルダとして使うし、はまるとめんどくさそう。
*1:名前付きキャプチャ、名前付き捕獲式集合とも