Programacionen PHP
Programacionen PHP
Version imprimible
Este documento deber servir exclusivamente como material de apoyo al contenido
del curso interactivo accesible a través de internet.
Indice
Módulo I. Introducción.................................................................
U.D.1. Lenguajes de programación Web............................. 3
U.D.2. ¿Qué es PHP?.................................................... 6
U.D.3. ¿Qué es apache?................................................ 9
U.D.4. Instalación........................................................ 10
Módulo II. Conceptos básicos........................................................
U.D.1. Panorámica del lenguaje...................................... 17
U.D.2. Variables......................................................... 21
U.D.3. Operadores...................................................... 24
U.D.4. Sentencias de control.......................................... 33
Módulo III. Conceptos avanzados...................................................
U.D.1. Cadenas.......................................................... 44
U.D.2. Arrays............................................................. 53
U.D.3. Funciones........................................................ 61
U.D.4. Formularios...................................................... 70
U.D.5. Manejo de ficheros..............................................80
Módulo IV. PHP y las bases de datos..............................................
U.D.1. Estructura de una aplicación web con bases de datos... 88
U.D.2. ¿Qué es MySQL?............................................... 89
U.D.3. El lenguaje SQL................................................. 90
U.d.4. Funciones de PHP con MySQL............................. 102
Módulo V. Aplicaciones comunes en PHP.........................................
U.D.1. Fecha y hora................................................... 111
U.D.2. Envío de emails................................................ 116
Módulo I. Introducción
U.D.1. Lenguajes de programación Web
Tipos de páginas web. Estáticas y dinámicas.
Las primeras páginas que aparecieron en Internet eran muy sencillas y poco
interactivas. Solo permitían mostrar información (texto o imágenes) y seguir enlaces a
nuevas páginas.
Pero hay multitud de funcionalidades que están fuera del alcance de los lenguajes de
programación en el cliente. La interactividad que permiten se reduce prácticamente a
mejorar la apariencia de la información en la página web, y a añadir efectos visuales
que aunque puedan ser curiosos no aportan un valor añadido.
Para poder comprender la diferencia entre una página estática y una página dinámica
hay que tener presente el proceso que sigue una página web desde que la
solicitamos (haciendo clic en un enlace del navegador) hasta que la recibimos y se
muestra por pantalla.
Página estática
Página dinámica
Para generar páginas web se han usado a lo largo del tiempo un gran número de
tecnologías. En los comienzos no había ningún lenguaje de programación específico,
por lo que se hacía uso de lenguajes de uso más general como C, C++, Basic o Pascal.
Para comunicar estos programas con el servidor web se hacía uso de la especificación
CGI (Common Gateway Interface o Pasarela de Interfaz Común). Hoy en día aún hay
aplicaciones que siguen este enfoque, y comúnmente se las conoce como CGI's.
todos los males, por lo general, los CGI son poco eficientes.
De hecho han proliferado tanto que ahora hay una gran cantidad de tecnologías
disponibles, que lanzan los fabricantes con la intención de acaparar la mayor cuota de
mercado posible. Aún así hay tres tecnologías mediante las cuales se desarrollan la
mayoría de los sitios web.
Esta es una tecnología basada en uno de los lenguajes de uso general más populares,
Java. Es quizás el más complejo de los 3 pero a su vez el más potente. La gran
comunidad de usuarios garantiza la existencia de numerosas herramientas, librerías de
código abierto y bases de conocimiento. Además se integra muy bien en el servidor
web mayoritario, Apache gracias a la extensión Tomcat.
A su favor tiene el ser una iniciativa de código abierto, por lo que es mantenido e
impulsado por una gran comunidad de programadores. Además es el más sencillo de
los tres, por lo que atrae a usuarios de muy diferentes procedencias: programadores en
lenguajes de programación más generalistas, diseñadores que desean completar sus
conocimientos...
Ya hemos visto que PHP responde a las siglas PHP Hypertext Procesor. Pero, ¿como
surgió?
Existe ya una versión 5 de este lenguaje, que incluye un sistema novedoso, el PDO
(Objetos de Información de PHP o PHP Data Objects) y mejoras utilizando las ventajas
que provee el nuevo Zend Engine 2. Los cambios que incorpora la versión son
notables, y posicionan a PHP como un lenguaje dinámico muy potente.
Durante este curso se recomienda el uso de Xampp, que viene con la versión 5.04 de
PHP. No obstante, como el curso es de iniciación, no se hará uso de las características
avanzadas, por lo que no nos afectará la versión que estemos utilizando. De todas
formas siempre es conveniente conocecer la versión en la que ejecutaremos nuestras
aplicaciones/ejemplos.
Características de PHP
Dentro de toda la gama de servidores web Apache es sin duda el que mejor
considerado está por parte de los usuarios. La prueba es que el 71% de los sitios web
están alojados en servidores de este tipo (estadísticas de noviembre del 2005 de
http://news.netcraft.com/archives/web_server_survey.html ).
que hace más sencilla su instalación, configuración y despliegue de sitios web. Existen
otros servidores, que, o bien son pequeños productos con pocas características, o bien
son desarrollos de grandes empresas que no son accesibles al público en general.
U.D.4. Instalación
Las páginas con código PHP son archivos que usan la extensión .php . Como hemos
visto, para poder visualizarlas, tienen que estar alojadas en un servidor web remoto.
Esta solución no es factible para practicar con el lenguaje ya que tiene las siguientes
desventajas:
La solución no puede ser más sencilla. Haremos que nuestro ordenador actúe como
servidor web. A esta forma de trabajo se le llama coloquialmente desarrollar en local.
De entre los instaladores disponibles, hemos elegido una solución probada y que cubre
varios sistemas operativos (Windows, GNU/Linux y Mac), esta se llama Xampp en su
version reducida (lite) y la versión 1.5. En el curso vamos a usar la versión para
Windows, que será la referente por facilidad de uso para los usuarios menos
avanzados, aunque veremos algunas pantallas de Linux como alternativa (99%
idénticas).
Xampp en la versión elegida instala las siguientes versiones de Apache, Php y Mysql:
• Apache: v2.0.54
• Php: 5.0.5
• MySQL: v4.1.14
Requerimientos:
Hay que tener en cuenta que Xampp evoluciona muy rápidamente y que en el
momento de realizar el curso puede encontrarse en una versión posterior. De todas
formas es de esperar que la instalación siga siendo muy similar o igual.
• Windows:
http://prdownloads.sourceforge.net/xampp/xampp-win32-1.5.0-pl1-installer.exe?download
• Linux: http://www.apachefriends.org/en/xampp-linux.html
4. Ya está instalado y listo para arrancar el servidor Apache y MySQL, para ello hay
que ejecutar el ejecutable xampp_start.exe dentro de la carpeta C:\CursoPhp\xampplite
:
Mientras estemos utilizando PHP no debemos cerrar esta ventana. Cuando queramos
dejar de usar Xampp no se debe cerrar sin más la ventana, sino ejecutar el programa
xampp_stop.exe , que se encargará de cerrar de forma ordenada la aplicación.
Esta página web esta siendo servida por Apache y PHP (mirar la dirección en el
navegador). Pulsaremos en el idioma español (Spanish ) para continuar.
6. Esta es la página principal de Xampp en español, desde ella podremos navegar por
las demostraciones de PHP (Algunas no funcionarán dado que usamos una versión de
Xampp reducida):
Los resultados de los programas que hagamos se visualizarán a través del navegador,
escribiendo en la barra de direcciones la URL de nuestra página en local.
• http://localhost/practicasPHP/miprograma.php
Una página web en PHP generalmente contiene dos tipos de código: el código HTML y
el código PHP. El código de PHP que va a procesar el interprete puede estar dentro de
una de las siguientes etiquetas:
Nosotros vamos a usar la primera (es la más usual), las dos últimas hay que activarlas
exprésamente en la configuración de PHP.
Ejemplo 2.1.1. Aquí podemos ver una página muy sencilla. Tiene tres bloques de
código: al comienzo la cabecera HTML, después un fragmento en PHP y finalmente el
En un fichero PHP pueden alternarse tantos bloques HTML con bloques PHP como se
quiera, siempre que estos últimos estén abiertos y cerrados por las etiquetas
adecuadas.
Sentencias en PHP
Una sentencia es una instrucción básica que realiza alguna acción. También se les
llama a veces línea de código, aunque estrictamente hablando no tienen porqué ocupar
exactamente una línea en el fichero.
Es imprescindible que las sentencias estén bien diferenciadas. Para ello en PHP toda
sentencia debe ser terminada con un punto y coma " ; ". La única excepción a esto es
la última sentencia antes del fin de un bloque de código PHP, indicado por "?> ".
Ejemplo 2.1.2. Los siguientes bloques de código están bien formados, ya que todas las
sentencias, salvo la última, terminan con un punto y coma:
Ejemplo 2.1.3. Los siguientes bloques de código PHP son equivalentes y por lo tanto
producen el mismo resultado:
Funciones en PHP
En PHP hay dos tipos de funciones, las que están definidas por el propio lenguaje y las
que puede crear a medida el programador. Estas últimas las veremos en la U.D.3. del
módulo III.
Pero en los trozos de código que vienen a continuación nos encontraremos que para
hacer acciones complejas deberemos usar las funciones predefinidas del lenguaje
PHP. Estas se caracterizan por un identificador seguido por un parentesis,dentro del
cual ponemos los parámetros que tenemos que pasarle a la función.
A medida que las vayamos usando iremos describiendo las funciones definidas. Un
ejemplo de este tipo de funciones que hemos visto ya es la instrucción print() .
Comentarios en PHP
Los cometarios son ignorados por el interprete a la hora de generar la página. De todas
formas cumplen una función esencial, aumentar la legibilidad del código, para su
posterior mantenimiento por nosotros o por otra persona. Con los comentarios
describiremos la función de determinados fragmentos de código.
<?php
// Este es un comentario de una sola línea
/*Este es un comentario
que ocupa varias líneas*/
# Esta forma de poner comentarios de una línea se usa menos?>
Hay que tener en cuenta que si bien los comentarios ayudan a comprender el código y
por lo tanto facilitan el mantenimiento del código por nuestra parte o por la de otras
personas, un abuso de los mismos puede hacer difícil distinguir a primera vista el
propósito del código. Lo ideal es escribir un código limpio que resulte lo más legible
posible y limitar el uso de comentarios a aquellas ocasiones en los que haya que hacer
una aclaración imprescindible.
Hay dos palabras que se usan habitualmente en los comentarios durante el desarrollo.
<?php
//FIXME: Marca un trozo de código que habría que mejorar
//DOME: Marca una característica sin programar?>
No está de más recordar que los comentarios son parte del código PHP, por lo que han
de estar en bloques de código PHP (es decir, abiertos por la etiqueta "<¿php " y
cerrados por la etiqueta "?> ".
Errores en PHP
Sin lugar a dudas, cuando programemos, cometeremos errores, como olvidar poner un
punto y coma al final de una instrucción, o no cerrar adecuadamente unas comillas.
Cuando vayamos a intentar ver el resultado en el navegador aparecerá un mensaje de
error (o varios) similar a este.
El mensaje está en inglés y es muy probable que no nos oriente de qué es lo que está
fallando. Pero lo importante es que si que nos muestra donde (en qué línea) está
fallando, por lo que podremos dirigirnos a ella y arreglar el fallo.
Inhibir errores
En ocasiones no querremos que el error se vea por pantalla. Para conseguir esto
pondremos el símbolo arroba "@" antes de la sentencia en la que se produce el fallo.
Ejemplo 2.1.5. El primer trozo de código muestra un mensaje de error al intentar abrir
un archivo que no existe. En cambio en el segundo fragmento se hace uso del símbolo
@ para evitar que dicho error se muestre por pantalla.
<?php
$archivo = fopen("noexiste.txt", "r");
?>
<?php
@$archivo = fopen("noexiste.txt", "r");
?>
U.D.2. Variables
Datos en PHP
En PHP definimos los datos con los que vamos a trabajar como variables. Una variable
no es más que una estructura de datos cuyo valor puede cambiar con el tiempo. PHP
trabaja con tres tipos de datos sencillos: integer (número entero), double (número con
Ejemplo 2.2.1. En los dos ejemplos anteriores el dato es de tipo cadena, aunque la
última cadena contenga un número. Como se puede observar, los datos de tipo string
se escriben entre comillas, que pueden ser simples o dobles.
Nombre de variables
Todas las variables en PHP se distinguen por comenzar con el símbolo del dolar, "$",
seguido del nombre de la variable. El nombre de una variable ha de empezar
necesariamente por una letra o el símbolo guión bajo "_" seguido por cualquier
combinación de números, letras o guiones bajos.
Ejemplo 2.2.4. Mediante este ejemplo se puede ver que PHP distingue entre
mayúsculas y minúsculas en los nombres de variables.
$Precio = 55;
echo "La variable precio contiene el valor";
echo $precio;
echo "<br>";
echo "La variable Precio contiene el valor";
echo $Precio;
?>
A pesar de que tenemos gran libertad a la hora de poner nombres a las variables es
recomendable seguir los siguientes consejos para que el código resulte más legible:
Como se ha ido viendo en los ejemplos, a las variables se les asigna un dato mediante
el símbolo igual "=".
Hay que tener en cuenta que PHP es un lenguaje poco tipado, Las variables no tienen
un tipo de datos predefinido, el tipo vendrá dado según el contenido de la variable o el
contexto donde se trate. Este es el punto mas debil del lenguaje, aunque le aporta una
sencillez y flexibilidad propias.
Constantes
Las constantes son una manera de asignar a un identificador valores simples que no
van a variar. La declaración de una constante se realiza mediante la función define() .
El nombre de la constante debe seguir las mismas reglas que las variables, solo que no
lleva delante el símbolo del dolar, "$", ya que no es una variable. Una práctica habitual
es poner los nombres de las constantes en mayúsculas.
U.D.3. Operadores
Los operadores son utilizados para realizar cálculos y manipular datos en el ámbito de
una expresión. Las expresiones más comunes que conocemos, como la multiplicación,
implican la participación de dos operandos (los datos) y un operador (el símbolo de
la multiplicación). En PHP puede haber:
Ejemplo 2.3.1. Los datos pueden ser introducidos directamente o estar almacenados
en variables. El resultado de la operación se suele asignar a una variable, aunque
puede formar parte de una expresión mayor. Esta variable a la que se asigna el
resultado puede ser parte de la expresión.
Operadores aritméticos
En PHP hay cinco operadores que realizan operaciones matemáticas entre dos datos y
un operador unario, el signo de negación.
dos
operandos.
- Cambio Devuelve $x=6 $y
de el $y=-x vale
signo valor -6
del
operando
con
el
signo
cambiado.
Operadores de comparación
PHP tiene dos constantes predefinidas para designar los valores verdadero y falso, que
son, como cabía esperar, TRUE y FALSE. Se pueden usar también en minúsculas,
aunque conviene recordar que la práctica habitual en programación es usar las
constantes en mayúsculas.
== Es Devuelve verdadero
2==2 TRUE
igual si 2==5 FALSE
los
dos
operandos
son
iguales.
!= No Devuelve verdadero
2!=2 FALSE
<> es si 2!=5 TRUE
igual los
dos
operandos
son
diferentes.
< Es Devuelve verdadero
2<5 TRUE
menor si 5<2 FALSE
el
primer
operando
es
menor
que
el
segundo.
> Es Devuelve verdadero
2>5 FALSE
mayor si 5>2 TRUE
el
primer
operando
es mayor
que
el
segundo.
<= Es Devuelve verdadero
2<=5 TRUE
menor si 2<=2 TRUE
o el
igual primer
operando
es
menor
o
igual que
el
segundo.
>= Es Devuelve verdadero
5>=2 TRUE
mayor si 2>=2 TRUE
o el
igual primer
operando
es
mayor
o
igual que
el
segundo.
A nivel interno PHP no almacena TRUE o FALSE, snio que interpreta el valor 0 como
falso y el 1como verdadero (realmente interpreta como verdadero cualquier valor que
sea diferente de 0. Por ejemplo, en PHP el valor 5 es interpretado como verdadero ).
Ejemplo 2.3.3. En este ejemplo aparece la construcción if ... else que se verá en la
proxima unidad didáctica.
Operadores lógicos
Los operadores lógicos sirven para relacionar los resultados de condiciones, es decir,
combinan los resultados de valores TRUE y FALSE. Son útiles para representar
expresiones del tipo ¿Es cierto que Madrid es la capital de España y que a la vez
Madrid es la ciudad más poblada de España?
|| OR Devuelve verdadero
TRUE TRUE
or ( si && TRUE
o al TRUE
) menos TRUE
uno &&
de FALSE
los
operandos
es
verdadero.
xor XOR Devuelve verdadero
TRUE FALSE
( si && TRUE
o uno TRUE
exclusivo de TRUE
) los &&
operandos FALSE
es
verdadero
pero
no
ambos.
! NOT Devuelve TRUE FALSE
( verdadero FALSE TRUE
negación si
) el
operando
es
falso
y
falso
si
es
verdadero
<pre>
<?php echo "Tabla de verdad del operador AND ";
echo "<br>";
echo "<br>";echo "opdo1 | opdo2 |opdo1 AND opdo2";
echo "<br>";echo "------+-------+----------------";
echo "<br>";
echo "TRUE | TRUE | ";
if (TRUE && TRUE) { echo "TRUE ";
} else {
echo "FALSE";
}echo "<br>";echo "TRUE | FALSE | ";
if (TRUE && FALSE) { echo "TRUE ";
} else {
echo "FALSE";
}
echo "<br>";echo "FALSE | TRUE | ";
if (FALSE && TRUE) { echo "TRUE ";
} else {
echo "FALSE";
}
echo "<br>";echo "FALSE | FALSE | ";
if (FALSE && FALSE) { echo "TRUE ";
} else {
echo "FALSE";
}
?>
</pre>
Ejemplo 2.3.5. Se pueden concatenar directamente cadenas de texto con datos de tipo
entero. Los datos que se concatenan se pueden introducir directamente o extraer de
variables.
<?php
$x = 2;
$y = 3;
$z = $x + $y; echo "El resultado de sumar 2 y 3 es " . 5 . "<br>";
echo "El resultado de sumar 2 y 3 es " . (2 + 3) . "<br>";
echo "El resultado de sumar 2 y 3 es " . $z . "<br>";
?>
Operadores de asignación
= $x = 4 $x = 4
+= $x += 4 $x = $x + 4
-= $x -= 4 $x = $x - 4
*= $x *= 4 $x = $x * 4
/= $x /= 4 $x = $x / 4
%= $x %= 4 $x = $x % 4
.= $x .= "mundo" $x = $x .
"mundo"
++ $x++ $x = $x + 1
-- $x-- $x = $x - 1
Precedencia de operadores
Un último aspecto que conviene mencionar es, ¿qué pasa cuando en una expresión
compleja aparece más de un operando? En ese caso, ¿qué operaciones se evaluan
antes?.
Cuando hay expresiones complejas con más de un operando hay unos que se evaluan
antes de otros siguiendo el siguiente orden, teniendo en cuenta que los de arriba se
evalúan antes que los de abajo y que los de la misma fila tienen igual precedencia (se
evalúan de izquierda a derecha):
Operadores de comparación == !=
(igualdad)
Ejemplo 2.3.6. La multiplicación tiene precedencia sobre la suma por lo que, sin
paréntesis, en la expresión 2 + 5 * 4 se evalúa primero 5 * 4 y luego se le suma dos.
Estructuras condicionales.
Instrucción if
if (condición ) {
Código a ejecutar si la condición es cierta
}
<?php
$hora = 8; // La hora en formato de 24 horasif ($hora == 8) {
echo "Suena el despertador.";}echo "<br>";if ($hora == 8)
echo "Suena el despertador.";?>
Ejemplo 2.4.2. Veamos la diferencia entre poner llaves para encuadrar un bloque de
texto entre llaves y no hacerlo:
<?php
$hora = 11; // La hora en formato de 24 horasif ($hora == 8) {
echo "Suena el despertador. ";
echo "Es la hora de levantarse.";
}
echo "<br>";if ($hora == 8) echo "Suena el despertador. ";
echo "Es la hora de levantarse.";
?>
Instrucción else
En muchos casos no nos bastará con ejecutar un código si ese cumple la condición
sino que querremos elegir entre dos opciones alternativas y mutuamente excluyentes.
En estos casos la sentencia if se completa con un bloque de código que se ejecuta solo
si es falsa la condición:
if (condición ) {
Ejemplo 2.4.3.
<?php
$hora = 17; // La hora en formato de 24 horasif ($hora <= 12) {
echo "Son las " . $hora . " de la mañana";
} else {
echo "Son las " . ($hora - 12) . " de la tarde";}?>
Instrucción else if
También puede suceder que queramos encadenar diferentes condiciones. Para ello se
puede encadenar una sentencia else con un nuevo condicional. A su vez la nueva
sentencia if puede ser completada por un else.
if (condición1 ) {
Código a ejecutar si la condición1 es cierta
} else if (condición2 ) {
Código a ejecutar si la condición1 es falsa y la 2 cierta } else {
Código a ejecutar si ambas condiciones son falsas
}
<?php
$hora = 14; // La hora en formato de 24 horasif ($hora == 8) {
echo "Es la hora de desayunar.";
} else if ($hora == 14) {
echo "Es la hora de la comida.";} else if ($hora == 21) {
echo "Es la hora de la cena.";} else {
echo "Ahora no toca comer.";}?>
Instrucción switch
En el caso anterior se elegía entre varias opciones alternativas y excluyentes. PHP nos
ofrece una instrucción que nos facilita la tarea, siempre que haya que elegir entre
Ejemplo 2.4.5. Puede haber tantas sentencias case como sea necesario.
<?php
$hora = 14; // La hora en formato de 24 horasswitch ($hora) {
case 9: echo "Es la hora de desayunar.";
break; case 14: echo "Es la hora de comer.";
break; case 21: echo "Es la hora de merendar.";
break; default: echo "Ahora no toca comer.";
break;}
?>
Ejemplo 2.4.6. Aquí se puede observar dos estrategias que nos pueden ser útiles en
algunos casos. La primera es formar un grupo de alternativas que producen un
resultado. La segunda en omitir intencionadamente la instrucción break al final de un
bloque.
<?php
$hora = 19; // La hora en formato de 24 horasswitch($hora) {
case 24: case 23: case 22: echo "Ya he cenado.";
case 21: case 20: case 19: case 18: case 17: case 16: case
15: echo "Ya he comido.";
case 14: case 13: case 12: case 11: case 10: echo "Ya
he desayunado."; break;
default:
echo "Tengo hambre";
break;}?>
Estructuras iterativas
En muchas ocasiones, al programar, hay una acción que se repite varias veces.
Podríamos poner varios bloques de código iguales seguidos para conseguir este
efecto, pero esto nos conduciría a un código redundante y muy largo. Además, ¿que
sucede si no conocemos las veces que queremos repetir el código a priori?
Instrucción while
<?php
$i = 1;while ($i <= 10) { echo "Línea " . $i;
echo"<br>";
$i++;
}
?>
Ejemplo 2.4.8. Un ejemplo un poco más complejo. En la expresión condición del bucle
se hace uso de una constante por primera vez en los ejemplos.
<?php
define(HORA_DE_CENAR, 21); //Constante
$hora = 12; // La hora en formato de 24 horaswhile ($hora <
HORA_DE_CENAR) {
echo "Son las " . $hora . ". ";
Ejemplo 2.4.9. Uno de los casos en los que se usa esta estructura es cuando se está
esperando recibir un dato en concreto y hay que realizar varias veces una lectura de un
dato hasta que se recibe el dato esperado. Como aún no conocemos ninguna forma de
recibir datos todavía se ha optado por generarlos aleatoriamente. En este ejemplo se
simula el lanzamiento de un dado de parchis.
Instrucción for
La instrucción for es probablemente la más fácil de comprender para las personas que
están aprendiendo a programar, dado que, en la mayoría de los casos se conoce el
número de veces que se va a ejecutar el bucle antes de entrar al mismo. La sintaxis
que tiene en PHP es:
Ejemplo 2.4.10. Aquí se puede ver un bucle for sencillo que, al igual que el bucle while
del ejemplo 2.4.7., imprime 10 líneas numeradas. Como se puede observar es habitual
utilizar la variable $i en el cuerpo del bucle. A esta variable se le llama a veces índice.
<?php
for ($i = 1; $i <= 10; $i++) { echo "Línea " . $i;
echo"<br>";
}
?>
<?php
echo "Cuenta atrás.";
echo "<br>";for ($i = 10; $i >= 0; $i--) { echo $i . " ... ";
echo"<br>";
}
echo "Ignición!";
?>
Ejemplo 2.4.13. La condición no tiene por qué ser necesariamente sobre la variable
declarada como índice . En este ejemplo se puede observar esto. El resultado es el
mismo que con el ejercicio anterior.
De todas formas es muy recomendable que la condición sea sobre el índice. También
hay que evitar alterar el contenido del índice en el cuerpo del bucle, pues puede llevar a
Hasta ahora hemos visto a las sentencias de control actuar de forma aislada. Pero en
la mayoría de las situaciones nos encontraremos con que para obtener el resultado
esperado hemos de hacer que trabajen juntas. Esto no supone ningún problema. Un
bloque de código dentro de una sentencia de control puede contener varias sentencias
condicionales, y a su vez los bloques de código de estas, nuevas sentencias
condicionales.
Ejemplo 2.4.14. Aquí se puede ver un caso típico del uso de sentencias de control
anidadas.
<?php
for ($i = 1; $i <= 10; $i++) { if (($i % 2) == 1) {
echo "El " . $i . " es un número impar.";
echo "<br>"; } else {
echo "El " . $i . " es un número par.";
echo "<br>"; }
}?>
El principal problema con el que nos podemos encontrar es tener un código poco
legible. Para evitarlo es recomendable poner espacios delante de cada bloque de
código de tal forma que el comienzo de las instrucciones comience a diferentes
distancias del margen dependiendo del bloque en el que se está. A esta técnica se le
llama indentado (sangrado).
Ejemplo 2.4.15. Este código es idéntico al anterior pero sin indentado. Es obvio que
este es mucho más dificil de comprender el flujo que sigue el programa.
<?php
for ($i = 1; $i <= 10; $i++) {if (($i % 2) == 1) {
echo "El " . $i . " es un número impar.";
echo "<br>";} else {
echo "El " . $i . " es un número par.";
echo "<br>";}
}?>
Indentar no es obligatorio, el código funcionaría igual sin hacerlo, pero como se ha visto
en este ejemplo los programas se vuelven prácticamente ilegibles.
<table>
<?php
for ($i = 1; $i <= 10; $i++) {
echo "<tr align='right'>";
for ($j = 1; $j <= 10; $j++) {
echo "<td width='25'>" . ($i*$j) . "</td>";
}
echo "</tr>";
}
?>
</table>
Si no controlamos bien la condición del bucle esta nunca se evaluará a falso y el bucle
se evaluará indefinidamente, dando lugar a un bucle infinito. Este es uno de los errores
más habituales, en bucles complejos puede ser fácil perder de vista cuales son las
variables que intervienen en la evaluación de la condición.
Ejemplo 2.4.17. Este es un bucle infinito que escribirá indefinidamente una frase por
pantalla. El bucle no se detiene hasta que no paremos la descarga desde el navegador
o nos quedemos sin memoria.
<?phpwhile (TRUE) {
echo "Hasta el infinito ";
echo "y más allá...";
echo "<br>";
}?>
break
ejecución del bucle y se pasa a la siguiente línea de código después del bucle.
<?php
while (TRUE) {
echo "Hasta el infinito";
break;
echo " y más allá..."; echo "<br>";
}?>
<?php
define(ALERTA_MISION, 5);
$nivel_alerta = 1;
while (TRUE) {
echo "Hasta el infinito";
if ($nivel_alerta == ALERTA_MISION) {
break;
} echo " y más allá...";
echo "<br>";
$nivel_alerta++; // Se incrementa en uno}
echo "Parece que hay alguien en apuros.";?>
continue
Ejemplo2.4.20. Este programa lista los números del 1 al diez, indica los que
son múltiplos por 3 y si son divisibles por 3 nos muestra el resultado de esta división.
echo "<br>";
continue;
}
echo " es multiplo de 3. ";
echo "Por lo tanto ";
echo $i . " dividido entre 3 es igual a " . ($i / 3); echo "<br>";
}?>
Las sentencias break y continue dan lugar por lo general a un código más complejo y
propenso a errores, por lo que no se recomienda su uso por parte del programador
principiante.
Como en una página web dinámica programada en PHP hay código de dos tipos lo
mejor es mantenerlos bien diferenciados. Hay que ser especialmente cuidadoso
procurando que el código sea muy legible. Esto facilitará el mantenimiento de la página
y hará mucho más sencillo dotarla de elementos de diseño.
El objetivo ideal sería que un diseñador web pudiera aplicar diseño a una página PHP
sin tener que preocuparse de la programación que contiene. En el módulo V veremos
una breve introducción a las plantillas que nos facilitan notablemente la tarea de
separar el código HTML del PHP.
Hasta ahora, siempre que hemos necesitado mostrar un texto compuesto por una
cadena y el valor de una variable los hemos tenido que unir usando el operador
concatenar " . ". Pero PHP ofrece una sintaxis alternativa que resulta más compacta y
puede ser de utilidad en muchos casos.
Ejemplo 3.1.1. Si ponemos una variable en el interior de una cadena entre comillas,
PHP la interpreta y en vez del nombre de la variable escribe su valor. Lo podemos
comprobar a continuación, donde los dos fragmentos de código producen los mismos
resultados.
<?php
$edad = 46;
echo "Belinda tiene " . $edad . " años.";
?>
<?php
$edad = 46;
Ejemplo 3.1.2. En este pequeño programa predomina el código PHP sobre el código
HTML.
<html>
<head>
<title>Números primos</title>
</head>
<body><?php
define(LIMITE, 100);
echo "Los números primos del 1 al " . LIMITE . " son:";
echo "<br>";
for ($i = 1; $i <= LIMITE; $i++) {
$es_primo = TRUE; //Hipótesis inicial, es primo
for ($j =2; $j < $i; $j++) {
if(($i % $j) == 0) { //Tiene un divisor
$es_primo = FALSE; //Luego no es primo
break;
}
}
if ($es_primo) {
echo "$i";
echo "<br>";
}
}
?></body>
</head>
Ejemplo 3.1.3. En este pequeño programa predomina el código HTML sobre el código
PHP.
<html>
<head>
<title>El hombre del tiempo</title>
</head>
<body bgcolor="#cccccc">
<table border="1">
<tr>
<td align="center" colspan="2">
Hola, soy el hombre del tiempo.<br>
Mi método para adivinar el clima es infalible.
</td>
</tr>
<tr>
<td align="center">
Temperatura mínima prevista
</td>
<td align="center">
Temperatura máxima prevista
</td>
</tr>
<tr>
<td align="center">
<font size="+2"><?= rand(0, 15)?></font> grados.
</td>
<td align="center">
<font size="+2"><?= rand(15, 30)?></font> grados.
</td>
</tr>
</table>
</html>
Cuando tenemos que mostrar trozos de código HTML muy grandes y este se encuentra
dentro de una estructura condicional, puede ser muy pesado construirlos a base de
sentencias echo . En este caso es preferible volver a cerrar el bloque de código PHP
con la etiqueta ?>, escribir el código HTML que se ejecuta condicionalmente, y abrir
otra vez el código PHP con la etiqueta <?php para terminar la estructura condicional.
Este sistema, combinado con el uso de la sintaxis <=? ... ?> produce un código
Ejemplo 3.1.4. Aquí se ven las dos estrategias. La segunda es más compacta y clara.
<?php
$autorizado = FALSE;
if (!$autorizado) {
echo ?<center>?;
echo ?<table bgcolor="#cccccc">?;
echo ?<tr>?;
echo ?<td align="center">?;
echo ?<font color="#ff0000" size="+2">?;
echo ?No está autorizado a ver esta página.?;
echo ?<br>?;
echo ?Contacte con el administrador del sistema.?;
echo ?</font>?;
echo ?</td>?;
echo ?</tr>?;
echo ?</table>?;
echo ?</center>?;
}
?>
<?php
$autorizado = FALSE;
if (!$autorizado) {
?>
<center>
<table bgcolor="#cccccc">
<tr>
<td align="center">
<font color="#ff0000">
No está autorizado a ver esta página.<br>
Contacte con el administrador del sistema.
</font>
</td>
</tr>
</table>
</center> <?php
}
?>
La última cuestión que nos queda por resolver es donde situar el código. Salvo el
código que muestra resultados por pantalla, que tiene que aparecer en el lugar
apropiado de la página, el código PHP se puede situar en cualquier lugar. La mejor
opción es separarar en la medida de lo posible el código encargado de:
Ejemplo 3.1.5. Esta es una página web en PHP bien construida. Usa un algoritmo para
hallar el máximo común divisor de dos números generados aleatoriamente.
<?php
//Inicialización
DEFINE(LIMITE, 100);
//Lectura de datos
$i = rand(1, LIMITE); //Simulamos la lectura
$j = rand(1, LIMITE);
</head>
<body>
El máximo común divisor de <?= $i ?>y <?= $j ?>es <?= $mcd ?>.
</body>
</html>
Esto no es posible siempre. Por ejemplo, si tenemos que mostrar una lista de 11
resultados el bucle que los recorre deberá estar mezclado con el código HMTL. De
todas formas con la experiencia iremos aprendiendo poco a poco a extraer la mayor
parte del código PHP al comienzo de la página.
Manipulación de cadenas
Se puede acceder a los caracteres de las cadenas indicando la posición del caracter
que queremos extraer. Las posiciones van desde 0 hasta el número de caracteres
(longitud) menos uno. Si intentamos acceder a una posición más allá del final de la
cadena nos devolverá la cadena vacía (cadena sin ningún caracter = "").
<?php
$cadena = "Pernambuco";
echo "Cadena a analizar: '$cadena'<br>";
strlen()
strlen(cadena )
strpos()
strpos(cadena , caracter )
substr()
Habrá muchos casos en los que nos interesará extraer un trozo del texto de una
cadena. Para hacerlo disponemos de esta función.
<?php
$email = "[email protected] ";
trim()
trim(cadena )
str_replace()
Ejemplo 3.1.8. En este ejemplo se supone que podemos recibir emails con erroneos, y
los intentamos arreglar. El primer error que eliminamos es la aparición de espacios en
blanco al principio y al final de la dirección. El segundo cuando los usuarios escriben el
dominio pernambuco.es cuando el correcto es pernambuco.com .
<?php
$email = " [email protected] ";
echo "Dirección recibida: ?$email?.<br>";
//Eliminamos los espacios en blanco
$email = trim($email);
//Reemplazamos pernambuco.es por pernambuco.com
$email = str_replace($email, "pernambuco.es", "pernambuco.com");
strtoupper() y strtolower()
strtoupper(cadena )
strtolower(cadena )
<?php
$email = " [email protected] ";
echo "Dirección recibida: ?$email?.<br>";
//Convertimos a minúsculas
$email = strtolower($email);
echo "Dirección corregida: ?$email?.";
?>
Ejemplo 3.1.10. Un uso muy habitual de estas funciones es para comparar cadenas.
Para PHP la cadena "MADRID" es diferente a la cadena "Madrid", pero mediante estas
funciones se pueden comparar como iguales.
number_format()
Esta función es útil cuando hay que mostrar datos de tipo double, es decir, números
con decimales. Permite especificar el número de decimales que queremos que se
muestren, en lugar de los diez decimales que se muestran habitualmente.
number_format(número, decimales )
Ejemplo 3.1.11. Esta función ya apareció en una práctica del módulo anterior.
<?php
$precio_kg = 1.29;
$peso = 2.17;
$a_pagar = $precio_kg * $peso;
//Saca el dato $a_pagar ocn 2 decimales
echo "A pagar " . number_format($a_pagar, 2) . " euros.";?>
U.D.2. Arrays
Hasta ahora hemos trabajado en nuestros programas con una pequeña cantidad de
datos, y la cantidad de los mismos no variaba a lo largo del programa. Pero la mayoría
de los programas que hacen algo útil requieren tratar gran cantidad de datos. En este
caso sería muy incomodo tener una variable para cada dato.
Afortunadamente cuando se tratan muchos datos estos suelen ser de unos tipos muy
similares entre sí. Para tratarlos en grupos PHP ofrece tipos de datos compuestos, es
decir, tipos de datos que permiten almacenar varios datos en una misma variable.
El tipo de datos compuesto más sencillo es el array . Es una estructura muy potente,
flexible y de uso muy intuitivo. Un array está compuesto por varios elementos. Cada
elemento almacena un valor diferente. Y para poder localizar un elemento hay
disponemos del índice (algo así como una dirección).
El tipo más sencillo de arrays son los indexados numéricamente, en los que el índice
de cada elemento corresponde con su posición. Hay que tener en cuenta qué, al igual
que sucedía con las cadenas, el primer elemento de un array tiene índice 0 (y no 1
como cabría esperar).
Inicializaciar un array
Los arrays se suelen almacenar en variables, como cualquier otro tipo de datos.
La forma más sencilla de crear un array es asignando los valores de sus elementos a la
vez que se crea. Para ello primero declaramos el nombre de la variable y usamos la
función array() , a la que le pasamos como parámetros un grupo de valores separados
por comas.
Ejemplo 3.2.1. Creación de un array por asignación directa mediante la función array()
:
La segunda forma de crear un array es añadiéndole elementos al final del array. Para
añadir un elemento a un array se usa su identificador seguido de corchetes "[ ]", sin el
índice, y se le asigna un valor.
Ejemplo 3.2.2. Aquí se puede ver como se crea un array mediante la adición de
elementos.
Necesitaremos acceder a los elementos de un array para asignarles valores o para leer
su contenido. Esto es muy sencillo, basta poner el índice del elemento al que queremos
acceder entre corchetes "[ ... ]".
Ejemplo 3.2.4. Aquí se leen los valores de los elementos de un array para sacarlos
por pantalla. Luego se asigna un nuevo valor al primer elemento (recordamos, con
índice 0).
Recorrer un array
Los arrays se suelen utilizar para almacenar listas de valores. Por ello una de las
acciones más habituales que se hacen con ellos es recorrerlos de principio a fin para
leer o modificar uno o varios de ellos.
Las estucturas iterativas (bucles) que se vieron en la unidad didáctica 4 del módulo II
son idóneas para recorrer arrays. Lo único que hay que hacer es limitar el número de
iteraciones al número de elementos del array. Para esto disponemos de la función
count().
count(array )
Ejemplo 3.2.5. La función count() nos dice cuantos elementos contiene un array.
Ejemplo 3.2.7. Recorriendo un array para modificar todos sus elementos. Aquí se usan
dos arrays que están relacionados por sus posiciones.
<?php
$nombres = array(Juan, Inés, Andrea, Roberto); $edades = array(33, 28, 45,
52);for ($i = 0; $i < count($edades); $i++) {
echo "$nombres[$i] tiene $edades[$i] años.<br>";
}
echo "<br>";for ($i = 0; $i < count($edades); $i++) {
$edades[$i]++;
}
echo "Ha pasado un año...<br>";
for ($i = 0; $i < count($edades); $i++) {
echo "$nombres[$i] tiene $edades[$i] años. <br>";
}
?>
Ejemplo 3.2.8. Recorriendo un array para buscar un elemento. Se vuelve a hacer uso
de dos arrays relacionados por las posiciones de sus índices. En este código se da por
supuesto que se va a encontrar el valor buscado. No es seguro, fallaría si
preguntaramos por la edad de una persona cuyo nombre estuviera en el array
nombres.
Ordenar un array
La función sort() ordena los elementos de un array. Si el array está formado por
cadenas de texto considera menores las minúsculas que las mayúsculas.
sort(array )
Ejemplo 3.2.9. En esta ejemplo se ordena una lista de nombres, primero por el
procedimiento normal. Luego se muestra la forma de ordenar el mismo array sin hacer
distinción entre mayúsculas y minúsculas.
<?php
$astros = array("planeta", "cometa", "Venus", "Jupiter");
echo "<br>";
Arrays no secuenciales
Hasta ahora lo arrays que hemos visto tenían como índices la sucesión 0 (1er elemnto),
1 (2o elemento), 2 (3er elemento) ...En PHP los índices de un array no tiene por qué
ser consecutivos, pueden incluso estar desordenados.
El índice de los arrays asociativos no tiene por qué ser necesariamente un entero,
puede ser también un numero decimal o una cadena. Este tipo de arrays es más difícil
de usar y aunque permite una mayor flexibilidad pueden ser fuente de muchos errores
difíciles de detectar si no se usan con cuidado.
Arrays asociativos
Estos son un caso específico de arrays no secuenciales en los que el índice es una
cadena de texto. Pueden resultar útiles para guardar listas en las cuales se asocia un
Ejemplo 3.2.10. Cuando se declaran explícitamente los índices se escribe el valor del
indice seguido por "=>" y el valor del elemento que contiene.
<?php
$capitales = array("Italia" => "Roma",
"Francia" => "Paris",
"Portugal" => "Lisboa");
Ejemplo 3.2.11. En la siguiente sentencia PHP considera como texto la parte en verde
y como código la parte en rojo. Como no puede entender la palabra Francia dará un
error.
$alturas["Mulhacen"] = 3748;
echo "El Aneto mide {$alturas["Aneto"]} metros";
?>
Hay que tener cuidado con este sistema de creación pues se usa indistintamente para
crear un elemento y para acceder a su valor.
Ejemplo 3.2.13. En este ejemplo primero se relaciona un array con otro a través de
índices de tipo cadena. Los valores del primer array sirven a su vez como índices del
segundo.
<?php
$nombres = array("Eva", "Antonio", "Felipe", "Rosa");
$edades = array("Eva" => 28,
"Antonio" => 43,
"Felipe" => 32,
"Rosa" => 55);
Aún así, al igual que ocurría con los arrays no secuenciales, su uso no es
recomendable si no se tiene dominio sobre el lenguaje de programación PHP.
Arrays no homogéneos.
Como estamos viendo PHP establece muy pocas limitaciones a las estructuras de los
arrays. Aunque hasta el momento todos los arrays que hemos visto los hemos usado
para manipular datos del mismo tipo (arrays de enteros, arrays de cadenas...) esta es
una restricción que no era necesaria.
PHP permite mezclar en los elementos de los array valores de diferentes tipos. Incluso
permite que los índices de los elementos de un mismo array sean de diferentes tipos.
Pero una vez más esta es una estrategia peligrosa a seguir y a la que en la mayoría de
los casos no será necesario recurrir.
Arrays multidimensionales
Ejemplo 3.2.14. Aquí se muestra como almacenar una matriz (array de dos
dimensiones) que contiene una sopa de letras generada aleatoriamente (la función
chr() devuelve un caracter dado su número ascii).
<font >
<?php
DEFINE(ALTO,10);
DEFINE(ANCHO,20);
$sopa_letras = array();
<pre>
<?php$edades = array("Eva" => 28,
"Antonio" => 43,
"Felipe" => 32,
"Rosa" => 55);
print_r($edades);
?>
</pre>
Desbordamiento de arrays
Ejemplo 3.2.16. Aquí se accede al quinto elemento del array, que no existe.
U.D.3. Funciones
PHP es un lenguaje estructurado y como tal dispone de funciones. Las funciones no
son más que fragmentos de código (programitas) a los que se puede llamar desde
cualquier parte del código. Gracias a esto permiten:
páginas PHP.
Antes de poder utilizar una función ésta ha de ser escrita. Por lo tanto el lugar en el que
se suelen situar las funciones es al comienzo del archivo, de tal forma que estén
disponibles a partir de ese momento. Situarlas al comienzo también ayuda a una
estructuración del código más lógica.
Las funciones se declaran, como las variables, con un nombre , precedido de la palabra
function , unos paréntesis (para albergar los datos de entrada, llamados argumentos o
parámetros) y unas llaves que incluyen el cuerpo de la función. Dentro del cuerpo de la
función podemos declarar variables, llamadas a otras funciones y demás sentencias.
Para utilizar una función se escribe su nombre, seguido de paréntesis y dentro de estos
se escriben los datos que se quieren pasar a la función (o variables que contienen
dichos datos).
<?phpfunction hola_mundo() {
echo "¡Hola Mundo!";
}
hola_mundo();
?>
Devolución de un valor
Las funciones son mucho más útiles si pueden devolver un dato. Para ello usan la
sentencia return . Una vez que se llega a esta instrucción no se ejecuta el código que
se pueda encontrar a continuación.
<?php
function dia_semana() {
$semana = array("lunes", "martes", "miércoles", "jueves",
"viernes", "sabado", "domingo");
$dia = $semana[rand(0, 6)];
return $dia;
}
$dia_cine = dia_semana();
echo "El próximo $dia_cine voy al cine.";
?>
Argumentos
Aún así, estas funciones que hemos visto son muy sencillas y no permiten hacer
grandes cosas. Lo más habitual es que a las funciones se les pasen datos, que
luego operen con estos y que al terminar la función devuelva el resultado. A los datos
que recibe una función se les llama argumentos o parámetros.
<?php
function cuadrado($numero) {
return $numero * $numero;}for ($i = 1; $i <= 10; $i++) {
echo "$i al cuadrado es igual a " . cuadrado($i) . ".<br>";
}?>
En ocasiones es preferible no hacer la copia del dato que se pasa. Esto puede
interesar cuando se trabaje con arrays (el copiado de muchos datos puede perjudicar el
tiempo de ejecución del programa) o más comunmente cuando se quiere alterar el
valor de la variable para obtener algún efecto. A esto se le llama paso de parámetros
por referencia. Para indicar que un parámetro se pasa por referencia se le antepone el
símbolo ampersand, "&".
Una función puede emplear argumentos pasados por valor y por referencia.
<?php
function duplicar_por_valor($argumento) {
$argumento = $argumento * 2;
echo "Dentro de la función vale $argumento.<br>";
}
function duplicar_por_referencia(&$argumento) {
$argumento = $argumento * 2;
echo "Dentro de la función vale $argumento.<br>";
}
$numero1 = 5;
echo "Antes de llamar a la función vale $numero1.<br>";
duplicar_por_valor($numero1);
echo "Después de llamar a la función vale $numero1.<br>";
echo "<br>";
$numero2 = 7;
echo "Antes de llamar a la función vale $numero2.<br>";
duplicar_por_referencia($numero2);
echo "Después de llamar a la función vale $numero2.<br>";
?>
Ejemplo 3.3.5. No se puede hacer que una función devuelva dos valores. Pero en su
lugar es posible pasar por referencia las variables a devolver y modificar su contenido
en el cuerpo de la función. Aquí se emplea esta estratagema para intercambiar el
contenido de dos variables.
<?php
function intercambiar(&$argumento1, &$argumento2) {
$auxiliar = $argumento1;
$argumento1 = $argumento2;
$argumento2 = $auxiliar;
}
$numero1 = 5;
$numero2 = 8;
echo "($numero1, $numero2)<br>";
intercambiar($numero1, $numero2);
echo "($numero1, $numero2)"
?>
Dentro de las funciones también podemos declarar nuevas variables, pero, ¿que pasa
si hay una variable dentro de una función que se llama igual que una variable que se
encuetra fuera de la función? La respuesta es que la variable de dentro de la función es
diferente de la que está fuera y por lo tanto su valor es independiente.
A esto se le llama alcance de una variable. Las variables que se declaran dentro de
una función solo existen en el cuerpo de la función.
Ejemplo 3.3.6. Este código muestra el alcance de una variable dentro de una función.
No hay que confundir este ejemplo con el ejemplo 3.3.4. En este caso no hay ningún
argumento.
<?php
function mi_ciudad() {
$ciudad = "Madrid";
echo "Dentro de la función vale $ciudad.<br>";
}
$ciudad = "Barcelona";
echo "Antes de llamar a la función vale $ciudad.<br>";
mi_ciudad();
Ejemplo 3.3.7. Puede darse el caso de que queramos acceder a una variable global
dentro del cuerpo de la función. Para conseguirlo le antepondremos la palabra clave
global a la primera referncia de la variable, con lo que el interprete PHP sabe que
estamos llamando a la variable externa.
<?php
function mi_ciudad() {
global $ciudad;
$ciudad = "Madrid";
echo "Dentro de la función vale $ciudad.<br>";}
$ciudad = "Barcelona";
echo "Antes de llamar a la función vale $ciudad.<br>";
mi_ciudad();
echo "Después de llamar a la función vale $ciudad.<br>" ?>
Creación de bibliotecas
Para conseguir un código lo más claro posible es deseable que este sea breve. Una
forma de conseguirlo es extraer las funciones que se declaran a un
archivo independiente con extensión .php . Una ventaja de esta estrategia es que se
pueden hacer accesibles estas funciones a más de una página en PHP.
<?php
// Biblioteca de funciones de usuario
// Archivo utils.php
Ejemplo 3.3.9. En los ficheros de biblioteca se puede incluir cualquier tipo de código.
También se pueden poner archivos de configuración, de constantes predefinidas, etc.
En este caso se guarda en el archivo config.php.
<?php
// Fichero de configuración
// Archivo config.php
Para tener disponibles las funciones de un fichero externo hay que indicarle al código
PHP que las ha de incorporar al script actual. Mediante estas instrucciones se incluye
un fichero en el punto en el que se importa. La diferencia es que require() lanza un
error fatal en el caso de no encontrar el fichero mientras que include() no lo hace.
Ejempo 3.3.10. La inclusión de bibliotecas se suele poner al principio para que estén
disponibles en el resto del código.
<?php
include("config.php");
include("utils.php");
$radio = 5;
$circunferencia = 2 * radio * PI;
$area = PI * cuadrado($radio);
echo "Un círculo de rádio $radio tiene circunferencia ";
echo "$circunferencia y área $area.<br>";
$area = -8;
if (es_positivo($area)) {
$radio = raiz(area / PI);
Hay que tener en cuenta el orden en el que se cargan los archivos externos, sobre todo
si unos hacen uso de código de otros.
Hasta ahora hemos visto las funciones que nosotros definimos. Pero a lo largo de
muchos ejemplos hemos ido usando funciones como rand() o number_format() que ya
estaban disponibles en el lenguaje. Estas son funciones del núcleo de PHP y por lo
tanto no hace falta hacer un include() para poder usarlas.
Extensiones de PHP
Ejemplo 3.3.11. Para saber que extensiones están instaladas en nuestro interprete de
PHP tenemos una opción muy útil, la función phpinfo() que genera una página con la
información del intérprete que tenemos instalado.
<?php
phpinfo();?>
Toda la referencia sobre funciones se puede encontrar en la página oficial sobre PHP:
http://es.php.net/manual/es/funcref.php
Hay una gran multitud de funciones en PHP de las cuales probablemente usaremos
U.D.4. Formularios
Hasta este momento todas las páginas que hemos visto a través de ejemplos tenían un
defecto, no eran interactivas. Hacían operaciones en función de los datos de los que ya
disponían pero eran incapaces de recibir datos del navegador.
Una de las formas más habituales de recibir datos por parte de una página web
dinámica es a través de formularios web. Estrictamente hablando los formularios no
son parte del lenguaje PHP sino del lenguaje HTML. Pero para recibir los datos de un
formulario en HTML hace falta por lo general una página dinámica que los procese.
Hay que tener en cuenta que además de formularios HTML hay otras tecnologías que
permiten el envío de datos a páginas web, com Flash u otras páginas web dinámicas.
Formularios HTML
Los formularios pueden llegar a ser muy complejos, con una gran cantidad de campos
de entrada, validación de datos por Javascript, campos ocultos... Pero el objetivo del
curso no es explicar su funcionamiento, así que se hará un repaso muy superficial.
Un formulario está formado por tres tipos de elementos: Etiquetas de comienzo y final,
campos de entrada de datos y botones para realizar acciones.
Campos
Una vez declarado el formulario hemos de poner un campo para cada uno de los datos
que queremos recibir. Hay 6 tipos de campos:
• Selección única - Se usa para elegir una opción entre varias. Las opciones
que son excluyentes entre sí han de tener el mismo nombre.
<select name="sexo">
<option>hombre</option>
<option>mujer</option>
</select>
• Área de texto - Sirve para poder recibir textos largos compuestos por varias
líneas.
<textarea name="opinion"></textarea>
En todos ellos es importante poner el atributo name que es el nombre de variable con
el cual vamos a recibir los datos. El atributo value es opcional e indica el valor
predefinido que se les da.
Botones
Todos los formularios han de tener un botón para enviar los datos una vez que se han
rellenado.
También se suele incluir un botón para limpiar los campos del formulario.
<html>
<head>
<title></title>
</head>
<body>
<form name="encuesta" method="get" action="verificar.php">
NOMBRE <input type="text" name="nombre" size="43"><br>
<br>
NIVEL DE INTERNET<br>
Recibir los datos no puede ser más sencillo. El script de destino tendrá definida un
variable por cada campo con el mismo nombre que se le haya dado en el formulario. Y
esta variable contendrá el valor que se haya introducido en el campo. Esta variable ya
está disponible desde el comienzo del script, no hay que hacer nada especial, sólo leer
su contenido.
Ejemplo 3.4.2. Esta página PHP recibe los datos de la encuesta y los muestra. Para
que funcione hay que guardarla con el nombre verificar.php , que es el que aparecía en
el atributo action del formulario.
<?php
echo "Comprueba si tus datos son correctos.<br>";
echo "<br>";
echo "$nombre.<br>";
echo "Nivel de internet $nivel.<br>";
Ejemplo 3.4.3. Los parametros que nos han llegado se encuentran almacenados en un
array asociativo con nombre de variable $_REQUEST. Podemos ver su contenido
usando la función print_r() que se vió en la unidad didáctica anterior. Esto nos ofrece
otra forma de acceder a los datos recibidos, que es más explícita y por lo tanto hace el
código más legible.
<pre>
<?phpprint_r($_REQUEST);
?>
</pre>
Ejemplo 3.4.4. El ejemplo 3.4.3. Podría haber sido escrito también de la siguiente
forma (se muestran sólo las primeras líneas, un buen ejercicio sería completarlas).
<?php
echo "Comprueba si tus datos son correctos.<br>";
echo "<br>";
echo "{$_REQUEST["nombre"]}.<br>";
echo "Nivel de internet {$_REQUEST["nivel"]}.<br>";//...
?>
Ejemplo 3.4.5. Esta página web une el formulario de entrada de datos y la recepción
de los mismos. El atributo action de la etiqueta form ha de ser el mismo que el nombre
de la página. Para ello usamos la variable predefinida $PHP_SELF que contiene el
nombre de archivo de la misma página. Podemos guardar este archivo con el nombre
juegoppt.php.
<?php
$opciones = array("piedra", "papel", "tijeras");
if ($jugada != "") {
$mijugada = $opciones[rand(0, 2)];
if ($jugada == $mijugada) {
$resultado = "Empates.";
} else if (($jugada == "piedra" && $mijugada == "tijeras")
|| ($jugada == "tijeras" && $mijugada == "papel")
|| ($jugada == "papel" && $mijugada == "piedra")) {
$resultado = "Tu ganas.";
} else {
$resultado = "Gano yo.";
}
}
?>
<html>
<head>
<title>Piedra, papel o tijera</title>
</head>
<body>
<?php
if ($jugada != "") {
?>
Has elegido <?= $jugada ?>, yo he elegido <?= $mijugada ?>.
<?= $resultado ?><br>
¿Quieres jugar otra vez?<br>
<?php
}
?>
<form "juego" method="post" action="<?= $PHP_SELF ?>">
Piedra<input type="radio" name="jugada" value="piedra">
Papel<input type="radio" name="jugada" value="papel">
Tijera<input type="radio" name="jugada" value="tijeras">
<input type="submit" value="Jugar">
</form>
</body>
</head>
El código que se incluye al principio solo se ejecuta si el dato $jugada no llega vació, es
decir, cuando se le ha dado al menos una vez al botón de enviar.
En ocasiones se necesita que un programa PHP reciba datos y haga una operación
"silenciosa" con los mismos. Es decir, que no sea necesario que se muestre una página
al navegador sino que se vuelva a la inicial. Esto se puede hacer con un formulario que
envía recibe y procesa datos.
Una alternativa es hacer una página que procese los datos y que al terminar se redirija
automáticamente a otra. Para poder hacerlo PHP nos ofrece la función header(), que
se usa de la siguiente forma.
header("location:url ")
• visita.html
<html>
<head> <title>Libro de visitas</title>
</head>
<body><form name="visita" method="post" action="insertar.php">
Nombre: <input type="text" name="nombre" size="44"><br>
Comentario:<br>
<textarea name="comentario" cols="40" rows="5"></textarea><br>
<input type="submit" value="Enviar">
</form></body>
</html>
• insertar.php
<?php
// Aquí vendría el código para guardar en la base de
datosheader("location:gracias.html"); //Redirección
?>
• gracias.html
<html>
<head> <title>Gracias</title>
</head>
<body>
Su comentario ha sido registrado en el libro de visitas.<br>
Gracias por su participación.
</body>
</html>
Ejemplo 3.4.7. Un uso habitual de la redirección es para redirigir hacia una página de
error en el caso de que haya fallos en los datos. En este ejemplo se pide una dirección
de correo electrónico, se valida y si es incorrecta se reenvía a una página de error.
• suscripcion.html
<html>
<head> <title>Suscripción al boletín electrónico</title>
</head>
<body>
Bienvenido al servicio de suscripción.<br>
Por favor, introduzca una dirección de email válida.<br><form
• guardar.php
• confirmacion.html
<html>
<head> <title>Confirmacion</title>
</head>
<body>
Su suscripción ha sido registrada.</br>
Gracias por su interés.
</body>
</html>
• error.html
<html>
<head> <title>Error</title>
</head>
<body>
Introdujo una dirección de correo no válida.<br>
Por favor vuelva a solicitar la suscripción.
Manejo de ficheros
Abrir
Para acceder a un archivo primero es necesario abrirlo. Para ello usaremos la función
fopen() que tiene dos argumentos, el nombre del archivo a acceder y el modo de
acceder a este.
Modo Descripción
Cerrar
Mientras hacemos operaciones con el archivo este lo hemos de mantener abierto pero
al terminar de trabajar con él hay que cerrarlo para que el sistema operativo pueda
disponer de él (mientras está abierto el sistema operativo lo bloquea para que no
puedan escribir en él dos programas y destruir mutuamente lo que escriben).
Para cerrar un archivo abierto se usa la función fclose() pasándole como parámetro la
variable que contiene el manejador del archivo.
fclose(archivo )
<?php$ruta = "utils.php";
$archivo = fopen($ruta, "r");
if ($archivo) {
print "Archivo $ruta abierto para lectura.";
} else {
print "No se pudo abrir el archivo: $ruta.";
}
fclose($archivo);
?>
Ejemplo 3.5.2. El fichero que abrimos lo podemos localizar mediante una ruta absoluta
o relativa. Aunque en Windows las rutas se construyan usando la contrabarra " \ " PHP
admite que se separen los directorios con la barra normal " / " como en Linux. Esta es
la forma que elegiremos ya que las rutas relativas que contruyamos de esta forma
serán válidas tanto si instalamos nuestra aplicación en Linux como en Windows.
<?php
$ruta_absoluta = "c:/CursoPHP/xampplite/htdocs/index.php";
$ruta_relativa = "../practicasPHP/config.php";
$archivo1 = fopen($ruta_absoluta, "r");
$archivo2 = fopen($ruta_relativa, "r");
fclose($archivo1);
fclose($archivo2);
?>
Ejemplo 3.5.3. Es incluso posible abrir archivos que estén alojados en otros servidores,
aunque lo más habitual es que solo tengamos permisos de lectura.
Leer
Lo más habitual es que queramos leer el archivo. PHP ofrece muchas formas de
hacerlo. Una de las más sencillas es mediante la función fread() que lee un número de
caracteres de un archivo. En conjunción con la función filesize() que nos devuelve el
tamaño del archivo en bytes se puede usar para leer todo el archivo.
fread(archivo, tamaño )
Ejemplo 3.5.4. Lectura del archivo prueba.txt . Para que el archivo funcione tendremos
que haberlo creado antes y copiado en la misma carpeta que este script.
<pre>
<?php
$archivo = fopen("prueba.txt", "r");
$tamano = filesize("prueba.txt");$texto = fread($archivo, $tamano);
echo $texto;fclose($archivo);
?>
</pre>
Escribir
Otra acción que querremos hacer habitualmente es añadir datos a un archivo. Para ello
se usa una función muy sencilla, fwrite() que escribe en la posición en la que está el
apuntador (normalmente, si hemos abierto el archivo en modo "a" escribiremos al final
del archivo).
Ejemplo 3.5.5. En este ejemplo se usa esta función dos veces para escribir dos
frases en el archivo.
<?php
$archivo = fopen("refranes.txt", "a");fwrite($archivo, "Si las barbas de tu
vecino ves cortar ...\r\n");
fwrite($archivo, "...pon las tuyas a remojar \r\n");fclose($archivo);
?>
La cadena " \r\n " sirve para insertar un salto de línea en el archivo en el sistema
operativo Windows. En Linux se usa solo la cadena " \n ".
Crear un fichero
Si queremos crear un archivo bastará que lo abramos con el modo "a" o "w". Al abrirlo,
Eliminar un fichero
La función unlink() que recibe como parámetro una ruta a un fichero lo borra. En el
caso de que no lo haya conseguido (por no tener permisos o sencillamente porque no
existe el archivo) devuelve FALSE.
unlink(archivo )
<?phpif (!unlink("prueba.txt")) {
echo "No se ha podido borrar el archivo.";
}?>
Atributos de un fichero
Para manejar de forma segura es conveniente que conozcamos sus atributos. Por
ejemplo, antes de abrir un archivo para escritura convendría comprobar si tenemos
permisos de lectura. Las siguientes funciones nos ayudarán en esta tarea.
file_exists()
file_size()
is_file()
is_dir()
is_readable()
is_writeable()
Ejemplo 3.5.7. Mediante este programa se muestran las propiedades del archivo
prueba.txt.
<?php
$ruta = "prueba.txt";if (file_exists($ruta)) {
echo "$ruta tiene un tamaño de ";
echofilesize($ruta) . " bytes.<br>";
if (is_file($ruta)) { echo "$ruta es un fichero.<br>";
}
if (is_dir($ruta)) {
echo "$ruta es un directorio.<br>";
} if (is_readable($ruta)) {
echo "$ruta se puede abrir para lectura.<br>";
}
if (is_writable($ruta)) {
echo "$ruta se puede abrir para escritura.<br>";
}} else {
echo "$ruta no existe.";}?>
Manejo de directorios
PHP ofrece muchas funciones para manejar directorios, pero lo más probable es que
en la mayoría de los casos lo único que nos interese de un directorio es conocer los
archivos que tiene. Una vez que conozcamos este dato podremos construir rutas
relativas a sus subdirectorios y a su vez listarlos y así de forma sucesiva.
Abrir un directorio
De forma similar a com sucedía con los archivos, antes de trabajar con un directorio lo
tendremos que abrir. Nos serviremos de la función opendir() que devuelve un
manejador del directorio.
opendir(ruta al directorio )
Para conocer los ficheros y subdirectorios que contiene un directorio se usa la función
readdir() . Por cada vez que llamemos a esta función nos devolverá el nombre de cada
archivo encontrado o FALSE si no quedan más archivos en el directorio.
readdir(directorio )
Ejemplo 3.5.8. Aquí se puede ver como listar todos los contenidos del directorio actual
(referenciado mediante la ruta relativa " . ") indicando a su vez si son ficheros o
directorios.
<?php
$directorio = opendir(".");
while ($archivo = readdir($directorio)) {
if (is_file($archivo)) {
echo "$archivo es un fichero.<br>";
}
if (is_dir($archivo)) {
echo "$archivo es un directorio.<br>";
}
}?>
El envío de archivos desde el cliente, es una de las posibilidades más atractivas para
una aplicación web. Se subir de esta forma fotos, un curriculum, un documento PDF,
etc..
• subir.html
<html>
<head>
<title>Elija el archivo a subir</title>
</head>
<body>
<form name="subir" method="post" action="guardar.php"
enctype="multipart/form-data">
Archivo a subir <input type="file" name="miarchivo"><br>
<input type="submit" value="Subir el archivo">
</form>
</body>
</html>
Además de este formulario necesitaremos una página dinámica en PHP que reciba el
archivo y lo guarde en el disco duro. Esto se hace en 3 pasos:
• guardar.php
<?php
$temporal = $_FILES["miarchivo"]["tmp_name"];
$destino = "uploads/" . $_FILES["miarchivo"]["name"];
if (move_uploaded_file($temporal, $destino)) {
echo "Archivo subido con éxito";
} else {
echo "Ocurrió un error, no se ha podido subir el archivo";
}?>
Hay que tener cuidado, en este script se supone que el directorio uploads ya existe. Si
no es así la operación fallaría.
En lo que llevamos de curso hemos estudiado a fondo la primera parte, los algoritmos
para resolver problemas. Pero conocemos poco sobre la segunda parte, los datos.
Pero para hacerlo necesita un respaldo potente como almacen de información. Hasta
ahora el único mecanismo que hemos visto para guardar datos de forma permanente
es escribir y leer en ficheros alojados en el servidor. Esto, para grandes cantidades de
información es inviable. Es preferible delegar esta función a software especializado, los
sistemas de gestión de bases de datos (o sencillamente, bases de datos).
Al añadir bases de datos a una aplicación web se amplía el esquema que interviene en
la generación de una página web con un nuevo elemento.
El sistema gestor de bases de datos puede estar instalado en el mismo equipo que el
servidor web o en uno diferente. En nuestro entorno (suponiendo que estemos usando
Xampp), tenemos el servidor Apache y la base de datos MySQL en el mismo
ordenador.
MySQL
MySQL es una base de datos relacional y destaca por las siguientes características.
Para poder acceder a la consola de MySQL es necesario seguir los siguientes pasos,
suponiendo que hayamos instalado el paquete Xampp en Windows.
2. Una vez arrancado Xampp ejecutaremos el comando mysql -u root . Esto se puede
hacer en Windows desde Inicio --> Ejecutar o desde MS-DOS (símbolo de sistema).
La consola es igual tanto en Windows como en Linux, por lo que una vez dentro no se
apreciarán diferencias.
Sintaxis de SQL
Antes de poder almacenar datos hemos de crear una estructura que los pueda
contener.
MySQL es un sistema gestor de bases de datos, que puede gestionarmás de una base
de datos independiente. Por lo tanto lo primero que debemos hacer es crear nuestra
base de datos personal que utilizaremos durante las pruebas. Para ello se usa la
Antes de poder trabajar con la base de datos hemos de seleccionarla. Para ello
usaremos el comando USE.
USE nombre_base_datos ;
Ejemplo 4.3.2. A partir de ahora todas las sentencias SQL se harán sobre la base de
datos curso_php .
Creación de tablas
Las bases de datos almacenan la información en tablas, que son el pilar fundamental
de las bases de datos relacionales. La instrucción SQL que se utiliza para crear una
tabla es CREATE TABLE.
La definción de la tabla está compuesta por una lista de sus campos (columnas). Los
campos
La definición de cada campo, salvo del último, debe termninar en coma. Cada campo
solo puede almacenar un tipo de datos, de momento nos bastará con conocer los
siguientes:
Los atributos de un campo estarán vacíos en la mayoría de los casos. Aunque hay una
excepción. en casi todas las tablas se suele poner un campo id que contenga un
identificador único de cada registro. A este campo se le dan los atributos:
Ejemplo 4.3.3. En este ejemplo se ve la creación de una tabla con datos sobre los
empleados de una empresa.
Los campos que se han definido en la tabla tiene las siguientes características:
• id - Campo de tipo entero que identifica de forma única un registro. Cada vez
que se añade un registro se incrementa automáticamente.
• nombre - Campo que puede almacenar una cadena de hasta 50 caracteres,
destinado a guardar el nombre. No tiene atributos.
• puesto - Campo que puede almacenar una cadena de hasta 20 caracteres,
destinado a guardar el puesto que desempeña. No tiene atributos.
• fecha_nacimiento - Almacena la fecha de nacimiento en formato
YYYY-MM-DD (4 cifras para el año, guión, 2 cifras para el mes, guión, 2
cifras apra el día). No tiene atributos.
• salario - Campo de tipo entero que guarda el sueldo en euros del empleado.
No tiene atributos.
Para ejecutar esta sentencia SQL podemos copiarla y pegarla en la consola de MySQL.
Listar tablas
Para ver todas las tablas que hay disponibles en una base de datos se usa la
instrucción SHOW TABLES.
SHOW TABLES;
Ejemplo 4.3.4. Al listar las tablas de la base de datos comprobamos que solo hay una,
la que acabamos de crear.
DESCRIBE nombre_tabla ;
Borrar tablas
Para borrar una tabla se usa la sentencia SQL DROP DATABASE. Hay que tener
mucho cuidado ya que al borrar una tabla borramos de forma irrecuperable todos los
datos que hubieramos introducido.
Ejemplo 4.3.6. Vamos a eliminar la tabla empleados . Todos los datos que contenga se
borrarán.
Ejemplo 4.3.7. Nuestra base de datos curso_php quedará definida así en el fichero
curso_php.sql .
Una vez guardado el script, para ejecutarlo lo haremos con el comando SOURCE:
Ya tenemos la estructura que va a dar soporte a los datos, ahora nos falta saber como
podemos añadirlos, consultarlos, modificarlos y eliminarlos.
Las tablas que hemos creado están vacías, y así sirven de poco. Son como un
armazón, pero para que la base de datos sea útil hemos de introducir datos.
Ejemplo 4.3.8. Vamos a insertar un primer dato en la tabla empleados. Al igual que en
PHP los datos que son cadenas de texto los ponemos entre comillas, al igual que la
fecha. El campo id no hace falta insertarlo ya que lo hemos definido como
autoincremental.
Ejemplo 4.3.9. Se pueden insertar varios registros (filas) en una tabla con una
sentencia insert, separando los conjuntos de valores entre paréntesis por comas.
Aquí es donde se despliega la potencia de SQL, que además tiene una sintaxis muy
fácil de comprender. Los datos se leen de la tabla a través de consultas, que son como
preguntas que le hacemos a la base de datos.
Ejemplo 4.3.13. Esta consulta devuelve todos los datos de los empleados cuyo salario
es mayor de 1400 euros.
Se pueden unir varias condiciones mediante los operadores lógicos AND, OR y NOT
(cuyo funcionamiento es muy similar a PHP). Se pueden usar paréntesis si se tienen
dudas sobre las reglas de precedencia.
Ejemplo 4.3.14. Empleados que cobran más de 1400 euros y que nacieron antes de
1975.
Ejemplo 4.3.16. Búsqueda textual. En ocasiones se quiere buscar los registros cuyo
texto contiene otro. Para ello, en lugar de comparar con el operador igual " = " se usa el
operdor LIKE y la cadena son la que se compara se pone entre comillas y signos de
porcentaje "%cadena %". Esta consulta muestra los registros cuyo nombre contiene la
cadena "an".
En muchas ocasiones querremos que los datos devueltos nos lleguen devueltos. Para
ello usaremos con el SELECT la clausula ORDER BY a la que le acompaña el campo
por el que queremos ordenar. En el caso de que haya una clausula WHERE, ORDER
BY ha de ir detras necesariamente. La sintaxis nueva queda de la siguiente forma.
Ejemplo 4.3.17. Aquí se muestran todos los registros de la tabla ordenados por el
nombre del empleado en orden alfabético.
Actualizar datos
Ejemplo 4.3.19. Vamos a usar la sentencia UPDATE para subir el sueldo al empleado
Ana. Como la tabla tien un campo id es por este por el que filtraremos. Al final se hace
un SELECT para comprobar que la tabla se ha actualizado.
Para el borrado de datos de una tabla se usa la sentencia DELETE. Se suele usar en
combinación con una condición que filtra los datos a borrar, si se usara sola borraría
todos los datos de la tabla. Su uso tiene cierta similitud con el de SELECT, con la
diferencia de que no hay que indicar campos ya que se borra toda la fila.
Ejemplo 4.3.21. Borrado del empleado Juan. Una vez más se selecciona por el id .
Ejemplo 4.3.22. Al usar la sentencia DELETE sin filtrar se están borrando todos los
datos de la tabla (pero no su definición). Luego al hacer el SELECT el mensaje Empty
set nos indica que la tabla está vacía.
Las definiciones de bases de datos y tablas las haremos desde la consola de MySQL
(preferiblemente a través de un script SQL con las sentencias de creación e
inicialización de tablas). La manipulación de datos en cambio se hará desde PHP. Las
operaciones que nos interesan son, por lo tanto:
• Leer datos.
• Añadir datos.
• Modificar datos.
• Eliminar datos.
PHP accede a MySQL a través del API. Dispone de una extensión (biblioteca de
funciones) con muchas funciones para acceder a la base de datos.
Antes de empezar a consultar información tenemos que conectar con el sistema gestor
de bases de datos y declarar la base de datos que vamos a usar. Esto se deberá hacer
en cualquier script que posteriormente quiera leer, añadir, modificar o eliminar datos.
mysql_connect()
Esta función devuelve una referencia a la base de datos que guardaremos en una
variable para usarla en posteriores funciones de PHP con MySQL.
mysql_select_db()
mysql_select_db(nombre_base_datos , referencia_bd )
Ejemplo 4.4.1. Los ejemplos de esta unidad didáctica usaran la base de datos creada
en la unidad didáctica anterior llamada curso_php con la tabla empleados y con los
cuatro registros creados.
Ejemplo 4.4.2. Una buena idea es guardar el proceso de conexión a la base de datos y
luego utilizarlo en nuestros scripts mediante un include() . Aquí se ha creado el fichero
conectar_bd.php.
<?php
DEFINE(DB_HOST, "localhost");
DEFINE(DB_USER, "root");
DEFINE(DB_PASSWORD, "");
DEFINE(DB_NAME, "curso_php");$con = @mysql_connect(DB_HOST,
DB_USER, DB_PASSWORD);
if (!$con || !mysql_select_db("curso_php", $con)) {
die("Error conectando a la BD: " . mysql_error());
}?>
<?php
include("conectar_bd.php");
echo "Establecida la conexión a la base de datos";
?>
Leer datos
Aquí nos encontramos con la función clave de este capítulo. Se trata de la función
mysql_query() . Su potencia es enorme ya que permite enviar una instrucción SQL,
como las vistas en el capítulo anterior, a la base de datos. Para leer datos la sentencia
que usaremos será obviamente un SELECT.
mysql_query()
mysql_query(sentencia_SQL , referencia_bd )
Hay que tener en cuenta que esta función solo ejecuta la sentencia, no muestra ningún
dato. Por ello devuelve un identificador del resultado que se usa en otras funciones
para visualizar los valores devueltos por la consulta.
<?php
include("conectar_bd.php");$res = mysql_query("SELECT * FROM
empleados", $con);
?>
<?php
include("conectar_bd.php");$sql = "SELECT * FROM empleados";
$res = mysql_query($sql, $con);
?>
mysql_num_rows()
Antes de acceder al resultado nos interesa saber cuantos registros se han obtenido.
Concretamente una consulta podría no devolver ningún resultado y esto podría causar
un error en nuestro código.
Esta función nos dará el número de filas que tiene un resultado obtenido de una
consulta de tipo select (y sólamente de este tipo, las consultas de
inserción/borrado/actualización tienen otra función, mysql_affected_rows).
mysql_num_rows(identificador_de_resultado )
mysql_result()
<?php
include("conectar_bd.php");$sql = "SELECT nombre FROM empleados";
$res = mysql_query($sql, $con);
$filas = mysql_num_rows($res);
for ($i = 0; $i < $filas; $i++) {
$nombre = mysql_result($res, $i, "nombre");
echo "$nombre<br>";
}?>
Ejemplo 4.4.6. Aquí se pone junto todo lo que hemos visto hasta ahora y se muestra
la tabla empleados dentro de una tabla HTML.
<?php
include("conectar_bd.php");
?>
<table border="1">
<tr>
<td>id</td>
<td>nombre</td>
<td>puesto</td>
<td>fecha_nacimiento</td>
<td>salario</td>
</tr>
<?php include("conectar_bd.php");
$filas = mysql_num_rows($res);
for ($i = 0; $i < $filas; $i++) {
echo "<tr>"; $id = mysql_result($res, $i, "id");
echo "<td>$id</td>";
$nombre = mysql_result($res, $i, "nombre");
echo "<td>$nombre</td>";
$puesto = mysql_result($res, $i, "puesto");
echo "<td>$puesto</td>";
$f_nacimiento = mysql_result($res, $i, "fecha_nacimiento");
echo "<td>$f_nacimiento</td>";
$salario = mysql_result($res, $i, "salario");
echo "<td>$salario</td>";
echo "</tr>";
}
?></table>
Ejemplo 4.4.7. Con un pequeño cambio en la sentencia SQL mostraremos las filas
ordenadas por el nombre.
Ejemplo 4.4.8. Y con solo otro pequeño cambio obtenemos un resultado filtrado.
Ejemplo 4.4.9. Con el sistema que hemos seguido que consiste en separar la
sentencia SQL veamos lo fácil que resulta parametrizar un parámetro de búsqueda.
$salario = 1250;
$sql = "SELECT * FROM empleados WHERE salario > $salario";
mysql_fetch_array()
Cada vez que se llama a esta función recupera una de las filas resultado de la consulta,
hasta que no queda ninguna. entonces devuelve FALSE.
mysql_fetch_array(identificador_de_resultado )
Ejemplo 4.4.10. Mediante esta función se puede conseguir un código más compacto, y
que para algunos será más legible. Como cada llamada a la función recupera una fila y
pasa a la siguiente no es necesario recuperar mediante mysql_num_rows() el número
de filas que contiene el resultado. Este código es equivalente al del ejercicio 4.4.6.
<?php
include("conectar_bd.php");
?>
<table border="1">
<tr>
<td>id</td>
<td>nombre</td>
<td>puesto</td>
<td>fecha_nacimiento</td>
<td>salario</td>
</tr>
<?php
$sql = "SELECT * FROM empleados";
$res = mysql_query($sql, $con);
$fila = mysql_fetch_array($res);
while($fila) {
echo "<tr>";
echo "<td>{$fila["id"]}</td>";
echo "<td>{$fila["nombre"]}</td>";
echo "<td>{$fila["puesto"]}</td>";
echo "<td>{$fila["fecha_nacimiento"]}</td>";
echo "<td>{$fila["salario"]}</td>";
echo "</tr>";
$fila = mysql_fetch_array($res);
}
?>
</table>
Añadir datos
añada datos.
Ejemplo 4.4.11. Vamos a añadir un nuevo empleado. Para ello se usará la sentencia
SQL "parametrizada", como si se hubiesen recibido los datos de un formulario y se
quisieran guardar en la base de datos. Como la consulta es muy larga se ha troceado
en varias líneas usando el operador concatenar cadena " . ".
<?php
include("conectar_bd.php");
$nombre = "Paola";
$puesto = "Programador";
$fecha_nacimiento = "1958-01-23";
$salario = 1800;
Modificar datos
Una vez más usamos la función mysql_query() , con una sentencia SQL del tipo
UPDATE.
Ejemplo 4.4.12. Vamoa a modificar los datos del empleado que ñadimos en la
consulta anterior.
<?php
include("conectar_bd.php");
Eliminar datos
En esta ocasión usamos la función mysql_query() , con una sentencia SQL del tipo
DELETE.
Ejemplo 4.4.13. Vamos a modificar los datos del empleado que ñadimos en la
consulta anterior.
<?php
include("conectar_bd.php");
$id = 5; //Id del registro a borrar$sql = "DELETE
FROM empleados WHERE id = $id";$res = mysql_query($sql, $con);
?>
El concepto de timestamp procede del mundo Unix/Linux. A nivel interno, PHP guarda
las fechas como un número entero que corresponde con el nº de segundos que han
pasado desde una fecha de referencia, concretamente el 1 de enero de 1970. A este
formato para almacenar una fecha se le llama timestamp .
Ejemplo 5.1.1. Las dos fechas que se muestran a continuación son la misma, solo que
la segunda está en formato timestamp .
Ejemplo 5.1.2. El timestamp tiene la ventaja para PHP de que, al ser un número
entero, es fácil operar con él. Es sencillo sumar, restar o comparar dos fechas. Siempre
que queramos hacer este tipo de operaciones las hemos de hacer en formato
timestamp .
mktime()
Esta función permite crear una marca timestamp para una fecha y hora dados.
Ejemplo 5.1.3. En este ejemplo se usa la función strftime() para ver la fecha en modo
texto. Su funcionamiento se explica más adelante.
<?php
$fecha = mktime(14, 30, 0, 12, 25, 2005);
strftime("%c", $fecha);
?>
<?php
$fecha = mktime();
strftime("%d/%m/%Y %H:%M:%S", $fecha);
?>
getDate()
Esta función recibe una fecha en formato timestamp y devuelve un array asociativo con
todos los datos de esa fecha.
getDate(timestamp )
<pre>
<?php
$fecha = mktime(); //timestamp del momento actual
$datos_fecha = getDate($fecha);print_r($datos_fecha);
?>
</pre>
Ejemplo 5.1.6. Podemos concatenar los campos de un array asociativo para dar
formato a una fecha.
<?php
$fecha = mktime(); //timestamp del momento actual
$datos_fecha = getDate($fecha);
echo "Hoy es ";
echo$datos_fecha["mday"] . "/" . $datos_fecha["mon"] . "/"
. $datos_fecha["year"] . ".<br>";
echo "Son las ";
echo $datos_fecha["hours"] . ":" . $datos_fecha["minutes"] . ":"
. $datos_fecha["seconds"] . ".<br>";?>
strftime()
Esta función se usa para dar formato a las fechas de forma sencilla.
strftime(formato, timestamp )
Ejemplo 5.1.7. Este código produce el mismo resultado que el del ejemplo 5.1.6. pero
es mucho más conciso y legible.
<?php
$fecha = mktime(); //timestamp del momento actual
echo strftime("Hoy es %d/%m/%Y", $fecha) . ".<br>";
echo strftime("Son las %H:%M:%S", $fecha) . ".<br>";
?>
<?php
$fecha = mktime(); //timestamp del momento actualecho
strftime("%d/%m/%Y %H:%M:%S", $fecha) . ".<br>";
Esta función tiene la ventaja adicional de que nos puede dar la fecha en castellano
(lunes en lugar de monday). Para ello antes hay que informar al servidor de cual es el
idioma que deseamos.
setlocale()
Si se incluye esta función antes de llamar a strftime() se establece que todas las fechas
se darán ahora en el idioma elegido.
strftime(LC_TIME, idioma )
Ejemplo 5.1.9. Vamos a usar esta función para mostrar los resultados del ejemplo
anterior pero esta vez en castellano. La cadena que identifica al idioma castellano es
"esp" en Windows.
<?php
$fecha = mktime(); //timestamp del momento actual
setlocale(LC_TIME ,"esp");
Validación de fechas
checkdate()
Ejemplo 5.1.10. No hay un 31 de abril. Y 29 de febrero solo en los años que son
bisiestos.
<?php
$dia = 31;
$mes = 4;$anyo = 2005;
if (checkdate($mes, $dia, $anyo)) { echo "El $dia/$mes/$anyo es una
fecha válida.<br>";
} else { echo "El $dia/$mes/$anyo no existe.<br>";
}$dia = 29;
$mes = 2;
$anyo = 2005;if (checkdate($mes, $dia, $anyo)) {
echo "El $dia/$mes/$anyo es una fecha válida.<br>";
} else { echo "El $dia/$mes/$anyo no existe.<br>";
}
$dia = 29;
$mes = 2;
$anyo = 2004;
if (checkdate($mes, $dia, $anyo)) {
echo "El $dia/$mes/$anyo es una fecha válida.<br>";
} else { echo "El $dia/$mes/$anyo no existe.<br>";
}?>
ini_set("SMTP", nombre_servidor_SMTP )
ini_set("sendmail_from", dirección_email )
<?php
ini_set("SMTP", "smtp.pernambuco.com");
Si bien configurar el servidor de correo electrónico puede ser complicado, una vez
hecho el envío de emails no puede ser más sencillo.
mail()
La función mail() tiene sólo tres parámetros. La dirección de correo del destinatario, el
asunto del correo y el contenido del mismo.
Para crear saltos de línea en el cuerpo del mensaje se utiliza la cadena "\n\r" que
simboliza un salto de línea en Windows.
Ejemplo 5.2.2. Para probar este script se puede poner como dirección de destino la de
una cuenta a la que tengamos acceso. El mansaje, al ser muy largo, se ha escrito en
varias líneas usando el operador concatenar " . ".
<?php
include("email_config.php");
?>
Ejemplo 5.2.3. En la forma anterior no nos resulta muy útil. Sería mejor si añadieramos
un formulario para elegir el destinatario, el asunto y redactar el correo.
• mail_form.html
<html>
<head>
<title>Enviar correo electrónico</title>
</head>
<body>
<form name="mail_form" method="post" action="enviar_mail.php">
Destinatario:<br>
<input type="text" name="destinatario" size="53"></br>
Asunto:<br>
<input type="text" name="asunto" size="53"></br>
Mensaje:<br>
<textarea name="mensaje" rows="5" cols="40"></textarea></br>
<input type="submit" value="Enviar correo"></br>
</form>
</body>
</html>
• enviar_mail.php
<?php
include("email_config.php");
U.D.3. Sesiones
Las sesiones se usan siempre que haya que dar servicios personalizados o de
identificación. El protocolo HTTP es un protocolo sin estado. Esto significa que no hay
manera de que un servidor web sepa qué estámos haciendo mientras navegamos por
un sitio web, a no ser que pueda identificar/marcar al cliente (el navegante) de algún
modo, para que, posteriores peticiones de este nos digan quién es.
Por supuesto, con una página dinámica en PHP podemos guardar información en algún
sitio (un fichero, una base de datos), pero las aplicaciones web no se componen de una
sola página sino de varias, así que necesitaremos de algún mecanismo que nos facilite
el almacenaje de datos temporales relativos a una navegación (llamada sesión).
session_start()
Esta función se usa para iniciar una sesión. Basta con incluirla al principio
de cada página que vaya a usar sesiones. Eso sí, debe ir antes de cualquier código
HTML, si no es así dará error.
Ejemplo 5.3.1. El primer código es correcto mientras que si probamos el segundo nos
dará un error. Este es un motivo adicional por el que es recomendable acostumbrarse a
poner el código PHP al principio de la página web.
<?php
//Lo primero que se hace es crear la sesión
session_start();
?>
<html>
<head>
<title>Esta página es correcta</title>
</head>
//...
<html>
<head>
<title>Esta página da error</title>
</head>
<?php
//Esto dará error ya que hay código HTML antessession_start();
?>
//...
session_id()
Todas las sesiones tienen un número que las identifica de forma única. En ocasiones
puede ser útil conocerlo y para eso se usa esta función.
session_destroy()
Mediante esta función se destruyen todos los datos que pudiera tener asociada la
sesión actual. En la página de salida es conveniente poner una llamada explícita a esta
función. Si se la llama se destruye la sesión y todos los datos asociada.
• iniciar_sesion.php
<?php
session_start();
?>
Sesión iniciada con id <?= session_id() ?>.<br>
<a href="sesion_activa.php">Seguir</a>
• sesion_activa.php
<?php
session_start();
?>
Sesión activa con id <?= session_id() ?>.<br>
<a href="finalizar_sesion.php">Salir</a>
• finalizar_sesion.php
<?php
session_start();
?>
Destruidos los datos asociados a la sesión <?= session_id() ?>.
<?php
session_destroy();
?>
Aunque es conveniente llamarla para destruir la sesión cuando haya dejado de ser útil
lo habitual es que los usuarios de Internet abandonen nuestra página web cerrando el
navegador y por lo tanto no tendremos ocasión de saber que la sesión ha dejado de ser
necesaria.
Afortunadamente el servidor web dispone de mecanismos para eliminar una sesión sin
nuestra intervención poniéndoles un tiempo de caducidad.
Variables de sesión
Una de las características que nos aportan las sesiónes es parala posibilidad de dar
persistencia a ciertos datos a través de diferentes páginas.
En las versiones actuales de PHP esto es muy sencillo ya que se usa el array global
$_SESSION. Este es un array asociativo (parejas de nombre -> valor), que está
disponible en todas las páginas a partir del momento que se haya iniciado la sesión con
session_start() . A este array le podemos añadir elementos o modificarlos de la forma
que ya conocemos.
Las variables que queremos que estén disponibles en todas las páginas las
guardaremos en este array.
Ejemplo 5.3.3. Aquí se modifica el ejemplo anterior para, al iniciar la sesión, añadirle la
fecha y hora de comienzo como parámetro. También se guarda un contador con las
páginas visitadas. Esta información se muestra luego en las páginas intermedias y en
la final se muestra la duración de la sesión junto con un mensaje de despedida.
• iniciar_sesion.php
<?php
session_start();
<a href="sesion_activa.php">Seguir</a>
• sesion_activa.php
<?php
session_start();
<a href="sesion_activa.php">Seguir</a> - -
<a href="finalizar_sesion.php">Salir</a>
• finalizar_sesion.php
<?php
session_start();
$ahora = mktime();
$duracion = $ahora - $_SESSION["comienzo"];
?>
La sesión ha durado
<?= floor($duracion / 3600) ?>h
<?= floor(($duracion % 3600) / 60) ?>m
<?= floor(($duracion % 60)) ?>s.<br>
En ese tiempo ha visitado
<?= $_SESSION["contador"] ?> páginas.<br>
<?php
session_destroy();
?>
Ejemplo 5.4.1. Este sistema de control de acceso está compuesto por cuatro págionas.
acceso.html es un formulario web que solicita un nombre de usuario y contraseña.
Estos datos llegan a autenticar.php que comprueba si son válidos. Si es así añade a la
sesión una variable autorizado con el valor "si" y redirecciona a la página
zona_privada.php. Si la contraseña introducida es erronea redirecciona a la página
no_autorizado.php y muestra un error y ofrece un enlace para volver a registrarse.
Se incluye también una página salir.php para destruir la sesión cuando se sale de la
zona privada.
• acceso.html
<html>
<head>
<title>Acceso a la zona privada</title>
</head>
<body>
Introduzca sus datos.
<table>
<form name="acceso" method="POST" action="autenticar.php">
<tr>
<td>Usuario: </td>
<td><input type="text" name="usuario" size="20"></td>
</tr>
<tr>
<td>Contraseña: </td>
<td><input type="text" name="contrasena" size="20"></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="submit" value="Entrar">
</td>
</tr>
</form>
</table>
</body>
</html>
• autenticar.php
<?php
• zona_privada.php
<?php
session_start();if (!$_SESSION["autorizado"]) {
//Redirecciono a la página de acceso denegado
header("location:no_autorizado.html");
}
?>
Bienvenido a la zona privada.<br>
<a href="salir.php">Salir</a>
• no_autorizado.php
<html>
<head>
<title>Acceso denegado</title>
</head>
<body>
<b>Acceso denegado.</b><br>
La página a la que intenta acceder requiere autenticación.<br>
<a href="acceso.html">Ir a la página de entrada.</a>
</body>
</html>
• salir.php
<?php
session_start();
session_destroy();
?>
Gracias por utilizar nuestros servicios.<br>
<a href="acceso.html">Ir a la página de entrada.</a>
Ejemplo 5.4.2. Una primera mejora obvia es extraer el código que comprueba si un
usuario está autorizado a una biblioteca (en este caso autorizar.php ) e incorporarlo a
cada página de la zona privada mediante un simple include() .
• autorizar.php
<?php
session_start();
if (!$_SESSION["autorizado"]) {
//Redirecciono a la página de acceso denegado
header("location:no_autorizado.html");
}
?>
• zona_privada.php
<?php
include("autorizar.php");
?>
Bienvenido a la zona privada.<br>
<a href="salir.php">Salir</a>
Ejemplo 5.4.3. Una segunda mejora obvia es crear un archivo externo que contenga
los datos de los usuarios del sistema. Hay que crear este archivo (usuarios.php ) y
modificar autenticar.php.
• usuarios.php
<?php
//Array asociativo que contiene los usuarios registrados
$contrasenas["alicia"] = "xanadu";
$contrasenas["alberto"] = "catai";
$contrasenas["marta"] = "bombay";
?>
• autenticar.php
<?php
include("usuarios.php");
session_start();
if (($contrasenas[$usuario] == $contrasena)) {
//Marco la sesión como autorizada
$_SESSION["autorizado"] = TRUE;
Ejemplo 5.4.4. Si se necesita una gestión un poco más avanzada de los usuarios se
puede hacer uso de la base de datos MySQL. En el script usuarios.sql se incluye una
definición de la tabla usuarios y su inicialización con unos pocos datos. En el código
PHP sólo hay que modificar el archivo autenticar.php . En este ejemplo se usa el
archivo importado conectar_bd.php mostrado en el ejemplo 4.4.2. para establecer la
conexión a la base de datos
• usuarios.sql
• autenticar.php
<?php
include("conectar_bd.php");
session_start();
if ($filas != 0) {
//Marco la sesión como autorizada
$_SESSION["autorizado"] = TRUE;
Pero puede haber casos en los que queramos registrar determinados eventos y asociar
esta información a la persona que los está produciendo. El evento más típico en este
caso es un acceso a la zona privada de nuestra página web.
Esta es la forma más sencilla. Hay un fichero en el servidor que guarda en cada línea
un intento de acceso. Se va a optar por un diseño modular que, como se verá más
adelante, tiene muchas ventajas.
Ejemplo 5.5.1. Tomamos como base el ejemplo 5.4.4. de la unidad didáctica anterior.
Se supone que ya existe la tabla usuarios . En este caso le vamos a añadir una función
registrar_acceso() que recibe un id de usuario y graba un registro de su entrada. Si se
le pasa el valor -1 graba un intento fallido de entrada.
<?php
include("conectar_bd.php");
if ($id_usuario != -1) {
$mensaje .= "El usuario con id $id_usuario "
. "ha entrado a la zona privada.";
} else {
$mensaje .= "Intento fallido de acceso a la zona privada.";
}
$archivo = fopen("accesos.txt", "a");
fwrite($archivo, "$mensaje\r\n");
fclose($archivo);
}
session_start();
Ejemplo 5.5.2. Para guardar en la base de datos solo ha sido necesario modificar la
función registrar_acceso.
<?phpinclude("conectar_bd.php");
// Función que registra la entrada de un usuario
// Si recibe una id de usuario -1 es que el acceso ha sido fallido
function registrar_acceso($id_usuario) {
global $con; $ahora = mktime();
$fecha_mysql = strftime("%Y-%m-%d %H:%M:%S ", $ahora); $sql =
"INSERT INTO accesos (id_usuario, hora_acceso) "
. "VALUES ($id_usuario, '$fecha_mysql')";
mysql_query($sql, $con);
}?>
Para poder registrar otros eventos de un usuario, aparte del acceso, la aplicación web
tiene que conocer en todo momento qué usuario es el activo. Para ello, al autenticar a
un usuario, hay que guardar su identidad en una variable de sesión.
<?php
include("conectar_bd.php");
session_start();
if (mysql_num_rows($res) != 0) {
$_SESSION["autorizado"] = TRUE;
header("location:zona_privada.php");
} else {
session_destroy();
registrar_acceso(-1); header("location:no_autorizado.html");
}
?>
U.D.6. Plantillas
Uno de los objetivos que hemos ido persiguiendo a lo largo del curso es la separación
del código HTML del PHP. Los sistemas plantillas suponen una contribución en este
sentido ya que separan en diferentes archivos la presentación (el código HTML con el
diseño) de la lógica (el código PHP que realiza operaciones con los datos.
DTemplate
PHP no incorpora ningún sistema de plantilas en la librería de funciones del núcleo por
lo que tendremos que hacer uso de una librería desarrollada por un tercero. En este
caso hemos elegido la librería DTemplate desarrollada por Peter Mallet por los
siguientes ventajas.
Otros sistemas de plantillas más avanzados y completos usan una sintaxis similar a
DTemplate, por lo que podremos aplicar lo que aprendamos a esos sistemas si
preferimos una versión más potente.
http://prdownloads.sourceforge.net/dtemplate/dtemplate-120.zip
Instalación
Esquema de funcionamiento
Definición de la plantilla
Las plantillas las guardaremos con la extensión .tpl (del inglés template).
Es importante tener en cuenta que no se puede poner código PHP en las plantillas.
Variables de plantilla
Las variables en las plantilas las reconoceremos porque se escriben entre corchetes " {
... } " y contienen un identificador de la variable que normalmente escribiremos en
mayúsculas y sin espacios en blanco. No hay que confundir las variables de plantilla
con las variables de PHP.
{VARIABLE }
Ejemplo 5.6.1. La siguiente es una plantilla muy sencilla que tiene como variables el
título de la página y el mensaje dentro del cuerpo de la misma. La guardaremos con el
nombre plantilla_mensaje.tpl.
<html>
<head>
<title>{TITULO}</title>
</head>
<body>
{MENSAJE}
</body>
</html>
Antes de hacer uso de la librería hay que importarla mediante la sentencia include() .
<?php
include("class.DTemplate.php");
//...
En primer lugar hay que crear una instancia de la librería y asignarla a una variable.
Esto se hace con la instrucción new de la siguiente forma.
Una vez creada una instancia de la librería, para hacer uso de las funciones de la
librería lo haremos con la siguiente sintaxis.
define_template()
La primera función que usaremos nos servira para indicarle a la librería donde se
encuentran los archivos .tpl con definiciones de plantillas. Esta función asocia un
identificador a una plantilla.
Si son varias las plantillas podemos definirlas sucesivamente llamando una vez a esta
función por cada plantilla.
assign()
Esta función asigna un valor a una variable que esté presente en una definición de
plantilla. Hay que asignar valores a todas las variables que aparezcan en la plantilla.
process()
En este paso se interpretan las variables de la plantilla sustituyéndolas por los valores
que se les dieron al asignarlas.
DPrint()
Al final del script PHP hay que llamar a esta función para que pinte el resultado por
pantalla.
<?php
include("class.DTemplate.php");
Plantillas anidadas
Al igual que se le puede asignar a una variable de plantilla un valor, se le puede asignar
también el resultado de procesar una plantilla. De esta forma se pueden componer
páginas con muchos elementos a partir de trozos de código sencillos.
fetch()
Ejemplo 5.6.3. Aquí se usa una plantilla principal cuyas dos variables
{DATOS_COMERCIO} y {LISTA_PRECIOS} se rellenan haciendo uso de otras dos
plantillas, una con los datos de una frutería y otra con una lista de precios.
• Plantilla ficha.tpl
<html>
<head>
<title>Ficha del establecimiento</title>
</head>
<body>
{DATOS}<br>
<hr>
{LISTA_PRECIOS}</body>
</html>
• Plantilla datos.tpl
<b>{NOMBRE}</b><br>
{DIRECCION}<br>
{TELEFONO}<br>
<a href="mailto:{EMAIL}">{EMAIL}</a>
• Plantilla lista_precios.tpl
{PRECIOS}
• ficha_comercio.php
<?php
include("class.DTemplate.php");
Esta estrategia se sigue en plantillas en las que hay un tipo de elemento que se repite
muchas veces, como pueden ser las filas de un listado.
Ejemplo 5.6.4. Sería mucho más práctico poner la lista de precios en una tabla. El
problema es que con los mecanismos que conocemos hasta ahora esto nos requeriría
guardar en una variable también las etiquetas de comienzo y final de fila y de comienzo
y final de celda <tr><td>...</td></tr> .
En lugar de esto vamos a hacer una nueva plantilla para cada fila.
• Plantilla producto.tpl
<tr>
<td>{NOMBRE_PRODUCTO}</td>
<td align="right">{PRECIO} euros el kg.</td>
</tr>
También hay que adaptar la plantilla lista_precios.tpl para que use una tabla.
• Plantilla lista_precios.tpl
• ficha_comercio.php
<?php
include("class.DTemplate.php");
$titulo = "Ficha";
$nombre_comercio = "Frutería Pernambuco";
$direccion_comercio = "c/ Don Juan Tenorio 17";
$tfno_comercio = "866 713 137";
$email_comercio = "[email protected] ";
$productos = array("Limones", "Naranjas", "Peras", "Tomates");
$precioskg = array("Limones" => 3.50,
"Naranjas" => 1.80,
"Peras" => 1.20,
La librería DTemplate tiene muchas otras funciones y otros modos de acceder a las
mismas que pueden servir para múltiples situaciones. Quien esté interesado puede
ampliar conocimientos con la documentación del producto.