Ajax成功功能被忽略-代码仍在运行

时间:2019-05-10 08:54:47

标签: jquery ajax mailchimp php-curl html-form-post

我正在尝试发布一个细分受众群,以通过AJAX邮寄黑猩猩帐户。如果呼叫成功,我想重定向到URL。经过大量测试,每次调用都成功,但是我无法获得重定向...就好像代码在运行,然后跳过if“ result = success”,然后转到我的else语句,这只是警报。当我查看返回的数据时,我得到“ nullsuccess”。我什至尝试过result =“ nullsuccess”,对于else语句仍然正确。

$("#mc-embedded-subscribe-form").submit(function(e) {   
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax({
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "text",
            success: function(data){
                if(data.result == 'success'){
                    window.location.href = 'https://google.com';
                }else{
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                }
            }
        });        
    e.preventDefault(); // avoid to execute the actual submit of the form.
});

在dataType之上-我使用了“文本”,因为如果我使用“ json”或“ jsonp”,则它将完全忽略成功函数(无论if和else语句)。有趣的是,这三种数据类型仍然可以成功发布数据。

这是PHP(update-member.php)

$apikey = 'myAPIKEYHERE';
            $auth = base64_encode( 'user:'.$apikey );    
            $data = array(
                'apikey'        => $apikey,
                'email_address' => $_POST['email_address'],
                'status'        => 'subscribed',
                'merge_fields'  => array(

                )                   
            );

            $json_data = json_encode($data);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'MYMAILCHIMPURL');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Authorization: Basic '.$auth));
            curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);  

            echo json_encode($response_array);                                                                                                                

            $result = curl_exec($ch);
            $message = curl_errno($ch) === CURLE_OK ? 'success' : 'failure';
            echo $message; //echos nullsuccess

我觉得我没有从update-member.php返回正确的东西,或者我没有在ajax成功函数中正确收集它。

2 个答案:

答案 0 :(得分:0)

那是因为您可能尚未设置result = success。默认情况下,它已经具有成功功能。您必须在服务器端进行如下设置。

$data['result'] = 'success';

,在ajax中,您必须将dataType设置为'json'

$("#mc-embedded-subscribe-form").submit(function(e) {   
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax({
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "json", //CHANGED
            success: function(data){
                if(data.result == 'success'){
                    window.location.href = 'https://google.com';
                }else{
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                }
            }
        });        
    e.preventDefault(); // avoid to execute the actual submit of the form.
});

答案 1 :(得分:0)

如评论中所述,您的PHP回显了两件事:

echo json_encode($response_array);
// ...
echo $message;

该脚本返回2个字符串,这些字符串是级联的-解释了您所看到的奇怪的nullsuccess。摆脱第一个echo,以便只返回单个纯文本状态字。

下一个问题是您的Javascript。您已指定AJAX调用将返回一些文本:

dataType: "text",

实际上,它确实是-纯文本successfailure状态消息。但是,在使用该响应时,您的代码将其像JSON一样对待:

if(data.result == 'success'){

data是您的纯文本响应/状态消息,它没有.result属性。只是文本,所以将其更改为:

if(data === 'success'){

更新

这是您的代码的简化,有效版本。我在本地进行了设置并验证了它的有效性。我所做的就是我上面所描述的-确保dataType与PHP返回的内容匹配,并确保JS在获得它时以这种方式对待它。在这种情况下,一路text

复制此代码并尝试。在您的电子邮件字段中输入“ a@a.com”以测试成功响应,并以其他方式测试失败。

JavaScript

$("#mc-embedded-subscribe-form").submit(function(e) {   
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "update-member.php",
        data: $("#mc-embedded-subscribe-form").serialize(),
        dataType: "text",  // <-- WE EXPECT TO GET TEXT BACK
        success: function(data) {
            // Check what your PHP returns, make sure no newlines
            console.log(data);
            if (data === 'success') {  // <-- TREAT WHAT WE GOT AS TEXT
                window.location.href = 'https://google.com';
            } else {
                alert("Error");
            }
        }
    });        
});

PHP

<?php
// The problems you are having are unrelated to the Mailchimp processing,
// so let's simplify it to get the JS side working.  Make sure you have 
// no blank lines before or after your opening/closing PHP tags, as 
// they will show up in the output, and your JS would then see something
// like "\nsuccess" for example.  Also make sure nothing else in your PHP
// generates any output.
// WE RETURN TEXT
echo ($_POST['email_address'] === 'a@a.com') ? 'success' : 'failure';
?>

如果尝试此操作,但它不起作用,则说明您在某处存在其他问题。打开浏览器的开发工具,然后检查控制台。查看网络请求并查看POST。

要解决您的一些评论,

  • 通过调整问题的随机无关部分,使事情变得过于复杂。在这个特定问题中,您只需要对齐几个剩余的零件(其他零件已经在工作):

    1)如果您告诉JS您的PHP将要返回文本,则它必须返回文本。

    2)如果您告诉JS您的PHP将要返回文本,那么您的JS必须将PHP返回的内容视为文本。

    就是这样。真的没有更多了。

  • GET与POST:convention and standards将使用GET检索和 view 数据,并使用POST进行 change 数据。您正在订阅一个电子邮件地址-这是一个更改,您应该使用POST。

    GET或POST对PHP返回的值,运行OK或应使用的dataType的影响为零,无零。它们是拼图中无关的部分(尽管这并不意味着您使用什么都没有关系)。