2010-05-08 5 views
15

Konwertuję aplikację javascript/php/ajax, aby używać jQuery, aby zapewnić zgodność z przeglądarkami innymi niż Firefox.Nie można przekazać wartości null serwerowi za pomocą jQuery AJAX. Wartość otrzymana na serwerze to ciąg "null"

Mam problemy z przekazywaniem wartości true, false i null przy użyciu funkcji ajax jQuery. Kod

JavaScript: Kod

$.ajax 
(
    { 
     url  : <server_url>, 
     dataType: 'json', 
     type : 'POST', 
     success : receiveAjaxMessage, 
     data: 
     { 
     valueTrue : true, 
     valueFalse: false, 
     valueNull : null 
     } 
    } 
); 

PHP: wyjście

var_dump($_POST); 

Serwer:

array(3) { 
    ["valueTrue"]=> 
    string(4) "true" 
    ["valueFalse"]=> 
    string(5) "false" 
    ["valueNull"]=> 
    string(4) "null" 
} 

Problemem jest to, że zerowa, prawdziwe i fałszywe wartości są konwertowane do smyczki.

Używany obecnie kod Javascript AJAX poprawnie przekazuje wartości null, true i false, ale działa tylko w przeglądarce Firefox.

Czy ktoś wie, jak rozwiązać ten problem za pomocą jQuery?


Oto niektóre działający kod (nie używając jQuery) do porównania z niedziałającym kodem podanym powyżej.

kod JavaScript:

ajaxPort.send 
(
    <server_url>, 
    { 
     valueTrue : true, 
     valueFalse: false, 
     valueNull : null 
    } 
); 

kod PHP:

var_dump(json_decode(file_get_contents('php://input'), true)); 

wyjście Serwer:

array(3) { 
    ["valueTrue"]=> 
    bool(true) 
    ["valueFalse"]=> 
    bool(false) 
    ["valueNull"]=> 
    NULL 
} 

Należy zauważyć, że zerowa, prawdziwe i fałszywe wartości są prawidłowo odbierane.

Należy również zauważyć, że w drugiej metodzie tablica $ _POST nie jest używana w kodzie PHP. Myślę, że to jest klucz do problemu, ale nie mogę znaleźć sposobu na replikowanie tego zachowania za pomocą jQuery.


Ta sekcja została dodana po zaakceptowaniu poniższej odpowiedzi.

Tutaj jest poprawiona wersja oryginalnego kodu.

kod JavaScript: Kod

$.ajax 
(
    { 
     url  : <server_url>, 
     dataType: 'json', 
     type : 'POST', 
     success : receiveAjaxMessage, 
     data : JSON.stringify 
     (
     { 
      valueTrue : true, 
      valueFalse: false, 
      valueNull : null 
     } 
    ) 
    } 
); 

PHP: wyjście

var_dump(json_decode(file_get_contents('php://input'), true)); 

Serwer:

array(3) { 
    ["valueTrue"]=> 
    bool(true) 
    ["valueFalse"]=> 
    bool(false) 
    ["valueNull"]=> 
    NULL 
} 
+0

Mogę się mylić, ale czy twoje dane są poprawne JSON? Czy nie wszystkie klucze/wartości powinny być ujęte w ""? To może nie rozwiązać twojego problemu, ale jeśli uszeregujesz dane i po prostu przekazujesz pusty ciąg dla wartości pustej, to myślę, że to może zadziałać? Mam wrażenie, że jquery owija twoje dane w "", więc wartość, którą wysyłasz na serwer, to ciąg znaków zawierający tekst o wartości null, taki jak ten: "null". – DannyLane

+0

Dziękuję za odpowiedź Danny'ego, ale jestem pewien, że true, false i null mogą być używane jako niecytowane w JSON. Zobacz www.json.org. – Tom

+0

Prawdopodobnie miałeś rację, ale źle cię zrozumiałem. Uściślenie danych po stronie JavaScript rozwiązało problem. – Tom

Odpowiedz

10

czego można się spodziewać? Wysyłasz te wartości jako parametry POST, które są prostymi ciągami tekstowymi. Jeśli chcesz przenieść bezpieczny typ, użyj jakiegoś kodowania, takiego jak JSON. (Które nie jest to, co robi dataType - odnosi się do odpowiedzi z serwera.)

+1

Dziękuję. Kodowanie danych jako JSON naprawiło problem. Źle zrozumiałem cel opcji "dataType". – Tom

1

Spodziewam się, że wysyła parametry zapytania jako valueNull = zamiast valueNull = null, co jest moim doświadczeniem.

Jeśli robisz REST z JSON, nadal musisz wysłać zapytania o GETS i nie możesz konwertować wszystkich GETS na POSTS, aby obejść ten problem.

9

Można użyć niezdefiniowany zamiast zerowy.

data: { 
    valueTrue : true, 
    valueFalse: false, 
    valueNull : undefined 
} 
+0

Słodkie rozwiązanie! – zeckdude

+0

To faktycznie zadziałało idealnie dla mnie. –

Powiązane problemy