Как я могу получить переменную PHP для AJAX?

Я не думаю, что правильно передаю переменную между своими отдельными файлами PHP и AJAX.

Я отлаживаю это, вызывая второе условие $status = 'info'; в моем файле PHP.

В настоящее время status подходит как "неопределенное" для alert(data.status);.

signup_process.php

if (condition){

   $status = 'success';

else {

    $status = 'info';

    }

АЯКС

function send() {
var data = $('#signup_form').serialize();
    $.ajax({
        type: "POST",
        url: "signup_process.php",
        data: data,
        success: function (data) {
        alert(data.status);
            if (data.status == 'success') {
                // everything went alright, submit
                $('#signup_form').submit();
            } else if (data.status == 'info')
            {
                console.log(data.status);
                $("label#email_error").show(); 
                return false; 
            }
        }
    });
    return false;
};

Я знаю, что срабатывает второе условие, потому что я поместил туда перенаправление заголовка только для тестирования, и оно сработало нормально.


person frankie    schedule 06.10.2012    source источник


Ответы (2)


Хорошо использовать json при возврате данных из php в ajax.

$return_data = array();
if (condition){
   $return_data['status'] = 'success';
} else {
    $return_data['status'] = 'info';
}

echo json_encode($return_data);
exit();

Теперь, если вы возвращаете данные json обратно в ajax, вам нужно указать тип возвращаемых данных в вызове ajax, как показано ниже.

function send() {
var data = $('#signup_form').serialize();
    $.ajax({
        type: "POST",
        url: "signup_process.php",
        data: data,
        dataType: 'json', 
        success: function (data) {
        alert(data.status);
            if (data.status == 'success') {
                // everything went alright, submit
                $('#signup_form').submit();
            } else if (data.status == 'info')
            {
                console.log(data.status);
                $("label#email_error").show(); 
                return false; 
            }
        }
    });
    return false;
};
person GBD    schedule 06.10.2012
comment
Я добавил тип данных, и переменная по-прежнему отображается как неопределенная. Я только что проверил, чтобы убедиться, что условие установки информации срабатывает, и это так. В этом случае (data.status) не должно быть (return_data.status)? Спасибо. - person frankie; 06.10.2012
comment
нет. это должно быть только data.status. return_data.status это неправильно - person GBD; 06.10.2012
comment
datatype: 'json' должно быть dataType: 'json', так как оно чувствительно к регистру - person Bogdan; 06.10.2012
comment
@паук, да, ты прав. я пропустил это .. спасибо .. отредактируйте мой ответ - person GBD; 06.10.2012

Вы должны отправить объект JSON обратно из php:

$data = array();
if (condition){
   $data['status'] = 'success';
else {
   $data['status'] = 'info';
}

header('Content-type: application/json');
echo json_encode($data);

Метод json_encode() преобразует массив в объект JSON, чтобы вы могли получить доступ к каждому ключу массива по имени на стороне js.

person Bogdan    schedule 06.10.2012
comment
Хорошо, но я не уверен, зачем мне нужен массив, если это только одно значение за раз для каждого условного выражения. Или он отправляется как пара ключ/значение? Я только что попробовал это со всем кодом во втором условном блоке $data = array(); //send variables back to AJAX $data['status'] = 'info'; echo json_encode($data); } Должна ли часть AJAX работать так, как я ее написал? - person frankie; 06.10.2012
comment
вам нужно изменить тип данных: 'json' на вызов ajax, чтобы получить данные json взамен - person GBD; 06.10.2012
comment
Я изменил ответ, чтобы включить правильный JSON Content-Type header, потому что jQuery Ajax угадывает тип данных ответа на основе этого, если вы не укажете параметр dataType в своих параметрах ajax (которые вы не указали). - person Bogdan; 06.10.2012
comment
@user1390395 user1390395 В качестве альтернативы вы можете указать параметр dataType: 'json', как указал @GBD, но это должен быть верблюжий регистр с заглавной T. Все строчные буквы не будут работать, так как имя параметра чувствительно к регистру. - person Bogdan; 06.10.2012
comment
@паук, да, ты прав. я пропустил случай с верблюдом .. спасибо .. отредактировал свой ответ - person GBD; 06.10.2012
comment
@ user1390395 - да, JSON - это система пар ключ-значение, поэтому используется массив .... например. array('hello'=›'mum') кодируется в строку JSON {hello:mum}. Затем jQuery автоматически декодирует это для вас в объект javascript, который имеет свойство «.hello» со значением «мама». - person Matt; 06.10.2012