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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

445閲覧

[Laravel]ルーティングのパラメータが正確な値を渡さず困っています。

siophp

総合スコア23

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/08/07 04:08

編集2019/08/07 04:10

環境
Laravel5.8
PHP7.2
Nigix

データベースからデータを取得し、forelseで一覧表示するプログラムを作っています。
一部分に特定のプロパティが存在するか否かで、URLと表示を変える分岐があります。$post->id、$post->liked_idをパラメータとしてルーティングに渡しています。(Twitterのいいね機能のようなものです)

index.blade.php

1@forelse($posts as $post) 2 <div class="card"> 3 <div class="card-body"> 4 <div class="card-text"> 5 <a href="{{url('posts/'.$post->id)}}">{{$post->body}</a> 6 <p>{{$post->updated_at}}</p> 7 </div> 8 </div> 9 // 省略、以下問題のコード 10 @auth 11 @if(empty($post->liked_id)) 12 <a href="{{url('posts/'.$post->id.'/likes')}}" class="" 13 onClick="event.preventDefault(); 14 document.getElementById('like-store-form').submit();"> 15 <i class="far fa-heart"></i> 16 {{$post->likes->count()}} 17 </a> 18 <form id="like-store-form" action="{{url('posts/'.$post->id.'/likes')}}" method="POST"> 19 @csrf 20 @method('POST') 21 </form> 22 @else 23 <a href="{{url('posts/'.$post->id.'/likes/'.$post->liked_id)}}" class="" 24 onClick="event.preventDefault(); 25 document.getElementById('like-delete-form').submit();"> 26 <i class="fa fa-heart"></i> 27 {{$post->likes->count()}} 28 </a> 29 <form id="like-delete-form" action="{{url('posts/'.$post->id.'/likes/'.$post->liked_id)}}" method="post"> 30 @csrf 31 @method('DELETE') 32 </form> 33 @endif 34 @else 35 <i class="far fa-heart"></i> 36 {{$post->likes->count()}} 37 @endauth 38 </span> 39 </div> 40 </div> 41 </div> 42   //省略 43 @endforelse 44 {{$posts->links()}} 45
Route::post('/posts/{post_id}/likes','LikeController@store'); Route::delete('/posts/{post_id}/likes/{like_id}','LikeController@destroy');

しかし、ブラウザに表示されるURLは変化しているのに、ルーティングには本来のものとは違う値が渡されているようです。
具体的に言えば、どの投稿のURLにアクセスしても、ページの一番上の投稿のpost_idがパラメータとして渡されて処理が実行されているようです。

これは一体何が起きているのでしょうか。恥ずかしいことに検索ワードすらわからず、「ルーティング 違う値」などをググっても解決方法が出てきませんでした。よろしければアドバイスいただけると幸いです。

備考

・別のページ(forelseによる一覧表示を行わないページ)から同じURLにアクセスしたところ、正確なパラメータが渡され意図した通りの処理を実行しました。
・dd();でコントローラ内を確認してみたのですが、コントローラに引数として渡したときには、違うパラメータが渡されていました。

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

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

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

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

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

guest

回答2

0

getElementByIdで常に一番最初のformが引かれてるのでは?

投稿2019/08/07 04:17

mikkame

総合スコア5036

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

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

0

ベストアンサー

id重複しているためです。
画面内に同一IDは指定できません。
JavaScriptではIDを指定してsubmitしているので、「ページの一番上の投稿」が常に送信されているものと思われます。
IDをつけるなら個々のpost_idをつけるなど工夫が必要です。

それか、aタグではなくbuttonのsubmitにして<form>内に入れるとか(こちらのほうがスッキリすると思います)

投稿2019/08/07 04:16

m.ts10806

総合スコア80850

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

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

siophp

2019/08/07 05:39 編集

回答ありがとうございます…buttonに直したところ意図通りに動きました。 別のページのコードをそのままコピペして不具合を生じさせていました。
m.ts10806

2019/08/07 05:42

解決されたようで何よりです。 PHPからHTML出力してそれをJavaScriptで扱うとなると頭の中や机上で動作をさせるのは結構難しくなってくるので、 「PHPのコード」と「出力されたHTMLのコード」は全く切り分けて考えたほうがいいかもしれません。 つまり、phpで出力処理を組んだら、そのあとはブラウザから画面を確認するというよりも 「正しくHTMLが出力されたか」を「ソースを表示」で確認するようにするとか。 モックとかで静的HTMLを組んだうえでPHPで動的に出力する場合、 やはり「見てくれ」よりも「出力されたHTMLソース」を確認するのが適切な手段となります。
siophp

2019/08/07 05:48

ありがとうございます…以後出力されたHTMLソースの確認も行います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問