Foros del Web » Programando para Internet » PHP »

Problema con 'foreach'

Estas en el tema de Problema con 'foreach' en el foro de PHP en Foros del Web. Buenos días, se me ha planteado un problema a la hora de crear variables con los valores recibidos de formulario, a través de un bucle ...
  #1 (permalink)  
Antiguo 31/10/2008, 05:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Problema con 'foreach'

Buenos días, se me ha planteado un problema a la hora de crear variables con los valores recibidos de formulario, a través de un bucle 'foreach', metido en una función.

El problema resulta al realizar el bucle llamando a la función, que no genera las variables; mientras que si hago el bucle desde fuera, no da problemas.

Copio el código por si alguien me puede ayudar.

Muchas gracias.

Código PHP:
# -> Creación de varibles de formulario

function VariablesFormulario () {
    foreach (
$_POST as $campo => $valor) {
        
$asignacion "$" $campo "='" $valor "';";
        eval(
$asignacion); 
    }
}

// ------------------------------------


# -> Opción 1: No funciona

VariablesFormulario ();


#-> Opción 2: Funciona

        
foreach ($_POST as $campo => $valor) {
            
$asignacion "$" $campo "='" $valor "';";
            eval(
$asignacion);
        }
    
        
$asunto "Consulta WEB";
        
$mensaje "<span class='producto'>Nombre: </span>" .$nombre"<br />";
        
$mensaje .=    "<span class='producto'>Apellidos: </span>" .$apellidos"<br />";
        
$mensaje .= "<span class='producto'>Empresa: </span>" .$empresa"<br />";
        
$mensaje .= "<span class='producto'>Mail: </span><a href='mailto:".$mail."'>" .$mail"</a><br />";
        
$mensaje .= "<span class='producto'>Consulta: </span>" .$consulta"<br />";
    
        echo 
$mensaje;
                
//        mail($para, $asunto, $mensaje, $headers);
//        Header("Location:index.php?pag=9&contacto=confirma");
//        exit();
    

Puede que sobre alguna llave, o algún otro símbolo, pero he copiado/pegado, porque viene de un "if". Por otra parte he dejado sin comentar las dos opciones, para que se vean bien, en el código uso una u otra.

La segunda opción crea las variables, pero la primera no.

Aprovecho también a comentar que he puesto en el mensaje los saltos de línea
Código HTML:
<br /> 
, porque no me 'funcionan' los
Código PHP:
"\r\n" 
.
Saludos.
  #2 (permalink)  
Antiguo 31/10/2008, 06:03
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

¿Cómo sabes que no las crea dentro de la función? Ten en cuenta que todas las variables que se crean en una función se destruyen al salir de la misma (a no ser que sean globales o pasadas por referencia).

Otra posibilidad es que el array $POST no sea accesible dentro de la función, para solucionarlo bastaría con pasarselo como parámetro a la función.
  #3 (permalink)  
Antiguo 31/10/2008, 06:30
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Ummmmmmm, cierto ;)

Probaré entonces con esto, que creo que es como sería la 2º forma que comentas, ¿no?:

Código PHP:
function VariablesFormulario ($_POST) { 
    foreach (
$_POST as $campo => $valor) { 
        
$asignacion "$" $campo "='" $valor "';"
        eval(
$asignacion);  
    } 

Saludos y comentaré los resultados.
  #4 (permalink)  
Antiguo 31/10/2008, 06:34
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Sí, pero ten en cuenta que las variables que creas en esa función no perdurarán fuera de ella, es decir se crean en el foreach, pero al salir de la función se destruyen todas.

Por otra parte puedes usar: ${$campo} = $valor; para crear la variable (o eso tengo entendido, pero tampoco estoy seguro)
  #5 (permalink)  
Antiguo 31/10/2008, 06:42
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Visto!!

Se puede referenciar de esta manera, aún así, hasta que no llegue a casa, no puedo comprobarlo y ver si funciona.

Código PHP:
function VariablesFormulario (&$_POST) { 
    foreach (
$_POST as $campo => $valor) { 
        
$asignacion "$" $campo "='" $valor "';"
        eval(
$asignacion);  
    } 

Saludos, gracias y comentaré los resultados.
  #6 (permalink)  
Antiguo 31/10/2008, 06:44
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Umm, no exactamente con eso haces que $_POST sea quien está por referencia, pero tú lo que quieres es que lo sean las variables nuevas que vas a crear.
  #7 (permalink)  
Antiguo 31/10/2008, 10:27
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Buenas, al final, al tener el código delante y tras unos intentos, no estoy seguro de cómo pasar las nuevas variables.

La verdad que para este caso, no me preocupa, porque sólo tiene dos formularios la web, pero en otros casos, puede ser interesante, así que seguiré investigando y agradecería cualquier sugerencia.

Saludos.
  #8 (permalink)  
Antiguo 31/10/2008, 11:05
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Umm, puedes probar con esto:

Código php:
Ver original
  1. function VariablesFormulario ($auxDatos) {
  2.     foreach ($auxDatos as $campo => $valor)
  3.         $GLOBALS[$campo] = $valor;
  4. }
  #9 (permalink)  
Antiguo 31/10/2008, 11:57
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

OK, muchas gracias, pero se me escapa algo. ¿En qué momento recoge los valores del POST? He reemplazado esta función por la anterior y claro, falla porque no recibe valores. Hasta ahora no había tenido que utilizar algo parecido y tampoco tengo una experiencia tremenda, con lo que me siento un poco perdido :(

Saludos
  #10 (permalink)  
Antiguo 31/10/2008, 11:59
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Llama a la función con los valores de $_POST:

Código php:
Ver original
  1. VariablesFormulario($_POST);
  #11 (permalink)  
Antiguo 31/10/2008, 12:41
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Buenas, copio toda la parte del rollo, sigue sin funcionar.

Código PHP:
# -> Creación de varibles de formulario

/*function VariablesFormulario () {
    foreach ($_POST as $campo => $valor) {
        $asignacion = "$" . $campo . "='" . $valor . "';";
        eval($asignacion); 
    }
}*/

      function VariablesFormulario ($auxDatos) {
          foreach ($auxDatos as $campo => $valor)
              $GLOBALS[$campo] = $valor;
      }



# -> Creación de formulario de contacto

function do_form_contacto() {
?>
    <form id="contacto" action="index.php?pag=9&contacto=envio&tipo=0" method="post" name="f_consulta" onsubmit="return formValidation()">
        <fieldset>
            <img class='f_right' src='img/srta.jpg' alt='consulta' height="150px" />
            <legend>Información de contacto</legend>
            <label for="nombre">Nombre:</label>
            <input type="text" name="nombre" /><br />
            <label for="apellidos">Apellidos:</label>
            <input type="text" name="apellidos" />
            <label for="empresa">Empresa:</label>
            <input type="text" name="empresa" />
            <label for="mail">Mail:</label>
            <input type="text" name="mail" />            
        </fieldset>
        <fieldset>
            <legend>Consulta</legend>
            <textarea id="consulta" name="consulta"></textarea>
        </fieldset>
        
        <input type="submit" value="enviar" />
        <input type="reset" value="borrar" />
    </form>
<?php
}

# -> Envío formulario

function envio_formulario () {
    
$tipo $_GET['tipo'];
    
    
$para "####";    
    
    if (
$tipo == 1) { // caso compra
        
VariablesFormulario();
        
    }else{ 
// caso consulta


        
VariablesFormulario($_POST);


        
$asunto "Consulta WEB";
        
$mensaje "<span class='producto'>Nombre: </span>" .$nombre"<br />";
        
$mensaje .=    "<span class='producto'>Apellidos: </span>" .$apellidos"<br />";
        
$mensaje .= "<span class='producto'>Empresa: </span>" .$empresa"<br />";
        
$mensaje .= "<span class='producto'>Mail: </span><a href='mailto:".$mail."'>" .$mail"</a><br />";
        
$mensaje .= "<span class='producto'>Consulta: </span>" .$consulta"<br />";
    
        echo 
$mensaje;
                
//        mail($para, $asunto, $mensaje, $headers);
//        Header("Location:index.php?pag=9&contacto=confirma");
//        exit();
    
}

}
  #12 (permalink)  
Antiguo 31/10/2008, 12:48
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

¿Y cuándo llamas a do_form_contacto y envio_formulario?

De todos modos, si quieres usar las variables dentro de la función, tendrás que tratarles como si fuesen globales, es decir añadiendo esto: global $nombre; o referenciadolas como $GLOBALS['nombre']
  #13 (permalink)  
Antiguo 31/10/2008, 13:01
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

buenas, todo esto lo tengo en un archivo de funciones, luego tengo archivos de contenido, donde hago las llamadas a las funciones, tanto de elementos html, como el formulario, como de distribución, etc. Me he acostumbrado a hacerlo así, y no sé, se me hace cómodo ;)

el archivo que llama a do_form_contacto tiene lo siguiente:
Código PHP:
<p class="titulo">Conuslta</p>
<?php
$contacto 
$_GET['contacto'];

switch (
$contacto) {
    
//case : do_form_contacto(); break;
    
case 'envio'envio_formulario(); 
        break;
    
    case 
'confirma': echo "redirecciona"
        break;
    
    default : 
        
do_form_contacto();
        break;
}
?>
Como ves, me queda bastante limpio, para organizarme. De momento en cosas pequeñas que hago, se me hace más cómodo.

Seguiré 'jugando' con las variables globales-

Muchísimas gracias y sigo comentando dudas y progresos
  #14 (permalink)  
Antiguo 31/10/2008, 13:52
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

He realizado otra prueba y creo que se escapa por algún sitio. He intentado proba a imprimir una de las variables dentro de la función, pero fuera del foreach y no imprime nada, es decir, si hago:
Código PHP:
function VariablesFormulario () {
    foreach (
$_POST as $campo => $valor) {
        
$asignacion "\$GLOBALS['" $campo "'] = '" $valor "';"
        eval(
$asignacion); 
        print 
$asignacion."<br />";        
    }
    echo 
$nombre;

Quitando la impresión de cada $asignacion en el bucle, no imprime nada donde está $nombre.

Sin embargo, si hago:
Código PHP:
function VariablesFormulario () {
    foreach (
$_POST as $campo => $valor) {
        
$asignacion "\$GLOBALS['" $campo "'] = '" $valor "';"
        eval(
$asignacion); 
        print 
$asignacion."<br />";        
    }
    echo 
$asignacion;

Me imprime el último valor recibido, en este caso el de $consulta.

Quizá vayan por ahí los tiros y, aunque se declaren las funciones globales, sólo guarda el valor de la variable $asignacion, es decir, no está guardando nada.

Espero que sirva de algo, aunque me da, que lo que debo plantear visto esto, es quizá enviarlos a un array o algo así.

Saludos-
  #15 (permalink)  
Antiguo 31/10/2008, 14:02
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

¿Y por qué no usas la funcíón que puse yo?
  #16 (permalink)  
Antiguo 31/10/2008, 14:17
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

La probé y tampoco me funcionó, la última prueba ha sido:

Código PHP:
function VariablesFormulario ($auxDatos) {
    foreach (
$auxDatos as $campo => $valor) {
        
$valor str_replace("'","","$valor");
        
$GLOBALS[$campo] = $valor;
//        $asignacion = "\$GLOBALS[\"" . $campo . "\"] = '" . $valor . "';";
//        $asignacion = "\$GLOBALS['" . $campo . "'] = '" . $valor . "';"; 
//        eval($asignacion); 
        
print $GLOBALS[$campo]."<br />";        
    }
    echo 
$nombre;

Y el "echo $nombre" ya no lo imprime.

En cuanto a la captura en $mensaje, he probado con $nombre y $GLOBALS[$nombre] y nada.

Quizá sea configuración del servidor, trabajo con WAMP, no se me ocurren más cosas, la verdad.

Voy a probar a subirlo y a hacer las pruebas en el servidor, a ver si hay suerte y es mi local.

Comento en un rato.

Saludos
  #17 (permalink)  
Antiguo 31/10/2008, 14:21
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Nada, en remoto tampoco, esta es la dirección, por si quieren hacer pruebas:
http://jbriceno.es/tmp_jesus/ch/

Gracias
  #18 (permalink)  
Antiguo 31/10/2008, 14:30
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Prueba con esto:

Código php:
Ver original
  1. <?
  2. $prueba = array('lalala' => 'valor1', 'otro_elemento' => 134, 'tercer_elemento' => 'loquesea');
  3.  
  4. function VariablesFormulario ($auxDatos) {
  5.     foreach ($auxDatos as $campo => $valor) {
  6.         //$valor = str_replace("'","","$valor");
  7.         $GLOBALS[$campo] = $valor;
  8.         print $GLOBALS[$campo]."<br />";        
  9.     }
  10. }
  11. VariablesFormulario($prueba);
  12. ?>

Debería funcionar...
  #19 (permalink)  
Antiguo 31/10/2008, 14:37
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Problema con 'foreach'

Tambien puedes usar extract en vez de un bucle foreach para crear las variables:

http://www.php.net/manual/en/function.extract.php
  #20 (permalink)  
Antiguo 31/10/2008, 14:42
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Buenas, muchas gracias, que estoy super pesado.

Te comento, los datos los recibe igual que las pruebas con el post, el problema está al capturar las variables fuera.

He probado lo último e imprime los resultados con el "print $GLOBALS[campo]", en cuanto lo comento e intento capturar las supuestas nuevas variables que deberían haberse creado, es cuando tengo el problema, porque sigue sin recibirlas.

Las pruebas las hago intentando imprimir aquí:
Código PHP:
        VariablesFormulario($_POST);


        
$asunto "Consulta WEB";
        
$mensaje "<span class='producto'>Nombre: </span>" .$nombre"<br />";
        
$mensaje .=    "<span class='producto'>Apellidos: </span>" .$apellidos"<br />";
        
$mensaje .= "<span class='producto'>Empresa: </span>" .$empresa"<br />";
        
$mensaje .= "<span class='producto'>Mail: </span><a href='mailto:".$mail."'>" .$mail"</a><br />";
        
$mensaje .= "<span class='producto'>Consulta: </span>" .$consulta"<br />";
    
        echo 
$mensaje
Siendo $nombre, $apellidos, $empresa, $mail y $consulta.

Con la función última he probado sin éxito, reemplazando $nombre por:
- $GLOBALS[$campo]
- $campo
- $lalala

Pocas pruebas se me ocurren ya, aunque quizá estoy metiendo mal precisamente lo que tiene que imprimir.
  #21 (permalink)  
Antiguo 31/10/2008, 14:45
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Problema con 'foreach'

http://www.php.net/manual/es/languag...bles.scope.php
  #22 (permalink)  
Antiguo 31/10/2008, 14:52
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Respuesta: Problema con 'foreach'

Si ese mensaje está dentro de una función tendrías que acceder a las variables así:

$GLOBALS[$nombre]
$GLOBALS[$apellidos]

o al inicio de la función decir que los vas a coger globalmente:

global $nombre;
global $apellidos;

Por cierto, Ronruby, me gusta lo del extract, nunca lo había usado!
  #23 (permalink)  
Antiguo 31/10/2008, 15:28
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Buenas, con el 'extract()' funciona perfectamente, siempre y cuando no lo meta en función ;) como siempre, por el tema de las variables globales, que supongo se puede manipular.

La verdad que con esta opción, tampoco es necesario crear una función, porque ahora serían más líneas de código innecesarias.

Muchas gracias por todo Keysher y Ronruby, todo un descubrimiento esto de 'extract()'

Saludos
  #24 (permalink)  
Antiguo 02/11/2008, 14:02
 
Fecha de Ingreso: noviembre-2007
Mensajes: 154
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Problema con 'foreach'

Hola de nuevo, al final estoy haciendo todo esto con 'extract($_POST)', hasta que me ha surgido un problema y es con la selección múltiple en checkboxes.

El tema, es que si se seleccionan varios checkbox, la función 'extract()', te sobreescribe la anterior variable, ya que toma como valor de ésta, el 'name' del elemento del formulario y en este caso, son el mismo 'f_chk'.

He visto que está la opción 'EXTR_PREFIX_SAME', pero no estoy seguro de que funcione ni de cómo usarla, ya que si se añade prefijo, en caso de seleccionar por ejemplo 3 checkboxes, ¿iría acumulando prefijos?.

Si a alguien se le ocurre alguna opción para evitar estas colisiones de variable, agradecería cualquier sugerencia.

Muchas gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:11.