2010-05-08 7 views
15

Sto convertendo un'applicazione javascript/php/ajax per utilizzare jQuery per garantire la compatibilità con browser diversi da Firefox.Impossibile passare null al server utilizzando jQuery AJAX. Il valore ricevuto sul server è la stringa "null"

Ho problemi a trasmettere valori true, false e null utilizzando la funzione ajax di jQuery. codice

JavaScript: codice

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

PHP: uscita

var_dump($_POST); 

Server:

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

Il problema è che il nulla, veri e falsi valori vengono convertiti stringhe.

Il codice AJAX Javascript attualmente in uso passa null, true e false correttamente ma funziona solo in Firefox.

Qualcuno sa come risolvere questo problema utilizzando jQuery?


Ecco un codice funzionante (che non utilizza jQuery) da confrontare con il codice non funzionante sopra riportato.

codice JavaScript:

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

codice PHP:

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

uscita Server:

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

Si noti che il nulla, veri e falsi valori vengono ricevuti correttamente.

Si noti inoltre che nel secondo metodo l'array $ _POST non viene utilizzato nel codice PHP. Penso che questa sia la chiave del problema, ma non riesco a trovare un modo per replicare questo comportamento usando jQuery.


Questa sezione è stata aggiunta dopo la risposta è stata accettata.

Ecco una versione corretta del codice originale.

codice Javascript: Codice

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

PHP: uscita

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

Server:

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

Potrei sbagliarmi ma i dati sono validi JSON? Se non tutte le chiavi/valori sono racchiusi in "", potrebbe non risolvere il tuo problema ma se si uniscono i dati e si passa una stringa vuota per il valore nullo, allora penso che potrebbe funzionare? Ho la sensazione che jquery stia avvolgendo i tuoi dati nel "" così il valore che stai inviando al server è attuall una stringa contenente il testo null, come questo: "null". – DannyLane

+0

Grazie per aver risposto a Danny, ma sono certo che true, false e null possono essere utilizzati non quotati in JSON. Vedi www.json.org. – Tom

+0

Probabilmente avevi ragione, ma ti ho frainteso. La definizione dei dati sul lato Javascript ha risolto il problema. – Tom

risposta

10

Che cosa vi aspettate? Stai inviando questi valori come parametri POST, che sono semplici stringhe di testo. Se si desidera il trasferimento sicuro per tipo, utilizzare una sorta di codifica, come JSON. (Che non è quello che fa dataType - si riferisce alla risposta dal server.

+1

Grazie. Codifica dei dati mentre JSON risolve il problema. Ho frainteso lo scopo dell'opzione 'dataType'. – Tom

1

Mi aspetto che invii parametri di query come valueNull = anziché valueNull = null, che è la mia esperienza.

Se si esegue REST con JSON, è comunque necessario inviare parametri di query per GETS e non è necessario convertire tutti i GETS in POSTS per aggirare questo problema.

9

È possibile utilizzare indefinita invece di nulla.

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

Soluzione dolce! – zeckdude

+0

Questo ha funzionato perfettamente per me. –

Problemi correlati