如何在mysql中插入数据而不刷新页面,使用ajax和laravel

4nkexdtk  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(233)

我正在尝试使用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>
l7wslrjt

l7wslrjt1#

根据您的评论,当您不使用ajax时,它似乎可以工作,但是重定向了,但是当您使用ajax时,它就不工作了。
这似乎是合乎逻辑的:当您不使用ajax时,会向服务器发送4个键值对:
_代币
写入程序\u id2
地位
写作技巧
使用ajax时,只发送3个键值对,其中只有1个键值对是正确的:
身份证件
地位
技能
因此,在使用ajax时,至少需要更改发送的数据。
因此:

data: {
         'id': id,
         'status': status,
         'skills': skills
     },

应该是:

data: {
         'writer_id2': id,
         'status': status,
         'writer-skills': skills
     },

现在您至少已经对数据部分进行了排序,但它仍然可能由于缺少 _token 如果是这样的话,你也需要加上这个。
然而,奇怪的是,您收到的错误消息表明令牌是不必要的,这可能表示配置错误。
要简单地添加所有内容而不必手动分配变量,我建议使用以下方法:

data: $('form').serialize(),

现在您将收到与“normal”/非ajax post完全相同的数据。
除此之外,我还建议您监听formsubmit事件而不是按钮click,这样您的javascript也可以处理任何由enter键引起的提交。

col17t5w

col17t5w2#

一些评论。。。
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(或离开,如果他们是必要的)
请试试这些,让我知道它是如何工作的:)

相关问题