2012-01-24 9 views
7

que estoy tratando de publicar los datos a través de AJAX, este es mi Info: funcióndatos JSON Correos a través de Ajax envía una matriz vacía

var jsondata = 
       {"address" : [ 
       { "id": addid, "streetaddress": streetaddress, "city": city, "state": state, "zipcode": zipcode, "latitude": latitude}, 
      ] 
      }; 

    var jsontosend = JSON.stringify(jsondata, null, 2); 

ajax:

$.ajax({ 
       type: "POST", 
       url: "process.php", 
       contentType: "application/json; charset=utf-8", 
       dataType: "JSON", 
       data: jsontosend, 
       success: function(msg){ 
        alert(msg); 
          } 
      }); 

      return false; 

      alert('Data sent'); 

}

en el extremo php, cuando imprimo_r ($ _ POST) simplemente dice

array(0) { 
    } 

Estoy alertando (jsontosend) y me está mostrando todo perfectamente, así como en firebug usando post mothod, mostrando todos los parámetros enviados de una manera perfectamente limpia.

La única forma en que pasa datos es si uso el método GET.

¡Cualquier consejo es muy apreciado!

EDITAR: agregar datos POST de firebug. esto es cuál está siendo alertado de la función de alerta:

{"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]} 

esto es lo que Firebug está mostrando como cuál es ser pasado cuando se utiliza el método POST:

myData=%7B%0A++++%22address%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22id%22%3A+76076%2C%0A++++++++++++%22streetaddress%22%3A+%223784+Howard+Ave%22%2C%0A++++++++++++%22city%22%3A+%22Washington+DC%22%2C%0A++++++++++++%22state%22%3A+%22DC%22%2C%0A++++++++++++%22zipcode%22%3A+20895%2C%0A++++++++++++%22latitude%22%3A+39.027820587%0A++++++++%7D%0A++++%5D%0A%7D 

y esta es la respuesta para var_dump de $ _POST :

array(0) { 

}

esta es una var_du pf de $ _POST [ 'myData']

NULL 
+1

¿Tiene alguna redirección "ocasional" antes de que los datos publicados lleguen a la secuencia de comandos php? – Cheery

+0

No lo creo, no estoy seguro de entender por completo a qué te refieres. – Mike

+0

"cuando imprimo_ ..." ¿qué quieres decir? abriendo esta página en tu navegador? – k102

Respuesta

7

Soy escéptico sobre la forma en que usa la propiedad contentType. Intenta eliminar contentType. El tipo de contenido predeterminado es application/x-www-form-urlencoded (http://api.jquery.com/jQuery.ajax/).

Además, utilice algo como {mydata: jsontosend} para su propiedad de datos.

$.ajax({ 
      type: "POST", 
      url: "process.php", 
      //contentType: "application/json; charset=utf-8", 
      dataType: "JSON", 
      data: {mydata: jsontosend}, 
      success: function(msg){ 
       alert(msg); 
         } 
     }); 
+0

¡era tipo de contenido! ¡esto es una pesadilla! – Mike

+0

5 horas desperdiciadas en esto debido a algo tan estúpido como el tipo de contenido! todavía se ve terrible, pero aún no he tenido la oportunidad de agregar tiras. – Mike

+0

Irónicamente, en realidad lo intenté antes de ver tu respuesta y funcionó. ¡Pero tu respuesta es definitivamente lo que era! Gracias – Mike

2

Uso

data:{myData: jsontosend}

Debe enviar myData como un parámetro en su solicitud.

+0

He intentado, en diferentes combinaciones, con y sin "" en torno a mydata y todavía devuelve una matriz vacía. – Mike

+1

¿Ha intentado obtener los datos del flujo de datos de entrada php? ' ' – dkulkarni

+4

Cuando utiliza el tipo de contenido JSON, en el lado de PHP, es necesario leer manualmente la cadena JSON directamente desde el cuerpo de la solicitud utilizando la secuencia de entrada php: //. – dkulkarni

0

Intenta eliminar 'dataType:' JSON '' de la solicitud de ajax y comprueba.

1

Como dkulkarni comentado en su puesto (enero 24 a las 07:53), la única manera de recuperar JSON enviado con la aplicación Content-Type/JSON parece ser para recuperarlo directamente desde el flujo de entrada.

Hice muchas pruebas con diferentes enfoques, pero siempre cuando configuro Content-Type en JSON, $ _POST en PHP está vacío.

Mi problema es que necesito configurar Content-Type en JSON, porque el servidor (donde no tengo acceso) lo espera, de lo contrario devuelve datos no admitidos. Supongo que están recuperando directamente del flujo de entrada.

¿Por qué tengo que reproducir eso en mi propio archivo PHP? Porque necesito hacer un proxy para probar problemas, pero ese no es el sentido de este hilo.

+0

¿no puede dejar el tipo de datos: "JSON" y todavía eliminar el tipo de contenido? Eso es lo que hice y funciona perfectamente. Aunque tardé horas en quitarme el pelo antes de ver la respuesta de Steven Wexler. – Mike

2

Encontré que el comentario proporcionado por dkulkarni era la mejor solución aquí. Es necesario leer directamente del flujo de entrada para obtener datos POST de cualquier complejidad. Cambiar el valor de $.ajax({contentType: ''}) no funcionó para mí ..

Para solucionar este problema, había configurado un método de control para recuperar el JSON que estaba publicando en mi servidor. Cambiar el encabezado ContentType no hizo diferencia. Pero después de leer el comentario de dkulkarni he cambiado de código de servidor de esto:

return $_POST; 

a esto:

$data = file_get_contents('php://input'); 
    return json_decode($data); 

funcionó a la perfección.

+0

Esto es un genio absoluto. ¡¡¡¡GRACIAS!!!! Gracias a dkulkami por el comentario, y gracias a ti por hacer que la solución sea más obvia con esta respuesta. Había estado HORAS intentando averiguar por qué $ _POST estaba vacío ... – kpollock

0

Tomar contentType no es una buena idea. ¿QUIERES enviar estos datos en formato JSON? La clave es hacer lo que se ha mencionado anteriormente, en lugar de tratar de acceder a los datos en el extremo receptor (el archivo php de destino) con $ data = $ _POST es fundamental usar $ data = file_get_contents ('php: // input');

Aquí es un ejemplo de todo el ida y vuelta para un escenario con PHP y knockout.js:

JS (sobre la petición de la página):

function() { 
    var payload = ko.toJSON({ YOUR KNOCKOUT OBJECT }); 
    jQuery.ajax({ 
      url: 'target.php', 
      type: "POST", 
      data: payload, 
      datatype: "json", 
      processData: false, 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
       alert(result); 
      } 
     }); 
}; 

Y luego, en target.php (la página recibir la solicitud):

$data = file_get_contents('php://input'); 
$payload_jsonDecoded = json_decode($data 
Cuestiones relacionadas