2016-01-25 35 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中的日誌記錄,發現其他地方有錯誤,但沒有顯示。謝謝你的幫助。