【问题标题】:POST 500 (Internal Server Error) - Laravel and AjaxPOST 500(内部服务器错误)- Laravel 和 Ajax
【发布时间】:2017-03-07 11:12:44
【问题描述】:

我想用 ajax 向 laravel 中的控制器发送 post 请求。 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;

    }

有什么想法吗?

【问题讨论】:

  • 您收到什么错误信息?
  • usersController.php 第 117 行中的@ArminSam ErrorException:从空值创建默认对象
  • 我遇到了同样的错误,请检查我的答案。这对我有帮助,如果您仍然遇到错误,请告诉我
  • 您可以登录$request->all() 看看是否有输入值进入控制器。如果有你可以试试$request->input('finduser')
  • @Sudhanshusharma 我仍然遇到同样的错误

标签: php ajax laravel laravel-5


【解决方案1】:

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

您正在尝试保存一个不存在的用户。您需要检查$user 是否在您的控制器中为null。目前,无法使用提供的名称找到用户,因此 $user 变为空。

因此,您可以修改代码以对 $user 进行空检查,如下所示:

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 中进行一些更改:

首先,您正在执行发布请求,但我看不到 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');

并对名称字段重复相同的操作。

【讨论】:

  • 是的,我正在返回 json 响应 找不到用户,但是数据库中已经存在具有该输入的用户...这就是问题
  • 你能做一个dd($request->get('finduser')); 并发布结果吗?
  • @epowah 检查您的 jQuery 选择器。你需要$('input[name="findUser"]').val()
  • 另外,您是否禁用了 CSRF 令牌验证?因为,我可以看到你正在发送一个帖子请求。
  • @bytesarelife Wow 错误数很快就会超过代码行数:)
【解决方案2】:

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

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

if($user)
{
    $user->name = $request->get('name');

    $user->save();
}

【讨论】:

    【解决方案3】:

    更改此代码

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

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

    我希望这会奏效。 :)

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 2014-12-01
      • 2015-11-22
      • 1970-01-01
      • 2019-12-05
      • 2018-02-04
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多