Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

vagrantその19-5 cakephp入門をやってみる(Controllerその4) redirect時の値の受け渡しでurlに:や/を含めるとエラーが出る

参考にさせて頂いたページ

cakePHPを使って、コントローラークラスで、時間の受け渡しをしたいです。 - Yahoo!知恵袋

コントローラーを使おう!(5/5):初心者のためのCakePHP2.0 プログラミング入門

表示されるエラー

Warning (2): Missing argument 1 for SampleController::other() [APP/Controller/SampleController.php, line 12]

Notice (8): Undefined variable: param [APP/Controller/SampleController.php, line 14]

原因になるところは:が含まれているところ

$str = $date->format("H:i:s");

だったところを

$str = $date->format("H-i-s");

にしたらエラーは出なくなった。

詳細

cakePHPの url 解釈において、 : を含むパスは、named 用に解釈されるので、action の引数になりません。url作成時に urlencode していても、受け取り側で PATH_INFO 解釈時に、既に urldecode しているので同じです。 cakePHP がどのようにurl解釈(パス分解)してるかは、 debug( $this->request->params ); でチェックしてみて下さい。 ["pass"] の配列に入ってるものが、actionメソッドの引数になります。 ["named"] のほうは、データソート時のカラム指定や昇順降順指定で利用されます。 対策としては、時刻文字列作成時に、区切り記号は ":" ではなく "-" 使うとか、 ":" と "%" 以外の記号にするのがよいと思います。受け取り側で 出力時にstr_replaceすることになります。

または、区切り記号を / にしておいて $h,$m,$s の3引数で受け取ると言う手もあります。日付の時はよく見かけます。この場合は、 / をurlencode するとサーバー設定によっては、サーバーエラーで受け付けない事もあるので、urlencodeしないで連結する必要があります。

とのことなので、:/%の3つの記号はredirectするときに良くなさそう。または気をつける必要がありそう。

よくわからないこと

コントローラーを使おう!(5/5):初心者のためのCakePHP2.0 プログラミング入門の通りに書いて、

    $str = $date->format("H:i:s");

としても、初回アクセス時はエラーが出ずに時刻が出力された。

でも二回目以降のアクセスではエラーが出るようになってしまった。

なんで初回だけは表示されたのかな?

public function other($param = null){

と引数の初期値を設定しておけば、エラーは出なくなるけど、今回の問題はそういうことではない。

とはいえ値に:を含めなければ同じ問題は起こらないので一旦良い。

あと

: を含むパスは、named 用に解釈される

っていうのも今のところわからないのでそのうち学習する。

表示されたエラーの意味を読む

URLはhttp://192.168.33.10/cakephp/sample/other/13%3A32%3A26となっているから、13時32分26秒がURLに含まれているのがわかる。

でも、

Warning (2): Missing argument 1 for SampleController::other() [APP/Controller/SampleController.php, line 12]

というエラーが出るのは、第一引数が見つからないという事だし、当然第一引数が無いので

Notice (8): Undefined variable: param [APP/Controller/SampleController.php, line 14]

と表示される。

これは変数$paramは定義されていない。ということ。

ひとまず今回はここまで。