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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

3445閲覧

【Laravel5.5】編集確認画面からデータが更新できない

YamamotoAtsushi

総合スコア17

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/05/15 15:41

前提・実現したいこと

Laravel5.5にて、下記画面のような一覧画面からの確認画面付き編集機能を作成したいと考えております。
編集確認画面から一覧への更新機能実装中に以下のエラーメッセージが発生しました。
どなたかエラー原因について、ご存知の方がいらっしゃいましたら教えて頂ければと思います。
宜しくお願い致します。
イメージ説明
※躓いている箇所は上記図の3から4の部分です。

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

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message

イメージ説明

該当のソースコード

■ \xampp\htdocs\demo\resources\views\students
【list.blade.php】

php

1@extends('layouts.layout') 2@section('title', 'Tutrial for beginner') 3@section('content') 4 <div class="page-header" style="margin-top:-30px;padding-bottom:0px;"> 5 <h1><small>受講生一覧</small></h1> 6 <div class="col-sm-2"> 7 <a href="{{ url('students/new_index') }}" class="btn btn-warning"><i class="glyphicon glyphicon-plus"></i> 新規登録</a> 8 </div> 9 </div> 10 <table class="table table-striped table-hover"> 11 <thead> 12 <tr> 13 <th>No</th> 14 <th>name</th> 15 <th>email</th> 16 <th>tel</th> 17 <th>opration</th> 18 </tr> 19 </thead> 20 <tbody> 21 @foreach($students as $student) 22 <tr> 23 <td>{{ $student->id }}</td> 24 <td>{{ $student->username }}</td> 25 <td>{{ $student->email }}</td> 26 <td>{{ $student->tel}}</td> 27 <td> 28 <a href="{{ action('StudentController@show', $student->id) }}" class="btn btn-primary btn-sm">詳細</a> 29 <a href="{{ action('StudentController@edit_index', $student->id) }}" class="btn btn-primary btn-sm">編集</a> 30 <a href="" class="btn btn-danger btn-sm">削除</a> 31 </td> 32 </tr> 33 @endforeach 34 </tbody> 35 </table> 36 <!-- page control --> 37 {{ $students->links() }} 38@endsection

【edit_index.blade.php】

php

1@extends( 'layouts.layout' ) 2@section( 'title', 'Tutrial for beginner' ) 3@section( 'content' ) 4 <h3>受講生編集画面|入力画面</h3> 5 <p><span class="label label-danger">入力画面</span>-> 確認画面 ->完了画面</p> 6 <form action="{{ action('StudentController@edit_confirm', $students->id)}}" method="POST" class="form-horizontal"> 7 {{ csrf_field() }} 8 {{ method_field('patch') }} 9 <div class="form-group @if($errors->has('name')) has-error @endif"> 10 <label for="name" class="col-md-3 control-label">お名前</label> 11 <div class="col-sm-9"> 12 <input type="name" class="form-control" id="name" name="name" value="{{ $students->username }}"> @if($errors->has('name')) 13 <span class="text-danger">{{ $errors->first('name') }}</span> @endif 14 </div> 15 </div> 16 <div class="form-group @if($errors->has('mail')) has-error @endif"> 17 <label for="mail" class="col-md-3 control-label">メールアドレス</label> 18 <div class="col-sm-9"> 19 <input type="mail" class="form-control" id="mail" name="mail" value="{{ $students->email }}"> @if($errors->has('mail')) 20 <span class="text-danger">{{ $errors->first('mail') }}</span> @endif 21 </div> 22 </div> 23 <div class="form-group @if($errors->has('tel')) has-error @endif"> 24 <label for="tel" class="col-md-3 control-label">電話番号</label> 25 <div class="col-md-9"> 26 <input type="tel" class="form-control" id="tel" name="tel" value="{{$students->tel }}"> @if($errors->has('tel')) 27 <span class="text-danger">{{ $errors->first('tel') }}</span> @endif 28 </div> 29 </div> 30 <div class="col-md-offset-3 text-center"><button class="btn btn-primary">確認</button> 31 </div> 32 </form> 33@endsection

【edit_confim.php】

php

1@extends('layouts.layout') 2@section('title', 'Tutrial for beginner') 3@section('content') 4 <h3>受講生編集画面|確認画面</h3> 5 <p>入力画面-><span class="label label-danger"> 確認画面</span> ->完了画面</p> 6 <form action="{{url('students/list/')}}" method="post" class="form-horizontal"> 7 {{ csrf_field() }} 8 <input type="hidden" name="name" value="{{$name}}"> 9 <input type="hidden" name="email" value="{{$mail}}"> 10 <input type="hidden" name="tel" value="{{$tel}}"> 11 <div class="row"> 12 <label class="col-sm-4 control-label">お名前</label> 13 <div class="col-sm-8">{{$name}}</div> 14 </div> 15 <div class="row"> 16 <label class="col-sm-4 control-label">メールアドレス</label> 17 <div class="col-sm-8">{{$mail}}</div> 18 </div> 19 <div class="row"> 20 <label class="col-sm-4 control-label">電話番号</label> 21 <div class="col-sm-8">{{$tel}}</div> 22 </div> 23 <div class="row" style="margin-top: 30px;"> 24 <div class="col-sm-offset-4 col-sm-8"> 25 <input type="submit" name="button1" value="登録" class="btn btn-primary btn-wide" /> 26 </div> 27 </div> 28 </form> 29@endsection

■\xampp\htdocs\demo\routes
【web.php】

php

1//studentsList画面 2Route::prefix('students')->group(function () { 3 Route::get('list','StudentController@getIndex'); //一覧表示 4 Route::get('/edit_index/{id}', 'StudentController@edit_index'); //編集 5 Route::patch('/edit_confirm/{id}','StudentController@edit_confirm'); //確認 6 Route::post('/list/{id}', 'StudentController@update'); //UPdate完了 7});

■\xampp\htdocs\demo\app
【Students.php】

php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Students extends Model 8{ 9 protected $fillable =['id','username','mail', 'tel' ]; 10}

■\xampp\htdocs\demo\app\Http\Controllers
【StudentController.php】

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Support\Facades\DB; //DBオブジェクト 6use Illuminate\Http\Request; 7use App\Http\Requests\CheckStudentRequest; 8use App\Students; //Studentsクラス 9use Validator; 10 11class StudentController extends Controller 12{ 13 public function getIndex(Request $request) 14 { 15 $students = DB::table('students')->Orderby('id','asc')->simplePaginate(5); 16 return view('students.list', ['students' => $students]); 17 } 18 19 public function edit_index($id) 20 { 21 $students = Students::findorFail($id); 22 return view('students.edit_index')->with('students',$students); 23 } 24 25 public function edit_confirm(CheckStudentRequest $request) 26 { 27 // $requestから全てのオブジェクトを引き出し$dataへ格納 28 $data = $request->all(); 29 // $dataの変数をstudents/new_confrimページに返す。 30 return view('students.edit_confirm')->with($data); 31 } 32 33 public function update(Request $request,$id) 34 { 35 //Studentオブジェクトからレコードを検索 36 $students = Students::findOrFail($id); 37 // 値の保存 38 $students->fill($request->all())->save(); 39 40 return redirect()->route('students.list'); 41 } 42}

試したこと

  • edit_confim.phpのform actionの書き換え(1)

php

1<form action="{{url('students/list/{id}')}}" method="post" class="form-horizontal">

→id部分が暗号化され、ページが見つかりませんとのエラー画面が出て駄目でした。

  • edit_confim.phpのform actionの書き換え(2) 

php

1<form action="{{ action('StudentController@update', $student->id))}" method="post" class="form-horizontal">

→ unvariable $studentsで値が見つからないというエラーが出ます。

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

■ 使用OS:Windows 10 PRO
■ XAMPP Version: 7.2.5
■ phpversion:7.1
■ Laravelversion:5.5

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

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

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

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

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

guest

回答4

0

自己解決

色々とご協力有難うございました。更新での確認画面が要らないかもというアドバイスを頂き全文書き直しを行いました。下記に自己解決方法記載致します。
1.web.phpにてRoute::resource('student', 'studentController');で最初に
studentフォルダ配下全てリソース化を実行。
web.php

php

1//resouceでstudent配下を丸ごとリソース化 2Route::resource('student', 'studentController');

2.コマンドを開き、プロジェクトフォルダ配下で下記コマンド実行

phpArtisanCommand

1>cd PJfolde 2>php artisan make:controller StudentController -- resouce

3.そのままroute確認コマンドを実行し、下記のような画面が出るのでNAMEとURIを確認

phpArtisanCommand

1>php artisan route:list

イメージ説明
※全て作成済みのためルートが消えてるものが御座います。ご了承ください

4.studentsControllerの作成

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\DB; //DBオブジェクト 7use App\Http\Requests\CheckStudentRequest; 8use Illuminate\Support\Arr; 9use App\Students; //Studentsクラス 10use Validator; 11 12class StudentController extends Controller 13{ 14/** 15 * 一覧表示 16 * 17 * @param Request $request 18 * @return Response 19 */ 20 public function index(Request $request) 21 { 22 $students = DB::table('students')->Orderby('id','asc')->simplePaginate(5); 23 return view('student.index', ['students' => $students]); 24 } 25 26 public function edit($id) 27 { 28 $students = Students::findorFail($id); 29 //route一覧NAME:student.editなのでその通りに指定 30 return view('student.edit')->with('students',$students); 31 } 32 33 /** 34 * Update the specified resource in storage. 35 * 36 * @param \Illuminate\Http\Request $request 37 * @param int $id 38 * @return \Illuminate\Http\Response 39 */ 40 public function update(Request $request, $id) 41 { 42 //Studentオブジェクトからレコードを検索 43 $students = Students::findOrFail($id); 44 // 値の編集の受付 45 $students->username = $request->name; 46 $students->email = $request->mail; 47 $students->tel = $request->tel; 48 49 // 編集した値の保存 50 $students ->save(); 51 //定義されたrouteへ戻る。 52 return redirect('student'); 53 } 54 55}

5.web.phpの再編集

php

1Route::resource('student', 'studentController'); 2Route::get('student/', 'studentController@index'); 3Route::get('student/{student}/edit','studentController@edit'); 4Route::patch('student/{student}','studentController@update');

6.student/index.blade.phpの編集
Link先を直接actionで指定して飛ばす{{action('studentController@edit', $student->id)}}

php

1@extends('layouts.layout') 2@section('title', 'Tutrial for beginner') 3@section('content') 4 <div class="page-header" style="margin-top:-30px;padding-bottom:0px;"> 5 <h1><small>受講生一覧</small></h1> 6 <div class="col-sm-2"> 7 <a href="{{ action('studentController@create') }}" class="btn btn-warning"><i class="glyphicon glyphicon-plus"></i> 新規登録</a> 8 </div> 9 </div> 10 <table class="table table-striped table-hover"> 11 <thead> 12 <tr> 13 <th>No</th> 14 <th>name</th> 15 <th>email</th> 16 <th>tel</th> 17 <th>opration</th> 18 </tr> 19 </thead> 20 <tbody> 21 @foreach($students as $student) 22 <tr> 23 <td>{{ $student->id }}</td> 24 <td>{{ $student->username }}</td> 25 <td>{{ $student->email }}</td> 26 <td>{{ $student->tel}}</td> 27 <td> 28 <a href="" class="btn btn-primary btn-sm">詳細</a> 29 <a href="{{action('studentController@edit', $student->id)}}" class="btn btn-primary btn-sm">編集</a> 30 <a href="" class="btn btn-danger btn-sm">削除</a> 31 </td> 32 </tr> 33 @endforeach 34 </tbody> 35 </table> 36 <!-- page control --> 37 {{ $students->links() }} 38@endsection

7.student/edit.blade.phpの編集
updateメソッドで直接idを下記のように書いて、呼び出す。

php

1@extends( 'layouts.layout' ) 2@section( 'title', 'Tutrial for beginner' ) 3@section( 'content' ) 4 <h3>受講生編集画面</h3> 5 <form action="{{ action('studentController@update', ['id'=>$students->id]) }}" method="POST" class="form-horizontal"> 6 {{ csrf_field() }} 7 {{ method_field('patch') }} 8 <div class="form-group @if($errors->has('name')) has-error @endif"> 9 <label for="name" class="col-md-3 control-label">お名前</label> 10 <div class="col-sm-9"> 11 <input type="name" class="form-control" id="name" name="name" value="{{ $students->username }}"> @if($errors->has('name')) 12 <span class="text-danger">{{ $errors->first('name') }}</span> @endif 13 </div> 14 </div> 15 <div class="form-group @if($errors->has('mail')) has-error @endif"> 16 <label for="mail" class="col-md-3 control-label">メールアドレス</label> 17 <div class="col-sm-9"> 18 <input type="mail" class="form-control" id="mail" name="mail" value="{{ $students->email }}"> @if($errors->has('mail')) 19 <span class="text-danger">{{ $errors->first('mail') }}</span> @endif 20 </div> 21 </div> 22 <div class="form-group @if($errors->has('tel')) has-error @endif"> 23 <label for="tel" class="col-md-3 control-label">電話番号</label> 24 <div class="col-md-9"> 25 <input type="tel" class="form-control" id="tel" name="tel" value="{{$students->tel }}"> @if($errors->has('tel')) 26 <span class="text-danger">{{ $errors->first('tel') }}</span> @endif 27 </div> 28 </div> 29 <div class="row" style="margin-top: 30px;"> 30 <div class="col-sm-offset-4 col-sm-8"> 31 <a class="btn btn-default" href="{{action('studentController@index')}}">戻る</a> 32 <button class="btn btn-success">更新</button> 33 </div> 34 </div> 35 </form> 36@endsection

6.以下画面遷移が完成する
イメージ説明

投稿2019/05/20 09:26

YamamotoAtsushi

総合スコア17

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

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

0

StudentController@edit_confirmで$dataにidも含まれてるか確認。

ルーティングからはこう書いて$idも追加が必要なのでは。

use Illuminate\Support\Arr; public function edit_confirm(CheckStudentRequest $request, $id) { $data = $request->all(); $data = Arr::add($data, 'id', $id); return ... }

viewに渡せていれば$idで使うだけなので簡単。

そもそも確認画面が必要か考えたほうがいいけど。

  • 入力に間違いがあるならバリデーションで前の画面に戻る
  • 間違ったデータ登録されてもすぐに再度編集すれば済む
  • 購入のような重要なフォームでもなければ確認画面挟むメリットはなにもない。

https://website-usability.info/2016/10/entry_161010.html

投稿2019/05/15 23:54

kawax

総合スコア10377

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

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

YamamotoAtsushi

2019/05/20 08:19

確かに、更新処理でしたら確認画面が不要ということが上記記事から理解することができます。頂いたアドバイスをもとに全文書き換えを行いました。 色々アドバイスを頂き有難うございました。
guest

0

普通に文字列連結すればいけそうですがどうでしょう。

<form action="{{url('students/list/') . $id}}" method="post" class="form-horizontal">

$id 変数がビューへ渡されている前提なので、もし渡せてなかったらそこも直す必要があります。

'students/list/{id}' とりあえずこれは駄目です。
都合よく変数として解釈されるということはなく {id} という文字列としか認識されません。

投稿2019/05/15 16:19

編集2019/05/16 00:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YamamotoAtsushi

2019/05/18 15:34

ご回答ありがとうございます。 実際にやってみたのですが、どうもうまくいきません。function updateのreturn文をreturn redirect()->route('students/list/'.$students->id);に置き換えた上で実行しましたが上手くいかなかったみたいです。 もう少し自分で手がないかを考えてみようと思います。良い案があれば教えて頂ければと思います。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2019/05/18 22:20

うまくいかなかった場合はどううまくいかないかを具体的に記載して頂くと引き続き回答可能です。 最新のソースと、エラーが出た場合はエラーの内容を追記してみて下さい。
YamamotoAtsushi

2019/05/20 08:17

function updateのreturn文をreturn redirect()->route('students/list/'.$students->id);にし、<form action="{{url('students/list/') . $id}}" method="post" class="form-horizontal">と記載をしたのですが、route not /students/list/4 defineと表示をされページが表示されませんでした。調べた結果「routeの定義が必要」のことで、再度、web.phpのコントローラ配下を全てresouce('/student','StudentController')で紐づけを行いphp artisan make:controller StudentController -- resouceで実行したあとweb.phpに記載をし解決致しました。下記に自己解決方法記載致します。 宜しくお願い致します
guest

0

確認画面のView edit_confim.php において、formのPOST先が
action="{{url('students/list/')}}"
となっていますが、ここにIDが含まれていないため、
Route::post('/list/{id}', 'StudentController@update');
にマッチしていない、という状況ではないでしょうか。

ルートは存在する(Route::get('list')はあるので)が、メソッドが見つからない状態になっていそうです。

追記:
失礼しました。上記はわかっていて、IDがconfirmでうまく指定できない、という状態の様ですね・・。
何かわかりそうであれば再度追記したいと思います。

投稿2019/05/15 16:06

編集2019/05/15 16:09
Eggpan

総合スコア2727

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問