我试图使用LARAVEL和AJAX在数据库中插入一行,而不刷新页面,但是当我单击“提交”按钮时,在浏览器控制台响应中收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'writer_id2' cannot be null.
我想输入数据尚未提交并且值为空,但是如何在控制器中接收响应/输入数据并将其同时插入db中?
路线:
Route::post('writers', ['as'=>'add-writer' ,'uses'=> 'HomeController@addWriter'])->name('add-writer');
控制器:
public function addWriter(){
$i = new Input();
$dm= new DataModel();
$data= response()->json(['data'=>$i::all()]);
$encode = json_encode($data);
$decode = json_decode($encode,true);
$decoded = [];
$decodedNeeded = [];
$inc = 0;
$i2 = 0;
foreach ($decode as $k=>$v){
$inc++;
$decoded[$inc] = $v;
}
foreach($decoded[2] as $k3 =>$v3){
$i2++;
$decodedNeeded[$i2] = $v3;
}
$this->insertUser = $decodedNeeded;
$dm->addWriterMethod($decodedNeeded[1]['writer_id2'],$decodedNeeded[1]['status'],$decodedNeeded[1]['writer-skills']);
AJAX
$('#add-writer-btn').click(function(e) {
e.preventDefault();
var id = $('input[name=writer_id2]').val();
var status = $("input[name=status]").val();
var skills = $('textarea').val();
var form2 = $(this);
var url2 = form2.attr('action');
$.ajax({
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
method: "POST",
ContentType: 'application/json',
url: url2,
dataType: 'json',
data: {
'id': id,
'status': status,
'skills': skills
},
success: function (data) {
alert('Added successfully!');
}
});
});
HTML
<div id="add-writer">
<b>Add writer</b>
<form action="{{url('add-writer')}}" method="POST">
<input type="hidden" name="_token" value="{{csrf_token()}}">
Writer_id2 <input type="number" id="writer-id-2" name="writer_id2">
<br>
Open to suggestions <input type="radio" value="Open to suggestions" name="status">
<br>
Searching for orders <input type="radio" value="Searching for orders" name="status">
<br><br>
Writer skills <textarea name="writer-skills"></textarea>
<input type="submit" value="Add" id="add-writer-btn" >
</form>
</div>
答案 0 :(得分:0)
根据您的评论,当您不使用ajax时,它似乎可以工作-但可以重定向-但当您使用ajax时,它不能工作。
这似乎合乎逻辑:当您不使用ajax时,会将4个键值对发送到服务器:
使用ajax时,您仅发送3个键值对,其中只有1个具有正确的键:
因此至少,您需要更改使用ajax时发送的数据。
所以这个:
data: {
'id': id,
'status': status,
'skills': skills
},
应该是:
data: {
'writer_id2': id,
'status': status,
'writer-skills': skills
},
现在您至少已对数据部分进行了排序,但是由于缺少_token
,它仍然可能失败,如果是这种情况,您也需要添加该部分。
但是,奇怪的是,您收到的错误消息表明令牌是不必要的,这可能表明配置错误。
要简单地添加所有内容而不必手动分配变量,我建议改用此方法:
data: $('form').serialize(),
现在,您将收到与“正常” /非ajax帖子完全相同的数据。
除此之外,我还建议您监听表单提交事件,而不是单击按钮,以便您的javascript也可以处理任何由于使用回车键引起的提交。
答案 1 :(得分:0)
一些评论...
1)如果您在html标签中使用id,则可以使用$('#yourid').val()
来获取数据。
2)默认情况下,控制器en Laravel会收到一个参数$ request,所以
public function addWriter(Request $request) {
3)如果您使用的是2。可以使用$request->all();
或Input::get('writer_id2');
,则不必实例化新的Input();
4)在ajax中,您可以使用$('div#add-writer form').serialize()
序列化数据中的值。
5)在控制器中,您可以使用
$dm->addWriterMethod($request->writer_id2,$request->status,$request->writer_skills);
6)请勿在变量,id,名称中使用“-”,例如,使用“ _”。 writer_skills
7)删除所有疯狂的foreach(或在必要时离开)
请尝试这些,让我知道它是如何工作的:)