Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

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)
La siguiente información es importante:
  • 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;
Hay posibilidades de que estes utilizando una version <7.3 en este caso puede que el código anterior de error: PHP Parse error: syntax error, unexpected end, este error se debe a que HTML; tiene espacio antes o despues o a ambos lados.
Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category