🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Q&A

2回答

2255閲覧

Laravel Undefined variable: keywordの修正方法(検索機能の作成)

black-ddd

総合スコア74

Laravel

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

PHP

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

0グッド

0クリップ

投稿2020/12/30 11:41

前提・実現したいこと

卒業制作でLaravelを触ることになり、現在様々なWebサイトを見ながら独学で勉強をしております。
卒業制作の内容としては、吹奏楽部の楽譜を整理するアプリで
既に曲情報のテーブルに新規楽譜の追加や追加した楽譜をメインの画面に出力することまでは可能で、
この曲情報のテーブルを用いてwhereを使った検索機能を実現させたいです。

現状で発生している問題

未定義の項目として、Undefined variable: keywordというエラーが表示されてしまい、
行き詰っている状態です。

error

1Undefined variable: keyword (View: C:\Users\User\LaravelWork\resources\views\app.blade.php)

試してみたこと

「laravel」「Where」「LIKE」「部分検索」「あいまい検索」などでヒットするサイトを片っ端から閲覧し
それを実際にあてはめながら試しました。
何かわかる方いらっしゃいましたらご教授お願いいたします。
##実際のコード

appbladephp

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="csrf-token" content="{{ csrf_token() }}"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>{{ config('app.name') }}</title> 8<link rel="stylesheet" href="{{ mix('css/app.css') }}"> 9</head> 10<body> 11 <div id="app"> 12 <form class="form-inline my-2 my-lg-0 ml-2" action="{{url('/scorelists')}}" method="GET"> 13 <p><input type="text" name="keyword" value="{{$keyword}}"></p> 14 <input type="submit" value="検索" class="btn btn-info"> 15 </form> 16 17 @if($scorelists->count()) 18 19 <table border="1"> 20 <tr> 21 <th>title</th> 22 <th>artist</th> 23 <th>composer</th> 24 <th>arranger</th> 25 <th>publisher</th> 26 </tr> 27 @foreach ($scorelists as $scorelist) 28 <tr> 29 <td>{{ $scorelist->title }}</td> 30 <td>{{ $scorelist->artist }}</td> 31 <td>{{ $scorelist->composer }}</td> 32 <td>{{ $scorelist->arranger }}</td> 33 <td>{{ $scorelist->publisher }}</td> 34 </tr> 35 @endforeach 36 </table> 37 38 @else 39 <p>見つかりませんでした。</p> 40 @endif 41 </div> 42 <script src="{{ mix('js/app.js') }}" defer></script> 43</body> 44</html>

webphp

1<?php 2 3Route::get('/{any?}', fn() => view('app'))->where('any', '.+'); 4 5Route::get('/scorelists', 'ScorelistContorller@search');

search以外のメソッドのルーティングはすべてapi.phpに記述しております。

ScorelistControllerphp

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Scorelist; 6use Illuminate\Http\Request; 7 8class ScorelistController extends Controller 9{ 10 // 11 public function index() 12 { 13 return Scorelist::all(); 14 } 15 public function show(Scorelist $scorelist) 16 { 17 return $scorelist; 18 } 19 public function store(Request $request) 20 { 21 return Scorelist::create($request->all()); 22 } 23 public function update(Request $request, Scorelist $scorelist) 24 { 25 $scorelist->update($request->all()); 26 return $scorelist; 27 } 28 public function destroy(Scorelist $scorelist) 29 { 30 $scorelist->delete(); 31 return $scorelist; 32 } 33 public function search(Request $request) 34 { 35 $keyword = $request->input('keyword'); 36 37 $query = Scorelist::query(); 38 39 if(!empty($keyword)) { 40 $query->where('title', 'like', "%{$keyword}%")->get() 41 ->orWhere('artist', 'like', "%{$keyword}%")->get() 42 ->orWhere('composer', 'like', "%{$keyword}%")->get() 43 ->orWhere('arranger', 'like', "%{$keyword}%")->get() 44 ->orWhere('publisher', 'like', "%{$keyword}%")->get(); 45 } 46 47 $scorelists = $query->get(); 48 49 return view('scorelist.search', compact('title', 'artist', 'composer', 'arranger', 'publisher')); 50 } 51}

##バージョンetc...
Laravel6.2
node 12.13.0

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

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

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

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

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

guest

回答2

0

結論

Routingファイルの記述順が問題です。

詳細

php

1Route::get('/{any?}', fn() => view('app'))->where('any', '.+'); 2 3Route::get('/scorelists', 'ScorelistContorller@search');

一行目の記述であるRoute::get('/{any?}', fn() => view('app'))->where('any', '.+');は、すべてのアクセスでapp.blade.phpを表示するという意味です。
三行目の記述では、/scorelistsへのアクセスがあったときにScorelistContorllerのsearchメソッドへと処理を渡します。


想像してみてください。
一行目は「すべてのアクセスでapp.blade.phpを返すぜ!」
三行目は「/scorelistsにアクセスがあったらDBからデータを取ってきて...」

上から順に実行していくとどうなりますか?
一行目で「すべてのアクセス」が対象になってるので三行目まで行かなくないですか?
それが今回の原因です。

解決方法

まず大きく分けて問題が二つあります。

1, Routingファイルの書く順番
2, app.blade.phpの記述

1の解決方法

php

1Route::get('/scorelists', 'ScorelistContorller@search'); 2// ↑↓入れ変え 3Route::get('/{any?}', fn() => view('app'))->where('any', '.+');

2の解決方法

1を解決したとします。
解決後の3行目、つまり、Route::get('/{any?}', fn() => view('app'))->where('any', '.+');では、app.blade.phpが返されています。

しかし、app.blade.phpで必要な$keyword$scorelists定義されていません。
なので、view関数の第二引数で必要な変数定義をする変数が不要なファイルに編集することが必要です。

今回はこれら二つの問題点により、質問者さんも他の回答者側も誤った判断をしてしまったのだとおもいます。
ファイルを冷静に一つ一つ動作を追っていけば大抵問題点は見つかります。
頑張ってください。

投稿2020/12/30 14:52

編集2020/12/30 14:54
kyoya0819

総合スコア10429

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

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

black-ddd

2020/12/30 15:59

詳細な回答ありがとうございます! 確認のためにお聞きしたいのですが、 この場合はControllerからviewへ変数を渡すために連想配列で$keyword、$scorelists を定義する必要があるという認識で間違いないでしょうか?
kyoya0819

2021/01/01 07:50 編集

「どのController」から、「どのView」の話でしょうか。。
guest

0

diff

1 public function search(Request $request) 2 { 3 $keyword = $request->input('keyword'); 4 5 $query = Scorelist::query(); 6 7 if(!empty($keyword)) { 8 $query->where('title', 'like', "%{$keyword}%")->get() 9 ->orWhere('artist', 'like', "%{$keyword}%")->get() 10 ->orWhere('composer', 'like', "%{$keyword}%")->get() 11 ->orWhere('arranger', 'like', "%{$keyword}%")->get() 12 ->orWhere('publisher', 'like', "%{$keyword}%")->get(); 13 } 14 15 $scorelists = $query->get(); 16 17- return view('scorelist.search', compact('title', 'artist', 'composer', 'arranger', 'publisher')); 18+ return view('scorelist.search', compact('title', 'artist', 'composer', 'arranger', 'publisher', 'keyword')); 19 }

投稿2020/12/30 11:54

phper.k

総合スコア3923

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

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

black-ddd

2020/12/30 12:09

コメントありがとうございます。 試してみた結果、全く同じエラーのまま進みそうにありません... 他にこのファイルを見ればこのエラーは取り除けると思うといったようなことや コードがそもそも根本的に書き方が違うといったことはありますでしょうか?
phper.k

2020/12/30 12:16

コントローラーで指定しているView が scorelist.search なのに、app.blade.php のファイルを提示していたり、質問のコードに一貫性がないので答えようがありません。 とりあえずはタイポだろうと思って回答しましたが、今一度、質問を推敲してほしい。
kyoya0819

2020/12/30 14:41

Hint : Routingファイル
phper.k

2020/12/30 14:55

↑それですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問