Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Diseno de Aplicaciones Web Con PostgrSQL PDF
Diseno de Aplicaciones Web Con PostgrSQL PDF
Aplicaciones
WEB
con
PHP 4
y
ProgreSQL 7.1
ISBN 980-6366-09-4
Teléfono 0414-5897085
Página WEB www.ieass.tk
Hecho en Venezuela
Tabla de Contenido
Acerca de este libro ................................................................................................................ 8
Presentación de la Obra .......................................................................................................... 9
Convenciones ....................................................................................................................... 10
Introducción a las Aplicaciones WEB.................................................................................. 11
Primera parte ........................................................................................................................ 15
Requerimientos..................................................................................................................... 15
BISON .............................................................................................................................. 16
FLEX ................................................................................................................................ 16
Instalación de Apache/ Php .............................................................................................. 17
Actualización del archivo de configuración ..................................................................... 18
Arranque del servidor ....................................................................................................... 19
Instalación de PostgreSQL ............................................................................................... 20
Cuenta de administración de la BD .................................................................................. 20
Creación de directorios para la correcta instalación de PostgreSQL................................ 20
Proceso de compilación/instalación ................................................................................. 21
Actualización del archivo de configuración ..................................................................... 21
Actualización del archivo profile ..................................................................................... 22
Inicialización y arranque de la BD ................................................................................... 23
Dando privilegios a la BD ................................................................................................ 24
Instalación de PHP ........................................................................................................... 25
Segunda Parte ....................................................................................................................... 27
PostgreSQL........................................................................................................................... 27
El proyecto Postgres de Berkeley..................................................................................... 27
Postgres95......................................................................................................................... 28
PostgreSQL....................................................................................................................... 29
Concurrencia de acceso para multiversión ....................................................................... 30
Herencia, estructura orientada a objetos........................................................................... 32
Procedimientos almacenados............................................................................................ 33
Triggers, constricciones.................................................................................................... 34
Introducción, tablas, filas y columnas .............................................................................. 35
Un poco de vocabulario................................................................................................ 35
Las tablas ...................................................................................................................... 36
NULL, un valor a parte................................................................................................. 37
CREATE TABLE, SELECT, INSERT, DELETE ........................................................... 38
Creación de tablas......................................................................................................... 38
Adición y consulta de datos.......................................................................................... 39
Operaciones con cursores ............................................................................................. 40
Haciendo limpieza ........................................................................................................ 41
WHERE y UPDATE ........................................................................................................ 42
La cláusula WHERE..................................................................................................... 42
UPDATE ...................................................................................................................... 44
DISTINCT e INTO....................................................................................................... 45
Índices, claves y join ........................................................................................................ 46
Índices........................................................................................................................... 46
Join ............................................................................................................................... 48
Los agregados ................................................................................................................... 51
Agrupando los agregados ............................................................................................. 53
Las transacciones.............................................................................................................. 54
Constricciones y secuencias ............................................................................................. 57
SECUENCIAS ............................................................................................................. 59
Constriñendo las tablas................................................................................................. 64
Procedimientos almacenados (funciones) ........................................................................ 66
Triggers (disparadores)..................................................................................................... 74
¿Qué es un trigger? ....................................................................................................... 74
¿Cómo hacer un trigger ? ............................................................................................. 75
Optimizaciones y desempeño ........................................................................................... 80
Niveles de optimización ............................................................................................... 80
Nivel conceptual ........................................................................................................... 80
Escribiendo requerimientoss, tablas directrices y estadísticas ..................................... 82
Requerimientos............................................................................................................. 87
La configuración del servidor....................................................................................... 88
Los usuarios y sus derechos: CREATE GROUP, GRANT. ............................................ 88
GRANT y REVOKE .................................................................................................... 91
Los grupos .................................................................................................................... 93
¿Una Suite...?................................................................................................................ 95
Conclusión........................................................................................................................ 95
Scripts de creación de la base de datos......................................................................... 95
Utilidad de los alias de tablas ....................................................................................... 97
No presuma del resultado de una operación que tenga un NULL................................ 98
Nombres sistemáticos de columnas.............................................................................. 99
Trabajemos siempre en forma modular ........................................................................ 99
Piense en el producto cartesiano de una tabla sobre ella misma .................................. 99
Tercera parte ....................................................................................................................... 103
Historia de PHP .................................................................................................................. 103
Introducción al PHP ........................................................................................................... 103
¿Qué es PHP? ..................................................................................................................... 105
¿Qué hacemos con PHP?................................................................................................ 105
Ventajas de PHP ............................................................................................................. 107
El intérprete .................................................................................................................... 107
Configuración de PHP ........................................................................................................ 108
Archivos de configuración ............................................................................................. 108
Directivas de configuración............................................................................................ 108
Más directivas................................................................................................................. 110
Primeras nociones de sintaxis............................................................................................. 111
Escape............................................................................................................................. 111
Separación de instrucciones............................................................................................ 111
Comentarios.................................................................................................................... 111
Tipos ................................................................................................................................... 113
Enteros ............................................................................................................................ 113
Reales ............................................................................................................................. 113
Cadenas........................................................................................................................... 114
Conversión de cadenas ................................................................................................... 115
Vectores .......................................................................................................................... 115
Objetos............................................................................................................................ 117
Variables............................................................................................................................. 120
Referencia a variables..................................................................................................... 120
Asignación de valores..................................................................................................... 120
Ámbito de las variables .................................................................................................. 121
Variables globales .......................................................................................................... 122
Variables estáticas .......................................................................................................... 123
Variables variables ......................................................................................................... 123
Variables predefinidas .................................................................................................... 124
Constantes....................................................................................................................... 125
Operadores.......................................................................................................................... 126
Operadores aritméticos ............................................................................... 126
Operadores lógicos ......................................................................................................... 126
Operadores de comparación ........................................................................................... 127
Operadores de cadenas ................................................................................................... 128
Operadores a nivel de bits .............................................................................................. 128
Operadores de asignación............................................................................................... 129
Operadores de incremento y decremento (++, --) .......................................................... 129
Operador de control de errores ....................................................................................... 130
Operador de ejecución .................................................................................................... 130
Estructuras de control ......................................................................................................... 132
if, else, elseif................................................................................................................... 132
while ............................................................................................................................... 133
do ... while ...................................................................................................................... 134
for ................................................................................................................................... 134
foreach ............................................................................................................................ 136
switch.............................................................................................................................. 136
break ............................................................................................................................... 137
continue .......................................................................................................................... 138
require() e include() ........................................................................................................ 138
Funciones............................................................................................................................ 140
Definición de funciones.................................................................................................. 140
Paso de parámetros ......................................................................................................... 140
Paso de parámetros por valor ......................................................................................... 140
Paso de parámetros por referencia.................................................................................. 141
Devolución de valores .................................................................................................... 142
Valores por defecto......................................................................................................... 142
Lista de argumentos de longitud variable....................................................................... 143
Funciones variables ........................................................................................................ 144
Clases y Objetos ................................................................................................................. 145
Algunas funciones de PHP ................................................................................................. 148
Funciones básicas ........................................................................................................... 148
echo y print ................................................................................................................. 148
Funciones de vectores..................................................................................................... 148
array() ......................................................................................................................... 148
El resto de funciones .................................................................................................. 149
Funciones de cadenas ..................................................................................................... 152
Funciones de variables ............................................................................... 153
Programación WEB............................................................................................................ 155
Cuenta de administración de la BD ................................................................................ 155
Inicialización y arranque de la BD ................................................................................. 155
Dando privilegios a la BD .............................................................................................. 156
Arranque del servidor ..................................................................................................... 156
Ejemplos ......................................................................................................................... 157
Creación archivo index.php............................................................................................ 157
Acceso a PostgreSQL ..................................................................................................... 158
Manejo de errores ............................................................................................................... 168
Observaciones..................................................................................................................... 170
Acerca de este libro
Aplicaciones WEB con PHP 4 y PosgreSQL 7.1 presenta
las principales características y forma de
instalación, administración y programación de las
aplicaciones WEB, a través de la arquitectura de tres
capas.
ARQUITECTURA DE 3 CAPAS
PostgreSQL
E
Lado
l
Del
e
n
Servidor
f
o
q
u Php
e
d
e
Lado
e Informes
s
Del
t
e
Cliente Pantalla
l
ibro se basa en el aprendizaje mediante ejemplos
completos que consolidan el aprovechamiento.
Presentación de la Obra
Estamos adquiriendo el compromiso con todos ustedes,
nuestros amigos lectores, de presentarles de manera
amena y agradable, las últimas novedades del mundo
informático del software libre.
Sabemos de sobra, que la computación e informática
son dos áreas del conocimiento humano contemporáneo
más dinámicas y cuyas expectativas siempre son de
vanguardia y que, por tanto, es difícil estar
actualizado. Con la llegada del software libre se dio
nuevo impulso a estas dos áreas. Linux es un sistema
operativo basado en los procesadores Intel. Ha sido
diseñado por Linus Torvalds y un ejercito de
programadores alrededor del mundo, cuyo es objetivo
es crear software libre de cualquier copy-right y que
el mundo entero pueda utilizar.
El dirigir una editorial de estas características es,
sin duda, el desafío más apasionante que puede
enfrentar un profesor, ya que permite difundir y
perpetuar nuestros conocimientos científicos y
tecnológicos, y ayudar al desarrollo y crecimiento
del individuo en, y para, beneficio de nuestra
sociedad.
Convenciones
En este libro aplicaremos las siguientes convenciones
para explicar el comportamiento de algunas de las
directivas de configuración y ejecución más
importantes. En rojo tenemos el mensaje proporcionado
por el sistema, en verde el resultado de la sentencia
y/o programa, así como direcciones a carpetas y/o
archivod. Utilizaremos azul en los ejemplos de
sentencias y código de programas completos.
Introducción a las
Aplicaciones WEB
En los últimos años le hemos perdido el miedo al
computador, de hecho cada día le exigimos más
potencia y prestaciones. La evolución de la
tecnología computacional influye en cómo dirigir a
las organizaciones, cómo establecer comunicaciones y
cómo realizar el trabajo. Pero esta tecnología no
sólo afecta al mundo empresarial, sino que también ha
permitido que la globalización nos envuelva y que
vivamos en la famosa aldea informática de McLuhan.
La arquitectura cliente/ servidor es una realidad, ya
que refleja nuestras necesidades, reales y virtuales,
como organización y cuya principal característica es
la de compartir recursos entre un servidor que
procesa requerimientos y un cliente que toma las
respuestas y opera con ellas; bajo este esquema que
cada parte integrante realiza lo que mejor sabe hacer
y a través de la web viajan las consultas, datos y
respuestas; además, este esquema exige un cambio en
la filosofía de nuestro trabajo. Precisamente cuando
múltiples nodos de esta arquitectura cliente/
servidor se unen, sin importar las distancias
geográficas, se forma una telaraña o WEB, en inglés,
o Internet.
Las aplicaciones que viajan entre el servidor WEB y
los clientes se denominan páginas WEB, las cuales son
archivos de texto ASCII escrito en lenguaje HTML;
inicialmente eran estáticas, en el sentido de que, a
efectos de usuario, el único proceso realizado era el
de visualización de sus contenidos por parte del
explorador del cliente. La transferencia se lleva a
cabo mediante el protocolo HTTP. Pero con el tiempo
se requiere de mayor participación e interacción de
los usuarios con sus datos para ofrecerle información
mejor dirigidas, seleccionadas y elaboradas, estas
últimas páginas se denominan páginas dinámicas.
Actualmente existen dos tipos de sitios Web: los que
se comportan como revistas, donde uno simplemente lee
la información ahí contenida (página estática) y los
que se comportan como el software, donde uno hace un
grupo de tareas específicas (página dinámica). Estas
últimas se conocen como aplicaciones Web, y son
desarrolladas por grupos de desarrollo de software,
tal como en las aplicaciones de escritorio.
Este último concepto nos conduce a las páginas WEB
activas en el servidor cuyos modelos son: ASP (active
server pedads) y CGI (common gateway interface).
El procesamiento de páginas dinámicas se clasifica
en:
- páginas dinámicas en el equipo del cliente.
- páginas activas en el servidor.
- páginas mixtas.
Una de las formas más populares para usar el WWW es a
través de las aplicaciones Web. Es la razón de la
aparición de un nuevo modelo de negocios en base a
estas aplicaciones: los ASP, los cuales ofrecen
masivamente el uso de sus aplicaciones a través del
WWW; y, por el otro lado el crecimiento de comercio
electrónico o e-commerce, en su orientación tanto B2B
como B2C.
La creciente popularidad de las aplicaciones WEB se
debe a sus múltiples ventajas, entre las cuales
podemos citar:
- Multiplataforma: Con un sólo programa, un único
ejecutable, las aplicaciones pueden ser utilizadas
a través de múltiples plataformas, tanto de
hardware como de software.
- Actualización instantánea: Debido que todos los
usuarios de la aplicación hacen uso de un sólo
programa que radica en el servidor, los usuarios
siempre utilizarán la versión más actualizada del
sistema.
- Suave curva de aprendizaje: Los usuarios, como
utilizan la aplicación a través de un navegador,
hacen uso del sistema tal como si estuvieran
navegando por Internet, por lo cual su acceso es
más intuitivo.
- Fácil de integrar con otros sistemas: Debido a que
se basa en protocolos estándares, la información
manejada por el sistema puede ser accedida con
mayor facilidad por otros sistemas.
- Acceso móvil: El usuario puede acceder a la
aplicación con la única restricción de que cuente
con un acceso a la red privada de la organización
o a Internet, dependiendo de las políticas de
dicha organización; puede hacerlo desde una
computadora de escritorio, una laptop o desde un
PDA; desde su oficina, hogar u otra parte del
mundo.
Además, uno de los servicios más importantes y usados
de Internet en la actualidad es el World Wide Web,
que ha evolucionado a pasos agigantados, primero
incorporando en el contenido de las páginas
diferentes tipos de letras, imágenes, sonidos etc. y
posteriormente, por medio del CGI, lenguajes script y
otros métodos, el usuario interactúa cada vez más con
el servidor Web: desde el envío de opiniones acerca
de una página determinada hasta el acceso y
administración de grandes bases de datos
empresariales.
El mejor servicio que en la actualidad ofrece el WEB
es que las organizaciones pongan a disposición del
mundo información acerca de los servicios y/o
productos que fabrican, o consultar sus actividades o
su situación financiera o de productividad o
disponibilidad de productos y/o servicios en el
momento y/o lugar deseado, así como establecer la
comunicación con las personas. El Web se ha
convertido en un escaparate de alcance mundial, donde
las organizaciones pueden mostrar sus objetivos a
prácticamente cualquier persona en el mundo a un
costo muy bajo.
En la actualidad existen diversos modelos de
desarrollo de aplicaciones Web cada uno con diversas
ventajas y desventajas. Estos modelos utilizan
diferentes tecnologías tanto de hardware como de
software, y tienen costos de licencias de uso muy
variados: desde las propuestas desarrolladas con
software que se puede utilizar de manera gratuita,
hasta los modelos que usan software con costo de
varios miles de dólares.
En este trabajo propongo el uso de una arquitectura
que utiliza tecnologías de software de uso libre, del
cual, su desempeño y confiabilidad ha sido
corroborado por millones de usuarios alrededor del
mundo gracias a Internet. Sin embargo, no existe un
compendio de documentación acerca de las tecnologías
e implementaciones existentes, así como de la manera
de integrarlas.
Este libro de divide en cuatro partes:
En la primera parte describiremos los requerimientos
de software para ejecutar nuestra aplicación WEB.
En la segunda, hablaremos de las tecnologías que
están involucradas en el desarrollo de aplicaciones
Web: Arquitectura Cliente/ Servidor, el HTTP, HTML,
lenguaje de consulta SQL y cifrado de datos. También
mencionaremos los diversos paradigmas que existen
para el desarrollo de aplicaciones Web: CGI, Co-
Servidor, e intérprete incrustado.
En la tercera parte, describiremos la estructura de
una aplicación Web y la problemática que se presenta
en su desarrollo. Se habla de la autenticación de
usuarios, manejo de sesiones, el uso de bitácoras,
acceso a datos, y el manejo de plantillas.
En la cuarta parte hablaremos acerca del diseño de
una aplicación Web, desde el análisis de
requerimientos, también describiremos algunos
lineamientos para el diseño de la interfaz de
usuario, y la creación de un prototipo.
Primera parte
Requerimientos
El objetivo de este libro es facilitar la instalación
de los servicios y programas necesarios para ejecutar
nuestras aplicaciones WEB en la mayoría de
distribuciones GNU/ Linux. Partimos de la base de que
tenemos una máquina con Linux1 instalado y
funcionando y con todas las herramientas necesarias
para la compilación de programas (gcc, make,..). Este
libro se sustentará en Apache 1.3.x, PHP 4.0.x y
PostgreSQL 7.1.x. Lo primero que tenemos que hacer es
bajar los tres paquetes con los programas necesarios
y grabarlos en un directorio de nuestro sistema (por
ejemplo, /local/download/):
- Bison
Principal
- Flex
Principal
- Apache
Principal
Mirrors
- PHP
Principal
- PostgreSQL
Principal
Mirrors
Primero verifiquemos que estas aplicaciones ya están
instaladas con los siguientes comandos:
1
El autor tiene instalado Linux Mandrake 8.0, quien ejecuto una aplicación personalizada tipo servidor,
seleccionó estas aplicaciones y fueron instaladas automáticamente con sus parámetros respectivos. Sólo
tenemos que verificar sus locaciones, las cueles cambian de acuerdo a la distribución de Linux que estemos
utilizando.
[localhost]$ flex --version
BISON
Bájelo del site ftp://ftp.gnu.org/gnu/bison y
procedamos a ejecutar los siguientes comandos:
[localhost]$ cd bison-1.28
[localhost]$./configure
[localhost]$ make
FLEX
Bájelo del site ftp://ftp.gnu.org/non-gnu/flex y
procedamos a ejecutar los siguientes comandos:
[localhost]$ cd flex-2.5.4a
[localhost]$./configure
[localhost]$ make
[localhost]$ make install
[localhost]$ su
[localhost]$ cd /usr/src
| tar xvf -
| tar xvf -
[localhost]$ cd apache_1.3.x
[localhost]$ cd ../php-4.0.x
--with-apache=../apache_1.3.x --enable-track-vars
--enable-sysvsem --enable-sysvshm
--enable-url-includes
[localhost]$ make
[localhost]$ cd ../apache_1.3.x
--activate-module=src/modules/php3/libphp3.a
[localhost]$ make
[localhost]$ cd ../php-4.0.x
[localhost]$ exit
[localhost]$ su
[localhost]$ /usr/local/apache/bin/httpd
-f /usr/local/apache/conf/httpd.conf
[localhost]$ exit
Cuenta de administración de la BD
[localhost]$ su
[localhost]$ exit
[localhost]$ cd /usr/src
[localhost]$ cd /usr/local
[localhost]$ exit
Proceso de compilación/instalación
Empezamos con el proceso de compilación/instalación:
[localhost]$ su postgres
[localhost]$ cd /usr/src/pgsql
| tar xvf -
[localhost]$ cd /usr/src/pgsql/postgresql-6.5.x/src
--with-tcl --with-perl
[localhost]$ exit
[localhost]$ su
[localhost]$ echo /usr/local/pgsql/lib >> /etc/ld.so.conf
[localhost]$ /sbin/ldconfig.
[localhost]$ exit
[localhost]$ su postgres
PATH=$PATH:/usr/local/pgsql/bin
MANPATH=$MANPATH:/usr/local/pgsql/man
PGLIB=/usr/local/pgsql/lib
PGDATA=/usr/local/pgsql/data
export LC_COLLATE=C
export LC_CTYPE=C
Inicialización y arranque de la BD
Como usuario postgres, ejecutamos:
[localhost]$ su postgres
[localhost]$ initdb
[localhost]$ cd
[localhost]$ exit
Dando privilegios a la BD
Suponemos que tenemos una base de datos llamada
prueba, con una tabla llamada direcciones
[localhost]$ su postgres
prueba=> TO nobody;
prueba=> \z
prueba=> \q
[localhost]$ exit
Instalación de PHP
Iniciaremos la instalación de PHP bajando el archivo
php-4.0.2.tar.gz del site http://www.php.net y
grabándolo en el directorio /usr/src/.
Ejecutamos los siguientes comandos:
[localhost]$ cd /usr/src
[localhost]$ cd /usr/src/php-4.0.2
[localhost]$ make
</IfModule>
Postgres95
En 1994, Andrew Yu y Jolly Chen añadieron un
intérprete de lenguaje SQL a Postgres. A
continuación, Postgres95 fue publicado en la Web para
que encontrara su propio nicho en el mundo
informático como un descendiente de dominio público y
código abierto del código original Postgres de
Berkeley.
El código de Postgres95 fue adaptado a ANSI C y su
tamaño reducido en un 25%. Muchos cambios internos
mejoraron el rendimiento y la facilidad de
mantenimiento. Postgres95 v1.0.x se ejecutaba en
torno a un 30-50% más rápido en el Wisconsin
Benchmark comparado con Postgres v4.2. Además de
corrección de errores, éstas fueron las principales
mejoras:
• El lenguaje de consultas Postquel fue reemplazado
con SQL (implementado en el servidor). Las
subconsultas no fueron soportadas hasta PostgreSQL
(ver más abajo), pero podían ser emuladas en
Postgres95 con funciones SQL definidas por el
usuario. Las funciones agregadas fueron
reimplementadas. También se añadió una
implementación de la cláusula GROUP BY. La
interfaz libpq permaneció disponible para
programas escritos en C.
• Además del programa de monitorización, se incluyó
un nuevo programa (psql) para realizar consultas
SQL interactivas usando la librería GNU readline.
• Una nueva librería de interfaz, libpgtcl,
soportaba clientes basados en Tcl. Un shell de
ejemplo, pgtclsh, aportaba nuevas órdenes Tcl para
interactuar con el motor Postgres95 desde
programas tcl.
• Se revisó la interfaz con objetos grandes. Los
objetos grandes de Inversion fueron el único
mecanismo para almacenar objetos grandes (el
sistema de archivos de Inversion fue eliminado).
• Se eliminó también el sistema de reglas a nivel de
instancia, si bien las reglas siguieron
disponibles como reglas de reescritura.
• Se distribuyó con el código fuente un breve
tutorial introduciendo las características comunes
de SQL y de Postgres95.
• Se utilizó GNU make (en vez de BSD make) para la
compilación. Postgres95 también podía ser
compilado con un gcc sin parches (al haberse
corregido el problema de alineación de variables
de longitud doble).
PostgreSQL
En 1996, se hizo evidente que el nombre "Postgres95"
no resistiría el paso del tiempo. Se selecciono como
nuevo nombre, PostgreSQL, para reflejar la relación
entre el Postgres original y las versiones más
recientes con capacidades SQL. Al mismo tiempo, se
logro que los números de versión partieran de la 6.0,
volviendo a la secuencia seguida originalmente por el
proyecto Postgres.
Durante el desarrollo de Postgres95 se hizo hincapié
en identificar y entender los problemas en el código
del motor de datos. Con PostgreSQL, el énfasis ha
pasado a aumentar características y capacidades,
aunque el trabajo continúa en todas las áreas.
Las principales mejoras en PostgreSQL incluyen:
• Los bloqueos de tabla han sido sustituidos por el
control de concurrencia multiversión, el cual
permite a los accesos de sólo lectura continuar
leyendo datos consistentes durante la
actualización de registros, y permite copias de
seguridad en caliente desde pg_dump mientras la
base de datos permanece disponible para consultas.
• Se han implementado importantes características
del motor de datos, incluyendo subconsultas,
valores por defecto, restricciones a valores en
los campos (constraints) y disparadores
(triggers).
• Se han añadido funcionalidades en línea con el
estándar SQL92, incluyendo claves primarias,
identificadores entrecomillados, forzado de tipos
cadena literales, conversión de tipos y entrada de
enteros binario y hexadecimal.
• Los tipos internos han sido mejorados, incluyendo
nuevos tipos de fecha/ hora de rango amplio y
soporte para tipos geométricos adicionales.
• La velocidad del código del motor de datos ha sido
incrementada aproximadamente en un 20-40%, y su
tiempo de arranque ha bajado el 80% desde que la
versión 6.0 fue lanzada.
CREATE
BEGIN
UPDATE 1
Prueba=#
CREATE
CREATE
INSERT 5432 1
Nombre
---
LinuxFrench
(1 row)
nombre
-------------
LinuxFrench
LinuxFrench
(2 rows)
nombre
-------------
LinuxFrench
(1 row)
En este ejemplo tenemos una tabla "clientes" que
hereda de la tabla "prospectos". Si tenemos una línea
en cada una de las tablas, podemos obtener un cliente
mientras consultamos la tabla clientes, por el otro
lado, si consultamos la tabla prospectos, tendremos
bien sea el conjunto de los prospectos y el de los
clientes (una línea de cada uno de nuestro ejemplo),
sólo únicamente los prospectos utilizando la cláusula
ONLY en el SELECT.
Procedimientos almacenados
PostgreSQL permite implementar procedimientos
almacenados como funciones. Estos procedimientos
pueden ser escritos en diferentes leguajes de
programación, entre ellos:
• SQL "estándar" (SQL92).
• PL/pgSQL, que es un lenguaje procedimental
directamente derivado de SQL.
• C.
• Tcl.
• Perl.
• Python.
• Ruby.
Me gusta utilizar PL/pgSQL por su proximidad al
PL/SQL de Oracle.
También debemos apreciar que postgres nos permite
escribir funciones distintas con el mismo nombre,
pero tomando diferentes parámetros, lo cual es mejor
que escribir muchas funciones diferentes. Veamos el
ejemplo siguiente:
• suprimirCliente(integer).
• suprimerCliente(varchar).
en lugar de:
• suprimerClientePorIdentificador(integer).
• suprimerClientePorNombre(varchar).
Sin embargo, existe una limitación importante (si,
PostgreSQL no es perfecto!), es imposible abrir o
cerrar una transacción desde un procedimiento
almacenado. De hecho, postgres no maneja
transacciones empotradas. Si nuestra aplicación lo
hace, no podemos utilizar "BEGIN TRANSACTION".
Triggers, constricciones
Un procedimiento almacenado (o función en la
terminología postgres), puede ser llamado desde un
trigger (también llamado disparador). Un trigger es
una operación que será ejecutada durante el acceso a
una tabla, también puede ser llamado desde un SELECT,
INSERT y/o UPDATE. El llamado puede ser realizado
desde una línea de comando o por una sentencia SQL.
Además, un trigger puede ejecutarse antes o después
de la manipulación de los datos para que sea
realmente efectivo. Son muy prácticos porque efectúan
verificaciones de coherencia o de integridad de los
datos antes de permitir una modificación sobre la
tabla. Igualmente pueden servir para efectuar
operaciones más complejas como por grabar en una
tabla los datos antiguos antes de que sean
modificados para generar las distintas versiones
sucesivas para la auditoria.
PostgreSQL también maneja constricciones, las cuales
son declaradas durante el proceso de creación de la
tabla. Tenemos las constricciones clásicas: NULL/NO
NULL, UNIQUE, PRIMARY KEY y REFENCES (clave foránea)
así como CHECK aunque es menos común. Esta
constricción nos permite escribir una expresión
booleana que acepte o no ciertos valores. Por ejemplo
queremos verificar que haya un mínimo de dos campos
de una línea que pueden ser reasignados (TEL_FIJO o
TEL_GSM). En la declaración de una constricción con
respecto a una clave foránea, podemos especificar el
comportamiento en caso de eliminación del dato
referenciado (rechazar, eliminar en cascada, pasar la
clave foránea a NULL o al valor por defecto definido
para esa columna). ¡Pruébelo!
PostgreSQL es una base de datos muy poderosa. El
autor tiene muchos años programando en base de datos
propietarias (Oracle, SQL Server 7 y Access) en
diferentes y variadas aplicaciones (Bancos, sistemas
de control de estudios, sistemas administrativos y
bases documentales...), y debo decirles que sólo
extraño una cosa en el pgSQL en las aplicaciones muy
críticas: las transacciones incorporadas en los
procedimientos almacenados. También puede encontrar
unas pocas fallas, por ejemplo los procedimientos
almacenados no pueden recuperar algunos registros.
Aunque la misma limitante existe en Oracle. En el
término de rendimiento, podemos decir que globalmente
pgSQL soporta muy bien la carga y que realmente se
adapta muy bien a un servidor intranet.
Un poco de vocabulario
Las tablas
lact_code | lact_lib
-------------+---------------------------------------------
15 | Industries alimentaires
16 | Industrie du tabac
17 | Industrie textile
18 | Industrie de l’habillement et des fourrures
19 | Industrie du cuir et de la chaussure
Creación de tablas
CREATE
Prueba1=#
INSERT 53638 1
Prueba1=#
nom
--------
DUPONT
(1 row)
nom | apellidos
--------+--------
DUPONT | Martin
(1 row)
Prueba1=#
np | name
---------------+--------
DUPONT Martin | DUPONT
9
(1 row)
Prueba1=#
INSERT 53639 1
Prueba1=#
Haciendo limpieza
DELETE 2
Prueba1=\#
DROP
Prueba1=\#
WHERE y UPDATE
En el apartado anterior vimos la forma de recuperar
registros en las tablas, pero las formas empleadas
devolvían todos los registros de la mencionada tabla.
Ahora estudiaremos las posibilidades de filtrar los
registros con el fin de recuperar o actualizar
aquellos que cumplan con ciertas condiciones
preestablecidas.
La cláusula WHERE
CREATE
Prueba1=# INSERT INTO alumnos VALUES(’DUPONT’, ’Martin’, 6,
’CP’);
INSERT 53698 1
INSERT 53699 1
INSERT 53700 1
Prueba1=#
UPDATE
UPDATE 1
Prueba1=# select * from alumnos;
Prueba1=#
DISTINCT e INTO
clase
--------
3A
6B
3A
(3 rows)
clase
--------
3A
6B
(2 rows)
también podemos utilizar esta sentencias para crear
una nueva tabla que contenga la lista de las clases,
para ello empleamos la cláusula INTO que se comporta
como un direccionador en la línea de comandos Linux o
Windows:
SELECT
clase
--------
3A
6B
(2 rows)
Índices
CREATE
Prueba1=#
Join
CREATE
INSERT 5053839 1
Prueba1=# INSERT INTO profesores VALUES(’6B’,’Mme Grenouille’);
INSERT 5053840 1
Prueba1=#
Prueba1=#
Prueba1=#
INSERT 5053897 1
Prueba1=#
Los agregados
Empleamos a las funciones de agregado dentro de una
cláusula SELECT en grupos de registros para devolver
un único valor que se aplica a dicho grupo, es decir,
podemos manipular datos en brutos para obtener
resultados únicos, aunque temporales. Veamos el
agregado más simple, COUNT:
Prueba1=#
?column?
----------
1
1
1
(3 rows)
INSERT 14284416 1
count
-------
4
(1 row)
Prueba1=# SELECT COUNT(clase) FROM alumnos;
count
-------
3
(1 row)
Prueba1=#
total | clase
-------+--------
2 | 3A
1 | CP
1 |
(3 rows)
total | clase
-------+--------
2 | 3A
1 | CP
(2 rows)
total | clase
-------+--------
2 | 3A
(1 row)
Las transacciones
Las transacciones son completamente indispensables en
un SGBD ya que garantizan que el estado de los datos
siempre es coherente y dependiente de las
circunstancias. Una transacción se puede definir (de
manera simple) como una continuación de las
operaciones que efectúa completa o parcialmente.
Cuando compramos pan, efectuamos una transacción
constituida por 2 operaciones: da una orden al
panadero y éste nos da el pan. Aunque podemos
considerar una tercera operación, pagar el pan. Si
una de las operaciones no se completa, se nos olvido
el pedido, la apariencia del pan no nos gusta o
cambiamos de opinión, entonces la transacción
completa es anulada. Por lo que no es posible que
solamente una parte de la transacción se actualice,
ocasionando problemas de coherencia e integridad.
Pero lo más importante, transacción, tiene una
connotación financiera, dependiendo del SGBD las
transacciones cubren todas las manipulaciones que son
necesarias a las operaciones. Como, si requerimos
transferir un alumno antiguo de la tabla de alumnos a
la tabla egresados, deberemos insertar estos alumnos
en la nueva tabla egresados y después suprimirlos de
la tabla alumnos. No hay garantía sobre una
interrupción en el servidor, si la segunda operación
no se efectúo, nuestra base de datos se vuelve
incoherente, ya que ambas operaciones deben
efectuarse por completo.
Desde un punto de vista práctico, resolver el
problema es muy simple. Una transacción se inicia con
la sentencia BEGIN TRANSACTION, quien nos asegura que
todas las modificaciones realizadas sobre la base de
datos NO son visibles en el interior de la misma
transacción. Para que se hagan efectivas se debe
alcanzar el comando COMMIT, pero si por alguna
circunstancia se detiene o altera la secuencia de
ejecución podemos deshacer las modificaciones
efectuadas con el comando ROLLBACK.
¿Qué es lo que realmente pasa? Las sentencias de
modificación son programadas (escritas para ser
ejecutadas progresivamente) en un libreto de
transacciones. Algunas modificaciones efectuadas
sobre la base de datos hasta que la operación no pase
físicamente a escribirse en el libreto de
transacciones. Insisto en lo físico, además les diré
que hay SGBD que no sólo escriben sobre el libreto
sino que también lo hacen sobre buffers, caches, etc.
Veamos un ejemplo de una transacción:
CREATE
BEGIN
Prueba1=# INSERT INTO TEST VALUES(1);
INSERT 14284476 1
a
---
1
(1 row)
Prueba1=# ROLLBACK;
ROLLBACK
a
---
(0 rows)
Constricciones y secuencias
Para establecer las relaciones entre tablas, debemos
establecer un esquema de base de datos adecuado,
propio y estructurado. Las constricciones mantienen a
un grupo de ellas. Regresemos a nuestra conocida
tabla alumnos. Como ejercicio queremos evitar la
inserción de un alumno que no tenga nombre, es decir,
nombre es un campo no indeterminado. Durante la
creación de la tabla, simplemente constriñimos la
columna, campo, nombre con: NOT NULL.
CREATE
Prueba1=#
INSERT 22664 1
Prueba1=#
SECUENCIAS
CREATE
nextval
---------
1
21
(1 row)
Prueba1=# select nextval(’seq_alumnos’);
nextval
---------
2
(1 row)
nextval
---------
3
(1 row)
last_value
------------
3
(1 row)
nextval
---------
4
(1 row)
last_value
------------
4
(1 row)
como podemos ver, la secuencia genera valores
numéricos sucesivos. En el proceso de creación de la
secuencia le indicamos que comience en el valor 1,
para que después le añada un uno como respuesta al
llamado de NEXTVAL().
Si regresamos a nuestra tabla alumnos, e insertamos
una columna denominada id (identificador del alumno)
como clave primaria proporcinado por nuestra
secuencia:
DROP
CREATE
Prueba1=#
INSERT 22816 1
INSERT 22818 1
Prueba1=#
si creamos ahora una nueva tabla mensajes que
contiene los mensajes enviados a los padres de los
alumnus. Esta tabla es muy simple, contiene la fecha
y la hora del mensaje, el texto y el identificador
del alumno. El identificador del alumno en la tabla
mensajes se denomina clave foránea, ya que es la
clave primaria de otra tabla. He aquí un ejemplo:
CREATE
Prueba1=#
DROP
CREATE
Prueba1=#
CREATE
Prueba1=#
[root@localhost src]#
...
no | solde
----+---------
1 | 100.00
2 | 1000.00
3 | 1500.00
4 | 10.00
creemos una función para efectuar una transferencia
de una cuenta hacia otra. Por facilidad, es
preferible grabar el código SQL de creación del
procedimiento en un archivo de texto:
AS ’
BEGIN
return 0;
END;
’ LANGUAGE ’plpgsql’;
no | solde
----+---------
2 | 1000.00
3 | 1500.00
4 | 10.00
1 | 100.00
(4 rows)
virement
----------
0
(1 row)
no | solde
----+---------
3 | 1500.00
4 | 10.00
1 | 200.00
2 | 900.00
(4 rows)
de seguro será un poco riesgoso, por lo que
deberiamos hacer:
BEGIN TRANSACTION; select virement(1,2,100); COMMIT;
AS ’
BEGIN
return 0;
END IF;
return -1;
END;
’ LANGUAGE ’plpgsql’;
AS ’
BEGIN
END IF;
END IF;
return 0;
END IF;
return 1;
END;
’ LANGUAGE ’plpgsql’;
no | solde
----+---------
3 | 1500.00
4 | 10.00
2 | 797.00
1 | 296.00
(4 rows)
BEGIN
virement
----------
0
0
0
(3 rows)
COMMIT
no | solde
----+---------
3 | 1499.00
4 | 9.00
2 | 796.00
1 | 299.00
(4 rows)
Prueba1=#
Triggers (disparadores)
Los triggers son un tipo de constricción, un elemento
fundamental en la estructura de las bases de datos.
Donde una constricción permite definir una regla
algebraica, el trigger permite definir una regla
algoritmica. Muy útil desde el punto de vista
funcional.
¿Qué es un trigger?
CREATE
CREATE
Prueba1=#
programamos una función que será invocada durante la
modificación de un artículo con el objetivo de
conservar la versión anterior de dicho artículo:
BEGIN
VALUES (OLD.id,OLD.date_modif,OLD.texte);
END IF;
RETURN NEW;
END;
’ LANGUAGE ’plpgsql’;
INSERT 40942 1
id | date_modif | texte
----+------------+-------
(0 rows)
UPDATE 1
id | date_modif | texte
----+------------+--------------------------------------
1 | 2001-11-19 | Ceci est le premier article original
(1 row)
Prueba1=#
BEGIN
END IF;
VALUES (OLD.id,OLD.date_modif,OLD.texte);
END IF;
RETURN NEW;
END;
’ LANGUAGE ’plpgsql’;
Veamos el resultado:
id | date_modif | texte
----+------------+--------------------------------------
1 | 2001-11-19 | Ceci est le premier article original
(1 row)
UPDATE 1
id | date_modif | texte
----+------------+--------------------------------------
1 | 2001-11-19 | Ceci est le premier article original
(1 row)
Optimizaciones y desempeño
El desempeño es una problemática invocada por las
bases de datos. Hablamos de entonar (ajustar los
parámetros para afinar el desempeño). Es necesario
medir la magnitud en los cambios y comprender cómo
funciona los engranes de un SGBDR antes de poder
tratar los problemas de desempeño.
Niveles de optimización
Nivel conceptual
clase
--------
3B
3A
(2 rows)
Prueba1=#
EXPLAIN
Prueba1=#
Prueba1=# vacuum;
VACUUM
INSERT 0 9
INSERT 0 18
...
INSERT 0 294912
Prueba1=# vacuum;
VACUUM
EXPLAIN
CREATE
EXPLAIN
Prueba1=#
Requerimientos
[localhost]# su - postgres
CREATE DATABASE
Password:
CREATE USER
CREATE USER
[localhost]#
CREATE
INSERT 1475451 1
linuxfrench=#
linuxfrench=# \q
\q to quit
linuxfrench=>
Nuestro usuario linuxfrench_user no puede acceder a
la tabla toto. La tabla ha sido creada por el usuario
linuxfrench_dbo, por defecto sólo este último usuario
tiene derecho de manipular la tabla. Veremos como
añadirle derechos al usuario linuxfrench_user.
GRANT y REVOKE
\q to quit
CHANGE
linuxfrench=# \q
\q to quit
a
---
1
(1 row)
linuxfrench=>
Los grupos
\q to quit
CREATE GROUP
linuxfrench=#
CHANGE
Le quitamos los priviliegios al grupo usuarios,
intentemos:
CHANGE
CREATE USER
linuxfrench=#
\q to quit
a
---
40
1
(1 row)
¿Una Suite...?
Conclusión
Nos hemos iniciado en bases de datos. Basado en mi
experiencia personal trataré de darle algunos trucos
y buenos hábitos destinados a simplificar nuestra
vida.
\echo ******************************
\echo ******************************
\echo ******************************
\echo ******************************
...etc...
Mientras que:
SELECT c.nom, e.nom, apellidos
?column?
----------
2
(1 row)
Prueba1=# select 1+null ;
?column?
----------
(1 row)
hemos dicho que NULL+x produce un NULL. ¡FALSO!.
Tenemos un resultado que puede cambiar de un SGBDR a
otro, de una versión a otra incluso en el mismo SGBDR
(incluso depende del humor del SGBDR). Cuando un
campo interviene en cálculo es susceptible de
contener el valor NULL, utiliza la función COALESCE
que retorna el primer parámetro no NULL:
?column?
----------
1
(1 row)
Nombres sistemáticos de columnas
o:
Prueba1=# \d voyedads
Table "voyedads"
Attribute | Type | Modifier
---------------+--------------------------+----------
depart_retour | character(1) |
date_heure | timestamp with time zone |
destination | character varying(128) |
?column? | destination
--------------+-------------
3 days 01:30 | PARIS
1 day 15:55 | ANGERS
2 days 15:35 | PARIS
(3 rows)
Prueba1=#
WHERE r.depart_retour=’R’.
Prueba1=#
Introducción al PHP
PHP, es acrónimo de "PHP: Hypertext Preprocessor",
que engloba lo que originalmente significa Personal
Home Pedad Tools.
Es un lenguaje interpretado de alto nivel embebido a
páginas HTML. PHP nos sirve principalmente para
realizar páginas html dinámicas de forma sencilla, ya
que podemos extender su uso a través de los shell-
scripts, recuerde que existen interpretes en línea de
comandos.
Por html dinámico entendemos el generador o
preprocesador para el interprete de PHP que como
salida nos proporciona una página en html.
PHP es muy parecido al lenguaje C, Java y Perl.
Básicamente las diferencias son: PHP no es sensible a
mayúsculas y minúsculas, las excepciones en el
tratamiento de objetos y variables, en que no se
declaren las variables y no tienen un tipo fijo, una
variable puede albergar diversos tipos de datos y a
lo largo de su vida pueden variar.
Por otro lado, debemos tener en cuenta que PHP se
ejecuta en un servidor y sobre demanda (normalmente
submits) por el que cambia la filosofía de las
aplicaciones convencionales con una interfase con el
usuario más orientada a eventos!
¿Qué es PHP?
PHP es un lenguaje de programación embebido en HTML e
interpretado por el servidor. Es embebido ya que el
código PHP se encuentra dentro de código HTML, aunque
eso sí, delimitado por secuencias de escape.
<html>
<?php
$c = 2;
$a = 4 + 5 + $c;
</html>
El intérprete
Es destacable el hecho de que el intérprete de PHP
pueda ser:
• Un módulo que el propio servidor web cargue y
gestione, existiendo módulos para Apache, IIS o
PWS;
• Un programa CGI.
La elección dependerá de nuestras necesidades:
mientras que la segunda opción ofrece un mayor
rendimiento, la primera se muestra más segura.
Configuración de PHP
PHP es un lenguaje altamente configurable, es decir,
podemos condicionar el comportamiento del intérprete
en muchos aspectos por medio de modificar y añadir
directivas en su archivo de configuración o en el de
Apache. En este apartado vamos a estudiar las
directivas más importantes y a lo largo del libro nos
daremos cuenta de la utilidad de algunas de ellas.
Archivos de configuración
Los Archivos de configuración para PHP3 y PHP4 son,
respectivamente, php3.ini y php.ini. Si utilizamos el
intérprete de PHP como módulo del servidor web,
entonces el archivo de configuración se lee cuando se
inicia dicho servidor. Si, por el contrario, trabaja
como CGI, el archivo se lee cada vez que se ejecute
el intérprete.
Directivas de configuración
En la siguiente lista se explica el comportamiento de
algunas de las directivas de configuración más
importantes. En rojo tenemos su nombre y en verde el
tipo de valor que almacena o regresa.
asp_tags
lógica
Permite o no la utilización de marcas al estilo ASP.
Ver enlace con escape de html
display_errors
lógica
Indica si los errores han de escribirse como parte
del documento HTML.
doc_root
cadena
Si PHP está configurado en modo seguro no servirá
ningún documento fuera de este directorio.
error_log
cadena
Nombre del archivo donde se notificarán los errores.
error_reporting
entera
Determina el nivel de notificación de errores. Ver
manejo de errores.
open_basedir
cadena
Indica el árbol de directorios donde se encuentran
los Archivos que PHP puede abrir. Bien utilizado,
supone una nueva medida de seguridad.
include_path
cadena
Especifica la lista de directorios donde require() e
include() buscarán los Archivos.
max_execution_time
entera
Fija el máximo tiempo de ejecución de un script
escrito en PHP. Con ello se consigue que, si alguno
de los scripts falla, no se quede "colgado" ocupando
recursos.
memory_limit
entera
Fija la cantidad máxima de memoria que puede tomar un
script.
track_errors
lógica
Especifica, si su valor es verdadero, que el último
mensaje de error se almacena en $php_errormsg.
track_vars
lógica
Si es verdadera, indica que las entradas
correspondientes a GET, POST y cookie se encuentren
en los vectores globales asociativos $HTTP_GET_VAR,
$HTTP_POST_VARS y $HTTP_COOKIE_VARS, respectivamente.
Más directivas
Las directivas que hemos visto no son todas las que
admite la configuración de PHP; encontramos más
directivas específicas para seguridad, correo y las
diferentes bases de datos. No obstante, no es objeto
de este libro un estudio exhaustivo de la
configuración del lenguaje, así que las directivas
restantes se analizarán en otra ocasión.
Primeras nociones de sintaxis
Escape
Si hablamos de la sintaxis de PHP tendremos que
empezar, sin ningún genero de dudas, por las
secuencias de escape, lo que nos permite delimitar el
código PHP dentro del HTML.
Como podemos ver en el ejemplo 2 nos encontramos con
varias posibilidades:
• Utilizamos la marca de comienzo <? y marcamos el
final con ?>.
• Empezamos con <?php y finalizamos con ?>
• Hacemos uso de la marca <SCRIPT> tal y como se
muestra en el ejemplo.
• Pueden usarse también marcas estilo ASP.
Separación de instrucciones
La separación de instrucciones, como puede
observarse, se lleva a cabo mediante el carácter ";",
algo común a muchos de los lenguajes convencionales.
Comentarios
En PHP se admiten los comentarios del tipo C, C++ y
shell (estilo sh o bash). Vamos a ponerle comentarios
al ejemplo 1:
<html>
<?php
$c = 2; // Estilo C++
</html>
Tipos
Los tipos disponibles en lenguaje PHP son:
• Tipos simples
o Enteros
o Reales (equivalentes a los doubles de C).
o Cadenas
• Tipos compuestos
o Vectores
Asociativos
Escalares
• Objetos
Enteros
PHP soporta tres notaciones diferentes para
especificar los números enteros: octal, decimal y
hexadecimal.
Octal: 075
Decimal: 276
Hexadecimal:0x0A3
Reales
Los reales, aunque no admiten notaciones en
diferentes bases como los enteros (bases 8, 10 y 16),
pueden especificarse de las dos formas siguientes:
2.432
2.33e3 (notación científica)
Hay que hacer notar el hecho de que los reales en PHP
equivalgan en rango y precisión a los reales tipo
double que encontramos en C.
Cadenas
Las cadenas podemos especificarlas en PHP de dos
formas distintas: encerrándolas entre comillas dobles
(") o simples ('). Dependiendo de la forma de
especificarlas, nos encontraremos con dos
comportamientos diferentes.
Si utilizamos comillas dobles las variables
contenidas en la cadena se sustituirán por su valor
y, además, podremos utilizar caracteres de escape al
igual que podemos hacer en C. Aclaremos esto con un
ejemplo:
$a = 10;
$b = 1.2e3;
echo("$c");
\n Retorno de carro
\t Tabulación
\\ \
\$ $
\" "
$b = 12;
echo('$c');
echo("$c");
Conversión de cadenas
Podemos evaluar las cadenas como valores numéricos.
Se fijan los siguientes criterios:
• Si la cadena contiene '.', 'e' o 'E', se evaluará
como un número real. En otro caso se considerará
un entero.
• El valor de la conversión será el fragmento
inicial de la cadena, si este es número válido. Se
considerará que se trata de un número válido si
está compueso de un signo (opcional), uno o más
dígitos, punto decimal (opcional) y un
exponente(también opcional) que consiste en una
'e' o 'E' seguida de más dígitos.
Vectores
PHP nos permite la creación de vectores de forma
implícita (al utilizarlos se declaran
automáticamente) o bien de forma explícita (funciones
list() o array()).
Al igual que gran parte de los lenguajes, en PHP se
accede a una posición de un vector poniendo su nombre
y el índice encerrado entre corchetes [ ]. El índice
puede ser asociativo $a["rojo"] o escalar $a[4]. Si
al asignar un valor a un vector no ponemos ninguna
posición entre los corchetes, estaremos añadiendo una
posición al final del vector donde se almacenará
dicho valor.
$b[4] = 3;
$d['verde'] = "color";
$a[3]["b"] = 3;
$a[4]['prueba'] = 'prueba';
class nombre {
var variables;
class vector {
$this->y = $cy;
function imprime(){
print("($this->x, $this->y)");
function pone_x($cx){
$this->x = $cx;
function pone_y($cy){
$this->y = $cy;
por defecto */
$v->imprime();
$v->pone_x(5);
$v->imprime();
(0,0)(5,0)
$this->x = $cx;
$this->y = $cy;
$this->ox = $ox;
$this->oy = $oy;
function imprime_o(){
print("($this->ox, $this->oy)");
function pone_ox($ox){
$this->ox = $ox;
function pone_oy($oy){
$this->oy = $oy;
$v = new vector_extendido(1,2,0,0);
$v->pone_x(5);
$v->pone_ox(2);
$v->imprime();
$v->imprime_o();
Y su salida es:
(5,2)(2,0)
Variables
Referencia a variables
Tal y como hemos venido observando en los ejemplos,
las variables en PHP se referencian mediante el
símbolo $ seguido del nombre de la variable. Además,
curiosamente, PHP es sensible a mayúsculas en cuanto
a nombres de variables se refiere; es decir, las
variables $prueba y $Prueba se consideran diferentes.
No ocurre lo mismo con el resto de construcciones del
lenguaje:
$prueba = "hola";
$Prueba = "amigo";
?>
Asignación de valores
Hemos visto en ejemplos anteriores que la asignación
de valores a variables se lleva a cabo mediante el
operador =, colocando la variable destino a la
izquierda de la asignación (lvalue) y la expresión a
la derecha (rvalue).
Pues bien, en PHP3 la asignación se produce por
valor; es decir, el valor de la expresión que se
encuentra a la derecha se copia en la zona de memoria
reservada para la variable destino. Esto implica, que
si asignamos el una variable var1 a otra var2, lo que
se copiará en ésta última será el valor de la
primera, y las modificaciones que hagamos sobre
cualquiera de las dos no afectarán a la otra.
$a = 5;
$b = $a;
$b = $b + 3;
$a = 5;
$b = &$a;
$b = $b + 3;
$a = &(3 + 4);
$c = &$vector[3];
function ambito() {
$var = 4;
$a = $a + 4;
{...}
/* aquí podemos referenciar $var y obtendremos
4 como su valor */
$function no_ambito() {
$var = 4;
function muestra() {
echo($var);
Variables globales
Pero eso no significa que no podamos acceder a
variables globales. Para hacerlo debemos declarar,
como tal, a la variable global a la que queramos
acceder.
$var = 4;
function muestra() {
global $var;
El resultado será:
El valor de var es 4
Otra posible solución es utilizar la variable
$GLOBALS, que es un vector asociativo que almacena
los valores de todas las variables globales.
$var = 4;
function muestra(){
$var = $GLOBALS["var"];
Variables estáticas
Se trata de variables locales a las funciones pero
que mantienen su valor cuando se sale de la función.
Así, al volver a entrar, sigue manteniendo el mismo
valor que tenía al dejar la función.
function incrementa(){
static $var = 0;
echo("$var");
$var = $var + 1;
Variables variables
Podría parecer que, en un principio, el título de
este capítulo está mal escrito... pero no es así. Si
utilizamos dos $ en lugar de uno, obtendremos el
siguiente resultado:
$b = "saludo"
$a = "b";
echo "${$a}";
En la última línea, PHP tomará el valor de $a, que es
b, y lo sustituirá. Entonces tenemos la sentencia
equivalente echo $b, que será "saludo". Incluso
podremos hacer una asignación del tipo $$a =
"despedida", que modificará el valor de $b.
Variables predefinidas
En PHP se definen por defecto una serie de variables
a las que podemos acceder desde nuestros scripts. En
esta sección vamos a ver las variables de entorno,
que resumimos en la siguiente tabla.
define("nombre_cte", valor);
Ejemplos:
define("CTE2", 45);
echo(CTE1);
Operadores aritméticos
Operadores lógicos
En principio nos va a llamar la atención el hecho de
que existan dos operadores AND y dos OR. La
explicación es que cada operador AND tiene diferente
recedencia; con los operadores OR ocurre lo mismo.
Operación Símbolo Devuelve Ejemplos
Verdaderos si $a y $b son
Y-lógico && $a && $b
verdaderos
Verdadero si $a o $b es $a xor
O-exclusivo xor
verdadero, pero no los dos $b
Negación
! Verdadero si $a es falso. !$a
lógica
Operadores de comparación
Operación Operador Devuelve Ejemplos
Verdadero si $a y $b son
Igual == $a == $b
iguales
Verdaderos si $a y $b
Identidad === son verdaderos y del $a && $b
mismo tipo
Verdadero si $a y $b son
Distinto != $a != $b
distintos
Verdadero si $a es menor
Menor que < $a < $b
que $b
Verdadero si $a es mayor
Mayor que > $a > $b
que $b
Mayor o igual Verdadero si $a es mayor
>= $a >= $b
que o igual que $b
(Expr1) ?
Exp2 si Exp1 es
Condicional ?: (Expr):
verdadero; si no Expr3
(Expr3);
Operadores de cadenas
El operador ofrecido por PHP para las cadenas es el
de concatenación, que se corresponde con el
símbolo"." (punto).
También consideramos a los corchetes [ ] como
operador para las cadenas, ya que cumple una función
análoga a la que lleva a cabo con los vectores.
$cadena = "prueba";
O-Exclusivo a nivel de
O-Exclusivo ^ $a ^ $b
bits
Desplaza $a hacia la
Desplazamiento a la
<< izquierda a nivel de $a << $b
izquierda
bits $b veces
Desplaza $a hacia la
Desplazamiento a la
>> derecha a nivel de bits $a >> $b
derecha
$b veces
Operadores de asignación
El operador de asignación por excelencia es "=". Se
trata del más sencillo de los operadores de
asignación:
$a = $b + 1; /* $a vale $b + 1 */
$a += 5; /* $a = $a + 5; */
$b .= "Concatena"; /* $b = $b."Concatena"; */
$a -= 3; /* $a = $a - 3; */
$a *= $a /* $a = $a * $a; */
$a /= 2; /* $a = $a / 2; */
$a = $b = 3;
$a = ($b *= 3) + 5; /* $b = $b * 3;
$a = $b * 3 + 5; */
$a = 1;
$a++; /* $a vale 2 */
$a--; /* $a vale 1 */
++$a; /* $a vale 2 */
--$a; /* $a vale 1 */
$a = 1; /* $a vale 1 */
$a = 1; /* $a vale 1 */
$b = --$a; /* $a y $b valen 0 */
Operador de ejecución
Por medio de la utilización de backquotes `, se
comunica a PHP la ejecución de un comando del shell.
$date = `date`;
echo $date;
/* la salida será Fri Feb 14 00:54:51 WEST 2000 */
Estructuras de control
PHP hereda gran parte de la sintaxis de sus
estructuras de control de las del lenguaje C, aunque
añade algunas características diferentes
if (condicion)
sentencias1;
[elseif (condicion)]
sentencias2;
[else]
sentencias3;
siguente instrucción...
if ($a == $b) {
$a++;
$b++;
$c = 0;
$c = 1;
else {
$a = $b = $c = 0;
while
Es la implementación del bucle con condición inicial.
Su sintaxis es:
while (condicion)
sentencias;
echo $i++;
echo $i;
$i++;
do ... while
Se diferencia del bucle while por el hecho de que la
condición se empieza a comprobar después de la
primera iteración (con condición final). Por tanto,
el grupo de sentencias se va a ejecutar, al menos,
una vez.
do
sentencias;
while (condicion);
$i = 0;
do
echo ++$i;
$i = 0;
do
$i++;
echo $i;
for
Se trata de, probablemente, el bucle más poderoso.
Tiene el mismo comportamiento que en C. Su sintaxis
es la siguiente:
for (expresion1; expresion2; expresion3) sentencias;
a[$i] = 0;
...
for (;;) {
...
E incluso:
for (;;$i++) {
echo $i;
}
foreach
En PHP4 se dispone de una estructura de control que
permite iterar de forma muy cómoda sobre un vector.
Tiene dos posibles sintaxis:
foreach(vectoras$var) sentencias;
switch
Equivale a un grupo de if combinados:
switch (expresion) {
case valor1:
sentencias;
[break;]
case valor2:
sentencias;
[break;]
case valor3:
sentencias;
[break;]
...
[default: sentencias;]
}
switch ($i % 4) {
case 0: $i = 4;
break;
($i % 4) == 2)
case 2: $i = 0;
break;
default:
$i++;
break
Como se ha visto, termina con la ejecución de la
estructura if, for, while o switch actual. Si se le
pasa un parámetro numérico se le indica de cuántos
niveles de anidamiento ha de salir.
$i = 0;
while (++$i)
switch ($i % 3) {
continue
Se utiliza en los bucles para saltarnos el resto de
la iteración actual y comenzar con una nueva. También
admite un parámetro que indicará el número de niveles
de bucle que ha de saltarse.
for (;;) {
if (($i % 2) == 0) continue 2;
$j[$i] = 0;
do {
$k++;
$k[$j] = 0;
$i++;
require() e include()
La estructura require() equivale a la directiva
#include del lenguaje C; se sustituye ella misma por
el contenido del archivo pasado como argumento. En el
caso de requiere() el archivo se lee como si fuera
código HTML, así que si queremos que algo se ejecute
debe estar marcado como código PHP.
Por su parte, la estructura include() ejecuta el
código contenido en el archivo, y acepta como
parámetro incluso una variable con el nombre del
fichero.
Funciones
Definición de funciones
La sintaxis de definición de funciones es bastante
simple:
function nombre_funcion(argumentos) {
cuerpo de la función
Un ejemplo:
function incrementa($i) {
$i++;
Paso de parámetros
Hay varios aspectos a comentar a cerca de los
argumentos de las funciones. Para empezar, PHP
soporta el paso de parámetros por:
• valor: se hace una copia del valor pasado en una
nueva variable que será local a la función, y
cuya modificación no afectará a la variable
pasada.
• referencia: la variable local que recoge el
argumento se convierte en un alias de la
variable pasada. Toda modificación que sufra su
valor dentro de la función tendrá su reflejo en
la variable original.
function incrementa($parametro1) {
$parametro1++;
$cuenta = 0;
incrementa($cuenta);
Incrementando parametro a 1
El valor de cuenta es 0
function incrementa(&$parametro1){
$parametro1++;
}
La segunda es poner el símbolo & cuando se llame a la
función.
$cuenta = 0;
incrementa(&$cuenta);
Incrementando parametro a 1
El valor de cuenta es 1
Devolución de valores
Las funciones pueden devolver valores, fruto de su
ejecución. Dichos valores pueden asignarse a
variables o, por el contrario, ignorarse. Para la
devolución de un valor se utiliza la palabra
reservada return.
return $a + $b;
/* devuelve la suma de $a y $b
suma($resultado, 44);
function incrementa($numero = 1) {
$numero++;
echo incrementa();
echo incrementa(5);
Devolviendo un 2;
Devolviendo un 6;
$num = func_num_args();
$lista = func_get_args();
Funciones variables
Si ponemos los paréntesis tras el nombre de una
variable, PHP tratará de ejecutar una función con el
mismo nombre que el valor almacenado por la variable.
Viene a ser como sustituir la variable por su valor.
En el siguiente ejemplo, vemos como podemos invocar a
la función del ejemplo anterior por medio de este
curioso método.
$nombre_funcion = "imprime_lista";
$nombre_funcion(1,3,4,5,1,"h");
class nombre {
var variables;
class vector {
/* constructor */
$this->x = $cx;
$this->y = $cy;
function imprime() {
print("($this->x, $this->y)");
}
function pone_x($cx) {
$this->x = $cx;
function pone_y($cy) {
$this->y = $cy;
$v = new vector;
$v->imprime();
$v->pone_x(5);
$v->imprime();
(0,0)(5,0)
$this->x = $cx;
$this->y = $cy;
$this->ox = $ox;
$this->oy = $oy;
function imprime_o() {
print("($this->ox, $this->oy)");
function pone_ox($ox) {
$this->ox = $ox;
function pone_oy($oy) {
$this->oy = $oy;
$v = new vector_extendido(1,2,0,0);
$v->pone_x(5);
$v->pone_ox(2);
$v->imprime();
$v->imprime_o();
Y su salida sería:
(5,2)(2,0)
Algunas funciones de PHP
En este capítulo no van a incluirse todas y cada una
de las funciones que soportan PHP y sus módulos. Se
trata de crear una guía general de las funciones más
comunes del lenguaje.
Funciones básicas
echo y print
$valor = 52;
Funciones de vectores
Ya hemos visto con anterioridad el manejo de vectores
así como su inicialización. En este apartado vamos a
estudiar una serie de funciones que van a simplificar
el manejo de vectores. Además, prestaremos especial
atención a una función de inicialización que aparece
en esta sección.
array()
);
El resto de funciones
Devuelve el vector
vectores A;
array_merge() concatenación de los
B, ...
vectores A, B, ...
Ordena un vector
asort() vector V manteniendo la asociación
clave-valor
Devuelve el número de
count() gen V
elementos de una variable
Devuelve verdadero si A se
gen A;
in_array() encuentra en V; Falso en
vector V
otro caso
Devuelve el elemento
pos() vector V señalado por el puntero
interno de V
Retrocede el puntero
prev() vector V interno de un vector V a la
posición anterior
Devuelve el número de
Sizeof() vector V
elementos de V
Funciones de cadenas
PHP ofrece multitud de funciones para el manejo de
cadenas. En esta sección mostramos sólo las más
utilizadas.
Devuelve la posición de la
strpos() cad A, B
primera aparición de B en A
Sustituye en A la subcadena
cad A, B;
substr_replace() desde C hasta C+D por la
ent C, D
subcadena B
Funciones de variables
Devuelve verdadero si A es un
is_array() gen A
vector.
is_float() /
Devuelve verdadero si A es un
is_double() / gen A
real.
is_real()
is_int() /
Devuelve verdadero si A es un
is_integer() / gen A
entero.
is_long()
Devuelve verdadero si A es un
is_object() gen A
objeto.
gen A; cad
settipo() Fuerza la variable A al tipo B
B
Cuenta de administración de la BD
[localhost]$ su
[localhost]$ exit
Inicialización y arranque de la BD
[localhost]$ su postgres
[localhost]$ initdb
[localhost]$ cd
Dando privilegios a la BD
Suponemos que tenemos una base de datos llamada
prueba, con una tabla llamada direcciones
[localhost]$ su postgres
prueba=> TO nobody;
prueba=> \z
prueba=> \q
[localhost]$ exit
[localhost]$ exit
Ejemplos
Lo primero que tenemos que hacer es comprobar que PHP
funciona bien. Para ello podemos crear un archivo
index.php en nuestro catalogo web /home/httpd/html/
con las siguientes lineas:
<HEAD>
</HEAD>
<BODY>
<?php
?>
</BODY>
</HTML>
Acceso a PostgreSQL
<HTML>
<HEAD>
</HEAD>
<BODY>
<?php
/* Conexión a PostgreSQL */
$conexion = pg_pconnect("host=servidor.domain.es
port=5432
dbname=prueba");
if (!$conexion) {
echo "<CENTER>
Problemas de conexión con la base de
datos.
</CENTER>";
exit;
SQL en $resultado_set */
$filas = pg_NumRows($resultado_set);
pg_close($conexion);
?>
</BODY>
</HTML>
Esta página web debería de presentar la información
contenida en la tabla direcciones de la base de datos
prueba. Y a partir de aquí solamente tienes que leer
la documentación y usar vuestra imaginación para
crear páginas web dinámicas, actualizadas y que
presenten la información contenida en vuestras bases
de datos.
A continuación presentamos un formulario PHP que
recibe datos desde el teclado hacia la tabla de la
base de datos:
<html>
<head>
</head>
</body>
</html >
<html>
<head>
</head>
<body>
<?php
print("<p>Nombre: <b>$first_name</b>\n");
print("<br>Apellidos: <b>$last_name</b>\n");
print("<br>Dirección: <b>$address</b>\n");
print("<br>Ciudad: <b>$city</b>\n");
print("<br>Estado: <b>$state</b>\n");
print("<br>Teléfono: <b>$home_phone</b>\n");
?>
</body>
</html>
<?php
if(isset($f_name)):
if(isset($date)):
$old_date = $date;
else:
endif;
endif;
?>
<html>
<head>
</head>
<body>
<?php
if(isset($f_name)):
?>
<br>La última vez que nos visitó fue <?php print $old_date ?>.</h3>
<?php
else:
?>
</form>
<?
endif;
?>
</body>
</html>
<?
include("head.inc");
head("$title");
?>
<table width="600">
<tr><td>
<table>
<tr><td width="300">
</td>
<td valign="TOP">
</tr></td>
</table>
</td></tr>
<tr><td>
<!—El pié de página aquí -->
</tr></td>
</table>
</body>
</html>
<?
function head($title) {
?>
<html>
<head>
</head>
<body background="images/stitch_bg.gif">
<p>
<?
function headline($headline) {
?>
<?
?>