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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

3回答

8653閲覧

【laravel】Undefined variable: のエラーが表示される

youplus40

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2020/08/24 10:07

編集2020/08/25 04:50

前提・実現したいこと

PHP(larvel)でタスク管理システムを作っています。
completed_atカラムに現在の日時を保存し、indexページをリダイレクトするタスクの完了ボタンを実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

todos/indexページ(完了ボタンを表示しようとしているページ)を
開いたところ、下記のようなメッセージが出ました。

Undefined variable: todo (View: C:\xampp\htdocs\Todolist_0813\Todo202008\Todo202008\Todo_laravel\resources\views\todos\index.blade.php)

該当のソースコード

laravel

1 {{--index.blade.php内--}} 2 {{--完了ボタン--}} 3 <td><form action="{{ route('todo.update',['id' => $todo->id]) }}" method="post"> //エラーが出ている行 4 {{ csrf_field() }} 5 <button type="submit" class="btn btn-success">完了</button> 6 </form> 7 </td>

laravel

1 {{--web.php--}} 2Route::group(['prefix' => 'todos', 'middleware' => 'auth'], function(){ 3 Route::get('index', 'TodosController@index') ->name('todo.index'); 4 Route::get('create', 'TodosController@create') ->name('todo.create'); 5 Route::post('/index', 'TodosController@store') ->name('todo.store'); 6 Route::get('show/{id}', 'TodosController@show') ->name('todo.show'); 7 Route::get('edit/{id}', 'TodosController@edit') ->name('todo.edit'); 8 Route::post('update/{id}', 'TodosController@update') ->name('todo.update'); 9 Route::post('delete/{id}', 'TodosController@destroy') ->name('todo.destroy'); 10});

laravel

1 {{--controller.php--}} 2 public static function Date(){ 3 $date = date("y-m-d"); 4 return $date; 5 } 6public function update($id) { 7 // 完了日を入力 8 $todo = Todo::find($id); 9 $todo->completed_at = self::Date(); 10 $todo->save(); 11 return redirect('todos/index',compact('todo')); 12 } 13 14 public function edit($id) { 15 $todos = Todo::find($id); 16 $frequency = frequency::all(); 17 return view('todos.edit',compact('todos','frequency')); 18 } 19 20 public static function index(){ 21 $frequencys = frequency::where('frequency','=', self::Datetime()) 22 ->whereHas('todos',function($q){ 23 $q->where('completed_at','<>', self::Date()) 24 ->orderBy('difficultyLevel', 'desc'); 25 }) 26 ->get(); 27 $datas = []; 28 foreach ($frequencys as $frequency) { 29 $datas[] = [ 30 'id' => $frequency->todos->id, 31 'body' => $frequency->todos->body, 32 'difficultyLevel' => $frequency->todos->difficultyLevel, 33 'frequency' => $frequency->frequency 34 ]; 35 } 36 37 return view('todos/index',compact('frequencys','datas')); 38 } 39

補足情報(FW/ツールのバージョンなど)

PHP 7.4.9
laravel 6.18.35
MySQL 5.7.26

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

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

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

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

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

phper.k

2020/08/24 10:20

controller の edit()を提示してください。
yambejp

2020/08/24 10:23

「Todo202008」が被ってますが大丈夫ですか?
youplus40

2020/08/25 01:54

>yambejg さん 被ると不具合が生じる可能性があるのでしょうか。
yambejp

2020/08/25 04:53 編集

> 被ると不具合が生じる可能性 pathが間違えているとか、パラメータがうまくとれないとか 可能性だけでいえばありとあらゆる問題が想定されます。 とりあえず違和感があるので指摘しました。 (別に確認する気がないなら放置してください)
guest

回答3

0

diff

1 public function edit($id) { 2- $todos = Todo::find($id); 3+ $todo = Todo::find($id); 4 $frequency = frequency::all(); 5- return view('todos.edit',compact('todos','frequency')); 6+ return view('todos.edit',compact('todo','frequency')); 7 }

投稿2020/08/24 10:26

phper.k

総合スコア3923

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

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

youplus40

2020/08/25 01:48

ご回答ありがとうございます。 しかしながら、コードを直しましたが同じエラーが出ております。
guest

0

自己解決

自己解決したので、コードを記載します。
index.blade.phpのforeach文の変数を$todoに、PACTHメソッドを使用、update()でcompactを削除して解決しました。

laravel

1 <!--index.blade.php --> 2 <!--完了ボタン --> 3 <td><form action="{{ route('todo.update',$todo["id"]) }}" method="post"> 4 {{ csrf_field() }} 5 {{ method_field('patch')}} 6 <button type="submit" class="btn btn-success">完了</button> 7 </form> 8 </td>

laravel

1 <!--web.php --> 2Route::group(['prefix' => 'todos', 'middleware' => 'auth'], function(){ 3 Route::get('index', 'TodosController@index') ->name('todo.index'); 4 Route::get('create', 'TodosController@create') ->name('todo.create'); 5 Route::post('/index', 'TodosController@store') ->name('todo.store'); 6 Route::get('show/{id}', 'TodosController@show') ->name('todo.show'); 7 Route::get('edit/{id}', 'TodosController@edit') ->name('todo.edit'); 8 Route::patch('/todos/{id}','TodosController@update') ->name('todo.update'); 9 Route::post('delete/{id}', 'TodosController@destroy') ->name('todo.destroy'); 10});

laravel

1 public function update($id) { 2 $todo = Todo::find($id); 3 $todo->completed_at = self::Date(); 4 $todo->save(); 5 return redirect('todos/index');

投稿2020/08/26 06:26

youplus40

総合スコア19

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

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

0

Undefined variable: todo

エラーを見ると、todoなんて定義されてないよ!って書いてありますね。
データを更新した際にこのエラーが表示されたということは、更新処理を行っている関数内で、
todoでない変数をViewに渡していることになります。

youplus40さんが更新処理を実装した際に定義した関数はeditなので、
そこで返している値を調べればいいわけですね。

てなわけで、phper.kさんの回答で問題が解消されるのではないかと。

投稿2020/08/24 12:05

Suumon

総合スコア211

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

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

youplus40

2020/08/25 01:53

回答ありがとうございます。 「更新処理を実装した際に定義した関数はeditなので、」とありますが、 どの部分から判断されたのでしょうか。 index.blade.phpでは'todo.update'をルートとして選択しており、自分ではその認識がありませんでした。 何卒、ご教授のほど、よろしくお願いいたします。
Suumon

2020/08/25 02:24

お…これは恥ずかしい。完全に読み間違いです。 再度、読み返してみました。 お手数ですが、Controller側のindex.blade.phpを表示する処理を上記に追記していただいてもよろしいしょうか?(TodosControllerクラスのindex)
youplus40

2020/08/25 04:50

index部分を追記しましたので、ご確認いただければと存じます。
Suumon

2020/08/25 10:09

index.blade.php内でforeach($datas as $todo)としたら動きますかね? それでだめなら、どうしましょうね…。 原因はindex()かindex.blade.phpにあるかと思うので、デバックなりしてちゃんと想定した値が渡っているかとか調べるしかないかと。
youplus40

2020/08/26 04:42

index.blade.phpを修正したところ、エラーはなくなりました。ありがとうございます。 ただ、completed_atにデータが入らず、ただindex.blade.phpにリダイレクトしているだけになります。 update()に問題があると思うのですが、var_dompを設定してもリダイレクトが起こるだけの状況です。
Suumon

2020/08/26 10:28

エラーが解決されたようでなによりです。 上記の質問ですが、本質問とは別の問題ですので、新たに質問しなおしたほうが良いかと思います。 …とはいえ、ぱっと見気になったことがあったのでそれだけ指摘しておきますと、 〇 staticeに定義したDate()ですが、これは本当に動いているのでしょうか? 〇date("y-m-d")の戻り値を使用する程度の処理をわざわざ関数として分ける必要はないのではないでしょうか? つまり、 ``` $todo->completed_at = date("y-m-d"); ```
youplus40

2020/08/27 04:21

ありがとうございます。自己解決したコードで、Suumon様にお聞きしたエラーも改善しております。 ○こちらは動いております。 ○2箇所Date()を使用する部分があり、関数として使用しておりましたが、  おっしゃるとおり、変更したところ問題なく動きましたので、関数として分ける必要はなかったです。  コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問