maaz's avatar
Level 2

Undefined Variable during image/file insertion.

Hi everyone. I got an error during file upload in laravel. I want to just store the filename of an image inside the database on how I can achieve this. error is: " ErrorException Undefined variable: img "

controller:

 public function store(Request $request)
    {
        // dd($request);
        if ($request->hasFile('image')) {
            $img = $request->file('bookcover');
            $extension = $img->getClientOriginalExtension();
            Storage::disk('public')->put($img->getFilename() . '.' . $extension,  File::get($img));
        }


        Business::create([
            'name' => $request->name,
            'asking_price_from' => $request->asking_price_from,
            'asking_price_to' => $request->asking_price_to,
            'description' => $request->description,
            'image' => $img,
            'user_id' => $request->input('user'),
            'category_id' => $request->input('category'),
            'subCategory_id' => $request->input('subCategory'),
            'province_id' => $request->input('province'),
            'city_id' => $request->input('city'),
        ]);
        return redirect('sell-business-form');

form.blade.php

<form action="{{url('/business-store')}}" method="post" class="sell-business-form"
                    enc-type="multipart/form">
                    @csrf
                    <div class="form-group">
                        <label for="name">Name</label>
                        <input type="name" class="form-control" id="name" required />
                    </div>
                    <div class="form-group">
                        <label for="description">Description</label>
                        <textarea name="name" id="description" cols="30" rows="5" class="form-control"
                            required></textarea>
                    </div>
                    <div class="form-group">
                        <label for="a-price">Asking Price</label>
                        <input type="text" class="form-control" names="asking_price_from" id="a-aprice" required />
                    </div>
                    <div class="form-group">
                        <label for="price-t">Asking Price To</label>
                        <input type="text" class="form-control" names="asking_price_to" id="price-t" required />
                    </div>

                    <div class="form-control-inline  my-5 d-flex">
                        {{-- Categories --}}
                        <div class="form-group">
                            <label for="cat">Category</label>
                            <select name="category" id="cat" class="form-control" required>
                                <option value="" selected disabled>select category</option>
                                @foreach ($categories as $category)
                                <option value="{{$category->id}}">{{$category->name}}</option>
                                @endforeach
                            </select>
                        </div>
                        {{-- sub categories --}}
                        <div class="form-group ml-5">
                            <label for="subcat">Sub Category</label>
                            <select name="subCategory" id="subcat" class="form-control" required>
                                <option value="" selected="false">select sub category</option>
                            </select>
                        </div>
                    </div>
                    <div class="form-control-inline  my-5 d-flex ">
                        {{-- province --}}
                        <div class="form-group ">
                            <label for="province">Select Province</label>
                            <select id="province" name="province" class="form-control">
                                <option value="" selected disabled>Select Province</option>
                                @foreach ($provinces as $province)
                                <option value="{{$province->id}}">{{$province->name}}</option>
                                @endforeach
                            </select>
                        </div>

                        {{-- cities --}}
                        <div class="form-group ml-5 ">
                            <label for="city">Select Cities</label>
                            <select id="city" name="city" class="form-control">
                                <option value="" selected="false">City</option>
                            </select>
                        </div>
                    </div>

                    {{-- file/image --}}
                    <div class="form-group">
                        <input type="file" class="form-control border" name="image" required />
                    </div>
                    <input type="hidden" name="user" value="{{ Auth()->user()->id }}">
                    <button type="submit" class="button-primary float-right">
                        Post Business
                    </button>
                </form>

is there any other way to achieve this.. i am doing this for testing purpose.

the error is in the image field..

0 likes
2 replies
Sergiu17's avatar

You receive this error when you submit the form without image, and this is simple to understand, you have an if statement, inside it, you create $img variable, so, if condition is false - $img variable is never created, and you always refer to it.

// if this is false, then $img will be undefined 
if ($request->hasFile('image')) {
  $img = $request->file('bookcover');
}

Business::create([
  'image' => $img,
]);

One solution would be

Business::create([
  'image' => $img ?? '',
]);

Please or to participate in this conversation.