简体   繁体   English

如何正确接收来自AJAX的JSON响应(JavaScript到PHP)

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

My script.php file sends a few variables (extracted from a HTML form) to my email.php file. 我的script.php文件将一些变量(从HTML表单中提取)发送到我的email.php文件。

This file then saves all such variables to a MYSQL database, and in return also collects an "Order ID Number" (collected from mysql_insert_id), shown below: 然后,此文件将所有此类变量保存到MYSQL数据库,并且作为回报,还会收集“订单ID号”(从mysql_insert_id收集),如下所示:

$order_id = mysql_insert_id();

The $order_id is then passed back to script.php, which submits the product details to Paypal. 然后,将$ order_id传递 script.php,该脚本将产品详细信息提交给Paypal。 Currently, I wish the Paypal's item name to read "Order ID: #$order_id". 目前,我希望Paypal的商品名称显示为“订单ID:#$ order_id”。

However, I can't seem to send all the variables over to script.php, and then get the order ID back correctly. 但是,我似乎无法将所有变量都发送到script.php,然后正确获取订单ID。

I often receive a "Cannot read property 'order_id' of undefined" error in Google Chrome console, however now I'm triggering this piece of code from the JQuery 1.10.1 library (observed in Google Chrome console also) 我经常在Google Chrome控制台中收到“无法读取未定义的属性'order_id'的未定义”错误,但是现在我从JQuery 1.10.1库触发了这段代码(也在Google Chrome控制台中观察到)

// Uppercase the type
        s.type = s.type.toUpperCase();

Which then results in the following error: Uncaught Type Error: Object 1 has no method "toUpperCase". 然后,将导致以下错误:未捕获的类型错误:对象1没有方法“ toUpperCase”。

Here's my code. 这是我的代码。 I understand mysql is depreciated, but I'd like to get this implemented before I do any upgrades. 我知道mysql已过时,但是我想在执行任何升级之前先实现它。 ;) ;)

SCRIPT.PHP 脚本

$('#submit').click(function(){ // Perform checks to ensure all dropdown selections have been selected. // Validations have been successful, now populate variable portions of the paypal form $('#submit')。click(function(){//执行检查以确保选择了所有下拉菜单//验证成功,现在填充paypal表单的可变部分
$('#emailBuyer').val($('#email_paypal').val()); $('#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"));
?>

I think you have done it right. 我认为您做对了。 You do not have to set header to the json you are returning. 您不必将标头设置为要返回的json If you set the dataType as json jQuery will expect the data as json and if the data returned by the php is not json it would be handled by the error function of jQuery AJAX . 如果将dataType设置为json jQuery会期望该数据为json并且如果php返回的数据不是json,它将由jQuery AJAX的错误函数处理。

You can replace this 你可以代替这个

header('Content-Type: application/json');
echo json_encode(array("orderid" => "$order_id","email" => "$email_paypal"));

By 通过

die( json_encode(array("orderid" => "$order_id","email" => "$email_paypal")) );

Notice that I used die it is because I do not want anything else to run after I output json , extra whitespaces or other text that might get printed after the response can mess up the json response. 请注意,我之所以die是因为我不希望在输出json以后运行其他任何东西,否则在响应后可能会打印出多余的whitespaces或其他文本可能会使json响应混乱。 So just to be safe. 因此,为了安全起见。

hence you can skip this line as well in the success function 因此,您也可以在success function跳过此行

var myData = jQuery.parseJSON(data);

it will be json 这将是json

And this is not even in the question but just a sugestion that will reduce the lines of the codes 这甚至不是问题,而只是建议,可以减少代码行

$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., ");

this can be replaced by 这可以替换为

but if it is possible to change the variables to question_1, question_2 and so on 但如果可以将变量更改为问题_1,问题_2,依此类推

I would do this in a loop 我会做一个循环

for( $i = 1 ; $i <=10;$i++ ) {
    $qVar = "q".$i;
    $questionVar = "question_" . $i;
    $$questionVar = $_GET[ $questionVar ];
    $$qVar = ltrim( $$questionVar, "0123456789., ");


}

This way you have you variable set up in four lines an you can access them as $q1, $q2..so on and $question_1, $question_2 这样,您可以在四行中设置变量,然后可以分别以$ q1,$ q2..so和$ question_1,$ question_2访问它们。

But that's just me. 但这就是我。 I love loops :) 我喜欢循环:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM