2016-01-25 98 views
0

我试图通过AJAX请求实现发布到Codeigniter的新闻稿表单。 我正在使用CSRF保护。 我有以下代码,我似乎无法获得发布的值,因此没有正确回应。 几种不同的事情发生了:不接收Codeigniter AJAX表格中的发布数据

  1. 如果我在输入字段名=“电子邮件”时,CSRF失败,我得到500(内部服务器错误)
  2. 如果我离开它,然后我得到下面打印到控制台意味着它确实去控制器但不提取后值。 (undefined是在阿贾克斯()函数

    不确定响应

    对象{状态: “错误”,邮件: “请填写正确的邮箱地址”,邮件: “电子邮件:”}

  3. 如果我把名字=“电子邮件”,并做了Ajax的顶部的console.log(数据)(),然后我得到的值不同的对象,像这样

    [对象],[对象]

    对象名称:“csrf_test_name”值:“e31943d629f0a47d449f21997c220446 “

    对象名称:‘邮件’值:‘[email protected]

我想有秩序的形式和不同功能的AJAX请求只写一遍表单处理程序当我做出新的形式时。

任何人都可以指出我做错了什么?我相信在序列化时有些格式是我不明白的。目前我只登录到控制台,因为我迷失在错误的位置。

HTML

<form role="form" id="subscriber_form"> 
    <input id="csrf" type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>"/> 
    <div class="alert hidden" id="returnmessage"> 
    </div> 
    <div class="form-group form-group-default input-group"> 
     <label>Email address</label> 
     <input type="email" id="email" name="email" class="form-control" placeholder="[email protected]" required /> 
    </div> 
    <button id="subscribe_submit" class="btn btn-success btn-block" type="button">Subscribe!</button> 
</form> 

使用Javascript(JQuery的1.11.1)

function ajaxSubmit(form,url,data){ 
    console.log(data); 
    $.ajax({ 
    type: 'POST', 
    url: url, 
    dataType: 'JSON', 
    data: data, 
    success: function (response) { 
     console.log(response); 

    } 
    }); 
} 

$('#subscribe_submit').click(function(e){ 
    e.preventDefault(); 

    var form = '#subscriber_form'; 
    var url = 'subscribers/save_subscriber'; 
    var data = $(form).serializeArray(); 

    var response = ajaxSubmit(form, url, data); 

    console.log(response) 
}); 

PHP(笨3.0)

function save_subscriber(){ 

    $data = array(
     'email' => $this->input->post('email'),    
     'created' => date('Y-m-d H:i:s') 
    ); 

    $success_response = array(
     'status' => 'success', 
     'message'=> 'You now subscribe to our newsletter' 
    ); 
    $error_response = array(
     'status' => 'error', 
     'message'=> 'Please fill in a correct email address', 
     'email' => " Email: ". $data['email'] 
    ); 
    $valid_email = validate_email($data['email']); 
    if ($data['email'] != "" && $valid_email == TRUE) {   
     $this->_insert($data); 
     $response = $success_response; 
    } 
    else{ 
     $response = $error_response; 
    } 
    echo json_encode($response); 

} 

而且我试图用ajaxSetup和JQuery的cookie设置它,但没有成功,因为我无法将数据导入函数。我认为这是全球性的。

$.ajaxSetup({ 
    data: { 
     "csrf_test_name": $.cookie('csrf_cookie_name') 
    } 
}); 

编辑 我已经部分解决了这个。我打开日志记录

$config['log_threshold'] = 2; 

并发现我从CI 2.0复制的模型中有错误。这解决了获取帖子值的问题。

拟订一项 我也意识到,我不能做什么,我与AJAX请求解释上面,因为那会要么使该请求没有异步或失速的浏览器,同时等待响应。

+0

url定义在哪里?显示 –

+0

URL是以表单处理程序var url ='subscribers/save_subscriber'定义的;如果我从表单中删除了'name ='email'',那么我会得到这个响应,而不会有任何服务器错误。 '对象{状态:“错误”,消息:“请填写正确的电子邮件地址”,电子邮件:“电子邮件:”}'它只是没有收到控制器中的发布值。 – nicolaib

+0

without'base_url'你不能调用站点路径 –

回答

1

代替使用:

var data = $(form).serializeArray(); 

使用

var data = $(form).serialize(); 

方法serialize()产生由$_POST$_GET接收适当形式的编码

serializeArray()创建完全不同的结构,如:

[ 
    { 
    name: "email", 
    value: "1" 
    }, 
    { 
    name: "password", 
    value: "2" 
    } 
] 
+0

“serialize”vs“serializeArray”的选择不是答案。这种选择不会以任何方式影响结果**。事实上,如果你看看jQuery源代码,你会发现'serialize()'做的第一件事就是调用'serializeArray()'。 – DFriend

+0

@DFriend你有权发表你的观点,然而这个数组必须循环访问每个'name/value',而不是自动获得名称作为$ _POST或$ _GET的键。 'serialze()'将数据编码为额外的步骤,以与默认浏览器提交过程完全相同的格式发送数据。另请注意,'serilalizeArray()'需要递归重构所有在表单控件中设置为数组表示形式的名称 – charlietfl

+0

这里是从jquery.js中'serialize'的完整源代码'serialize:function(){return jQuery.param (this.serializeArray()); \t},''jQuery.param'函数实际上完成了创建查询字符串的工作。如果你看看'ajax'函数的源代码,你会发现如果'data'不是一个字符串,它会调用'jQuery.param'。因此,选择'serialize'或'serialzeArray'来获得'data'没有任何区别。无论哪种方式,正确格式化的数据将被发送到服务器。你的答案对结果没有影响。 – DFriend

0

问题已解决。答案与问题没有直接关系。我打开Codeigniter中的日志记录,发现其他地方有错误,但没有显示。谢谢你的帮助。