我想用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();
我希望这将工作。:)