Utilizando php://input
El stream php://input es de de solo lectura, el cual nos permite leer los datos del body solicitado(request body) sin ningún proceso.
Cuando obtenemos los datos con la variable superglobal $_POST, esta es para datos de formularios y suba de archivos.(clásicos formularios HTML)
- application/x-www-form-urlencoded ( form-posts)
- multipart/form-data (file uploads)
- no puedes usarlo con
enctype="multipart/form-data" - php://input es preferible en vez de
$HTTP_RAW_POST_DATA, ya que no depende de directivas php.ini
AJAX y php//input
Muchas veces php://input es preferible al utilizarlo cuando utilizas AJAX, no es que no funcione $_POST, php//:input no tiene procesado de ningún tipo es raw_data.
También que tengamos en cuenta que muy probablemente querríamos recibir contenido JSON(contenido será application/json)
¿Bien como lo utilizo ?
Si va a la página de php.net probablemente no encuentres ningún ejemplo de php://input. ya asume que sabes usar todos los php:// con los pocos ejemplos que da. Tengamos en cuenta que php://input forma parte de un conjunto de streams de entradas y salidas(I/O Streams).
Podemos utilizar una función que ya hemos visto antes llamada file_get_contents.
$inputdata = file_get_contents("php://input");
hagamos un ejemplo con AJAX y obtengamos nuestros datos de esta manera. Tomaré el siguiente ejemplo de JQuery
Tomaremos este ejemplo y lo cambiaremos
$.ajax({
method: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
})
.done(function( msg ) {
alert( "Data Saved: " + msg );
});
y lo modificaremos que quede de esta manera
ajaxpage.html<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>example of php://input</title>
</head>
<body>
<main>
<div id="resultado">
<p>el resultado va aqui:</p>
</div>
</main>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"> </script>
<script>
//Blastcoding.com
$.ajax({
method: "POST", //metodo con el que sera enviada
url: "inputs.php", //URL donde sera envida
data: { name: "John", location: "Boston" } //data que sera enviada
})
.done(function( msg ) {
$( "#resultado" ).append( msg );
});
</script>
</body>
</html>
para nuestro archivo php podemos hacer lo siguiente:
inputs.php<?php
$inputsdata = file_get_contents("php://input");
echo $inputsdata;
entre estos 2 archivos nos dará como resultado lo siguiente:
el resultado va aquí:
name=John&location=Boston
Desde aquí ya podríamos utilizar la función parse_str y hacer algo similar a lo que hacemos con $_POST.
Ahora veamos algo distinto
Que pasa si en nuestro $.ajax le cambiamos el valor por defecto de proccessData a False
cambio en código de ajaxpage.html<script>
//Blastcoding.com
$.ajax({
method: "POST", //metodo con el que sera enviada
url: "inputs.php", //URL donde sera envida
data: { name: "John", location: "Boston" }, //data que sera enviada
processData:false
})
.done(function( msg ) {
$( "#resultado" ).append( msg );
});
</script>
el resultado de esto sera:
el resultado va aquí:
[object Object]
Que es lo que queríamos, pues lo que le está mandando a PHP es un objeto, pero para que podamos usarlo en PHP necesitaríamos que sea un string veamos como quedaría todo.
ajaxpage.html(modificado)<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>example of php://input</title>
</head>
<body>
<main>
<div id="resultado">
<p>el resultado va aqui:</p>
</div>
</main>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"> </script>
<script>
//Blastcoding.com
$.ajax({
method: "POST", //metodo con el que sera enviada
url: "inputs2.php", //URL donde sera envida
data: JSON.stringify({name: "John",location: "Boston"}), //data que sera enviada
processData:false
})
.done(function( msg ) {
$( "#resultado" ).append(msg);
});
</script>
</body>
</html>
por otra parte nuestro PHP seria el siguiente, en mi caso decidí hacerlo en un nuevo archivo php.
inputs2.php<?php
$inputsdata = file_get_contents("php://input");
$arr = json_decode($inputsdata,true);
$message = <<<HTML
name : {$arr['name']}, location: {$arr['location']}
HTML;
echo $message;

