【问题标题】:How do I retrieve an array of data passed from Javascript in PHP?如何在 PHP 中检索从 Javascript 传递的数据数组?
【发布时间】:2011-08-02 10:16:31
【问题描述】:

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

提前致谢

安迪

【问题讨论】:

    标签: php javascript


    【解决方案1】:

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

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

    另见

    【讨论】:

    • 我的数组是一个对象数组,每个对象都包含那组“怪异属性”——该数组可能非常大,所以我只是在寻找传递该数据的最佳方式。从您的 cmets 中,也许我选择了错误的方法来执行此操作。欢迎就如何将如此庞大的数据数组传递给 php 脚本提出建议。
    • “欢迎就如何...提出建议”请查看提供的链接,因为它们充满了 AJAX 示例
    【解决方案2】:

    输入元素的自定义属性不会传递到 $_POST。仅传递“值”属性。可能您想要一堆“隐藏”元素: 它们也将按照您的意愿“通过每个步骤”。

    【讨论】:

      【解决方案3】:

      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);
      

      但您不一定必须创建表单元素然后提交该表单才能将键=值对(或任何其他字符串)传输到服务器。您可能对类似的东西感兴趣,例如jQuery.ajax 代替。

      【讨论】:

        【解决方案4】:

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

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

        再说一次,虽然我不是 PHP 专家,但我很确定在服务器端您会收到您提交的每个输入 - 所以,如果您在这里创建一个输入,我希望您'在服务器端获取一个数组,其中包含一个值,并且该值是空字符串或 NULL(同样,不是 PHP 人),因为您从不给 ssInput 一个真正的值(值=​​'x')。如果您在服务器端甚至没有收到关于提交的变量的单个条目,请尝试将此行添加到您的 JavaScript 中,就在您的 document.createElement("INPUT") 行下方:

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

        祝你好运!

        B

        【讨论】:

          猜你喜欢
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-01
          相关资源
          最近更新 更多