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;