500 Внутренняя ошибка сервера при попытке удалить запись данных mysql с помощью ajax в laravel 8

#php #mysql #ajax #laravel #laravel-8

#php #mysql #ajax #laravel #laravel-8

Вопрос:

Итак, мы с моим другом работаем над представлением администратора для управления пользователями. Я хотел, чтобы это представление могло удалять пользователей нажатием кнопки.

Сам список пользователей выглядит следующим образом:

 @section('main')
    @csrf
    <ul class="collapsible">
        @foreach($users as $user)
            <li method="POST" action="delete">
                <div class="collapsible-header">
                    <i class="material-icons">face</i>{{$user->fname}} {{$user->lname}}
                </div>
                <div class="collapsible-body" id="{{$user->id}}">
                    <p>Adresse: {{$user->address1}}, {{$user->postalcode}} {{$user->city}}</p>
                    <p>Land: {{$user->country}}</p>
                    <p>E-Mail: {{$user->email}}</p>
                    <span>Beigetreten: {{$user->created_at}}</span>
                    <br>
                    <a class="btn red waves-effect waves-light user-delete-button" href="" 
                       id="user-delete-button" data-userid="{{$user->id}}">
                        <i class="material-icons">delete</i>
                    </a>
                </div>
            </li>
        @endforeach
    </ul>
@endsection
  

Сценарий в расширенном dashboard.blade.php шаблон выглядит следующим образом:

 
    <script>
        $(document).ready(function(){
            $('.collapsible').collapsible();
            $('.user-delete-button').click(function (e){
                $.ajax({
                    url: '{{route('deleteuser')}}',
                    data: {"userid": $(this).data("userid")},
                    type: 'post',
                    success: function(data)
                    {
                        console.log('deleted');
                    }
                });
            });
        });
    </script>
  

Пользовательский контроллер:

 class UserController extends Controller
{
    public static function destroy($id) {
        $user = AppModelsUser::findOrFail($id);
        $user->delete();

        return redirect('/userlist');
    }
    //
}
  

И, наконец, маршрут в web.php:

 Route::post('/deleteuser', [UserController::class, 'destroy'])->name('deleteuser');
  

Так что теперь всякий раз, когда я пытаюсь удалить пользователя, нажимающего на кнопку, я получаю «500 Internal Server Error» в консоли.

На данный момент я не просто понятия не имею, что я должен делать, чтобы это сработало. Единственное, что я хочу, это удалить запись и обновить базу данных простым нажатием кнопки. Но в настоящее время ничего из того, что я пробовал, пока не работало.

Надеюсь, вы сможете мне помочь. Заранее спасибо!

Комментарии:

1. Перейдите в папку Storage> Logs и сообщите нам об ошибке..

2. Я думаю, что функция не должна быть статической, и вы должны добавить идентификатор в свой маршрут /deleteuser/{id}

3. Кроме того, ознакомьтесь с ответом, возвращенным на вкладке сети вашей консоли, чтобы увидеть специфику ошибки.

Ответ №1:

в вашем запросе должен быть файл заголовка, поэтому используйте этот тип: ‘post’, заголовок

Комментарии:

1. Не могли бы вы уточнить?

2. $.ajax({ type:’post’, headers: { ‘X-CSRF-TOKEN’: $(‘meta[name=»csrf-token»]’).attr(‘content’) }, url:'{{ route(«delete_all_document») }}’, data:{type:тип, pId: pId}, успех: функция (данные){ окно. location.reload(); } });

3. таким образом, вы можете добавить заголовок в свой вызов ajx @PatZabawa

Ответ №2:

Вариант 1: добавьте параметр {id} к вашему маршруту.

 Route::post('/deleteuser/{userid}', [UserController::class, 'destroy'])->name('deleteuser');
  
 use AppModelsUser;

class UserController extends Controller
{
    public function destroy($userid) {
        $user = User::findOrFail($userid);
        $user->delete();

        return redirect('/userlist');
    }
    
}
  

Вариант 2: используйте привязку модели маршрута в вашем маршруте и действии контроллера:

 Route::post('/deleteuser/{user}', [UserController::class, 'destroy'])->name('deleteuser');
  
 use AppModelsUser;

class UserController extends Controller
{
    public function destroy(User $user) {
        $user->delete();

        return redirect('/userlist');
    }
    
}
  

Вариант 3: использовать объект запроса для извлечения строки запроса

 Route::post('/deleteuser', [UserController::class, 'destroy'])->name('deleteuser');
  
 use AppModelsUser;
use IlluminateHttpRequest;

class UserController extends Controller
{
    public function destroy(Request $request) {
        $user = User::findOrFail($request->query('userid', null));
        $user->delete();

        return redirect('/userlist');
    }
    
}
  

Ответ №3:

Возможно, вы получали ошибку 500, потому что ваш класс контроллера не был найден. Вам нужно использовать полное пространство имен. Измените свой код следующим образом:

Маршрут:

 Route::post('/deleteuser', [AppHttpControllersUserController::class, 'destroy'])->name('deleteuser');
  

Контроллер:

 class UserController extends Controller
{
    public static function destroy(Request $Request) {
        $id = $Request->input('userid');
        $user = AppModelsUser::findOrFail($id);
        $user->delete();

        return redirect('/userlist');
    }
    
}
  

Примечание: для POST запроса вам необходимо отправить csrf token через ваши данные ajax

 data: {
   "_token": "{{ csrf_token() }}",
   "userid": $(this).data("userid")
}
  

или вы можете добавить пармы заголовка следующим образом:

 $.ajax({
    url: '{{route('deleteuser')}}',
    data: {"userid": $(this).data("userid")},
    type: 'post',
    headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}' },
    success: function(data)
    {
        console.log('deleted');
    }
});
  

Надеюсь, это сработает!

Комментарии:

1. Если csrf не соответствует, то будет выдана ошибка 419, а не 500

2. Я предложил все это, потому что у него тоже отсутствует csrf.. @sta