POST 500(内部服务器错误)- Laravel和Ajax


POST 500 (Internal Server Error) - Laravel and Ajax

我想用ajax发送post请求到laravel的控制器。ajax请求发送两个input参数,我希望控制器用第一个参数找到数据库中的列,然后用第二个输入参数设置name属性。但是我有这个错误信息Creating default object from empty value

Ajax function:
$('#saveUserProfile').on('click', function () {
                var $finduser = $('input[name=findUser]').val();  
                var $name = $('input[name=userprofilename]').val();

                    $.ajax({
                        type:"POST",
                        url:'/code/task1/public/updateUser',
                        data: {
                             'name' : $name,
                             'finduser' : $finduser,
                            // 'email' : $email,
                         },
                        success:function(data){
                            $("#input1").val(data[0].name);
                        }
                    });
         }); 

和我的控制器

中的函数
public function updateUser(Request $request){
        $return_array = array();
        $findUserInput = $request->get('finduser');
        $user = User::where('name',$findUserInput) -> first();
        $user->name = $request->get('name');
        $user->save();
        $data =  DB::select("SELECT * FROM users where name='$findUserInput'");

        if(count($data) > 0){
            foreach($data as $da){
                $return_array[] = $da;
            } 
        }
        return $return_array;
    }

更新:我还做了ajax函数和控制器,用于查找工作良好的用户

ajax功能:

$('#buttonFindUser').on('click', function () {
                  var $name = $('input[name=findUser]').val();
                    $.ajax({
                        type:"GET",
                        url:'/code/task1/public/findUser',
                        data: {
                             'name' : $name,
                         },
                        success:function(data){

                            $("#input1").val(data[0].name);
                            $("#input2").val(data[0].email);
                            $("#input3").val(data[0].created_at);
                        }
                    });
         });

在我的控制器中的功能:

public function findUser(Request $request){
        $return_array = array();
        $findUserInput = $request->get('name');
        $data =  DB::select("SELECT * FROM users where name='$findUserInput'");

        if(count($data) > 0){
            foreach($data as $da){
                $return_array[] = $da;
            } 
        }
        return $return_array;
    }

任何想法?

但是我有这个错误信息Creating default object from empty value

正在发生的事情是你试图保存一个不存在的用户。您需要检查控制器中的$user是否为null。现在,无法找到具有提供的名称的用户,因此$user变为null。

所以,你可以修改你的代码,在$user上做null检查,像这样:

public function updateUser(Request $request){
    $return_array = array();
    $findUserInput = $request->get('finduser');
    $user = User::where('name',$findUserInput) -> first();
    if(!$user)
        return response()->json(['status'=>false,'Description' => 'User could not be found.']);
    $user->name = $request->get('name');
    $user->save();
    $data =  DB::select("SELECT * FROM users where name='$findUserInput'");

    if(count($data) > 0){
        foreach($data as $da){
            $return_array[] = $da;
        } 
    }
    return $return_array;
}

这是空检查:

if(!$user)
    return response()->json(['status'=>false,'Description' => 'User could not be found.']);

当我们没有一个有效的用户时,我们只是回复一个json响应,说明找不到它。

更新:

看到你的输入没有在控制器中被检索,你需要在JS中做一些改变:

首先,你正在做一个post请求,我看不到CSRF令牌。要添加它,请遵循以下答案:https://stackoverflow.com/a/37582060/6270112

因此,您的数据现在将变成:

data: '_token=' + $('#token').val() + '&name=' + $name + '&finduser=' + $finduser

此外,正如aleksejjj所提到的,您还需要修复jquery选择器。那么,你现有的选择器:

var $finduser = $('input[name=findUser]').val();  
var $name = $('input[name=userprofilename]').val();

将成为:

var $finduser = $('input[name^="findUser"]').val();  
var $name = $('input[name^="userprofilename"]').val();

接下来,在控制器中,您需要将$request->get(...)替换为$request->input(...)

$findUserInput = $request->get('finduser');

将成为

$findUserInput = $request->input('finduser');

您需要检查您的用户是否存在

$user = User::where('name', $findUserInput)->first();
if($user)
{
    $user->name = $request->get('name');
    $user->save();
}

更改此代码

$user = User::where('name',$findUserInput) -> first();

$user = User::where('name','=',$findUserInput) -> first();

我希望这将工作。:)