【问题标题】:After ajax call $_POST['name'] is still undefinedajax 调用后 $_POST['name'] 仍然未定义
【发布时间】:2018-02-25 17:47:37
【问题描述】:

HTML代码

<div class="container">
    <?php echo $_POST['name']; ?>
    <form method="POST" id="reg-form" action="register">
        <label>Full Name:</label>
        <input class="register-form-input" type="text" name="name" id="name"><br>
            <label>Username:</label>
        <input  class="register-form-input" type="text" name="username" id="username"><br>
            <label>Email:</label>
        <input  class="register-form-input" type="email" name="email" id="email"><br>
        <label>ID Number:</label>
        <input  class="register-form-input" type="text" name="idnumber" id="idnumber"><br>
            <label>Password:</label>
        <input  class="register-form-input" type="password" name="password" id="password"><br>
            <label for="name">Repeat Password:</label>
        <input  class="register-form-input" type="password" name="password1" id="password1"><br><br>
        <input type="submit"  name="submit"  id="register-submit" onclick="ajax_post();">
    </form>
    <?php echo $_POST['name']; ?>
</div>

Javascript 文件

function ajax_post(){
    // Create our XMLHttpRequest object
    var hr = new XMLHttpRequest();
    // Create some variables we need to send to our PHP file
    var url = "register/index";
    var name = document.getElementById("name").value;
    var username = document.getElementById("username").value;
    var vars = "name="+name+"&username="+username;
    hr.open("POST", url, true);
    // Set content type header information for sending url encoded variables in the request
    hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    // Access the onreadystatechange event for the XMLHttpRequest object
    hr.onreadystatechange = function() {
      if(hr.readyState == 4 && hr.status == 200) {
        var return_data = hr.responseText;
        console.log(return_data);
      }
    }
    // Send the data to PHP now... and wait for response to update the status div
    hr.send(vars); // Actually execute the request
}
document.querySelector('#reg-form').onsubmit=function(){
        return false;
}

注册控制器

<?php 
class Register extends Controller{

    public function __construct(){
        parent::__construct();
        echo $_POST['name'];
    }
    public function index(){
        echo $_POST['name'];
        $this->view->render('register/index',false);
        $this->model->run();
        echo $_POST['name'];
    }
    public function run(){

    }
}

问题是,当我在控制台中返回数据(ajax 响应)时,它会显示整个内容,并且我写过的任何地方 echo $_POST['name'] 仅出现在控制台响应中,在页面上它是未定义的。如果你需要解释,我会说得更详细。只是 $_POST['name'] 在页面上未定义,但在控制台中未定义。

【问题讨论】:

  • 简单,这是因为您的&lt;?php echo $_POST['name']; ?&gt; 向您抛出了该错误。
  • 在您的第一个代码中,$_POST['name'] 永远不会有值,因为它来自 ajax 请求;当然它不会在调用脚本/页面中定义;收到 ajax 请求后,您必须使用 javascript 更新页面
  • 呃,你能说得更具体点吗?
  • 我知道这是因为 $_POST['name'] 但我不明白为什么 Ajax 不向注册控制器、url="register/index" 和索引方法发送数据写成 $_POST['name'] 但它也是未定义的,就像没有得到任何数据,但实际上它得到了
  • pixs.ru/showimage/testpng_8254408_29486553.png 这是一个img,我在主要部分(asdasd)下划线有$_POST['name']

标签: javascript php ajax xmlhttprequest


【解决方案1】:

Ajax 不是时间旅行。

会发生这样的事情:

  1. 您请求在浏览器窗口中显示一个页面
  2. 该值未定义并在页面中显示
  3. 您使用 JavaScript 发出第二个类似的请求,由 JS 处理
  4. 值已定义并在您记录响应时正确显示

发出第二个请求不会更改历史记录。第一次请求的结果不变,仍然显示在页面中。

如果你想加载一个全新的页面,那么不要使用 Ajax。

如果您想根据您对 Ajax 请求的响应来修改用户已经在查看的页面,那么您必须编写 JavaScript(在您的 onreadystatechange 函数中)来操作页面的 DOM。

【讨论】:

  • 我只想将数据发送到 Register_Model.php 简单的 MVC 结构,但数据仅在刷新后传输到 php。
  • @DummyTarget — 当您发送 Ajax 响应时,它会传输到 PHP。这只是没有反映在页面中,因为该页面是在您做出 Ajax 响应之前发送的……而且您没有进行任何更新。
  • 以及如何更新?我的意思是我得到了它,因为如果我执行 document.querySelector('body').innerHTML=respons_data 它会更新并且 PHP 会获得价值,但是如何在不更新页面的情况下传递它? + 它有一些错误
  • @DummyTarget — 如果您想更改用户看到的内容,那么您必须更新页面!您可能应该设计您的 API,使其不再是大锤,只返回纯数据(例如 JSON),然后更新您关心的特定位。
  • 如果我不关心 UI 并且只想将此 javascript 数据发送到 Php 寄存器,我必须这样做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2012-04-07
  • 2013-07-16
  • 2018-03-27
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多