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

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

ただいまの
回答率

90.47%

  • PHP

    20842questions

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

  • CakePHP

    2359questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,976

y_natsui

score 40

Blogチュートリアルにおけるリダイレクト処理

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

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

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

環境は以下の環境で行いました。
  • Mac
  • MAMP
  • MySQL
  • CakePHP(Ver.2.6.4)

以下に念の為PostsConroller.phpのソースを載せておきます。
<?php
//File: /app/Controller/PostsController.php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form', 'Session');
    public $components = array('Session');

    public function index() {
        $this->set('posts', $this->Post->find('all'));
    }

    public function view($id = null) {
        if(!$id) {
            throw new NotFoundException(__('Invalid post'));
        }

        $post = $this->Post->findById($id);
        if(!$post) {
            throw new NotFoundException(__('Invalid post'));
        }
        $this->set('post', $post);
    }

    public function add() {
        if($this->request->is('post')) {
            $this->Post->create();
            if($this->Post->save($this->request->data)) {
                $this->Session->setFlash(__('Your post has been saved.'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to add your post.'));
        }
    }
    
    public function edit($id = null) {
        if(!$id) {
            throw new NotFoundException(__('Invalid post'));
        }

        $post = $this->Post->findById($id);
        if (!$post) {
            throw new NotFoundException(__('Invalid post'));
        }

        if ($this->request->is(array('post','put'))) {
            $this->Post->id = $id;
            if ($this->Post->save($this->request->data)) {
                $this->Session->setFlash(__('Your post has been updated.'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to update your post.'));
        }

        if (!$this->request->data) {
            $this->request->data = $post;
        }
    }

    public function delete($id) {
        if ($this->request->is('get')) {
            throw new MethodNotAllowedException();
        }

        if ($this->Post->delete($id)) {
            $this->Session->setFlash(
                __('The post with id: %s has been deleted.', h($id))
            );
        } else {
            $this->Session->setFlash(
                __('The post with id: %s could not be deleted.', h($id))
            );
        }

        return $this->redirect(array('action' => 'index'));
    }
}
?>

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


追記
こちらがindex.ctpのソースファイルです。
<!-- File: /app/View/Posts/index.ctp -->

<h1>Blog posts</h1>
<p><?php echo $this->Html->link('Add Post',    array('action' => 'add')); ?></p>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Actions</th>
        <th>Created</th>
    </tr>
    
    <!-- ここから、$posts配列をループして、投稿記事の情報を表示 -->

<?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id'])); ?>
        </td>
        <td>
            <?php echo $this->Form->postLink(
                'Delete',
                array('action' => 'delete', $post['Post']['id']),
                array('confirm' => 'Are you sure?'));
            ?>
            <?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id'])); ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
<?php endforeach; ?>

</table>

そして以下が使用しているViewファイルです。
<!-- File: /app/View/Posts/add.ctp -->

<h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save Post');
?>

<!-- File: /app/View/Posts/view.ctp -->

<h1><?php echo h($post['Post']['title']); ?></h1>
<p><small>Created: <?php echo $post['Post']['created']; ?></small></p>
<p><?php echo h($post['Post']['body']); ?></p>

<!-- File: /app/View/Posts/edit.ctp -->

<h1>Edit Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('Save Post');
?>


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


追記7/2(addアクション後のソースコードの状態)
イメージ説明
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ikuwow

    2015/06/30 01:33

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

    キャンセル

  • y_natsui

    2015/06/30 01:56 編集

    特に今現在エラーログは吐かれていないみたいです。以前は少し作りが違ったので、その際のエラーログが吐かれてはいました。 直近のエラーだと以下の通りでした。 (下記だと見にくいと思いましたので上記に追記しております) 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/30 04:32

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

    キャンセル

  • y_natsui

    2015/06/30 22:03 編集

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

    キャンセル

回答 2

+4

ログを見る限り、

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 22:07

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

    キャンセル

  • 2015/07/01 00: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 に行ってる可能性大です。

    全く動かしてないので、間違っていたらごめんなさい。

    キャンセル

  • 2015/07/01 02:27 編集

    そのエラーログが吐出されて以降、アクション(add/edit/delete)を行ってもエラーが吐かれてないんですよね。なので、エラーログのメッセージ部分を変更しても何で落ちているかよく分からない状態です。

    リダイレクト処理の部分で $this->redirect(array('action' => 'index')); と実装しているので、indexのfunctionが走る為、viewのfunctionはリダイレクトには関係ないかなと思うのですが、いかがでしょうか?

    後、MAMPの設定の問題だったりはしないでしょうか?(リダイレクトさせる為の設定が別途必要とか)

    キャンセル

  • 2015/07/01 22:20

    なるほど、エラーは吐かれてないのですね。

    $this->redirect(array('action' => 'index')); で遷移させていて
    エラー吐かれるはずがない場所なのに、吐いているとのことでしたので
    おかしいなぁと思った次第です。

    リダイレクトで画面真っ白。ログにエラー無しと言えば、
    リダイレクトがHTTPヘッダーとして見なされていない。ケースが思いつきます。

    リダイレクトされた後の、HTTPレスポンスが見れると解決しそうです。
    私の場合は、FireFoxにFireBugを導入し、リダイレクト後のURLを選択して
    「ネット」→「レスポンスヘッダ」で確認しています

    原因は「ヘッダー出力前にどこかで文字列を出力している」が考えられます。

    ・リダイレクト前に空白または改行を出力している→これじゃなさそう
    ・UTF-8のBOM形式でファイルを作成している→これの可能性あり

    このあたりが参考になるかもしれません
    https://ja.forums.wordpress.org/topic/6341

    キャンセル

  • 2015/07/02 01:12

    リダイレクト後の、HTTPレスポンスのキャプチャを追記致しました。

    UTF-8のBOM形式でファイルを作成している可能性があるのですね?
    BOM自体聞いたことはあるものの、見えない文字列ということしか自分自身知らないのでそこら辺ちょっと調べてみます。

    キャンセル

  • 2015/07/02 01:41

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

    キャンセル

  • 2015/07/02 15:35

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

    キャンセル

  • 2015/07/02 23:47

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

    キャンセル

  • 2015/07/03 18: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

    で権限付与できます。

    キャンセル

  • 2015/07/15 23:38

    ご返答ないのですが、、、

     sudo chmod -R 777 app/tmp

    これが答えかと思うのです、、、

    キャンセル

+1

<?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/02 01:26

    こちらのCakePHPの公式ドキュメントの記述のままなので、コード自体は合っているとは思うのですが。どうでしょうか?
    http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html

    キャンセル

  • 2015/07/02 13:07

    私の方で上記の確認をしてみましたがどちらでも行けるっぽいです。
    また、リダイレクトできないような事象とお聞きしておりますが、保存処理等を行った場合、対象Controllerの何処まで処理が行われているか確認されておりますでしょうか?

    私も良くするのですが、このレベルのプログラムでバックで最も確認し易い方法として、処理が何処で中断されているか見付けると簡単に解決できるかもしれませんよ。

    プログラムの途中に、

    var_dump('test');exit;

    などと埋め込んで、プログラムがその表示までたどり着いていれば単純に不具合無しで、だ取り着かない場合、その前に不具合があるみたいな感じです。

    デバックのステップ実行の簡易板みたいな物です。

    キャンセル

  • 2015/07/02 23:49

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

    キャンセル

  • 2015/07/02 23:53

    CakePHPのdebugはログに履かれるので確認に手間が掛かります。
    var_dumpであれば、その場で処理が中断されている事がブラウザ上に表示されますので簡単かと思います。

    CakePHPでもvar_dumpは使えますよ。
    現に私も良く利用してデバックしています。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20842questions

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

  • CakePHP

    2359questions

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