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){

        }
    });

リンクとフォームの両方が同じビューにあります。しかし、削除するための新しい機能を追加した後、すべてが故障しました。「エラー: CSRF トークンを検証できませんでした」というメッセージが表示されるだけで、サーバーに POST 要求を行うことができません。CSRF を渡しているため、問題が見えません。firebug ログには次のように表示されます。

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 に答える