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

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

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

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

PHP

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

Q&A

解決済

1回答

574閲覧

Laravelで削除がうまくできない

ratezou

総合スコア62

Laravel

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

PHP

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

0グッド

0クリップ

投稿2023/03/16 06:53

編集2023/03/16 11:56

Laravelの勉強中です。
以下のようなプログラムを作成しています。
1)一覧表に新規作成ボタンがある
2)新規作成ボタンを押すと、登録画面が開き、登録作業ができる。
3)一覧表の各行に削除と修正ボタンがある。
4)修正ボタンを押すと、登録したデータが表示され、修正ができる。
5)削除ボタンを押すと、登録したデータを削除できる。

困っているのは、最初の一覧表表示時にすぐに削除ボタンを押すと、何も動作しません。

URL

1https://***.net/address?_method=DELETE&_token=Q9dlm687LUATl9fwVCgpMigIgvCqj66RkaYKfpnd

というURLが表示されています。
もう一度押すと、

URL

1https://***.net/address?_method=DELETE&_token=Q9dlm687LUATl9fwVCgpMigIgvCqj66RkaYKfpnd

と同じURLが表示されますが、削除できます。

なぜでしょうか?

web.php

1Route::get('/address', [AddressController::class, 'index']) 2 ->name('address.index'); 3Route::get('/address/create', [AddressController::class, 'create']) 4 ->name('address.create'); 5Route::post('/address/store', [AddressController::class, 'store']) 6 ->name('address.store'); 7Route::get('/address/{address}/edit/', [AddressController::class, 'edit']) 8 ->name('address.edit'); 9Route::patch('/address/{address}/update', [AddressController::class, 'update']) 10 ->name('address.update'); 11Route::get('/address/{address}/destroy/', [AddressController::class, 'destroy']) 12 ->name('address.destroy'); 13Route::delete('/address/{address}/destroy', [AddressController::class, 'destroy']) 14 ->name('address.destroy');

できれば、登録→すぐに削除ができるとありがたいです。
見当違いの質問であったら申し訳ありません。

追記1)
新規登録⇨すぐさま削除のときだけ削除できないようです。
登録⇨一度画面を閉じる⇨削除は問題なかったです。

追記2)

index.blade.php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>アドレス帳</title> 8 <link rel='stylesheet' href="{{ asset('css/address/styles.css') }}"> 9 <link rel='icon' href="{{ asset('img/favicon.ico') }}" id='favicon'> 10</head> 11<body> 12 <header> 13 <img src='../../img/home.png' onclick="location.href='../index.php'" width='32' height='32'> 14 </header> 15 <table> 16 <div class="container"> 17 <h1 class="title">アドレス帳</h1> 18 {{-- <button class="add" onclick="window.location='{{ route('address.create') }}'">新規追加</button> --}} 19 <input type='button' class='add' value='新規追加' onclick="window.location='{{ route('address.create') }}'"> 20 </div> 21 </h1> 22 <tr> 23 <th>削除</th> 24 <th>修正</th> 25 <th>性</th> 26 <th>名</th> 27 <th>セイ</th> 28 <th>メイ</th> 29 <th>電話番号</th> 30 <th>郵便番号</th> 31 <th>住所</th> 32 </tr> 33 @foreach ($addresses as $address) 34 <tr> 35 <form> 36 @method('DELETE') 37 @csrf 38 <td width='75'><button onclick="window.location='{{ route('address.destroy', $address) }}'">削除</button></td> 39 </form> 40 <td width='75'><button onclick="window.location='{{ route('address.edit', $address) }}'">修正</button></td> 41 <td width='100' class="table_content">{{ $address->kanji_sei }}</td> 42 <td width='100' class="table_content">{{ $address->kanji_mei }}</td> 43 <td width='150' class="table_content">{{ $address->kana_sei }}</td> 44 <td width='150' class="table_content">{{ $address->kana_mei }}</td> 45 <td width='120' class="table_content">{{ $address->tel }}</td> 46 <td width='100' class="table_content">{{ $address->zipcode }}</td> 47 <td class="table_content">{{ $address->address1 . $address->address2 }}</td> 48 </tr> 49 @endforeach 50</table> 51</body> 52</html>

create.blade.php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <link rel='stylesheet' href="{{ asset('css/address/create.css') }}"> 8 <link rel='icon' href="{{ asset('img/favicon.ico') }}" id='favicon'> 9 <title>アドレス帳 - 作成</title> 10</head> 11<body> 12 <header> 13 <img src='../../img/home.png' onclick="location.href='../index.php'" width='32' height='32'> 14 </header> 15 <form method='POST' action="{{ route('address.store') }}"> 16 @csrf 17 18 <div class='containar'> 19 <h1>アドレス帳 - 作成</h1> 20 21 <div class='entry'> 22 <div class='sei'> 23 <label>姓</label><span class='required'>【必須】</span><br> 24 <input type=text name='kanji_sei' tabindex='1' value="{{ old('kanji_sei') }}"><br> 25 @error('kanji_sei') 26 <div class='error'>{{ $message }}</div> 27 @enderror 28 <label>セイ</label><span class='required'>【必須】</span><br> 29 <input type=text name='kana_sei' tabindex='3' value="{{ old('kana_sei') }}"><br> 30 @error('kana_sei') 31 <div class='error'>{{ $message }}</div> 32 @enderror 33 </div> 34 <div class='mei'> 35 <label>名</label><span class='required'>【必須】</span><br> 36 <input type=text name='kanji_mei' tabindex='2' value="{{ old('kanji_mei') }}"><br> 37 @error('kanji_mei') 38 <div class='error'>{{ $message }}</div> 39 @enderror 40 <label>メイ</label><span class='required'>【必須】</span><br> 41 <input type=text name='kana_mei' tabindex='4' value="{{ old('kana_mei') }}"><br> 42 @error('kana_mei') 43 <div class='error'>{{ $message }}</div> 44 @enderror 45 </div> 46 </div> 47 <label>電話番号</label><span class='required'>【必須】</span><br> 48 <input type=text name='tel' value="{{ old('tel') }}"><span class='comment'>ハイフン不要です</span><br> 49 @error('tel') 50 <div class='error'>{{ $message }}</div> 51 @enderror 52 <label>郵便番号</label><span class='required'>【必須】</span><br> 53 {{-- <input type=text name='zipcode' value="{{ old('zipcode') }}"><br> --}} 54 <input type="text" name="zipcode" value="{{ old('zipcode') }}" onKeyUp="AjaxZip3.zip2addr(this,'','address1','address1');"><span class='comment'>ハイフン不要です</span><br> 55 @error('zipcode') 56 <div class='error'>{{ $message }}</div> 57 @enderror 58 <label>市区町村</label><span class='required'>【必須】</span><br> 59 {{-- <input type=text name='address1' value="{{ old('address1') }}"><br> --}} 60 <input type="text" name="address1" class='address' value="{{ old('address1') }}"><br> 61 @error('address1') 62 <div class='error'>{{ $message }}</div> 63 @enderror 64 <label>番地(アパート名など)</label><span class='required'>【必須】</span><br> 65 <input type=text name='address2' class='address' value="{{ old('address2') }}"><br> 66 @error('address2') 67 <div class='error'>{{ $message }}</div> 68 @enderror 69 70 <input type='submit' value='登録'> 71 <input type='reset' value='リセット'> 72 </div> 73 </form> 74 <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script> 75</body> 76</html>

AddressController.php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Models\Address; 7 8class AddressController extends Controller 9{ 10 public function index() 11 { 12 $addresses = Address::latest()->get(); 13 14 return view('address.index') 15 ->with(['addresses' => $addresses]); 16 } 17 18 public function create() 19 { 20 return view('address.create'); 21 } 22 23 public function store(Request $request) 24 { 25 26 $request->validate([ 27 'kanji_sei' => 'required|max:20', 28 'kanji_mei' => 'required|max:20', 29 'kana_sei' => 'required|max:20', 30 'kana_mei' => 'required|max:20', 31 'tel' => 'required|max:11', 32 'zipcode' => 'required|max:7', 33 'address1' => 'required|max:255', 34 'address2' => 'required|max:255', 35 ]); 36 37 $address = new Address(); 38 $address->kanji_sei = $request->kanji_sei; 39 $address->kanji_mei = $request->kanji_mei; 40 $address->kana_sei = $request->kana_sei; 41 $address->kana_mei = $request->kana_mei; 42 $address->tel = $request->tel; 43 $address->zipcode = $request->zipcode; 44 $address->address1 = $request->address1; 45 $address->address2 = $request->address2; 46 $address->save(); 47 48 return redirect() 49 ->route('address.index'); 50 } 51 52 public function update(Request $request, Address $address) 53 { 54 55 $request->validate([ 56 'kanji_sei' => 'required|max:20', 57 'kanji_mei' => 'required|max:20', 58 'kana_sei' => 'required|max:20', 59 'kana_mei' => 'required|max:20', 60 'tel' => 'required|max:11', 61 'zipcode' => 'required|max:7', 62 'address1' => 'required|max:255', 63 'address2' => 'required|max:255', 64 ]); 65 66 $address->kanji_sei = $request->kanji_sei; 67 $address->kanji_mei = $request->kanji_mei; 68 $address->kana_sei = $request->kana_sei; 69 $address->kana_mei = $request->kana_mei; 70 $address->tel = $request->tel; 71 $address->zipcode = $request->zipcode; 72 $address->address1 = $request->address1; 73 $address->address2 = $request->address2; 74 $address->save(); 75 76 return redirect() 77 ->route('address.index'); 78 } 79 80 public function edit(Address $address) 81 { 82 return view('address.edit') 83 ->with(['address' => $address]); 84 } 85 86 public function destroy(Address $address) 87 { 88 $address->delete(); 89 90 return redirect() 91 ->route('address.index'); 92 } 93}

追記3)
必ず再現するワケではありません。
多くの場合、新規登録⇨すぐさま削除ができています。
最初は「勘違いかな?」と思ったのですが、何度かやってるとたまに再現します。

追記4)
再現する条件がわかりました。
登録⇨瞬く間に削除すると失敗します。
登録⇨5、6秒の一呼吸をおくと削除できます。
なぜでしょうう?
Laravel Framework 10.1.5 です。

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

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

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

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

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

m.ts10806

2023/03/16 07:21

コードがルーティングしかないので何とも言えません。 デバッグはされましたか? また現状では「削除される」を「画面表示」で判断しているように思うのですが、DBの確認はしたのでしょうか。
ratezou

2023/03/16 11:29

アドバイスありがとうございます。 DBからも消えていませんでした。 コードを追記します。
guest

回答1

0

ベストアンサー

HTMLもまともに書けてないし、意味もなく JavaScript 書いて window.location 使っているのはいただけないですね。
参考にしているものにそう書いてあるなら、選定からやり直した方がいいと思います。

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>アドレス帳</title> 8 <link rel='stylesheet' href="{{ asset('css/address/styles.css') }}"> 9 <link rel='icon' href="{{ asset('img/favicon.ico') }}" id='favicon'> 10</head> 11<body> 12<header> 13 <img src='../../img/home.png' onclick="location.href='../index.php'" width='32' height='32'> 14</header> 15<table> 16 <div class="container"> 17 <h1 class="title">アドレス帳</h1> 18 {{-- <button class="add" onclick="window.location='{{ route('address.create') }}'">新規追加</button> --}} 19 <input type='button' class='add' value='新規追加' onclick="window.location='{{ route('address.create') }}'"> 20 </div> 21 </h1> 22 <tr> 23 <th>削除</th> 24 <th>修正</th> 25 <th></th> 26 <th></th> 27 <th>セイ</th> 28 <th>メイ</th> 29 <th>電話番号</th> 30 <th>郵便番号</th> 31 <th>住所</th> 32 </tr> 33 @foreach ($addresses as $address) 34 <tr> 35 <td width='75'> 36 <form method="post" action="{{ route('address.destroy', $address) }}"> 37 @method('DELETE') 38 @csrf<button type="submit">削除</button> 39 </form> 40 </td> 41 <td width='75'> 42 <a href="{{ route('address.edit', $address) }}">修正</a> 43 </td> 44 <td width='100' class="table_content">{{ $address->kanji_sei }}</td> 45 <td width='100' class="table_content">{{ $address->kanji_mei }}</td> 46 <td width='150' class="table_content">{{ $address->kana_sei }}</td> 47 <td width='150' class="table_content">{{ $address->kana_mei }}</td> 48 <td width='120' class="table_content">{{ $address->tel }}</td> 49 <td width='100' class="table_content">{{ $address->zipcode }}</td> 50 <td class="table_content">{{ $address->address1 . $address->address2 }}</td> 51 </tr> 52 @endforeach 53</table> 54</body> 55</html>

投稿2023/03/16 14:13

phper.k

総合スコア3923

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

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

ratezou

2023/03/16 14:41

勉強中なのでご指摘ありがたいです。 バッチリ治りました。 jsについてはボタンがリンクかどちらかに統一した方が良いと思い、jsを使いました。 統一性を持たせるなら、リンクに統一した方が良いかもしれませんね。 ありがとうございました。
phper.k

2023/03/16 14:56

> jsについてはボタンがリンクかどちらかに統一した方が良いと思い、jsを使いました。 統一性を持たせるなら、リンクに統一した方が良いかもしれませんね。 どちらにしても認識間違っているので、ちゃんと調べましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問