PHP页面无法读取POST有效负载

时间:2015-02-23 19:38:09

标签: php

我以POST请求的形式向PHP页面发送数据。在chrome dev工具上,我可以看到POST的有效负载:

  

"用户名= T&安培;密码= T&安培; cpassword = T&安培;电子邮件= T&安培; cemail = T"

我的PHP文件以以下内容开头:

<?php
$username = $_POST['username'];
$password = $_POST['password'];
$cpassword = $_POST['cpassword'];
$email = $_POST['email'];
$cemail = $_POST['cemail'];

echo("Username: $username <br>Password: $password <br>cPassword: $cpassword <br>Email: $email <br>cEmail: $cemail");
....

然而,该页面只显示:

  

用户名:
密码:
cPassword:
电子邮件:
cEmail:

为什么会这样,我怎样才能设置$ username,$ password,$ cpassword,$ email和$ cemail?

编辑:生成帖子数据的方法如下:

<script>
function validateForm() {
    window.alert("Form submitted");
    var username = encodeURIComponent(document.getElementById("username").value);
    var password = encodeURIComponent(document.getElementById("password").value);
    var cpassword = encodeURIComponent(document.getElementById("cpassword").value);
    var email = encodeURIComponent(document.getElementById("email").value);
    var cemail = encodeURIComponent(document.getElementById("cemail").value);

    var postData = "username=" +username + "&password=" + password + "&cpassword=" + cpassword + "&email=" + email + "&cemail=" + cemail;
    window.alert(postData);

    if (email != cemail) {
        window.alert("Emails do not match");
        document.getElementById("response").innerHTML = "Emails do not match";
        return false;
    }

    if (password != cpassword) {
        window.alert("Passwords do not match");
        document.getElementById("response").innerHTML = "Passwords do not match";
        return false;
    }

    if (email == "" || email == null) {
        window.alert("Email is blank");
        document.getElementById("response").innerHTML = "Email cannot be blank";
        return false;
    }

    if (password == "" || password == null) {
        window.alert("Password is blank");
        document.getElementById("response").innerHTML = "Password cannot be blank";
        return false;
    }

    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var response=xmlhttp.responseText;
            window.alert("Response recieved: " + response);
            if (response == "New record created successfully") {
                window.alert("Registration successful");
                document.getElementById("response").innerHTML = "Registration successful!";
            } else {
                window.alert("Something went wrong... :(");
                document.getElementById("response").innerHTML = "Something went wrong... :(";
            }
        }
    }

    xmlhttp.open("POST", "./handleRegistration.php", true);
    window.alert("xmlhttp open");
    xmlhttp.send(postData);
    window.alert("POSTED");
    return false;
}
</script>

<form name="heliosRegister" onsubmit="return validateForm()" method="POST">
Username:<br>
<input id="username" type="text" name="username" required>
<br><br>
Passsword:<br>
<input id="password" type="password" name="password" required>
<br><br>
Confirm Passsword:<br>
<input id="cpassword" type="password" name="cpassword" required>
<br><br>
Email:<br>
<input id="email" type="text" name="email" required>
<br><br>
Confirm Email:<br>
<input id="cemail" type="text" name="cemail" required>
<br><br>
<input type="submit" value="Register"> <p id="response"></p>
</form>

编辑2:

问题解决了,忘记在发送POST时添加标题信息。

2 个答案:

答案 0 :(得分:1)

问题是我忘了在POST之前添加标题信息:

xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", postData.length);
xmlhttp.setRequestHeader("Connection", "close");

答案 1 :(得分:0)

替换

var username = encodeURIComponent(document.getElementById("username").value);
var password = encodeURIComponent(document.getElementById("password").value);
var cpassword = encodeURIComponent(document.getElementById("cpassword").value);
var email = encodeURIComponent(document.getElementById("email").value);
var cemail = encodeURIComponent(document.getElementById("cemail").value);

var postData = "username=" +username + "&password=" + password + "&cpassword=" + cpassword + "&email=" + email + "&cemail=" + cemail;

var fd=new FormData();
fd.append("username",document.getElementById("username").value);
fd.append("password",document.getElementById("password").value);
fd.append("cpassword",document.getElementById("cpassword").value);
fd.append("email",document.getElementById("email").value);
fd.append("cemail",document.getElementById("cemail").value);

然后使用

xmlhttp.send(fd);

我认为它应该有效。 顺便说一句,$ cpassword = $ _POST ['cpassword']; 应该给你一个明显的错误! (未定义的索引),  开发时,使用此代码!在开发过程中更容易发现几种类型的错误:

error_reporting(E_ALL); 
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");