create - ¿Enviar datos JSON de Javascript a PHP?
return json php (9)
¿Cómo puedo enviar datos JSON desde Javascript en el navegador, a un servidor y hacer que PHP lo analice allí?
Archivo Javascript usando jQuery (limpiador pero overhead de la biblioteca):
$.ajax({
type: ''POST'',
url: ''process.php'',
data: {json: JSON.stringify(json_data)},
dataType: ''json''
});
Archivo PHP (process.php):
directions = json_decode($_POST[''json'']);
var_dump(directions);
Tenga en cuenta que si usa funciones de devolución de llamada en su javascript:
$.ajax({
type: ''POST'',
url: ''process.php'',
data: {json: JSON.stringify(json_data)},
dataType: ''json''
})
.done( function( data ) {
console.log(''done'');
console.log(data);
})
.fail( function( data ) {
console.log(''fail'');
console.log(data);
});
Debe, en su archivo PHP, devolver un objeto JSON (en formato JavaScript), para obtener un resultado ''hecho / hecho'' en su código Javascript. Como mínimo retorno / impresión:
print(''{}'');
Consulte Ajax request return 200 OK, pero se desencadena el error en lugar de éxito
Aunque para algo un poco más serio, debería devolver un encabezado adecuado explícitamente con el código de respuesta apropiado.
Ejemplo simple de JavaScript para campos de entrada HTML (envío al servidor JSON, análisis JSON en PHP y envío al cliente) usando AJAX:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<body>
<div align="center">
<label for="LName">Last Name</label>
<input type="text" class="form-control" name="LName" id="LName" maxlength="15"
placeholder="Last name"/>
</div>
<br/>
<div align="center">
<label for="Age">Age</label>
<input type="text" class="form-control" name="Age" id="Age" maxlength="3"
placeholder="Age"/>
</div>
<br/>
<div align="center">
<button type="submit" name="submit_show" id="submit_show" value="show" onclick="actionSend()">Show
</button>
</div>
<div id="result">
</div>
<script>
var xmlhttp;
function actionSend() {
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var values = $("input").map(function () {
return $(this).val();
}).get();
var myJsonString = JSON.stringify(values);
xmlhttp.onreadystatechange = respond;
xmlhttp.open("POST", "ajax-test.php", true);
xmlhttp.send(myJsonString);
}
function respond() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById(''result'').innerHTML = xmlhttp.responseText;
}
}
</script>
</body>
</html>
Archivo PHP ajax-test.php:
<?php
$str_json = file_get_contents(''php://input''); //($_POST doesn''t work here)
$response = json_decode($str_json, true); // decoding received JSON to array
$lName = $response[0];
$age = $response[1];
echo ''
<div align="center">
<h5> Received data: </h5>
<table border="1" style="border-collapse: collapse;">
<tr> <th> First Name</th> <th> Age</th> </tr>
<tr>
<td> <center> ''.$lName.''<center></td>
<td> <center> ''.$age.''</center></td>
</tr>
</table></div>
'';
?>
Encontré una forma fácil de hacerlo, pero sé que no es perfecto
1. asignar json a
si tu JSON es
var data = [
{key:1,n: "Eve"}
,{key:2,n:"Mom"}
];
en --- main.php ----
<form action="second.php" method="get" >
<input name="data" type="text" id="data" style="display:none" >
<input id="submit" type="submit" style="display:none" >
</form>
<script>
var data = [
{key:1,n: "Eve"}
,{key:2,n:"Mom"} ];
function setInput(data){
var input = document.getElementById(''data'');
input.value = JSON.stringify(data);
var submit =document.getElementById(''submit'');
//to submit and goto second page
submit.click();
}
//call function
setInput(data);
</script>
en ------ second.php -----
<script>
printJson();
function printJson(){
var data = getUrlVars()["data"];
//decode uri to normal character
data = decodeURI(data);
//for special character , / ? : @ & = + $ #
data = decodeURIComponent(data);
//remove " '' " at first and last in string before parse string to JSON
data = data.slice(1,-1);
data = JSON.parse(data);
alert(JSON.stringify(data));
}
//read get variable form url
//credit http://papermashup.com/read-url-get-variables-withjavascript/
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>
Hay 3 formas relevantes de enviar datos desde el lado del cliente (HTML, Javascript, Vbscript ..etc) al lado del servidor (PHP, ASP, JSP ... etc.)
1. HTML form Posting Request (GET or POST).
2. AJAX (This also comes under GET and POST)
3. Cookie
Solicitud de publicación de formulario HTML (GET o POST)
Este es el método más comúnmente utilizado, y podemos enviar más datos a través de este método
AJAX
Este es el método Asíncrono y esto tiene que funcionar de manera segura, aquí también podemos enviar más Datos.
Galleta
Esta es una buena forma de usar una pequeña cantidad de datos insensibles. esta es la mejor manera de trabajar con un poco de datos.
En su caso, puede preferir la publicación en formato HTML o AJAX. Pero antes de enviar al servidor, valide su json usted mismo o use un enlace como http://jsonlint.com/
Si tiene Json Object conviértalo en String usando JSON.stringify (object), si tiene cadena JSON, envíela como está.
PHP tiene una función incorporada llamada json_decode (). Simplemente pase la cadena JSON a esta función y la convertirá a la cadena, matriz u objeto equivalente de PHP.
Para pasarlo como una cadena de Javascript, puede convertirlo a JSON usando
JSON.stringify(object);
o una biblioteca como Prototype
Recomiendo el método jquery.post() .
usando JSON.stringify (yourObj) u Object.toJSON (yourObj) el último es para usar prototype.js, luego envíelo usando lo que quiera, ajax o submit, y use, como se sugiere, json_decode ( http://www.php.net/manual/en/function.json-decode.php ) para analizarlo en php. Y luego puedes usarlo como una matriz.
He obtenido mucha información aquí, así que quería publicar una solución que descubrí.
El problema: Obtener datos JSON de Javascript en el navegador, en el servidor y hacer que PHP lo analice con éxito.
Medio ambiente: Javascript en un navegador (Firefox) en Windows. Servidor LAMP como servidor remoto: PHP 5.3.2 en Ubuntu.
Lo que funciona (versión 1):
1) JSON es solo texto. Texto en un formato determinado, pero solo una cadena de texto.
2) En Javascript, var str_json = JSON.stringify(myObject)
me da la cadena JSON.
3) Utilizo el objeto AJAX XMLHttpRequest en Javascript para enviar datos al servidor:
request= new XMLHttpRequest()
request.open("POST", "JSON_Handler.php", true)
request.setRequestHeader("Content-type", "application/json")
request.send(str_json)
[... code to display response ...]
4) En el servidor, código PHP para leer la cadena JSON:
$str_json = file_get_contents(''php://input'');
Esto lee los datos de POST sin formato. $str_json
ahora contiene la cadena JSON exacta del navegador.
Lo que funciona (versión 2):
1) Si quiero usar el encabezado de solicitud "application/x-www-form-urlencoded"
, necesito crear una cadena POST estándar de "x=y&a=b[etc]"
para que cuando PHP lo obtenga, pueda ponerlo en la matriz asociativa $_POST
. Entonces, en Javascript en el navegador:
var str_json = "json_string=" + (JSON.stringify(myObject))
PHP ahora podrá completar la matriz $ _POST cuando envíe str_json a través de AJAX / XMLHttpRequest como en la versión 1 anterior.
Viendo el contenido de $_POST[''json_string'']
se mostrará la cadena JSON. El uso de json_decode () en el elemento de matriz $ _POST con la cadena json decodificará correctamente esos datos y los colocará en una matriz / objeto.
La trampa que encontré:
Inicialmente, traté de enviar la cadena JSON con el encabezado de application / x-www-form-urlencoded y luego traté de leerlo inmediatamente de la matriz $ _POST en PHP. La matriz $ _POST siempre estaba vacía. Eso es porque está esperando datos de la forma yval = xval & [aclase_and_repeat]. No encontró tal información, solo la cadena JSON, y simplemente la tiró. Examiné los encabezados de las solicitudes y los datos POST se enviaron correctamente.
De manera similar, si uso el encabezado application / json, nuevamente no puedo acceder a los datos enviados a través de la matriz $ _POST. Si desea utilizar el encabezado de tipo de contenido application / json, debe acceder a los datos POST brutos en PHP, a través de php: // input, no con $ _POST.
Referencias
1) Cómo acceder a los datos POST en PHP: ¿Cómo acceder a los datos POST en PHP?
2) Detalles sobre el tipo de aplicación / json, con algunos objetos de muestra que se pueden convertir a cadenas JSON y enviar al servidor: http://www.ietf.org/rfc/rfc4627.txt
<html>
<script type="text/javascript">
var myJSONObject = {"bindings": 11};
alert(myJSONObject);
var stringJson =JSON.stringify(myJSONObject);
alert(stringJson);
</script>
</html>