Sunteți pe pagina 1din 23

PHP

Un documento PHP es un archivo de texto que contiene etiquetas html y segmentos de cdigo PHP. Los segmentos de cdigo PHP estn delimitados por las etiquetas <?php (etiqueta inicial) y ?> (etiqueta final). Cuando un navegador solicita una pgina PHP a un servidor, el servidor lee el documento y ejecuta las instrucciones que se encuentran en los segmentos de cdigo PHP. Si esas instrucciones generan texto, el servidor sustituye el segmento PHP por el texto. Finalmente, el servidor entrega al navegador el resultado final. Ejemplo: Script php <?php print "<p>Hola</p>"; ?>

Html Resultante <p>Hola</p>

Visualizacin en el BROWSER Hola

En un mismo documento PHP pueden alternarse fragmentos PHP y fragmentos HTML. Los dos ejemplos siguientes generan el mismo cdigo HTML. Script php
<p> <?php print "Hola"; ?> </p> <?php print "<p>"; ?> Hola <?php print "</p>"; ?>

Html Resultante <p>Hola</p>

Visualizacin en el BROWSER Hola

<p>Hola</p>

Hola

Si en una misma pgina hay varios fragmentos PHP, se tratan como un nico programa. Script php Html Resultante Visualizacin en el BROWSER <?php <p>Hola</p> Hola
$saludo = "Hola"; print "<p>$saludo</p>"; ?> <?php $saludo = "Hola"; ?> <p> <?php print "$saludo"; ?> </p>

<p>Hola</p>

Hola

Comentarios
Dentro de un fragmento PHP, se pueden comentar lneas de cdigo utilizando: // para comentar el resto de la lnea (como en C++) # para comentar el resto de la lnea (como en la shell de Unix o en Perl) /* o Esta es una lnea de comentario o Esta es otra lnea de comentario o para delimitar varias lneas (como en C)
o o

*/

CADENAS
Comillas simples y dobles Las cadenas de texto se pueden limitar por comillas dobles o simples. Si una cadena est delimitada por comillas dobles, en su interior puede haber cualquier nmero de comillas simples, y viceversa. Si en una cadena tiene que haber comillas simples y dobles, se pueden escribir como \' o \" Script php <?php print "<p>Esto es una comilla simple:'</p>"; ?>
<?php print '<p>Esto es una comilla doble: "</p>'; ?> <?php print "<p>Esto es una comilla simple: ' y esto una comilla doble: \"</p>"; ?> <?php print '<p>Esto es una comilla simple: \' y esto una comilla doble: "</p>'; ?>

Html Resultante

<p>Esto es una comilla simple: '</p> <p>Esto es una comilla doble: "</p>

<p>Esto es una comilla simple: ' y esto una comilla doble: "</p> <p>Esto es una comilla simple: ' y esto una comilla doble: "</p>

El cdigo HTML tambin puede tener comillas simples o dobles: Script php
<?php print "<p><strong style='color:red;'> Hola </strong></p>"; ?> <?php print '<p><strong style="color: red;">Hola</strong></p>'; ?>

Html Resultante

<p><strong style='color: red;'> Hola </strong></p> <p><strong style="color: red;">Hola</strong></p>

Aunque en los ejemplos anteriores las comillas simples o dobles son equivalentes, en otras situaciones no lo son. Por ejemplo, PHP no sustituye las variables que se encuentran dentro de cadenas delimitadas con comillas simples, mientras que s que lo hace (pero no siempre) si se utilizan comillas dobles, como se ve en el siguiente ejemplo: Script php Html Resultante
<?php $cadena = "Hola"; print "<p>La variable contiene el valor: $cadena</p>"; ?> <?php $cadena = "Hola"; print '<p>La variable contiene el valor: $cadena</p>'; ?>

<p>La variable contiene el valor: Hola</p>

<p>La variable contiene el valor: $cadena</p>

PHP tampoco sustituye algunos caracteres especiales (por ejemplo, el salto de lnea \n) dentro de las comillas simples, como se ve en el siguiente ejemplo: Script php
<?php print "<pre>Esto est en\ndos lneas.</pre>"; ?> <?php print '<pre>Esto est en\ndos lneas.</pre>'; ?>

Html Resultante

<pre>Esto est en dos lneas</pre> <pre>Esto est en\ndos lneas</pre>

Saltos de lnea en el cdigo fuente


Se pueden insertar saltos de lnea en el cdigo fuente de la pgina insertndolos directamente en el interior de las cadenas o mediante el carcter especial \n. Este salto de lnea es ignorado por los navegadores, pero aumenta la legibilidad del cdigo fuente. Los ejemplos siguientes producen el mismo resultado en los navegadores (una lista de dos elementos), pero el cdigo fuente es ms o menos legible.
<?php print "<ul><li>Uno</li><li>Dos</li></ul>"; ?> <?php print "<ul>"; print "<li>Uno</li>"; print "<li>Dos</li>";

<ul><li>Uno</li><li>Dos</li></ul>

<ul><li>Uno</li><li>Dos</li></ul>

print "</ul>"; ?> <?php print "<ul>\n <li>Uno</li>\n <li>Dos</li>\n</ul>"; ?> <?php print "<ul> <li>Uno</li> <li>Dos</li> </ul>"; ?>

<ul> <li>Uno</li> <li>Dos</li> </ul> <ul> <li>Uno</li> <li>Dos</li> </ul>

Concatenar cadenas
El operador . (punto) permite concatenar dos o ms cadenas.
<?php $cadena1 = "Pasa"; $cadena2 = "tiempos"; $cadena3 = $cadena1.$cadena2; print "<p>$cadena3</p>"; ?> <?php $cadena1 = "Corre"; $cadena2 = "ve"; $cadena3 = "idile"; $cadena4 = $cadena1.$cadena2.$cadena3; print "<p>$cadena4</p>"; ?>

<p>Pasatiempos</p>

<p>Correveidile</p>

El operador . (punto) se puede utilizar en la instruccin print. En el ejemplo siguiente se concatenan una cadena, una variable y una cadena.
<?php $nombre = "Don Pepito"; print "<p>Hola, ".$nombre."! Cmo est usted?</p>"; ?>

<p>Hola, Don Pepito! Cmo est usted?</p>

Nota: En el ejemplo anterior, se puede obtener el mismo resultado sin utilizar el operador . (punto):
<?php $nombre = "Don Pepito"; print "<p>Hola, $nombre! Cmo est usted?</p>"; ?>

<p>Hola, Don Pepito! Cmo est usted?</p>

Variables en cadenas
La forma de insertar variables dentro de cadenas depende del tipo de variable utilizado. En el caso de nmeros, cadenas o matrices de una dimensin, las variables se puede insertar directamente:
<?php $numero = 5000; $texto = "cinco mil"; $seEscribe = Array("junto", "separado"); print "<p>El nmero $numero se escribe $seEscribe[1]: $texto</p>"; ?>

<p>En nmero 5000 se escribe separado: cinco mil</p>

En el caso de matrices de dos o ms dimensiones, las variables no se puede insertar directamente:


<?php $nombre = "Don Pepito"; $saludos = Array( Array("Hola", "Hello"), Array("Adios", "Goodbye")); print "<p>$saludos[0][0], $nombre! Cmo est usted?</p>"; ?>

<p>Array[0], Don Pepito! Cmo est usted?</p>

Este resultado se obtiene porque PHP no sustituye la variable $saludos[0][0] por su valor, sino que sustituye nicamente la primera parte ($saludos[0]). Como $saludos[0] es una matriz de una dimensin, no puede escribir ningn valor y devuelve simplemente "Array". A continuacin, PHP aade el [0] que quedaba y se obtiene la cadena "Array[0]". Una solucin es sacar la matriz de la cadena:
<?php $nombre = "Don Pepito"; $saludos = Array( Array("Hola", "Hello"), Array("Adios", "Goodbye")); print "<p>".$saludos[0][0].", $nombre! Cmo est usted?</p>"; ?>

<p>Hola, Don Pepito! Cmo est usted?</p>

Otra solucin es utilizar llaves ({ }) rodeando la variable:


<?php $nombre = "Don Pepito"; $saludos = Array( Array("Hola", "Hello"), Array("Adios", "Goodbye")); print "<p>{$saludos[0][0]}, $nombre! Cmo est usted?</p>"; ?>

<p>Hola, Don Pepito! Cmo est usted?</p>

Si se quiere mostrar el resultado de operaciones matemticas (sin utilizar variables auxiliares), es necesario efectuar las operaciones fuera de las cadenas. En algunos casos no es necesario escribir las

operaciones entre parntesis pero, si se escriben entre siempre parntesis no hace falta preocuparse por cundo hacen falta y cundo no.
<?php $x = 3; $y = 4; print "<p>Suma: $x + $y = ".($x+$y)."</p>\n"; print "<p>Multiplicacin: $x x $y = ".($x*$y)."</p>"; ?>

<p>Suma: 3 + 4 = 7</p> <p>Multiplicacin: 3 x 4 = 12</p>

Si se quiere escribir el nombre de una variable, es decir, para que PHP no sustituya la variable por su valor, hay que escribir una contrabarra (\) antes de la variable.
<?php $x = 3; print "<p>La variable \$x vale $x</p>\n"; ?>

<p>La variable $x vale 3</p>

En html/css a veces es necesario juntar nmeros y carcteres, como en el ejemplo siguiente en el que se establece el tamao del prrafo en 30px:
<?php print "<p style=\"font-size: 30px\" >Texto grande</p>\n"; ?>

<p style="font-size: 30px" >Texto grande</p>

Si el tamao est almacenado en una variable, no se puede juntar la variable con los caracteres ya que se interpretara como una variable que no est definida y toma el valor vaco:
<?php $x = 30; print "<p style=\"font-size: $xpx\" >Texto grande</p>\n"; ?>

<p style="font-size: " >Texto grande</p>

... pero se pueden utilizar llaves o sacar la variable de la cadena:


<?php $x = 30; print "<p style=\"font-size: {$x}px\" >Texto grande</p>\n"; ?> <?php $x = 30; print "<p style=\"font-size: ".$x."px\" >Texto grande</p>\n"; ?>

<p style="font-size: 30px" >Texto grande</p>

<p style="font-size: 30px" >Texto grande</p>

Controles en formularios
Explicacin previa
Para que un control enve informacin es necesario:

que el control est incluido en un formulario (<form>). que el formulario tenga establecido el atributo action, con la direccin absoluta o relativa del fichero php que procesar la informacin que el control tenga establecido el atributo name Nota: el atributo name puede contener cualquier carcter (nmeros, acentos, guiones, etc), pero si contiene espacios, PHP sustituye los espacios por guiones bajos (_) al procesar los datos enviados. que el formulario contenga un botn de tipo submit o bien que se ejecute el mtodo submit del formulario.

El siguiente ejemplo muestra un formulario vlido (ejemplo.html):


<form action="ejemplo.php"> <p>Nombre: <input type="text" name="nombre" /></p> <p><input type="submit" value="Enviar" /></p> </form>

Nombre:
Enviar

Pepito Conejo

El programa que recibe los datos los guarda automticamente en la matriz $_REQUEST. Mediante la orden print_r($_REQUEST) se puede mostrar el contenido de la matriz $_REQUEST. El siguiente ejemplo muestra lo que escribira el programa PHP (ejemplo.php) si recibiera la informacin del formulario anterior (ejemplo.html).
<?php print_r($_REQUEST); ?>

Array ( [nombre] => Pepito Conejo)

En los ejemplos que se encuentran en esta pgina, cada ejemplo muestra el cdigo fuente de la pgina html, el aspecto que tiene el control y el contenido de la matriz $_REQUEST cuando se recibe la informacin.

Caja de texo, caja de contrasea y rea de texto


Este control se enva siempre. El valor enviado es el contenido de la caja o rea.

Cdigo fuente
<input type="text" name="cajatexto1" /> <input type="text" name="cajatexto2" value="Cualquier cosa" />

Control

$_REQUEST Array ( [cajatexto1] => )

Cualquier cosa

Array ( [cajatexto2] => Cualquier cosa )

<input type="password" name="cajapassword1" /> <input type="password" name="cajapassword2" value="pezespada" /> <textarea rows="4" cols="20" name="areadetexto1"></textarea>

Array ( [cajapassword1] => ) Array ( [cajapassword2] => pezespada )

Array ( [areadetexto1] => )

Cualquier cosa

<textarea rows="4" cols="20" name="areadetexto2">Cualquier cosa</textarea>

Array ( [areadetexto2] => Cualquier cosa )

Casilla de verificacin
Este control se enva solamente si se marca la casilla. El valor enviado es "on" si la casilla no tiene definido el atributo value o el valor del aributo value si ste est definido.

Cdigo fuente
<input type="checkbox" name="casilla1" /> <input type="checkbox" name="casilla2" /> <input type="checkbox" name="casilla3" value="Tres" />

Control (sin marcar)

$_REQUEST Array ( )

Array ( [casilla2] => on (marcada) ) Array ( [casilla3] => (marcada) Tres )

Botn radio
Este control se enva solamente si se marca alguno de los botones radio que forman el control. El valor enviado es "on" si el botn marcado no tiene definido el atributo value o el valor del atributo value si ste est definido.

Cdigo fuente
<input type="radio" name="radio1" /> <input type="radio" name="radio1" /> <input type="radio" name="radio2" /> <input type="radio" name="radio2" /> <input type="radio" name="radio3" /> <input type="radio" name="radio3" /> <input type="radio" name="radio4" value="Uno" /> <input type="radio" name="radio4" value="Dos" /> <input type="radio" name="radio5" value="Uno" /> <input type="radio" name="radio5"

Control (sin marcar)

$_REQUEST Array ( )

(marcado uno) Array ( [radio2] => on ) (marcado otro) Array ( [radio3] => on ) Array ( [radio4] => Uno (marcado uno) ) Array ( [radio5] => Dos (marcado otro) )

value="Dos" />

Men
Este control enva siempre la opcin elegida. El valor enviado es el contenido de la etiqueta option elegida si la opcin elegida no tiene definido el atributo value o el valor del aributo value si ste est definido. Si el men admite seleccin mltiple, entonces el nombre del men debe acabar con corchetes ([]) y se enva como una matriz, de tantos elementos como opciones se hayan elegido.

Cdigo fuente
<select name="menu1"> <option selected = "selected"> </option> <option></option> </select> <select name="menu2"> <option selected = "selected"> Opcin 1 </option> <option>Opcin 2</option> </select> <select name="menu3"> <option selected="selected" value="Uno"> Opcin 1</option> <option value="Dos">Opcin 2 </option> </select> <select name="menu4[]" size="3" multiple="multiple"> <option selected="selected">Opcin 1</option> <option>Opcin 2</option> <option>Opcin 3</option> </select>

Control

$_REQUEST Array ( [menu1] => )

Opcin 1

Array ( [menu2] => Opcin 1)

Opcin 1

Array ( [menu3] => Uno )

Opcin 1 Opcin 2 Opcin 3

(Marcados 1 y 3)

Array ( [menu4] => Array ( [0] => Opcin 1 [2] => Opcin 3 ) )

Control oculto
Este control se enva siempre y el valor enviado es el valor del atributo value.

Cdigo fuente
<input type="hidden" name="oculto1" /> <input type="hidden" name="oculto2" value="Cualquier cosa" />

Control
Cualquier cosa

$_REQUEST Array ( [oculto1] => ) Array ( [oculto2] => Cualquier cosa )

Botn Enviar (submit)


Este control se enva siempre y el valor enviado es el valor del atributo value.

Cdigo fuente
<input type="submit" value="Submit" /> <input type="submit" value="Submit" name="boton2" />

Control
Submit

$_REQUEST Array ( ) Array ( [boton2] => Submit )

Submit

Archivo
El selector de archivo permite enviar un archivo desde el ordenador del cliente al servidor. En un formulario "normal", este control se enva siempre y el valor enviado es el nombre del archivo elegido.

Cdigo fuente
<input type="file" name="archivo1" />

Control

$_REQUEST Array ( [archivo1] => loquesea.txt )

que este control enve toda la informacin, el formulario debe tener el atributo enctype con el valor multipart/form-data y ser enviado con el mtodo POST. La informacin se almacena entonces en la matriz $_FILES (pero no en la variable $_REQUEST).

Cdigo fuente

Control

<form enctype="multipart/form-data" action="ejemplo.php" method="POST" > <input type="file" name="archivo2" />

$_FILES Array ( [archivo2] => Array ( [name] => loquesea.txt [type] => text/plain [tmp_name] => C:\ejemplos\loquesea.txt [error] => 0 [size] => 27890 ) )

Antes de utilizar este control, hay que configurar en el archivo php.ini el tamao mximo de los archivos que se pueden enviar (mediante la directiva post_max_size) y es conveniente leer el captulo correspondiente a la subida de archivos del manual de PHP para conocer la manera de evitar los posibles riesgos de seguridad.

Imagen
El control de tipo imagen inserta una imagen que funciona como un botn (aunque ni Firefox ni Internet Explorer le da relieve como a los botones). Al hacer clic en un punto de la imagen es como si se hubiera pulsado a un botn submit y se envan las coordenadas del punto en el que se ha hecho clic (junto con los valores de los otros controles del formulario).

Cdigo fuente
<input type="image" name="GNU" alt="GNU" src="gnu.jpg" />

Control

$_REQUEST Array ( [GNU_x] => 89 [GNU_y] => 111 )

Si se define el atributo value, el formulario enva tambin el nombre del control con el valor del atributo.

Recogida de datos
Matriz $_REQUEST
Cuando se enva un formulario, PHP almacena la informacin recibida en una matriz llamada $_REQUEST. El nmero de valores recibidos y los valores recibidos dependen tanto del formulario como de la accin del usuario. Cualquier control se enva solamente si est establecido su atributo name. El atributo name del control puede contener cualquier carcter (nmeros, acentos, guiones, etc), pero si contiene espacios, los espacios se sustituyen por guiones bajos (_). Cada control crea un elemento de la matriz $_REQUEST, que se identifica como $_REQUEST[valor_del_atributo_name] y que contiene el valor entregado por el formulario (en su caso). El siguiente ejemplo muestra un ejemplo de formulario:
<form action="ejemplo.php"> <p>Nombre: <input type="text" name="nombre" /></p> <p><input type="submit" value="Enviar" /></p> </form>

Nombre:
Enviar

Mientras se est programando, para comprobar que el fichero php est recibiendo la informacin enviada por el control, lo ms fcil es utilizar la funcin print_r($matriz) para mostrar el contenido de la matriz $_REQUEST. Una vez se ha comprobado que la informacin llega correctamente, la lnea se debe comentar o eliminar. El siguiente ejemplo muestra lo que escribira el programa PHP si recibiera la informacin del formulario anterior.
Pepito Conejo

Nombre:
Enviar

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; print "<p>Su nombre es $_REQUEST[nombre]</p>"; ?>

Array ( [nombre] => Pepito Conejo )

Su nombre es Pepito Conejo

Conviene colocar etiquetas <pre> alrededor del print_r($_REQUEST) para facilitar la lectura de los valores.

Rerefencia a $_REQUEST dentro y fuera de cadenas


Al hacer referencia a los elementos de la matriz $_REQUEST, hay que tener en cuenta si la referencia se encuentra dentro de una cadena o fuera de ella.

Si se hace referencia dentro de una cadena al control de nombre "nombre", se debe escribir $_REQUEST[nombre] (sin comillas). Si se escribe $_REQUEST['nombre'] (con comillas) se produce un error.
<?php print "<p>Su nombre es $_REQUEST['nombre']</p>"; ?> <?php print "<p>Su nombre es $_REQUEST[nombre]</p>"; ?>

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ejemplo.php on line 2

Su nombre es Pepito Conejo

Si se hace referencia fuera de una cadena al control de nombre "nombre", se debe escribir $_REQUEST['nombre'] (con comillas). Si se escribe $_REQUEST[nombre] (sin comillas) se produce un aviso. Notice: Use of undefined constant nombre assumed 'nombre' in ejemplo.php on line 2 Su nombre es Pepito Conejo

<?php print "<p>Su nombre es ".$_REQUEST[nombre]."</p>";?> <?php print "<p>Su nombre es ".$_REQUEST['nombre']."</p>"; ?>

Su nombre es Pepito Conejo

Comprobacin de existencia
La mayora de controles aparecen en la matriz $_REQUEST aunque el usuario no escriba nada en el formulario. El valor almacenado es una cadena vaca, pero est definida. Si el programa supone que se ha introducido algn valor, el resultado puede confundir al usuario ...

Nombre:
Enviar

<?php Array ( print "<pre>"; [nombre] => print_r($_REQUEST); print ) "</pre>\n"; Su nombre es print "<p>Su nombre es $_REQUEST[nombre]</p>"; ?>

... por lo que conviene incluir una estructura if ... else que considere la posiblidad de que no se haya escrito nada en el formulario:

Nombre:
Enviar

<?php Array ( print "<pre>"; [nombre] => print_r($_REQUEST); print ) "</pre>\n"; No has escrito ningn if ($_REQUEST['nombre']=="") { print "<p>No has escrito ningn nombre</p>"; } else { print "<p>Su nombre es $_REQUEST[nombre]</p>"; } ?>

nombre

Sin embargo, las casillas de verificacin y los botones radio solamente estn definidos en la matriz $_REQUEST si se han marcado en el formulario. Por ejemplo, si en el siguiente formulario:
<form action="ejemplo.php"> <p>Deseo recibir informacin: <input type="checkbox" name="acepto" /></p> <p><input type="submit" value="Enviar" /></p> </form>

Deseo recibir informacin:


Enviar

... el usuario no marca la casilla, la matriz $_REQUEST no contiene ningn dato:

Deseo recibir informacin:


Enviar

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; ?>

Array ( )

Y al pretender utilizar el valor, se produce un aviso por utilizar un ndice no definido: Deseo recibir informacin:
<?php Notice: Undefined index: print acepto in ejemplo.php on line "<p>$_REQUEST[acepto]</p>\n"; 2 ?>

Enviar

Este problema se resuelve comprobando que el ndice est definido antes de hacer referencia a l, utilizando la funcin isset($variable), que admite como argumento una variable y devuelve 1 (Verdadero) si existe y 0 (Falso) si no existe. Deseo recibir informacin:
Enviar

Deseo recibir informacin:


Enviar

<?php No desea recibir informacin if (isset($_REQUEST['acepto'])) { print "<p>Desea recibir informacin</p>"; } else { print "<p>No desea recibir informacin</p>"; } ?> <?php Desea recibir informacin if (isset($_REQUEST['acepto'])) { print "<p>Desea recibir informacin</p>"; } else { print "<p>No desea recibir informacin</p>"; } ?>

En realidad es conveniente efectuar siempre la verificacin de existencia, para prevenir los casos en que un usuario intente acceder a la pgina php sin pasar por el formulario.

Seguridad en las entradas


Un usuario puede insertar cdigo html en la entrada de un formulario, lo que puede acarrear comportamientos inesperados y riesgos de seguridad. El siguiente ejemplo solamente perjudicara al aspecto de la pgina: Nombre:
Enviar
<strong>Pe

<?php Array ( [nombre] => Pepito print "<pre>"; print_r($_REQUEST); print Conejo "</pre>\n"; ) print "<p>Su nombre es $_REQUEST[nombre]</p>"; ?>

Su nombre es Pepito Conejo

Para evitarlo, se puede utilizar la funcin strip_tags($cadena), que elimina todas las etiquetas html, como en el siguiente ejemplo. Nombre:
<strong>Pe

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; print "<p>Su nombre

Array ( [nombre] => Pepito Conejo )

Enviar

es".strip_tags($_REQUEST['nombre'])."</p>"; ?>

Su nombre es Pepito Conejo

Otra funcin que conviene aplicar a cualquier entrada de formulario es la funcin trim($cadena), que elimina los espacios en blanco iniciales y finales y devuelve la cadena sin esos espacios. Por ejemplo, si en el ejemplo siguiente, el usuario introduce varios espacios en blanco en vez de su nombre, la comprobacin no servira para nada ya que la cadena con espacios en blanco no es una cadena vaca Nombre:
Enviar

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; if ($_REQUEST['nombre'] == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $_REQUEST[nombre]</p>"; } ?>

Array ( [nombre] => )

Su nombre es

Sin embargo, si se aplica la funcin trim(), la cadena introducida queda reducida a la cadena vaca y la comprobacin la detecta:
<?php Array ( print "<pre>"; print_r($_REQUEST); [nombre] => print "</pre>\n"; ) if (trim($_REQUEST['nombre']) == "") { No ha escrito ningn print "<p>No ha escrito ningn nombre nombre</p>"; } else { print "<p>Su nombre es ".trim($_REQUEST['nombre'])."</p>"; } ?>

Nombre:
Enviar

Comillas mgicas (magic quotes)


Aunque actualmente se desaconseja su uso, muchos servidores tienen activada la extensin magic_quotes_gpc. Cuando esta extensin est activada, PHP aade automticamente caracteres de escape (\) delante de las comillas que se escriban en un campo de formulario. Para eliminar esos caracteres de escape en los programas, es necesario comprobar si estn activadas las comillas mgicas y eliminar los caracteres de escape aadidos. El ejemplo siguiente muestra lo que ocurrira si estn activadas las comillas mgicas (magic_quotes_gpc = On)

Nombre:
Enviar

Me llamo "P

<?php if ($_REQUEST['nombre'] == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Ha escrito: " . $_REQUEST['nombre']."</p>"; } ?>

Ha escrito: Me llamo \"Pepe\"

Para

caracteres de escape, se puede utilizar la funcin get_magic_quotes_gpc() para detectar si la extensin est activada y la funcin stripslashes() para eliminarlas.
Me llamo "P

eliminar

los

Nombre:
Enviar

<?php if ($_REQUEST['nombre'] == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Ha escrito: "; if (get_magic_quotes_gpc()) { print stripslashes($_REQUEST['nombre']); } else { print $_REQUEST['nombre']; } print "</p>"; } ?>

Ha escrito: Me llamo "Pepe"

Utilizacin de variables
Si aplicamos las medidas mnimas de seguridad comentadas en el punto anterior, cualquier referencia a $_REQUEST[control] debera sustituirse por trim(strip_tags($_REQUEST[control])). Si adems queremos comprobar si el control est definido, el cdigo se complica. Una solucin es guardar los valores de la matriz $_REQUEST en variables y realizar todas las comprobaciones al definir esas variables. En el resto del cdigo basta con utilizar la variable en vez del elemento de la matriz $_REQUEST.

Nombre:
Enviar

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; if (isset($_REQUEST['nombre'])) { $nombre = trim(strip_tags($_REQUEST['nombre'])); } else { $nombre = ""; } if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?> <?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; if (isset($_REQUEST['nombre'])) { $nombre = trim(strip_tags($_REQUEST['nombre'])); } else { $nombre = ""; } if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?>

Array ( [nombre] => )

No ha escrito ningn nombre

Nombre:
Enviar

<strong>Pe

Array ( [nombre] => Pepito Conejo )

Su nombre es Pepito Conejo

La asignacin de la variable se puede realizar en una sola lnea, utilizando la notacin abreviada: (condicin) ? verdadero : falso;: Nombre:
Enviar
<strong>Pe

<?php print "<pre>"; print_r($_REQUEST); print "</pre>\n"; $nombre = (isset($_REQUEST['nombre'])) ? trim(strip_tags($_REQUEST['nombre'])) : ""; if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?>

Array ( [nombre] => Pepito Conejo )

Su nombre es Pepito Conejo

Salida de datos
Si los datos recogidos se escriben luego en una pgina web, hay que tener cuidado en algunos casos especiales.
El carcter & (ampersand)

Si el usuario escribe en una entrada el carcter & (ampersand, entidad de carcter &amp;), si esa cadena se escribe en una pgina, la pgina se ver correctamente en el navegador, pero la pgina no ser vlida (el xhtml ser invalido).
Nombre:
Enviar
Pepito & Co

<?php Su nombre es Pepito & $nombre = Company (isset($_REQUEST['nombre'])) ? trim(strip_tags($_REQUEST['nombre'])) : ""; if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?>

El motivo por el que la pgina es invlida es que el carcter & indica el comienzo de una entidad de carcter. Como en nuestro caso no hay una entidad de carcter, la pgina no es vlida. La solucin es sustituir el carcter & por su entidad de carcter correspondiente (&amp;). Eso se puede hacer con la funcin str_replace()
Nombre:
Enviar
Pepito & Co

<?php Su nombre es Pepito & $nombre = Company (isset($_REQUEST['nombre'])) ? trim(strip_tags($_REQUEST['nombre'])) : ""; $nombre = str_replace('&', '&amp;', $nombre); if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?>

El carcter " (comillas)

Si el usuario escribe en una entrada el carcter " (comillas, entidad de carcter &quot;), si esa cadena se escribe dentro de otras comillas (por ejemplo, en el atributo value de una etiqueta input), la pgina no se ver correctamente y adems no ser vlida.
Nombre:
Enviar
Me llamo "P

<?php Corrija: $nombre = (isset($_REQUEST['nombre'])) ? trim(strip_tags($_REQUEST['nombre'])) : ""; if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Corrija: <input type=\"text\" value=\"$nombre\" /></p>"; } ?>

Me llamo

El problema es que el cdigo fuente contiene comillas dentro de comillas:


<p>Corrige: <input type="text" value="Me llamo "Pepe"" /></p>

Como en el caso anterior, la solucin es sustituir el carcter " por su entidad de carcter correspondiente (&quot;). Eso se puede hacer con la funcin str_replace()
Nombre:
Enviar
Me llamo "P

<?php Corrige: $nombre = (isset($_REQUEST['nombre'])) ? trim(strip_tags($_REQUEST['nombre'])) : "";

Me llamo "P

$nombre = str_replace('"', '&quot;', $nombre); if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Corrija: <input type=\"text\" value=\"$nombre\" /></p>"; } ?>

Volver al principio de la pgina

Funciones de recogida de datos


Recogida de un dato

Para tener en cuenta todos los aspectos comentados en los puntos anteriores, es conveniente definir funciones para la recogida de datos:

La funcion recoge() del ejemplo siguiente tiene como argumento el nombre del control que se quiere recibir y devuelve el valor recibido o una cadena vaca si el control no se ha recibido. Al comienzo del programa el dato recibido se almacena en una variable. En el resto del programa se trabaja con la variable.

<?php function recoge($var) { $tmp = (isset($_REQUEST[$var])) ? trim(strip_tags($_REQUEST[$var])) : ''; if (get_magic_quotes_gpc()) { $tmp = stripslashes($tmp); } $tmp = str_replace('&', '&amp;', $tmp); $tmp = str_replace('"', '&quot;', $tmp); return $tmp; } $nombre = recoge('nombre'); if ($nombre == "") { print "<p>No ha escrito ningn nombre</p>"; } else { print "<p>Su nombre es $nombre</p>"; } ?>

Recogida de un dato con valor predeterminado

La funcin recoge() del apartado anterior se puede modificar para definir un valor predeterminado (es decir, que si el dato no existe, la funcin devuelve el valor predeterminado enviado como segundo argumento). En el ejemplo siguiente, si no se recibe el nombre, se le asigna el nombre "pobrecito hablador".
<?php function recoge($var, $var2='') { $tmp = (isset($_REQUEST[$var])&&($_REQUEST[$var]!='')) ? trim(strip_tags($_REQUEST[$var])) : trim(strip_tags($var2)); if (get_magic_quotes_gpc()) { $tmp = stripslashes($tmp); } $tmp = str_replace('&', '&amp;', $tmp); $tmp = str_replace('"', '&quot;', $tmp); return $tmp; } $nombre = recoge('nombre', 'pobrecito hablador'); print "<p>Su nombre es $nombre</p>"; ?>

Recogida de una matriz de una dimensin

Si un formulario enva los datos en forma de matriz, como en el ejemplo siguiente, la funcin recoge() del punto anterior no servira.
<form action="ejemplo.php"> <p>Nombre: <input type="text" name="nombre[1]" /></p> <p>Apellido: <input type="text" name="nombre[2]" /></p> <p><input type="submit" value="Enviar" /></p> </form>

Nombre: Apellido:
Enviar

Pepito

Conejo

Hay que hacer otra funcin que recoja y trate los datos en forma de matriz.

La funcion recogeMatriz() del ejemplo siguiente tiene como argumento el nombre del control que se quiere recibir (que debe ser una matriz de una dimensin, no sirve para matrices de dos o ms dimensiones) y devuelve una matriz con los valores recibidos o una matriz vaca si el control no se ha recibido. Al comienzo del programa los datos recibidos se almacenan en una matriz. En el resto del programa se trabaja con la matriz.

<?php function recogeMatriz($var) { $tmpMatriz = array(); if (isset($_REQUEST[$var]) && is_array($_REQUEST[$var])) { foreach ($_REQUEST[$var] as $indice => $valor) { $tmp = trim(strip_tags($indice)); if (get_magic_quotes_gpc()) { $tmp = stripslashes($tmp);

} $tmp = str_replace('&', '&amp;', $tmp); $tmp = str_replace('"', '&quot;', $tmp); $indiceLimpio = $tmp; $tmp = trim(strip_tags($valor)); if (get_magic_quotes_gpc()) { $tmp = stripslashes($tmp); } $tmp = str_replace('&', '&amp;', $tmp); $tmp = str_replace('"', '&quot;', $tmp); $valorLimpio = $tmp; $tmpMatriz[$indiceLimpio] = $valorLimpio; } } return $tmpMatriz; } $nombre = recogeMatriz('nombre'); if ($nombre[1]=="") { print "<p style=\"color:red\">No ha escrito su nombre.</p>\n"; } else { print "<p>Su nombre es <strong>$nombre[1]</strong>.</p>\n"; } if ($nombre[2]=="") { print "<p style=\"color:red\">No ha escrito su apellido.</p>\n"; } else { print "<p>Su apellido es <strong>$nombre[2]</strong>.</p>\n"; } ?>

S-ar putea să vă placă și