我想用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;
}
有什么想法吗?
答案 0 :(得分:0)
但我收到此错误消息
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');
并重复使用名称字段。
答案 1 :(得分:0)
您需要检查您的用户是否存在
def show(conn, _params) do
render(conn, MyApp.SpecialView, :show, message: "Hello")
end
def show(conn, _params) do
conn
|> put_view(MyApp.SpecialView)
|> render(:show, message: "Hello")
end
答案 2 :(得分:-2)
更改此代码
$user = User::where('name',$findUserInput) -> first();
到
$user = User::where('name','=',$findUserInput) -> first();
我希望这会奏效。 :)