Как вставить данные в MySQL без обновления страницы, используя AJAX и LARAVEL - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь вставить строку в БД, не обновляя страницу, используя LARAVEL и AJAX, но когда я нажимаю кнопку отправки, я получаю следующую ошибку в ответе консоли браузера:

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 ]

0 голосов
/ 28 декабря 2018

Некоторые комментарии ...

1) Если вы используете id в тегах html, возможно, вы можете использовать $('#yourid').val() для получения данных.

2) Controller 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) Не используйте "-" в переменных, идентификаторах, именах ... используйте "_", например.writer_skills

7) Удалить все сумасшедшие foreach (или оставить, если они необходимы)

Пожалуйста, попробуйте это и дайте мне знать, как это работает:)

0 голосов
/ 27 декабря 2018

Судя по вашим комментариям, кажется, что это работает - но перенаправляет - когда вы не используете ajax, но не работает, когда вы используете ajax.

Это может показаться логичным: когда вы этого не делаетеиспользуя ajax, вы отправляете на сервер 4 пары ключ-значение:

  • _token
  • writer_id2
  • status
  • writer-skill *

И когда вы используете ajax, вы отправляете только 3 пары ключ-значение, из которых только 1 имеет правильный ключ:

  • id
  • status
  • навыки

Так что, по крайней мере, вам нужно изменить данные, которые вы отправляете при использовании ajax.

Итак, это:

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

Должно быть:

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

Теперь у вас есть, по крайней мере, часть данных, отсортированная, но она все равно может потерпеть неудачу из-за отсутствия _token, и если это так, вам нужно будет добавить и эту часть.

Однако, как ни странно, полученное вами сообщение об ошибке говорит о том, что токен не нужен, что, вероятно, указывает на ошибку конфигурации.

Чтобы просто добавить все без необходимости назначения переменных вручную, я бы порекомендовалвместо этого используйте:

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

Теперь вы получите те же данные, что и с «обычным» / не-AJAX-сообщением.

Кроме того, я бы также порекомендовал прослушатьсобытие отправки формы вместо нажатия кнопки, чтобы ваш javascript также обрабатывал любые отправки, вызванные, например, использованием клавиши ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...