如何将 $_POST 从 HTML 脚本传递到 PHP(出现“未定义索引”错误)

How to pass $_POST from HTML script to PHP (getting "Undefined index" error)

提问人:GCOR71 提问时间:9/10/2020 最后编辑:GCOR71 更新时间:9/10/2020 访问量:295

问:

在一遍又一遍地讨论这个问题几个小时后,完全感到困惑。尝试了大量的方法,但没有成功。

目的是将登录表单数据发送到 PHP,并让 PHP 返回 API 调用的结果。

我的最新方法是在调用中使用 onSubmit 表单,该表单执行 POST 调用以进行某些服务器端处理。将来,PHP 将返回 API 密钥。在我的测试中,我剥离了 PHP,以支持从 $_POST 全局中提取的用户输入。login.htmlmyFunction()n_authorise.phpecho

无论我尝试哪种形式的 ACTION / SUBMIT 或 XMLHttpRequest 结构组合,我似乎都无法将 $_POST 从 HTML 传递到 PHP。我反复从 PHP 中得到“未定义索引”,建议未填充 $_POST。

我尝试过 action=“n_authorise.php” 直接以形式(避免)进行,但这要么失败,要么在工作时将 PHP 文件加载到浏览器,而不仅仅是返回结果。myFunction()

我感到非常沮丧,因为这是可能的,我可以从其他帖子中看到他们遇到(并解决了)类似的问题......我就是破解不了,所以问问专家吧!提前致谢。

我的 HTML 在文件 login.html 中:

<html>
  <head>
    <script>
      function myFunction() {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function () {
          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            alert(xmlhttp.responseText);
          }
        };
        xmlhttp.open("post", "n_authorise.php", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send();
      }
    </script>
  </head>

  <body>
      <form name="loginform" onsubmit="myFunction()" method="post">
      <input type="text" name="t_username" id="t_username" placeholder="Username" required autofocus>
      <input type="password" name="t_password" id="t_password" placeholder="Password" required>
      <input name ="submit" type="submit" value="submit">
      </form>
  </body>
</html>

我的最小PHP在文件中n_authorise.php

<?php
$email = $_POST["t_username"];
$password = $_POST["t_password"];
echo $email . " " . $password;
?>

预期结果是警报框显示输入的电子邮件和密码(这将在最终版本中被替换)。

注意:我试过有和没有.事实上,我想我已经尝试了几乎所有可能的代码组合,但没有成功......还。xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

php html xmlhttprequest 未定义索引

评论

1赞 Baracuda078 9/10/2020
我想你错过了一些东西,请阅读这个: w3schools.com/xml/ajax_xmlhttprequest_send.asp 在 PHP 中也使用 isset 函数来防止未定义的错误
1赞 john Smith 9/10/2020
您没有向 xmlhttp 请求添加任何参数....
0赞 GCOR71 9/10/2020
@Baracuda078 - 这是我读过的众多来源之一(多次),但我看不到我错过了什么。一旦我知道我可以让这个最简单的示例工作,就会添加 isset 函数。
1赞 Baracuda078 9/10/2020
您需要在 ' xmlhttp.send();“ 函数中添加您要发送的数据,就像在 w3schools 上的 post 请求示例中一样,希望这对您有所帮助
0赞 GCOR71 9/10/2020
@johnSmith - 谢谢 - 我想在 PHP 中使用 $_POST 全局。如何确保它被传递(我知道它不能在客户端访问)?

答:

1赞 john Smith 9/10/2020 #1

这是一个最简单的答案:

您没有向请求添加任何参数,您可以使用本机 JS 进行如下操作:

var form = document.querySelector('form'); // <-- extend this to select your form, maybe add an id to select
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);  // <----- this way the form data is appended

评论

0赞 GCOR71 9/10/2020
明!就是这么简单。+1 回答!谢谢!!
0赞 Baracuda078 9/10/2020
@GCOR71 您的表单标签可以具有唯一的类名或 ID,如果您不使用它并且您的页面上有多个表单,则 queryselector('form') 将获取所有表单或仅获取第一个表单(我不确定) 将 id 添加到您的表单标签中,就像您在选择器中使用的那样id="form1"#form1
0赞 GCOR71 9/10/2020 #2

基于上述内容 - 分享工作代码,并表示感谢。仅供参考:

<html>
  <head>
    <script>
      function myFunction() {
        var form = document.querySelector('form.loginform');  // <-------- extended to select new class ID for form
        var data = new FormData(form);  // <-------- 'data' extracts form content
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function () {
          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            alert(xmlhttp.responseText);
          }
        };
        xmlhttp.open("post", "n_authorise.php", true);
        xmlhttp.send(data);  // <-------- 'data' sent to PHP!
      }
    </script>
  </head>

  <body>
      <form name="loginform" class="loginform" onsubmit="myFunction()" method="post">.  // <-------- new class added
        <input type="text" name="t_username" id="t_username" placeholder="Username" required autofocus>
        <input type="password" name="t_password" id="t_password" placeholder="Password" required>
        <input name ="submit" type="submit" value="submit">
      </form>
  </body>
</html>