0

我完全不明白为什么会发生这种情况,我已经搞砸了几个小时,我快疯了!当复选框被打开或关闭时,我正在尝试更新我的数据库。如果我正在调用的 PHP 函数为空,则成功响应有效,但每当我添加 PHP 时都会失败。注意我在 Laravel 3 上,我尝试启用或禁用 CSRF 过滤,但没有运气。

我的 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');
                }

            }
        });

    });
});

我的 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 的刀片模板,其中 {{ }} 括号只是回声,@foreach 是 a )

@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 回答
1

data应该是这样的对象

data: {"seen": checkVal, "reminder_id": id, "csrf_token": _csrf},

$.ajax 方法将负责呈现和传输。

于 2013-09-24T21:49:47.733 回答