如何使用AJAX和LARAVEL在MySQL中插入数据而不刷新页面

时间:2018-12-27 20:08:25

标签: php mysql ajax laravel

我试图使用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>

2 个答案:

答案 0 :(得分:0)

根据您的评论,当您不使用ajax时,它似乎可以工作-但可以重定向-但当您使用ajax时,它不能工作。

这似乎合乎逻辑:当您不使用ajax时,会将4个键值对发送到服务器:

  • _token
  • writer_id2
  • 状态
  • 作家技能

使用ajax时,您仅发送3个键值对,其中只有1个具有正确的键:

  • id
  • 状态
  • 技能

因此至少,您需要更改使用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(或在必要时离开)

请尝试这些,让我知道它是如何工作的:)