2012-06-08 26 views
6

Im invio di dati a un file php tramite AJAX utilizzando POST. Ha funzionato bene con l'invio di stringhe, ma ora volevo inviare il mio oggetto JS con JSON e decodificarlo sul lato PHP.Invio di dati JSON tramite JQuery ajax.post a PHP

Nella console posso vedere che i miei dati sono inviati correttamente ma sul lato PHP json_decode restituisce NULL.

ho provato la seguente:

this.getAbsence = function() 
{ 
    alert(JSON.stringify(this)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: JSON.stringify(this), 
     success : function(data){ 
      alert(data); 
     } 
    }); 
} 

PHP:

echo $_POST['data']; 
echo json_decode($_POST['data']); 
echo var_dump(json_decode($_POST['data'])); 

E:

this.getAbsence = function() 
{ 
    alert(JSON.stringify(this)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: {'Absence' : JSON.stringify(this)}, 
     success : function(data){ 
      alert(data); 
     } 
    }); 
} 

PHP:

echo $_POST['Absence']; 
echo json_decode($_POST['Absence']); 
echo var_dump(json_decode($_POST['Absence'])); 

L'allarme è stato solo per controllare tutto va bene ...

E sì solita sfilza hanno fatto eco correttamente :-)

+0

Im dispiace, ma ovviamente devo cercare queste risposte, e tutti loro non andavano bene ... Ma sì ho trovato la mia risposta - ma in la mia opinione mi aiuta se sto commentando perché la risposta non mi ha aiutato; se non sto commentando, la gente non lo sa, se li ho provati e se la risposta giusta è già stata data. – SamiSalami

risposta

23

dove è andato storto nel codice nel primo codice è che è necessario aver usato questo:

var_dump(json_decode(file_get_contents("php://input"))); //and not $_POST['data'] 

Citando PHP Manuale

php: // input è un flusso di sola lettura che consente di leggere i dati grezzi dal corpo della richiesta.

Poiché nel tuo caso, stai inviando un JSON nel corpo, devi leggerlo da questo stream. Il metodo usuale di $_POST['field_name'] non funziona, perché il corpo del post non è in formato URLencoded.

Nella seconda parte, si deve aver usato questo:

contentType: "application/json; charset=utf-8", 
url: "ajax/selectSingle.php?m=getAbsence", 
data: JSON.stringify({'Absence' : JSON.stringify(this)}), 

UPDATE:

Quando la richiesta ha un tipo di contenuto application/json, PHP solito analizzare la richiesta e vi darà l'oggetto JSON in $_POST, è necessario analizzarlo autonomamente dal corpo HTTP non elaborato. La stringa JSON viene recuperata utilizzando file_get_contents("php://input");.

Se si deve ottenere che l'utilizzo $_POST si renderebbe:

data: {"data":JSON.stringify({'Absence' : JSON.stringify(this)})}, 

E poi in PHP fare:

$json = json_decode($_POST['data']); 
+0

Grazie mille, l'ha fatto! Ho provato la tua risposta alla fine ^^ Anche se sono un po 'confuso perché leggo esempi in cui oggetti JSON da una chiamata ajax sono appena risuonati da un $ _POST ... Ma grazie davvero :) – SamiSalami

+0

Wow, grazie mille per l'aggiornamento è molto più comprensibile :) – SamiSalami

+0

upvoted per php: // input – wolfgang

0

virgolette singole non sono validi per PHP di json_encode, utilizzare i doppi apici per entrambi i nomi e i valori dei campi.

+0

Non vedo come questo sia rilevante, poiché tutti i dati sono trasferiti come parte della richiesta POST e il JSON è formattato dalla funzione JSON.stringify - le virgolette singole sono usate solo in l'oggetto con le impostazioni utilizzate dalla funzione ajax. – Flygenring

+0

'data: {'Absence': JSON.stringify (this)}' - qui, php riceve il tutto, incluso 'Absence', che dovrebbe anche essere tra virgolette doppie, altrimenti non è valido. – YemSalat

+0

No, "Assenza" non è una proprietà dell'oggetto json dato, sto solo indicandolo con "Assenza" per ottenerlo tramite $ _POST ['Assenza'], non è una proprietà quindi non deve essere tra virgolette – SamiSalami

0

Per me, sembra che dovresti riformattare il tuo oggetto AJAX. La proprietà url dovrebbe essere solo l'URL per il file php di destinazione e tutti i dati che devono essere pubblicati dovrebbero essere nella forma di una stringa di query nella proprietà data. Il seguente dovrebbe funzionare come previsto:

this.getAbsence = function() { 
    var strJSONData = JSON.stringify(this); 
    alert(strJSONData); 
    jQuery.ajax({ 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    url: 'ajax/selectSingle.php', 
    data: 'm=getAbsence&Absence=' + strJSONData, 
    success: function(data) { 
     alert(data); 
    } 
    }); 
} 
+0

strJSONData sembra a posto, ma sto ottenendo solo stringhe vuote con "echo $ _GET ['Absence'];", "echo json_decode ($ _ GET ['Absence'])" - Ho provato anche con il post, ma questa è una sottomissione come GET ... Ho pensato di farlo tramite POST o sto fraintendendo qualcosa relativo alla sottomissione di oggetti JSON tramite Ajax? Devono essere presentati come GET (url param)? – SamiSalami

+0

Dovrebbe darti stringhe vuote quando accedi alla variabile '$ _GET' su una richiesta' POST'. Potresti usare la variabile '$ _POST' o' $ _REQUEST' per accedere ai dati inviati ([etc] (http://php.net/manual/en/reserved.variables.request.php)). – Flygenring

+0

Come ti ho detto o provato POST, ma ho provato prima, perché, stai sottomettendo i dati come url param, ma come ho detto forse sono solo incomprensione e il post di unay è un po 'falso "POST": -) – SamiSalami

0

provare questo

var vThis = this; 
    this.getAbsence = function() 
    { 
    alert(JSON.stringify(vThis)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: JSON.stringify(vThis), 
     success : function(data){ 
     alert(data); 
     } 
    }); 
    } 

EDIT

Penso che possiamo anche fare questo!

var vThis = this; 
    this.getAbsence = function() 
    { 
    alert(JSON.stringify(vThis)); 
    jQuery.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: vThis, 
     success : function(data){ 
     alert(data); 
     } 
    }); 
    } 

e in PHP

print_r($_POST); 
+0

Il riferimento 'this' nel corpo della funzione dovrebbe essere un riferimento all'oggetto su cui è stata chiamata la funzione, in modo che la parte debba funzionare anche se non è esattamente bella o leggibile codice – Flygenring

+1

sì , l'avviso funzionerà, ma il 'this' in jQuery.ajax non sarà il riferimento all'oggetto su cui la funzione è stata chiamata – Rishabh

+0

Un buon punto che hai, che questo potrebbe non essere più l'oggetto, anche se non la penso così , perché ho visto altri esempi in cui questo è stato utilizzato direttamente.I tuoi secondi suggerimenti portano ad un erro nella console: "troppa ricorsione" - Non so perché, il mio browser si blocca anche per un momento x) il primo da print_r ($ _ POST) Sto solo ricevendo "Array()" ovviamente e $ _POST ['data'] ist è vuoto: -/ – SamiSalami

Problemi correlati