2011-08-02 42 views
1

我有一個Javascript函數將數組數組傳遞給PHP文件。我的javascript上飛創建了一個形式如下如何檢索從PHP中的Javascript傳遞的數據數組?

function SaveFileToDisk(filename) 
{ 
    var ssForm = document.createElement("form"); 
    ssForm.method="post" ; 
    ssForm.action = "saveScenario.php" ; 
    ssForm.target = "hiddenSaveScenarioStatusFrame"; 

    for (var i = 0; i < ScriptSteps.length; i++) 
    { 
     var ssInput = document.createElement("input"); 
     ssInput.setAttribute("filename", filename); 
     ssInput.setAttribute("timestamp", ScriptSteps[i].timestamp); 
     ssInput.setAttribute("lhsName", ScriptSteps[i].lhsName); 
     ssInput.setAttribute("lhsPort", ScriptSteps[i].lhsPort); 
     ssInput.setAttribute("lhsBandwidth", ScriptSteps[i].lhsBandwidth); 
     ssInput.setAttribute("lhsDelayMin", ScriptSteps[i].lhsDelayMin); 
     ssInput.setAttribute("lhsDelayMax", ScriptSteps[i].lhsDelayMax); 
     ssInput.setAttribute("lhsDropLoss", ScriptSteps[i].lhsDropLoss); 
     ssInput.setAttribute("lhsFilters", ScriptSteps[i].lhsFilters); 
     ssInput.setAttribute("lhsDefaultFilter", ScriptSteps[i].lhsDefaultFilter); 
     ssInput.setAttribute("rhsName", ScriptSteps[i].rhsName); 
     ssInput.setAttribute("rhsPort", ScriptSteps[i].rhsPort); 
     ssInput.setAttribute("rhsBandwidth", ScriptSteps[i].rhsBandwidth); 
     ssInput.setAttribute("rhsDelayMin", ScriptSteps[i].rhsDelayMin); 
     ssInput.setAttribute("rhsDelayMax", ScriptSteps[i].rhsDelayMax); 
     ssInput.setAttribute("rhsDropLoss", ScriptSteps[i].rhsDropLoss); 
     ssInput.setAttribute("rhsFilters", ScriptSteps[i].rhsFilters); 
     ssInput.setAttribute("rhsDefaultFilter", ScriptSteps[i].rhsDefaultFilter); 
     ssForm.appendChild(ssInput) ; 
    } 
    document.body.appendChild(ssForm) ; 
    ssForm.submit() ; 
    document.body.removeChild(ssForm) ; 
} 

但是,當我寫我的PHP腳本,我希望找到在$ _POST變量數組,並認爲我會得到包含上述陣列中的每個元素字段和相應的數據。當我查看PHP腳本中的$ _POST數組的大小時,它會顯示爲零。我做錯了什麼,或者我是否在使用錯誤的方法來做這種事情。另外,我真的只需要傳一遍文件名,但最簡單的方法就是將它傳遞給數組的每個元素。有沒有更好的方法,以便文件名被傳遞一次,併爲每個「步驟」傳遞剩餘的字段?曾經通過網絡瞭解將數據從Javascript傳遞到PHP的想法 - 似乎有很多方法,其中之一就是我嘗試過的方式,但沒有解釋檢索PHP方面的數據。

在此先感謝

安迪

回答

1

其實你只創建一個單一的inupt場和一羣奇特的屬性分配給它(如「lhsName」,那是什麼?這不是HTML) 。請看看最終的HTML。每個變量需要一個輸入。

另一方面,整個方法很奇怪。你爲什麼不調用腳本並將所有變量作爲JSON編碼數據發佈?

又見

+0

我的數組是一個對象數組,每個對象都包含一組「怪異屬性」 - 數組可能相當大,所以我只是尋找傳遞數據的最佳方式。從您的意見,也許我選擇了錯誤的方式來做到這一點。將歡迎關於如何將這麼多數據傳遞給php腳本的建議。 –

+0

「歡迎提供關於如何......的建議」請查看提供的鏈接,因爲它們充滿了AJAX示例 – feeela

1

輸入元素的自定義屬性不會傳遞到$ _POST。只傳遞「value」屬性。可能你想要一堆「隱藏」元素:< input type =「hidden」name =「...」value =「...」/ >它們也將按照您的意願「傳遞給每一步」。

0

我不是一個PHP的人,但從腳本方面來說,您肯定會創建一個輸入併爲該輸入分配屬性。你沒有指定輸入的類型,我有點驚訝不會導致你另外的問題。

當您提交表單時,您會得到每個輸入的值。如果你想提交20個值,你可能需要一個表單字段,你可以序列化你的參數/狀態集合,或者你必須爲每個參數創建一個表單字段並提交集合。

同樣,雖然我不是一個PHP傢伙,但我確信在服務器端你會得到你提交的每個輸入 - 如果你在這裏創建一個輸入,我期望你在服務器端獲得一個數組,其值是一個空字符串或NULL(再次,不是PHP人),因爲你永遠不會給ssInput一個實際值(值='x')。如果你沒有得到與提交關於變量在服務器端,甚至一個單一的入口,嘗試加入這一行你的JavaScript正下方的document.createElement("INPUT")行:

ssInput.setAttribute("type", "hidden"); 

祝你好運!

1

http://www.w3.org/TR/html401/interact/forms.html#submit-format說:

17.13.2成功控制

一個成功的控制是提交 「有效」。每個成功的控件都將其control name與其current value配對,作爲提交的表單數據集的一部分。

而控件名稱定義爲

控件的「控件名稱」由其名稱屬性給出。

您的 input元素沒有 name屬性,也沒有 type(也沒有值)。
你會需要更多的東西一樣

for (var i = 0; i < ScriptSteps.length; i++) 
{ 
    var ssInput; 
    ssInput = document.createElement("input"); 
    ssInput.setAttribute("type", "hidden"); 
    ssInput.setAttribute("name", "x["+i+"][timestamp]"); 
    ssInput.value = ScriptSteps[i].timestamp; 
    ssForm.appendChild(ssInput) ; 

    ssInput.setAttribute("lhsName",); 
    ssInput = document.createElement("input"); 
    ssInput.setAttribute("type", "hidden"); 
    ssInput.setAttribute("name", "x["+i+"][lhsName]"); 
    ssInput.value = ScriptSteps[i].lhsName; 
    ssForm.appendChild(ssInput); 

但你不一定要創建一個表單元素,然後提交該表格以key = value對(或者其他任何字符串)傳輸到服務器。您可能對某些內容感興趣,例如改爲jQuery.ajax