PHP从Ajax调用接收空的$ _POST变量

时间:2016-11-04 23:44:56

标签: javascript php jquery ajax post

我正在尝试使用AJAX调用将表单数据发送到PHP脚本。我将表单数据序列化并通过POST方法将其作为JSON变量发送到PHP脚本。 Ajax数据变量似乎是正确的,但由于某种原因,PHP $ _POST数组是空的,我很难理解我在这里做错了什么。

这是我的ajax电话

// AJAX
        var input_data = $('#contact-form').serialize(); 

        event.preventDefault();

        $.ajax({
            url: 'contact.php',
            type:'POST',
            dataType:'json',//return type from server side function [return it as JSON object]
            contentType: "application/json",
            data: input_data, //Pass the data to the function on server side
            success: function (data) { //Array of data returned from server side function

                $.each(data,function(index){
                    alert(data[index]); // used for debugging, returns 1
                });
            }

        });

        alert("called");
        if(input_data.length < 1)
        {
            alert("empty");
            alert(input_data);
        }
        else
        {
            alert("not empty");
            alert(input_data);
        }
        return false; 

表格

<form class="text-center" id="contact-form" method="POST" action="contact.php">
                    <div class="form-group">
                        <input type="text" class="form-control" id="name" name="name" placeholder="Name">
                    </div>
                    <div class="form-group">
                        <input type="email" class="form-control" id="email" name="email" placeholder="Email">
                    </div>
                    <div class="form-group">
                        <textarea class="form-control" rows="5" id="msg" name="msg" placeholder="Type your message"></textarea>
                    </div>
                    <div class="form-group">
                        <div class="g-recaptcha buffer" data-sitekey="some_key" data-callback="recaptcha_callback"></div>
                        <input type="hidden" class="hiddenRecaptcha required" name="hiddenRecaptcha" id="hiddenRecaptcha">
                    </div>


                    <button type="submit" class="btn btn-lg btn-primary text-uppercase buffer">Send message</button>
                </form>

最后是我的contact.php脚本

<?php
    header('Content-Type: application/json');

    $name;
    $email;
    $msg;

    $nameErr = $emailErr = $msgErr = 0;

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        if (empty($_POST["name"])) {
            $nameErr = 1;
        }
        else {
            $name = $_POST["name"];
            $nameErr = 0;
        }

        if (empty($_POST["email"])) {
            $emailErr = 1;
        }
        else {
            $email = $_POST["email"];
            if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
                $emailErr = 0;
            } else {
                $emailErr = 1;
            }
        }

        if (empty($_POST["msg"]))  {
            $msgErr = 1;
        }
        else {
            $msg = $_POST["msg"];
            $msgErr = 0;
        }

        if($nameErr == 0 && $emailErr == 0 && $msgErr == 0)
        {
            $to = "example@example.com";
            $subject = 'Contact request - site';
            $txt = $_POST['msg'];
            $headers = "From: " . $_POST['email'] . "\r\n";
            mail($to,$subject,$txt,$headers);
            echo json_encode(array("sent"));
        }
        else
        {
            echo json_encode(array($nameErr, $emailErr, $msgErr));
        }
    }
    else
    {
        echo json_encode(array("post_error"));
    }

?>

通过运行PHP代码,电子邮件可以正确发送。使用Ajax调用时,$ _POST数组为空,它从PHP代码中的最后一个if语句发回三个错误代码。此外,如果有更好的方法来实现这一点,我会非常乐意看到另一种选择。感谢您的帮助,谢谢。

编辑:JSON数据

json_data

1 个答案:

答案 0 :(得分:1)

通过使用$('#contact-form').serialize(),您可以使jQuery将数据从常规字段转换为HTTP查询字符串key=val&key2=val2&... - 但现在您在$.ajax中设置contentType为{{ 1}},这使得jQuery为请求设置了一个HTTP头application/json。 jQuery不会抱怨它可能是错误的内容类型 - 你应该知道它是最好的。

由于POST-Request具有Content-Type Content-Type: application/json,因此PHP不会将HTTP POST数据解析为超级全局application/json。相反,您必须从$_POST读取原始POST数据。

现在你的问题是,你告诉HTTP POST数据是JSON,但它真的不是你发送的JSON - 它是一个HTTP查询字符串。由于它是HTTP查询字符串,因此您可以从php://input调用中删除contentType: "application/json",,这将使jQuery设置正确的Content-Type标头。

jQuery会将Content-Type标头设置为$.ajax - 这是正确的Content-Type标头。由于这是Content-Type PHP解析之一,现在可以在超全局application/x-www-form-urlencoded中使用HTTP POST数据。

$_POST只会填写特定的内容类型,即$_POSTmultipart/form-data。如果HTTP内容类型不是它们,则application/x-www-form-urlencoded将不会被填充,您必须从$_POST读取RAW POST数据。

http://php.net/manual/en/reserved.variables.post.php