如何从AJAX (Javascript到PHP)正确接收JSON响应
How to correctly receive a JSON response from AJAX (Javascript to PHP)
我的script.php文件发送一些变量(从HTML表单中提取)到我的email.php文件。
这个文件然后将所有这些变量保存到MYSQL数据库中,并且作为回报也收集一个"订单ID号"(从mysql_insert_id收集),如下所示:
$order_id = mysql_insert_id();
然后将$order_id 传回给script.php,后者将产品详细信息提交给Paypal。目前,我希望Paypal的商品名称为"订单ID: #$order_id"。
然而,我似乎不能将所有变量发送到script.php,然后正确地获得订单ID。
我经常收到一个"无法读取属性'order_id'未定义"错误在谷歌Chrome控制台,但现在我触发这段代码从JQuery 1.10.1库(在谷歌Chrome控制台也观察到)
// Uppercase the type
s.type = s.type.toUpperCase();
未捕获类型错误:对象1没有方法"toUpperCase".
这是我的代码。我知道mysql是贬值,但我想得到这个实现之前,我做任何升级。;)
SCRIPT.PHP
$("#提交").click(函数(){//执行检查以确保所有下拉选项都已被选中。//验证已经成功,现在填充paypal表单的可变部分
$ (' # emailBuyer ') .val ($ (' # email_paypal ') .val ());
var host = $(location).attr('host');
var protocol = $(location).attr('protocol');
var pathname = $(location).attr('pathname');
var returnPath = pathname.replace("removed","removed");
var cancelReturnPath = pathname.replace("removed","removed");
var returnPathUrl = protocol + "//" + host + returnPath + $('#email_paypal').val();
var cancelReturnPathUrl = protocol + "//" + host + cancelReturnPath + $('#email_paypal').val();
$('#returnPath').val(returnPathUrl);
$('#cancelReturnPath').val(cancelReturnPathUrl);
// Send the email. It needs to have the async=false as the form is tried to redirect to paypal before the email is sent!
jQuery.ajaxSetup({async:false});
$.get( controllerDir + 'email.php', {
email: $('#email_paypal').val(),
type: 1,
question_one: $("#question_one option:selected").text(),
question_two: $("#question_two option:selected").text(),
question_three: $("#question_three option:selected").text(),
question_four: $("#question_four option:selected").text(),
question_five: $("#question_five option:selected").text(),
question_six: $("#question_six option:selected").text(),
question_seven: $("#question_seven option:selected").text(),
question_eight: $("#question_eight option:selected").text(),
question_nine: $("#question_nine option:selected").text(),
question_ten: $("#question_ten option:selected").text(),
amount: $('#amount').val(),
shipping: $('#shipping').val(),
total: $('#total').val(),
contentType: "application/json",
dataType: "json",
success: function (data) {
var myData = jQuery.parseJSON(data);
console.log(mydata['orderid']);
if (myData.orderid == '0') {
alert('FAILED');
$('#item_name').val( order_id + 'FAILED' + '');
} else {
var order_id = myData.orderid;
$('#item_name').val( order_id + 'SUCCESS' + '');
}
}
});
jQuery.ajaxSetup({async:true});
});
EMAIL.PHP
<?php
header('Content-Type: text/html');
//Define Variables
//User ID for remote email server
$user_id = "REMOVED"; // Reece
$question_one = $_GET['question_one'];
$q1 = ltrim($question_one, "0123456789., ");
$question_two = $_GET['question_two'];
$q2 = ltrim($question_two, "0123456789., ");
$question_three = $_GET['question_three'];
$q3 = ltrim($question_three, "0123456789., ");
$question_four = $_GET['question_four'];
$q4 = ltrim($question_four, "0123456789., ");
$question_five = $_GET['question_five'];
$q5 = ltrim($question_five, "0123456789., ");
$question_six = $_GET['question_six'];
$q6 = ltrim($question_six, "0123456789., ");
$question_seven = $_GET['question_seven'];
$q7 = ltrim($question_seven, "0123456789., ");
$question_eight = $_GET['question_eight'];
$q8 = ltrim($question_eight, "0123456789., ");
$question_nine = $_GET['question_nine'];
$q9 = ltrim($question_nine, "0123456789., ");
$question_ten = $_GET['question_ten'];
$q10 = ltrim($question_ten, "0123456789., ");
$amount = $_GET['amount'];
$shipping = $_GET['shipping'];
$total = $_GET['total'];
$type = $_GET['type'];
$order = $_GET['order'];
$date = date('m/d/Y');
$email_paypal = $_GET['email'];
// Upload to database first. All credentials are correct,
// as when the "success" part of the ajax call (script.php) is removed, everything is uploaded perfectly.
mysql_connect("CORRECT WEBHOST", "CORRECT USER", "CORRECT PASS") or die(mysql_error());
mysql_select_db("CORRECT DB") or die(mysql_error());
mysql_query("CORRECT QUERY");
$order_id = mysql_insert_id();
switch($type) {
case "1" :
$name = "Order $order_id Placed on $date";
$comments = "(UNPAID) $q1, $q2, $q3, $q4, $q5, $q6, $q7, $q8, $q9, $q10";
break;
case "2" :
$name = "Order Paid on $date";
$comments = "(PAID) $order";
break;
case "3" :
$name = "Order Cancelled on $date";
$comments = "(CANCELLED) $order";
break;
default :
$name = "$email_paypal $date";
$comments = "Form Error. Unable to process email.";
}
// Then send an email.
$payload = "user_id=$user_id&form_id=2&name=$name&email=$email_paypal&comments=$comments";
$curl_connection = curl_init("REMOVED");
curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_POST, true);
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $payload);
// NOTE: Error messages using an echo cannot be placed anywehere in this file. It distracts JSON and will make the Order ID variable unobtainable.
header('Content-Type: application/json');
echo json_encode(array("orderid" => "$order_id","email" => "$email_paypal"));
?>
我认为你做得对。您不必将header设置为要返回的json
。如果您将dataType
设置为json
, jQuery将期望数据为json
,如果php返回的数据不是json,则将由jQuery AJAX
的错误函数处理。
你可以替换这个
header('Content-Type: application/json');
echo json_encode(array("orderid" => "$order_id","email" => "$email_paypal"));
die( json_encode(array("orderid" => "$order_id","email" => "$email_paypal")) );
请注意,我使用die
,这是因为我不希望在输出json
之后运行任何其他内容,额外的whitespaces
或其他可能在响应后打印的文本可能会弄乱json
响应。所以为了安全。
因此您也可以跳过success function
var myData = jQuery.parseJSON(data);
它将是json
这甚至不在问题中,只是一个减少代码行数的建议
$question_one = $_GET['question_one'];
$q1 = ltrim($question_one, "0123456789., ");
$question_two = $_GET['question_two'];
$q2 = ltrim($question_two, "0123456789., ");
$question_three = $_GET['question_three'];
$q3 = ltrim($question_three, "0123456789., ");
$question_four = $_GET['question_four'];
$q4 = ltrim($question_four, "0123456789., ");
$question_five = $_GET['question_five'];
$q5 = ltrim($question_five, "0123456789., ");
$question_six = $_GET['question_six'];
$q6 = ltrim($question_six, "0123456789., ");
$question_seven = $_GET['question_seven'];
$q7 = ltrim($question_seven, "0123456789., ");
$question_eight = $_GET['question_eight'];
$q8 = ltrim($question_eight, "0123456789., ");
$question_nine = $_GET['question_nine'];
$q9 = ltrim($question_nine, "0123456789., ");
$question_ten = $_GET['question_ten'];
$q10 = ltrim($question_ten, "0123456789., ");
可以用
代替但如果可以将变量更改为question_1, question_2等
我将在循环中执行
for( $i = 1 ; $i <=10;$i++ ) {
$qVar = "q".$i;
$questionVar = "question_" . $i;
$$questionVar = $_GET[ $questionVar ];
$$qVar = ltrim( $$questionVar, "0123456789., ");
}
这样你就有了你的变量设置在四行,你可以访问它们作为$q1, $q2..$question_1 $question_2
但那只是我。我喜欢循环:)
- http请求使用html而不是json进行响应
- 在不同的javascript数组中对json响应进行排序
- Laravel数据表无效的JSON响应
- 我应该如何将响应数据保存在对象(json)中以获得更好的操作和性能
- 使用来自不同异步函数的响应创建一个json对象
- 无法访问响应 JSON 对象
- 使用 RESTful API,如果未定义特定的响应 json 级别,我如何在客户端不出错
- 使用官方 Node.js SendGrid API 发送电子邮件时,响应 JSON 中可能出现哪些错误消息
- 无法从响应 JSON 中删除 html 标记
- 当响应 JSON 对象数据计数为零时,AJAX 成功回调函数重定向到错误回调
- 拆分 AJAX 响应 (JSON)
- jquery ajax 响应中缺少响应 JSON
- AJAX返回200成功,但未能解析响应JSON
- 向声音云响应json添加一个变量
- Node.js请求-Can't获取REST响应(JSON)的属性
- 如何使用javascript在for循环中获取响应json数据
- 下拉列表中未设置 AJAX 响应 JSON 数据
- Fetch api,为什么我必须在响应json()上使用它,试图让承诺有意义
- 如何使用ajax响应JSON数据
- 响应.json() 上的“意外输出结束”错误