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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

2回答

3057閲覧

Laravel 新規登録時に画像の登録がなければ、デフォルトの画像をユーザー画像として登録したい。

tkm0604

総合スコア555

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2021/10/17 10:13

編集2021/10/18 00:14

PHP Laravel 6.20.35にてマッチングサイトを制作しています。

新規登録時に画像の登録がなければ、デフォルトの画像をユーザー画像として登録したいのですが、画像登録無しで新規登録を行うと「Undefined index: img_name」となります。

現状は以下のようになっています。

RegisterController.php

PHP

1 protected function create(array $data) 2 { 3 4 // ---ここから追加--- 5 //引数 $data から name='img_name'を取得(アップロードするファイル情報) 6 $imageFile = $data['img_name']; 7 8 //$imageFileからファイル名を取得(拡張子あり) 9 $filenameWithExt = $imageFile->getClientOriginalName(); 10 11 //拡張子を除いたファイル名を取得 12 $fileName = pathinfo($filenameWithExt, PATHINFO_FILENAME); 13 14 //拡張子を取得 15 $extension = $imageFile->getClientOriginalExtension(); 16 17 // ファイル名_時間_拡張子 として設定 18 $fileNameToStore = $fileName.'_'.time().'.'.$extension; 19 20 //画像ファイル取得 21 $fileData = file_get_contents($imageFile->getRealPath()); 22 23 //拡張子ごとに base64エンコード実施 24 if ($extension = 'jpg'){ 25 $data_url = 'data:image/jpg;base64,'. base64_encode($fileData); 26 } 27 28 if ($extension = 'jpeg'){ 29 $data_url = 'data:image/jpg;base64,'. base64_encode($fileData); 30 } 31 32 if ($extension = 'png'){ 33 $data_url = 'data:image/png;base64,'. base64_encode($fileData); 34 } 35 36 if ($extension = 'gif'){ 37 $data_url = 'data:image/gif;base64,'. base64_encode($fileData); 38 } 39 40 //画像アップロード(Imageクラス makeメソッドを使用) 41 $image = Image::make($data_url); 42 43 //画像を横400px, 縦400pxにリサイズし保存 44 $image->resize(400,400)->save(storage_path() . '/app/public/images/' . $fileNameToStore ); 45 46 //createメソッドでユーザー情報を作成 47 return User::create([ 48 'name' => $data['name'], 49 'email' => $data['email'], 50 'password' => Hash::make($data['password']), 51 'self_introduction' => $data['self_introduction'], 52 'sex' => $data['sex'], 53 'img_name' => $fileNameToStore, 54 ]); 55 }

add_column_to_users_table.phpを

PHP

1 public function up() 2 { 3 Schema::table('users', function (Blueprint $table) { 4 $table->string('self_introduction', 500)->nullable(); //詳細情報 5 $table->tinyInteger('sex')->default(0); //性別 6 $table->string('img_name')->default(''); //画像ファイル 7 }); 8 }

viewファイルregister.blade.phpを

PHP

1 <label for="file_photo" class="rounded-circle userProfileImg"> 2 <div class="userProfileImg_description">画像をアップロード</div> 3 <i class="fas fa-camera fa-3x"></i> 4 <input type="file" id="file_photo" name="img_name"> 5 </label>

User.php

PHP

1 protected $fillable = [ 2 'name', 'email', 'password', 'self_introduction', 'sex', 'img_name', 3 ];

としていました。

この状況だと画像登録なしで新規登録すると、「Undefined index: img_name」 というエラーになります。

マイグレーションファイルadd_column_to_users_table.php で

PHP

1'img_name' => $fileNameToStore,

としている箇所を

PHP

1 $table->string('img_name')->default('/storage/images/no_img.png');

とすれば、画像登録なしで新規登録した場合でも 「default('/storage/images/no_img.png');」 が登録できると思い

新規マイグレーションファイルを作成

PHP

1 $table->string('default_img')->default('/storage/images/no_img.png');

と設定

viewファイルregister.blade.php

PHP

1 <label for="file_photo" class="rounded-circle userProfileImg"> 2 <div class="userProfileImg_description">画像をアップロード</div> 3 <img src="/storage/images/no_img.png"alt="デフォルト画像"> 4 <input type="file" id="file_photo" name="img_name"> 5 </label>

RegisterController.phpを以下のように修正しました。

PHP

1 //createメソッドでユーザー情報を作成 2 return User::create([ 3 'name' => $data['name'], 4 'email' => $data['email'], 5 'password' => Hash::make($data['password']), 6 'self_introduction' => $data['self_introduction'], 7 'sex' => $data['sex'], 8 'img_name' => $fileNameToStore, 9 'default' => $data['/storage/images/no_img.png'],

しかし、これでも画像登録なしで新規登録した場合「Undefined index: img_name」 というエラーが表示されます。

どうすれば、新規登録時に画像の登録がなければデフォルトの画像を設定できるようにできるでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

view側で、表示したいuserの画像が登録されていなかった時に、デフォルトの画像を表示する仕様にするとどうでしょうか?

投稿2021/10/19 04:50

Pomu3270

総合スコア280

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

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

tkm0604

2021/10/20 09:13 編集

コメントありがとうございます。 view側での取得を試してみました。 ●RegisterController.php に、下記コードを追記 public function index() { //Userテーブルの全ての情報を取得し、$top_imgに代入 $top_img = User::all(); //$top_imgをregister.blade.phpへ渡す為にcompact関数で受け渡し return view('register',compact('top_img')); } ●register.blade.phpユーザー画像の表示箇所を以下に編集 <label for="file_photo" class="rounded-circle userProfileImg"> <div class="userProfileImg_description">画像をアップロード</div> <img src="/storage/images/no_img.png" alt="サムネイル" > @if( {{$top_img ->img_name}} === NULL)  <input type="file" id="file_photo" name="default"> @else  <input type="file" id="file_photo" name="img_name"> @endif </label> ●/registerにアクセスしたらRegisterController.phpのindexメソッドが呼び出されるように、web.phpに下記を追加 Route::get('/register', 'RegisterController@index')->name('register'); これで、RegisterController.phpで設定した $top_img(ユーザー情報)がregister.blade.phpへ渡され、ビュー側のif分で新規登録画像があるか無いかを判定し表示できると思ったのですが、 「Illuminate\Contracts\Container\BindingResolutionException Target class [App\Http\Controllers\RegisterController] does not exist. 」 というエラーになります。 classがない。というエラーのようですが、classとは何を指しているのか?どうすればいいのか分からなくなっています。 どこがおかしいのでしょうか。 何度も申し訳ありません。コメント頂けると助かります。
tkm0604

2021/10/20 08:45

Laravel Framework 6.20.35. です
tkm0604

2021/10/20 09:33 編集

もう少し自分で考えます。 もしまたわからなければ、ここでコメントしますので、よろしければお付き合いください。
tkm0604

2021/10/20 10:44 編集

新規登録時は RegisterController.phpを下記のようにして if(isset($data['img_name'])) $imageFile = $data['img_name']; 画像登録が無くても登録できるようにしました。 その代わり、ユーザー情報画面(show.blade.php)で 「ユーザー登録時に画像登録がなければデフォルト画像(no_img.png)を表示。」 「ユーザー登録時に画像の設定があれば、設定画像を表示」 とする方法で考えました。 if文を使って下記のようにしました。 <div class='userInfo_img'> <!--ユーザー登録時に画像登録が無ければデフォルト画像を表示--> @if($user->img_name === Null) <img src="/storage/images/no_img.png"> @else <img src="/storage/images/{{$user -> img_name}}"> <!--ユーザー画像の登録があれば、登録画像を表示--> @endif </div> しかし、上記if文だと、 <!--ユーザー登録時に画像登録が無ければデフォルト画像を表示--> <img src="/storage/images/no_img.png"> の箇所がHTMLに反映されません。 <img src="/storage/images/{{$user -> img_name}}"> <!--ユーザー画像の登録があれば、登録画像を表示--> はHTMLで出力されています。 「ユーザー登録時に画像登録がなければデフォルト画像を表示。」 「ユーザー登録時に画像の設定があれば、設定画像を表示」 とするif文の書き方がおかしいのだと思うのですがどうすればいいのか分かりません。 アドバイスお願いします。
Pomu3270

2021/10/21 01:55

回答せずすみませんでした。 また、自己解決おめでとうございます! 以下のようにemptyとかissetを使うほうがいいかもです ```php @if(!empty($user->img_name)) // 画像が空でなかったら @endif @isset($user->img_name) // $user->img_nameは定義済みでnullでない @endisset @empty($user->img_name) // $user->img_nameが「空」だったら @endempty ``` 後出しのコメントになりすみません。。。
tkm0604

2021/10/21 12:28

Nullが自分には一番描きやすかった(ぱっとイメージできた。)のでNulを使いましたが、教えていただいたえemptyやisset関数でも書けるように試してます!! また多分悩むことがあると思うので、もし見かけてたアドバイスお願いします。 ありがとうございます!!
guest

0

img_nameが代入されていないのに、ここで呼び出そうとしているからですね。なのでisset関数でインデックスの有無を確認しておきましょう。

php

1 if(isset($data['img_name'])) $imageFile = $data['img_name'];

投稿2021/10/18 02:06

FKM

総合スコア3647

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

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

tkm0604

2021/10/18 14:17 編集

コメントありがとうございます。 if(isset($data['img_name'])) $imageFile = $data['img_name'];にすると、RegisterController.phpでif(isset($data['img_name'])) $imageFile = $data['img_name'];の以下に書いてあるIntervention Imageで画像をトリミングするための処理でエラー(Undefined variable: imageFile)になります。 $imageFileに画像がセットされていないからだと思い、 $imageFile に画像が代入されていない時は 'default' => $data['/storage/images/no_img.png'],を$imageFileに代入。img_nameに画像があればimg_nameを$imageFileにセットするif分下記を設定しました。 $imageFile = $data['img_name']; if ($imageFile === null){ $imageFIle = $data['/storage/images/no_img.png']; }else{ $imageFile = $data['img_name']; } これで、新規登録時に画像が設定されていないときは $data['/storage/images/no_img.png']が設定できると思ったのですが、これでも  $imageFile = $data['img_name']; の箇所で、エラー(Undefined index: img_name)となってしまいます。。。 どうすれば、新規登録時に画像の登録がなければデフォルトの画像を設定できるようにできるでしょうか?
FKM

2021/10/19 00:10 編集

$dataに代入されるのはフォームの値でキーはnameプロパティのはずです。なので、そこにパスを代入しても意味がないですよ。なので、パスを渡したい場合はhiddenに埋め込む、コントローラ内にパスを記述しておいて、if判定文で呼び出す(判定条件をその画像ファイルが存在するかをfile_exists関数で判定させると簡単です)などで対応すればいいのでは。
tkm0604

2021/10/20 08:43

コメントを何度も頂き、本当にありがとうございます。 パスを渡したい場合はhiddenに埋め込む、コントローラ内にパスを記述しておいて、if判定文で呼び出す(判定条件をその画像ファイルが存在するかをfile_exists関数で判定させると簡単です)などで対応すればいいのでは。 の箇所がよく理解できていません。 ここをもう少し噛み砕いて教えていただけないでしょうか? お手数をおかけしてすみません。
tkm0604

2021/10/20 09:34

もう少し自分で考えます。 もしまたわからなければ、ここでコメントしますので、よろしければお付き合いください。
tkm0604

2021/10/20 15:54

考え方を変えて view側でif文で判定する方法で無事に実装できました。 しかし、最初に教えていただいたisset関数で定義されているかどうかを判別する方法は非常に勉強になりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問