如何从AJAX (Javascript到PHP)正确接收JSON响应

How to correctly receive a JSON response from AJAX (Javascript to PHP)

本文关键字:响应 JSON PHP AJAX Javascript      更新时间:2023-09-26

我的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

但那只是我。我喜欢循环:)