【问题标题】:How to pass $_POST from HTML script to PHP (getting "Undefined index" error)如何将 $_POST 从 HTML 脚本传递到 PHP(出现“未定义索引”错误)
【发布时间】:2020-12-28 19:18:12
【问题描述】:

在反复解决这个问题几个小时后完全糊涂了。尝试了很多方法,都没有成功。

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

我的最新方法是在login.html 调用myFunction() 中使用表单提交,它执行对n_authorise.php 的POST 调用以进行某些服务器端处理。将来 PHP 将返回 API 机密。对于我的测试,我将 PHP 剥离回 echo,从 $_POST 全局中提取用户输入。

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

我已经在表单中直接尝试了 action="n_authorise.php" (避免 myFunction() ),但这要么失败,要么在它工作时将 PHP 文件加载到浏览器,而不仅仅是返回结果。

我很沮丧,因为它必须是可能的,我可以从其他帖子中看到他们已经(并解决了)类似的问题......我就是无法破解它,所以请教专家!提前致谢。

我在 login.html 文件中的 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>

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

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

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

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

【问题讨论】:

  • 我想你错过了一些东西,请阅读:w3schools.com/xml/ajax_xmlhttprequest_send.asp 在 PHP 中也使用 isset 函数来防止未定义的错误
  • 您没有向您的 xmlhttp-request 添加任何参数 ....
  • @Baracuda078 - 这是我读过的众多资料之一(多次),但我看不出我错过了什么。一旦我知道我可以让这个最简单的例子工作,我会添加 isset 函数。
  • 您需要在 `xmlhttp.send();` 函数中添加要发送的数据,就像 w3schools 上的 post request 示例一样,希望对您有所帮助
  • @johnSmith - 谢谢 - 我想在 PHP 中使用 $_POST 全局变量。如何确保通过(我知道它无法在客户端访问)?

标签: php html xmlhttprequest undefined-index


【解决方案1】:

基于上述 - 以谦虚的谢意分享工作代码。仅供参考:

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

【讨论】:

    【解决方案2】:

    这是一个最简单的答案:

    您没有在请求中添加任何参数,您可以使用本机 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
    

    【讨论】:

    • 太棒了!很简单。 +1回答!谢谢!!
    • @GCOR71 你的表单标签可以有一个唯一的类名或id,如果你不使用它并且在你的页面上有多个表单,queryselector('form') 将获取所有表单或只是第一个(我不确定)在您的表单标签中添加一个 ID,例如 id="form1" 然后您在选择器中使用 #form1
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多