Bucle para recibir todas las variables por POST en PHP

  • Por
  • 20 de noviembre de 2003
  • Valoración:
  • 23 Comentarios
  • Scripts en PHP
Una manera muy rápida de recibir todas las variables de un formulario, enviado por post. Mediante un recorrido genérico del array $_POST, en el lenguaje PHP.
Vamos a ver una manera muy rápida de recibir todas las variables de un formulario, enviado por post, en el lenguaje PHP. Os aseguro que es una pequeña porción de código que os ahorrará escribir un montón de líneas de código.

Quién no se ha visto alguna vez en la tediosa tarea de recibir un montón de datos de un formulario, asignando una por una todas las variables en PHP? Eso se hacía con líneas como ésta:


$nombre = $_POST["nombre"];
$edad = $_POST["edad"];
$ciudad = $_POST["ciudad"];
....


Si el formulario tuviera 10 elementos no sería muy pesado escribir las 10 líneas de código, pero si fueran 50 o 100 la cosa sería mucho menos agradable. El código que vamos a ver ahora nos solucionará la vida en esos casos.

foreach($_POST as $nombre_campo => $valor){
   $asignacion = "\$" . $nombre_campo . "='" . $valor . "';";
   eval($asignacion);
}


Se realiza un bucle foreach que va recorriendo cada uno de los elementos del post. En cada iteración, se van accediendo a todos los elementos del post y se guarda en $ nombre_campo el nombre del campo recibido por el formulario y en $valor, el valor que se había introducido en el formulario.

Todo lo anterior se deduce de la primera línea. En las siguientes se compone en cada iteración, cada una de las asignaciones que deberíamos haber escrito manualmente. Es decir, en la variable asignación guardaremos una línea de código PHP que realiza la declaración de la variable de formulario dentro de PHP y su inicialización con el valor que se hubiera escrito.

En la siguiente línea, donde está la función eval(), se ejecuta la sentencia generada en el anterior paso. La función eval() de PHP ejecuta el contenido de una cadena de caracteres como si fuera una sentencia PHP. (Podemos ver la documentación de la función eval() en la página de PHP http://es.php.net/manual/es/function.eval.php)

Esperamos que os haya interesado este minúsculo, pero útil, código PHP.

Nota: Se puede consultar otro artículo que hace un recorrido similar, en ese caso para declarar como variables todos los datos recibidos en una fila de un recordset.
Así mismo tenemos un artículo que nos muestra cómo recibir de forma segura los datos de un formulario.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Comentarios

Gabriel Cambronero

26/11/2003
Excelente aplicación si el caso fuese que enviasemos esos datos por mail, pero para la introducción de esos datos - Suponiendo que son 100 - en una base de datos MySQL ?

Guillermo Gianello

26/11/2003
Una pequeña variante, que por otra parte, nos habilita pasar argumentos incluso con RegisterGlobals=off en phpini.

<?PHP
foreach ($HTTP_SERVER_VARS as $indice=>$cadena) {
$$indice = $cadena;
}
foreach ($HTTP_POST_VARS as $indice=>$cadena) {
$$indice = $cadena;
## echo "$indice = $cadena";
}
foreach ($HTTP_GET_VARS as $indice=>$cadena) {
$$indice = $cadena;
}
foreach ($HTTP_COOKIE_VARS as $indice=>$cadena) {
$$indice = $cadena;
}
?>


ya ni siquiera nos hace falta el eval()

Leonardo Bustamante

26/11/2003
Muy buen apunte Guillermo, pues si alguien me mandara codigo en la variable, facilmente puede cuadrarla para ejecutar codigo en mi maquina

Manolo

27/11/2003
Pues tenemos una utilísima función en php que nos hace este trabajo automáticamente, es la siguiente, y con sólo una línea de codigo:

extract($_POST);

esta crea las variables automáticamente igual que se describe en este artículo. Aparte esta función tiene muchas mas utilidades, mirad, mirad: es.php.net/manual/es/function.extract.php

saludos.

Ramon Sosa

08/12/2003
Efectivamente es más fácil utilizar la función extract, pero para crear una Instrucción MySql, es preferibe conservarlo como array y hacer lo siguiente:
$tabla='tabla';
$arraypost=array();
foreach($_POST as $k => $v) $arraypost[]="$k='$v'";
$sql="INSERT INTO $tabla SET ".implode(', ',$arraypost);

// Utilizar las funciones implode y explode son muy prácticas y se van a ahorrar muchos dolores de cabeza, también el extract es muy bueno...

juancito

13/1/2004
muy bueno para poder evitar escribir todas las variables, es de mucha ayuda para aplicaciones grandes

Kurroman

27/7/2004
Sirve para selects con opciones múltiples? No me funciona y no se si es que no lo soporta o se debe hacer de otra forma. En el form llamo al select "servicios[]" tal y como se indica en este mismo manual.

Leonardo Bustamante

09/2/2005
Pero es mejor hacer un arreglo con el nombre de campos y asi construir el query evaluando que campos estan vacios y que no.
Pues en el $_POST tambien se incluyen variables x y y entre otras que puede ser, lo mas seguro, que no esten en la base de datos.

Rober

23/8/2005
creo que este script eleva la vulnerabilidad del código a la misma que se tiene con register_globals = on.
lo uso, pero creo que puede ser inseguro.

mary

10/4/2006
necesito un ocdigo en php para hacer un buscador , pero dentro de una misma pagina , nada de base de datos.
gracias

Covi

27/5/2006
Yo siempre he usado esto:

<code>
// Vars Cortas:
foreach($_POST as $k=>$v)
{
${$k}=$v;
}
</code>

Aunque, por lo visto, supongo que no es la mejor manera, no? nfinss

PD: No conocía extract()! :)

aceror

06/11/2006
extract es perfecto, sin complicaciones, es lo que andaba buscando...

Martin Peña

10/10/2007
No logro insertar registros en la tabla de mi base de datos con php, alguien me puede ayudar. el codigo que utilizo es:

<?php
$nombre=$_POST["nombre"];
$direccion=$_POST["direccion"];
$telefono=$_POST["telefono"];
$email=$_POST["email"];
$estado=$_POST["estado"];
include("conec.php");
$link=Conectarse();
mysql_query("INSERT INTO usuarios (nombre,direccion,telefono,email,estado); values ('$nombre','$direccion', '$telefono', '$email', '$estado')",link);
header("Location: insertareg.php");
?>

y al ejecutar este codigo no obtengo ni un solo registro de. mi correo es mbello@fpp.com.mx

elricho

08/1/2008
Me salvaste la vida, me super sirvio. Justo mi servidor cambio a global off y no me andaba nada.

Ahora ese codigo puede ser peligroso o es lo mismo que yo iguale variable a variable en ves de hacerlo con un bucle ? gracias.

<script LANGUAGE="JavaScript">
var pagina="http://cosikas.no-ip.org"
function redireccionar()
{
location.href=pagina
}
setTimeout ("redireccionar()", 100);
</script>

panicape

08/4/2009
Una pregunta
¿el resultado de eso es que quedan las variables creadas con cada uno de los nombres de las variables que se traen? o queda una cadena creada con el nombre de $GLOBALS y se le insertan los nombres de las variables a la cadena??

panicape

08/4/2009
Otra cosa
y para utilizar las variables que se crearon como lo hago?
y como le asigno un valor a la variable creada?

Oscar

05/4/2010
No comprendo
Si tengo un form que envia un dato por POST y lo recibo con un bucle foreach al momento de mostrar el contenido de el post no muestro lo que envie da un contenido distinto, el caso es que lo muesto asi

echo $nombre_variable['0'];

el resultado es "n"
Espeor me ayuden

Juan Pablo

11/11/2010
Cuidado con este codigo
Cuidado con este codigo. De hecho es MUY mala idea implementar esto.

Ejecutar código PHP concatenando valores que llegan por parámetro SIN sanarlos es la peor idea. Es incluso peor que la inyección SQL.

Para quien no sepa, se pueden generar variables dinamicamente, sin comprometer al sistema de la forma

$$hola = $valor;

con esto, si la variable $hola vale 'prueba', entonces esa linea de codigo guardará en $prueba el valor que tenga $valor.

Saludos

cristian

27/4/2011
excelente!!!
como siempre me encuentro con otro excelente código en este sitio. Muchísimas gracias.

academo

23/7/2011
Una falla de seguridad inmensa
Te das cuenta la falla de seguridad tan inmensa que tienes ahi?
Este código le permitiría a cualquier ejecutar cualquier código dentro de tu script. Cuidado con este código, por eso el register_globals no se usa y esto tampoco.

zapp

16/4/2012
este artículo debería ser eliminado
Advertencia

No use extract() en datos que no son de confianza, como las entradas de usuario (esto es, $_GET, $_FILES, etc.). Si lo hace, por ejemplo si quiere ejecutar código antiguo que cuenta con register_globals temporalmente, asegúrese de usar uno de los valores de extract_type que no sobrescriban, como EXTR_SKIP, y sepa que debería realizar la extracción en el mismo orden que fue definido en variables_order dentro de php.ini.

Jose Seijas

21/3/2014
Muy Util Gracias
Se lo importante que es agradecer cuando una aportación a uno como desarrollador le es util
Muchas Gracias!!!!!

Compartir