PHP variables

Imagen de omegajack

Forums: 

Bueno no se si alguien me pueda ayudar con este tema puesto que ya me estoy desesperando...
El punto es el siguiente
Tengo un formulario que se crea dinamicamente, es decir lo campos se llaman iigual pero se diferencian por un indice, de la siguiente manera

tipo_1, nombre_1, apellido_1
tipo_2, nombre_2, apellido_2
.
.
.
tipo_n, nombre_n, apellido_n

El numero de filas que se crearan es dinamico, es decir, nunca se cual sera el valor de n.

Bien el caso es que al igual que se crea el formulario de forma dinamica para guardar los datos en una BD debo hacerlo dinamicamente en base al numero de elementos del formulario, esa parte ya esta solucionada, mi problema esta en que por ejemplo cuando declaro una consulta para MYSQL pues obio debo recoger los valores que lleven

$tipo_1, $nombre_1, $apellido_1
$tipo_2, $nombre_2, $apellido_2
.
.
.
$tipo_n, $nombre_n, $apellido_n

Lo hago con un ciclo que valla de 1 a n, pero mi problema radica en que no puedo hacer que el nombre de la variable funcione, es decir si hago algo como esto

for($i=1; $i<=n; $i++)
{
$q_execute="update zapata set Tipo="."\$Tipo_$i";
}

lo procesa de la siguiente manera(suponiendo ke n vale 4)
"update zapata set Tipo=$Tipo_1"
"update zapata set Tipo=$Tipo_2"
"update zapata set Tipo=$Tipo_3"
"update zapata set Tipo=$Tipo_4"

Es decir, no esta tomando el valo de la variable $Tipo_1, sino como una cadena que contiene "$Tipo_1"

Alguien me podria ayudar para hacer que lo tome como una variable para que asi procese el contenido?

De antemano gracias por tomarse el tiempo de leer este contenido, saludos

Se usa la siguiente sintaxis:

Imagen de a_villacis

Para construir sobre la marcha el nombre de una variable, la variable que contiene el nombre de la variable debe usarse con dos signos de dólar. Así:

for($i=1; $i<=10; $i++)
{
$variable='Tipo_'.$i;
$q_execute="update zapata set Tipo=".$$variable;
print "$q_execute\n";
}

O también así:

for($i=1; $i<=10; $i++)
{
$variable='Tipo_'.$i;
$q_execute="update zapata set Tipo={$$variable}";
print "$q_execute\n";
}

Pero tengo algunas objeciones...

  1. Soporta su base de datos peticiones SQL parametrizadas? Como por ejemplo: "UPDATE ZAPATA SET Tipo=?" para luego sustituir el valor específico en lugar del signo de interrogación. Si no se usa esto, se corre el riesgo de introducir vulnerabilidades de inyección de SQL (por ejemplo, qué pasa si Tipo_1 vale lo siguiente: "1; DELETE FROM ZAPATA WHERE 1" ?) Tanto PEAR DB como PDO soportan peticiones SQL parametrizadas.
  2. La manera en que recoge las variables sugiere que usa la directiva "register_globals" de /etc/php.ini como activa. Esta directiva es peligrosa, porque permite que cualquier cracker introduzca valores de variables dentro del script, por ejemplo a través del URL: suscript.php?AUTH_LOGIN=1 súbitamente tiene una variable $AUTH_LOGIN definida. Es mejor desactivarla, y examinar directamente las variables $_GET y $_POST para determinar sus valores.
  3. Existe alguna razón por la cual no defina sus variables en el formulario de la forma "Tipo[1]" "Nombre[1]" etc. ? Los corchetes son legales como parte de una variable de formulario HTML. La presencia de corchetes hace que PHP cree una variable de tipo arreglo, con lo cual se facilita examinar un arreglo de variables de formulario, sin tener que construir los nombres de las variables sobre la marcha. Se puede usar la sintaxis $_POST["Tipo"][1] , $_POST["Tipo"][2] y así sucesivamente

perl -e '$x = 2.4; print sprintf("%.0f + %.0f = %.0f\n", $x, $x, $x + $x);'

perl -e '$x = 2.4; print sprintf("%.0f + %.0f = %.0f\n", $x, $x, $x + $x);'

Solucionado

Imagen de omegajack

Muchas gracias, me ha servido lo que me has diche. Pero antes de proseguir quisiera aclarar que (fue error mio lo siento, se me paso especificar que el script esta hecho en php no en perl, por lo que entiendo la confusion dad la sintaxis). La solucion fue:

for($i=1; $i<=$cont;$i++)
{
$query = "SHOW COLUMNS FROM zapata";
$execute=mysql_query($query);
$consulta="update zapata set ";
while ($row=mysql_fetch_array($execute))
{
if($row["Field"]!="Id" && $row["Field"]!="Port")
{
$campo="$row[Field]$i";
$consulta=$consulta.$row["Field"]."=".$$campo.",";
}
}
$consulta = substr ($consulta, 0, strlen($consulta) - 1);
$consulta=$consulta." where Id=$Id;";
$q_update=mysql_query($consulta);
}

El script lo que hace es ejecutar la consulta de actualizacion de un formulario el cual esta en base a n campos de la tabla zapata, es decir si la tabla tiene dos campos llamados Tipo y Canal y cuenta con tres tuplas, se generara un formulario con los siguientes elementos(culquier elemento, select, text, radio)
3 elementos llamados Tipo1, Tipo2, Tipo3
3 elementos llamados Canal1, Canal2, Canal3

Dicho script "jala" de la tabla los nombres de los campos, y hace un ciclo hasta el numero de elemtos, construyendo una cadena para ejecutar la consulta de actualizacion de la siguiente manera
$consulta="update zapata set Tipo=VALOR DE TIPO1, Canal=VALOR DE CANAL1;";
$consulta="update zapata set Tipo=VALOR DE TIPO2, Canal=VALOR DE CANAL2;";
$consulta="update zapata set Tipo=VALOR DE TIPO3, Canal=VALOR DE CANAL3;";

Para asi dejar la flexibilidad de agregar o quitar campos de la tabla sin necesidad de modificar el script de modificacion.

Ahora en cuanto a los puntos que me comentas uso las variables globales puesto que estoy haciendo pruebas de manera local, despues cuando subo los scripts al servidor donde trabajar corrigo el script con los POST necesarios.
Por otra parte te sere sincero, no sabia que podia trabajar con conrchetes y hacer ver una variable como un arreglo, pero me ha sido de gran utilidad par aun futuro dicho dato, cosa que te agradezco.

Bueno sin mas que decir espero el script le sirva a alguien si es que pretenden hacer algo parecido, saludos.