52920


タイトルの件について、  
ローカル環境(vagrant使用)で正常に動作していた  
ajax→controller→ajaxのデータ通信が、レンタルサーバー(xserver)に  
uploadしたところ処理がvagrantと違った挙動になってしまい、  
原因が分からず詰まってしまいました。  
そこで、現在の処理のソースを記載しますので、  
間違っている点や原因をご教示いただけると幸いです。

【確認できていること】  
・ajax→controllerへは通信できている。  
・controller→ajaxへの通信も通っている。  
・ajax側のsuccessに処理は流れるが、  
responseに入っている値が以下のような呼び出しページのhtml全てを吐き出している。

[code]

    response = "<meta charset="utf-8"/><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script><script src="/fourps/js/moment.js">.....以下略
    
[/code]

【やりたいこと】  
ajaxで送信したデータを元にcontoller側で処理して、  
controller側で取得したデータをajaxに返してあげる。

**ajax処理一部抜粋**

[code]

       function loginUser(){
        var user_name = $('#name').val();
        var password = $('#pass').val();
     $.ajax({
        type:'post',
        url:'users/login',
        data: {userName:user_name,
              passWord:password},
             contentType: 'application/json',
             success:function(response) {
            var contest_list = response['contest_list'];
            var photo_list = response['photo_list'];
            var vote_end_list = response['vote_end_list'];....以下略
    ※ここのresponseに呼び出しページのhtml全て入ってしまっている。とりたい値は入っていない。
    
[/code]

**controller処理一部抜粋**  

[code]

     public function login(){
            if ($this->request->is('ajax')) {
                $this->autoRender = FALSE;
                $session = $this->request->getSession();
                $user_name = $this->request->getData(['userName']);
                $pass_word = $this->request->getData(['passWord']);
                //TODO::cakeのauth使う
                $collation = $this->Users->find()
                    ->where(['user_name' => $user_name])
                    ->andWhere(['password' => $pass_word])
                    ->count();
                if ($collation == 1) {
                    //セッションにユーザ情報保存
                    $getUserInfo = $this->usersTable->existUser($user_name, $pass_word);
                    $session->write(
                        ['user_name' => $user_name,
                         'auth'      => $getUserInfo[0]['auth'],
                         'id'        => $getUserInfo[0]['id']]
                    );
    
    
                    //login後のcontest詳細用データ取得
                    try {
                        //表示コンテスト名・開催中コンテスト参加写真取得
                        list($contest_info_list,$added_photo_list,$vote_end_no_list) = $this->usersTable->getDisplayContest($session->read('id'));
    
    
                        //表示するコンテストがない場合の処理
                        if($contest_info_list == 1){
    
                        }
    
                    }catch(Exception $e){
                        echo $e->getMessage();
                    }
    
    
    
                    $this->response->body(json_encode(
                        ['user_name'=>$session->read('user_name'),
                         'auth'=>$session->read('auth'),
                         'contest_list'=>$contest_info_list,
                         'photo_list'=>$added_photo_list,
                         'vote_end_list'=>$vote_end_no_list
                        ]
                    ));
    
                }else{
                    $this->redirect('/users');
                }
            }
    }
    
[/code]

以上の処理で、ローカル環境であれば想定通りの処理（ajax側のresponseにcontroller側で指定した連想配列が渡る)がされていましたが、レンタルサーバーに公開したところ、  
responseに違った値が入るようになってしまいました。

お手数ですが原因などお分かりになられる方がおられましたら、  
ご教示いただければと思います。

また、情報に不足がありましたらご指摘ください。  
追記させていただきます。

以上、よろしくお願いいたします。

******************2019-02-18追記*********************  
logs下にerror.log内容

[code]

    2019-02-18 23:11:03 Warning: Warning (512): Unable to emit headers. Headers sent in file=/home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Error/Debugger.php line=853 in [/home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php, line 48]
    Request URL: /users/login
    Referer URL: https://サーバ名/project名/users
    Client IP: IPアドレス
    Trace:
    Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.php, line 159
    Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 48
    Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 141
    [main] - ROOT/webroot/index.php, line 40
    
    
    
    2019-02-18 23:11:03 Warning: Warning (2): Cannot modify header information - headers already sent by (output started at /home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Error/Debugger.php:853) in [/home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php, line 148]
    Request URL: /users/login
    Referer URL: https://サーバ名/project名/users
    Client IP: IPアドレス
    Trace:
    Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.php, line 159
    header - [internal], line ??
    Cake\Http\ResponseEmitter::emitStatusLine() - CORE/src/Http/ResponseEmitter.php, line 148
    Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 54
    Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 141
    [main] - ROOT/webroot/index.php, line 40
    
    
    
    2019-02-18 23:11:03 Warning: Warning (2): Cannot modify header information - headers already sent by (output started at /home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Error/Debugger.php:853) in [/home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php, line 181]
    Request URL: /users/login
    Referer URL: https://サーバ名/project名/users
    Client IP: IPアドレス
    Trace:
    Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.php, line 159
    header - [internal], line ??
    Cake\Http\ResponseEmitter::emitHeaders() - CORE/src/Http/ResponseEmitter.php, line 181
    Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 55
    Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 141
    [main] - ROOT/webroot/index.php, line 40
    
    
    
    2019-02-18 23:11:03 Warning: Warning (2): Cannot modify header information - headers already sent by (output started at /home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Error/Debugger.php:853) in [/home/homeディレクトリ名/サーバ名/public_html/project名/vendor/cakephp/cakephp/src/Http/ResponseEmitter.php, line 181]
    Request URL: /users/login
    Referer URL: https://サーバ名/project名/users
    Client IP: IPアドレス
    Trace:
    Cake\Error\BaseErrorHandler::handleError() - CORE/src/Error/BaseErrorHandler.php, line 159
    header - [internal], line ??
    Cake\Http\ResponseEmitter::emitHeaders() - CORE/src/Http/ResponseEmitter.php, line 181
    Cake\Http\ResponseEmitter::emit() - CORE/src/Http/ResponseEmitter.php, line 55
    Cake\Http\Server::emit() - CORE/src/Http/Server.php, line 141
    [main] - ROOT/webroot/index.php, line 40
    
[/code]


CC BY-SA 4.0
2019-02-17T06:07:48.660
52821
2019-02-21T11:07:13.067
2019-02-18T16:38:50.477
2376
13251
question
javascript php cakephp ajax
cakephp3でajaxとcontroller間でのデータやり取りがうまくいきません


こちら解決しましたので回答します。  
原因はcontroller側で  
cakeのバージョンで非推奨(v3.4以前)の書き方してたことと、returnの記載がなかったことでした。  
以下修正後のソースになります。

ajax処理抜粋

[code]

         function loginUser(){
            var user_name = $('#name').val();
            var password = $('#pass').val();
           $.ajax({
              type:'post',
              url:'users/login',
            data: {userName:user_name,
                  passWord:password},
    dataType:'json',
                 success:function(response) {
                var contest_list = response['contest_list'];
                var photo_list = response['photo_list'];
                var vote_end_list = response['vote_end_list'];....以下略
    
[/code]

controller抜粋

[code]

    public function login(){
            if ($this->request->is('ajax')) {
                $this->autoRender = FALSE;
                $session = $this->request->getSession();
                $user_name = $this->request->getData(['userName']);
                $pass_word = $this->request->getData(['passWord']);
                //TODO::cakeのauth使う
                $collation = $this->Users->find()
                    ->where(['user_name' => $user_name])
                    ->andWhere(['password' => $pass_word])
                    ->count();
                if ($collation == 1) {
                    //セッションにユーザ情報保存
                    $getUserInfo = $this->usersTable->existUser($user_name, $pass_word);
                    $session->write(
                        ['user_name' => $user_name,
                         'auth'      => $getUserInfo[0]['auth'],
                         'id'        => $getUserInfo[0]['id']]
                    );
    
    
                    //login後のcontest詳細用データ取得
                    try {
                        //表示コンテスト名・開催中コンテスト参加写真取得
                        list($contest_info_list,$added_photo_list,$vote_end_no_list) = $this->usersTable->getDisplayContest($session->read('id'));
    
    
                        //表示するコンテストがない場合の処理
                        if($contest_info_list == 1){
    
                        }
    
                    }catch(Exception $e){
                        echo $e->getMessage();
                    }
    
    
    
                     return $this->response->withType('application/json')->withStringBody(json_encode(
                            ['user_name'=>$session->read('user_name'),
                             'auth'=>$session->read('auth'),
                             'contest_list'=>$contest_info_list,
                             'photo_list'=>$added_photo_list,
                             'vote_end_list'=>$vote_end_no_list
                            ]
                        ));
    
                }else{
                    $this->redirect('/users');
                }
            }
    }
    
[/code]


CC BY-SA 4.0
2019-02-21T11:07:13.067
52920
2019-02-21T11:07:13.067
13251
52821
answer