Obviamente, si envío datos JSON a php usando una publicación AJAX u obtengo una solicitud, terminaré recibiendo solo el tipo de datos de cadena en la variable php $_POST.
¿Cuál es la mejor práctica para enviar campos JSON pero manteniendo sus tipos de datos? Mi idea sería enviar todo el JSON en un campo $_POST y luego decodificarlo una vez más.
Entonces en JavaScript en lugar de:
$.post('test.php', {"stringparm":"a string","numparm": 66,"boolparm":true)}, function (result) ...Yo usaría:
params = '{"stringparm":"a string","numparm": 66,"boolparm":true)}'; $.post('test.php', {'params': params}, function (result) { .... }Y en php yo haría:
$params = json.decode($_POST['params']);¿O hay un mejor camino?
Mi recomendación sería enviarlos como una cadena de consulta usando Fetch o Axios, también puede usar Ajax y debería enviar los distintos tipos de datos correctamente, y luego analizar la cadena de consulta en PHP de esta manera.
parse_str($_SERVER['QUERY_STRING'], $data); $data = (object) $data;Estoy seguro de que sabe cómo se ve su cadena de consulta estándar
https://example.com/?user_id=value&someotherdata=value etc...Una vez que tenga el objeto $data, puede acceder a los valores con la flecha -> operador.
$user_id = $data->user_idAquí hay un script que uso para crear una cadena de consulta a partir de un objeto proporcionado.
prepareQuerystring(url, paramsObject, isParamsObjectUsed, phpMethod = '') { if (url !== '') { let postUrl = `${url}${phpMethod}`; if (isParamsObjectUsed) { postUrl += `?`; let it = 0; let len = Object.keys(paramsObject).length for (let i in paramsObject) { if (it === len - 1) { postUrl = postUrl + [i] + '=' + paramsObject[i]; } else { postUrl = postUrl + [i] + '=' + paramsObject[i] + '&'; } it++; } return postUrl; } else { postUrl = `${url}${phpMethod}/`; return postUrl; } } else { let postUrl = `${window.location.href}${phpMethod}/`; if (isParamsObjectUsed) { postUrl += `?`; let it = 0; let len = Object.keys(paramsObject).length for (let i in paramsObject) { if (it === len - 1) { postUrl = postUrl + [i] + '=' + paramsObject[i]; } else { postUrl = postUrl + [i] + '=' + paramsObject[i] + '&'; } it++; } return postUrl; } else { postUrl = `${window.location.href}${phpMethod}/`; return postUrl; } }}
El argumento url es su url base ( https://example.com )
El paramObject es su objeto JSON que es solo un objeto en Javascript.
{ user_id: 1, someotherdata: 'shoe' }El argumento del método PHP está ahí para llamar a un método específico en php, simplemente se agrega después de la URL base, mi API me permite hacer llamadas de esta manera, es posible que la tuya no, así que puedes dejarlo como una cadena vacía ''.
Y el isParamsObjectUsed es un valor booleano, si pasa un objeto en el segundo argumento, esto será cierto, honestamente, no recuerdo haberlo configurado en falso, por lo que es posible que deba refactorizarlo y eliminarlo eventualmente.
He aquí un ejemplo de cómo usarlo.
let url = prepareQuerystring( https://example.com/, { user_id: 1, someotherdata: 'shoe', someBool: true }, true )Tendrá referencia a todos los parámetros como su tipo de datos en PHP utilizando este método. Uso Axios para enviar solicitudes http, pero esto también funciona con Ajax y Fetch, recomendaría usar Fetch o Axios. Principalmente porque no recuerdo cómo lo hice funcionar con Ajax, normalmente uso Fetch o Axios.
fetch(url, { method: "POST" })Espero que esto te ayude a orientarte en la dirección correcta. Hazme saber si tienes alguna pregunta.