divHelper11
divHelper11

Reputation: 2208

Laravel 5.3 - jquery ajax (internal server error 500)

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

Answers (3)

Zakaria Acharki
Zakaria Acharki

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 WHEREid= ? :

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

piotr
piotr

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

Jacopo Beschi
Jacopo Beschi

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

Related Questions