0

my code was working fine untill i added two datetime input fields,every time i click submit it says failed, the two columns in mysql database are datetime type

a message in red displays on the top of the form "échec".the data not stored in database

is there something wrong with my code or the format i used not supported by mysql? at first the two columns were of timestamp type i changed them to datetime but with no result. any help please! i'm stack here for three days

here is my code :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Matériels;
use Auth;

class TestController extends Controller
{
    //
    public function viewTest()
    {
        if(Auth::guest())
        {
            return redirect()->route('/');
        }

        $data = Matériels::all();
        return view('form.form',compact('data'));
        
    }
    // save
    public function viewTestSave(Request $request)
    {
        $request->validate([
            'type'=>'required|max:100',
            'série' => 'required|max:100', 
            'marque'   => 'required|max:100', 
            'réfference'   => 'required|max:100',
            'service'   => 'required|max:100',
            
           'dis' => 'required|date_format:"Y-m-d\TH:i"',
           'expire' =>  'required|date_format:"Y-m-d\TH:i"|after:dis',
               
        ]);
    
        try{
// here is input field names
            $type = $request->type;
            $série = $request->série;
            $marque = $request->marque;
            $réfference = $request->réfference;
            $service= $request->service;
            $dis= $request->dis;
            $expire= $request->expire;

         //here input names asigned to column names  
            
            $Matériels = new Matériels();
            $Matériels->type = $type;
            $Matériels->série = $série;
            $Matériels->marque = $marque;
            $Matériels->réfference = $réfference;
            $Matériels->service = $service;
            $Matériels->date = $dis;
            $Matériels->expires_at = $expire;
           

           
            $Matériels->save();
            return redirect()->back()->with('insert','Données insérées avec succès!.');

        }catch(\Exception $e){
           

            return redirect()->back()->with('error','échec!.');
        }
    }
    // update
    public function update(Request $request)
    {
        //here is input field names
        $update =[
             'id'       =>$request->id,
            'type'      =>$request->type,
            'série'     =>$request->série,
            'marque'    =>$request->marque,
            'réfference'=>$request->réfference,
            'service'   =>$request->service,
            'dis'       =>$request->dis,
            'expire'   =>$request->expire,

        ];
        Matériels::where('id',$request->id)->update($update);
        return redirect()->back()->with('insert','Mise à jour effectué avec succès!.');
    }

    // delete
    public function delete($id)
    {
        $delete = Matériels::find($id);
        $delete->delete();
        return redirect()->back()->with('insert','Données supprimées avec succès!.');
    }
    
}

my form :

@extends('layouts.master')
@include('navbar.header')
@section('content')
@include('sidebar.form')








<main class="col bg-faded py-3 flex-grow-1">
    <h3>GPI</h3>
    <br>
    <div class="signup-form">
        <form action="{{ route('form/page_test/save') }}" method="post" class="form-horizontal">
            {{ csrf_field() }}
            <div class="row">
                <div class="col-8 offset-4">
                    <h2>Ajoutez vos matériels</h2>
                </div>
            </div>  
            {{-- success --}}
            @if(\Session::has('insert'))
                <div id="insert" class=" alert alert-success">
                    {!! \Session::get('insert') !!}
                </div>
            @endif

            {{-- error --}}
            @if(\Session::has('error'))
                <div id="error" class=" alert alert-danger">
                    {!! \Session::get('error') !!}
                </div>
            @endif


            <div class="form-group row">
                <label class="col-form-label col-4">Type</label>
                <div class="col-8">
                    <input type="text" class="form-control @error('type') is-invalid @enderror" name="type" value="{{ old('type') }}" placeholder="Entrer type">
                    @error('type')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                    @enderror
                </div>          
            </div>
            <div class="form-group row">
                <label class="col-form-label col-4">Série</label>
                <div class="col-8">
                    <input type="text" class="form-control @error('série') is-invalid @enderror" name="série" value="{{ old('série') }}" placeholder="Entrer série">
                    @error('série')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror  
                </div>  
            </div>
            <div class="form-group row">
                <label class="col-form-label col-4">Marque</label>
                <div class="col-8">
                    <input type="text" class="form-control @error('marque') is-invalid @enderror" name="marque" value="{{ old('marque') }}" placeholder="Entrer la marque">
                    @error('marque')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror 
                </div>          
            </div>


            <div class="form-group row">
                <label class="col-form-label col-4">Réfference/Modèle</label>
                <div class="col-8">
                    <input type="text" class="form-control @error('réfference') is-invalid @enderror" name="réfference" value="{{ old('réfference') }}" placeholder="Entrer la réfference">
                    @error('réfference')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror 
                </div>          
            </div>

        


            <div class="form-group row">
                <label class="col-form-label col-4">service</label>
                <div class="col-8">
                    <input type="text" class="form-control @error('service') is-invalid @enderror" name="service" value="{{ old('service') }}" placeholder="Entrer service">
                    @error('service')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror 
                </div>          
            </div>

            <div class="form-group row">
                <label class="col-form-label col-4">Date de réception</label>
                <div class="col-8">
                    
                <input type="datetime-local" name="dis" value="{{ old('dis') }}" class="form-control @error('dis') is-invalid @enderror">
                    @error('dis')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror 
                </div>          
            </div>


            <div class="form-group row">
                <label class="col-form-label col-4">Date d'expiration</label>
                <div class="col-8">
                    
                <input type="datetime-local" name="expire" value="{{ old('expire') }}" class="form-control @error('expire') is-invalid @enderror">
                    @error('expire')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror 
                </div>          
            </div>
            

            <div class="form-group row">
                <div class="col-8 offset-4">
                    <button type="submit" class="btn btn-primary btn-lg">Enregistrer</button>
                </div>  
            </div>            
        </form>
    </div>
    {{-- hide message js --}}
    <script>
        $('#insert').show();
        setTimeout(function()
        {
            $('#insert').hide();
        },5000);

        $('#error').show();
        setTimeout(function()
        {
            $('#error').hide();
        },5000);
        
    </script>        
</main>
@endsection

my model :

<?php

namespace App\Models;

use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Matériels extends Model
{
    protected $dates = [
        'expire' => 'datetime',
    'dis' => 'datetime',
    ];

    protected $table = 'Matériels';
    
    use HasFactory;

    protected $fillable = [
        'type',
        'série',
        'marque',
        'réfference',
        'service',
        'dis',
        'expire',
    ];

    protected static function boot()
    {
        parent::boot();
    
        static::creating(function ($model) {
            $model->expire = Carbon::parse(request()->input('expire'));
        });
    
        static::updating(function ($model) {
            if ($model->expire->isPast()) {
                $model->status = 'expiré';
                $model->save();
            }
        });
    }
    
    

    public function scopeExpired($query)
    {
        return $query->whereNotNull('expires_at')
                     ->where('expires_at', '<=', now())
                     ->where('status', '=', 'expiré');
    }
}
  • Did you check the date format is the same in your code and your DB? – tola May 14 '23 at 12:56
  • Probably it's because you are using format `Y-m-d\TH:i`, which is not a standard format. Try using `Y-m-d\TH:i:s` (notice the `:s` at the end) – Arun A S May 14 '23 at 14:13
  • i tried to add s but the field is giving me this error The dis does not match the format Y-m-d\TH:i:s. – user21781868 May 14 '23 at 14:31
  • "échec" just means failure in French - it would help you (and us) if you captured the FULL error message from MySQL - this will probably reveal the actual problem to be solved. – Paul Maxwell May 15 '23 at 10:15

1 Answers1

0

To insert a date string, captured in the format Y-m-d\TH:i, into a MySQL convert it to a valid MySQL date format using STR_TO_DATE(). Use %Y-%m-%dT%H:%i e.g.

INSERT INTO mytable (mydate) VALUES (STR_TO_DATE('2023-05-15T14:30', '%Y-%m-%dT%H:%i'));

or, in PHP do something along these lines to arrange the date into an acceptable format

$date_str = '2023-05-15T14:30';
$date = DateTime::createFromFormat('Y-m-d\TH:i', $date_str);
$formatted_date = $date->format('Y-m-d H:i:s');
$sql = "INSERT INTO mytable (mydate) VALUES ('$formatted_date')";
Paul Maxwell
  • 33,002
  • 3
  • 32
  • 51