CodeIgniter form_open通过ajax帮助

时间:2014-07-02 09:51:03

标签: php jquery ajax codeigniter

我正在使用CodeIgniter和jQuery .ajax函数将数据从我的视图发送到我的控制器并更新我的数据库。这是问题,我使用form_open()为我的表单生成代码,我需要使用它,以便在我的控制器中我可以使用表单验证库。表单验证库仅在使用“POST”方法时才有效。但是没关系。

如果我使用普通的提交按钮将表单提交给控制器,一切都会正常工作。但是我不知道在这种情况下如何使用ajax,我应该放入$.ajax({ url: ??? }); 我需要ajax将数据发布到控制器,就像我的表单中的普通提交按钮一样。我认为在我的情况下,ajax函数不像常规提交按钮那样向控制器发送请求。

这是我的表单(我按目的省略了内联样式和类):

HTML

<div class="" style="">
    <h1 id="header" class="">Login/Register</h1>
    <?php echo form_open('users/sportappregister', 'data-ajax="false"'); ?>
        <div style=""><input id="email" type="text" name="email" value="email"  style=""></div>
        <div style=""><input id="pass" type="text" name="password" value="password"  style=""></div>
        <div style="" class=""><img class="" style="" src="<?php echo img_path(); ?>ikone/fb_login_icon.png" />Login with Facebook</div>
        <div id="send" style="" class=""><input type="submit"> Submit </div>
        <div id="cancel" style="" class=""> Cancel </div>
    </form>
</div>

的jQuery

document ready etc...
$("#send").click(function() {
    $.ajax({
                url: "/public/index.php/users/sportappregister",
                type: "POST",
                data: {email: $("#email").val(), password: $("#pass").val()},
                dataType: "text",
                success:  function(msg){$("#header").css({"color":"red"}).html(msg);}
            });

我不需要向您显示我的控制器,因为那里的一切正常,问题只出现在我的表单页面中。数据未正确发布到控制器。

2 个答案:

答案 0 :(得分:1)

我认为您的问题在于表单验证,而不仅仅是AJAX。如果你将SAME url添加到你的AJAX请求中,它会在同一个地方结束(除非你明确写了一个特殊的规则来重定向AJAX,但我认为情况并非如此)。

当您直接发布(正常提交)时,您将发送所有表格内的输入。在您的情况下,我怀疑您正在尝试避免CSRF,因此,您已在配置文件(application / config / config.php)中设置了csrf_protection:

$config['csrf_protection'] = true

使用form_open时,CI会创建一个隐藏的输入,其值将在内部检查,以确保您确实是您的真实姓名。在没有AJAX的情况下提交表单时,您发送输入,但是在您的AJAX请求中,您没有发送它,因此在检查值时验证失败。关于隐藏的输入:http://ellislab.com/codeigniter/user-guide/libraries/security.html

要解决您的问题,请在表单中检查输入隐藏的内容,并将其作为$ .ajax数据属性中的var添加。

有关CSRF及其如何与CI配合使用的更多信息:Codeigniter CSRF - how does it work

更新:

来自:http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax

$(function($) {

    // this bit needs to be loaded on every page where an ajax POST may happen
    $.ajaxSetup({
        data: {
            csrf_test_name: $.cookie('csrf_cookie_name')
        }
    });

    // now you can use plain old POST requests like always
    $.post('site.com/controller/method', { name : 'Jerel' });

});

csrf_test_namecsrf_cookie_name必须是您的配置文件中$config['csrf_token_name']$config['csrf_cookie_name']设置的名称。发布的值是默认情况下在文件中设置的值

答案 1 :(得分:0)

我认为你的网址可能有问题,试试这个:

'url' : base_url + '/' + controller + '/test_add'

其中controller是您的控制器名称,test_add是控制器中的方法/函数名称。