Programación en PHP
Programación en PHP
Grfica del nmero de dominios y direcciones IP que utilizan PHP. Estadstica de Netcraft. En el ltimo ao, el nmero de servidores que utilizan PHP se ha disparado, logrando situarse cerca de los 5 millones de sitios y 800.000 direcciones IP, lo que le ha convertido a PHP en una tecnologa popular. Esto es debido, entre otras razones, a que PHP es el complemento ideal para que el tndem Linux-Apache sea compatible con la programacin del lado del servidor de sitios web. Gracias a la aceptacin que ha logrado, y los grandes esfuerzos realizados por una creciente comunidad de colaboradores para implementarlo de la manera ms ptima, podemos asegurar que el lenguaje se convertir en un estndar que compartir los xitos augurados al conjunto de sistemas desarrollados en cdigo abierto.
Este ultimo modo est principalmente aconsejado a aquellos que tengan el valor de trabajar con Front Page ya que, usando cualquier otro tipo de etiqueta, corremos el riesgo de que la aplicacin nos la borre sin ms debido a que se trata de un cdigo incomprensible para ella. El modo de funcionamiento de una pgina PHP, a grandes rasgos, no difiere del clsico para una pgina dinmica de lado servidor: El servidor va a reconocer la extensin correspondiente a la pgina PHP (phtml, php, php4,...) y antes de enviarla al navegador va a encargarse de interpretar y ejecutar todo aquello que se encuentre entre las etiquetas correspondientes al lenguaje PHP. El resto, lo enviara sin ms ya que, asumir que se trata de cdigo HTML absolutamente comprensible por el navegador. Otra caracterstica general de los scripts en PHP es la forma de separar las distintas instrucciones. Para hacerlo, hay que acabar cada instruccin con un punto y coma ";". Para la ultima expresin, la que va antes del cierre de etiqueta, este formalismo no es necesario. Incluimos tambin en este capitulo la sintaxis de comentarios. Un comentario, para aquellos que no lo sepan, es una frase o palabra que nosotros incluimos en el cdigo para comprenderlo ms fcilmente al volverlo a leer un tiempo despus y que, por supuesto, el ordenador tiene que ignorar ya que no va dirigido a l sino a nosotros mismos. Los comentarios tienen una gran utilidad ya que es muy fcil olvidarse del funcionamiento de un script programado un tiempo atrs y resulta muy til si queremos hacer rpidamente comprensible nuestro cdigo a
otra persona. Pues bien, la forma de incluir estos comentarios es variable dependiendo si queremos escribir una lnea o ms. Veamos esto con un primer ejemplo de script:
<? $mensaje="Hola mundo!!"; //Comentario de una linea echo $mensaje; #Este comentario tambin es de una linea /*En este caso mi comentario ocupa varias lineas, lo ves? */ ?>
Ejecutar este Script Si usamos doble barra (//) o el smbolo # podemos introducir comentarios de una lnea. Mediante /* y */ creamos comentarios multilnea. Por supuesto, nada nos impide de usar estos ltimos en una sola lnea. No te preocupes si no comprendes el texto entre las etiquetas, todo llegar. Adelantamos que las variables en PHP se definen anteponiendo un smbolo de dlar ($) y que la instruccin echo sirve para sacar en pantalla lo que hay escrito a continuacin. Recordamos que todo el texto insertado en forma de comentario es completamente ignorado por el servidor. Resulta importante acostumbrarse a dejar comentarios, es algo que se agradece con el tiempo.
VARIABLES EN PHP
En el manual de Pginas Dinmicas hemos introducido el concepto de variable. En el captulo anterior comentbamos que, para PHP, las variables eran definidas anteponiendo el smbolo dlar ($) al nombre de la variable que estbamos definiendo. Dependiendo de la informacin que contenga, una variable puede ser considerada de uno u otro tipo:
Variables numricas Almacenan cifras Enteros Real Numeros sin decimales Numeros con o sin decimal $entero=2002; $real=3.14159;
Variables alfanumricas Almacenan textos compuestos de nmeros y/o cifras Cadenas Almacenan variables alfanumricas $cadena="Hola amigo";
Tablas Almacenan series de informaciones numricas y/o alfanumricas $sentido[1]="ver"; $sentido[2]="tocar"; $sentido[3]="oir"; $sentido[4]="gusto"; $sentido[5]="oler";
Arrays
Objetos Se trata de conjuntos de variables y funciones asociadas. Presentan una complejidad mayor que las variables vistas hasta ahora pero su utilidad es ms que interesante. A diferencia de otros lenguajes, PHP posee una gran flexibilidad a la hora de operar con variables. En efecto, cuando definimos una variable asignndole un valor, el ordenador le atribuye un tipo. Si por ejemplo definimos una variable entre comillas, la variable ser considerada de tipo cadena:
$variable="5"; //esto es una cadena Sin embargo si pedimos en nuestro script realizar una operacin matemtica con esta variable, no obtendremos un mensaje de error sino que la variable cadena ser asimilada a numrica: <? $cadena="5"; //esto es una cadena $entero=3; //esto es un entero echo $cadena+$entero ?> Ejecutar este Script Este script dar como resultado "8". La variable cadena ha sido asimilada en entero (aunque su tipo sigue siendo cadena) para poder realizar la operacin matemtica. Del mismo modo, podemos operar entre variables tipo entero y real. No debemos preocuparnos de nada, PHP se encarga durante la ejecucin de interpretar el tipo de variable necesario para el buen funcionamiento del programa. Sin embargo, en contraste, hay que tener cuidado en no cambiar maysculas por minsculas ya que, en este sentido, PHP es sensible. Conviene por lo tanto trabajar ya sea siempre en maysculas o siempre en minsculas para evitar este tipo de malentendidos a veces muy difciles de localizar.
VARIABLES DE SISTEMA
Dada su naturaleza de lenguaje de lado servidor, PHP es capaz de darnos acceso a toda una serie de variables que nos informan sobre nuestro servidor y sobre el cliente. La informacin de estas variables es atribuida por el servidor y en ningn caso nos es posible modificar sus valores directamente mediante el script. Para hacerlo es necesario influir directamente sobre la propiedad que definen. Existen multitud de variables de este tipo, algunas sin utilidad aparente y otras realmente interesantes y con una aplicacin directa para nuestro sitio web. Aqu enumeramos algunas de estas variables y la informacin que nos aportan: Variable Descripcin Nos informa principalmente sobre el sistema operativo y tipo y versin de navegador utilizado por el internauta. Su principal utilidad radica en que, a partir de esta informacin, podemos redireccionar nuestros usuarios hacia pginas optimizadas para su navegador o realizar cualquier otro tipo de accin en el contexto de un navegador determinado.
$HTTP_USER_AGENT
$HTTP_ACCEPT_LANGUAGE
Nos devuelve la o las abreviaciones de la lengua considerada como principal por el navegador. Esta lengua o lenguas principales pueden ser elegidas en el men de opciones del navegador. Esta variable resulta tambin extremadamente til para enviar al internauta a las pginas escritas en su lengua, si es que existen. Nos indica la URL desde la cual el internauta ha tenido acceso a la pgina. Muy interesante para generar botones de "Atrs" dinmicos o para crear nuestros propios sistemas de estadsticas de visitas. Nos devuelve una cadena con la URL del script que est siendo ejecutado. Muy interesante para crear botones para recargar la pgina. Se trata de un array que almacena los nombres y contenidos de las variables enviadas al script por URL o por formularios GET Se trata de un array que almacena los nombres y contenidos de las variables enviadas al script por medio de un formulario POST Se trata de un array que almacena los nombres y contenidos de las cookies. Veremos qu son ms adelante. Almacena la variable usuario cuando se efecta la entrada a pginas de acceso restringido. Combinado con $PHP_AUTH_PW resulta ideal para controlar el acceso a las pginas internas del sitio.
$HTTP_REFERER
$PHP_SELF
$HTTP_GET_VARS
$HTTP_POST_VARS
$HTTP_COOKIES_VARS
$PHP_AUTH_USER
$PHP_AUTH_PW
Almacena la variable password cuando se efecta la entrada a pginas de acceso restringido. Combinado con $PHP_AUTH_USER resulta ideal para controlar el acceso a las pginas internas del sitio. Muestra la direccin IP del visitante. Nos devuelve el path fsico en el que se encuentra alojada la pgina en el servidor. Guarda el identificador de sesin del usuario. Veremos ms adelante en qu consisten las sesiones.
$REMOTE_ADDR $DOCUMENT_ROOT
$PHPSESSID
No todas estas variables estn disponibles en la totalidad de servidores o en determinadas versiones de un mismo servidor. adems, algunas de ellas han de ser previamente activadas o definidas por medio de algn acontecimiento. As, por ejemplo, la variable $HTTP_REFERER no estar definida a menos que el internauta acceda al script a partir de un enlace desde otra pgina.
TABLAS EN PHP
Un tipo de variable que ya hemos descrito pero puede ser relativamente complicado a asimilar con respecto a la mayora son los arrays. Un array es una variable que est compuesta de varios elementos cada uno de ellos catalogado dentro de ella misma por medio de una clave. Veremos en este ejemplo un array llamado sentido que contiene los distintos sentidos del ser humano:
$sentido[1]="ver"; $sentido[2]="tocar"; $sentido[3]="oir"; $sentido[4]="gustar"; $sentido[5]="oler"; En este caso este array cataloga sus elementos, comunmente llamados valores, por nmeros. Los nmeros del 1 al 5 son por lo tanto las claves y los sentidos son los valores asociados. Nada nos impide emplear nombres (cadenas) para clasificarlos. Lo nico que deberemos hacer es entrecomillarlos:
<? $moneda["espana"]="Peseta"; $moneda["francia"]="Franco"; $moneda["usa"]="Dolar"; ?> Otra forma de definir idnticamente este mismo array y que nos puede ayudar para la creacin de arrays ms complejos es la siguiente sintaxis: <? $moneda=array("espana"=> "Peseta","francia" => "Franco","usa" => "Dolar"); ?> Una forma muy practica de almacenar datos es mediante la creacin de arrays multidimensionales (tablas). Pongamos el ejemplo siguiente: Queremos almacenar dentro de una misma tabla el nombre, moneda y lengua hablada en cada pas. Para hacerlo podemos emplear un array llamado pas que vendr definido por estas tres caractersticas (claves). Para crearlo, deberamos escribir una expresin del mismo tipo que la vista anteriormente en la que meteremos una array dentro del otro. Este proceso de incluir una instruccion dentro de otra se llama anidar y es muy corriente en programacin: <? $pais=array ( "espana" =>array ( "nombre"=>"Espaa", "lengua"=>"Castellano", "moneda"=>"Peseta" ), "francia" =>array ( "nombre"=>"Francia", "lengua"=>"Francs", "moneda"=>"Franco" ) ); echo $pais["espana"]["moneda"] //Saca en pantalla: "Peseta" ?> Ejecutar este Script
Antes de entrar en el detalle de este pequeo script, comentemos algunos puntos referentes a la sintaxis. Como puede verse, en esta secuencia de script, no hemos introducido punto y coma ";" al final de cada lnea. Esto es simplemente debido a que lo que hemos escrito puede ser considerado como una sola instruccin. En realidad, somos nosotros quienes decidimos cortarla en varias lneas para, as, facilitar su lectura. La verdadera instruccin acabara una vez definido completamente el array y es precisamente ah donde hemos colocado el nico punto y coma. Por otra parte, podes observar cmo hemos jugado con el tabulador para separar unas lneas ms que otras del principio. Esto tambin lo hacemos por cuestiones de claridad, ya que nos permite ver qu partes del cdigo estn incluidas dentro de otras. Es importante acostumbrarse a escribir de esta forma del mismo modo que a introducir los comentarios ya que la claridad de los scripts es fundamental a la hora de depurarlos. Un poco de esfuerzo a la hora de crearlos puede ahorrarnos muchas horas a la hora de corregirlos o modificarlos meses ms tarde. Pasando ya al comentario del programa, como se puede ver, ste nos permite almacenar tablas y, a partir de una simple peticin, visualizarlas un determinado valor en pantalla. Lo que es interesante es que la utilidad de los arrays no acaba aqu, sino que tambin podemos utilizar toda una serie de funciones creadas para ordenarlos por orden alfabtico directo o inverso, por claves, contar el numero de elementos que componen el array adems de poder movernos por dentro de l hacia delante o atrs. Muchas son las funciones propuestas por PHP para el tratamiento de arrays, no vamos a entrar aqu en una descripcin de las mismas. Slo incluiremos esta pequea tabla que puede ser complementada, si necesario, con la documentacin que ya hemos mencionado. Funcin array_values (mi_array) asort(mi_array) y arsort(mi_array) Descripcin Lista los valores contenidos en mi_array Ordena por orden alfabtico directo o inverso en funcin de los valores Nos da el numero de elementos de nuestro array Ordena por orden alfabtico directo o inverso en funcin de las claves Asigna cada una variable a cada uno de los valores del array Nos permiten movernos por dentro del array con un puntero hacia delante, atras y al principio y al final. Nos da el valor y la clave del elemento en el que nos encontramos y mueve al puntero al siguiente elemento.
count(mi_array)
ksort(mi_array) y krsort(mi_array)
each(mi_array)
De gran utilidad es tambin el bucle foreach que recorre de forma secuencial el array de principio a fin.
CADENAS
Una de las variables ms corrientes a las que tendremos que hacer frente en la mayora de nuestros scripts son las cadenas, que no son ms que informacin de carcter no numrico (textos, por ejemplo). Para asignar a una variable un contenido de este tipo, lo escribiremos entre comillas dando lugar a declaraciones de este tipo: $cadena="Esta es la informacin de mi variable"
Si queremos ver en pantalla el valor de una variable o bien un mensaje cualquiera usaremos la instruccin echo como ya lo hemos visto anteriormente: echo $cadena //sacara "Esta es la informacin de mi variable"
echo "Esta es la informacin de mi variable" //dara el mismo resultado Podemos yuxtaponer o concatenar varias cadenas poniendo para ello un punto entre ellas:
<? $cadena1="Perro"; $cadena2=" muerde"; $cadena3=$cadena1.$cadena2; echo $cadena3 //El resultado es: "Perro muerde" ?> Ejecutar este Script Tambin podemos introducir variables dentro de nuestra cadena lo cual nos puede ayudar mucho en el desarrollo de nuestros scripts. Lo que veremos no es el nombre, sino el valor de la variable:
<? $a=55; $mensaje="Tengo $a aos"; echo $mensaje //El resultado es: "Tengo 55 aos" ?> Ejecutar este Script La pregunta que nos podemos plantear ahora es...Cmo hago entonces para que en vez del valor "55" me salga el texto "$a"? En otras palabras, cmo se hace para que el smbolo $ no defina una variable sino que sea tomado tal cual. Esta pregunta es tanto ms interesante cuanto que en algunos de scripts este smbolo debe ser utilizado por una simple razn comercial (pago en dlares por ejemplo) y si lo escribimos tal cual, el ordenador va a pensar que lo que viene detrs es una variable siendo que no lo es. Pues bien, para meter ste y otros caracteres utilizados por el lenguaje dentro de las cadenas y no confundirlos, lo que hay que hacer es escribir una contrabarra delante: Carcter \$ \" \\ \8/2 Efecto en la cadena Escribe dlar en la cadena Escribe comillas en la cadena Escribe contrabarra en la cadena Escribe 8/2 y no 4 en la cadena
Adems, existen otras utilidades de esta contrabarra que nos permiten introducir en nuestro documento HTML determinados eventos: Carcter \t Efecto en la cadena Introduce una tabulacin en nuestro texto
\n \r
Estos cambios de lnea y tabulaciones tienen nicamente efecto en el cdigo y no en el texto ejecutado por el navegador. En otras palabras, si queremos que nuestro texto ejecutado cambie de lnea hemos de introducir un echo "<br>" y no echo "\n" ya que este ultimo slo cambia de lnea en el archivo HTML creado y enviado al navegador cuando la pgina es ejecutada en el servidor. La diferencia entre estos dos elementos puede ser fcilmente comprendida mirando el cdigo fuente producido al ejecutar este script:
<HTML> <HEAD> <TITLE>cambiolinea.php</TITLE> </HEAD> <BODY> <? echo "Hola, \n sigo en la misma lnea ejecutada pero no en cdigo fuente.<br>Ahora cambio de lnea ejecutada pero continuo en la misma en el cdigo fuente." ?> </BODY> </HTML> Ejecutar este Script Echar un vistazo al codigo fuente del navegador El cdigo fuente que observaramos seria el siguiente:
<HTML> <HEAD> <TITLE>cambiolinea.php</TITLE> </HEAD> <BODY> Hola, sigo en la misma lnea ejecutada pero no en cdigo fuente.<br>Ahora cambio de lnea ejecutada pero continuo en la misma en el cdigo fuente.</BODY> </HTML>
Las cadenas pueden asimismo ser tratadas por medio de funciones de todo tipo. Veremos estas funciones ms adelante con ms detalle. Tan slo debemos retener que existen muchas posibles acciones que podemos realizar sobre ellas: Dividirlas en palabras, eliminar espacios sobrantes, localizar secuencias, remplazar caracteres especiales por su correspondiente en HTML o incluso extraer las etiquetas META de una pgina web.
FUNCIONES
En nuestro manual de pginas dinmicas vimos el concepto de funcin. Vimos que la funcin podra ser definida como un conjunto de instrucciones que explotan ciertas variables para realizar una tarea ms o menos elemental. PHP basa su eficacia principalmente en este tipo de elemento. Una gran librera que crece constantemente, a medida que nuevas versiones van surgiendo, es complementada con las funciones de propia cosecha dando como resultado un sinfn de recursos que son aplicados por una simple llamada. Las funciones integradas en PHP son muy fciles de utilizar. Tan slo hemos de realizar la llamada de la forma apropiada y especificar los parmetros y/o variables necesarios para que la funcin realice su tarea. Lo que puede parecer ligeramente ms complicado, pero que resulta sin lugar a dudas muy prctico, es crear nuestras propias funciones. De una forma general, podramos crear nuestras propias funciones para conectarnos
a una base de datos o crear los encabezados o etiquetas meta de un documento HTML. Para una aplicacin de comercio electrnico podramos crear por ejemplo funciones de cambio de una moneda a otra o de calculo de los impuestos a aadir al precio de articulo. En definitiva, es interesante crear funciones para la mayora de acciones ms o menos sistemticas que realizamos en nuestros programas. Aqu daremos el ejemplo de creacin de una funcin que, llamada al comienzo de nuestro script, nos crea el encabezado de nuestro documento HTML y coloca el titulo que queremos a la pgina:
<? Function hacer_encabezado($titulo) { $encabezado="<html>\n<head>\n\t<title>$titulo</title>\n</head>\n"; echo $encabezado; } ?> Esta funcin podra ser llamada al principio de todas nuestras pginas de la siguiente forma: $titulo="Mi web"; hacer_encabezado($titulo); De esta forma automatizamos el proceso de creacin de nuestro documento. Podramos por ejemplo incluir en la funcin otras variables que nos ayudasen a construir la etiquetas meta y de esta forma, con un esfuerzo mnimo, crearamos los encabezados personalizados para cada una de nuestras pginas. De este mismo modo nos es posible crear cierres de documento o formatos diversos para nuestros textos como si se tratase de hojas de estilo que tendran la ventaja de ser reconocidas por todos los navegadores. Por supuesto, la funcin ha de ser definida dentro del script ya que no se encuentra integrada en PHP sino que la hemos creado nosotros. Esto en realidad no pone ninguna pega ya que puede ser incluida desde un archivo en el que iremos almacenando las definiciones de las funciones que vayamos creando o recopilando. Estos archivos en los que se guardan las funciones se llaman libreras. La forma de incluirlos en nuestro script es a partir de la instruccin require o include: require("libreria.php") o include("libreria.php") En resumen, la cosa quedara as: Tendramos un archivo libreria.php como sigue
<? //funcin de encabezado y colocacin del titulo Function hacer_encabezado($titulo) { $encabezado="<html>\n<head>\n\t<title>$titulo</title>\n</head>\n"; echo $encabezado; } ?> Por otra parte tendramos nuestro script principal pgina.php (por ejemplo): <? include("libreria.php"); $titulo="Mi Web"; hacer_encabezado($titulo); ?> <body> El cuerpo de la pgina
</body> </html>
Ejecutar este Script Echar un vistazo al codigo fuente del navegador Podemos meter todas las funciones que vayamos encontrando dentro de un mismo archivo pero resulta muchsimo ms ventajoso ir clasificndolas en distintos archivos por temtica: Funciones de conexin a bases de datos, funciones comerciales, funciones generales, etc. Esto nos ayudara a poder localizarlas antes para corregirlas o modificarlas, nos permite tambin cargar nicamente el tipo de funcin que necesitamos para el script sin recargar ste en exceso adems de permitirnos utilizar un determinado tipo de librera para varios sitios webs distintos. Tambin puede resultar muy prctico el utilizar una nomenclatura sistemtica a la hora de nombrarlas: Las funciones comerciales podran ser llamadas com_loquesea, las de bases de datos bd_loquesea, las de tratamiento de archivos file_loquesea. Esto nos permitir reconocerlas enseguida cuando leamos el script sin tener que recurrir a nuestra oxidada memoria para descubrir su utilidad. No obstante, antes de lanzarnos a crear nuestra propia funcin, merece la pena echar un vistazo a ladocumentacin para ver si dicha funcin ya existe o podemos aprovecharnos de alguna de las existentes para aligerar nuestro trabajo. As, por ejemplo, existe una funcin llamada header que crea un encabezado HTML configurable lo cual nos evita tener que crearla nosotros mismos. Como puede verse, la tarea del programador puede en algunos casos parecerse a la de un coleccionista. Hay que ser paciente y metdico y al final, a base de trabajo propio, intercambio y tiempo podemos llegar poseer nuestro pequeo tesoro.
Llegados a este punto, el programa verificar el cumplimiento o no de la condicin. Si la condicin es cierta las instrucciones 1 y 2 sern ejecutadas. De lo contrario (else), las instrucciones A y B sern llevadas a cabo. Esta estructura de base puede complicarse un poco ms si tenemos cuenta que no necesariamente todo es blanco o negro y que muchas posibilidades pueden darse. Es por ello que otras condiciones pueden plantearse dentro de la condicin principal. Hablamos por lo tanto de condiciones anidadas que tendran una estructura del siguiente tipo:
if (condicin1) { Instruccin 1; Instruccin 2; ... } else { if (condicin2) { Instruccin A; Instruccin B; ... } else { Instruccin X ... } }
De este modo podramos introducir tantas condiciones como queramos dentro de una condicin principal. De gran ayuda es la instruccin elseif que permite en una sola lnea introducir una condicin adicional. Este tipo de instruccin simpifica ligeramente la sintaxis que acabamos de ver: if (condicin1) { Instruccin 1; Instruccin 2; ... } elseif (condicin2) { Instruccin A; Instruccin B; ... } else
{ Instruccin X ... }
El uso de esta herramienta resultar claro con un poco de prctica. Pongamos un ejemplo sencillo de utilizacin de condiciones. El siguiente programa permitira detectar la lengua empleada por el navegador y visualizar un mensaje en dicha lengua.
<HTML> <HEAD> <TITLE>Detector de Lengua</TITLE> </HEAD> <BODY> <? //Antes de nada introducimos mensajes en forma de variables $espanol="Hola"; $ingles="Hello"; $frances="Bonjour"; //Ahora leemos del navegador cul es su lengua oficial $idioma=substr($HTTP_ACCEPT_LANGUAGE,0,2); //Formulamos las posibilidades que se pueden dar if ($idioma == "es") {echo "$espanol";} elseif ($idioma=="fr") {echo "$frances";} else {echo "$ingles";} ?> </BODY> </HTML> Ejecutar este Script Para poder ver el funcionamiento de este script es necesario cambiar el idioma preferido lo cual puede ser realizado a partir del men de opciones del navegador. Para leer la lengua aceptada por el navegador lo que hacemos es definir una variable ($idioma) y, mediante la funcin substr, recogemos las dos primeras letras del cdigo correspondiente al idioma aceptado por el navegador ($HTTP_ACCEPT_LANGUAGE). La tercera parte de script se encarga de ver si el navegador est en espaol (es), francs (fr) o en cualquier otro idioma que no sea ninguno de estos dos y de imprimir el mensaje que proceda en cada caso. A notar que, cuando se trata de comparar variables, ponemos un doble igual "==" en lugar de un simple "=". Este
La diferencia con respecto a los bucles while es que este tipo de bucle evala la condicin al final con lo que, incluso siendo falsa desde el principio, ste se ejecuta al menos una vez.
Un ejemplo prctico es la lectura de un array lo cual podra hacerse del siguiente modo: <? $moneda=array("Espaa"=> "Peseta","Francia" => "Franco","USA" => "Dolar"); Foreach ($moneda as $clave=>$valor) {
echo "Pais: $clave Moneda: $valor<br>"; } ?> Ejecutar este Script Este script se encargara de mostrarnos por pantalla el contenido del array $moneda. No resultara mala idea crear una funcin propia basada en este bucle que nos permitiese visualizar arrays monodimensionales y almacenarla en nuestra librera. Esta funcin podra ser definida de esta forma: Function mostrar_array ($array) { Foreach ($array as $clave=>$valor) {echo "$clave=>$valor<br>";} } Break y continue Estas dos instrucciones se introducen dentro de la estructura y nos sirven respectivamente para escapar del bucle o saltar a la iteracin siguiente. Pueden resultarnos muy prcticas en algunas situaciones.
OPERADORES
Las variables, como base de informacin de un lenguaje, pueden ser creadas, modificadas y comparadas con otras por medio de los llamados operadores. En los captulos anteriores hemos utilizado en nuestros ejemplos algunos de ellos. En este captulo pretendemos listar los ms importantes y as dar constancia de ellos para futuros ejemplos. Operadores aritmticos Nos permiten realizar operaciones numricas con nuestras variables + * / % Suma Resta Multiplicacin Divisin Devuelve el resto de la divisin
Operadores de comparacin Se utilizan principalmente en nuestras condiciones para comparar dos variables y verificar si cumple o no la propiedad del operador. == != < / > >= Igualdad Desigual Menor que Menor igual que Mayor que Mayor igual que
Operadores lgicos Se usan en combinacin con los operadores de comparacin cuando la expresin de la condicin lo requiere. And Or ! Y O No
Operadores de incremento Sirven para aumentar o disminuir de una unidad el valor de una variable ++$variable --$variable Aumenta de 1 el valor de $variable Reduce de uno el valor de $variable
Operadores combinados Una forma habitual de modificar el valor de las variables es mediante los operadores combinados: $variable += 10 $variable -= 10 $variable .= "aado" Suma 10 a $variable Resta 10 a $variable Concatena las cadenas $variable y "aado"
Este tipo de expresiones no son ms que abreviaciones de otras formas ms clsicas: $variable += 10 es lo mismo que: $variable = $variable+10
<a href="destino.php?saludo=hola&texto=Esto es una variable texto">Paso variables saludo y texto a la pgina destino.php</a> </BODY> </HTML>
<HTML> <HEAD> <TITLE>destino.php</TITLE> </HEAD> <BODY> <? echo "Variable \$saludo: $saludo <br>\n"; echo "Variable \$texto: $texto <br>\n" ?> </BODY> </HTML> Ejecutar este Script Recordamos que es posible recopilar en una variable tipo array el conjunto de variables que han sido enviadas al script por este mtodo a partir de la variable de sistema $HTTP_GET_VARS, que es un array asociativo. Utilizndolo quedara as:
<? echo "Variable \$saludo: $HTTP_GET_VARS["saludo"] <br>\n"; echo "Variable \$texto: $HTTP_GET_VARS["texto"] <br>\n" ?>
<HTML> <HEAD> <TITLE>formulario.html</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="destino2.php"> Nombre<br> <INPUT TYPE="TEXT" NAME="nombre"><br> Apellidos<br> <INPUT TYPE="TEXT" NAME="apellidos"><br> <INPUT TYPE="SUBMIT"> </FORM> </BODY> </HTML>
<HTML> <HEAD> <TITLE>destino2.php</TITLE> </HEAD> <BODY> <? echo "Variable \$nombre: $nombre <br>\n"; echo "Variable \$apellidos: $apellidos <br>\n" ?> </BODY> </HTML> Ejecutar este Script Recordamos que es posible recopilar en una variable tipo array el conjunto de variables que han sido enviadas al script por este mtodo a partir de la variable de sistema $HTTP_POST_VARS.
mensaje de error. Esto nos puede conducir a errores realmente difciles de detectar. Recordamos que es posible recopilar en una variable tipo array el conjunto de cookies almacenadas en el disco duro del internauta mediante la variable de servidor $HTTP_COOKIES_VARS Las cookies son una herramienta fantstica para personalizar nuestra pgina pero hay que ser cautos ya que, por una parte, no todos los navegadores las aceptan y por otra, se puede deliberadamente impedir al navegador la creacin de cookies. Es por ello que resultan un complemento y no una fuente de variables infalible para nuestro sitio.
SESIONES I
En los programas que hemos visto hasta ahora, hemos utilizado variables que slo existan en el archivo que era ejecutado. Cuando cargbamos otra pgina distinta, los valores de estas variables se perdan a menos que nos tomsemos la molestia de pasarlos por la URL o inscribirlos en las cookies o en un formulario para su posterior explotacin. Estos mtodos, aunque tiles, no son todo lo prcticos que podran en determinados casos en los que la variable que queremos conservar ha de ser utilizada en varios scripts diferentes y distantes los unos de los otros. Podramos pensar que ese problema puede quedar resuelto con las cookies ya que se trata de variables que pueden ser invocadas en cualquier momento. El problema, ya lo hemos dicho, es que las cookies no son aceptadas ni por la totalidad de los usuarios ni por la totalidad de los navegadores lo cual implica que una aplicacin que se sirviera de las cookies para pasar variables de un archivo a otro no sera 100% infalible. Es importante a veces pensar en "la inmensa minora", sobre todo en aplicaciones de comercio electrnico donde debemos captar la mayor cantidad de clientes posibles y nuestros scripts deben estar preparados ante cualquier eventual deficiencia del navegador del cliente. Nos resulta pues necesario el poder declarar ciertas variables que puedan ser reutilizadas tantas veces como queramos dentro de una misma sesin. Imaginemos un sitio multilinge en el que cada vez que queremos imprimir un mensaje en cualquier pgina necesitamos saber en qu idioma debe hacerse. Podramos introducir un script identificador de la lengua del navegador en cada uno de los archivos o bien declarar una variable que fuese valida para toda la sesin y que tuviese como valor el idioma reconocido en un primer momento. Pensemos tambin en un carrito de la compra de una tienda virtual donde el cliente va navegando por las pginas del sitio y aadiendo los artculos que quiere comprar a un carrito. Este carrito podra ser perfectamente una variable de tipo array (tabla) que almacena para cada referencia la cantidad de artculos contenidos en el carrito. Esta variable debera ser obviamente conservada continuamente a lo largo de todos los scripts. Este tipo de situaciones son solventadas a partir de las variables de sesin. Una sesin es considerada como el intervalo de tiempo empleado por un usuario en recorrer nuestras pginas hasta que abandona nuestro sitio o deja de actuar sobre l durante un tiempo prolongado o bien, sencillamente, cierra el navegador. PHP nos permite almacenar variables llamadas de sesin que, una vez definidas, podrn ser utilizadas durante este lapso de tiempo por cualquiera de los scripts de nuestro sitio. Estas variables sern especificas del usuario de modo que varias variables sesin del mismo tipo con distintos valores pueden estar coexistiendo para cada una de las sesiones que estn teniendo lugar simultneamente. Estas sesiones tienen adems su propio identificador de sesin que ser nico y especfico. Algunas mejoras referentes al empleo de sesiones han sido introducidas con PHP4. Es a esta nueva versin a la que haremos referencia a la hora de explicar las funciones disponibles y la forma de operar. Para los programadores de PHP3 la diferencia mayor es que estn obligados a gestionar ellos mismos las sesiones definir sus propios identificadores de sesin. Veamos en el siguiente captulo la forma de plasmar esta necesidad tcnica en nuestros scripts a partir de las funciones que gestionan las sesiones en PHP.
SESIONES II
Hemos dicho en el captulo anterior que la variables de sesin se diferencian de las variables clsicas en que stas residen en el servidor, son especificas de un solo usuario definido por un identificador y pueden ser utilizadas en la globalidad de nuestras pginas. Para iniciar una sesin podemos hacerlo de dos formas distintas: -Declaramos abiertamente la apertura de sesin por medio de la funcin session_start(). Esta funcin crea una nueva sesin para un nuevo visitante o bien recupera la que est siendo llevada a cabo. -Declaramos una variable de sesin por medio de la funcin session_register('variable'). Esta funcin, adems de crear o recuperar la sesin para la pgina en la que se incluye tambin sirve para introducir una nueva variable de tipo sesin. Las sesiones han de ser iniciadas al principio de nuestro script. Antes de abrir cualquier etiqueta o de imprimir cualquier cosa. En caso contrario recibiremos un error. Con lo visto, vamos a proponer el ejemplo clsico de utilizacin de una sesin: un contador. Este contador deber aumentar de una unidad cada vez que recargamos la pgina o apretamos al enlace:
<? session_register('contador'); ?> <HTML> <HEAD> <TITLE>contador.php</TITLE> </HEAD> <BODY> <? If (isset($contador)==0) {$contador=0;} ++$contador; echo "<a href=\"contador.php\">Has recargado esta pgina $contador veces</a>"; ?> </BODY> </HTML> Ejecutar este Script La condicin if tiene en cuenta la posibilidad de que la variable $contador no haya sido todava inicializada. La funcin isset se encarga de dar un valor cero cuando una variable no ha sido inicializada. Otras funciones tiles para la gestin de sesiones son: Funcin Session_id() Session_destroy() Session_unregister('variable') Descripcin Nos devuelve el identificador de la sesin Da por abandonada la sesin eliminando variables e identificador. Abandona una variable sesin
Si buscas ms funciones o informacin adicional sobre las sesiones, consulta el manual oficial de PHP.
Ahora ya disponemos de nuestra tabla vaca. Slo queda comenzar a llenarla con los datos que iremos insertando.
<HEAD> <TITLE>Insertar.html</TITLE> </HEAD> <BODY> <div align="center"> <h1>Insertar un registro</h1> <br> <FORM METHOD="POST" ACTION="insertar.php"> Nombre<br> <INPUT TYPE="TEXT" NAME="nombre"><br> Telfono<br> <INPUT TYPE="TEXT" NAME="telefono"><br> <INPUT TYPE="SUBMIT" value="Insertar"> </FORM> </div> </BODY> </HTML>
Llegados a la pgina destino del formulario (insertar.php), lo primero que habr que hacer es establecer un vnculo entre el programa y la base de datos. Esta conexin se lleva a cabo con la funcin mysql_connect. A continuacin, deberemos generar una orden de insercin del registro en lenguaje SQL. Esta orden ser ejecutada por medio de la funcin mysql_db_query. En esta funcin especificaremos primeramente la base de datos sobre la que queremos actuar y a continuacin introduciremos la sentencia SQL:
<HTML> <HEAD> <TITLE>Insertar.php</TITLE> </HEAD> <BODY> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); //Ejecucion de la sentencia SQL mysql_db_query("ejemplo","insert into clientes (nombre,telefono) values ('$nombre','$telefono')"); ?> <h1><div align="center">Registro Insertado</div></h1> <div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div> </BODY> </HTML>
Los parametros user y password son definidos por el creador de la base. Es conveniente en un principio, al crear nuestras bases, trabajar sin ellos con lo cual dejaremos las cadenas correspondientes vacias: "". Adems de la propia insercin, el programa avisa de la introduccin del registro y ofrece un enlace hacia una pgina de lectura la cual ser comentada a continuacin.
seleccionados por una sentencia SQL: <HTML> <HEAD> <TITLE>lectura.php</TITLE> </HEAD> <BODY> <h1><div align="center">Lectura de la tabla</div></h1> <br> <br> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); //Ejecutamos la sentencia SQL $result=mysql_db_query("ejemplo","select * from clientes"); ?> <table align="center"> <tr> <th>Nombre</th> <th>Telfono</th> </tr> <? //Mostramos los registros while ($row=mysql_fetch_array($result)) { echo '<tr><td>'.$row["nombre"].'</td>'; echo '<td>'.$row["telefono"].'</td></tr>'; } mysql_free_result($result) ?> </table> <div align="center"> <a href="insertar.html">Aadir un nuevo registro</a><br> <a href="actualizar1.php">Actualizar un registro existente</a><br> <a href="borrar1.php">Borrar un registro</a><br> </div> </BODY> </HTML> Los pasos a realizar son, en un principio, los vistos para la insercin de un registro: Conexin a la base y ejecucin de la sentencia. Esta vez, la informacin de dicha ejecucin ser almacenada en una variable ($result). El siguiente paso ser plasmar en pantalla la informacin recogida en $result. Esto lo haremos mediante la funcin mysql_fetch_array que devuelve una variable array con los contenidos de un registro a la vez que se posiciona sobre el siguiente. El bucle while nos permite leer e imprimir secuencialmente cada uno de los registros. La funcin mysql_free_result se encarga de liberar la memoria utilizada para llevar a cabo la consulta. Aunque no es necesaria su utilizacin, resulta altamente aconsejable.
ACTUALIZACION DE UN REGISTRO
Para mostrar cmo se actualiza un registro presente en nuestra base de datos, vamos a hacerlo a partir de un caso un poco ms complejo para que empecemos a familiarizarnos con estas operaciones. Realizaremos un par de scripts que permitan cambiar el numero de telfono de las distintas personas presentes en nuestra base. El nombre de estas personas, as como el nuevo numero de telfono, sern recogidos por medio de un formulario.
El archivo del formulario va a ser esta vez un script PHP en el que efectuaremos una llamada a nuestra base de datos para construir un men desplegable donde aparezcan todos los nombres. La cosa quedara as:
<HTML> <HEAD> <TITLE>Actualizar1.php</TITLE> </HEAD> <BODY> <div align="center"> <h1>Actualizar un registro</h1> <br> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); echo '<FORM METHOD="POST" ACTION="actualizar2.php">Nombre<br>'; //Creamos la sentencia SQL y la ejecutamos $sSQL="Select nombre From clientes Order By nombre"; $result=mysql_db_query("ejemplo",$sSQL); echo '<select name="nombre">'; //Generamos el menu desplegable while ($row=mysql_fetch_array($result)) {echo '<option>'.$row["nombre"];} ?> </select> <br> Telfono<br> <INPUT TYPE="TEXT" NAME="telefono"><br> <INPUT TYPE="SUBMIT" value="Actualizar"> </FORM> </div> </BODY> </HTML>
La manera de operar para construir el men desplegable es la misma que para visualizar la tabla. De nuevo empleamos un bucle while en combinacin con la funcin mysql_fetch_array lo que nos permite mostrar cada una de las opciones. El script de actualizacin ser muy parecido al de insercin:
<HTML> <HEAD> <TITLE>Actualizar2.php</TITLE> </HEAD> <BODY> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); //Creamos la sentencia SQL y la ejecutamos $sSQL="Update Clientes Set telefono='$telefono' Where nombre='$nombre'"; mysql_db_query("ejemplo",$sSQL);
?> <h1><div align="center">Registro Actualizado</div></h1> <div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div> </BODY> </HTML>
<HTML> <HEAD> <TITLE>Borrar1.php</TITLE> </HEAD> <BODY> <div align="center"> <h1>Borrar un registro</h1> <br> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); echo '<FORM METHOD="POST" ACTION="borrar2.php">Nombre<br>'; //Creamos la sentencia SQL y la ejecutamos $sSQL="Select nombre From clientes Order By nombre"; $result=mysql_db_query("ejemplo",$sSQL); echo '<select name="nombre">'; //Mostramos los registros en forma de men desplegable while ($row=mysql_fetch_array($result)) {echo '<option>'.$row["nombre"];} mysql_free_result($result) ?> </select> <br>
El siguiente paso es hacer efectiva la operacin a partir de la ejecucin de la sentencia SQL que construimos a partir de los datos del formulario: <HTML> <HEAD> <TITLE>Borrar2.php</TITLE> </HEAD> <BODY> <? //Conexion con la base mysql_connect("localhost","tu_user","tu_password"); //Creamos la sentencia SQL y la ejecutamos $sSQL="Delete From Clientes Where nombre='$nombre'"; mysql_db_query("ejemplo",$sSQL); ?> <h1><div align="center">Registro Borrado</div></h1> <div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>
</BODY> </HTML>
Con este captulo cerramos el bloque de accesos a bases de datos con PHP, esperamos poder haberte ayudado !