不接收Codeigniter AJAX表单中的帖子数据

时间:2016-01-25 19:47:00

标签: jquery ajax codeigniter csrf

我正在尝试通过AJAX请求向Codeigniter发布新闻稿表单。 我正在使用CSRF保护。 我有以下代码,我似乎无法获取发布的值,因此没有正确回复。 发生了几件不同的事情:

  1. 如果输入字段中有name =“email”,则CSRF失败,我得到500(内部服务器错误)
  2. 如果我将其删除,那么我将以下打印到控制台,这意味着它会转到控制器,但不会获取帖子值。 (undefined是对ajax()函数的响应

    未定义

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

  3. 如果我保留name =“email”并在ajax()的顶部执行console.log(data),那么我将值作为不同的对象获取,如下所示

    本发明的课题,本发明的课题

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

    对象名称:“email”值:“my@email.com”

  4. 我正在尝试在不同的函数中使用表单和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="name@company.com" 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(Codeigniter 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请求解释,因为这会使请求不是异步的,或者在等待响应时停止浏览器。

2 个答案:

答案 0 :(得分:1)

而不是使用:

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

使用

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

方法serialize()生成由$_POST$_GET

收到的正确表单编码

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

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

答案 1 :(得分:0)

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