【问题标题】:AJAX throws error 500 only when PHP function is empty仅当 PHP 函数为空时,AJAX 才会抛出错误 500
【发布时间】:2013-09-30 06:52:40
【问题描述】:

我完全不明白为什么会发生这种情况,我已经搞砸了几个小时,我快疯了!当复选框被打开或关闭时,我正在尝试更新我的数据库。如果我正在调用的 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
        ));
}

【问题讨论】:

  • public function post_update() { 应该是 function post_update() { 我相信。仅当它是类中的函数时才使用 public。这将导致您的脚本出现解析错误和 500 错误。
  • 修复后,无论是否公开都可以使用。但是,我不确定其中的区别。

标签: php jquery ajax laravel laravel-3


【解决方案1】:

为了可能对某人有所帮助,因为这是我的第一个工作 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

【讨论】:

  • 什么具体解决了您的问题?如果您只发布更改会更有帮助。
【解决方案2】:

data应该是这样的对象

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

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

【讨论】:

  • 谢谢 :) 很大的帮助,但不是我的最后一个问题。与提琴手一起玩,可以看到服务器错误消息,我的函数缺少参数,然后不得不弄乱 js 和 html 以获得唯一的名称,因为 db 会更新,但它不会选择正确的行,删除隐藏字段并改用 html5 数据,我的第一个工作 AJAX,耶!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多