通过AJAX接收来自PHP的响应

时间:2016-10-19 09:29:42

标签: javascript php jquery ajax

我正在尝试使用PHP将我网站上的表单中的信息发送到Ajax脚本。但是,每次我尝试提交表单时,我都无法从服务器上的脚本返回任何响应。我不知道自己错过了什么,我很感激任何帮助。

这是我的HTML

<form method='post' action='<?= get_template_directory_uri() ?>/mailchimp.php'>
    <input type='text' name='email'/>
    <input type='submit' name='submit' value='Subscribe'/>
</form>

这是我的PHP

session_start();
if(isset($_POST['submit'])){
    $email = $_POST['email'];
    if(!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL) === false){
        // MailChimp API credentials
        $apiKey = 'xxx-xxx';
        $listID = 'xxxxxxx';

        // MailChimp API URL
        $memberID = md5(strtolower($email));
        $dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
        $url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listID . '/members/' . $memberID;

        // member information
        $json = json_encode([
            'email_address' => $email,
            'status'        => 'subscribed'
        ]);

        // send a HTTP POST request with curl
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        $result = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        echo "<h1>Success</h1>";
    }
}

这是我的JQuery

jQuery('form').submit(function (event) {

   console.log('submitting...')

    //1. Get the form Data
    var formData = {
        'email': jQuery('input[name=email]').val()
    }

    console.log("DATA FROM FORM:")
    console.log(formData);

    //2. Process the form
    jQuery.ajax({
        type: 'POST', //Type of HTTP request
        url: 'mailchimp.php', //URL to POST
        data: formData //Data from form
    }).done(function (data) {
        console.log("RESPONSE: " + data);
    });

    //3. Stop the form from submitting in usual manner
    event.preventDefault();
});

我已经检查了我的控制台,我发现JS没有错误。我明白这一点:

submitting...
DATA FROM FORM:
Object {email: "xyz@domain.com"}
RESPONSE: 

我还检查了我的网络请求,我可以看到我已经请求PHP脚本并且它已经发送了200响应,所以我正在点击脚本 - 但是我没有看到任何响应数据。

*另请注意 - 我知道在上面的PHP代码中我没有检查$httpCode变量。我将实施这个。我只是想先让脚本与彼此交谈。

3 个答案:

答案 0 :(得分:7)

发生这种情况是因为你的情况:

if(isset($_POST['submit'])){

由于您未在仅发送submit的{​​{1}}请求中发送POST参数,因此永远无法覆盖。

请删除条件或将其替换为email,或者也可以将isset($_POST['email'])参数添加到submit

  

要确保发送到正确路线的请求尝试对所有代码进行注释并添加回声(例如formData)并检查是否会记录它。

希望这有帮助。

答案 1 :(得分:2)

正如我提到的那样,其他人说你没有在你的ajax请求中使用索引<input readonly type="text" class="form-control" [(ngModel)]="createdCode"> <button class="btn btn-default" type="button" ngIIclipboard [cbContent]="createdCode">copy</button> ,这意味着你的PHP代码中有未定义的索引警告。

最好在PHP代码中使用php submit,这有助于找出错误和警告。

error_reporting()

其次,如果您仍想在代码中添加检查而不是使用:

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

if(count($_POST) > 0)

最后,您是否希望来自CURL请求的此响应? if(isset($_POST['email']) && !empty($_POST['email'])) 这意味着您始终可以获得成功消息执行或不执行

答案 2 :(得分:0)

在你的php脚本中试试这个:

if(isset($_POST['email'])){

}

没有贬低

if(isset($_POST['submit'])){

}