Reputation: 2208
I am trying to use jquery ajax in laravel5. What actually happens all the time is consolelog giving me an internal server error 500
. I found some csrf solutions and added them to my code but they didnt help me. Any ideas?
$('.takImg').click(function(){
var photoId = $(this).parent().attr('id');
$.ajax({
type : "POST",
url : "/save_like",
beforeSend: function (xhr) {
var token = $('meta[name="csrf_token"]').attr('content');
if (token) {
return xhr.setRequestHeader('X-CSRF-TOKEN', token);
}
},
data: {photoId : photoId},
success : function(msg) {
console.log(msg);
},
complete : function(r) {
console.log(r);
},
error: function(error) {
console.log(error);
}
});
});
I also added this meta to my head:
<meta name="csrf_token" content="{{ csrf_token() }}" />
Everything goes through routes:
`Route::any('/save_like', 'Controller@saveLike');`
To the controller:
public function saveLike($photoId){
DB::update('UPDATE `photo_links` SET likes = likes + 1 WHERE `id` = ?', array($photoId));
}
Upvotes: 2
Views: 619
Reputation: 67505
First the _token
should be always sent in the http request so you could just add it to the data :
$('.takImg').click(function(){
var photoId = $(this).parent().attr('id');
var _token = $('meta[name="csrf_token"]').attr('content');
$.ajax({
type: "POST",
url: "/save_like",
data: {_token:_token, photoId:photoId},
success : function(msg) {
console.log(msg);
},
complete : function(r) {
console.log(r);
},
error: function(error) {
console.log(error);
}
});
});
internal server error 500
mean the problem come from your server what mean in your case here it come from the action saveLike
in your controller, so my guess is that this problem come from the expression WHERE
id= ?
:
DB::update('UPDATE `photo_links` SET likes = likes + 1 WHERE `id` = ?', array($photoId));
____________________________________________________________^^^^^^^^^^
You're passing an array to =
and that will cause the issue, try :
public function saveLike(){
$photoId = INPUT::get('photoId');
DB::update("UPDATE `photo_links` SET likes=likes+1 WHERE `id` = $photoId");
}
Hope this helps.
Upvotes: 2
Reputation: 1282
I think the problem is here:
beforeSend: function (xhr) {
var token = $('meta[name="csrf_token"]').attr('content');
if (token) {
return xhr.setRequestHeader('X-CSRF-TOKEN', token);
}
},
What happened when there is no token? beforeSend
won't return anything. Change to this:
beforeSend: function (xhr) {
var token = $('meta[name="csrf_token"]').attr('content');
if (token) {
return xhr.setRequestHeader('X-CSRF-TOKEN', token);
}
return xhr;
},
Upvotes: 0
Reputation: 178
That's what i use in my app:
$("#captcha-gen-button").click(function(e){
e.preventDefault();
$.ajax({
url: "/captcha-ajax",
method: "POST",
headers: { 'X-CSRF-Token' : '{!! csrf_token() !!}' }
}).done(function(image) {
$("#captcha-img-container").html(image);
});
});
Upvotes: 0