我正在尝试发布一个细分受众群,以通过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成功函数中正确收集它。
答案 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",
实际上,它确实是-纯文本success
或failure
状态消息。但是,在使用该响应时,您的代码将其像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
的影响为零,无零。它们是拼图中无关的部分(尽管这并不意味着您使用什么都没有关系)。