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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

CakePHP

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

Q&A

解決済

2回答

5613閲覧

Viewで設定したhiddenの値をControllerでDBに登録したい

退会済みユーザー

退会済みユーザー

総合スコア0

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

CakePHP

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

0グッド

0クリップ

投稿2017/06/14 09:21

編集2017/06/20 08:16

お世話になります。

現在cakePHPを始めて3カ月の初心者です。
以下のシステムを作成していますが
途中で躓いた為ご教示いただけますと助かります。

◆完了していること
・掲示板を作成
・記事1つに対してコメントを投稿できるよう投稿欄作成(記事はPostというDBに登録、コメントはCommentというDBに登録)
(記事が親、コメントが子といった関係性かと思います)
・コメントを投稿するとCommentに登録される

◆つまづいている箇所
・Postというテーブルに「id」というカラムがあります。
Post.php(Model)で、$hasManyのforeignKeyに「post_id(Commentテーブルのカラム)」を設定し、
Postテーブルのid = Commentテーブルのpost_id
という状況になっているかと思います。

コメント投稿をした際にhiddenで「post_id」持たせ、コメントを登録するとCommentテーブルの
「post_id」カラムに投稿した記事のid(Post)が登録され、どのコメントがどの記事のものであるか
判別できるようにしたいのですが、
今現在、DBにコメントは登録されるものの、Commentテーブルの「post_id」は「0」になってしまい
どのコメントがどの記事のものであるか分からない状態です。
上記でも書いているように、
Post.php(Model)で、$hasManyのforeignKeyに「post_id(Commentテーブルのカラム)」を設定
しているのでViewで「echo $this->Form->hidden('Comment.post_id');」と書けば
Postテーブルのidがhiddenで送信出来ると思っているのですがそもそも間違っていますか?

〇view【hiddenでpost_idを持たせたい(Postテーブルのid)】

<?php echo $this->Form->create('Comment',array('url'=>array('controller' => 'comments', 'action' => 'add'))); echo $this->Form->hidden($post['Post']['id']); echo $this->Form->input('name',array('label'=>'名前')); echo $this->Form->input('comment',array('label'=>'コメント')); echo $this->Form->end('コメントを投稿する'); ?>

〇Controller【viewで設定したhiddenの値を受け取ってCommnetテーブルの「post_id」カラムに格納したい】__
public function add() {
if($this->request->is('post')){
if($this->Comment->save($this->request->data)){
$this->Session->setFlash('投稿されました');
$this->redirect($this->referer());

} } }

Controllerでどのように書いたらhiddenの値を受け取ってCommnetテーブルの「post_id」カラムに格納出来るのか
分からずずっと悩んでいます。

こちらと同じ事がしたいのですがpost_idが「0」になってしまいます。
http://www.grooving-earth.com/cakephp-lesson/#19
19) コメント機能を実装

変なコードを書いていると思いますがご教示いただきますと助かります。
よろしくお願いいたします。

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

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

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

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

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

popobot

2017/06/14 20:29

CakePHPのバージョンはいくつでしょうか? また、そもそもフォームでpost_idを入力しないのであれば、どうやってpost_idを決めるのでしょうか。
退会済みユーザー

退会済みユーザー

2017/06/20 08:09

バージョンは2.4.6です。Postテーブルの「id」とCommentテーブルの「post_id」を$hasManyでイコールにしているのですがこちらでは不十分でしょうか・・?
guest

回答2

0

ベストアンサー

ドットインストールがやろうとしていることは、記事の詳細ページ(View/Posts/view.ctp)に「コメント投稿パーツ」を追加しています。ariapianoさんは、別のctpファイルにしていませんか? 記事の詳細ページには、$postに記事の情報を持っているため、以下のようにコメント投稿のhiddenにpost_idを入れることができます。

php

1echo $this->Form->input('Comment.post_id', array('type'=>'hidden', 'value'=>$post['Post']['id']));

投稿2017/06/20 21:36

編集2017/06/20 21:37
popobot

総合スコア6586

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

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

退会済みユーザー

退会済みユーザー

2017/06/21 01:03

ありがとうございます。 (View/Posts/view.ctp)に入力はしていたのですが、検索して出てくるコードを入力しても全くダメでした。昨夜載せていただいたコードと同じコードを別サイトで見つけ試したところ解決しました! どうもありがとうございました。
guest

0

```$this->request->data``はPOSTデータの配列ですよね。
POST送信されていないと何も入っていない状態だと思いますよ。
おそらくカラムが数値型で初期値が0であるため自動で0が入るんだと思います。

どうしてもhiddenに指定したい場合は作る側が自身で振ってあげる必要がありますが、
同時に投稿された場合、IDが重複する現象があるため好ましくありませんし、
hiddenにしてしまうとHTMLで見えるので自由に改ざんできてしまいます。

データベースのバージョンによりますが、
例えばMySQLであればidをオートインクリメントにしておけば自動で振られるため登録時にIDを意識する必要はありません。
PostgreSQLであればシーケンスをnextval()でとる方法があります。
いずれもCakePHPで実現可能と思います(別途調べてみてください)

また、

どのコメントがどの記事のものであるか分からない状態です。

このコメントから、idがPKとなっていないと推察されます。
PKにしておけば登録時にDBからエラーが返ってきますし、
一意なのであればなおさらPKにすべきです。

おそらくDBの構造から調整が必要なりますが、より安全で簡潔な仕組みとなるはずですのでご検討ください。

追記:
失礼。タグにDB2がついてましたね。
DB2環境がないので検証ができなくて申し訳ないのですが、ID列にインクリメント設定が可能なようです。
下記、参考にしてください。

投稿2017/06/15 00:56

編集2017/06/15 00:59
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2017/06/19 07:47

ありがとうございます。 少々投稿文を編集させていただきましたが、 $hasManyでForeignKeyを設定している場合、「$this->request->data」といった難しい考え方をしなくてもいいのでしょうか? 記事のテーブルにある「id」カラムとコメントテーブルの「post_id」を$hasManyのForeignKeyでイコールにしており、Viewにてhiddenで「post_id」を持たせるとコメントテーブルに登録されるコメントは「post_id」(記事のid)が登録される。 というのが理想なのですが・・。情報が足りずすみません。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問