Foros del Web » Programando para Internet » PHP »

Problemas con la llamada de $$variable

Estas en el tema de Problemas con la llamada de $$variable en el foro de PHP en Foros del Web. Haber muchachos, tengo el siguiente problema: tengo un formulario en el q se deben mostrar varios campos del tipo <input>, la cantidad de estos campos ...
  #1 (permalink)  
Antiguo 04/11/2003, 19:52
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Problemas con la llamada de $$variable

Haber muchachos, tengo el siguiente problema: tengo un formulario en el q se deben mostrar varios campos del tipo <input>, la cantidad de estos campos no esta determinada inicialmente asi es que el nombre que deben tener estos campos es algo asi como name=campo$num_campo (dentro de un ciclo que asigne el valor de $num_campo obviamente). Para ilustrar:

<td width=\"10%\"><input name=\"codigo$j\" type=\"text\" size=\"5\" value=\"$array[codigo_impuesto2]\" readonly=\"true\" ></td>
<td width=\"33%\"><input name=\"impuesto$j\" type=\"text\" value=\"$array[nombre_impuesto2]\" readonly=\"true\"></td>";


Como dije antes, el codigo anterior va en un formulario. Cuando se ejecuta la llamada al formulario las variables q me interesan (como no se cuantas son) no las puedo accesar mediante $_POST['codigo1']...etc. Porque, como dije no se cuantas variables van a ser. Por lo que se tampoco se pueden referenciar directamente usando $_POST['variable$var'] porque $var pasa a ser parte del string, no es interpretado como $var.

Lo que intente hacer es lo siguiente: Paso mediante POST la cantidad total de iteraciones (eso si lo puedo hacer pq es un valor conocido), luego en el script q se debe ejecutar hago un ciclo iterativo para conformar las variables que tenia en los input y cada una de ellas la voy asignando a una variable normal $variable. Luego para mostrar el contenido (que a mi me interesa) lo hago usando echo $$variable. El codigo es el siguiente:

for($i=0; $i<$_POST['contador'] ; $i++)
{

$cod="codigo$i";
$imp="impuesto$i";
$afe="afecto$i";
echo $$cod."<br>";
echo $$imp."<br>";
echo $$afe."<br>";
}

La tristeza de esto es que los echo anteriores NO MUESTRAN ABSOLUTAMENTE NADA!!!!!!!. Esta bien lo q estoy haciendo, o debo configurar mi php (estoy usando el 4.3.4)

Saludos y Gracias
  #2 (permalink)  
Antiguo 04/11/2003, 22:14
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
En principio, te faltan las comillas de los índices de tu array en el formulario:
$array[nombre_impuesto2]
Debe ser:
$array['nombre_impuesto2']

Ahora reviso algo sobre $$variables a ver si te puedo ayudar.

Saludos

Última edición por jpinedo; 04/11/2003 a las 22:17
  #3 (permalink)  
Antiguo 04/11/2003, 23:17
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Bueno.. estuve buscando y encontré algo que tal vez te pueda servir. En varios lugares encontré que al llamar a una variable de este tipo debes utilizar llaves para delimitar bien la variable. O sea que la declaración y asignación está bien. Lo que debes cambiar es ala hora de utilizarlas (con "echo"). Así:

echo $$cod;

por

echo ${$cod};

Prueba y posteas que pasó. Si no resulta, buscas en google por "php"+"variables variables" (fue lo que yo hice)...

Ah.. pero primero hay que pasar por el manual:

http://www.php.net/manual/en/languag...s.variable.php

Saludos

Última edición por jpinedo; 05/11/2003 a las 00:37
  #4 (permalink)  
Antiguo 04/11/2003, 23:39
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Gracias por tu ayuda, pero lamentablemente no funciono, no dudo que la solución final sea algo similar a lo que propusiste. debe haber algo mal en relacion con la version de PHP o en la forma en como se pasan las "variables variables".


Gracias de nuevo
Saludos
  #5 (permalink)  
Antiguo 05/11/2003, 00:05
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Para que descartes si es problema de configuración, prueba con un ejemplo sencillo como este:
<?
$a = "hello";
$$a = "world";
echo "$a ${$a}";//Debe escribir "hello word"
echo "$a $hello";//También debe escribir "hello word"
?>

Saludos
  #6 (permalink)  
Antiguo 05/11/2003, 00:14
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Y si tienes el register_globals en OFF, lo que deberías hacer es algo así:

En lugar de:

echo $$cod;

debe ir:

echo $_POST[$cod];

Saludos
  #7 (permalink)  
Antiguo 05/11/2003, 00:45
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Excelente!!! jpinedo, muchas gracias, tu ultima respuesta era la solucion del problema. register_globals=off impide que la lectura de las variables se haga mediante $$var (cuando son pasadas a un form).

Ahora la segunda parte del problema, es la siguiente: estas variables, como explicaba en mi primer mensaje, estan asociadas a varias entradas del tipo <input>. Mi pregunta es si hay alguna forma de identificar cual fue la opcion que el usuario pincho, para explicarme mejor observa lo siguiente:

Tengo el siguiente codigo en PHP:

<td width=\"10%\"><input name=\"codigos$j\" type=\"hidden\" size=\"5\"><input name="borra" type="image" src="imagen.jpg"></td>"

Para tres valores de j, por ejem. Alguien podria pinchar en la imagen que corresponde al input dado por la variable codigos2, de que forma puedo identificar que es codigos2 la entrada seleccionada y no otra??, no se si me explico, pero en este caso no hay campos de textos, solo interaccion mediante links.

Muchas gracias de nuevo
Heraldex
  #8 (permalink)  
Antiguo 05/11/2003, 00:46
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Explico un poco el post anterior:

Dentro del bucle for, supongamos que estamos en la iteración en la que $i=2;

$cod="codigo$i";//haría $cod="codigo2".
echo ${$cod}; //imprimiría el valor de la variable $codigo2.

Pero como $codigo2 se espera que venga del de formulario y register_globals está en OFF... entonces $codigo2 no existe, lo que existe es $_POST['codigo2']....

Entonces hay que imprimir la variable $_POST['codigo2'].. que para el código será: $_POST[$cod].

Espero se entienda

Saludos
  #9 (permalink)  
Antiguo 05/11/2003, 01:08
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Entiendo lo que me quieres decir, pero en primer lugar ocurre lo siguiente en la istruccion:
<td width=\"10%\"><input name=\"codigos$j\" type=\"hidden\" size=\"5\"><input name="borra" type="image" src="imagen.jpg"></td>

las variables codigos$i no tienen ningun valor asociado, podrian tenerlo y serian de la forma:

<td width=\"10%\"><input name=\"codigos$j\" type=\"hidden\" size=\"5\" value=\"$i\"><input name="borra" type="image" src="imagen.jpg"></td>

La cuestión es q cuando selecciono cualquiera de ellas y se ejecuta el form todas las variables (codigos$j) van a tener un valor asociado de manera que no tengo o no se como identificar cual de ellas ha sido clickeada

Eso, espero q ahora entiendas el problema q tengo.
Muchas gracias
Heraldex
  #10 (permalink)  
Antiguo 05/11/2003, 01:09
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
OK... te me adelantaste...

Bueno .. se me ocurre que puedes hacer lo siguiente:

los type="image" generan dos variables que indican las coordenadas del click dentro de la imagen.

Lo que puedes hacer es poner el atributo name=\"borra$j\"
(dará borra2, pal ejemplo)...

Las variables que se generan se llaman $_POST['borra2_x'] y $_POST['borra2_y']... basta que verifiques si se ha inicializado alguna de ellas.

Lo más probable es que exista alguna función especial. Pero acá te doy una idea:
Código PHP:
for($i=0$i<$_POST['contador'] ; $i++){

$img="borra$i_x";
if (isset(
$_POST[$img]) && !isset($numero)){//verifica si se inicializó (existe) la variable 
$numero=$i
}
//$numero tendrá el número de tu imagen
//y acá sigues con tu código
$cod="codigo$i";
$imp="impuesto$i";
$afe="afecto$i";
echo 
$_POST[$cod];."<br>";
echo 
$_POST[$imp];."<br>";
echo 
$_POST[$afe];."<br>";

Espero funcione

Saludos

Última edición por jpinedo; 05/11/2003 a las 01:27
  #11 (permalink)  
Antiguo 05/11/2003, 01:28
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Perdón... habían errores en el post anterior. Pero ya lo edité y lo arreglé. Estos eran los errores:

-Las variables que se generan son "name_x" y "name_y". Así, con subguió. Yo había puesto "name.x" y "name.y"...
-Había un par de comillas de más en $_POST[$img], yo había puesto $_POST['$img']. Estaba repitiendo comillas y había error.

Nada más

Saludos

Última edición por jpinedo; 05/11/2003 a las 01:32
  #12 (permalink)  
Antiguo 05/11/2003, 01:45
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Gracias, buena solución, no tenia idea sobre las variables q generan los tipo "image". Pero sabes aun tengo inconvenientes, despues de :

for($i=0; $i<$_POST['contador'] ; $i++){

$img="borra$i_x";

yo inserte un echo $_POST[$img]; //para mostrar la coordenada
}

Y NO MUESTRA NADA!!!, por consiguiente:

la instruccion:
if (isset($_POST[$img]) && !isset($numero))

No se ejecuta!!!!

Que paso esta vez???
Gracias y Saludos
Heraldex
  #13 (permalink)  
Antiguo 05/11/2003, 02:00
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
La verdad no se me ocurre así al ojo nada... déjame revisar un poco.. pero te recomiendo algo:

Revisa bien la sintaxis. Que esté bien escrito el nombre de las variable. Haz un

$img="borra$i_x";
echo $img

y revisa que sean "borra1_x", "borra2_x", etc...

Revisa que en tu formulario esté la etiqueta así:

<input name=\"borra$j\" type=\"image\" src=\"imagen.jpg\">

Abre la página de tu formulario en el navegador y haz VER--- Código fuente y verifica que la etiqueta anterior tenga el atributo name así:

<input name="borra1" ...
<input name="borra2" ...

Si después de esto te sigue dando error, avisas.

Saludos
  #14 (permalink)  
Antiguo 05/11/2003, 09:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm y por qué no usas arrays en lugar de "Variables variables"?

<input type="text" name="variable[]">
<input type="text" name="variable[]">
<input type="text" name="variable[]">

así en tu parte PHP recibiras el array variable por el método que uses .. ejemplo (suponiendo método POST en tu formulario)

Código PHP:
foreach ($_POST['variable'] as $variable){
   echo 
$variable."<br>";

El tipo de variable de tu formulario "text" ..un "checkbox" .. etc es lo de menos .. la técnica es igual; el name= .. ha de ser un array tipo nombre[] o bien con indices nombre['indice'] .. pero si lo usas como [] será incremental y numérico (comenzando en cero).

En una de las últimas FAQ's tienes un ejemplo enfocado a checbox .. pero es la misma técnica insisto.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 05/11/2003, 11:31
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola Cluster, sabes, ya había pensado en utilizar arrays para solucionar el problema. En parte esta cubierto porque no necesito manejar variables variables, el problema q sigue presente es lo q estoy tratando de solucionar. Si las variables en cuestion corresponden a un array dentro de un <input> q tiene la propiedad "hidden" y además puedo referenciarlo utilizando un <input type=img> (esto seria como tener un <a href> pero con formularios). Como puedo identificar cual de las opciones (cual posicion del array) es la q ha sido clickeada. Es como tu dices algo similar a utilizar el checkbox.

Yo estoy interesado en realizar algo similar pero reemplazando el checkbox por una combinacion de tipos "img" y otros campos para resolver el mismo problema.

Saludos
  #16 (permalink)  
Antiguo 05/11/2003, 11:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Lo elementos que clickeas serán los que tengan valor distinto a NULL (vacio) (cosa que no sucede en checkbox tratados como arrays donde sólo "pasan" los elementos que seleccionas ..)

Esto sería para el caso que .. con ayuda de javascript al clikear sobre tu imagen .. des algún valor a un campo hidden de tu formulario. Lo que tenga valor .. será lo que has clikeado y lo que no tenga valor .. será lo que no has clikeado. (lo mismo debes emplear la lógica javascript para que al clikear denuevo un "hidden" ya con valor .. lo vacie).

Yo solventaría este problema viá javacript y campos checkbox pero tratados como arrays.

Es decir:

Se trata de que al pinchar sobre tu imagen .. cambies a estado (checked) del checbox asociado y que a su vez estos checkbox estén ocultos (no sé si con capas, innert HTML o algo así .. el caso es que no se vean pero funcionen .. osea .. no "disabled").

Creo que deberías pregunta mejor en el foro Javascript sobre como dar valor a una variables javascript (o campos hidden) al clickear sobre otro elemento (en tu caso una imagen) con su eventos onClick() y demás le dé un valor o lo borre (le asigne ..nada .. null) ...

Cuando tengas ese paso claro .. según lo que generes así deberás filtrarlo en PHP ... por ejemplo si mandas X hidden y N tieenn valor y el resto no (que serían equivalentes a los que se seleccionaron) .. sólo tendras que filtrar ahí (if .... empty() ..) Pero eso sí .. sería recomendable que fuese tipo array[] de "name" .. Para eso tienes tambien el "id" (en los <input ...>) por si te dá problemas en javascript al acceder al elemento (en ese caso lo harías por ID)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #17 (permalink)  
Antiguo 05/11/2003, 12:27
 
Fecha de Ingreso: octubre-2003
Ubicación: Concepción
Mensajes: 84
Antigüedad: 20 años, 6 meses
Puntos: 0
De acuerdo

Muchas Gracias Cluster, ya estaba pensando q la solucion debia pasar por algo en Javascript (preguntare en el otro foro).

Saludos y Gracias a todos de nuevo
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 14:30.