0

I'm completely puzzled to why this happens, I've been messing on this for a few hours and I'm going crazyyyy! I am trying to update my DB when a checkbox is toggled on or off. The success response works if my PHP function I'm calling is empty, but fails whenever I add PHP. Note I'm on Laravel 3, and I've tried enabling or disabling CSRF filtering, no luck.

My JS:

$seenTD = $('td.seen_by_user');
$seenTD.each(function() {
    $this = $(this);
    var $seenLabel = $this.find('label');
    var $seenInput = $this.find(':checkbox');

    $seenInput.change(function() {

        var _csrf = $('input[name="csrf_token"]').val();
        var chkName = $(this).attr('name');
        var checkVal = $(':checkbox[name='+chkName+']').prop('checked'); //true or false
        var id = $this.find('input[name="reminder_id"]').val();
        $.ajax({
            url:  'update',
            type: 'POST',
            data: 'seen='+checkVal+'&reminder_id='+id+'&csrf_token='+_csrf,

            success: function(data) {
                console.log(data);

                if($seenInput.is(':checked')) {
                    $seenLabel.removeClass('unchecked').addClass('checked');
                    $seenLabel.find('span').text('Oui');
                }
                else {
                    $seenLabel.removeClass('checked').addClass('unchecked');
                    $seenLabel.find('span').text('Non');
                }

            }
        });

    });
});

My PHP

public function post_update() {

    $request = Request::instance();
    $content = $request->getContent();

    $id = $content['id'];
    $seen = $content['seen'];

    if($seen == 'true') {
        $seen = 1;
    }
    if($seen == 'false') {
        $seen = 0;
    }

    DB::table('reminders')->where('id', '=', $id)->update(
        array(
            'seen_by_user' => $seen
        ));
}
4

2 に答える 2

2

おそらく誰かを助けるために、これが私の最初の動作する AJAX であるため、どのように動作するようになったかを説明し、動作するコードを提供します。私はこれが最善の方法であると主張しているわけではないので、誰かが言いたいことがあれば、躊躇しないでください:)

データベースの更新に必要な行 ID を返す Javascript の不一致から、PHP 関数、POST データの取得方法まで、複数の問題がありました。

それを機能させるために、私は Fiddler で遊んで、Laravel がスローするエラー メッセージを取得しました。そして、そこからデバッグできました:)

私の作業コードは次のとおりです。

JS:

$('td.seen_by_user :checkbox').change(function() {

    $this = $(this);
    var $label = $this.siblings('label');
    var id = $this.attr('data-id');
    var _csrf = $this.siblings('input[name="csrf_token"]').val();
    var value = $this.prop('checked');

    $.ajax({
        url:  'update',
        type: 'POST',
        data: {"seen_by_user": value, "id": id, "csrf_token": _csrf},

        success: function(data) {

            if($this.is(':checked')) {
                $label.removeClass('unchecked').addClass('checked');
                $label.find('span').text('Oui');
            }
            else {
                $label.removeClass('checked').addClass('unchecked');
                $label.find('span').text('Non');
            }

        }
    });

});

PHP

function post_update() {
    $id = $_POST['id'];
    $seen = $_POST['seen_by_user'];

    if($seen == 'true') {
        $seen = 1;
    }
    if($seen == 'false') {
        $seen = 0;
    }

    $update_reminder = DB::table('reminders')->where('id', '=', $id)->update(
        array('seen_by_user' => $seen));
}

そして、私の HTML (Laravel の Blade テンプレート。ここで、{{ }} ブラケットは単なるエコーで、@foreach は )

@foreach ($reminders as $reminder)
    ...
    <td class="seen_by_user">
        <form class="ajax" action="update" method="POST">
            {{ Form::token() }}
            {{ Form::checkbox('seen_'.$reminder->id, 1, $reminder->seen_by_user, array('id' => 'seen_'.$reminder->id, 'data-id' => $reminder->id)) }}
            <label class="seen {{ ($reminder->seen_by_user == 1 ? 'checked' : 'unchecked' ) }}"for="{{ 'seen_'.$reminder->id }}"><i class="read"></i><span>{{ ($reminder->seen_by_user == 1 ? 'Oui' : 'Non') }}</span></label>
        </form>
    </td>
    ...
@endforeach
于 2013-09-25T15:22:54.913 に答える