如何从PHP中检索从Javascript传递的数据数组?

时间:2011-08-02 10:16:31

标签: php javascript

我有一个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端检索数据。

提前致谢

安迪

4 个答案:

答案 0 :(得分:1)

实际上你只创建一个单独的inupt-field并为它分配一堆怪异的属性(比如“lhsName”,那是什么?它不是HTML)。请查看生成的HTML。每个变量需要一个输入。

另一方面,整个方法很奇怪。为什么不直接调用脚本并将所有变量作为JSON编码数据发布?

另见

答案 1 :(得分:1)

输入元素的自定义属性不会传递到$ _POST。仅传递“value”属性。可能你想要一堆“隐藏”元素:&lt; input type =“hidden”name =“...”value =“...”/&gt;他们也将按照你的意愿“通过每一步”。

答案 2 :(得分:1)

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

17.13.2成功控制

成功的控制对于提交是“有效的”。每个成功的控件都将control name与其current value配对,作为提交的表单数据集的一部分。

控件名称定义为

控件的“控件名称”由其name属性给出。

您的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

答案 3 :(得分:0)

我不是PHP人,但从脚本方面来说,你肯定会创建一个输入并为该输入分配属性。您也没有指定输入的类型,我有点意外并不会导致您遇到其他问题。

提交表单时,每个输入都会获得一个值。如果要提交20个值,则需要一个表单字段,您可以将参数/状态集合序列化,或者必须为每个参数创建表单字段并提交集合。

同样,虽然我不是一个PHP人,但我很确定在服务器端你会收到你提交的每个输入 - 所以再次,如果你要创建一个在这里输入,我希望你在服务器端获得一个数组,其中包含一个值,该值为空字符串或NULL(同样不是PHP人),因为你永远不会给ssInput一个真实的价值(值=&#39; x&#39;)。如果您在提交的变量方面没有获得服务器端的单一条目,请尝试将此行添加到document.createElement("INPUT")行下方的javascript中:

ssInput.setAttribute("type", "hidden");
祝你好运!