Tengo un montón de valores que deben pasarse al servidor, y parece que no puedo hacer que funcionen las funciones básicas como la decodificación JSON. Algo está mal aquí, agradeceré que alguien lo vea

Tengo una tabla generada dinámicamente con valores editables que tomo cuando el usuario hace clic en el botón Agregar, lo inserto en una matriz y lo envío al servidor con una llamada ajax. Aquí hay datos de muestra enviados que copié de console.log (datos); línea.

var data = params + "&Details="+JSON.stringify(Details);
console.log(data);     // &Id[]=1566&aId[]=1567&Details=[["1566","First File","sdf.pdf","general","file","",""],["1567","2nd file","test.png","image","file","",""]] 

$.ajax({
    type: 'POST',
    url: editUrl,
    dataType: 'json',
    data: data,
    success: function() { console.log('success'); }
    error: function() { console.log('error'); }
});

En el lado del servidor obtengo los datos pero no puedo analizarlos en un formato utilizable

$ids = ($_POST['Id']);    // this is a valid array
$details = ($_POST['Details']);     // [[ 1566 , First File ,  , general , file ,  ,  ],[ 1567 , 2nd file ,  , image , file ,  ,  ]]
$details = json_decode($details);   // getting JSON_ERROR_CTRL_CHAR error and null is returned

Alguna idea de lo que está mal aquí?

0
Mark 29 ago. 2014 a las 00:27

4 respuestas

La mejor respuesta

Necesita codificar el JSON correctamente:

var data = params + "&Details="+encodeURIComponent(JSON.stringify(Details));

Sin embargo, sería mejor, en mi humilde opinión, hacer data un objeto en lugar de una cadena.

var data = {
    Id: [ 1566, 1567],
    Details: JSON.stringify(Details)
};

Tendrá que cambiar la forma en que crea params para que también produzca un objeto. Luego puede usar $.extend() para fusionarlos:

var data = $.extend({}, params, { Details: JSON.stringify(Details) });
1
Barmar 28 ago. 2014 a las 20:56

Prueba json_decode(stripslashes($details))

-2
helle 28 ago. 2014 a las 20:32

A su parámetro ajax le falta un comma después de la función de éxito, e intente definir la devolución de llamada de la función de éxito del servidor como datos y luego use json_encode para sus datos de matriz en el servidor php.

$.ajax({
   type: 'POST',
   url: editUrl,
   dataType: 'json',
   data: data,
   success: function(data) { console.log(data); },
   error: function() { console.log('error'); }
});
0
user3349436 28 ago. 2014 a las 20:38

No estoy seguro de cómo está construyendo variables de parámetros o por qué. Pero si es solo para enviar a través de ajax, no tiene que hacerlo. El parámetro de datos de ajax lo hará por usted. Dele un objeto con sus pares de nombre / valor que desea enviar.

$.ajax({
  type: 'POST',
  url: editUrl,
  dataType: 'json',
  data: { 
    Id: [2566],
    aId: [1567],
    Details: Details,
    Other: 'Hi',
    AnotherId: 1234
  }
  success: function() { console.log('success'); }
  error: function() { console.log('error'); }
});

En el servidor, mire todas las variables $ _POST para tener una idea de lo que se envió y el formato

<?php
  echo '<pre>'
  print_r($_POST);
?>
0
Dustin Butler 28 ago. 2014 a las 22:08