繁体   English   中英

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

[英]How do I retrieve an array of data passed from Javascript in 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端检索数据的方法。

提前致谢

安迪

实际上,您只创建了一个inupt字段,并为其分配了一堆怪异的属性(例如“ lhsName”,那是什么?不是HTML)。 请查看生成的HTML。 每个变量需要一个输入。

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

也可以看看

输入元素的自定义属性不会传递到$ _POST中。 仅传递“值”属性。 可能您需要一堆“隐藏”元素:<input type =“ hidden” name =“ ...” value =“ ...” />您也可以根据需要将它们“传递给每个步骤”。

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

17.13.2成功的控制

成功的控件对于提交是“有效的”。 每个成功的控件都有其控件名称和其当前值,作为提交的表单数据集的一部分。

控件名称定义为

控件的“控件名称”由其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); 

但是您不必一定要创建一个form元素,然后提交该表单即可将key = value对(或任何其他字符串)传输到服务器。 您可能对诸如jQuery.ajax之类的东西感兴趣。

我不是PHP专家,但是从脚本方面来说,您肯定是在创建一个输入并将属性分配给该输入。 您也没有指定输入的类型,令我感到惊讶的是,它不会给您带来其他问题。

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

再一次,虽然我不是PHP专家,但我可以肯定的是,在服务器端,您将收到您提交的每个输入-因此,如果您在此处创建一个输入,那么我希望您能得到服务器端的数组,其中包含单个值,并且该值是空字符串或NULL(同样,不是PHP专家),因为您永远不会为ssInput提供真实值(值='x')。 如果就提交的变量而言,即使在服务器端您甚至都没有获得任何条目,请尝试在document.createElement("INPUT")行下方的JavaScript中添加以下行:

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

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM