我有一个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端检索数据。
提前致谢
安迪
答案 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");
祝你好运!
乙