Я пытаюсь удалить данные из базы данных через ajax.
HTML:
@foreach($a as $lis) //some code <a href="#" class="delteadd" id="{{$lis['id']}}">Delete</a> //click action perform on this link @endforeach
Мой код ajax:
$('body').on('click', '.delteadd', function (e) { e.preventDefault(); //alert('am i here'); if (confirm('Are you sure you want to Delete Ad ?')) { var id = $(this).attr('id'); $.ajax({ method: "POST", url: "{{url()}}/delteadd", }).done(function( msg ) { if(msg.error == 0){ //$('.sucess-status-update').html(msg.message); alert(msg.message); }else{ alert(msg.message); //$('.error-favourite-message').html(msg.message); } }); } else { return false; } });
Это мой запрос на получение данных из базы данных …
$a = Test::with('hitsCount')->where('userid', $id)->get()->toArray();
Но когда я нажимаю на ссылку Удалить данные, которые не удаляются, и вы видите несоответствие csrf_token …
Вы должны добавить данные в свой запрос ajax. Надеюсь, это будет работа.
data: { "_token": "{{ csrf_token() }}", "id": id }
Лучший способ решить эту проблему «X-CSRF-TOKEN» состоит в том, чтобы добавить следующий код к вашему основному макету и продолжить выполнение ваших вызовов ajax в обычном режиме:
В заголовке
<meta name="csrf-token" content="{{ csrf_token() }}" />
В скрипте
<script type="text/javascript"> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); </script>
Я думаю, лучше поставить токен в форму и получить этот токен по id
<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">
И JQUery:
var data = { "_token": $('#token').val() };
таким образом, ваш JS не должен находиться в ваших файлах кликов.
Я просто добавил headers:
в ajax call:
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
ввиду:
<div id = 'msg'> This message will be replaced using Ajax. Click the button to replace the message. </div> {{ Form::submit('Change', array('id' => 'ajax')) }}
Функция ajax:
<script> $(document).ready(function() { $(document).on('click', '#ajax', function () { $.ajax({ type:'POST', url:'/ajax', headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, success:function(data){ $("#msg").html(data.msg); } }); }); }); </script>
в контроллере:
public function call(){ $msg = "This is a simple message."; return response()->json(array('msg'=> $msg), 200); }
в routes.php
Route::post('ajax', 'AjaxController@call');
Если вы используете файлы шаблонов, вы можете поместить свой meta
в section
главы (или что бы вы его назвали), которые содержат ваши meta
.
@section('head') <meta name="csrf_token" content="{{ csrf_token() }}" /> @endsection
Следующее, вам нужно поместить атрибут headers
в ваш ajax
(в моем примере я использую datatable
с обработкой на стороне сервера:
"headers": {'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')}
Вот полный datatable
ajax для данных:
$('#datatable_users').DataTable({ "responsive": true, "serverSide": true, "processing": true, "paging": true, "searching": { "regex": true }, "lengthMenu": [ [10, 25, 50, 100, -1], [10, 25, 50, 100, "All"] ], "pageLength": 10, "ajax": { "type": "POST", "headers": {'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')}, "url": "/getUsers", "dataType": "json", "contentType": 'application/json; charset=utf-8', "data": function (data) { console.log(data); }, "complete": function(response) { console.log(response); } } });
После этого вы должны получить 200 status
для вашего запроса ajax
.
если вы используете jQuery для отправки сообщений AJAX, добавьте этот код ко всем представлениям:
$( document ).on( 'ajaxSend', addLaravelCSRF ); function addLaravelCSRF( event, jqxhr, settings ) { jqxhr.setRequestHeader( 'X-XSRF-TOKEN', getCookie( 'XSRF-TOKEN' ) ); } function getCookie(name) { function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); }; var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)')); return match ? match[1] : null; }
Laravel добавляет cookie XSRF ко всем запросам, и мы автоматически добавляем его ко всем запросам AJAX непосредственно перед отправкой.
Вы можете заменить функцию getCookie, если есть другая функция или плагин jQuery, чтобы сделать то же самое.
У меня на самом деле была эта ошибка и не удалось найти решение. На самом деле я не делал запрос ajax. Я не знаю, была ли эта проблема из-за того, что это суб-домен на моем сервере или что-то еще. Вот мой jquery.
$('#deleteMeal').click(function(event) { var theId = $(event.currentTarget).attr("data-mealId"); $(function() { $( "#filler" ).dialog({ resizable: false, height:140, modal: true, buttons: { "Are you sure you want to delete this Meal? Doing so will also delete this meal from other users Saved Meals.": function() { $('#deleteMealLink').click(); // jQuery.ajax({ // url : 'http://www.mealog.com/mealtrist/meals/delete/' + theId, // type : 'POST', // success : function( response ) { // $("#container").replaceWith("<h1 style='color:red'>Your Meal Has Been Deleted</h1>"); // } // }); // similar behavior as clicking on a link window.location.href = 'http://www.mealog.com/mealtrist/meals/delete/' + theId; $( this ).dialog( "close" ); }, Cancel: function() { $( this ).dialog( "close" ); } } }); }); });
Поэтому я фактически создал якорь, чтобы перейти к моему API, а не выполнять почтовый запрос, и это то, что я считаю большинством приложений.
<p><a href="http://<?php echo $domain; ?>/mealtrist/meals/delete/{{ $meal->id }}" id="deleteMealLink" data-mealId="{{$meal->id}}" ></a></p>
Вы должны включить скрытое поле маркера CSRF (кросс-сайта) в форме, чтобы промежуточное ПО защиты CSRF могло проверить запрос.
Laravel автоматически генерирует «токен» CSRF для каждого активного сеанса пользователя, управляемого приложением. Этот токен используется для проверки того, что аутентифицированный пользователь является тем, который фактически запрашивает приложение gthe gthe.
Поэтому при выполнении ajax-запросов вам необходимо передать токен csrf через параметр данных. Вот пример кода.
var request = $.ajax({ url : "http://localhost/some/action", method:"post", data : {"_token":"{{ csrf_token() }}"} //pass the CSRF_TOKEN() });