質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

2回答

9980閲覧

CakePHPでのリダイレクト処理が上手くいかない

y_natsui

総合スコア49

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2015/06/29 14:13

編集2015/07/02 14:45

###Blogチュートリアルにおけるリダイレクト処理
CakePHPブログチュートリアルを元に実装してみたのですが、追加・編集・削除の後にリダイレクト処理を入れているのですが、画面が白いままで例えば以下のURLからindexへ遷移してくれません。
http://localhost/cake/posts/add

indexの画面に戻って更新をかけるとデータが追加されているのでそこら辺の処理は大丈夫だと思うのですが、何が原因だと思われるでしょうか?

後、追加作業が成功した際のメッセージも表示されない状況です。

環境は以下の環境で行いました。

  • Mac
  • MAMP
  • MySQL
  • CakePHP(Ver.2.6.4)

以下に念の為PostsConroller.phpのソースを載せておきます。

lang

1<?php 2//File: /app/Controller/PostsController.php 3class PostsController extends AppController { 4 public $helpers = array('Html', 'Form', 'Session'); 5 public $components = array('Session'); 6 7 public function index() { 8 $this->set('posts', $this->Post->find('all')); 9 } 10 11 public function view($id = null) { 12 if(!$id) { 13 throw new NotFoundException(__('Invalid post')); 14 } 15 16 $post = $this->Post->findById($id); 17 if(!$post) { 18 throw new NotFoundException(__('Invalid post')); 19 } 20 $this->set('post', $post); 21 } 22 23 public function add() { 24 if($this->request->is('post')) { 25 $this->Post->create(); 26 if($this->Post->save($this->request->data)) { 27 $this->Session->setFlash(__('Your post has been saved.')); 28 return $this->redirect(array('action' => 'index')); 29 } 30 $this->Session->setFlash(__('Unable to add your post.')); 31 } 32 } 33 34 public function edit($id = null) { 35 if(!$id) { 36 throw new NotFoundException(__('Invalid post')); 37 } 38 39 $post = $this->Post->findById($id); 40 if (!$post) { 41 throw new NotFoundException(__('Invalid post')); 42 } 43 44 if ($this->request->is(array('post','put'))) { 45 $this->Post->id = $id; 46 if ($this->Post->save($this->request->data)) { 47 $this->Session->setFlash(__('Your post has been updated.')); 48 return $this->redirect(array('action' => 'index')); 49 } 50 $this->Session->setFlash(__('Unable to update your post.')); 51 } 52 53 if (!$this->request->data) { 54 $this->request->data = $post; 55 } 56 } 57 58 public function delete($id) { 59 if ($this->request->is('get')) { 60 throw new MethodNotAllowedException(); 61 } 62 63 if ($this->Post->delete($id)) { 64 $this->Session->setFlash( 65 __('The post with id: %s has been deleted.', h($id)) 66 ); 67 } else { 68 $this->Session->setFlash( 69 __('The post with id: %s could not be deleted.', h($id)) 70 ); 71 } 72 73 return $this->redirect(array('action' => 'index')); 74 } 75} 76?>

2015/7/2現在エラーは吐かれていないので一旦削除致します。

追記
こちらがindex.ctpのソースファイルです。

lang

1<!-- File: /app/View/Posts/index.ctp --> 2 3<h1>Blog posts</h1> 4<p><?php echo $this->Html->link('Add Post', array('action' => 'add')); ?></p> 5<table> 6 <tr> 7 <th>Id</th> 8 <th>Title</th> 9 <th>Actions</th> 10 <th>Created</th> 11 </tr> 12 13 <!-- ここから、$posts配列をループして、投稿記事の情報を表示 --> 14 15<?php foreach ($posts as $post): ?> 16 <tr> 17 <td><?php echo $post['Post']['id']; ?></td> 18 <td> 19 <?php echo $this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id'])); ?> 20 </td> 21 <td> 22 <?php echo $this->Form->postLink( 23 'Delete', 24 array('action' => 'delete', $post['Post']['id']), 25 array('confirm' => 'Are you sure?')); 26 ?> 27 <?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id'])); ?> 28 </td> 29 <td><?php echo $post['Post']['created']; ?></td> 30 </tr> 31<?php endforeach; ?> 32 33</table> 34

そして以下が使用しているViewファイルです。

lang

1<!-- File: /app/View/Posts/add.ctp --> 2 3<h1>Add Post</h1> 4<?php 5echo $this->Form->create('Post'); 6echo $this->Form->input('title'); 7echo $this->Form->input('body', array('rows' => '3')); 8echo $this->Form->end('Save Post'); 9?> 10

lang

1<!-- File: /app/View/Posts/view.ctp --> 2 3<h1><?php echo h($post['Post']['title']); ?></h1> 4<p><small>Created: <?php echo $post['Post']['created']; ?></small></p> 5<p><?php echo h($post['Post']['body']); ?></p> 6

lang

1<!-- File: /app/View/Posts/edit.ctp --> 2 3<h1>Edit Post</h1> 4<?php 5echo $this->Form->create('Post'); 6echo $this->Form->input('title'); 7echo $this->Form->input('body', array('rows' => '3')); 8echo $this->Form->input('id', array('type' => 'hidden')); 9echo $this->Form->end('Save Post'); 10?> 11

こちらにレスポンスヘッダ情報に関して追記させて頂きます。(Chromeを使用)
![イメージ説明]WIDTH:600

続き
![イメージ説明]WIDTH:600

追記7/2(addアクション後のソースコードの状態)
![イメージ説明]WIDTH:600

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2015/06/29 16:33

エラーログ(app/tmp/logs/error.log)にはどのように出力されていますか?
y_natsui

2015/06/29 17:00 編集

特に今現在エラーログは吐かれていないみたいです。以前は少し作りが違ったので、その際のエラーログが吐かれてはいました。 直近のエラーだと以下の通りでした。 (下記だと見にくいと思いましたので上記に追記しております) 2015-06-28 17:52:48 Error: Fatal Error (4): syntax error, unexpected ')', expecting ',' or ';' in [/Applications/MAMP/htdocs/cake/app/View/Posts/index.ctp, line 17] 2015-06-28 17:52:48 Error: [FatalErrorException] syntax error, unexpected ')', expecting ',' or ';' Request URL: /cake/posts/ Stack Trace: #0 /Applications/MAMP/htdocs/cake/lib/Cake/Error/ErrorHandler.php(213): ErrorHandler::handleFatalError(4, 'syntax error, u...', '/Applications/M...', 17) #1 [internal function]: ErrorHandler::handleError(4, 'syntax error, u...', '/Applications/M...', 17, Array) #2 /Applications/MAMP/htdocs/cake/lib/Cake/Core/App.php(933): call_user_func('ErrorHandler::h...', 4, 'syntax error, u...', '/Applications/M...', 17, Array) #3 /Applications/MAMP/htdocs/cake/lib/Cake/Core/App.php(906): App::_checkFatalError() #4 [internal function]: App::shutdown() #5 {main} 2015-06-28 17:55:28 Error: [NotFoundException] Invalid post Request URL: /cake/posts/view Stack Trace: #0 [internal function]: PostsController->view() #1 /Applications/MAMP/htdocs/cake/lib/Cake/Controller/Controller.php(490): ReflectionMethod->invokeArgs(Object(PostsController), Array) #2 /Applications/MAMP/htdocs/cake/lib/Cake/Routing/Dispatcher.php(193): Controller->invokeAction(Object(CakeRequest)) #3 /Applications/MAMP/htdocs/cake/lib/Cake/Routing/Dispatcher.php(167): Dispatcher->_invoke(Object(PostsController), Object(CakeRequest)) #4 /Applications/MAMP/htdocs/cake/app/webroot/index.php(118): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse)) #5 {main} これ何か関係あったりしますでしょうか?
bash_sh

2015/06/29 19:32

app/View/Posts/index.ctpの解釈でエラーが生じているようですので、 該当のファイルの中身を示して頂けると回答しやすいと思います。
y_natsui

2015/06/30 17:34 編集

index.ctpなどのViewファイルを追記させて頂きました。
guest

回答2

0

ログを見る限り、

Error: Fatal Error (4): syntax error, unexpected ')', expecting ',' or ';' in [/Applications/MAMP/htdocs/cake/app/View/Posts/index.ctp, line 17

で、
/Applications/MAMP/htdocs/cake/app/View/Posts/index.ctp
の17行目でシンタックスエラーがでているので、リダイレクトはしてるものの表示に失敗しているのではないでしょうか?

リダイレクトの確認は、Apache のアクセスログを確認、または FireFox の FireBug で、HTTPレスポンスが参照できれば確認できるかと思います。

投稿2015/06/30 00:43

kurosawa

総合スコア780

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_natsui

2015/06/30 13:07

なるほど。index.ctpのファイルを少し見直してみます。リダイレクトの確認はそうやって行うんですね。情報ありがとうございます!
kurosawa

2015/06/30 15:03

いやいや、ログには2件のエラーがでてますね。 処理時刻を見ると、 2015-06-28 17:52:48 Error: Fatal Error (4): syntax error, unexpected ')', expecting ',' or ';' in [/Applications/MAMP/htdocs/cake/app/View/Posts/index.ctp, line 17] 2015-06-28 17:55:28 Error: [NotFoundException] Invalid post なので、処理時間が3分も空いてるので、17行目は直してから実行されてるのかと。 ということは、こっちのエラーで落ちてると思います。 2015-06-28 17:55:28 Error: [NotFoundException] Invalid post メッセージには、Exception で、「Invalid post 」が出ている。 これは、コントローラの view ?を呼んで、 if(!$id) { throw new NotFoundException(__('Invalid post')); }     : if(!$post) { throw new NotFoundException(__('Invalid post')); } のどちらかで、落ちている。 (=Excepitonの Invalid post なので) つーことは、どちらかのメッセージをちょっと変更すると、どっちで落ちてるかがわかるかと。 そもそもリダイレクトは POST 送信しないので(=GET) 2個目の if(!$post) = POSTで無ければ。 で、Exception に行ってる可能性大です。 全く動かしてないので、間違っていたらごめんなさい。
y_natsui

2015/06/30 17:27 編集

そのエラーログが吐出されて以降、アクション(add/edit/delete)を行ってもエラーが吐かれてないんですよね。なので、エラーログのメッセージ部分を変更しても何で落ちているかよく分からない状態です。 リダイレクト処理の部分で $this->redirect(array('action' => 'index')); と実装しているので、indexのfunctionが走る為、viewのfunctionはリダイレクトには関係ないかなと思うのですが、いかがでしょうか? 後、MAMPの設定の問題だったりはしないでしょうか?(リダイレクトさせる為の設定が別途必要とか)
kurosawa

2015/07/01 13:20

なるほど、エラーは吐かれてないのですね。 $this->redirect(array('action' => 'index')); で遷移させていて エラー吐かれるはずがない場所なのに、吐いているとのことでしたので おかしいなぁと思った次第です。 リダイレクトで画面真っ白。ログにエラー無しと言えば、 リダイレクトがHTTPヘッダーとして見なされていない。ケースが思いつきます。 リダイレクトされた後の、HTTPレスポンスが見れると解決しそうです。 私の場合は、FireFoxにFireBugを導入し、リダイレクト後のURLを選択して 「ネット」→「レスポンスヘッダ」で確認しています 原因は「ヘッダー出力前にどこかで文字列を出力している」が考えられます。 ・リダイレクト前に空白または改行を出力している→これじゃなさそう ・UTF-8のBOM形式でファイルを作成している→これの可能性あり このあたりが参考になるかもしれません https://ja.forums.wordpress.org/topic/6341
y_natsui

2015/07/01 16:12

リダイレクト後の、HTTPレスポンスのキャプチャを追記致しました。 UTF-8のBOM形式でファイルを作成している可能性があるのですね? BOM自体聞いたことはあるものの、見えない文字列ということしか自分自身知らないのでそこら辺ちょっと調べてみます。
y_natsui

2015/07/01 16:41

ちなみに今回利用したController, View, ModelをVimにてBOMの有無を検索したところ、全てのファイルにてnobombとの結果が出たので、BOM形式でファイルは保存されていないかなと思われます。
kurosawa

2015/07/02 06:35

ちなみに、真っ白画面のHTMLソースは参照できますか? Locationヘッダーとか、空白や改行挟んで出力されてないか確認したかったりします
y_natsui

2015/07/02 14:47

addアクション後の真っ白の状態になった際のソースコードの状態のキャプチャを追加致しました。
kurosawa

2015/07/03 09:10

https://teratail.com/uploads/contributed_images/2e67baf1c04ff0117df95f7bcaf9ed69.png を見る限り、本来なら Response Headers 内にLocation: タグが出力されるのですが そのタグが出力されてないため、これではリダイレクトされません。 Content-Length も 1 とでているので、 空白とか改行で Location タグが無効になっているわけでもなさそうです。 ・データの登録はされている ・リダイレクトはされない となると、 その間の処理は Session へのMSG保存なので、 ここで失敗するとこのような事象に陥るかもしれません。 CakePHP ディレクトリ配下にある app/tmp/ に、 Apache ユーザの書き込み権限は付与していますか? なお tmp 配下のサブディレクトリは、全てのディレクトリに権限が必要です。 もし Apache ユーザがわからなければ、  sudo chmod -R 777 app/tmp で権限付与できます。
kurosawa

2015/07/15 14:38

ご返答ないのですが、、、  sudo chmod -R 777 app/tmp これが答えかと思うのです、、、
guest

0

<?php echo $this->Form->postLink( 'Delete', array('action' => 'delete', $post['Post']['id']), array('confirm' => 'Are you sure?')); ?>
<?php echo $this->Form->postLink('Delete', array('action' => 'delete', $user['user']['id']), array('class' => 'btn btn-sm btn-danger'), __('Are you sure?')); ?>

いろいろサンプルを見たのですが、記述が違っていたので投稿してみました。

投稿2015/07/01 14:38

takayukiinaba

総合スコア1158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takayukiinaba

2015/07/02 04:07

私の方で上記の確認をしてみましたがどちらでも行けるっぽいです。 また、リダイレクトできないような事象とお聞きしておりますが、保存処理等を行った場合、対象Controllerの何処まで処理が行われているか確認されておりますでしょうか? 私も良くするのですが、このレベルのプログラムでバックで最も確認し易い方法として、処理が何処で中断されているか見付けると簡単に解決できるかもしれませんよ。 プログラムの途中に、 var_dump('test');exit; などと埋め込んで、プログラムがその表示までたどり着いていれば単純に不具合無しで、だ取り着かない場合、その前に不具合があるみたいな感じです。 デバックのステップ実行の簡易板みたいな物です。
y_natsui

2015/07/02 14:49

細かくまだデバッグ出来ておりません。var_dump利用して(CakePHPならdebugかな?)デバッグしてみます。
takayukiinaba

2015/07/02 14:53

CakePHPのdebugはログに履かれるので確認に手間が掛かります。 var_dumpであれば、その場で処理が中断されている事がブラウザ上に表示されますので簡単かと思います。 CakePHPでもvar_dumpは使えますよ。 現に私も良く利用してデバックしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問