参考にさせて頂いたページ
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は定義されていない。ということ。
ひとまず今回はここまで。