2012-06-08 63 views
6

Estoy enviando datos a un archivo php a través de AJAX utilizando POST. Funcionó bien con solo enviar cadenas, pero ahora quería enviar mi objeto JS con JSON y decodificarlo en PHP.Enviar datos JSON a través de JQuery ajax.post a PHP

En la consola puedo ver que mis datos se envían correctamente, pero en el lado de PHP json_decode devuelve NULL.

He intentado lo siguiente:

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'])); 

Y:

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'])); 

La alerta fue sólo para comprobar que todo está bien ...

Y sí cadena de costumbre se hizo eco correctamente :-)

+0

Im lo siento por eso, pero por supuesto tengo que tratar estas respuestas, y todos ellos no tenían razón ... Pero sí encontré mi respuesta - pero en mi opinión Sí ayudo si estoy comentando por qué la respuesta no me ayudó; si no estoy haciendo ningún comentario, la gente no sabe, si lo probé y si ya se me dio la respuesta correcta. – SamiSalami

Respuesta

23

donde salió mal en su código en el primer código es que debe haber utilizado la siguiente:

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

Citando de PHP Manual

php: // input es una corriente de sólo lectura que permite leer los datos en bruto del cuerpo de la petición.

Dado que en su caso, va a enviar un JSON en el cuerpo, hay que leerlo de esta corriente. El método habitual de $_POST['field_name'] no funcionará, porque el cuerpo del mensaje no está en un formato URLencoded.

En la segunda parte, debe haber utilizado la siguiente:

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

ACTUALIZACIÓN:

Cuando la solicitud tiene un tipo de contenido application/json, PHP suele analizar la petición y le dará el objeto JSON en $_POST, debe analizarlo usted mismo desde el cuerpo HTTP sin formato. La cadena JSON se recupera usando file_get_contents("php://input");.

Si tiene que conseguir que el uso de $_POST que haría:

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

Y luego en PHP hacer:

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

Muchas gracias, ¡eso fue todo! Intenté por fin su respuesta ^^ Aunque estoy un poco confundido porque leo ejemplos en los que JSON objeta de una llamada ajax donde acaba de hacerse eco de un $ _POST ... Pero realmente gracias :) – SamiSalami

+0

Wow, muchas gracias con esa actualización es mucho más comprensible :) – SamiSalami

+0

upvoted para php: // input – wolfgang

0

Las comillas simples no son válidas para PHP de json_encode, utilizar las comillas dobles para ambos nombres de campo y valores.

+0

No veo cómo esto es relevante en absoluto, ya que todos los datos se transfieren como parte de la solicitud POST y el JSON está formateado por la función JSON.stringify, las comillas simples solo se usan en el objeto con la configuración utilizada por la función ajax. – Flygenring

+0

'data: {'Ausencia': JSON.stringify (this)}' - aquí, php recibe todo, incluso 'Ausencia', que también debe estar entre comillas dobles, de lo contrario no es válido. – YemSalat

+0

No, "Ausencia" no es propiedad del objeto json dado, solo lo estoy direccionando con "Ausencia" para obtenerlo a través de $ _POST ['Ausencia'], no es una propiedad, así que no tiene que ser en comillas dobles – SamiSalami

0

Para mí, parece que debe reformatear su objeto AJAX. La propiedad url solo debe ser la URL del archivo php de destino y cualquier información que deba publicarse debe tener la forma de una cadena de consulta en la propiedad de datos. El siguiente debería funcionar como se esperaba:

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 se ve bien, pero estoy obteniendo cadenas vacías con "echo $ _GET ['Ausencia'];", "echo json_decode ($ _ GET ['Ausencia'])" - También intenté con la publicación, pero esta es una presentación como un GET ... Pensé en hacerlo a través de POST o estoy malentendiendo algo relacionado con el envío de objetos JSON a través de Ajax. ¿Deben enviarse como GET (url param)? – SamiSalami

+0

Debería darle cadenas vacías cuando acceda a la variable '$ _GET' en una solicitud' POST'. Puede usar la variable '$ _POST' o' $ _REQUEST' para acceder a los datos enviados ([etc] (http://php.net/manual/en/reserved.variables.request.php)). – Flygenring

+0

Como te dije o intenté POST también, pero intenté OBTENER primero, porque estás enviando datos como parámetros de URL, pero como he dicho, tal vez estoy malinterpretando y la publicación de ajay es un falso "POST": -) – SamiSalami

0

probar esto

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); 
     } 
    }); 
    } 

EDITAR

Creo que también podemos hacer esto!

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); 
     } 
    }); 
    } 

y en PHP

print_r($_POST); 
+0

La referencia 'this' en el cuerpo de la función debe ser una referencia al objeto sobre el que se llamó la función, por lo que esa parte debería funcionar incluso si no es exactamente bonito o legible código – Flygenring

+1

sí , la alerta funcionará, pero el 'this' en jQuery.ajax no será la referencia al objeto en el que se llamó la función – Rishabh

+0

Un buen punto que tienes, que puede que ya no sea el objeto, aunque no lo creo , porque he visto otros ejemplos donde esto se usó directamente.Su segunda sugerencia lleva a un error en la consola: "demasiada recursión" - No sé por qué, mi navegador incluso se congela por un momento x) el primero por print_r ($ _ POST) Solo estoy obteniendo "Array()" por supuesto y $ _POST ['data'] ist empty: -/ – SamiSalami

Cuestiones relacionadas