2009-09-21 244 views
0

我的大腦在編碼10個小時後被炸,所以我需要一些幫助。需要關聯數組的幫助

我用下面的函數來獲取從表單提交的數據(之前我處理這些數據,驗證輸入等):

// All form fields are identified by '[id]_[name]', where 'id' is the 
    // identifier of the form type. Eg. brand, store etc. 
    // The field identifier we want to return is just the name and not the id. 
    public function getFormData() { 
    $formData = array(); 
    foreach ($_POST as $key => $value) { 
     $name = preg_replace('!.*_!', '', $key); 
     if (is_array($value)) { 
     $formData[$name] = implode(',', $value); 
     } else { 
     $formData[$name] = $value; 
     } 
    } 
    return $formData; 
    }  

現在,我提交使用AJAX的形式,所以我無法再使用此功能。

我的$ _ POST [ 'FORMDATA']字符串看起來像這樣(短版):

"store_name=My+new+store&store_street1=Some+address&store_zipcode=1188" 

我的目標是能夠執行下面的代碼:

echo $formData['name'] //Displays 'Some address' 

我的jQuery代碼看起來是這樣的:

function processRegistration() 
    { 

    var formData = jQuery('#registerStore form').serialize(); 

    jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData }, 
     function(data) 
     { 
      alert('some test data here'); 
     },"json"); 

我怎樣才能改變我的函數從一個Ajax處理數據的呼喚嗎?

+2

爲什麼你認爲只是因爲請求是通過AJAX進入請求你不能使用你的功能? – timdev 2009-09-21 00:10:01

+0

我可以問一下{instance:'processRegistration'...是爲了什麼嗎? – andho 2009-09-22 12:41:41

+0

@andho - 我使用了很多需要調用一些PHP代碼的jQuery。我只使用一個php文件,而不是每個jQuery調用都有一個文件。但爲了在文件中執行正確的功能,我需要一個標識符。 'processRegistration'是執行註冊過程的函數的名稱。 – Steven 2009-09-22 17:41:46

回答

1

我注意到,您的使用:

jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData }, 

在你的代碼,這將最有可能輸出:

instance=processRegistration&formData=field1=value1&field2=value2 

那麼什麼PHP腳本將得到的是:

$_POST = array(
    'instance'=>'processRegistration', 
    'formData'=>'field1=value1', 
    'field2'=>'value2 
); 

編輯:這是因爲序列化的對象將創建一個準備發送的查詢字符串,然後將其放入數據參數的對象中。
data參數可以接受來自類似jquery.fn.serialize的鍵/值對象或查詢字符串。
http://docs.jquery.com/Ajax/jQuery.post
所以,如果你改變這一行可能:

jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData }, 

..to ..

jQuery.post("mypath/jquery_bll.php", formData + '&instance=processRegistration', 

,將工作

+0

是的,正確觀察。我剛剛找到一個頁面,這將幫助我解決我的問題:http://www.frankmaulit.com/2008/06/12/handling-jquery-serialize-on-the-backend-with-php/ – Steven 2009-09-21 17:47:27

+0

感謝您的upvote ,現在我可以評論:D – andho 2009-09-22 12:56:24

3

如果您使用$.post()則沒有區別。這只是一個POST請求。

+0

同意。但$ .post正在調用jquery_bll.php並添加一個POST可變「實例」。因此,「foreach($ _POST as $ key => $ value)」將包含'實例'。我只想要$ _POST ['formData']中的數據。用$ _POST ['formData']替換$ _POST不起作用。 – Steven 2009-09-21 16:51:02

0

ajax調用和來自瀏覽器的常規調用之間沒有功能差異。

因此,要回答...

$formData = getFormData(); 
echo $formData['name']; 
0

如果你是開放使用的插件,你可以用這個小插件,雖然它不具備的jQuery插件回購

$.params2json = function(d) { 
    if (d.constructor != Array) { 
     return d; 
    } 
    var data={}; 
    for(var i=0;i<d.length;i++) { 
     if (typeof data[d[i].name] != 'undefined') { 
      if (data[d[i].name].constructor!= Array) { 
       data[d[i].name]=[data[d[i].name],d[i].value]; 
      } else { 
       data[d[i].name].push(d[i].value); 
      } 
     } else { 
      data[d[i].name]=d[i].value; 
     } 
    } 
    return data; 
}; 

您可以使用下面的代碼與插件:

function processRegistration() 
{ 
    var formData = $.params2json($('#registerStore form').serializeArray()); 
    formData.instance = 'processRegistration'; 
    $.post('mypath/jquery_bll.php', formData, 
    function(data) { 
     alert('some test data here'); 
    }, "json"); 
    }); 
}