我正在使用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);}
});
我不需要向您显示我的控制器,因为那里的一切正常,问题只出现在我的表单页面中。数据未正确发布到控制器。
答案 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_name
和csrf_cookie_name
必须是您的配置文件中$config['csrf_token_name']
和$config['csrf_cookie_name']
设置的名称。发布的值是默认情况下在文件中设置的值
答案 1 :(得分:0)
我认为你的网址可能有问题,试试这个:
'url' : base_url + '/' + controller + '/test_add'
其中controller
是您的控制器名称,test_add
是控制器中的方法/函数名称。