【问题标题】:500 Internal Server Error when trying to delete mysql data record using ajax in laravel 8尝试在 laravel 8 中使用 ajax 删除 mysql 数据记录时出现 500 内部服务器错误
【发布时间】:2021-01-12 18:46:27
【问题描述】:

所以我和我的朋友正在开发用于用户管理的管理员视图。我希望这个视图能够通过单击按钮来删除用户。

用户列表本身如下所示:

@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 = \App\Models\User::findOrFail($id);
        $user->delete();

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

最后是 web.php 中的 Route:

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

所以现在每当我尝试删除单击按钮的用户时,我都会在控制台中收到“500 内部服务器错误”。

在这一点上,我不仅不知道我应该做些什么来完成这项工作。 我唯一想要的是删除一条记录并通过单击一个按钮刷新数据库。但目前我尝试过的任何方法都没有奏效。

我希望你能帮助我。提前致谢!

【问题讨论】:

  • 转到您的存储 > 日志文件夹并告诉我们错误..
  • 我认为函数不应该是静态的,你应该将id添加到你的路由/deleteuser/{id}
  • 另外,请查看控制台网络选项卡中返回的响应,了解错误的具体情况。

标签: php mysql ajax laravel laravel-8


【解决方案1】:

也许您收到 500 错误是因为找不到您的控制器类。您需要使用完整的命名空间。修改你的代码如下:

路线:

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

控制器:

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

        return redirect('/userlist');
    }
    
}

注意:对于POST 请求,您需要通过您的ajax 数据发送csrf token

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');
    }
});

希望这会奏效!

【讨论】:

  • 如果 csrf 不匹配则会抛出 419 错误,而不是 500
  • 我建议了所有这些,因为他也缺少 csrf.. @sta
【解决方案2】:

选项 1:将 {id} 参数添加到您的路线。

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

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 App\Models\User;

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

        return redirect('/userlist');
    }
    
}

选项 3:使用 Request 对象检索查询字符串

Route::post('/deleteuser', [UserController::class, 'destroy'])->name('deleteuser');
use App\Models\User;
use Illuminate\Http\Request;

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

        return redirect('/userlist');
    }
    
}

【讨论】:

    【解决方案3】:

    您的请求中必须需要头文件,因此请使用此文件 类型:'发布', 标题

    【讨论】:

    • 你能澄清一下吗?
    • $.ajax({ type:'post', headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content ') }, url:'{{ route("delete_all_document") }}', data:{type:type, pId: pId}, success:function(data){ window.location.reload(); } });
    • 像这样你可以在你的ajx调用@PatZabawa中添加headr
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多