我正在尝试使用laravel和ajax在db中插入一行,而不刷新页面,但是当我单击submit按钮时,在浏览器控制台响应中收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'writer_id2' cannot be null.
我猜,输入数据还没有提交,值是空的,但是我如何在控制器中接收响应/输入数据并同时将其插入数据库?
路线:
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>
2条答案
按热度按时间l7wslrjt1#
根据您的评论,当您不使用ajax时,它似乎可以工作,但是重定向了,但是当您使用ajax时,它就不工作了。
这似乎是合乎逻辑的:当您不使用ajax时,会向服务器发送4个键值对:
_代币
写入程序\u id2
地位
写作技巧
使用ajax时,只发送3个键值对,其中只有1个键值对是正确的:
身份证件
地位
技能
因此,在使用ajax时,至少需要更改发送的数据。
因此:
应该是:
现在您至少已经对数据部分进行了排序,但它仍然可能由于缺少
_token
如果是这样的话,你也需要加上这个。然而,奇怪的是,您收到的错误消息表明令牌是不必要的,这可能表示配置错误。
要简单地添加所有内容而不必手动分配变量,我建议使用以下方法:
现在您将收到与“normal”/非ajax post完全相同的数据。
除此之外,我还建议您监听formsubmit事件而不是按钮click,这样您的javascript也可以处理任何由enter键引起的提交。
col17t5w2#
一些评论。。。
1) 如果您在html标记中使用id,那么您可以使用
$('#yourid').val()
获取数据。2) 控制器en laravel默认接收一个参数$request,所以
3) 如果你用的是2。你可以用
$request->all();
或者Input::get('writer_id2');
不需要一个新的示例input();4) 在ajax中,您可以使用
$('div#add-writer form').serialize()
序列化数据中的值。5) 在控制器中,您可以使用
6) 不要在变量、ID、名称中使用“-”。。。使用“\”例如。
writer_skills
7) 删除所有疯狂的foreach(或离开,如果他们是必要的)请试试这些,让我知道它是如何工作的:)