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

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

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

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

Q&A

解決済

1回答

2643閲覧

条件に合うデータ削除

atsupoooon

総合スコア47

CakePHP

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

0グッド

1クリップ

投稿2016/09/21 17:34

お気に入り機能を実装しようと思っています。

jqueryでコントローラー側にデータを渡して処理をしようと思っています。
コントローラー側で削除処理できません。

Javascript

1//登録削除ボタンを押した時の処理 2$('.deletefavorite').click(function(e){ 3 e.preventDefault(); 4 var post_id = $(this).attr('data-post-id'); 5 var user_id = $(this).attr('data-user-id'); 6 var $user = JSON.parse('<?php echo json_encode($userdata['id']);?>');//ユーザid 7 var data = {postId:post_id,userId:user_id}; 8 $.ajax({ 9 url:'/cakephp/posts/deletefavoajax', 10 type:'POST', 11 data:data 12 }).done(function(){ 13 //削除の成功処理 14 alert('削除成功'); 15 $('.deletefavobtn').hide(); 16 $('.addfavobtn').show(); 17 console.log(data); 18 }).fail(function(){ 19 //削除処理失敗の場合 20 alert('再度実行してください。'); 21 }); 22});
{postId: "1", userId: "2"}

データはコントローラ側に渡ってきてると思うのですが、
データの削除ができません。追加はできました。
削除するデータは、Favoriteのテーブル内のpost_idとuser_idと同じ値のデータを削除したいと思っています。

削除できないのは何が原因なのでしょうか。

php

1//お気に入り削除 2 public function deletefavoajax(){ 3 $this->autoRender = FALSE; //viewの出力を停止 4 if($this->request->is('ajax')) { 5 $postid = $this->request->data['postId']; 6 $userId = $this->request->data['userId']; 7 $this->Post->Favorite->deleteAll(array('post_id' => $postid,'user_id' => $userId)); 8 } 9 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

処理自体はあっているようにみえます。
ブラウザのデベロッパーツールで見た場合リクエストは200で成功しているのでしょうか?
また、以下を外してみたとき、エラー等がレスポンスにないですか?

$this->autoRender = FALSE;

念のため、deleteAllの戻り値も見てみたほうがいいです。

あとは、deleteAllの直前で、以下のコードを入れるとlogs/debug.logにSQLが吐かれるの見てみるといいと思います

$this->Post->Favorite->connection()->logQueries(true);

投稿2016/09/21 22:15

編集2016/09/21 22:25
popobot

総合スコア6586

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

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

atsupoooon

2016/09/22 09:55

コメントありがとうございます。 確認しましたが、リクエストは200で成功しています。 $this->autoRender = FALSE; を外してもエラーなどはありません。 Request URL:http://localhost/cakephp/posts/deletefavoajax Request Method:POST Status Code:200 OK debug.logが吐かれません。 cakephp/app/tmp/logsで合っていますでしょうか。 CakePHP 2.7になります。 他に原因を調べる方法などありますでしょうか。
popobot

2016/09/22 11:38 編集

すみません、それCakephp3の場合でした。Cakephp2では以下のような感じみたいです http://kwski.net/cakephp-2-x/1064/ あと、もしかしたらdeleteAllまで処理がいってないかもしれないので、 deleteAllをthrow new NotFoundException();に置き換えてみて、 想定通り404が返ってくるかやってみるのもいいかもです。
atsupoooon

2016/09/23 05:11

原因がありました!!! ありがとうございます。 認証の処理の部分でアクセス不可になっており、コントローラー側で処理できませんでした。 public function isAuthorized($userId) { // 登録済ユーザーは投稿できる if ($this->action === 'add') { return true; } // 投稿のオーナーは編集や削除ができる $userId = $this->Auth->user('id'); if (in_array($this->action, array('edit', 'delete'))) { $postId = (int) $this->request->params['pass'][0]; if ($this->Post->isOwnedBy($postId, $userId)) { return true; } } echo 'アクセス無理'; } deletefavoriteの処理を通すようにするには、どのように変更すれば良いかわかりません。
popobot

2016/09/23 05:21 編集

「登録済ユーザは記事のお気に入りを削除できる」でいいと思うのでaddと同じ条件でdeletefavoriteを加えればよいのではないかと。 ただし、deletefavoajaxメソッドないでuser_idを外部からもらっているのはまずいですね。他人のお気に入りが消せちゃう。 認証ユーザのID($this->Auth->user('id');)を使って自分の記事しか消せないようにしたらよいかと
atsupoooon

2016/09/23 16:05

ありがとうございます!! 一度実装してみます。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問