[Ir al menú de PHP]
Variables externas

Variables externas

• PHP permite enviar datos desde un formulario hasta un script PHP que pasan a estar disponibles en este como variables

• Se requieren -por el momento- dos páginas, una para enviar y otra para recoger los datos enviados.

• Para realizar esa tranferencia es necesario poner dentro la etiqueta <form> los parámetros:
action="nombre de la página que recibe los datos"
y el método que por el momento puede ser o get o post (el que más.. rabia te de.. ) que se escribirian así:

method="post"
o
method="get"

• Una vez escritos ese par de parámetros, el formulario está listo para enviar los valores de las variables al documento indicado en action.

• Al pulsar en el botoncito Enviar se tranfieren los valores contenidos en cada cada campo del formulario y que son recogidos en variables con idéntico nombre al que figura en la opción name de cada campo del formulario.

• En el ejemplo puedes ver que el formulario de destino solo contiene instrucciones para visualizar la variables pero... podría hacerse cualquier tipo de operación con ellas, exactamente igual que si estuvieran definidas en él.

• Seguramente a tí no te ocurre, pero te confieso que... me tienen loco los famosos ; de los finales de las instrucciones... ¡¡siempre se me olvidan y... siempre me aparece el aviso de error!!. ¡¡qué cabeza la mía...!!

• Y como ...las desgracias nunca vienen solas... me tiré un par de horas peleando con el formulario porque... en las etiquetas type="radio" me había olvidado de que tenía que ponerles a las tres el mismo name... • Y por si fuera poco ...mi pelea con las comillas anidadas es continua. Siempre me olvido de que cuando las comillas van anidadas hay que poner " en las exteriores y ' en las interiores -o viceversa- pero... siempre me olvido...
¡¡Qué cabeza la mia...!!


Register globals=Off

Todo lo que te comenté hasta ahora funciona sin problema en el caso de que el php.ini tenga configurada como ON la opción register_globals, pero... si se te ocurre configurar esa opción como OFF o si simplemente tratas de utilizarlas en un servidor configurado así (es posible que tengas que utilizar un servidor remoto en el que no tengas privilegios para modificar el fichero php.ini) deberás hacer algunas modificaciones.

Para empezar, ya no dará igual que utilices method="post" o uses method="get" ya que el uso de uno u otro te obligará a hacer cambios en el script formu1.php.

La primera diferencia será que para conocer el método de envío utilizado ya no te servirá escribir el contenido de la variable REQUEST_METHOD.

Ahora tendrás que escribir

$HTTP_ENV_VARS[REQUEST_METHOD]

es decir tendrás meter REQUEST_METHOD siempre dentro de$HTTP_ENV_VARS[] (dentro del corchete, of corse...) y los valores de las variables ahora solo se verán si metes el nombre de la variable dentro del corchete deuna de estas variable predefinidas:

$HTTP_POST_VARS[]

si el method="post" o de esta otra

$HTTP_GET_VARS[]

si el método usado en el formulario de envío ha sido method="get".

Aquí la derecha tienes ejemplos tanto utilizando el método get como el post.

¡¡Cuidado...!!

Fíjate en las comillas que van dentro de los corchetes... y no te olvides de ponerlas. Siempre debes poner -dentro del corchete- entre comillas los nombres de las variables transferidas y no te olvides tampoco de tener mucho cuidado con las mayúsculas y las minúsculas... la sintaxis es muy estricta en este aspecto... y si me haces caso probablemente evitarás algunos sudores y también algunos ataques de nervios.. ;-).

Versiones PHP 4.2.0 o superior

Si tu servidor está utilizando la versión PHP 4.2.0 o una superior puedes utilizar las nuevas variables predefinidas:

$_ENV
$_POST
y $_GET

que tienen la misma funcionalidad que las respectivas:

$HTTP_ENV_VARS
$HTTP_POST_VARS
y $HTTP_GET_VARS

y añaden la ventaja (aparte de su sintaxis más corta y cómoda) de ser variables superglobales pero -te lo repito por si las moscas- solo funcionan para versiones 4.2.0 o superior con lo cual el ejemplo9b no te funcionará -por el momento- ya que este servidor aún no utiliza esa versión tan moderna.

¡¡Qué lo sepas...!!


Una posibilidad añadida

Una amabilísmo visitante -¡¡gracias Log Out!!- me envia un mensaje sugiriéndome que comente la posibilidad de aplicar las variables de variables como ejemplo práctico aplicable en los ejemplos de script para la opción register_globals en off.

Le agradezco por partida doble. Por una parte su sugerencia y por otra que me ha obligado a estudiar una excepción que no tenía contemplada en la página anterior.

Vamos con ello... ;-)

Dado que dependiendo del método de envío de los datos -POST ó GET- tenemos que utilizar la variable adecuada al método, se puede recurrir a un truquillo que es la siguiente:

$HTTP_GET_VARS solo tiene una leve diferencia con
$HTTP_POST_VARS que es la porción intermedia del nombre de la variable.

Lo mismo ocurre entre $_GET y $_POST y además esas cadenas (GET ó POST) son las que devuelven las variables de entorno: $HTTP_ENV_VARS[REQUEST_METHOD] ó $_ENV[REQUEST_METHOD] así que podríamos recurrir a una varible intermedia definida así:

$i="HTTP_".$HTTP_ENV_VARS[REQUEST_METHOD]."_VARS" que recogería en $i el nombre de la variable a utilizar dependiendo del método utilizado en el envio del formulario.

En el caso de poder utilizar las superglobales $_GET y $_POST esa variable intermedia podría definirse así:
$i="_".$_ENV[REQUEST_METHOD] que daría similares resultados a la anterior

Ahora, sería cuestión de invocar $$i['variable'] (variable de variable) pero... ahí es donde se plantea una situación excepcional que conviene aclarar y que por razones de maquetación te comentaré aquí a la derecha.

Gracias de nuevo Log Out... me has hecho sudar un buen rato, pero... mereció la pena.

Métodos de envio

Tal como te comentaba más arriba existen dos métodos posibles para en envío de información: get y post.

Las diferencias entre uno y otro son las siguientes:

Método GET

Este método tiene las siguientes particularidades: Método POST

No tiene las limitaciones indicadas para el caso de get y los datos del formulario son transmitidos de forma no visible en la barra del navegador.

Este método es -al parecer- el más recomendable para transferencia de formularios.


 
 


Variables externas...

Necesitamos -por el momento- dos documentos... un formulario de envio que aquí he llamado ejemplo9.php y utro documento en el que se recogen los valores de las variables enviadas que he llamado form1.php.
Este es el código de ejemplo9.php....

<HTML>
<HEAD>
<TITLE>Ejemplo 9 - PHP
</HEAD>

<BODY>


<form action='formu1.php' method='post'>
Escribe tu nombre: <input type='text' name='nombre' value='' size=15><br>
Escribe tu clave: <input type='password' name='clave' value=''><br>
Elige tu color de coche favorito:<br>
<input type='radio' name='color' value='Rojo'>Rojo</br>
<input type='radio' name='color' value='Verde'>Verde</br>
<input type='radio' name='color' value='Azul'>Azul</br>
Elige los extras:<br>
<input type='checkbox' name="acondicionado" value="Aire">
                                               Aire acondicionado<br>
<input type='checkbox' name="tapiceria" value="Tapicieria">
                                              Tapiceria en piel<br>
<input type='checkbox' name="llantas" value="aluminio">
                                              Llantas de aluminio<br>
¿Cual es el precio máximo que estarías dispuesto a pagar?<br>
<select name="precio">
<Option>Menos de 6.000 euros</option>
<Option>6.001 - 8.000 euros</option>
<Option>8.001 - 10.000 euros</option>
<Option>10.001 - 12.000 euros</option>
<Option>12.001 - 14.000 euros</option>
<Option>Más de 14.000 euros</option>
</select>
<textarea rows=5 cols=50 name='texto'></textarea> <input type="submit" value="enviar"> <input type="reset" value="borrar"> </BODY> </HTML>



Este es el código de formu1.php....


<HTML>
<HEAD>
<TITLE>Formu1 - PHP</TITLE>
</HEAD>

<BODY>
<?
echo "El method que ha usado fué: ",$REQUEST_METHOD,"<br>";

echo $nombre,"<br>";
echo $clave,"<br>";
echo $color,"<br>";
echo $acondicionado,"<br>";
echo $tapiceria,"<br>";
echo $llantas,"<br>";
echo $precio,"<br>";
echo $texto,"<br>";
?>
</BODY>
</HTML>


ejemplo9.php

El script para el caso de REGISTER_GLOBALS=0FF

Cuando en el formulario de envío has utilizado method="POST" y el fichero php.ini tiene configurada como OFF la opción register_globals estarás obligad@ a utilizar una sintaxis como esta.

Afortunadamente, esta sintaxis también es válida cuando register_globals=on con lo cual -solo es una sugerencia... ;-)- te recomendaría que utilices esta como forma generalizada y consideres la anterior como una posibilidad... un poco limitada.


<HTML>
<HEAD>
<TITLE>Formu1 - PHP</TITLE>
</HEAD>

<BODY>
<?
echo "El method que ha usado fué: ",$HTTP_ENV_VARS[REQUEST_METHOD],"<br>";

echo  $HTTP_POST_VARS['nombre'],"<br>";
echo  $HTTP_POST_VARS['clave'],"<br>";
echo  $HTTP_POST_VARS['color'],"<br>";
echo  $HTTP_POST_VARS['acondicionado'],"<br>";
echo  $HTTP_POST_VARS['tapiceria'],"<br>";
echo  $HTTP_POST_VARS['llantas'],"<br>";
echo  $HTTP_POST_VARS['precio'],"<br>";
echo  $HTTP_POST_VARS['texto'],"<br>";
?>
</BODY>
</HTML>


ejemplo9a.php

<HTML>
<HEAD>
<TITLE>Formu1 - PHP</TITLE>
</HEAD>

<BODY>
<?
echo "El method que ha usado fué: ",$HTTP_ENV_VARS[REQUEST_METHOD],"<br>";

echo  $HTTP_GET_VARS['nombre'],"<br>";
echo  $HTTP_GET_VARS['clave'],"<br>";
echo  $HTTP_GET_VARS['color'],"<br>";
echo  $HTTP_GET_VARS['acondicionado'],"<br>";
echo  $HTTP_GET_VARS['tapiceria'],"<br>";
echo  $HTTP_GET_VARS['llantas'],"<br>";
echo  $HTTP_GET_VARS['precio'],"<br>";
echo  $HTTP_GET_VARS['texto'],"<br>";
?>
</BODY>
</HTML>


ejemplo9c.php

El script anterior para PHP 4.2.0 o superior

Aquí tienes el script anterior -para el caso de que el método usado sea POST- utilizando las nuevas variables predefinidas -$_POST Y $_ENVque incorporó PHP a partir de su versión 4.2.0.

Si tratas de probar el ejemplo no te funcionará y no lo hará precisamente porque mi servidor tiene una versión anterior que no soporta aún estas nuevas variables.

En cualquier caso, estas últimas versiones si siguen soportando las variables $HTTP_ENV_VARS y $HTTP_POST_VARS y -según he leido por ahí- parece que los desarrolladores de PHP no tienen intención de eliminarlas en versiones futuras.


<HTML>
<HEAD>
<TITLE>Formu1 - PHP</TITLE>
</HEAD>

<BODY>
<?
echo "El method que ha usado fué: ",$_ENV[REQUEST_METHOD],"<br>";

echo  $_POST['nombre'],"<br>";
echo  $_POST['clave'],"<br>";
echo  $_POST['color'],"<br>";
echo  $_POST['acondicionado'],"<br>";
echo  $_POST['tapiceria'],"<br>";
echo  $_POST['llantas'],"<br>";
echo  $_POST['precio'],"<br>";
echo  $_POST['texto'],"<br>";
?>
</BODY>
</HTML>


ejemplo9b.php

Los scripts anteriores con variables variables

Al escribir $$i['variable'] -estamos refiríendonos a un array- se plantea una situación ambigüa y única en el tratamiento de variables variables.

PHP no sabe si esa expresión -$$i['variable']-se refiere a ${$i['variable']} o si trata de aludir a ${$i}['variable'], es decir... que no sabe si el índice del array corresponde la variable $i ó a $$i.

Para evitar esa ambigüedad tenemos que indicar de forma expresa -utilizando las llaves- cual de las dos opciones pretendemos utilizar.

Como en nuestro caso el índice del array debe corresponder a la variable $$i tendremos que escribir ${$i}['variable']

Aquí tienes el código del ejemplo... funcionando

<HTML>
<HEAD>
<TITLE>Formu1 - PHP
</HEAD>

<BODY>
<?
echo "El method que ha usado fué: ",$HTTP_ENV_VARS[REQUEST_METHOD],"<br>";

$metodo="HTTP_".$HTTP_ENV_VARS[REQUEST_METHOD]."_VARS";

echo  ${$metodo}['nombre'],"<br>";
echo  ${$metodo}['clave'],"<br>";
echo  ${$metodo}['color'],"<br>";
echo  ${$metodo}['acondicionado'],"<br>";
echo  ${$metodo}['tapiceria'],"<br>";
echo  ${$metodo}['llantas'],"<br>";
echo  ${$metodo}['precio'],"<br>";
echo  ${$metodo}['texto'],"<br>";
?>
</BODY>
</HTML>


ejemplo9e.php


y aquí tienes el código para el supuesto de que utilices una versión más moderna de PHP y que funcionen las famosas superglobales.


<?
echo "El method que ha usado fué: ",$_ENV[REQUEST_METHOD],"<br>";

$metodo="_".$_ENV[REQUEST_METHOD];

echo  ${$metodo}['nombre'],"<br>";
echo  ${$metodo}['clave'],"<br>";
echo  ${$metodo}['color'],"<br>";
echo  ${$metodo}['acondicionado'],"<br>";
echo  ${$metodo}['tapiceria'],"<br>";
echo  ${$metodo}['llantas'],"<br>";
echo  ${$metodo}['precio'],"<br>";
echo  ${$metodo}['texto'],"<br>";
?>
</BODY>
</HTML>

Tipos de contenidos de los formularios

Aunque en los ejemplos anteriores no te lo indiqué, la etiqueta form permite especificar el tipo de contenidos del formulario mediante el parámetro enctype que -como puedes observar aquí - si he utilizado cuando se trata de transferir ficheros.

El valor por defecto de este parámetro es application/x-www-form-urlencoded y este valor por defecto es aplicable tanto cuando se utiliza un método GET como cuando se aplica un POST.

Por esa condición de valor por defecto estas dos etiquetas:

<form action='formu1.php' method='post'>

<form action='formu1.php' method='post'
                            enctype='application/x-www-form-urlencoded'>


producirían el mismo efecto.

El método POST admite (¡¡ojo... el GET solo admite el anterior!!) otro tipo de contenido (multipart/form-data) que se utiliza normalmente cuando se trata de: enviar grandes cantidades de datos, formularios que contengan ficheros, datos no ASCII o datos binarios

Las diferencias básicas entre ambos son las siguientes:

En el tipo application/x-www-form-urlencoded los nombres de control y los valores se transforman en secuencias de escape, es decir convirtiendo cada byte en una cadena %HH, donde HH es la notación hexadecimal del valor del byte.

Además, los espacios son convertidos en signos +, los saltos de línea se representan como %0D%0A, el nombre y el valor se separan con el signo = y los diferentes bloques nombre/valor, se separan entre sí con el carácter &.

Esa es la razón por la que cuando pasamos variables y valores directamente (en realidad utilizamos implicitamente un método GET) escribimos:

<A href="pagina.php?variable=valor&variable2=valor2">

Por el contrario, multipart/form-data, sigue las reglas de las transferencias MIME, contiene una serie de partes, que se envían en el mismo orden en que aparecen los controles correspondientes y no aparecen límites entre partes en ninguno de los datos.


Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente