2011-08-02 43 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