【问题标题】:CodeIgniter form_open helper via ajaxCodeIgniter form_open helper 通过 ajax
【发布时间】:2014-07-02 09:51:02
【问题描述】:

我正在使用 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);}
            });

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

【问题讨论】:

  • 我认为您的网址有问题。您可以使用浏览器控制台来跟踪 ajax 请求的错误。
  • 首先,您可以将静态值发布到您的控制器,然后检查是否发布?
  • 可能是控制器实现了一些身份验证

标签: php jquery ajax codeigniter


【解决方案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

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

有关 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'] 的名称。发布的值是文件中默认设置的值

【讨论】:

  • 我现在明白了,虽然我不想使用additionl“cookie”插件,但它到底有什么用?没有那个插件有解决方案吗?我只需要在一个地方调用这个 ajax。我不想将隐藏的数据添加到我的 ajax 中,如何检查它是什么?
  • 换句话说,我想在不使用某些 cookie 插件的情况下检查“csrf_token_name”的值(cookie 哈希)
  • 但作者声明“唯一需要的就是 jQuery 和 Cookie 插件。”我似乎在 jQuery 文档中找不到 .cookie
  • 对不起,这么快评论
  • 当前的解决方法是 ci_csrf_token: $("input[type=hidden]").val() 但只要我的表单中有 2 个或更多隐藏输入,这就会被破坏
【解决方案2】:

我觉得你的网址可能有问题,试试这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-06-14
    • 1970-01-01
    • 2011-07-14
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多