0

私のフォームはクライアント側で検証されますが、サーバー側で検証されない理由を理解しようとしています。私のPHPは完全ではありませんが、フォームをサーバーに送信するというPOSTリクエストがコンソールに表示されません。

jQuery:

$(document).ready(function()
{

/*
* Validate the form when it is submitted
*/
var validateform = $("#newArticleForm").validate({
    invalidHandler: function(form, validator) {
        var errors = validator.numberOfInvalids();
        if (errors) {
            var message = errors == 1
            ? 'You missed 1 field. It has been highlighted.'
            : 'You missed ' + errors + ' fields. They have been highlighted.';
            $('.box .content').removeAlertBoxes();
            $('.box .content').alertBox(message, {type: 'warning', icon: true, noMargin: false});
            $('.box .content .alert').css({
                width: '100%',
                margin: '0',
                borderLeft: 'none',
                borderRight: 'none',
                borderRadius: 0
            });
        } else {
            $('.box .content').removeAlertBoxes();
        }
    },
    showErrors : function(errorMap, errorList) {
        this.defaultShowErrors();
        var self = this;
        $.each(errorList, function() {
            var $input = $(this.element);
            var $label = $input.parent().find('label.error').hide();
            $label.addClass('red');
            $label.css('width', '');
            $input.trigger('labeled');
            $label.fadeIn();
        });
    },
    submitHandler: function(form) {
        var dataString = $('#newArticleForm').serialize();
        $.ajax({
            type: 'POST',
            url: '/kowmanager/dashboard/articleSubmit',
            data: dataString,
            dataType: 'json',
            success:  function(data) {
                if (data.error) {
                    $('.box .content').removeAlertBoxes();
                    $('.box .content').alertBox(data.message, {type: 'warning', icon: true, noMargin: false});
                    $('.box .content .alert').css({
                        width: '',
                        margin: '0',
                        borderLeft: 'none',
                        borderRight: 'none',
                        borderRadius: 0
                    });
                }
                else
                {
                    $('.box .content').removeAlertBoxes();
                    $('.box .content').alertBox(data.message, {type: 'success', icon: true, noMargin: false});
                    $('.box .content .alert').css({
                        width: '',
                        margin: '0',
                        borderLeft: 'none',
                        borderRight: 'none',
                        borderRadius: 0
                    }); 
                    $(':input','#newArticleForm')
                    .not(':submit, :button, :hidden, :reset')
                    .val('');  
                }
            }
        });
    }
});

});

コントローラ:

function articleSubmit()
{
    $outputArray = array('error' => 'yes', 'message' => 'unproccessed');
    $outputMsg = '';
    // Sets validation rules for the login form
    $this->form_validation->set_rules('title', 'Title',
        'trim|required|xss_clean|alpha_numeric');
    $this->form_validation->set_rules('category', 'Category',
        'integer');
    $this->form_validation->set_rules('isSticky', 'Is Sticky',
        'integer');
    $this->form_validation->set_rules('comments', 'Allow Comments',
        'integer');    

    // Checks to see if login form was submitted properly
    if (!$this->form_validation->run())
    {
        $outputArray['message'] =
            'There was a problem submitting the form! Please refresh the window and try again!';
    }
    else
    {

    }
}

意見:

<?php $attributes = array('class' => 'validate', 'id' => 'newArticleForm'); ?>
            <?php echo form_open_multipart('', $attributes) ?>
                <div class="content no-padding">
                    <div class="section _100">
                        <?php echo form_label('Title', 'title'); ?>

                        <div>
                            <?php echo form_input('title', '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Category', 'category'); ?>

                        <div>
                            <?php echo form_dropdown('category', $categories, '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Is Sticky', 'sticky'); ?>

                        <div>
                            <?php 
                                                            $options = array(
                                                                        ''   => 'Please Select An Option',
                                                                        '0'  => 'No',
                                                                        '1'  => 'Yes',
                                                                     );
                                                            ?><?php echo form_dropdown('sticky', $options, '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Allow Comments', 'comments'); ?>

                        <div>
                            <?php 
                                                            $options = array(
                                                                        ''   => 'Please Select An Option',
                                                                        '0'  => 'No',
                                                                        '1'  => 'Yes',
                                                                     );
                                                            ?><?php echo form_dropdown('comments', $options, '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Date Comments Expire', 'datetime'); ?>

                        <div>
                            <input id="datetime" type="datetime" class="required" />
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Status', 'status'); ?>

                        <div>
                            <?php 
                                                            $options = array(
                                                                        ''   => 'Please Select An Option',
                                                                        '0'  => 'Inactive',
                                                                        '1'  => 'Active',
                                                                     );
                                                            ?><?php echo form_dropdown('status', $options, '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Image', 'file'); ?>
                        <div>
                            <?php echo form_upload('file', '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Permalink', 'permalink'); ?>

                        <div>
                            <?php echo form_input('permalink', '', 'class="required"'); ?>
                        </div>
                    </div>

                    <div class="section _100">
                        <?php echo form_label('Article', 'article'); ?><?php $attributes = array('name' => 'article', 'cols' => '30', 'rows' => '5', 'id' => 'article', 'class' => 'required') ?>

                        <div>
                            <?php echo form_textarea($attributes); ?>
                        </div>
                    </div>
                </div><!-- End of .content -->

                <div class="actions">
                    <div class="actions-left">
                        <?php echo form_reset(array('id' => 'reset', 'name' => 'reset'), 'Reset'); ?>
                    </div>

                    <div class="actions-right">
                        <?php echo form_submit(array('id' => 'submit', 'name' => 'submit'), 'Submit'); ?>
                    </div>
                </div><!-- End of .actions -->
            <?php echo form_close(); ?>

編集:

このjqueryを使用する他のフォームもありますが、他に何かアイデアがあるかどうか疑問に思っていますか?

4

1 に答える 1

0

私はこの問題に対する答えを知っています...そしてそれは私を夢中にさせたので、私はこれであなたを助けて幸せです:))

Codeigniter は、POST リクエストに対して非常に特別な方法で動作します。これを行い、代わりに GET リクエストを使用すると、正常に動作することがわかります...では、何が起こっているのでしょうか?

Codeigniter には、安全な方法でデータを POST するための crsf トークンがあります。したがって、この crsf 値を残りのデータと一緒に送信してください。

例を挙げます。これは私の POST ajax + codeigniter のようです:

$.ajax({
        type: 'POST',
        dataType: 'HTML',
        data: {
            somevalue : somevalue,
            csrf_test_name  : $.cookie('csrf_cookie_name')
        },

...

ご覧のとおり、crsf 値は Cookie に保存されます。私は jquery プラグインの Cookie ヘルパーを使用していますが、他のプラグインを使用するのは難しいと感じています。

ただし、「csrf_test_name」という名前は、POST リクエストを作成するときに codeigniter によって常に期待されることに注意してください。

良い1日を!


これについてもっと読みたい人のために、これは私が話していることです: http://aymsystems.com/ajax-csrf-protection-codeigniter-20

于 2012-04-11T18:11:59.647 に答える