【问题标题】:Sending a form with variable number of fields with AJAX, $_POST array is empty使用 AJAX 发送具有可变数量字段的表单,$_POST 数组为空
【发布时间】:2012-11-25 17:10:10
【问题描述】:

我正在尝试使用 post 方法将表单数据发送到 PHP 脚本。因为字段的数量和名称是可变的,所以我遍历 $_POST 数组。当将表单“直接”发送到 PHP 文件时,它工作得很好,但是由于不同的原因,我需要/想要让 PHP 脚本在后台运行,而不需要重新加载表单的页面。所以我尝试使用 AJAX...但是在执行脚本时 $_POST 数组是空的。

这是我用来简单地回显表单输入的 PHP 文本脚本 (process_form_fields.php):

echo "DEBUG: Script Output start.<br />";
foreach($_POST as $name => $value)
{
    echo "DEBUG: $name = $value <br />";
}
echo "DEBUG: End of script output.<br />";

sdection 中的 JavaScript / AJAX 代码如下所示:

<script type="text/javascript" language="javascript">
    xmlhttp = new XMLHttpRequest();

    function process_form()
    {
        xmlhttp.onreadystatechange =
        function()
        {
            if(xmlhttp.readystate == 4)
            {
                document.getElementById("status_message_box").innerHTML = xmlhttp.responseText;
            }
            else
            {
                document.getElementById("status_message_box").innerHTML = "<i>loading (status:" + xmlhttp.status + xmlhttp.responseText + ")</i>";
            }
        }
        xmlhttp.open("POST", "http://mydomain.com/modules/process_form_fields.php", true);
        xmlhttp.send();
    }
</script>

这就是表单的样子:

<form action="process_form_fields.php" method="post" class="niceform">
<input type="submit" value="submit">
<div class="set_options">
    <dl>
        <dt>
            <label for="1">Option 1:</label>
        </dt>
        <dd>
            <select size="1" name="Option 1" id="Option 1">
                <option value="Alpha">Alpha (1pt)</option>
                <option value="Beta">Beta (5pt)</option>
                <option value="Gamma">Gamma (20pt)</option>
            </select>
        </dd>
    </dl>
    <dl>
        <dt><label for="2">Option 2:</label></dt>
        <dd>
            <select size="1" name="Option 2" id="Option 2">
                <option value="Red">Red (0pt)</option>
                <option value="Blue">Blue (0pt)</option>
            </select>
        </dd>
    </dl>
    <dl>
        <dt>
            <label for="3">Option 3:</label>
        </dt>
        <dd>
            <select size="1" name="Option X" id="Option X">
                <option value="Foo">Foo (-5pt)</option>
                <option value="Bar">Bar (42pt)</option>
            </select>
        </dd>
    </dl>
</form>

将表单直接发送到 PHP 文件会创建以下输出,就像它应该的那样:

DEBUG: Script Output start.
DEBUG: Option 1 = Alpha (1pt)
DEBUG: Option 2 = Blue (0pt)
DEBUG: Option X = Bar (42pt)
DEBUG: End of script output.

使用上面的AJAX输出只是:

DEBUG: Script Output start.
DEBUG: End of script output.

我想我可能在这里遗漏了一些简单的东西,但我太盲目了,无法将手指放在上面。我希望有人能指出我正确的方向。 重要的是 HTML 表单具有可变数量的字段,并且这些字段不以任何方式编号/序列化(可能是“选项 1”、“选项 2”、“最喜欢的黄色香蕉形状水果”和“年龄”例如)。

谢谢

【问题讨论】:

  • 您的 ajax 请求似乎根本没有传递任何数据!

标签: php javascript ajax forms


【解决方案1】:

您没有使用 ajax 请求发送数据,这应该可以:

 var dataString = $('form').serialize();
    xmlhttp.send(dataString);

【讨论】:

  • 这有点奇怪。如果是关于使用 jQuery,请使用 $.ajax。如果是学习原生方式,不要使用jQuery。
【解决方案2】:

您的请求并未发送任何数据! XMLHttpRequest 不会自动捕获表单数据。您必须明确说明要传递的变量。您必须使用 javascript 来捕获表单字段的值,将它们串入查询中,然后使用 xmlhttp.send() 将其传递给您的 PHP 脚本。

尝试类似:

xmlhttp.open("POST","http://mydomain.com/modules/process_form_fields.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("option1=A&option2=B&option3=C");

【讨论】:

  • 感谢您的快速回答,这对我来说实际上很有意义(刚开始涉足 JS 和 Ajax)。但是,我从您的回答中想到了一个后续问题:如何为 xmlhttp.send("option1=A&option2=B&option3=C"); “生成” Parameter-String线?如何确保它只获取表单内的输入字段(网站上可能有其他表单字段,如登录名等)并确保它还包括 type=hidden 字段?谢谢。
  • @Kodekan,你必须给你的表单字段一个类或其他东西,然后遍历 DOM 并选择它们。一个可以轻松进行 DOM 遍历和选择的库将使事情变得容易得多,比如 jQuery。如果你使用 jQuery,你可以使用它内置的 .serialize() 方法将表单字段序列化为查询字符串,而不会有任何麻烦。
【解决方案3】:

To POST data like an HTML form, add an HTTP header with setRequestHeader(). Specify the data you want to send in the send() method:.
在你的情况下,send(); 是空的,这就是为什么你得到一个空的 $_POST 数组

【讨论】:

    【解决方案4】:

    jquery 可以避免这种复杂且难以调试的代码。

    使用这样的东西:

    $.ajax({
      url: "test.html",
      data: {data:yourdata}
    }).done(function() { 
        //your success function
    });
    

    就是这样。

    【讨论】:

    • 感谢您的提示,为了方便起见,我以后可能会使用 jQuery,但是现在这个小项目是为了让我学习 JS/AJAX,所以我试着让它努力工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2013-06-21
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多