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

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

ただいまの
回答率

90.03%

cakephp3 データベースの値の編集について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 355

atumu

score 29

わからないこと

コメントを編集できる機能を作成しているのですが、編集するコードを書いた際
Record not found in table "messages" with primary key [NULL]
Cake\Datasource\Exception\InvalidPrimaryKeyException
とエラーが出てしまい編集することができません。
stack のエラーには$message = $this->Messages->get($id); の部分がおかしいと記載がありました。

プライマリーキーがないですとエラーで書かれているのでプライマリーキーがあるかどうかはデータベースを見て確認しました。
このエラーの解決法がわからないのですがコードの部分で間違っていると思うのですがどこかおかしいところはありますでしょうか。
コードは上からコントローラー board.ctp edit.ctpです。 sqlも記載しておきます。

<?php
namespace App\Controller;

use App\Controller\AppController;

/**
 * Users Controller
 *
 * @property \App\Model\Table\UsersTable $Users
 *
 * @method \App\Model\Entity\User[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
class UsersController extends AppController
{

    /**
     * Index method
     *
     * @return \Cake\Http\Response|void
     */
    public function index()
    {
      $id = 'test';
      $pw = '1234';
      if($this->request->is('post')){
        if($id == 'test' && $pw == '1234') {
          return $this->redirect(['controller' => 'users', 'action' => 'board']);
        }
      }
    }
    public function board(){
      session_start();
      $this->loadModel('Messages');
      if($this->request->is('post')){
        $messages = $this->Messages->newEntity();
        $messages = $this->Messages->patchEntity($messages,$this->request->getData());
        if($this->Messages->save($messages)) {
          $messages = $this->Messages->find('all');
          $this->set('messages', $messages);
          $_SESSION['messages'] = $messages;
      }
    }
  }

    public function edit()
    {
      session_start();
      $this->loadModel('Messages');
      if($this->request->is(['post','put'])) {
        $message = $this->Messages->get($id);
        $message = $this->Messages->patchEntity($message, $this->request->data);
        if ($this->Messages->save($message)) {
            return $this->redirect(['action' => 'board']);
        }
        else{
          $this->set('message', $message);
        }
      }
    }
}
<h1>コメント</h1>

<?= $this->Form->create('messages',
['type' => 'post',
'url' => ['controller' => 'users', 'action' => 'board']]) ?>
<fieldset>
  <?= $this->Form->input('comment') ?>
</fieldset>
<?= $this->Form->submit('投稿') ?>
<?= $this->Form->end() ?>

<ul>
  <?php foreach ($messages as $message): ?>
  <?= '<li><a href="edit?comment=' . $message->comment.'&id='.$message->id.'">'.$message->comment.'</li></a>' ?>
  <?php endforeach; ?>
</ul>
<h1>編集</h1>
<?= $this->Form->create($message)?>
<fieldset>
  <?= $this->Form->input('comment') ?>
  <?= $this->Form->hidden('id') ?>
</fieldset>
<?= $this->Form->submit('編集') ?>
<?= $this->Form->end() ?>
CREATE TABLE users (
  id varchar(20),primaly
  pw varchar(20),
  name varchar(20)
)
create table messages(
id int,primaly,autoincrement
commnet varchar(20),
users_id varchar(20),
);

試したこと、確認したこと、やったこと

プライマリーキーをつけてあるか確認
コントローラーとモデルはbakeを使って作成。

環境やバージョン

windows10
xampp
php7.2
MySQL5.2
cakephp3.7
Atom

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Orlofsky

    2019/02/12 04:55 編集

    質問のテーブル定義は SHOW CREATE TABLE TABLE_NAME1 で載せてください。

    キャンセル

  • Orlofsky

    2019/02/12 04:56

    簡単な英単語のスペルは覚えましょう。 https://translate.google.com/?hl=ja&tab=TT#view=home&op=translate&sl=en&tl=ja&text=comment

    キャンセル

回答 2

check解決した方法

+1

編集部分の解決部分

loadModelをやめTableRagistryに変更し、

public function edit()
    {
      session_start();
      if($this->request->is(['post','put'])) {
        $messages = $this->messages->get($this->request->getQuery('id');
        $messages = $this->messages->patchEntity($messages, $this->request->getData());
        if ($this->Messages->save($messages)) {
            return $this->redirect(['action' => 'board']);
        }
          $this->set('messages', $messages);
      }
    }

で解決しました。
Viewも変更しましたが・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

まずは、CREATE TABLE文を直しましょう。ちゃんと CREATE TABLE されていますか?

create table messages(
id int,primaly,autoincrement  -- , の位置がおかしいし、PRIMARY、AUTO_INCREMENT のスペルが間違っているし、
commnet varchar(20),
users_id varchar(20),  -- , が余計
);


CREATE TABLE サンプル

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/12 21:25

    すみません!解決してしまいました!ご指摘ありがとうございます!SQL勉強しないでphpMyAdminに逃げていたので勉強します!

    キャンセル

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる