0

我的脚本中有一个由 ajax 提交的表单,如下所示:

jQuery.ajax({
        url:jQuery('form',modal).attr('action'),
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        type:'post',
        data: {
            email:jQuery('input[name="email"]',modal).val(),
            something:jQuery('input[name="something"]',modal).val(),
            level:jQuery('select[name="level"]',modal).val(),
            YII_CSRF_TOKEN: jQuery('input[name="csrf"]').val()
        },
        success: function(data){
            jQuery('.message',modal).html(data.message).slideDown();
            if (!data.success){
                jQuery('input[name="email"]',modal).addClass('error');
            } else {
                jQuery('input[name="email"]',modal).removeClass('error');
            }
        }
    });

一切都很好。然后今天我正在编写用于从数据库中删除项目的新函数。所以我编写了我的 php 函数(没有什么特别复杂的),并通过单击链接向它添加了 jQuery ajax 调用:

// ajax request
    jQuery.ajax({
        url:jQuery(this).attr('href'),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        type:'post',
        data: {
            something:jQuery(this).attr('alt'),
            YII_CSRF_TOKEN:jQuery('input[name="csrf"]').val()
        },
        success: function(data){

        }
    });

链接和表单都在同一个视图中。但是在添加了删除一切的新功能之后,一切都崩溃了。我无法向服务器发出任何 POST 请求,只是出现“错误:无法验证 CSRF 令牌”。当我通过 CSRF 时,我看不到问题所在。萤火虫日志显示:

YII_CSRF_TOKEN  bf6d9bf62ee96f32e34a74244baca7f2f1bdd569
something   4

我可能理解新功能由于任何原因都不起作用,但是为什么其他功能也发生故障,我无法理解。

4

1 回答 1

1

我已经弄清楚了问题所在,并认为我会与您分享。当然,这是非常微不足道的。

在 PHP 函数(操作)中,流程正在进行,每次遇到问题/非预期结果(记录不存在等)时,它都会返回如下内容:

if (empty($user)){
    echo json_encode(array('success'=>0,'message'=>'User does not exist'));
    return false;
}

我想你们中的一些人已经看到了我的错误。问题是一旦你

return false;

Yii 自动返回消息“Invalid Request”。因此,无论您是否在服务器端一切都做得很好,您必须始终返回 true。所以

if (empty($user)){
    echo json_encode(array('success'=>0,'message'=>'User does not exist'));
    return true;
}

按预期工作。

对于消息“错误:无法验证 CSRF 令牌”的问题。我仍然不明白问题是什么,但也找到了解决方案。我已经意识到这条消息是在第一个实例中返回的,我对 $_POST 变量执行任何操作。因此,我在行动开始时所做的是:

$post = $_POST;

可能不是完美的解决方案,但它确实有效。

于 2012-10-13T00:08:26.750 回答