Curso Tallerdeprogramación Web
Curso Tallerdeprogramación Web
Curso Tallerdeprogramación Web
Taller de
Programación Web
(HTML, JavaScript, CSS, PHP, MySQL y AJAX)
AREQUIPA – PERU
2016
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
1
Lección 1. Tecnologías de desarrollo Web
Introducción.
URL (Uniforme Resource Locator)
Uso y Formato del URL
Servicios: http, https, ftp, malito, etc.
Estructura de HTML
Proyecto: Modelado de BD. Sistema de alquiler de Softwares, Música y Películas.
Introducción
En la actualidad el desarrollo de páginas Web esta en su mayor auge, por ende las tecnologías
de desarrollo Web también han crecido considerablemente, pero no se puede negar que el
fundamento principal esta basado en HTML.
Es un método universal para determinar las direcciones de los recursos de Internet. Cada
dirección de Internet Debe ser única, y está formada por tres partes: Protocolo, Host y
Directorio.
Con la WWW se pretende unificar el acceso a información de servicios que antes eran
incompatibles entre sí, tratando de conseguir que todos los servicios de Internet sean
accesibles a través de la WWW, de esta forma desde un mismo programa se puede tener
acceso a todos los recursos de una forma uniforme y permite que los documentos HTML
incluyan enlaces a otras fuentes de información en servicios como FTP, gopher, WAIS, etc...
Las URL se utilizan para definir el documento de destino de los hiperenlaces, para referenciar
los gráficos y cualquier otro fichero que se desee incluir dentro de un documento HTML. Cada
elemento de Internet tendrá una URL que lo defina, ya se encuentre en un servidor de la
WWW, FTP, gopher o las News.
El camino será la ruta de directorios que hay que seguir para encontrar el documento que se
desea referenciar. Para separar los subdirectorios utilizaremos la barra de UNIX /, se usa por
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
2
convenio al ser este tipo de maquinas las más usadas como servidores. El nombre de los
subdirectorios y del fichero referenciado puede ser de más de ocho caracteres y se tendrá en
cuenta la diferencia entre mayúsculas y minúsculas en el nombre.
La extensión de los ficheros es también importante, ya que por ella sabe el servidor el tipo de
documento que se accede e indica al cliente (navegador) el modo en que debe tratarse ese
documento.
Ejemplo:
http://www.sil.edu.pe/correo
El Protocolo
HTTP es para acceder a archivos de un servidor Web. Define la forma de acceso al
recurso. Determina la aplicación con la que el navegador accede al recurso.
Directorio
Indica la ubicación del recurso en el dominio.
Servicios
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
3
ESTRUCTURA DE HTML
Un documento HTML está definido por una etiqueta de apertura <HTML> y una etiqueta de
cierre </HTML>. Dentro de este se dividen dos partes fundamentales la cabecera, delimitada
por la etiqueta <HEAD> y el cuerpo, delimitado por la etiqueta <BODY>. Por tanto la estructura
de un documento HTML será:
<HTML>
<HEAD>
Definiciones de la cabecera
</HEAD>
<BODY>
Instrucciones HTML
</BODY>
</HTML>
Ninguno de estos elementos es obligatorio, pudiendo componer documentos HTML que se
muestren sin ningún problema sin incluir estas etiquetas de identificación, pero para una
adecuada estructuración y delimitación se debe tomar en cuenta la estructura.
La cabecera, está delimitado por las etiquetas <HEAD> y </HEAD>, en esta se incluirán las
definiciones generales que afectarán a todo el documento. Todas sus etiquetas se utilizarán
solo en casos muy determinados, solo la etiqueta TITLE tiene un uso general. A continuación
se citan los distintos componentes que pueden formar la cabecera de un documento HTML
Especificará el título del documento HTML, todo documento HTML debe tener un titulo. Dentro
de esta etiqueta no se podrá usar ninguna de las restantes etiquetas HTML. El título se
muestra en la parte superior de la ventana del programa navegador.
Especificará la URL que se tomará como base del documento HTML, esta se utilizará para las
referencias a URL relativas, que se encuentren en los hiperenlaces y en las referencias de las
imágenes. Presenta un atributo HREF, que indicará la URL base del documento, el formato
será el siguiente:
<BASE HREF="URL">
El formato es el siguiente:
Se indica el número de segundos que deben pasar antes del refresco y el documento HTML
que sustituye al actual. Si se indica cero segundos la transición entre uno y otro documento
será inmediata. Si no se indica URL el documento actual se refrescará.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
4
Ejemplo.
El ejemplo muestra una página con una imagen y texto, que al término de 30 segundos pasa
automáticamente al URL http://www.google.com.pe.
<HTML>
<HEAD>
<TITLE> Mi página Web en HTML </TITLE>
<META HTTP-EQUIV="refresh" CONTENT="30;URL=http://www.google.com.pe">
</HEAD>
<BODY>
<CENTER>
<MARQUEE>
<IMG SRC="CATROSES.JPG"><BR><H1>Mi gato</H1><BR>
¡¡¡ Bienvenido a mi página!!!
</MARQUEE>
</CENTER>
</BODY>
</HTML>
Actividad
Detalle.
La página Web inicialmente debe mostrar una página denominado index.htm donde se
observe una presentación muy breve del álbum, autor y lema.
Las páginas sucesivas deben mostrarse en relación al título de la imagen, cada página
debe tener un título y una breve reseña del contenido.
Todo el proyecto debe hallarse en una carpeta denominada proyectoAlbum y las
imágenes deben hallarse en una carpeta denominada img.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
5
Lección 2. Diseño de Páginas con HTML
Cuerpo de un documento HTML
Hiperenlaces
Tipos de enlaces
Tablas
Documentos con frames
Proyecto: Diseño de página maestra
El cuerpo de un documento HTML estará delimitado por las etiquetas <BODY> y </BODY> y
en el se incluirán todas las instrucciones HTML y el texto que forman el documento. Entre otros
tenemos los siguientes atributos.
Atributos de <BODY>
ATRIBUTO DESCRIPCIÓN
BACKGROUND="URL": Imagen de fondo
BGCOLOR=#rrvvaa ó nombre del color color del fondo
TEXT=#rrvvaa ó nombre del color. color del texto
LINK=#rrvvaa ó nombre del color. color hiperenlaces no accedidos
VLINK=#rrvvaa ó nombre del color. color hiperenlaces ya accedidos
Ejemplo:
<BODY BACKGROUND= http://www.img.es/fondos/fondo1.gif BGCOLOR=blue TEXT=white LINK=FF0000 VLINK=008200>
ATRIBUTO DESCRIPCIÓN
<HR Align=LEFT|RIGTH|CENTER Regla horizontal. Noshade (No muestra la
NOSHADE SIZE=n WIDTH=n> sombra de la barra, evitando el efecto en 3D)
<CENTER> Centrado de texto e imágenes
<H1> - <H6> Cabeceras de títulos
<FONT SIZE=n> Tamaño de la fuente
<BASEFONT SIZE=n> Fuente por defecto
<UL TYPE = DISK ó CIRCLE ó SQUARE >
<LH> Titulo de la lista </LH>
<LI> Elemento 1 Índice con números
<LI> Elemento 2, …
</UL>
<OL START = n TYPE = A ó a ó I ó i ó 0 >
<LH> Titulo de la lista </LH>
<LI> Elemento 1 Índice con letras
<LI> Elemento 2, …
</OL>
HIPERENLACES
Es la utilidad básica del hipertexto, permite indicar zonas de texto o imágenes que si son
seleccionados por el lector del documento nos traslada a otros documentos HTML u otras
zonas del documento actual.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
6
Donde xxx es el destino del enlace (entre comillas). yyy es el texto indicativo en la pantalla del
enlace.
Tipos de Enlaces
En este caso, en lugar de xxx, se sustituye por #marca (origen) que representa el destino del
enlace a donde se desea saltar y en el destino debe escribir el nombre de la marca (la palabra
marca puede ser cualquier palabra). Quedando así la estructura.
Para vincular una página con otra, hay que sustituir en lugar de xxx el nombre y extensión de la
página a vincular.
Si se desea que vaya a un sitio concreto de otra página, en vez de ir al principio de la página a
donde va por defecto, al nombre de la página debe acompañar con el nombre de la marca.
NOTA: Estamos suponiendo que las páginas a acceder están en el mismo directorio. Caso
contrario debe escribir el nombre de la subcarpeta. Ejemplo.
<A HREF=”miWed/segunda.html#final”>
Si queremos enlazar con una página que esté en un servidor distinto al que almacena nuestra
página, es necesario conocer su URL o podría ser una dirección de ftp, gopher, etc. Colocamos
el URL en vez de xxx. Ejemplo
En este caso, sustituimos xxx por mailto: seguido de la dirección de E-Mail. Ejemplo:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
7
TABLAS
Permite la representación de datos por filas y columnas, en forma tabular. La definición es muy
flexible indicando solo los elementos que forman cada fila y columna, calculándose de forma
automática el tamaño que deben tener las celdas. En una tabla podemos introducir todo tipo de
elementos del lenguaje HTML como imágenes, enlaces, texto, listas, cabeceras, formularios,
etc.
Atributos de <TABLE>
ATRIBUTO DESCRIPCIÓN
BORDER =n borde alrededor de la tabla.
Indica el espacio que debe existir entre las
CELLSPACING=n
distintas celdas de la tabla.
Es la cantidad de espacio entre el borde de la
CELLPADDING=n
celda y el contenido de esta.
WIDTH=valor o porcentaje%: ancho de la tabla.
HEIGHT=valor o porcentaje% alto de la tabla.
<CAPTION ALIGN=TOP|BOTTOM>Titulo de la
<CAPTION> Titulo de la tabla
tabla</CAPTION >
<TR ALIGN= LEFT ó CENTER ó RIGHT
<TR> Fila de la tabla
VALIGN= TOP ó MIDDLE ó BOTTOM >
Indica la alineación del elemento dentro de la
ALIGN = LEFT ó CENTER ó RIGHT
celda
Indicará la alineación vertical del dato dentro de
VALIGN = TOP ó MIDDLE ó BOTTOM
la celda
<TH> o <TD> Una celda de la tabla
número de filas que ocupará está celda en la
ROWSPAN
misma fila
número de columnas que ocupará la celda
COLSPAN
actual
NOWRAP no se divida la línea por defecto
Ejemplos:
<P>TABLA <BR>
<TABLE BORDER=5 CELLSPACING=2 CELLPADDING=3>
<TR> <TD> F1C1</TD> <TD> F1C2</TD> <TD> F1C3</TD></TR>
<TR> <TD> F2C1</TD> <TD> F2C2</TD> <TD> F2C3</TD></TR>
<TR> <TD> F3C1</TD> <TD> F3C2</TD> <TD> F3C3</TD></TR>
</TABLE>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
8
DOCUMENTOS CON FRAMES
<HTML>
<HEAD>
…
</HEAD>
<FRAMESET ROWS=Lista de las Filas COLS=Lista de las Columnas>
<FRAME SRC=URL_1 NAME="Nombre de la frame1">
<FRAME SRC=URL_2 NAME="Nombre de la frame1">
...
</FRAMESET>
<NOFRAMES>
Instrucciones HTML que se mostrará en los navegadores que no soporten frames.
</NOFRAMES>
</HTML>
Se definirá solo uno de los atributos, o la lista de filas (ROWS) o la lista de columnas (COLS).
Dentro de la etiqueta NOFRAMES se podrá incluir una explicación de que el documento solo
es visible con los navegadores que soporten frames, o bien incluir una versión del documento
que se muestre sin necesidad de frames.
Atributos de <FRAMESET>
ATRIBUTO DESCRIPCIÓN
NAME Indica el nombre de la frame
MARGINWIDTH ancho del margen, en puntos de la pantalla.
MARGINHEIGHT alto de los márgenes.
SCROLLING=YES, NO, AUTO tendrá o no una barra
NORESIZE no debe ser variada de tamaño por el usuario
TARGET Atributo para indicar la frame de destino
BASE (Se especificar en la Indicará la frame en la que se mostrará por defecto todos
cabecera <HEAD>) los hiperenlaces del documento actual.
<FORM ACTION="url"
Indicará la frame de destino del resultado del formulario.
TARGET="frame">
Actividad
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
9
Lección 3. Diseño de páginas con Formularios
Formularios. Tipos; Texto, Password, Checkbox, Radio, Hidden, Submit, Image, Reset,
Textarea, Select, etc.
Instalación y configuración de Servidor Web Apache.
Instalación y configuración de Base de datos MySQL.
Proyecto: Diseño págs. Esquema con HTML
FORMULARIOS (FORM)
Los formularios son plantillas que permiten la creación de documentos HTML con peticiones de
datos. La principal utilidad de los formularios es la posibilidad de crear cuestionarios,
encuestas, páginas de comentarios o cualquier documento en la que se desee una interacción
por parte del usuario.
Existe una instrucción HTML para la creación de formularios esta es FORM, que tiene la
siguiente estructura:
< FORM ACTION="fichero que trata el formulario" METHOD= POST | GET >
...
Elementos que forman el formulario
...
< /FORM>
ACTION: Indica el programa que se encargará de tratar los datos del formulario. Este
programa debe encontrarse en el servidor y estar escrito en algún lenguaje de programación.
A este programa se pasará como parámetros los datos introducidos en el formulario y retornará
un código HTML que se mostrará tras procesar el formulario.
METHOD: Indica el protocolo usado para el envío de los datos. Con POST envía los datos en
la entrada estándar del programa que trata el formulario y con GET los datos se pasan por
parámetro, en la línea de comandos, al programa. El usar uno u otro método vendrá
determinado por como son tratados los parámetros en el formulario. El método de uso más
normal será POST.
La etiqueta INPUT se utiliza para definir gran variedad de tipos de campos de entrada de datos.
Por lo general serán entradas de texto corto ú opciones. El formato básico es el siguiente:
El atributo TYPE se usa para determinar el tipo de recuadro de dialogo de entrada que se está
definiendo. El atributo NAME especifica el nombre de la variable que se define. Este nombre
será pasado al programa que trata el formulario junto con el valor que le asigno el usuario del
formulario. El atributo VALUE suele especificar el valor de inicialización, que será el valor por
defecto.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
10
Donde:
SIZE, tamaño de la ventana de introducción de texto. Aquí solo se define la parte
visible, pero el usuario podrá introducir más texto si lo desea.
MAXLENGTH, indicar el máximo número de caracteres que se permiten en la entrada.
NAME, indica el nombre de la variable que toma el valor de la entrada y
VALUE, especifica el valor de inicialización del campo.
De todos los atributos solo será obligatorio NAME, siendo el resto opcionales.
Es similar al anterior pero en este caso no se imprimen los caracteres según se van
introduciendo, se muestra un asterisco en vez de los caracteres. Solo se puede ver el número
de caracteres, pero no valor. Se usa para la introducción de claves de acceso (passwords) y
datos que no deban ser vistos al introducirlos. El formato es:
< INPUT TYPE=PASSWORD NAME="variable" VALUE="valor inicial"
SIZE="tamaño" MAXLENGTH="longitud máxima" >
El checkbox es un botón que puede presentar dos estados activado o desactivado. El formato
es el siguiente:
< INPUT TYPE=CHECKBOX NAME="variable" CHECKED> Opción
Se requiere el atributo NAME. Los valores que tomará la variable serán on ó off, dependiendo
de su estado. Si el botón estaba activado cuando se envían los datos del formulario se
enviaran el nombre de la variable y el valor que indique su estado. Si se incluye el atributo
CHECKED el botón se encontrará activado en la inicialización. Si se indica el atributo VALUE,
cuando se envían los datos con el botón activado se mandará la variable con el valor indicado y
en caso contrario no se mandará ningún valor.
Cada una de las etiquetas RADIO tendrá el mismo atributo NAME, y con un distinto atributo
VALUE que será el valor que tome si se selecciona esta opción. Para inicializarlo se usa el
atributo CHECKED que se indicará solo en la opción que se quiera especificar por defecto.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
11
Este botón se usa para enviar los datos del formulario, al pulsar el botón, se acaba la
introducción del formulario y pasa el control al programa indicado en ACTION. En todo
formulario debe existir al menos un botón de SUBMIT, si solo incluye un recuadro del tipo
TEXT no será necesario incluirlo. El formato es:
El atributo VALUE especifica una etiqueta no editable que se mostrará en el botón de envío. Lo
normal es que este botón no envíe datos, pero si se indica el atributo NAME con un nombre de
variable será enviada la variable con el valor de VALUE. Esto puede ser útil si se incluyen
distintos botones de SUBMIT para distinguir cual fue pulsado.
Su funcionalidad es similar al botón de SUBMIT, se usa igualmente para enviar los datos de un
formulario, pero en este caso se presenta una imagen como botón. Igualmente al pulsar sobre
el botón se enviará el formulario. El formato es el siguiente:
El punto de la imagen en el que pulsa el usuario también es pasado al programa intérprete del
formulario, de forma que la imagen igualmente podría ser un mapa sensible. Se pasarán dos
parámetros x e y con las coordenadas del punto donde pulso, siendo el programa interprete el
encargado de determinar la zona donde se pulsó, si se desea.
Este botón se usa para volver a los valores por defecto todos los elementos del formulario,
borrando todos los datos introducidos por el usuario. Su formato es el siguiente:
En este caso se presenta una ventana del tamaño especificado con los atributos ROWS, filas, y
COLS, columnas. El texto expresado entre la etiqueta de inicio y de final sirve para indicar que
texto aparecerá inicialmente en la ventana, en este texto se podrán incluir las marcas del
lenguaje HTML, pero solo se tendrán en cuenta para incluir acentos y otro tipo de efectos.
Se usa para menús simples o múltiples. Define menús de tipo pop-up (menú de barras) y
ofrece una alternativa más compacta al uso de botones RADIO o CHECKBOX. Su formato es
el siguiente:
<SELECT NAME="variable">
< OPTION VALUE=valor1> Opción Primera
< OPTION SELECTED VALUE=valor2> Opción Segunda
. . .
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
12
< OPTION VALUE=valorn> Opción Enésima
</SELECT>
La etiqueta OPTION que contenga el atributo SELECTED será considerada la opción por
defecto, caso de no especificarse ninguna se considerará la primera de las opciones.
Ejemplo:
<HTML>
<HEAD>
<TITLE>Ejemplo de Formulario
</TITLE>
</HEAD>
<BODY>
<H1> Ejemplo de Formulario </H1>
<FORM action="procesa_formulario.php"
method="POST" name="primer_formulario">
<p>Apellidos :
<INPUT type="text" name="apellidos" value="Ingrese Apellidos" size="30" maxlength="30">
<p>Nombres :
<INPUT type="text" name="nombres" value="Ingrese Nombres" size="30" maxlength="30">
<p>Edad :
<INPUT type="text" name="edad" value="" size="2" maxlength="2">
<p>Año de Nacimiento :
<SELECT name="ano">
<OPTION value="2006">2006</OPTION>
<OPTION value="2005" SELECTED>2005</OPTION>
<OPTION value="2004">2004</OPTION>
<OPTION value="2003">2003</OPTION>
</SELECT>
<p>Sexo :
<INPUT type="radio" name="sexo" value="m" checked> Masculino
<INPUT type="radio" name="sexo" value="f"> Femenino
<p>
<INPUT type="reset" value="Borrar">
<INPUT type="submit" value="Enviar Datos">
</FORM>
</BODY>
</HTML>
Actividad.
Diseñe un formulario que permita ingresar los datos que se muestra en la imagen.
Detalle:
El diseño debe incluir el uso de tablas para una adecuada distribución y formato del
formulario.
Los datos para la fecha de
nacimiento debe estar
preestablecida para que el
usuario pueda seleccionar.
El sexo y las opciones deben
también presentar opciones para
seleccionar.
Tiene fondo de celdas de
diferente color.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
13
Instalación y configuración del Servidor Web Apache y Base de datos
MySQL.
Para instalar y configurar el servidor Apache y Base de datos MySQL se debe ejecutar
AppServ. Donde AppServ, trae todo lo necesario para el desarrollo Web, incluyendo las
herramientas para desarrollar Bases de datos con Lenguaje PHP.
Esta versión está formada por 4 paquetes (apache, php, mysql, phpmyadmin), cada uno por
separado sigue sacando nuevas versiones, que podemos instalar por separado o esperar una
nueva versión de AppServ. Por lo general no debemos adelantarnos a instalarlas por
separado porque pueden ser versiones Betas. Es mejor esperar el relance final.
http://www.appservnetwork.com/index.php?newlang=spanish
Instalar AppServ
2) Aparecen los términos y licencia, hay que darle en (I Agree). (Ventana No. 2)
3) Aqui hay que elegir la ruta en donde se instalara AppServ, por recomendacion lo
dejamos en la ruta que viene por defecto, es decir: C:\AppServ, le damos Next.
(Ventana No. 3)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
14
4) En esta parte debemos seleccionar los componentes que vamos a instalar. Por defecto
vienen marcados como disponibles (apache, mysql, php, phpmyadmin). La instalación
nos da la opción de desmarcar alguno, pero es mejor instalar todos para tener el
paquete completo de Servidor y desarrollo Web, le damos Next. (Ventana No. 4)
5) En esta parte debes rellenar el nombre del servidor y el email del administrador del
servidor, en este caso lo dejamos con localhost, luego se escribe un correo válido y
finalmente el puerto 80. (Ventana No. 5)
6) Configuración MySQL Server, en esta parte debemos poner atención, ya que aquí se
debe indicar el Password (Contraseña), para que pueda ser utilizado en nuestros
códigos PHP al llamar a la base de datos. Se escribe el password y luego se confirma
nuevamente y lo demás se deja como aparece en la imagen.
Por defecto el usuario será root, (una vez instalado puedes cambiar, agregar o quitar
usuarios) y la Contraseña es la que acabas de ingresar en el paso anterior, este lo
usaras para la conexión con la base desde tus programas PHP, por eso es de gran
importancia recordar. Le damos Next. (Ventana No. 6
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
15
de datos MySQL, lo dejamos chequeado y le damos Finish, con esto hemos acabado.
(Ventana No. 7)
8) Ahora para comprobar que la instalación del servidor web se instalo correctamente,
abrimos el navegador, y se escribe, http://localhost . Debe salir igual como muestra
en la imagen. Lo único que puede variar es la versión. (Ventana No. 8)
Esta parte es la mas importante, Si instalamos la ruta por defecto usando c:\AppServ,
esta ubicación http://localhost es en realidad c:\AppServ\www Por lo tanto todos los
programas que realicen en PHP, Deben ir dentro de la carpeta "www".
10) Finalmente debe instalar el navegador Mozilla, todo por defecto. (Ventana No. 10)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
16
Lección 4. JavaScript. Operadores y objetos
¿Qué es JavaScript?
JavaScript y HTML
Inclusión de ficheros externos con código JavaScript.
Escritura de cadenas de texto en la página.
Variables, valores, tipos de datos y literales.
Operadores: aritméticos, comparación, condicionales.
Objetos y clasificación en JavaScript
Cuadros de dialogo, tipos de datos, variables.
Proyecto: Diseño págs. Esquema con JS
Introducción
Con JavaScript es posible responder a determinadas acciones del usuario, tales como
pulsaciones del ratón, movimientos del ratón sobre un vínculo, y crear una entrada de datos
(input). También se pueden crear páginas dinámicas que cambian a solicitud del usuario, e
incluso ejecutar sonidos o mini-aplicaciones cuando un usuario entra o abandona la pagina.
Este tipo de acomodación a nivel del cliente permite una enorme capacidad de interactividad
con los usuarios de sus páginas Web.
El lenguaje JavaScript se parece a Java, pero es más sencillo y más fácil de aprender. Una
aplicación en JavaScript puede tener tan solo una línea u ocupar varias páginas. Su
complejidad depende del grado en que sus instrucciones hayan de interaccionar con la pagina
en que se encuentra dicha aplicación. Para la mayoría de los creadores de páginas Web, una
de las primeras utilidades de JavaScript se da en la validación de formularios. Se llama así a la
capacidad de un formulario en HTML para comprobar los datos introducidos por un usuario
antes de presentarlos, hecho que mejora notablemente las prestaciones en su servidor y que a
la vez disminuye la espera del usuario.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
17
JAVASCRIPT Y HTML
Los programas en JavaScript aparecen incrustados en los propios documentos HTML como si
de HTML se tratara. Pueden integrarse básicamente de dos formas:
Como programas propiamente dichos, combinando funciones y sentencias, con el
mismo aspecto que tendría el código de cualquier otro lenguaje.
Introduciendo manejadores de eventos JavaScript en etiquetas HTML.
<html>
<head>
<title>¡Mi primer JavaScript! </title>
</head>
<body>
<br>
Este es un documento HTML normal
<br>
<script language="JavaScript">
document.write("Esto es JavaScript!")
</script> <br>
En HTML otra vez.
</body>
</html>
Este primer programa se limita a escribir en pantalla un determinado texto para lo que se
emplea el código document.write. En este código, document es un objeto creado por el
sistema que hace referencia al propio documento y write es uno de los métodos que
proporciona para interactuar con él. El resultado de cargar este documento en un browser que
interprete JavaScript será la aparición de los dos textos, el escrito en JavaScript y el escrito en
HTML, sin que el usuario sea consciente del proceso.
El resultado seria:
Este script no es muy útil pero sirve para mostrar el uso de la etiqueta <SCRIPT>. Se usa estas
etiquetas en cualquier lugar del documento, tanto en la cabecera como en el cuerpo, aunque si
se declaran funciones es más aconsejable hacerlo en la cabecera.
La etiqueta <SCRIPT>es una extensión de HTML en la que se encierra el texto que compone
el código del programa JavaScript correspondiente de la manera siguiente:
Cualquier browser ignora las etiquetas desconocidas, por lo tanto, aquellos que no soporten
JavaScript ignorarán el comienzo y el final del código del programa (encerrado entre las
etiquetas <SCRIPT> y </SCRIPT>). Para que el resto del código también sea ignorado y no
aparezca en la pantalla del cliente, se encierra entre los símbolos de comentario HTML.
<!-- y -->
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
18
Los navegadores que, por el contrario si lo soporten, interpretarán el código encerrado entre las
etiquetas SCRIPT e ignorará el principio de la línea en el script que comienza con la doble
slash (//) o bien el encerrado entre "/*" y "*/", que son los símbolos de comentarios en este
lenguaje.
Esta etiqueta admite un parámetro opcional LANGUAGE que indica el lenguaje de script que se
ha incrustado en el documento así como la versión de JavaScript.
Los scripts que queremos utilizar en una página suelen escribirse en la misma página,
normalmente entre las etiquetas <head> y </head>. Determinados scripts pueden aparecer
entre las etiquetas <body> y </body> (por ejemplo los gestores de eventos, o scripts que
escriben código on-line), pero lo normal es que la mayoría de las funciones estén en la
cabecera de la página.
Otra posibilidad es la inclusión del código JavaScript en ficheros externos, de extensión ".js"
Estos ficheros son enlazados desde la página HTML donde se utilizan con este código (que
debería ir también entre <head> y </head>).
Por ejemplo:
<SCRIPT SRC="libreria.js"></SCRIPT>
<SCRIPT SRC="http://home.netscape.com/functions/libreria.js">
Document.write(―Texto‖)
Document.writeln(―Texto‖)
VARIABLES Y VALORES
Los nombres de las variables distinguen entre mayúsculas y minúsculas y deben comenzar por
una letra o un guión bajo ( _ ).
Los tipos de valores que puede contener una variable JavaScript son:
números
operadores lógicos (booleanos)
cadenas
La palabra clave null asigna valores nulos a las variables. JavaScript usa un único tipo de datos
para números, es decir, el número JavaScript puede contener enteros, reales y dobles sin tener
que recurrir a tipos diferentes especializados. Además JavaScript maneja los objetos de datos
con el mismo tipo de datos.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
19
Para declarar las variables en JavaScript se utiliza la instrucción var. A cada variable se le
asigna un nombre, y opcionalmente, un valor inicial. Si no se trata de una función, la instrucción
var es opcional, pero se recomienda utilizarla, para evitar una sobreescritura de variables
locales por parte de variables globales.
Las variables locales se declaran generalmente dentro de una función para que sólo esa
función pueda utilizar la variable. Las variables globales se declaran fuera de toda función para
que se puedan utilizar en todas las funciones.
TIPOS DE DATOS
Las aplicaciones en JavaScript pueden manejar numerosos tipos de datos diferentes, pero
JavaScript se las arregla para hacerlo sólo con tres tipos de datos distintos. Además JavaScript
puede decidir por el programador qué tipo de variable debería emplearse durante la ejecución
de la secuencia de órdenes. Los tipos de datos son convertidos automáticamente cuando se
ejecuta la aplicación en JavaScript.
LITERALES
Los valores iniciales que pueden asignarse a las variables se denominan literales. Estos tipos
de valores no son variables, sino, más bien, expresiones constantes de valores para tipos de
datos.
Ejemplos de valores literales:
32
54.94
"programar es divertido"
Actividad
Para definir las páginas siguientes debe utilizar código JavaScript, definidos en la cabecera o
en el cuerpo de la página.
Representar una página con fondos de diferente color utilizando JavaScript.
Declare variables donde se observe conversiones y concatenación de caracteres y
números.
Defina una página que efectué operaciones básicas con valores previamente definidos
en las variables.
Defina variables y operaciones que permitan determinar los valores para cada incógnita
de ecuaciones con tres incógnitas.
Defina una tabla con fotos y texto en las diferentes celdas.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
20
OPERADORES
Operadores de comparación, compara sus operandos y devuelve un valor lógico basado en
si la comparación es verdad o no. Los operando pueden ser numéricos o cadenas.
OPERADORES LÓGICOS
Los operadores lógicos, se utilizan para combinar múltiples comparaciones en una expresión
condicional. Un operador lógico toma dos operandos cada uno de los cuales es un valor true o
false y devuelve un valor true o false.
OPERADORES DE CADENA
Los valores cadena pueden compararse usando los operadores de comparación.
Adicionalmente, se puede concatenar cadenas usando el operador +
OPERADORES DE ASIGNACIÓN
El operador de asignación '=' le permite asignar un valor a una variable.
Operador Descripción
= Asigna valor del operando de la der. a la variable de la izq. Ej: inttotal=100;
+= ó (-=,
*=, /=) Añade valor del operando de la der. a la variable de la izq. Ej. inttotal +=100
Asigna resultado de (operando de la izquierda & operando de la derecha) al
&= ó (|=)
operando de la izquierda.
OPERADORES ESPECIALES
Varios operadores de JavaScript, es difícil clasificarlos en una categoría en particular. Estos
operadores se resumen a continuación.
Operador Descripción
(condicion) ? V1: V2 Si la condición es true, la expresión toma V1 y si es falsa el V2.
New El operador new crea una instancia de un objeto.
This La palabra clave 'this' se refiere al objeto actual.
, El operador ',' evalúa los dos operados.
El operador delete borra un objeto, una propiedad de un objeto, o un
Delete
elemento especificado de un vector.
El operador Void especifica una expresión que será evaluada sin devolver
Void
ningún valor.
Typeof Devuelve el tipo de dato de un operando.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
21
OBJETOS
Una primera clasificación del modelo de objetos lo dividiría en dos grandes grupos. Por una
parte, tendríamos los objetos directamente relacionados con el navegador y las posibilidades
de programación HTML (denominados, genéricamente, objetos del navegador) y por otra
parte un conjunto de objetos relacionados con la estructura del lenguaje, llamados
genéricamente objetos del lenguaje.
Según esta jerarquía, podemos entender el objeto área (por poner un ejemplo) como un objeto
dentro del objeto document que a su vez está dentro del objeto window. Hay que decir que la
notación '.' también se usa para denotar a un objeto que está dentro de un objeto.
Por ejemplo, si queremos hacer referencia a una caja de texto, tendremos que escribir
ventana.documento.formulario.caja_de_texto
Donde ventana es el nombre del objeto window (su nombre por defecto es window),
documento es el nombre del objeto document (cuyo nombre por defecto es document),
formulario es el nombre del objeto forms (veremos que forms es un array) y caja_de_texto es
el nombre del objeto textarea (cuyo nombre por defecto es textarea).
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
22
En la mayoría de los casos podemos ignorar la referencia a la ventana actual (window), pero
será necesaria esta referencia cuando estemos utilizando múltiples ventanas, o cuando
usemos frames. Cuando estemos usando un único frame, podemos pues ignorar
explícitamente la referencia al objeto window, ya que JS asumirá que la referencia es de la
ventana actual.
También podemos utilizar la notación de array para referirnos a algún objeto, por ejemplo,
cuando los objetos a usar no tienen nombre, como en este caso:
document.forms[0].elements[1];
Hace referencia al segundo elemento del primer formulario del documento; este elemento será
el segundo que se haya creado en la página HTML.
CUADROS DE DIALOGO
La manera más sencilla consiste en utilizar el método alert() del objeto window:
alert(“Texto”)
Ejemplo:
<html>
<head> <title>Cuadro de dialogo</title>
</head>
<body>
<script language="javascript">
<!--
alert("Bienvenido a desarrollo con JavaScript")
//-->
</script>
<p> Esta es una página de prueba de la ventana Alert de JavaScript
</body>
</html>
Existen otros tipos de ventanas de dialogo que interactúan con el usuario. El Método
prompt() del objeto window muestra una caja de texto en la que el usuario puede introducir
contenidos. Muestra dos botones. Aceptar y Cancelar. Ejemplo:
El segundo parámetro es el valor predeterminado para la caja de texto, que el usuario podrá
modificar. Este cuadro de dialogo permite capturar datos introducidos por el usuario y realizar
una acción en base a ellos.
<HTML>
<HEAD>
<title>Ejemplo, pagina que pide el nombre </title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
var nombre = prompt("Introduzca su nombre: ","Escriba su nombre")
document.write("<h2> Bienvenido, "+nombre+"</h2>")
//-->
</script>
<p>Seguimos avanzando con JavaScript
</BODY>
</HTML>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
23
Finalmente, para pedir al usuario confirmación en la realización de una acción podemos usar el
método confirm() del objeto window. Este método mostrará un cuadro de dialogo con el
mensaje de texto que le pasemos como parámetro, y dos botones, Aceptar y Cancelar:
Este método devuelve verdadero (true) si se pulsa Aceptar y falso (false) si se pulsa Cancelar.
Ejemplo.
<HTML>
<HEAD>
<title>Ejemplo: Página que pide confirmación </title>
</HEAD>
<BODY>
<h1> Página de confirmación </h1>
<script LANGUAGE="JavaScript">
<!--
var entrar = confirm("¿De verdad desea entrar en esta página de JavaScript?")
if(!entrar)self.close()
//-->
</script>
<p><h2>Has aceptado ingresar y continuar con JavaScript </h2>
</BODY>
</HTML>
//Realiza la pregunta
var rpta_dada = prompt(pregunta, "0")
//comprueba la respuesta
var salida = (rpta_dada == rpta_Correcta)? correcto: incorrecto
//-->
</script>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
//escriba la salida
document.write(salida)
//-->
</script>
</BODY>
</HTML>
Actividad.
Desarrolle un proyecto en el que se muestre el uso de los operadores, métodos y demás temas
tratados hasta la fecha.
Detalles:
Una página Web que permita la verificación antes de abrir la segunda página.
Una página Web que permita el ingreso de datos para efectuar el cálculo del perímetro,
área y volumen de una figura sólida.
Una página Web que exija confirmar el acceso para pasar a la siguiente página.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
24
Lección 5. JavaScript: Estructuras de control - Funciones
Estructuras de control - condicionales
Estructuras de control - bucles
Funciones: Definición, parámetros.
Proyecto: Páginas con cálculo JS.
Estructura if … else
La estructura más utilizada en JavaScript y en la mayoría de lenguajes de programación es la
estructura if. Se emplea para tomar decisiones en función de una condición.
Estructura switch
La estructura switch es la más eficiente, ya que está especialmente diseñada para manejar de
forma sencilla múltiples condiciones sobre la misma variable.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
25
Estructura for...in
Es una estructura derivada del for. Su definición exacta implica el uso de objetos. Una
adaptación a su uso en arrays es la que se muestra en el ejemplo.
Ejemplo 5. Muestra los días de la semana con la instrucción for…in
<script language="javascript">
var dias=["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"];
for(i in dias) {
alert(dias[i]);
}
</script>
Estructura while
Permiten ejecutar las instrucciones incluidas dentro del bucle una o más veces, mientras se
cumpla la condición indicada.
Ejemplo 6.
Suma todos los números menores o iguales que otro número dado, dentro de una tabla.
<script language="javascript">
var resultado = 0;
var numero = prompt("Escribe el número hasta donde debe sumar","5");
var i = 0;
document.write("<table border=3>")
document.write("<tr><th> No. </th><th> Suma </th></tr>")
while(i <= numero) {
resultado += i;
i++;
document.write("<tr> <td>"+(i-1)+"</td><td>"+resultado+"</td>");
}
document.write("</table>")
alert("La suma total de los "+numero+" primeros numeros es: "+resultado);
</script>
Estructura do...while
El bucle de tipo do...while es muy similar al bucle while, con la diferencia que la primera
siempre se ejecuta las instrucciones del bucle.
<script language="javascript">
var resultado = 1;
var factor = 1;
var numero = prompt("Ingrese el número factorial, deseado", 5);
do {
resultado *= factor; // resultado = resultado * numero
document.write("Factorial de: "+factor+" es: "+resultado+" <br>");
factor++;
}
while(factor <= (numero));
alert("El factorial de "+(factor-1)+" es: "+resultado);
</script>
Las sentencias break y continue permiten manipular el comportamiento normal de los bucles
para detener el bucle o para saltarse algunas repeticiones.
break permite terminar de forma abrupta un bucle y
continue permite saltarse algunas repeticiones del bucle.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
26
Ejemplo 8. Uso de la sentencia break:
<script language="javascript">
var cadena = "En un lugar de la Mancha de cuyo nombre no quiero acordarme...";
//split(separador). Parte la cadena en un array de caracteres. Si el carácter separador no
//se encuentra, devuelve un array con un sólo elemento que coincide con la cadena original.
var letras = cadena.split("");//separador="" (nada), todos los caracteres separados por coma
document.write(letras) //resultado de la matriz creada
var resultado = "";
for(i in letras) {
if(letras[i] == 'a') {
break; //Al hallar "a" termina el bucle
//continue; //Al hallar "a" salta para continuar
}
else {
resultado += letras[i];
}
}
alert(resultado); // muestra "En un lug"
</script>
Ejemplo 9.
Uso de la sentencia continue.
En el ejemplo anterior al cambiar break por continue el resultado es:
La utilidad de continue es que permite utilizar el bucle para filtrar los resultados en función de
algunas condiciones o cuando el valor de alguna variable coincide con un valor determinado.
LAS FUNCIONES
Una función es un elemento del programa creado con la finalidad de realizar una determinada
acción. Una función puede ser llamada desde otra. Las funciones, de preferencia, se definen
en la cabecera del documento HTML. Su sintaxis es:
function nombreFunción([parámetros]) {
acciones
}
NOTA.
Los archivos JavaScript externos sólo pueden tener código JavaScript (sin
<script>) y ninguna sentencia HTML y deben ser guardados con extensión ―*.js‖.
Para incluir el fichero externo es necesario usar en la cabecera el atributo SRC
El siguiente script es una función que toma los valores de un formulario, y devuelve en un
cuadro de texto del mismo el valor de la primera casilla elevado a la potencia de la segunda.
<html>
<head><title>Funciones</title>
<script language="javascript">
function potencia() {
var i=0;
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
27
var resul=1;
if(document.formCalculo.elevado.value==0)
{
document.formCalculo.resultado.value=resul; //1
}
else
{
resul=document.formCalculo.base.value;
for(i=1;i<document.formCalculo.elevado.value;i++)
resul*=document.formCalculo.base.value;
//resul=resul*document.formCalculo.base.value; //Equivalente
}
document.formCalculo.resultado.value=resul;
}
</script>
</head>
<body>
<form name="formCalculo">
Número: <input type="text" name="base" value=""><br><br>
Potencia: <input type="text" name="elevado" value=""><br><br>
Resultado: <input type="text" name="resultado" value=""><br><br>
<input type="button" name="poten" Value="Calcular potencia" onClick="potencia()">
</form>
</body>
</html>
<html>
<head><title>Funciones: Par o Impar</title>
<script language="javascript">
var numero = prompt("Introduce un número entero"); //pide número
function parImpar(numero)
{
//document.write("El valor ingresado es: "+numero);
if(numero % 2 == 0) {
return "par";
}
else {
return "impar";
}
}
var resultado = parImpar(numero); //Resultado de función pasa a variable
alert("El número "+numero+" es "+resultado);
</script>
</head>
<body>
</body>
</html>
Actividad.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
28
Lección 6. JavaScript: Eventos
Eventos en JavaScript.
Modelo de eventos en JS
Manejadores de eventos
Obtención de información de evento.
Eventos en JavaScript
Los eventos hacen posible que los usuarios transmitan información a los programas. JavaScript
define numerosos eventos que permiten una interacción completa entre el usuario y las
páginas/aplicaciones Web.
JavaScript permite asignar una función a cada uno de los eventos. De esta forma, cuando se
produce cualquier evento, JavaScript ejecuta su función asociada. Este tipo de funciones se
denominan “event handlers” en inglés y suelen traducirse por “manejadores de eventos”.
Modelos de eventos
Modelo básico de eventos. Este modelo simple de eventos se introdujo para la versión 4 del
estándar HTML y se considera parte del nivel más básico de DOM (Modelo de objetos de
documentos). Aunque sus características son limitadas, es el único modelo que es compatible
en todos los navegadores y por tanto, el único que permite crear aplicaciones que funcionan de
la misma manera en todos los navegadores.
Modelo de eventos estándar. Las versiones más avanzadas del estándar DOM (DOM nivel 2)
definen un modelo de eventos completamente nuevo y mucho más poderoso que el original.
Todos los navegadores modernos lo incluyen, salvo Internet Explorer.
Modelo de eventos de Internet Explorer. Internet Explorer utiliza su propio modelo de
eventos, que es similar pero incompatible con el modelo estándar. Se utilizó por primera vez en
Internet Explorer 4 y Microsoft decidió seguir utilizándolo en el resto de versiones, a pesar de
que la empresa había participado en la creación del estándar de DOM que define el modelo de
eventos estándar.
Manejadores de eventos
Un evento de JavaScript por sí mismo carece de utilidad. Para que los eventos resulten útiles,
se deben asociar funciones o código JavaScript a cada evento. De esta forma, cuando se
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
29
produce un evento se ejecuta el código indicado, por lo que la aplicación puede responder ante
cualquier evento que se produzca durante su ejecución.
Las funciones o código JavaScript que se definen para cada evento se denominan “manejador
de eventos” y como JavaScript es un lenguaje muy flexible, existen varias formas diferentes de
indicar los manejadores:
Manejadores como atributos de los elementos XHTML.
Manejadores como funciones JavaScript externas.
Manejadores “semánticos”.
Ejemplo 1, con onClick. Muestra un mensaje al pinchar con el ratón sobre un botón:
<input type="button" value="Pinchame y verás" onclick="alert('Gracias por pinchar');" />
El evento onLoad es uno de los más utilizados ya que, las funciones que permiten acceder y
manipular los nodos del árbol DOM solamente están disponibles cuando la página se ha
cargado completamente.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
30
Ejemplo 5. El ejemplo inicial sería de la forma siguiente:
<script language=javascript>
function muestraMensaje()
{
alert('Gracias por pinchar');
}
</script>
<input type="button" value="Pinchame y verás" onClick="muestraMensaje()" />
El principal inconveniente de este método es que en las funciones externas no se puede seguir
utilizando la variable this y por tanto, es necesario pasar esta variable como parámetro a la
función:
Ejemplo 6.
<script language=javascript>
function resalta(elemento)
{
switch(elemento.style.borderColor)
{
case 'silver':
case 'silver silver silver silver':
case '#c0c0c0':
elemento.style.borderColor = 'black';
break;
case 'black':
case 'black black black black':
case '#000000':
elemento.style.borderColor = 'silver';
break;
}
}
</script>
<div style="width:150px; height:60px; border:thin solid silver"
onMouseOver="resalta(this)"
onMouseOut="resalta(this)">
Sección de contenidos...
</div>
En el ejemplo anterior, la función externa es llamada con el parámetro this, que dentro de la
función se denomina elemento. La complejidad del ejemplo se produce sobre todo por la forma
en la que los distintos navegadores almacenan el valor de la propiedad borderColor.
Mientras que Firefox almacena (en caso de que los cuatro bordes coincidan en color) el valor
black, Internet Explorer lo almacena como black black black black y Opera almacena su
representación hexadecimal #000000.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
31
Obteniendo información del evento (objeto event)
Normalmente, los manejadores de eventos requieren información adicional para procesar sus
tareas. Si una función por ejemplo se encarga de procesar el evento onClick, quizás necesite
saber en que posición estaba el ratón en el momento de pinchar el botón. El caso más habitual
en el que es necesario conocer información adicional sobre el evento es el de los eventos
asociados al teclado, por ejemplo para diferenciar las teclas normales de las teclas especiales
(ENTER, tabulador, Alt, Ctrl., etc.).
JavaScript permite obtener información sobre el ratón y el teclado mediante un objeto especial
llamado event. Desafortunadamente, los diferentes navegadores presentan diferencias muy
notables en el tratamiento de la información sobre los eventos y sobre todo Internet Explorer.
En resumen, en los navegadores tipo Internet Explorer, el objeto event se obtiene directamente
mediante:
var evento = window.event;
Por otra parte, en el resto de navegadores, el objeto event se obtiene mágicamente a partir del
argumento que el navegador crea automáticamente:
function manejadorEventos(elEvento) {
var evento = elEvento;
}
Si se quiere programar una aplicación que funcione correctamente en todos los navegadores,
es necesario obtener el objeto event de forma correcta según cada navegador. El siguiente
código muestra la forma correcta de obtener el objeto event en cualquier navegador:
function manejadorEventos(elEvento) {
var evento = elEvento || window.event;
}
<script language=javascript>
function resalta(elEvento)
{
var evento = elEvento || window.event;
switch(evento.type)
{
case 'MouseOver': this.style.borderColor = 'black'; break;
case 'MouseOut': this.style.borderColor = 'silver'; break;
}
}
window.onload = function() {
document.getElementById("seccion").onMouseOver = resalta;
document.getElementById("seccion").onMouseOut = resalta;
}
</script>
Actividad.
Investigar y documentar diferentes ejemplos sobre eventos de teclado como ENTER,
Shift, tabulador, Alt, ctrl., etc.
Defina una aplicación con javascript que cuente en número de opciones seleccionadas
de un objeto combo.
Defina contenidos en dos paneles “div” y hacer que esta se inicie con dos colores
diferentes y al ingresar el Mouse o al salir de la zona definida, cambie los bordes a otro
color e imita un mensaje de los colores mostrados.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
32
Lección 7. JavaScript: Validación
Acceso a los formularios. Propiedades, Métodos y eventos básicos.
Validación: Campo obligatorio, opciones de lista, e-mail, fecha, teléfono, checkbox,
radiobuttom.
Proyecto: Páginas con validaciones. Parte 1
También se puede acceder a los formularios y a sus elementos utilizando las funciones DOM
de acceso directo a los nodos. El ejemplo utiliza la función document.getElementById() para
acceder de forma directa a un formulario y a uno de sus elementos:
Ejemplo2.
var formularioPrincipal = document.getElementById("Form5"); //Accede al Form5
var primerElemento = document.getElementById("elemento"); //Accede a elementoX
//de Form5
<form name=" Form5" id="Form5" >
<input type="text" name="elementoX" id="elementoX" />
</form>
Propiedad Descripción
Elements Array que contiene una entrada por cada elemento en el formulario.
Type Indica el tipo de elemento que se trata. Para los elementos de tipo <input> coincide con el valor de su
atributo type. Para las listas desplegables normales (elemento <select>) su valor es select-one, lo que
permite diferenciarlas de las listas que permiten seleccionar varios elementos a la vez y cuyo tipo es
select-multiple. Por último, en los elementos de tipo <textarea>, el valor de type es textarea.
Form es una referencia directa al formulario al que pertenece el elemento. Así, para acceder al formulario de
un elemento, se puede utilizar document.getElementById(”id_del_elemento”).form
Name Obtiene el valor del atributo name de HTML. Solamente se puede leer su valor, por lo que no se
puede modificar.
Value permite leer y modificar el valor del atributo value de XHTML. Para los campos de texto (<input
type=”text”> y <textarea>) obtiene el texto que ha escrito el usuario. Para los botones obtiene el texto
que se muestra en el botón. Para los elementos checkbox y radiobutton no es muy útil.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
33
Los eventos más utilizados en el manejo de los formularios.
Evento Descripción
Onclick evento que se produce cuando se pincha con el ratón sobre un elemento.
Onchange evento que se produce cuando el usuario cambia el valor de un elemento de texto. También se
produce cuando el usuario selecciona una opción en una lista desplegable (<select>). Sin embargo,
el evento sólo se produce si después de realizar el cambio, el usuario pasa al siguiente campo del
formulario, lo que técnicamente se conoce como q‟ “el otro campo de formulario ha perdido el foco”.
Onfocus evento que se produce cuando el usuario selecciona un elemento del formulario.
Onblur evento complementario de onfocus, ya que se produce cuando el usuario ha deseleccionado un
elemento por haber seleccionado otro elemento del formulario. Técnicamente, se dice que el elemento
anterior “ha perdido el foco”.
Validación
La principal utilidad de JavaScript en el manejo de los formularios es la validación de los datos
introducidos por los usuarios. Normalmente, la validación de un formulario consiste en llamar a
una función de validación cuando el usuario pulsa sobre el botón de envío del formulario.
El funcionamiento de esta técnica de validación se basa en el comportamiento del evento
onSubmit de JavaScript. Al igual que otros eventos como onClick y onKeyPress, el evento
onSubmit varía su comportamiento; si devuelve el valor true, el formulario se envía. Sin
embargo, si devuelve el valor false, el formulario no se envía.
El formato básico necesario para validar el formulario:
<form action="" method="" id="" name="" onSubmit="return validacion()">
...
</form>
Primero, si el valor de una variable es null, la variable no contiene ningún valor de tipo objeto,
array, numérico, cadena de texto o booleano. La segunda parte de la condición obliga a que el
texto introducido tenga una longitud superior a cero caracteres. Por último, la tercera parte de
la condición (/^\s+$/.test(valor)) obliga a que el valor introducido no se espacios en blanco.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
34
if( isNaN(valor) )
{
return false;
}
if( !isNaN(valor) ) {
return false;
}
La validación consiste en intentar construir una fecha con los datos proporcionados por el
usuario. La función Date(ano, mes, dia) es una función interna de JavaScript que permite
construir fechas a partir del año, mes y el día de la fecha. Es muy importante tener en cuenta q‟
el número de mes se indica de 0 a 11, siendo 0 el mes de Enero y 11 el mes de Diciembre. Los
días del mes siguen una numeración diferente, ya q‟ el mínimo permitido es 1 y el máximo 31.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
35
Otros ejemplos:
Número Expresión regular Formato
900-900-900 /^\d{3}-\d{3}-\d{3}$/ 9 cifras agrupadas de 3 en 3 y separadas por guiones
if( !elemento.checked )
{
return false;
}
Si se trata de comprobar que todos los checkbox del formulario han sido seleccionados, es más
fácil utilizar un bucle:
Ejemplo 10:
formulario = document.getElementById("formulario");
if(!seleccionado)
{
return false;
}
El anterior ejemplo recorre todos los radiobutton que forman un grupo y comprueba elemento
por elemento si ha sido seleccionado. Cuando se encuentra el primer radiobutton seleccionado,
se sale del bucle y se indica que al menos uno ha sido seleccionado.
Actividad.
Completar el código del formulario en las validaciones de los ejemplos del 3 al 11 en
forma independiente para cada caso.
Integre los ejemplos 3 al 5 y 5-11 en dos aplicaciones de validación.
Integre todos los ejemplos en una sola con un tema relacionado.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
36
Lección 8. Expresiones regulares
Expresiones regulares
Proyecto: Páginas con validaciones. Parte 2
Expresiones Regulares
En la tabla que sigue se muestran los caracteres comodines usados para crear los patrones y
su significado, junto a un pequeño ejemplo de su utilización.
La tabla que sigue describe los modificadores que pueden usarse con los caracteres que
forman el patrón. Cada modificador actúa sobre el carácter o el paréntesis inmediatamente
anterior.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
37
Los siguientes son caracteres especiales o metacaracteres para indicar caracteres de texto no
imprimibles, como puedan ser el fín de línea o un tabulador, o grupos predefinidos de
caracteres (alfabéticos, numéricos, etc...)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
38
Lección 9. Más sobre objetos JavaScript
Objetos de lenguaje: string, date, array, math, etc.
Objetos del navegador: windows, document, frame, link, location, anchor, history,
image, navigator.
Formularios: Radios, text, select, hidden, checkbox, etc.
Proyecto: Páginas con validaciones. Parte 2
El Objeto String
Este objeto nos permite hacer diversas manipulaciones con las cadenas, para que trabajar con
ellas sea más sencillo hay que crear objetos. Cuando asignamos una cadena a una variable,
JS está creando un objeto de tipo String que es el que nos permite hacer las manipulaciones.
Propiedades
length. Valor numérico que nos indica la longitud en caracteres de la cadena dada.
prototype. Nos permite asignar nuevas propiedades al objeto String.
Métodos
anchor(nombre). Crea un enlace asignando al atributo NAME el valor de 'nombre'. Este nombre
debe estar entre comillas " "
big(). Muestra la cadena de caracteres con una fuente grande.
blink(). Muestra la cadena de texto con un efecto intermitente.
charAt(indice). Devuelve el carácter situado en la posición especificada por 'indice'.
fixed(). Muestra la cadena de caracteres con una fuente proporcional.
fontcolor(color). Cambia el color con el que se muestra la cadena. La variable color debe ser
especificada entre comillas: " ", o bien siguiendo el estilo de HTML, es decir "#RRGGBB" donde
RR, GG, BB son los valores en hexadecimal para los colores rojo, verde y azul, o bien puede
ponerse un identificador válido de color entre comillas. Algunos de estos identificadores son "red",
"blue", "yellow", "purple", "darkgray", "olive", "salmon", "black", "white", ...
fontsize(tamaño). Cambia el tamaño con el que se muestra la cadena. Los tamaños válidos son
de 1 (más pequeño) a 7 (más grande). indexOf(cadena_buscada,indice) Devuelve la posición de
la primera ocurrencia de 'cadena_buscada' dentro de la cadena actual, a partir de la posición dada
por 'indice'. Este último argumento es opcional y, si se omite, la busqueda comienza por el primer
carácter de la cadena.
italics(). Muestra la cadena en cursiva.
lastIndexOf(cadena_buscada,indice). Devuelve la posición de la última ocurrencia de
'cadena_buscada' dentro de la cadena actual, a partir de la posición dada por 'indice', y buscando
hacia atrás. Este último argumento es opcional y, si se omite, la busqueda comienza por el último
carácter de la cadena.
link(URL). Convierte la cadena en un vínculo asignando al atributo HREF el valor de URL.
small(). Muestra la cadena con una fuente pequeña.
split(separador). Parte la cadena en un array de caracteres. Si el carácter separador no se
encuentra, devuelve un array con un sólo elemento que coincide con la cadena original. A partir
de NS 3, IE 4 (JS 1.2).
strike(). Muestra la cadena de caracteres tachada.
sub(). Muestra la cadena con formato de subíndice.
substring(primer_Indice,segundo_Indice). Devuelve la subcadena que comienza en la
posición 'primer_Indice + 1' y que finaliza en la posición 'segundo_Indice'. Si 'primer_Indice' es
mayor que 'segundo_Indice', empieza por 'segundo_Indice + 1' y termina en 'primer_Indice'. Si
hacemos las cuentas a partir de 0, entonces es la cadena que comienza en 'primer_Indice' y
termina en 'segundo_Indice - 1' (o bien 'segundo_Indice' y 'primer_Indice - 1' si el primero es
mayor que el segundo).
sup(). Muestra la cadena con formato de superíndice.
toLowerCase(). Devuelve la cadena en minúsculas.
toUpperCase(). Devuelve la cadena en minúsculas.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
var cad = "Hello World",i;
var ja = new Array();
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
39
ja = cad.split("o");
with(document) {
write("La cadena es: "+cad+"<BR>");
write("Longitud de la cadena: "+cad.length+"<BR>");
write("Haciendola ancla: "+cad.anchor("b")+"<BR>");
write("En grande: "+cad.big()+"<BR>");
write("Parpadea: "+cad.blink()+"<BR>");
write("Caracter 3 es: "+cad.charAt(3)+"<BR>");
write("Fuente FIXED: "+cad.fixed()+"<BR>");
write("De color: "+cad.fontcolor("#FF0000")+"<BR>");
write("De color: "+cad.fontcolor("salmon")+"<BR>");
write("Tamaño 7: "+cad.fontsize(7)+"<BR>");
write("<I>orl</I> esta en la posicion: "+cad.indexOf("orl"));
write("<BR>En cursiva: "+cad.italics()+"<BR>");
write("La primera <I>l</I> esta, empezando a contar por detras,");
write(" en la posicion: "+cad.lastIndexOf("l")+"<BR>");
write("Haciendola enlace: "+cad.link("doc.htm")+"<BR>");
write("En pequeño: "+cad.small()+"<BR>");
write("Tachada: "+cad.strike()+"<BR>");
write("Subindice: "+cad.sub()+"<BR>");
write("Superindice: "+cad.sup()+"<BR>");
write("Minusculas: "+cad.toLowerCase()+"<BR>");
write("Mayusculas: "+cad.toUpperCase()+"<BR>");
write("Subcadena entre los caracteres 3 y 10: ");
write(cad.substring(2,10)+"<BR>");
write("Entre los caracteres 10 y 3: "+cad.substring(10,2)+"<BR>");
write("Subcadenas resultantes de separar por las <B>o:</B><BR>");
for(i=0;i<ja.length;i++) write(ja[i]+"<BR>");
}
//-->
</script>
</BODY>
</HTML>
El Objeto Array
Este objeto nos va a dar la facilidad de construir arrays cuyos elementos pueden contener
cualquier tipo básico, y cuya longitud se modificará de forma dinámica siempre que añadamos
un nuevo elemento (y, por tanto, no tendremos que preocuparnos de esa tarea). Para poder
tener un objeto array, tendremos que crearlo con su constructor, por ejemplo, si escribimos:
a=new Array(15);
tendremos creada una variable a que contendrá 15 elementos, enumerados del 0 al 14. Para
acceder a cada elemento individual usaremos la notación a[i], donde i variará entre 0 y N-1,
siendo N el número de elementos que le pasamos al constructor.
También podemos inicializar el array a la vez que lo declaramos, pasando los valores que
queramos directamente al constructor, por ejemplo:
a=new Array(21,"cadena",true);
que nos muestra, además, que los elementos del array no tienen por qué ser del mismo tipo.
Por tanto: si ponemos un argumento al llamar al constructor, este será el número de elementos
del array (y habrá que asignarles valores posteriormente), y si ponemos más de uno, será la
forma de inicializar el array con tantos elementos como argumentos reciba el constructor.
Podríamos poner como mención especial de esto lo siguiente. Las inicializaciones que vemos a
continuación:
a=new Array("cadena");
a=new Array(false);
Inicializan el array a, en el primer caso, con un elemento cuyo contenido es la cadena cadena,
y en el segundo caso con un elemento cuyo contenido es false.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
40
Lo comentado anteriormente sobre inicialización de arrays con varios valores, significa que si
escribimos
a=new Array(2,3);
NO vamos a tener un array con 2 filas y 3 columnas, sino un array cuyo primer elemento será el
2 y cuyo segundo elemento será el 3. Entonces, ¿cómo creamos un array bidimensional? (un
array bidimensional es una construcción bastante frecuente). Creando un array con las filas
deseadas y, después, cada elemento del array se inicializará con un array con las columnas
deseadas. Por ejemplo, si queremos crear un array con 4 filas y 7 columnas, bastará escribir:
a=new Array(4);
for(i=0;i<4;i++) a[i]=new Array(7);
Propiedades
length. Esta propiedad nos dice en cada momento la longitud del array, es decir, cuántos
elementos tiene.
prototype. Nos permite asignar nuevas propiedades al objeto String.
Métodos
join(separador). Une los elementos de las cadenas de caracteres de cada elemento de un array
en un string, separando cada cadena por el separador especificado.
reverse(). Invierte el orden de los elementos del array.
sort(). Ordena los elementos del array siguiendo el orden lexicográfico.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
var j=new Array(2),h=new Array(1), i=new Array(1,"Hola",3);
var b=new Array("Palabra","Letra","Amor","Color","Cariño");
var c=new Array("Otra cadena con palabras");
var d=new Array(false);
j[0]=new Array(3);
j[1]=new Array(2);
document.write(c);
document.write("<P>"+d+"<P>");
document.write("j[0][0]="+j[0][0]+"; j[0][1]="+j[0][1]+
"; j[0][2]="+j[0][2]+"<BR>");
document.write("j[1][0]="+j[1][0]+"; j[1][1]="+j[1][1]+
"; j[1][2]="+j[1][2]);
document.write("<P>h= "+(h[0]='Hola')+"<P>");
document.write("i[0]="+i[0]+"; i[1]="+i[1]+"; i[2]="+i[2]+"<P>");
document.write("Antes de ordenar: "+b.join(', ')+"<P>");
document.write("Ordenados: "+b.sort()+"<P>");
document.write("Ordenados en orden inverso: "+b.sort().reverse());
//-->
</script>
</BODY>
</HTML>
El Objeto Math
Este objeto se utiliza para poder realizar cálculos en nuestros scripts. Tiene la peculiaridad de
que sus propiedades no pueden modificarse, sólo consultarse. Estas propiedades son
constantes matemáticas de uso frecuente en algunas tareas, por ello es lógico que sólo pueda
consultarse su valor pero no modificarlo.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
41
Propiedades
E. Número 'e', base de los logaritmos naturales (neperianos).
LN2. Logaritmo neperiano de 2.
LN10. Logaritmo neperiano de 10.
LOG2E. Logaritmo en base 2 de e.
LOG10E. Logaritmo en base 10 de e.
PI. Número PI.
SQRT1_2. Raíz cuadrada de 1/2.
SQRT2. Raíz cuadrada de 2.
Métodos
abs(numero). Función valor absoluto.
acos(numero). Función arcocoseno. Devuelve un valor cuyas unidades son radianes o NaN.
'numero' debe pertenecer al rango [-1,1], en otro caso devuelve NaN.
asin(numero). Función arcoseno. Devuelve un valor cuyas unidades son radianes o NaN.
'numero' debe pertenecer al rango [-1,1], en otro caso devuelve NaN.
atan(numero). Función arcotangente. Devuelve un valor cuyas unidades son radianes o NaN.
atan2(x,y). Devuelve el ángulo formado por el vector de coordenadas (x,y) con respecto al eje
OX.
ceil(numero). Devuelve el entero obtenido de redondear 'numero' "por arriba".
cos(numero). Devuelve el coseno de 'numero' (que debe estar en radianes) o NaN.
exp(numero). Devuelve el valor enumero.
floor(numero). Devuelve el entero obtenido de redondear 'numero' "por abajo".
log(numero). Devuelve el logaritmo neperiano de 'numero'.
max(x,y). Devuelve el máximo de 'x' e 'y'.
min(x,y). Devuelve el mínimo de 'x' e 'y'.
pow(base,exp). Devuelve el valor baseexp.
random(). Devuelve un número pseudoaleatorio entre 0 y 1.
round(numero). Redondea 'numero' al entero más cercano.
sin(numero). Devuelve el seno de 'numero' (que debe estar en radianes) o NaN.
sqrt(numero). Devuelve la raíz cuadrada de número.
tan(numero). Devuelve la tangente de 'numero' (que debe estar en radianes) o NaN.
El Objeto Date
Este objeto nos va a permitir hacer manipulaciones con fechas: poner fechas, consultarlas...
para ello, debemos saber lo siguiente: JS maneja fechas en milisegundos. Los meses de Enero
a Diciembre vienen dados por un entero cuyo rango varía entre el 0 y el 11 (es decir, el mes 0
es Enero, el mes 1 es Febrero, y así sucesivamente), los días de la semana de Domingo a
Sábado vienen dados por un entero cuyo rango varía entre 0 y 6 (el día 0 es el Domingo, el día
1 es el Lunes, ...), los años se ponen tal cual, y las horas se especifican con el formato
HH:MM:SS.
Podemos crear un objeto Date vacío, o podemos crealo dándole una fecha concreta. Si no le
damos una fecha concreta, se creará con la fecha correspondiente al momento actual en el que
se crea. Para crearlo dándole un valor, tenemos estas posibilidades:
var Mi_Fecha = new Date(año, mes);
var Mi_Fecha = new Date(año, mes, día);
var Mi_Fecha = new Date(año, mes, día, horas);
var Mi_Fecha = new Date(año, mes, día, horas, minutos);
var Mi_Fecha = new Date(año, mes, día, horas, minutos, segundos);
En día pondremos un número del 1 al máximo de días del mes que toque. Todos los valores
que tenemos que pasar al constructor son enteros. Pasamos a continuación a estudiar los
métodos de este objeto.
Métodos
getDate(). Devuelve el día del mes actual como un entero entre 1 y 31.
getDay(). Devuelve el día de la semana actual como un entero entre 0 y 6.
getHours(). Devuelve la hora del día actual como un entero entre 0 y 23.
getMinutes(). Devuelve los minutos de la hora actual como un entero entre 0 y 59.
getMonth(). Devuelve el mes del año actual como un entero entre 0 y 11.
getSeconds(). Devuelve los segundos del minuto actual como un entero entre 0 y 59.
getTime(). Devuelve el tiempo transcurrido en milisegundos desde el 1 de enero de 1970 hasta
el momento actual.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
42
getYear(). Devuelve el año actual como un entero.
setDate(día_mes). Pone el día del mes actual en el objeto Date que estemos usando.
setDay(día_semana). Pone el día de la semana actual en el objeto Date que estemos usando.
setHours(horas). Pone la hora del día actual en el objeto Date que estemos usando.
setMinutes(minutos). Pone los minutos de la hora actual en el objeto Date que estemos usando.
setMonth(mes). Pone el mes del año actual en el objeto Date que estemos usando.
setSeconds(segundos). Pone los segundos del minuto actual en el objeto Date que estemos
usando.
setTime(milisegundos). Pone la fecha que dista los milisegundos que le pasemos del 1 de enero
de 1970 en el objeto Date que estemos usando.
setYear(año). Pone el año actual en el objeto Date que estemos usando.
toGMTString(). Devuelve una cadena que usa las convenciones de Internet con la zona horaria
GMT.
El Objeto Boolean
Este objeto nos permite crear booleanos, esto es, un tipo de dato que es cierto o falso,
tomando los valores true o false. Podemos crear objetos de este tipo mediante su constructor.
Veamos varios ejemplos:
El Objeto Number
Este objeto representa el tipo de dato número con el que JS trabaja. Podemos asignar a una
variable un número, o podemos darle valor, mediante el constructor Number, de esta forma:
Propiedades
MAX_VALUE. Valor máximo que se puede manejar con un tipo numérico
MIN_VALUE. Valor mínimo que se puede manejar con un tipo numérico
NaN. Representación de un dato que no es un número
NEGATIVE_INFINITY. Representación del valor a partir del cual hay desbordamiento negativo
(underflow)
POSITIVE_INFINITY. Representación del valor a partir del cual hay desbordamiento positivo
(overflow)
porque JS nos dirá undefined, tenemos que hacerlo directamente sobre Number, es decir,
tendremos que consultar los valores que hay en Number.MAX_VALUE, Number.MIN_VALUE, etc.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
43
OBJETOS DEL NAVEGADOR
Jerarquía
En esta parte se muestra la jerarquía que presentan los objetos del navegador, atendiendo a
una relación "contenedor - contenido" que se da entre estos objetos. De forma esquemática,
esta jerarquía podemos representarla de esta manera (al lado está la directiva HTML con que
se incluyen en el documento objetos de este tipo, cuando exista esta directiva):
* window
+ history
+ location
+ document <BODY> ... </BODY>
- anchor <A NAME="..."> ... </A>
- applet <APPLET> ... </APPLET>
- area <MAP> ... </MAP>
- form <FORM> ... </FORM>
+ button <INPUT TYPE="button">
+ checkbox <INPUT TYPE="checkbox">
+ fileUpload <INPUT TYPE="file">
+ hidden <INPUT TYPE="hidden">
+ password <INPUT TYPE="password">
+ radio <INPUT TYPE="radio">
+ reset <INPUT TYPE="reset">
+ select <SELECT> ... </SELECT>
- options <INPUT TYPE="option">
+ submit <INPUT TYPE="submit">
+ text <INPUT TYPE="text">
+ textarea <TEXTAREA> ... </TEXTAREA>
- image <IMG SRC="...">
- link <A HREF="..."> ... </A>
- plugin <EMBED SRC="...">
+ frame <FRAME>
* navigator
Según esta jerarquía, podemos entender el objeto area (por poner un ejemplo) como un objeto
dentro del objeto document que a su vez está dentro del objeto window. Hay que decir que la
notación '.' también se usa para denotar a un objeto que está dentro de un objeto.
Por ejemplo, si queremos hacer referencia a una caja de texto, tendremos que escribir
ventana.documento.formulario.caja_de_texto
El objeto window
Se trata del objeto más alto en la jerarquía del navegador (navigator es un objeto
independiente de todos en la jerarquía), pues todos los componentes de una página web están
situados dentro de una ventana. El objeto window hace referencia a la ventana actual. Veamos
a continuación sus propiedades y sus métodos.
Propiedades
closed. Válida a partir de Netscape 3 en adelante y MSIE 4 en adelante. Es un booleano que nos
dice si la ventana está cerrada ( closed = true ) o no ( closed = false ).
defaultStatus. Cadena que contiene el texto por defecto que aparece en la barra de estado
(status bar) del navegador.
frames. Es un array: cada elemento de este array (frames[0], frames[1], ...) es uno de los
frames que contiene la ventana. Su orden se asigna según se definen en el documento HTML.
history. Se trata de un array que representa las URLS visitadas por la ventana (están
almacenadas en su historial).
length. Variable que nos indica cuántos frames tiene la ventana actual.
location. Cadena con la URL de la barra de dirección.
name. Contiene el nombre de la ventana, o del frame actual.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
44
opener. Es una referencia al objeto window que lo abrió, si la ventana fue abierta usando el
método open() que veremos cuando estudiemos los métodos.
parent. Referencia al objeto window que contiene el frameset.
self. Es un nombre alternativo del window actual.
status. String con el mensaje que tiene la barra de estado.
top. Nombre alternativo de la ventana del nivel superior.
window. Igual que self: nombre alternativo del objeto window actual.
Métodos
alert(mensaje). Muestra el mensaje 'mensaje' en un cuadro de diálogo
blur(). Elimina el foco del objeto window actual. A partir de NS 3, IE 4.
clearInterval(id). Elimina el intervalo referenciado por 'id' (ver el método setInterval(),
también del objeto window). A partir de NS 4, IE 4.
clearTimeout(nombre). Cancela el intervalo referenciado por 'nombre' (ver el método
setTimeout(), también del objeto window).
close(). Cierra el objeto window actual.
confirm(mensaje). Muestra un cuadro de diálogo con el mensaje 'mensaje' y dos botones, uno
de aceptar y otro de cancelar. Devuelve true si se pulsa aceptar y devuelve false si se pulsa
cancelar.
focus(). Captura el foco del ratón sobre el objeto window actual. A partir de NS 3, IE 4.
moveBy(x,y). Mueve el objeto window actual el número de pixels especificados por (x,y). A partir
de NS 4.
moveTo(x,y). Mueve el objeto window actual a las coordenadas (x,y). A partir de NS 4.
open(URL,nombre,caracteristicas). Abre la URL que le pasemos como primer parámetro en
una ventana de nombre 'nombre'. Si esta ventana no existe, abrirá una ventana nueva en la que
mostrará el contenido con las características especificadas. Las características que podemos elegir
para la ventana que queramos abrir son las siguientes:
- toolbar = [yes|no|1|0]. Nos dice si la ventana tendrá barra de herramientas (yes,1) o
no la tendrá (no,0).
- location = [yes|no|1|0]. Nos dice si la ventana tendrá campo de localización o no.
- directories = [yes|no|1|0]. Nos dice si la nueva ventana tendrá botones de dirección o
no.
- status = [yes|no|1|0]. Nos dice si la nueva ventana tendrá barra de estado o no.
- menubar = [yes|no|1|0]. Nos dice si la nueva ventana tendrá barra de menús o no.
- scrollbars = [yes|no|1|0]. Nos dice si la nueva ventana tendrá barras de
desplazamiento o no.
- resizable = [yes|no|1|0]. Nos dice si la nueva ventana podrá ser cambiada de tamaño
(con el ratón) o no.
- width = px. Nos dice el ancho de la ventana en pixels.
- height = px. Nos dice el alto de la ventana en pixels.
- outerWidth = px. Nos dice el ancho *total* de la ventana en pixels. A partir de NS 4.
- outerHeight = px. Nos dice el alto *total* de la ventana el pixels. A partir de NS 4
- left = px. Nos dice la distancia en pixels desde el lado izquierdo de la pantalla a la que se
debe colocar la ventana.
- top = px. Nos dice la distancia en pixels desde el lado superior de la pantalla a la que se
debe colocar la ventana.
prompt(mensaje,respuesta_por_defecto). Muestra un cuadro de diálogo que contiene una caja
de texto en la cual podremos escribir una respuesta a lo que nos pregunte en 'mensaje'. El
parámetro 'respuesta_por_defecto' es opcional, y mostrará la respuesta por defecto indicada al
abrirse el cuadro de diálogo. El método retorna una cadena de caracteres con la respuesta
introducida.
scroll(x,y). Desplaza el objeto window actual a las coordenadas especificadas por (x,y). A partir
de NS3, IE4.
scrollBy(x,y). Desplaza el objeto window actual el número de pixels especificado por (x,y). A
partir de NS4.
scrollTo(x,y). Desplaza el objeto window actual a las coordenadas especificadas por (x,y). A
partir de NS4.
setInterval(expresion,tiempo). Evalua la expresión especificada después de que hayan
pasado el número de milisegundos especificados en tiempo. Devuelve un valor que puede ser
usado como identificativo por clearInterval(). A partir de NS4, IE4.
setTimeout(expresion,tiempo). Evalua la expresión especificada después de que hayan pasado
el número de milisegundos especificados en tiempo. Devuelve un valor que puede ser usado como
identificativo por clearTimeout(). A partir de NS4, IE4.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
45
ellas disponibles a partir de NS 4 y cuya explicación remito como ejercicio al lector interesado
en saber más sobre el objeto window.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
<script LANGUAGE="JavaScript">
<!--
function moverVentana()
{
mi_ventana.moveBy(5,5);
i++;
if (i<20)
setTimeout('moverVentana()',100);
else
mi_ventana.close();
}
//-->
</script>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
var opciones="left=100,top=100,width=250,height=150", i= 0;
mi_ventana = window.open("","",opciones);
mi_ventana.document.write("Una prueba de abrir ventanas");
mi_ventana.moveTo(400,100);
moverVentana();
//-->
</script>
</BODY>
</HTML>
El objeto frame
Todos sabemos que la ventana del navegador puede ser dividida en varios frames que
contengan cada uno de ellos un documento en el que mostrar contenidos diferentes. Al igual
que con las ventanas, cada uno de estos frames puede ser nombrado y referenciado, lo que
nos permite cargar documentos en un marco sin que esto afecte al resto.
Realmente cada frame se representa con un objeto window, esto quiere decir que el objeto
frame tiene todas las propiedades y métodos del objeto window.
Propiedades
closed. Válida a partir de Netscape 3 en adelante y MSIE 4 en adelante. Es un booleano que nos
dice si la ventana está cerrada ( closed = true ) o no ( closed = false ).
defaultStatus. Cadena que contiene el texto por defecto que aparece en la barra de estado
(status bar) del navegador.
frames. Es un array: cada elemento de este array (frames[0], frames[1], ...) es uno de los
frames que contiene la ventana. Su orden se asigna según se definen en el documento HTML.
history. Se trata de un array que representa las URLS visitadas por la ventana (están
almacenadas en su historial).
length. Variable que nos indica cuántos frames tiene la ventana actual.
location. Cadena con la URL de la barra de dirección.
name. Contiene el nombre de la ventana, o del frame actual.
opener. Es una referencia al objeto window que lo abrió, si la ventana fue abierta usando el
método open() que veremos cuando estudiemos los métodos.
parent. Referencia al objeto window que contiene el frameset.
self. Es un nombre alternativo del window actual.
status. String con el mensaje que tiene la barra de estado.
top. Nombre alternativo de la ventana del nivel superior.
window. Igual que self: nombre alternativo del objeto window actual.
Métodos
alert(mensaje). Muestra el mensaje 'mensaje' en un cuadro de diálogo
blur(). Elimina el foco del objeto window actual. A partir de NS 3, IE 4.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
46
clearInterval(id). Elimina el intervalo referenciado por 'id' (ver el método setInterval(),
también del objeto window). A partir de NS 4, IE 4.
clearTimeout(nombre). Cancela el intervalo referenciado por 'nombre' (ver el método
setTimeout(), también del objeto window).
confirm(mensaje). Muestra un cuadro de diálogo con el mensaje 'mensaje' y dos botones, uno
de aceptar y otro de cancelar. Devuelve true si se pulsa aceptar y devuelve false si se pulsa
cancelar.
focus(). Captura el foco del ratón sobre el objeto window actual. A partir de NS 3, IE 4.
open(URL,nombre,caracteristicas). Abre la URL que le pasemos como primer parámetro en
una ventana de nombre 'nombre'. Si esta ventana no existe, abrirá una ventana nueva en la que
mostrará el contenido con las características especificadas. Las características que podemos elegir
para la ventana que queramos abrir son las siguientes:
prompt(mensaje,respuesta_por_defecto). Muestra un cuadro de diálogo que contiene una caja
de texto en la cual podremos escribir una respuesta a lo que nos pregunte en 'mensaje'. El
parámetro 'respuesta_por_defecto' es opcional, y mostrará la respuesta por defecto indicada al
abrirse el cuadro de diálogo. El método retorna una cadena de caracteres con la respuesta
introducida.
scroll(x,y). Desplaza el objeto window actual a las coordenadas especificadas por (x,y). A partir
de NS3, IE4.
scrollBy(x,y). Desplaza el objeto window actual el número de pixels especificado por (x,y). A
partir de NS4.
scrollTo(x,y). Desplaza el objeto window actual a las coordenadas especificadas por (x,y). A
partir de NS4.
setInterval(expresion,tiempo). Evalua la expresión especificada después de que hayan
pasado el número de milisegundos especificados en tiempo. Devuelve un valor que puede ser
usado como identificativo por clearInterval(). A partir de NS4, IE4.
setTimeout(expresion,tiempo). Evalua la expresión especificada después de que hayan pasado
el número de milisegundos especificados en tiempo. Devuelve un valor que puede ser usado como
identificativo por clearTimeout(). A partir de NS4, IE4.
En este ejemplo mostramos como acceder a los frames y cómo se pueden cambiar
propiedades de un frame en otro.
<HTML> <HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<frameset cols="50%,*">
<frame name="izq" src="ejem09a.html" scrolling="auto">
<frameset rows="50%,*">
<frame name="der1" src="ejem09b.html" crolling="auto">
<frame name="der2" src="ejem09b.html" scrolling="auto">
</frameset>
</frameset>
</HTML>
ejem09a.html
<HTML> <HEAD>
<title>Ejemplo de JavaScript</title>
<script LANGUAGE="JavaScript">
function color() {
top.frames['der1'].document.bgColor="#FF5500";
}
function cargarYahoo() {
top.frames['der2'].location='http://www.yahoo.com';
}
</script>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
var i=0;
document.write('<h1>Soy el frame: ' + window.name + "</h1><br>");
for (i=0;i<top.frames.length;i++)
document.write('Nombre del frame ' + i + ': ' + top.frames[i].name +
"<br>");
//-->
</script>
<br><br>
<a href="javascript:color()">Cambia el color del frame
<b>der1</b></a><br><br><br>
<a href="javascript:cargarYahoo()">Cargar Yahoo!! en el frame <b>der2</b></a><br>
</BODY> </HTML>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
47
ejem09b.html
<HTML> <HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
document.write('<h1>Soy el frame: ' + window.name + "</h1><br>");
</script>
</BODY> </HTML>
El objeto location
Este objeto contiene la URL actual así como algunos datos de interés respecto a esta URL. Su
finalidad principal es, por una parte, modificar el objeto location para cambiar a una nueva URL,
y extraer los componentes de dicha URL de forma separada para poder trabajar con ellos de
forma individual si es el caso. Recordemos que la sintaxis de una URL era:
protocolo://maquina_host[:puerto]/camino_al_recurso
Propiedades
hash. Cadena que contiene el nombre del enlace, dentro de la URL.
host. Cadena que contiene el nombre del servidor y el número del puerto, dentro de la URL.
hostname. Cadena que contiene el nombre de dominio del servidor (o la dirección IP), dentro de la
URL.
href. Cadena que contiene la URL completa.
pathname. Cadena que contiene el camino al recurso, dentro de la URL.
port. Cadena que contiene el número de puerto del servidor, dentro de la URL.
protocol. Cadena que contiene el protocolo utilizado (incluyendo los dos puntos), dentro de la
URL.
search. Cadena que contiene la información pasada en una llamada a un script, dentro de la URL.
Métodos
reload(). Vuelve a cargar la URL especificada en la propiedad href del objeto location.
replace(cadenaURL). Reemplaza el historial actual mientras carga la URL especificada en
cadenaURL.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
document.write("Location <b>href</b>: " + location.href + "<br>");
document.write("Location <b>host</b>: " + location.host + "<br>");
document.write("Location <b>hostname</b>: " + location.hostname + "<br>");
document.write("Location <b>pathname</b>: " + location.pathname + "<br>");
document.write("Location <b>port</b>: " + location.port + "<br>");
document.write("Location <b>protocol</b>: " + location.protocol + "<br>");
//-->
</script>
</BODY>
</HTML>
El objeto history
Este objeto se encarga de almacenar una lista con los sitios por los que se ha estado
navegando, es decir, guarda las referencias de los lugares visitados. Se utiliza, sobre todo,
para movernos hacia delante o hacia atrás en dicha lista.
Propiedades
current. Cadena que contiene la URL completa de la entrada actual en el historial.
next. Cadena que contiene la URL completa de la siguiente entrada en el historial.
length. Entero que contiene el número de entradas del historial (i.e., cuántas direcciones han
sido visitadas).
previous. Cadena que contiene la URL completa de la anterior entrada en el historial.
Métodos
back(). Vuelve a cargar la URL del documento anterior dentro del historial.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
48
forward(). Vuelve a cargar la URL del documento siguiente dentro del historial.
go(posicion). Vuelve a cargar la URL del documento especificado por posicion dentro del
historial. posicion puede ser un entero, en cuyo caso indica la posición relativa del documento
dentro del historial; o puede ser una cadena de caracteres, en cuyo caso representa toda o parte
de una URL que esté en el historial.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
49
El objeto navigator
Este objeto simplemente nos da información relativa al navegador que esté utilizando el
usuario.
Propiedades
appCodeName. Cadena que contiene el nombre del código del cliente.
appName. Cadena que contiene el nombre del cliente.
appVersion. Cadena que contiene información sobre la versión del cliente.
language. Cadena de dos caracteres que contiene información sobre el idioma de la versión del
cliente.
mimeTypes. Array que contiene todos los tipos MIME soportados por el cliente. A partir de NS 3.
platform. Cadena con la plataforma sobre la que se está ejecutando el programa cliente.
plugins. Array que contiene todos los plug-ins soportados por el cliente. A partir de NS 3.
userAgent. Cadena que contiene la cabecera completa del agente enviada en una petición HTTP.
Contiene la información de las propiedades appCodeName y appVersion.
Métodos
javaEnabled(). Devuelve true si el cliente permite la utilización de Java, en caso contrario,
devuelve false.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
document.write("Navigator <b>appCodeName</b>: " + navigator.appCodeName +
"<br>");
document.write("Navigator <b>appName</b>: " + navigator.appName + "<br>");
document.write("Navigator <b>appVersion</b>: " + navigator.appVersion +
"<br>");
document.write("Navigator <b>language</b>: " + navigator.language + "<br>");
document.write("Navigator <b>platform</b>: " + navigator.platform + "<br>");
document.write("Navigator <b>userAgent</b>: " + navigator.userAgent + "<br>");
//-->
</script>
</BODY>
</HTML>
El objeto document
El objeto document es el que tiene el contenido de toda la página que se está visualizando.
Esto incluye el texto, imágenes, enlaces, formularios, ... Gracias a este objeto vamos a poder
añadir dinámicamente contenido a la página, o hacer cambios, según nos convenga.
Propiedades
alinkColor. Esta propiedad tiene almacenado el color de los enlaces activos
anchors. Se trata de un array con los enlaces internos existentes en el documento
applets. Es un array con los applets existentes en el documento
bgColor. Propiedad que almacena el color de fondo del documento
cookie. Es una cadena con los valores de las cookies del documento actual
domain. Guarda el nombre del servidor que ha servido el documento
embeds. Es un array con todos los EMBED del documento
fgColor. En esta propiedad tenemos el color del primer plano
forms. Se trata de un array con todos los formularios del documento. Los formularios tienen a su
vez elementos (cajas de texto, botones, etc) que tienen sus propias propiedades y métodos, y
serán tratados en el siguiente capítulo.
images. Array con todas las imágenes del documento
lastModified. Es una cadena con la fecha de la última modificación del documento
linkColor. Propiedad que almacena el color de los enlaces
links. Es un array con los enlaces externos
location. Cadena con la URL del documento actual
referrer. Cadena con la URL del documento que llamó al actual, en caso de usar un enlace.
title. Cadena con el título del documento actual
vlinkColor. Propiedad en la que se guarda el color de los enlaces visitados
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
50
Métodos
clear(). Limpia la ventana del documento
open(). Abre la escritura sobre un documento.
close(). Cierra la escritura sobre el documento actual
write(). Escribe texto en el documento.
writeln(). Escribe texto en el documento, y además lo finaliza con un salto de línea
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
<script LANGUAGE="JavaScript">
<!--
var i=1;
var titulooriginal = document.title;
function cambiarTitulo()
{
document.title = titulooriginal.substring(0,i);
i++;
if (i>titulooriginal.length) i=0;
setTimeout('cambiarTitulo()',100);
}
cambiarTitulo();
//-->
</script>
</HEAD>
<BODY>
<script LANGUAGE="JavaScript">
<!--
document.write("Navigator <b>alinkColor </b>: " + document.alinkColor +
"<br>");
document.write("Navigator <b>lastModified</b>: " +document.lastModified +
"<br>");
document.write("Document <b>bgColor</b>: " + document.bgColor + "<br>");
document.write("Document <b>fgColor</b>: " + document.fgColor + "<br>");
document.write("Document <b>referrer</b>: " + document.referrer + "<br>");
//-->
</script>
</BODY>
</HTML>
El objeto link
Este objeto engloba todas las propiedades que tienen los enlaces externos al documento
actual.
Propiedades
target. Es una cadena que tiene el nombre de la ventana o del frame especificado en el
parámetro TARGET
hash. Es una cadena con el nombre del enlace, dentro de la URL
host. Es una cadena con el nombre del servidor y número de puerto, dentro de la URL
hostname. Es una cadena con el nombre de dominio del servidor (o la dirección IP) dentro de la
URL
href. Es una cadena con la URL completa
pathname. Es una cadena con el camino al recurso, dentro de la URL
port. Es una cadena con el número de puerto, dentro de la URL
protocol. Es una cadena con el protocolo usado, incluyendo los : (los dos puntos), dentro de la
URL
search. Es una cadena que tiene la información pasada en una llamada a un script, dentro de la
URL
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<a href="http://www.yahoo.com" target="_blank">Yahoo!!</a><br><br>
<a href="http://www.google.com/search?q=crear+paginas+web">Google!</a><br><br>
<script LANGUAGE="JavaScript">
<!--
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
51
var i;
for (i=0;i<document.links.length;i++)
{
document.write("Target : " + document.links[i].target + "<br>");
document.write("Host : " + document.links[i].host + "<br>");
document.write("Href : " + document.links[i].href + "<br>");
document.write("Search : " + document.links[i].search + "<br>");
document.write("<br><br>");
}
//-->
</script>
</BODY>
</HTML>
El objeto anchor
Este objeto engloba todas las propiedades que tienen los enlaces internos al documento actual.
Propiedades
name. Nombre del ancla.
target. Es una cadena que tiene el nombre de la ventana o del frame especificado en el
parámetro TARGET
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<BODY>
<a name="arriba" target="_top">Inicio</a><br><br>
<script LANGUAGE="JavaScript">
<!--
var i;
for (i=0;i<document.anchors.length;i++)
{
document.write("Name : " + document.anchors[i].name + "<br>");
document.write("Target : " + document.anchors[i].target + "<br>");
document.write("<br><br>");
}
//-->
</script>
<a href="#arriba">Subir</a>
</BODY>
</HTML>
El objeto image
Propiedades
border. Contiene el valor del parámetro 'border' de la imagen.
complete. Es un valor booleano que nos dice si la imagen se ha descargado completamente o no.
height. Contiene el valor del parámetro 'height' de la imagen.
hspace. Contiene el valor del parámetro 'hspace' de la imagen.
lowsrc. Contiene el valor del parámetro 'lowsrc' de la imagen.
name. Contiene el valor del parámetro 'name' de la imagen.
src. Contiene el valor del parámetro 'src' de la imagen.
vspace. Contiene el valor del parámetro 'vspace' de la imagen.
width. Contiene el valor del parámetro 'width' de la imagen.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
52
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
img1 = new Image();
img1.src = "/graficos/nni1b.gif";
img2 = new Image();
img2.src = "/graficos/nni1a.gif";
function cambia(nombre,imagen)
{
nombre.src = imagen.src
}
function dobleancho()
{
imagen1.width=imagen1.width*2;
}
function doblealto()
{
imagen1.height=imagen1.height*2;
}
function mitadancho()
{
imagen1.width=imagen1.width/2;
}
function mitadalto()
{
imagen1.height=imagen1.height/2;
}
//-->
</script>
<BODY>
<a href="" onmouseover="cambia(imagen1,img1)"
onmouseout="cambia(imagen1,img2)"><img src="/graficos/nni1a.gif" width="68"
height="68" border="0" name="imagen1"></a><br><br>
<a href="javascript:dobleancho()">Doble ancho</a><br>
<a href="javascript:doblealto()">Doble Alto</a><br>
<a href="javascript:mitadancho()">Mitad ancho</a><br>
<a href="javascript:mitadalto()">Mitad Alto</a><br>
</BODY>
</HTML>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
53
FORMULARIOS
En esta parte finalizamos el estudio de los objetos del navegador viendo cómo manipular
formularios. Este punto es especialmente importante: si aprendemos correctamente a
manipular todos los objetos de un formulario, podremos hacer funciones que nos permitan
validarlo antes de enviar estos datos a un servidor, ahorrándole la faena de tener que verificar
la corrección de los datos enviados.
El objeto form
Este objeto es el contenedor de todos los elementos del formulario. Como ya vimos al tratar el
objeto document, los formularios se agrupan en un array dentro de document. Cada elemento
de este array es un objeto de tipo form.
Propiedades
action. Es una cadena que contiene la URL del parámetro ACTION del form, es decir, la dirección
en la que los datos del formulario serán procesados.
elements. Es un array que contiene todos los elementos del formulario, en el mismo orden en el
que se definen en el documento HTML. Por ejemplo, si en el formulario hemos puesto, en este
orden, una caja de texto, un checkbox y una lista de selección, la caja de texto será elements[0],
el checkbox será elements[1] y la lista de selección será elements[2].
encoding. Es una cadena que tiene la codificación mime especificada en el parámetro ENCTYPE
del form.
method. Es una cadena que tiene el nombre del método con el que se va a recibir/procesar la
información del formulario (GET/POST).
Métodos
reset(). Resetea el formulario: tiene el mismo efecto que si pulsáramos un botón de tipo RESET
dispuesto en el form.
submit(). Envía el formulario: tiene el mismo efecto que si pulsáramos un botón de tipo SUBMIT
dispuesto en el form.
Vistas ahora las propiedades y métodos del objeto form, pasamos a estudiar, uno por uno,
todos los objetos contenidos en el formulario.
Estos objetos representan los campos de texto dentro de un formulario. Además, el objeto
password es exactamente igual que el text salvo en que no muestra los caracteres introducidos
por el usuario, poniendo asteriscos (*) en su lugar.
Propiedades
dafaultValue. Es una cadena que contiene el valor por defecto que se le ha dado a uno de estos
objetos por defecto.
name. Es una cadena que contiene el valor del parámetro NAME.
value. Es una cadena que contiene el valor del parámetro VALUE.
maxlength. Número máximo de caracteres que puede contener el campo de texto.
Métodos
blur(). Pierde el foco del ratón sobre el objeto especificado.
focus(). Obtiene el foco del ratón sobre el objeto especificado.
select(). Selecciona el texto dentro del objeto dado.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
function Mostrar()
{
alert('Su nombre: ' + formulario.nombre.value);
alert('El password: ' + formulario.pass.value);
}
//-->
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
54
</script>
<BODY>
<form action="procesa.phtml" name="formulario" id="formulario" method="GET">
Nombre: <input type="text" name="nombre" value="Tu nombre" maxlength="15"><br>
Password: <input type="password" name="pass" maxlength="10"><br>
</form>
<a href="javascript:Mostrar();">Mostrar datos</a><br>
</BODY>
</HTML>
El objeto button
Tenemos tres tipos de botones: un botón genérico, 'button', que no tiene acción asignada, y
dos botones específicos, 'submit' y 'reset'. Estos dos últimos sí que tienen una acción asignada
al ser pulsados: el primero envía el formulario y el segundo limpia los valores del formulario.
Propiedades
name. Es una cadena que contiene el valor del parámetro NAME.
value. Es una cadena que contiene el valor del parámetro VALUE.
Métodos
click(). Realiza la acción de pulsado del botón
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
function Mostrar(boton)
{
alert('Ha hecho click sobre el boton: ' + boton.name+', de
valor:'+boton.value);
return true;
}
//-->
</script>
<BODY>
<form action="procesa.phtml" name="formulario" id="formulario" method="GET">
Un boton: <input type="button" name="Boton1" value="El boton 1"
OnClick="Mostrar(this);"><br><br>
Un boton: <input type="button" name="Boton2" value="El boton 2"
OnClick="Mostrar(this);"><br><br>
Un boton: <input type="button" name="Boton3" value="El boton 3"
OnClick="Mostrar(this);"><br>
</form>
</BODY>
</HTML>
El objeto checkbox
Las "checkboxes" nos permiten seleccionar varias opciones marcando el cuadrito que aparece
a su izquierda. El cuadrito pulsado equivale a un "sí" y sin pulsar a un "no" o, lo que es lo
mismo, a "true" o "false".
Propiedades
checked. Valor booleano que nos dice si el checkbox está pulsado o no
defaultChecked. Valor booleano que nos dice si el checkbox debe estar seleccionado por defecto
o no
name. Es una cadena que contiene el valor del parámetro NAME.
value. Es una cadena que contiene el valor del parámetro VALUE.
Métodos
click(). Realiza la acción de pulsado del botón
<HTML>
<HEAD>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
55
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
function Mostrar(boton)
{
msg="Opcion 1:"+formulario.check1.checked+"\n"
msg+="Opcion 2:"+formulario.check2.checked+"\n"
msg+="Opcion 3:"+formulario.check3.checked+"\n"
alert(msg);
}
//-->
</script>
<BODY>
<form action="procesa.phtml" name="formulario" id="formulario" method="GET">
</form>
<A href="javascript:Mostrar()">Ver valores</A>
</BODY>
</HTML>
El objeto radio
Al contrario que con los checkbox, que nos permiten elegir varias posibilidades entre las dadas,
los objetos radio sólo nos permiten elegir una de entre todas las que hay. Están pensados para
posibilidades mútuamente excluyentes (no se puede ser a la vez mayor de 18 años y menor de
18 años, no se puede estar a la vez soltero y casado, etc.).
Propiedades
checked. Valor booleano que nos dice si el radio está seleccionado o no.
defaultChecked. Valor booleano que nos dice si el radio debe estar seleccionado por defecto o
no.
length. Valor numérico que nos dice el número de opciones dentro de un grupo de elementos
radio.
name. Es una cadena que contiene el valor del parámetro NAME.
value. Es una cadena que contiene el valor del parámetro VALUE.
Hay que recordar que para agrupar elementos de tipo radio, todos ellos deben tener el mismo
valor en NAME.
Métodos
click(). Realiza la acción de pulsado del botón.
<HTML>
<HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
function Mostrar(boton)
{
msg="Elementos:"+formulario.edad.length+"\n";
msg+="Menor de 18 años:"+formulario.edad[0].checked+"\n";
msg+="Entre 18 y 60 años:"+formulario.edad[1].checked+"\n";
msg+="Mayor de 60 años:"+formulario.edad[2].checked+"\n";
alert(msg);
}
//-->
</script>
<BODY>
<form action="procesa.phtml" name="formulario" id="formulario" method="GET">
Edad:<br>
<input type="radio" name="edad" value="<18"> Menor de 18 años.<br>
<input type="radio" name="edad" value=">18 y <60" checked> Entre 18 y 60
años.<br>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
56
<input type="radio" name="edad" value=">60"> Mayor de 60 años.<br>
</form>
<A href="javascript:Mostrar()">Ver valores</A>
</BODY>
</HTML>
El objeto select
Este objeto representa una lista de opciones dentro de un formulario. Puede tratarse de una
lista desplegable de la que podremos escoger alguna (o algunas) de sus opciones.
<HTML> <HEAD>
<title>Ejemplo de JavaScript</title>
</HEAD>
<script LANGUAGE="JavaScript">
<!--
function Mostrar(boton)
{
msg="Elementos:"+formulario.edad.length+"\n";
msg+="Edad:
"+formulario.edad.options[formulario.edad.selectedIndex].value+"\n";
alert(msg);
}
//-->
</script>
<BODY>
<form action="procesa.phtml" name="formulario" id="formulario" method="GET">
Edad:<br>
<select name="edad">
<option value="<18" SELECTED>Menor de 18 años</option>
<option value=">18 y <60">Entre 18 y 60 años</option>
<option value=">60">Mayor de 60 años</option>
</select>
</form>
<A href="javascript:Mostrar()">Ver valores</A>
</BODY> </HTML>
El objeto hidden
Es parecido a un campo de texto (objeto text) salvo que no tiene valor por defecto (no tiene
sentido pues el usuario no va a modificarlo) y que no se puede editar.
Propiedades
name. Es una cadena que contiene el valor del parámetro NAME.
value. Es una cadena que contiene el valor del parámetro VALUE.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
57
Lec ción 10. Estilos
Introducción a CSS
Sintaxis CSS, Selectores CSS.
Clases, pseudocódigos y pseudoelementos
Atributos y valores: bordes, fondos, el texto, márgenes, cursores, transparencias y css.
Las reglas AT. La regla @import. Tipos de medio.
Proyecto: Páginas con Estilo
Introducción a CSS
CSS (Cascading Style Sheets) es un lenguaje de estilo
pensado para dar al navegador detalles sobre el
aspecto de una objeto, su principal objetivo es el de
separar el documento (estructura y datos) en sí de el
aspecto del mismo.
Usar CSS tiene muchas ventajas frente a el HTML de hace algunos años, pues además de
permitir definir un estilo más depuradamente, nos permite definir un estilo concreto para un
determinado grupo de elementos, podemos realizar estilos diferentes para la misma página
(como skins), usar el mismo estilo en páginas didtintas...
Tambien podemos agrupar los estilos entre las etiquetas style y asignar cada estilo a un
elemento usando selectores, veamos un ejemplo de documento HTML con etiquetas style:
estilo.htm
000 <html>
001 <head>
002 <title>Este es un ejemplo</title>
003 <style>
004 input {
005 border: 1px solid black;
006 }
007 </style>
008 </head>
009 <body>
010 <input type="text">
011 </body>
012 </html>
Otra opción, es guardar todos los estilos del documento en un archivo aparte al que daremos
la extensión css, y luego llamaremos a este archivo en todas nuestras páginas, veamos un
ejemplo de archivo .css:
estilo.css
000 input {
001 border: 1px solid black;
002 }
estilo.htm
000 <html>
001 <head>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
58
002 <title>Este es un ejemplo</title>
003 <link rel="stylesheet" type="text/css" href="estilo.css">
004 </head>
005 <body>
006 <input type="text">
007 </body> </html>
Y de esta manera, tenemos un documento con todos los estilos de nuestra web, que
podremos incluir en todas nuestras páginas para que tengan un mismo diseño.
Sintaxis CSS
Vamos a ver cómo debemos escribir para crear un CSS válido que los navegadores sean
capaces de interpretar, para ello tendremos que tener en cuenta tres elementos:
atributos - Son una palabra que identifica a que estilo nos referimos
valores - Indican como queremos que sea ese atributo
selectores - Indican sobre que elementos queremos trabajar
La sintaxi de CSS es muy simple, consiste en poner el nombre del atributo, seguido por dos
puntos y el valor que se le asigna, ademas, si queremos escribir varios estilos los
separaremos por punto y coma y/o opcionalmente un salto de línea:
En el caso que estemos trabajando fuera de un objeto, es decir, que no estemos usando el
parametro style="", tendremos que indicar sobre que elemento de la página queremos
aplicar ese estilo, esto lo haremos con selectores.
Escribiremos el selector seguido de los atributos del objeto entre corchetes, veamos un
ejemplo:
000 input {
001 color: #000000;
002 background: #FFFFFF
003 }
Este ejemplo en concreto, se aplicará para todos los elementos input del documento dandole
el color #000000 (negro) y de fondo el #FFFFFF (blanco).
Los valores que aplicamos al atributo, dependerán del atributo en cuestión y se explicarán
más adelante en este mismo curso.
Selectores CSS
Un selector es la parte de un estilo CSS donde se indica sobre que parte del documento
(X)HTML se debe aplicar el estilo, resumiendo, se podría decir que es el nombre del estilo,
ejemplo:
En la anterior regla el selector seria div y para ser un poco mas técnicos, font-size sería el
atributo o propiedad y 18px el valor, a su vez estos dos últimos junto con las corchetas de
inicio y cierre serían la declaración (Recuerdalo a lo largo de este artículo).
Tras esta pequeña info... Disponemos de diferentes tipos de selectores que como es obvio
actúan de forma diferente: Selectores, Selectores Descendientes, Selectores Hermano
Adyacentes, Selectores de Atributos, Selectores de clases, Selectores de Id y Selectores
Hijo... Explicamos cada uno y ponemos un ejemplo.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
59
Pero antes de empezar y para los usuarios mas novatos, sería conveniente entender el
concepto de Elemento Padre y Elemento Hijo si ya lo conoces saltate este párrafo.
Cuando hablo de elemento me refiero a una etiqueta (X)HTML como pueda ser span o div
por lo que si le buscas la lógica el padre es la etiqueta principal que dentro de ella tiene otras
etiquetas, por ejemplo body siempre será un padre y en un código como el siguiente:
El padre sería div y strong el hijo puesto que strong está dentro de div. A su vez un hijo
puede tener otros hijos y así de forma jerárquica.
Selectores
Simplemente selectores, es lo más básico y que ya se ha insinuado al inicio del artículo. Los
selectores hacen referencia a etiquetas de nuestro documento (X)HTML tal y como se ha
mostrado en el primero ejemplo de selector:
Esto indicaría que todos los elementos div de nuestro documento (X)HTML utilizarían el
estilo marcado por este código (tamaño de letra a 18px).
Selectores Descendientes
Este selector afectaría a una etiqueta hijo de un padre de forma descendiente:
Por lo que todos los elementos span de nuestro documento (X)HTML que estén dentro de un
elemento div se verán afectados por esta regla. Vemos un ejemplo:
Observarás como en el resultado se ven dos frases, una con tamaño normal y otra (la
segunda) con un tamaño de 18px
Esta regla afectaría únicamente a h6 pero solo cuando este se encontrara inmediatamente
después de un h5 o cuando h5 y h6 sean hijos del mismo padre. Vemos un ejemplo:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
60
007 </body>
008
Página Siguiente…¿?
Clases, pseudoclases y pseudoelementos
Clases
Una clase es una série de propiedades y métodos que se agrupan en una estructura para
poder aplicarlos conjuntamente a una série de objetos, como CSS no tiene métodos, en este
caso la clase solo contendrá propiedados (atributos) y decidiremos que objetos pertenecen a
esta clase con el atributo HTML class.
000 <html>
001 <head>
002 <title>Mi CSS</title>
003 <style>
004 .miClase {
005 border: 1px solid red;
006 padding: 4 4 4 4;
007 </style>
008 </head>
009 <body>
010 <b>Menú</b>
011 <div class="miClase">Indice</div>
012 <div class="miClase">Descargas</div>
013 <div class="miClase">Links</div>
014 </body>
015 </html>
Como podeis ver, todos los objetos div están en la clase miClase, por lo tanto todos estos
objetos tendrán las mismas propiedades.
Pseudoclases
Las pseudoclases són unas clases especiales de HTML, que se refieren a algunos estados
especiales del elemento, las pseudoclases, igual que los pseudoelementos, se escriben de la
siguiente manera:
000 objeto:pseudoclase {
001 propiedad: valor;
002 }
Las principales pseudoclases són para el objeto A (vínculo), y són las siguientes:
link - Enlace sin explorar
visited - Enlace que ha sido seguido por el usuario
active - Enlace seleccionado por el usuario
hover - Enlace que tiene el ratón encima
Pseudoelementos
Los pseudoelementos són partes determinadas de de un objeto, y tenemos las siguientes.
first-letter - Se refiere a la primera letra del objeto.
first-line - Se refiere a la primera línea del objeto.
De esta manera, con las pseudoclases y pseudoelementos, podemos definir una letra capital
para la primera fila de cada párrafo, un enlace que se recuadra si le ponemos el mouse
encima...
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
61
Atributos y valores
Atributos
Los atributos y valores en CSS, como ya hemos visto en Sintaxis CSS són muy fáciles de
usar, pues tansolo hemos de indicar el nombre del atrbuto seguido de dos puntos (:) y del
valor que tomará el atributo.
Valores
Los valores pueden ser de formato numérico, booleano o cadena de caracteres pero no se
distinguirán entre ellos, así que podre escribir...
000 border: 0;
001 border: 1px solid black;
002 border: false;
...y en todos los casos estaré escribiendo los valores de forma correcta.
En algunos casos, como vemos en el ejemplo con valor '1px solid black', los valores
numéricos són acompañados por una unidad de medida, que puede ser una unidad relativa
(%, em, ex) o una unidad métrica (px, pt, pc, in, mm, cm).
Queda explicar un caso curioso de valor que ya conocemos del HTML que es el valor RGB
(valor de color hexadecimal precedido por almoadilla (#) ).
Bordes
El borde de un objeto, es el espacio que lo limita, y puede ser o no ser visible, CSS nos
permite una gran cantidad de bordes que podemos escojer entre diferentes tipos, grosores y
colores de la siguiente manera:
Grosores
El grosor de un borde se define en píxels, y utilizan el subijo px, si definimos un borde de dos
píxels haremos:
Por otro lado, si no queremos que el borde sea visible, le daremos grosor 0:
Tipos
El tipo de borde define el aspecto del mismo, ya puede ser a rayas, continuo, punteado... a
elegir entre la siguiente lista:
none - Objeto sin borde
hidden - Borde del objeto oculto
dotted - Borde punteado · · ·
dashed - Borde discontínuo - - -
solid - Borde contínuo
double - Borde doble
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
62
groove - Borde con sombra oscura
ridge - Borde con sombra clara
inset - Borde 3D hacia afuera
outset - Borde 3D hacia adentro
Por ejemplo, podemos hacer un borde de puntos de 4 pixels:
Colores
Es el color del borde, puede ser cualquier color HTML:
Fondos
Con CSS se puede personalizar los fondos de cada objeto de nuestra página, permitiendonos
escojer el color de fondo, una imagen, la posición de la imagen, el comportamiento, y las
repeticiones de la misma...
El color de fondo
El color de fondo se define usando el atributo background-color y un color RGB cómo valor.
La imagen de fondo
Podemos definir un objeto con una imagen de fondo usando el atributo background-image y
cómo valor una forma del estilo url(imagen.jpg), por ejemplo:
El comportamiento
El comportamiento de la imagen de fondo cuando usamos las barras de desplazamiento
también se puede definir con el atributo background-attachment, que puede ser:
scroll - La imagen se mueve con el interior del objeto
fixed - La imagen no se mueve
Podemos hacer que el fondo no se desplace al desplazar la página:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
63
000 <div style"background-
attachment: fixed;">ejemplo</div>
Las repeticiones
Podemos hacer que la imagen de fondo se repita usando el atributo background-repeat:
repeat - La imagen se repite vertical y horizontalmente
repeat-x - La imagen se repite horizontalmente
repeat-y - La imagen se repite verticalmente
no-repeat - La imagen no se repite
Podemos hacer que el fondo no se desplace al desplazar la página:
El atributo background
El atributo background es una mezcla de los cinco anteriores y nos permite usar todos sus
posibles valores para definir los fondos de los elementos rapidamente:
El texto
CSS nos permite definir muchos parámetros relativos al texto que pertenece a un
determinado objeto, entre ellos, podemos definir el color del texto, el color del resaltado, su
espaciado...
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
64
La decoración del texto
Usando el atributo text-decoration podemos indicar las siguientes decoraciones:
none - Sin decoración
underline - Texto subrayado
overline - Texto sobre rallado
line-through - Texto tachado
blink - Texto intermitente
Veamos un ejemplo que nos subrayará el texto:
Mayúsculas y minúsculas
Usando el atributo text-transform podemos hacer que el texto se vea en los siguientes
modos:
none - Como está escrito
capitalize - Todas las palabras empiezan por mayúsculas
uppercase - Todo en mayúsculas
lowercase - Todo en minúsculas
Veamos un ejemplo de texto en mayúsculas:
Los espacios
Con white-space podemos indicar cómo se interpretarán los espacios:
normal - Los espacios en blanco són ignorados.
pre - Se respetan los espacios en blanco
nowrap - No se puede cortar la línea por los espacios
Veamos un ejemplo respetando espacios:
Margenes
El margen de un objeto es el espacio que le separa de sus objetos adyacentes tanto por la
parte superior e inferior como por ambos lados.
Definir el margen
Para definir el margen entre un objeto y sus adacentes utilizamos el atributo margin, que
tendrá como valor entre 1 y 4 unidades de medida, veamos un ejemplo:
En este ejemplo, hemos usado sólo una unidad de medida ( 4px ) pero podemos usar hasta
4 separadas por espacios:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
65
000 <div style="border: 4px 4px 4px 4px;">ejemplo</div>
El margen interior
De la misma manera que definimos el margen ( por el exterior del borde ) usando pading
del mismo modo que usamos margin:
000 <div style="margin: 4px; padding: 10px; border: 1px solid red">eje
mplo</div>
Cursores
Los estilos CSS nos permiten la configuracion del cursor que se mostrará cuando el puntero
se situe encima de un determinado objeto, que puede ir desde un vinculo al mismo objeto
body.
Para configurar un cursor podemos usar distintos métodos, el mas sencillo de ellos es usar el
atributo style:
El valor que daremos al estilo cursor (hand en el ejemplo) será uno de los nombres de la
siguiente lista:
+ all-scroll - Cursor con un punto en el centro y 4 flechas cardinales
+ auto - Cursor por defecto del objeto
+ crosshair - Puntero en forma de cruz
+ col-resize - Flechas al este y oeste separadas por una barra vertical
+ default - El cursor por defecto del objeto body
+ hand - Puntero con forma de mano
+ help - Cursor interrogante, tipico de ayuda
+ move - Mouse con forma de cruz aspada
+ no-resize - Mano con una señal pequeña de prohivido
+ not-allowed - Cursor circular con una barra diagonal
+ n-resize - Forma de flecha, cambiaremos n por:
e - Flecha hacia el este
ne - Flecha hacia el noreste
nw - Flecha hacia el noroeste
n - Flecha hacia el norte
sw - Flecha hacia el suroeste
s - Flecha hacia el sur
w - Flecha hacia el oeste
+ pointer - Puntero con forma de mano
+ progress - Cursor default junto un reloj de arena
+ row-resize - Cursor col-resize pero en vertical
+ text - Cursor con forma de escriptura
+ vertical-text - Puntero en forma de escritura vertical
+ wait - Cursor de espera (Reloj de arena)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
66
Para modificar el cursor de un objeto desde javascript, usaremos:
000 <script>
001 document.body.style.cursor = 'crosshair';
002 </script>
Transparencias y CSS
La propiedad opacity introducida en CSS3 permite definir la transparencia de un elemento
con valores entre 0 ( transparente ) y 1 ( visible ), de esta manera deberíamos poder definir
un elemento semitransparente de la así:
000 elemento {
001 opacity: 0.5;
002 }
Pero esto no deja de ser "en teoría" ya que si bien hasta CSS3 no existía una propiedad
estándar para las transparencias, los diferentes navegadores habían desarrollado sus propios
métodos para conseguirlas.
000 elemento {
001 opacity: 0.5;
002 -moz-opacity: 0.5;
003 filter: alpha(opacity=50);
004 }
Comentarios CSS
Comentario
Un comentario es un texto que añadimos a nuestro código para hacerlo mas entendible a la
hora de revisarlo o de que otra persona continue nuestro trabajo, de esta manera podemos
indicar para que se crea casa selector, que es cada atributo... pero que a la hora de la
verdad no influyen en el funcionamiento de un código.
Los comentarios en CSS són como los comentarios multilínea en C, es decir, una barra
inclinada hacia la derecha seguida de un asterisco (/*) para abrir y lo mismo en orden
inverso para cerrar (*/), de esta manera, podemos escribir una o varias línead de
comentario como veremos en el siguiente ejemplo:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
67
Hay que tener cuidado al abrir un comentario dentro de otro comentario, porque
generalmente el navegador detectará la apertura del primer comentario y lo finalizará
cuando acaba el segundo, mirar este ejemplo:
Las reglas AT
Las reglas AT, son agrupaciones de selectores que nos permiten aplicarlas en bloque a un
objeto determinado, su sintaxis es parecida a la de un selector, con la diferencia que están
precedidas por una coma, y pueden contener algunos atributos antes de el primer bracket
({):
000 <style>
001 @media print {
002 .publicidad {
003 visibility: hidden
004 }
005 }
006 </style>
La regla @import
La regla import es una regla que nos permite importar una hoja de estilos CSS externa en el
interior de nuestras etiquetas style, de esta manera podemos aplicar los archivos de esa hoja
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
68
en la página actual.
000 <style>
001 @import url("estilos.css");
002 </style>
El nombre entre dobles comillas el archivo que hay que cargar, hay una sintaxis abreviada y
también aceptada que suprime la clave url, veamos el mismo ejemplo con esta otra sintaxis:
000 <style>
001 @import "estilos.css";
002 </style>
Con cualquiera de los dos casos, el navegador cargaría la hoja de estilos 'estilos.css' y
aplicaría su contenido a la página actual.
000 <style>
001 @import url("impresora.css") print;
002 @import url("normal.css") screen;
003 </style>
Tipos de medio
Un medio describe el soporte en el que se muestra la página a la que se aplica el CSS en
cuestión, podemos desear un estilo diferente según si vemos la página en la pantalla de un
ordenador, en una hoja impresa...
Los usaremos para reglas cómo import o media para definir estilos alternativos para nuestras
páginas.
Internet explorer, soporta los siguientes tipos de medio: all, screen y print.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
69
grid - Incluye braille, emboss, handheld y tty
bitmap - Incluye handheld, print, projection, screen y tv
interactive -Incluye todos menos print y projection
static - Incluye todos
De esta manera, si usamos el tipo de medio bitmap, el estilo se apliacrá para handheld,
print, projection, screen y tv
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
70
Lección 11 y 12. Evaluación
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
71
Lección 13: Fundamentos de PHP
Importancia de PHP y Campos de aplicación de PHP
¿Qué se puede hacer con PHP?
Sintaxis básica. Saliendo de PHP
Tipos de datos. Conversiones
Operadores y estructuras de control
Operadores; aritméticos, asignación, binarios, comparación y ternarios.
Operadores de control de errores, ejecución, incremento y decremento.
Operadores lógicos, cadena y matrices.
Estructuras de control if, elseif, else, endif.
PHP es un lenguaje creado por una gran comunidad de personas. El sistema fue desarrollado
originalmente en el año 1994 por Rasmus Lerdorf como un CGI escrito en C que permitía la
interpretación de un número limitado de comandos. El sistema fue denominado Personal Home
Page Tools y adquirió relativo éxito gracias a que otras personas pidieron a Rasmus que les
permitiese utilizar sus programas en sus propias páginas. Dada la aceptación del primer PHP y
de manera adicional, su creador diseñó un sistema para procesar formularios al que le atribuyó
el nombre de FI (Form Interpreter) y el conjunto de estas dos herramientas, sería la primera
versión compacta del lenguaje: PHP/FI.
Puede apreciarse que no es lo mismo que un script escrito en otro lenguaje de programación
como ASP.NET y C#.NET. En vez de escribir un programa con muchos comandos para crear
una salida en HTML, se escribe el código HTML con cierto código PHP embebido (incluido) en
el mismo, que producirá cierta salida. El código PHP se incluye entre etiquetas especiales de
comienzo y final que nos permitirán entrar y salir del modo PHP.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
72
<head>
<title>Ejemplo</title>
</head>
<body>
<script language="javascript">
document.write("Hola, este es un script JavaScript...");
</script>
</body>
</html>
Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez,
ofrece muchas características avanzadas para los programadores profesionales.
PHP puede hacer cualquier cosa que se pueda hacer con un script, como procesar la
información de formularios, generar páginas con contenidos dinámicos, o enviar y recibir
cookies. Y esto no es todo, se puede hacer mucho más.
Scripts del lado del servidor. Este es el campo más tradicional y el principal foco de
trabajo. Se necesitan tres cosas para que esto funcione. El intérprete PHP (CGI ó
módulo), un servidor web y un navegador.
Scripts en la línea de comandos. Puede crear un script PHP y correrlo sin ningún
servidor web o navegador. Solamente necesita el intérprete PHP para usarlo de esta
manera. Este tipo de uso es ideal para scripts ejecutados regularmente desde cron (en
*nix o Linux) o el Planificador de tareas (en Windows).
PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado,
incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft
Windows, Mac OS X, RISC OS, etc. PHP soporta la mayoría de servidores web de hoy en día,
incluyendo Apache, Microsoft Internet Information Server, Personal Web Server, Netscape e
iPlanet, Oreilly Website Pro server, Caudium, Xitami, OmniHTTPd y muchos otros. De modo
que, con PHP tiene la libertad de elegir el sistema operativo y el servidor de su gusto. También
tiene la posibilidad de usar programación procedimental o programación orientada a objetos.
Con PHP no se encuentra limitado a resultados en HTML. Entre las habilidades de PHP se
incluyen: creación de imágenes, archivos PDF y películas Flash (usando libswf y Ming) sobre la
marcha. También puede presentar otros resultados, como XHTML y archivos XML. PHP puede
autogenerar estos archivos y almacenarlos en el sistema de archivos en vez de presentarlos en
la pantalla.
Otra de las características más potentes y destacables de PHP es su soporte para una gran
cantidad de bases de datos. Escribir un interfaz vía web para una base de datos es una tarea
simple con PHP. Las siguientes bases de datos están soportadas actualmente:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
73
PHP soporta ODBC (el Estándar Abierto de Conexión con Bases de Datos), también cuenta
con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP,
SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros.
Si se usa PHP en el campo del comercio electrónico, son muy útiles las funciones Cybercash,
CyberMUT, VeriSign Payflow Pro y CCVS para sus programas de pago.
También hay otras extensiones como las funciones del motor de búsquedas mnoGoSearch,
utilidades de compresión (gzip, bz2), conversión de calendarios, traducción, etc.
Sintaxis básica
Saliendo de HTML
Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques de código
PHP. De estas cuatro, sólo 2 (<?php. . .?> y <script language="php">. . .</script>) están
siempre disponibles; el resto pueden ser configuradas en el fichero de php.ini para ser o no
aceptadas por el intérprete. Mientras que el formato corto de etiquetas (short-form tags) y el
estilo ASP (ASP-style tags) pueden ser convenientes, no son portables como la versión de
formato largo de etiquetas. Además, si se pretende embeber código PHP en XML o XHTML,
será obligatorio el uso del formato <?php. . .?> para la compatibilidad con XML.
Modo1.
<?php echo("si quieres servir documentos XHTML o XML, haz como aquí"); ?>
Modo2.
<? echo ("esta es la más simple, una instrucción de procesado SGML <br>");
?>
<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"
Modo3.
<script language="php">
echo ("muchos editores (como FrontPage) no
aceptan instrucciones de procesado");
</script>
Modo4.
<% echo ("Opcionalmente, puedes usar las etiquetas ASP"); %>
<%= $variable; # Esto es una abreviatura de "<% echo. . ." %>
El método primero, <?php. . .?>, es el más conveniente, ya que permite el uso de PHP en
código XML como XHTML.
El método segundo no siempre está disponible. El formato corto de etiquetas está disponible
con la función short_tags() (sólo PHP 3), activando el parámetro del fichero de configuración de
PHP short_open_tag, o compilando PHP con la opción --enable-short-tags del comando
configure. Aunque esté activa por defecto en php.ini-dist, se desaconseja el uso del formato de
etiquetas corto.
El método cuarto sólo está disponible si se han activado las etiquetas ASP en el fichero de
configuración: asp_tags.
Tipos de datos
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
74
integer
float (número de punto-flotante, también conocido como 'double')
string
Dos tipos compuestos:
array
object
Y finalmente dos tipos especiales:
resource
NULL
Pseudo-tipos
mixed
number
callback
Para chequear el tipo y valor de una cierta expresión, se debe usar var_dump().
Para una representación legible para los propósitos de depuración, se debe usar gettype().
Para chequear por un cierto tipo, no usar gettype(); en su lugar utilice las funciones is_tipo.
<?php
$bool = TRUE; // un valor booleano
$str = "hola"; // una cadena
$int = 12; // un entero
Si quisiera forzar la conversión de una variable a cierto tipo, puede moldear la variable, o usar
la función settype() sobre ella.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
75
Operadores
Existen tres tipos de operadores. En primer lugar se encuentra el operador unario, el cual
opera sobre un único valor, por ejemplo ! (el operador de negación) o ++ (el operador de
incremento). El segundo grupo se conoce como operadores binarios; éste grupo contiene la
mayoría de operadores que soporta PHP. El tercer grupo consiste del operador ternario: ?:.
Éste debe ser usado para seleccionar entre dos expresiones, en base a una tercera, en lugar
de seleccionar dos sentencias o rutas de ejecución.
Operadores aritméticos
Operador Nombre Resultado
-$a Negación El opuesto de $a.
$a + ó - $b Adición o sustracción Suma o diferencia de $a y $b.
$a * ó / $b Multiplicación o división Producto o cociente de $a y $b.
$a % $b Módulo Resto de $a dividido por $b.
Operadores de asignación
Operador Descripción
$a = $b Asigna a $a el contenido de $b
$a += ó -= $b Le suma o le resta $b a $a
$a *= ó /= $b Multiplica o divide $a por $b y lo asigna a $a
$a .= $b Añade la cadena $b a la cadena $a
Operadores de Comparación
Operador Nombre Resultado
$a == $b Igual TRUE si $a es igual a $b.
$a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo. (A partir de PHP 4)
$a != $b Diferente TRUE si $a no es igual a $b.
$a <> $b Diferente TRUE si $a no es igual a $b.
$a !== $b No idénticos TRUE si $a no es igual a $b, o si no son del mismo tipo. (A partir de PHP 4)
$a <= $b Menor o igual que TRUE si $a es menor o igual que $b.
Si compara un entero con una cadena, la cadena es convertida a un número. Si compara dos
cadenas numéricas, ellas son comparadas como enteros. Estas reglas también se aplican a la
sentencia switch. Ejemplo.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
switch ("a")
{ case 0: echo "Imprime 0"; break;
case "a": echo "Imprime a"; break; // nunca se ejecuta ya que "a" ya ha coincidido con 0
}
?>
Operador Ternario. (expr1) ? (expr2) : (expr3)
Significado:
Si (expr1) evalúa a TRUE entonces asume (expr2), pero si evalúa a FALSE asume (expr3)
<?php
// Ejemplo de uso de: el Operador Ternario
$valor1=0;
$accion = ($valor1==0) ? 'predeterminada': 'No predeterminado';
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
76
echo ($accion);
// La sentencia anterior es idéntica a este bloque if/else
if ($valor1==0)
{ $accion = 'predeterminada';
echo ($accion);
}
else
{ $accion = 'No predeterminada';
echo ($accion);
}
?>
Observación: Note que el operador ternario es una sentencia, y que no evalúa a una variable,
sino al resultado de una sentencia.
Observación: El operador @ trabaja sólo sobre expresiones. Una simple regla de oro es: si
usted puede tomar el valor de algo, entonces puede usar el operador @ sobre ese algo. Por
ejemplo, puede usarlo al inicio de variables, llamadas a funciones y sentencias include(),
constantes, y así sucesivamente. No puede usarlo sobre definiciones de función o clase, ni
sobre estructuras condicionales como if y foreach, y así sucesivamente.
Operadores de ejecución
PHP soporta un operador de ejecución: las comillas invertidas (``). ¡Note que no se trata de
comillas sencillas! PHP intentará ejecutar el contenido entre las comillas como si se tratara de
un comando del intérprete de comandos; su salida será devuelta (es decir, no será
simplemente volcada como salida; puede ser asignada a una variable). El uso del operador de
comillas invertidas es idéntico al de shell_exec(). Ejemplo.
<?php
$salida = `ls -al`;
echo "<pre>$salida</pre>";
?>
Nota: El operador de comillas invertidas es deshabilitado cuando se encuentra activo safe
mode o cuando se deshabilita shell_exec().
Operadores de Incremento/Decremento
Nota: Los operadores de incremento/decremento no afectan a los valores booleanos.
Decrementar valores NULL tampoco tiene efecto, aunque incrementarlos resulta en 1.
Ejemplo Nombre Efecto
++$a Pre-incremento Incrementa $a en uno, y luego devuelve $a.
$a++ Post-incremento Devuelve $a, y luego incrementa $a en uno.
--$a Pre-decremento Decrementa $a en uno, luego devuelve $a.
$a-- Post-decremento Devuelve $a, luego decrementa $a en uno.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
77
<?php
$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i.",\n";
}
?>
El resultado del ejemplo seria: X, Y, Z, AA, AB, AC
Operadores de Lógica
Operador Nombre Resultado
$a and $b Y TRUE si tanto $a como $b son TRUE.
$a or $b O TRUE si cualquiera de $a o $b es TRUE.
$a xor $b O exclusivo (Xor) TRUE si $a o $b es TRUE, pero no ambos.
! $a No TRUE si $a no es TRUE.
$a && $b Y TRUE si tanto $a como $b son TRUE.
$a || $b O TRUE si cualquiera de $a o $b es TRUE.
Operadores de Cadena
Existen dos operadores para datos tipo string. El primero es el operador de concatenación
('.'), el cual devuelve el resultado de concatenar sus argumentas a lado derecho e
izquierdo. El segundo es el operador de asignación sobre concatenación ('.='), el cual
adiciona el argumento del lado derecho al argumento en el lado izquierdo.
<?php
$a = "¡Hola";
$b = $a . "Mundo!";
echo ($b); // ahora $b contiene "¡Hola Mundo!"
$a = "¡Hola ";
$a .= "Mundo!";
echo ($a); // ahora $a contiene "¡Hola Mundo!"
?>
Operadores de Matrices
Ejemplo Nombre Resultado
$a + $b Unión Unión de $a y $b.
$a == $b Igualdad TRUE si $a y $b tienen las mismas parejas llave/valor.
TRUE si $a y $b tienen las mismas parejas llave/valor en el mismo
$a === $b Identidad
orden y de los mismos tipos.
$a != $b No-igualdad TRUE si $a no es igual a $b.
$a <> $b No-igualdad TRUE si $a no es igual a $b.
No-
$a !== $b TRUE si $a no es idéntico a $b.
identidad
El operador + adiciona la matriz del lado derecho a aquél de a lado izquierdo, al mismo tiempo
que cualquier llave duplicada NO es sobrescrita.
<?php
$a = array("a" => "manzana", "b" => "banano");
$b = array("a" => "pera", "b" => "fresa", "c" => "cereza");
$c = $a + $b; // Union de $a y $b
echo "Unión de \$a y \$b: \n"; var_dump($c);
$c = $b + $a; // Union de $b y $a
echo "Unión de \$b y \$a: \n"; var_dump($c);
?>
Cuando sea ejecutado, este script producirá la siguiente salida:
Unión de $a y $b: array(3) { Unión de $b y $a: array(3) {
["a"]=> string(7) "manzana" ["a"]=> string(4) "pera"
["b"]=> string(6) "banano" ["b"]=> string(5) "fresa"
["c"]=> string(6) "cereza" } ["c"]=> string(6) "cereza" }
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
78
<?php
$a = array("manzana", "banano");
$b = array(1 => "banano", "0" => "manzana");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Estructuras de Control
La programación exige en muchas ocasiones la repetición de acciones sucesivas o la elección
de una determinada secuencia definida o dependiente de las condiciones específicas en la
ejecución. Este tipo de acciones pueden ser llevadas a cabo gracias a una gran variedad de
esturas de control presentes en el lenguaje de programación PHP.
Modo 1 Modo 2
<?php <?php
$a=$Valor1; $a=$Valor1;
$b=$Valor2; $b=$Valor2;
Actividad
Diseñe una tabla donde se muestre los resultados de las operaciones básicas
utilizando variables y conversiones en PHP.
Represente una tabla con datos definidos con la función echo () todo en PHP.
Represente un formulario para datos definidos con la función echo () todo en PHP.
Actividad
Defina un formulario SIN VALIDACIÓN para que pueda pasar datos numéricos y estas
sean procesados en un segundo formulario en el servidor. Para evitar errores controle
el ingreso de datos con operadores y estructuras de control.
Defina un formulario PREVIAMENTE VALIDADO para que pueda pasar datos
numéricos y estas sean procesados en un segundo formulario en el servidor.
Defina matrices asociativas y normales (unidimensionales) y realice operaciones de
comparación, adición, etc.
De tres ejemplos donde se muestre el uso de operadores de control de errores.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
79
switch
Debe tener en cuenta que al contrario que otros lenguajes de programación, continue se aplica
a switch y funciona de manera similar a break. Por ejemplo: Si tienes un switch dentro de un
bucle y deseas continuar con el paso siguiente en el bucle externo, debe usar continue 2.
Los siguientes dos ejemplos son dos modos distintos de escribir la misma cosa, uno usa una
serie de sentencias if, y el otro usa la sentencia switch:
<?php
$i=2;
if ($i == 0)
{
print "$i es igual a 0";
}
elseif ($i == 1)
{
print "$i es igual a 1";
}
elseif ($i == 2)
{
print "$i es igual a 2";
}
/////////////////********///////////////
echo "<br>ejemplo con switch <br>";
switch ($i)
{
case 0: print "$i es igual a 0"; break;
case 1: print "$i es igual a 1"; break;
case 2: print "$i es igual a 2"; break;
}
?>
while (bucle)
Ejecuta las sentencias anidadas repetidamente, mientras la expresión while se evalúe como
TRUE. Ejemplo.
<?php
///////////////////************//////////////////
echo ("<p> Ejemplo 2: sintaxis alternativo <br>");
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
80
do..while
Los bucles do..while son muy similares a los bucles while, excepto que las condiciones se
comprueban al final de cada iteración en vez de al principio. Hay una sola sintaxis.
<?php
$i = 0;
do
{
print $i;
}
while ($i>0);
?>
For
Los bucles for son los bucles en los que debe tener mucho cuidado. Sintaxis de un bucle for:
La primera expresión (expr1) se evalúa (ejecuta) incondicionalmente una vez al principio del
bucle.
Al comienzo de cada iteración, se evalúa expr2. Si se evalúa como TRUE, el bucle continúa y
las sentencias anidadas se ejecutan. Si se evalúa como FALSE, la ejecución del bucle finaliza.
Cada una de las expresiones puede estar vacía. Que expr2 esté vacía significa que el bucle
debería correr indefinidamente (PHP implícitamente lo considera como TRUE).
Ejemplos.
<?php
echo ("<p> Ejemplo 1 <br>");
for ($i = 1; $i <= 10; $i++) {
print $i;
}
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
print $i;
$i++;
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
81
Foreach
foreach funciona solamente con matrices y devolverá un error si se intenta utilizar con otro tipo
de datos ó variables no inicializadas. Hay dos sintaxis; la segunda es una extensión menor,
pero útil de la primera:
La primera forma recorre el array dado por expresion_array. En cada iteración, el valor del
elemento actual se asigna a $value y el puntero interno del array se avanza en una unidad (así
en el siguiente paso, se estará mirando el elemento siguiente).
La segunda manera hace lo mismo, salvo que la clave del elemento actual será asignada a la
variable $key en cada iteración.
Observaciones:
Cuando foreach comienza su primera ejecución, el puntero interno a la matriz se reinicia
automáticamente al primer elemento de la matriz. Esto significa que no se necesita llamar
a reset() antes de un bucle foreach.
Hay que tener en cuenta que foreach trabaja con una copia de la matriz especificada y no
la lista en si, por ello el puntero de la lista no es modificado como en la función each(), y
los cambios en el elemento de la matriz retornado no afectan a la matriz original. De
todas maneras el puntero interno a la matriz original avanza al procesar la matriz.
suponiendo que bucle foreach se ejecuta hasta el final, el puntero interno a la matriz
estará; al final de la matriz.
foreach no soporta la característica de suprimir mensajes de error con '@'.
Ejemplo1.
<?php
$a = array("uno", "dos", "tres");
foreach ($a as $valor) {
echo "Value: $valor<br>\n";
}
//Equivalente al anterior
reset ($a); //Iniciando la matriz en uno
while (list(, $valor) = each ($a)) {
echo "Value: $valor<br>\n";
}
?>
Ejemplo 2.
<?php
$a = array("uno", "dos", "tres");
foreach( $a as $indice => $valor ) {
echo "Indice: $indice; Valor: $valor<br>\n";
}
//Equivalente al anterior
reset ($a); //Iniciando la matriz en uno
while( list($indice, $valor) = each( $a ) ) {
echo "Indice: $indice; Valor: $valor<br>\n";
}
?>
Ejemplo 3
<?php
echo "<br>foreach ejemplo 3: valor (con clave impresa para ilustrar) <br>";
$a = array(1, 2, 3, 17); $i = 0; //Contador
foreach($a as $v) {
print "\$a[$i] => $v.\n <br>";
$i++;
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
82
foreach($a as $k => $v) {
print "\$a[$k] => $v.\n <br>";
}
Break
break escapa de la estructuras de control iterante (bucle) actuales for, while, o switch. Break
acepta un parámetro opcional, el cual determina cuantas estructuras de control hay que
escapar. Ejemplo.
<?php
$a = array ('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list (, $val) = each ($a))
{ if ($val == 'pare')
{ break; //Aquí también podría escribir 'break 1;'
}
echo "$val <br> \n";
}
Continue
Continue se usa dentro de la estructura del bucle para saltar el resto de la iteración actual del
bucle y continuar la ejecución al comienzo de la siguiente iteración. Continue acepta un
parámetro opcional, el cual determina cuantos niveles (bluces) hay que saltar antes de
continuar con la ejecución.
Nota: En PHP la declaración switch es considerada una estructura de bucle por continue.
<?php
$a = array ('uno', 'dos', 'tres', 'cuatro', 'pare', 'cinco');
while (list ($indice, $valor) = each ($a))
{
if (!($indice % 2)) // salta en los índices impares
{
continue;
}
echo $valor."<br>";
}
?>
Actividad.
En los ejercicios de: swich, while, do…while y for, agregar formularios para que los datos
sean ingresados por controles y los resultados sean visualizados en un segundo
formulario que se halla en el servidor. Todos los formularios deben ser validados para el
lado cliente.
Defina matrices y recorra su contenido con la estructura foreach y muestre los resultados
en una pagina utilizando formularios.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
83
Lección 14. PHP: Funciones
Instrucción return, require() y include().
Funciones: funciones definidas por el usuario
Parámetros de las funciones; por referencia y por defecto.
Proyecto: Definición de funciones en archivo externo.
return
Si se llama desde una función, return() termina inmediatamente la ejecución de la función y
retorna su argumento como valor de la función. return() también terminará la ejecución de una
sentencia eval() ó un script PHP.
Si el script actual ha sido incluido ó requerido con include() ó require(), el control es transferido
al script que llamo al script incluido. Además, si el script actual fue incluido, el valor dado a
return() será retornado como el valor de la llamada include().
Si return() es invocado desde el script principal, la ejecución terminara inmediatamente. Si el
script actual fue incluido con las opciones de configuración auto_prepend_file ó
auto_append_file, la ejecución terminara inmediatamente.
Nota: Tener en cuenta que ya que return() es un constructor del lenguaje y no una función, los
paréntesis alrededor de sus argumentos, son solo necesarios si el argumento contiene una
expresión, no se suelen utilizar tan a menudo, cuando retornan una variable. Ejemplo.
<?php
function hallarMarca()
{
$a = array(1, 2, 3, 4, 5, 6, 'A', 7, 8, 9);
foreach($a as $valor)
{ echo $valor."<br>";
if(gettype($valor)==string)
{ echo "se hallo el dato tipo string: $valor <br>";
return $valor."<br>"; //retorna
//break;
}
}
}
echo "llamando a la función <br>";
echo hallarMarca();
echo "Final de la función <br>";
?>
require() y include()
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
84
Pagina denominado: pagina_colores
<?php
echo "Resultado: $color $fruta <br>"; // A
include('fichero_colores.ini.php');
echo "Resultado: $color $fruta <br>"; // A manzana verde
?>
Si la inclusión ocurre dentro de una función en el fichero donde se incluye, todo el código
contenido en el fichero incluido se comportará como si hubiese sido definido dentro de esta
función.
Ejemplo3 Muestra retorno de funciones y advertencias
Fichero externo denominado: fichero2.ini.php
<?php
$a = 4; $b = 6; $msj = "Resultado"; $R1 = $a + $b;
function retornaResultado($c, $d)
{ $R2 = @($c+$d) or die('[ADVERTENCIA] Usted ha ingresado datos no validos');
echo "Valor de \$c = $c y \$d = $d ";
return $R2;
}
?>
Pagina denominado: include_con_fichero2.php
<?php
include ('fichero2.ini.php');
echo $msj.$R1."<br>";
echo "<br>Resultado de la llamada a la función es: ".retornaResultado(8, 'RRR');
?>
Es posible ejecutar una sentencia return dentro de un archivo incluido para terminar el
procesado de ese archivo y volver al archivo de comandos que lo llamó. También es posible
retornar valores de ficheros incluidos. Se puede coger el valor de la llamada "include" como se
haría con una función normal.
Cuando un fichero es incluido, el intérprete sale del modo PHP y entra en modo HTML al
principio del archivo referenciado, y vuelve de nuevo al modo PHP al final. Por esta razón,
cualquier código dentro del archivo referenciado que debiera ser ejecutado como código PHP
debe ser encerrado dentro de etiquetas válidas de comienzo y fin de PHP.
Si "URL fopen wrappers" esta activada en PHP (como está en la configuración inicial), se
puede especificar el fichero que se va a incluir usando una URL (via HTTP u otro mecanismo
soportado) en vez de un fichero local. Si el servidor destino interpreta el fichero destino como
código PHP, variables pueden ser mandadas al fichero incluido usando una cadena URL de
petición, tal como se hace con HTTP GET. Esto no es lo mismo que incluir un fichero y que
este fichero herede las variables del fichero padre; el script es ejecutado en el servidor remoto
y el resultado es incluido en en script local.
Nota. Versiones de PHP para Windows anteriores a 4.3.0, no soportan el acceso remoto a
archivos para esta función, no funcionará ni activando siquiera allow_url_fopen.
Nota: Puesto que esto es una construcción del lenguaje y no una función, no puede ser
llamado usando funciones variables.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
85
Funciones definidas por el usuario
Una función se puede definir con la siguiente sintaxis:
<?php
function mifuncion ($arg_1, $arg_2, ..., $arg_n)
{
echo "Función de ejemplo";
return $retval;
}
?>
Cualquier instrucción válida de PHP puede aparecer en el cuerpo de la función, incluso otras
funciones y definiciones de clases.
Cuando una función es definida condicionalmente como se puede ver en estos dos ejemplos,
su definición debe ser procesada antes que sea llamada.
Ejemplo. Funciones Condicionales
<?php
$valor = true;
/* Desde aquí no se puede llamar a mifuncion() porque aun
no existe, pero podemos llamar a otrafuncion() */
mifuncion(); //error
otrafuncion();
if ($valor)
{
function mifuncion()
{
echo "No existe...hasta que la ejecución del programa lo localice <br>";
}
}
/* Ahora podemos llamar la función mifuncion() porque
la variable $valor fue evaluado a verdadero */
if ($valor) mifuncion();
function otrafuncion()
{
echo "Existe... inmediatamente en el principio del programa <br>";
}
?>
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
86
{
echo "$entrada[0] + $entrada[1] = ", $entrada[0]+$entrada[1];
}
$a=array(1,2,3,4,5,6);
miArray($a);
?>
El valor por defecto tiene que ser una expresión constante, y no una variable, miembro de una
clase ó llamada a una función.
Destacar que cuando se usan parámetros por defecto, estos tienen que estar a la derecha de
cualquier parámetro sin valor por defecto; de otra manera las cosas no funcionara de la forma
esperada. Considera el siguiente fragmento de código:
Actividad.
Defina index.php en la carpeta proyectoABC para ingresar a
todo los formularios del proyecto. proyectoABC
Defina un fichero externo, que el mismo tenga dos funciones include
ficherosExternos
de tipo condicional y función de función y ubicar en la carpeta
funcionesSimples
ficherosExternos. El formulario que haya referencia a este funcionesParamts
fichero externo debe ubicarlo en la carpeta
funcionesSimples.
Defina otro fichero externo, que el mismo tenga todas las funciones con parámetros y
ubicarlo en la carpeta ficherosExternos. El formulario que haya referencia a este otro
fichero externo debe ubicarlo en la carpeta funcionesParamts.
Haga una copia del proyectoABC y su carpeta de ficherosExternos corte y copie en la
carpeta raíz de PHP5 y configure php.ini para que el proyecto funcione correctamente.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
87
Lección 15. PHP: Funciones definidas por PHP.
Funciones variables. Funciones internas (incorporadas)
Funciones: De cadenas (string), Matemáticas, Fecha y Hora
Proyecto: Definición de funciones en archivo externo
Funciones variables
PHP soporta el concepto de funciones variable, esto significa que si una variable tiene unos
paréntesis añadidos al final, PHP buscará una función con el mismo nombre que la evaluación
de la variable, e intentará ejecutarla. Entre otras cosas, esto te permite implementar
retrollamadas (callbacks), tablas de funciones y demás.
Las funciones varibles no funcionarán con construcciones del lenguaje, tal como echo(),
print(), unset(), isset(), empty(), include(), require() y derivados. Se necesitará usar una
función propia para utilizar cualquiera de estos constructores como funciones variables.
PHP tiene incorporadas muchas funciones y construcciones. Existen también funciones que
requieren extensiones específicas de PHP para que no fallen con un error fatal del tipo
"undefined function".
Por ejemplo, para usar funciones image, tal como imagecreatetruecolor(), se necesita
compilar PHP con soporte para GD. O para usar mysql_connect() se necesita compilar PHP
con soporte para MySQL. Existen muchas funciones en el núcleo de PHP que se incluyen en
cada versión de PHP, como las funciones string y variable.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
88
string htmlentities ( string string [, int quote_style [, string charset]] )
htmlspecialchars_decode -- Convierte entidades HTML a caracteres normales
string htmlspecialchars_decode ( string cadena [, int quote_style] )
htmlspecialchars -- Convierte caracteres especiales a entidades HTML
string htmlspecialchars ( string cadena [, int quote_style [, string juego_caracteres]] )
implode -- Une elementos de una matriz mediante una cadena
string implode ( string elemento_union, array trozos )
join -- Alias of implode()
levenshtein -- Calcula la distancia Levenshtein entre dos cadenas
int levenshtein ( string cadena1, string cadena2 [, int cost_ins [, int cost_rep, int cost_del]] )
localeconv -- Obtener información sobre el formato numérico
array localeconv ( void )
ltrim -- Elimina el espacio en blanco (o más caracteres) del principio de una cadena
string ltrim ( string cadena [, string lista_caracteres] )
money_format -- Da formato a un número como una cadena de moneda
string money_format ( string formato, float numero )
number_format -- Dar formato a un número con los miles agrupados
string number_format ( float numero [, int decimales [, string punto_dec, string sep_miles]] )
ord -- Devuelve el valor ASCII de un carácter
int ord ( string cadena )
parse_str -- Divide la cadena en variables
void parse_str ( string cadena [, array &array] )
print -- Muestra una cadena
printf -- Imprimir una cadena con formato
rtrim -- Elimina el espacio en blanco (o más caracteres) del final de una cadena
string rtrim ( string cadena [, string lista_caracteres] )
sprintf -- Devuelve una cadena con formato
string sprintf ( string formato [, mixed args [, mixed ...]] )
sscanf -- Trocea la entrada desde una cadena según un formato dado
mixed sscanf ( string cadena, string formato [, mixed &...] )
str_pad -- Rellena una cadena con otra hasta una longitud dada
string str_pad ( string cadena_original, int longitud_relleno [, string cadena_relleno [, int tipo_relleno]] )
str_repeat -- Repite una cadena
string str_repeat ( string cadena, int veces )
str_replace -- Sustituye todas las apariciones de una cadena en otra
mixed str_replace ( mixed cadena_buscada, mixed cadena_sustituta, mixed cadena_original [, int &veces] )
str_shuffle -- Reordena aleatoriamente una cadena
string str_shuffle ( string cadena )
str_split -- Convertir una cadena en una matriz
array str_split ( string cadena [, int longitud_separacion] )
str_word_count -- Devolver información sobre las palabras usadas en una cadena
mixed str_word_count ( string cadena [, int formato [, string lista_caracteres]] )
strchr -- Alias of strstr()
strcoll -- Comparación de cadenas basada en la localidad
int strcoll ( string cad1, string cad2 )
stripos -- Encontrar la posición de la primera ocurrencia de una cadena, insensible a
mayúsculas y minúsculas
int stripos ( string pajar, string aguja [, int desplazamiento] )
stripslashes -- Desmarca la cadena marcada con addslashes()
string stripcslashes ( string cadena )
stristr -- Lo mismo que strstr() pero sin tener en cuenta mayúsculas o minúsculas
string stristr ( string cadena, string caracter )
strlen -- Obtiene la longitud de la cadena
int strlen ( string cadena )
strnatcasecmp -- Comparación de cadenas insensible a mayúsculas y minúsculas usando un
algoritmo de "orden natural"
int strcasecmp ( string cadena1, string cadena2 )
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
89
strnatcmp -- Compara cadenas usando un algoritmo de "orden natural"
int strnatcmp ( string cadena1, string cadena2 )
strncasecmp -- Comparación de los primeros n caracteres de cadenas, segura con material
binario e insensible a mayúsculas y minúsculas
int strnatcasecmp ( string cadena1, string cadena2 )
strncmp -- Comparación de los n primeros caracteres de cadenas, con seguridad binaria
int strncmp ( string cadena1, string cadena2, int longitud )
strpbrk -- Busca una cadena por cualquiera de los elementos de un conjunto de caracteres
string strpbrk ( string pajar, string lista_caracteres )
strpos -- Encuentra la posición de la primera aparición de una cadena
int strpos ( string cadena, string caracter [, int desplazamiento] )
strrchr -- Encuentra la última aparición de un carácter en una cadena
string strrchr ( string cadena, string caracter )
strrev -- Invierte una cadena
string strrev ( string cadena )
strripos -- Encontrar la posición de la última ocurrencia de una cadena en otra, insensible a
mayúsculas y minúsculas
int strripos ( string pajar, string aguja [, int desplazamiento] )
strrpos -- Encuentra la posición de la última aparición de un carácter en una cadena
int strrpos ( string cadena, string caracter [, int desplazamiento] )
strspn -- Encuentra la longitud del primer segmento de una cadena que coincide con la
máscara
int strspn ( string cadena1, string cadena2 [, int comienzo [, int final]] )
strstr -- Encuentra la primera aparición de una cadena
string strstr ( string cadena, string caracter )
strtok -- Divide una cadena en elementos
string strtok ( string cadena, string elemento )
strtolower -- Pasa a minúsculas una cadena
string strtolower ( string cadena )
strtoupper -- Pasa a mayúsculas una cadena
string strtoupper ( string cadena )
substr_count -- Cuenta el número de apariciones de la subcadena
int substr_count ( string cadena, string caracter [, int comienzo [, int longitud]] )
substr_replace -- Sustituye texto en una parte de una cadena
string substr_replace ( mixed cadena, string cadena_sustituta, int comienzo [, int
longitud] )
substr -- Devuelve parte de una cadena
string substr ( string cadena, int comienzo [, int longitud] )
trim -- Elimina espacios en blanco (u otros caracteres) del principio y final de una cadena
string trim ( string cadena [, string lista_caracteres] )
ucfirst -- Pasar a mayúsculas el primer carácter de una cadena
string ucfirst ( string cadena )
ucwords -- Pone en mayúsculas el primer carácter de cada palabra de una cadena
string ucwords ( string cadena )
wordwrap -- Corta una cadena en un número dado de caracteres usando un carácter de
ruptura de cadenas.
string wordwrap ( string cadena [, int ancho [, string ruptura [, bool corte]]] )
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
90
echo "la contraseña no es válida";
?>
Ejemplos de explode()
<?php
// Ejemplo 1
$cadena = "trozo1 trozo2 trozo3 trozo4 trozo5 trozo6";
$trozos = explode(" ", $cadena);
echo $trozos[0]."<br>"; // trozo1
echo $trozos[1]."<br>"; // trozo2
// Ejemplo 2
$datos = "usuario:*:1023:1000::/home/usuario:/bin/sh";
list($usuario, $contrasena, $uid, $gid, $gecos, $home, $shell) = explode(":", $datos);
echo $usuario."<br>"; // usuario
echo $contrasena."<br>"; // *
?>
Ejemplos de strpos()
<?php
echo "Ejemplo 1 <br>";
$mi_cadena = 'abc';
$caracter = 'a';
$posicion = strpos($mi_cadena, $caracter);
if ($posicion === false)
{ echo "No se encontro '$caracter' en la cadena '$mi_cadena'";
}
else
{ echo "Se encontro '$caracter' en la cadena '$mi_cadena'";
echo " en la posicion $posicion";
}
Ejemplo de strstr()
<?php
$email = '[email protected]';
$dominio = strstr($email, 'a');
echo $dominio; // La salida es: @example.com
?>
Ejemplo de str_split()
<?php
$matriz1 = str_split($cadena);
$matriz2 = str_split($cadena, 3);
print_r($matriz1);
echo "<br><br>";
print_r($matriz2);
?>
Actividad.
Diseñe formularios para ingresar datos para los diferentes ejemplos proporcionados,
donde se resalte el uso de las funciones con cadena.
Desarrolle 10 aplicaciones diferentes con formularios. En cada uno resalte las funciones
de cadena que esta utilizando. También debe emplear estructuras de control en las
aplicaciones que así lo requieran.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
91
Funciones matemáticas
Estas funciones matemáticas solo manipulan valores dentro del rango de los tipos integer y
float en su equipo. Si necesita manejar números más grandes, debe trabajar con funciones
matemáticas de precisión arbitraria.
Constantes predefinidas
Las constantes listadas aquí están siempre disponibles a través del "núcleo PHP".
Constante Valor Descripción
M_PI 3.14159265358979323846 Pi
M_E 2.7182818284590452354 e
M_SQRT2 1.41421356237309504880 sqrt(2) (Raiz cuadrada de 2)
M_LNPI 1.14472988584940017414 log_e(pi) [4.0.2]
...
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
92
mixed min ( array numeros )
pi -- Obtener valor de pi
float pi ( void )
pow -- Expresión exponencial
number pow ( number base, number exp )
rad2deg -- Convierte el número en radianes a su equivalente en grados
round -- Redondea un flotante
float round ( float val [, int precision] )
sqrt -- Raíz cuadrada
float sqrt ( float arg )
Constantes predefinidas
Las siguientes constantes están definidas desde PHP 5.1.0 y ofrecen representaciones de
fecha estándar, que pueden ser usadas junto con las funciones de formato de fechas (como
date()).
DATE_ATOM (string) //Átomo (ejemplo: 2005-08-15T15:52:01+0000)
DATE_COOKIE (string) //Cookies HTTP (ejemplo: Mon, 15 Aug 2005 15:52:01 UTC)
DATE_ISO8601 (string) //ISO-8601 (ejemplo: 2005-08-15T15:52:01+0000)
...
Tabla de contenidos
checkdate -- Validar una fecha Gregoriana
bool checkdate ( int mes, int dia, int anyo )
date_sunrise -- Obtiene la hora del amanecer de un día y lugar concretos
mixed date_sunrise ( int marca_de_tiempo [, int formato [, float latitud [, float longitud [,
float cenit [, float diferencia_gmt]]]]] )
date_sunset -- Obtiene la hora del atardecer de un día y lugar concretos
mixed date_sunset ( int marca_de_tiempo [, int formato [, float latitud [, float longitud [,
float cenit [, float diferencia_gmt]]]]] )
date -- Dar formato a una hora/fecha local (*)Detalle:
string date ( string formato [, int marca_de_tiempo] )
getdate -- Obtiene información de fecha/hora
array getdate ( [int marca_de_tiempo] )
gettimeofday -- Obtiene la hora actual
mixed gettimeofday ( [bool devolver_flotante] )
idate -- Formatea la fecha/hora local como un número entero
int idate ( string formato [, int marca_de_tiempo] ) (**)Detalle:
localtime -- Obtener la hora local
array localtime ( [int muestra_de_tiempo [, bool es_asociativo]] )
strftime -- Dar formato a una hora/fecha local de acuerdo a valores de localidad
string strftime ( string formato [, int marca_de_tiempo] )
strtotime -- Procesar cualquier descripción textual de fecha/hora en Inglés convirtiéndola en
una timestamp de UNIX.
int strtotime ( string hora [, int ahora] )
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
93
(*)Detalle:
Los siguientes caracteres son reconocidos en la cadena del parámetro de date( ).
Cart. Descripción Valores de ejemplo
d Día del mes, 2 dígitos con ceros iniciales 01 a 31
D Una representación textual de un día, tres letras Mon a Sun
j Día del mes sin ceros iniciales 1 a 31
l ('L'minuscula)Una representación textual completa del día de la semana Sunday a Saturday
Representación numérica ISO-8601 del día de la semana (agregado in PHP
N 5.1.0) 1 (Lun.) a 7 (Dom.)
w Representación numérica del día de la semana 0 (Dom.) a 6 (Sáb.)
z El día del año (comenzando en 0) 0 a 365
Número de la semana del año ISO-8601, las semanas comienzan en Lunes Ejemplo: 42 (la 42va semana
W (agregado en PHP 4.1.0) del año)
F Una representación textual completa de un mes, como January o March January a December
m Representación numérica de un mes, con ceros iniciales 01 a 12
M Una representación textual corta de un mes, tres letras Jan a Dec
n Representación numérica de un mes, sin ceros iniciales 1 a 12
t Número de días en el mes dado 28 a 31
L Indica si es un año bisiesto 1 (año bisiesto), 0 (Normal)
Y Una representación numérica completa de un año, 4 dígitos Ejemplos: 1999 o 2003
y Una representación de dos dígitos de un año Ejemplos: 99 o 03
a Ante meridiano y Post meridiano en minúsculas am o pm
A Ante meridiano y Post meridiano en mayúsculas AM o PM
B Hora Swatch Internet 000 a 999
g formato de 12-horas de una hora sin ceros iniciales 1 a 12
G formato de 24-horas de una hora sin ceros iniciales 0 a 23
h formato de 12-horas de una hora con ceros iniciales 01 a 12
H formato de 24-horas de una hora con ceros iniciales 00 a 23
i Minutos con ceros iniciales 00 a 59
s Segundos, con ceros iniciales 00 a 59
c Fecha ISO 8601 (agregada en PHP 5) 2004-02-12T15:19:21+00:00
Ej.: Thu, 21 Dec 2000 16:01:07
r Fecha en formato RFC 2822
+0200
(**)Detalle:
Lista de valores permitidos en el parámetro de idate( ).
Cart. Descripción
d Día del mes
h Hora (en formato de 12 horas)
H Hora (en formato de 24 horas)
i Minutos
L Devuelve 1 si es un año bisiesto y 0 en otro caso
m Número del mes
s Segundos
t Número de días del mes actual
Segundos desde la Unix Epoch (que comienza el 1 de Enero de 1970 00:00:00 GMT). Se trata del
U
mismo resultado que el obtenido con la función time()
w Día de la semana (considerando el número 0 para el Domingo)
Número de la semana según la norma ISO-8601, que considera que todas las semanas comienzan
W
en Lunes
y Año (1 o 2 dígitos)
Y Año (4 dígitos)
z Día del año
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
94
Ejemplo1. de base_convert()
<?php
$hexadecimal = 'A37334';
echo base_convert($hexadecimal, 16, 2); //Imprime: 101000110111001100110100
?>
Ejemplo2. de ceil()
<?php
echo ceil(4.3)."<br>"; // 5
echo ceil(9.999)."<br>"; // 10
?>
Ejemplo5. de checkdate()
<?php
var_dump(checkdate(12, 31, 2000)); // bool(true)
var_dump(checkdate(2, 29, 2001)); // bool(false)
?>
Ejemplos6. de date()
<?php
echo date("l")."<br>"; // Imprime: Monday
echo date('l dS \of F Y h:i:s A')."<br>"; // Imprime: Monday 09th of June 2008 12:20:51 AM
echo "July 1, 2000 ". date("l", mktime(0, 0, 0, 7, 1, 2000))."<br>"; //Imprime: July 1, 2000 Saturday
echo date(DATE_RFC822)."<br>"; // imprime: Mon, 09 Jun 08 00:20:51 -0400
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000))."<br>"; // imprime: 2000-07-01T00:00:00-04:00
?>
Actividad:
Diseñe un formulario que permita comprobar diversos datos ingresados (ejemplos 1-4).
Diseñe otra aplicación que permita comprobar los ejemplos 5-8 por medio de formularios.
Desarrolle 1 aplicación donde se observe el uso de funciones matemáticas.
Desarrolle 1 aplicación donde se observe el uso de funciones fecha y hora.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
95
Lección 16. Servidor de Base de Datos MySQL
Introducción a MySQL. Conectándose al servidor MySQL.
Definición de usuarios y seguridad. Definición de base de datos
Definir y cargar datos. Crear backup
Conversión de base de datos Access a MySQL
Drivers ODBC, MySQL Query y Conversiones.
Proyecto. Definición de usuarios y BD
INTRODUCCIÓN
El software MySQL® proporciona un servidor de base de datos SQL (Structured Query
Language) muy rápido, multi-threaded, multi usuario y robusto. El servidor MySQL está
diseñado para entornos de producción críticos, con alta carga de trabajo así como para
integrarse en software para ser distribuido. MySQL es una marca registrada de MySQL AB.
En esta parte se introduce el aprendizaje a MySQL, a través del uso de mysql, el programa
cliente de MySQL para crear y utilizar una base de datos simple. mysql (a veces denominado
“monitor de terminal” o solamente “monitor”) es un programa interactivo que le permite
conectarse a un servidor de bases de datos MySQL, ejecutar consultas, y ver los resultados.
mysql puede usarse también en modo por lotes: se colocan las consultas en un archivo
previamente armado, y se le dice a mysql que ejecute el contenido del archivo.
Para ver una lista de las opciones utilizadas con mysql, ejecútelo con la opción --help:
shell> mysql –help
equivalente;
D:\AppServ\MySQL> mysql –help
host y user representan el nombre del ordenador donde se está ejecutando el servidor de
bases de datos MySQL y el nombre de usuario de la cuenta que se usará para conectarse.
Si todo funciona bien, se verá una información de ingreso seguida por el prompt mysql>:
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.27-community-nt-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Algunas instalaciones de MySQL permiten conectarse como usuario anónimo (sin nombre) si el
servidor se está ejecutando en el ordenador local. Si esto sucede en su caso, deberia poder
conectarse al servidor ejecutando mysql sin ningún parámetro:
shell> mysql
Después de haberse conectado, puede desconectarse en cualquier momento escribiendo QUIT
(o \q) en el prompt mysql>:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
96
Entrar consultas
Esta sección describe los principios básicos del ingreso de comandos, empleando varias
consultas que puede realizar para familiarizarse con la forma en que funciona mysql.
Consulta 1.
Comando que muestre su número de versión y la fecha actual.
mysql> SELECT VERSION(), CURRENT_DATE;
+----------------+--------------+
| VERSION() | CURRENT_DATE |
+----------------+--------------+
| 5.0.7-beta-Max | 2005-07-11 |
+----------------+--------------+
1 row in set (0.01 sec)
mysql>
Consulta 2.
Consulta que demuestra que mysql puede usarse como calculadora:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
+---------------------+
| NOW() |
+---------------------+
| 2005-07-11 17:59:36 |
+---------------------+
1 row in set (0.00 sec)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
97
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2005-07-11 |
+---------------+--------------+
1 row in set (0.00 sec)
Observacones:
El cambia de mysql> a -> advierte que no se ha completado la sentencia y aún espera
por el resto.
Para cancelar el ingreso de un comando, debe tipear \c
La siguiente tabla muestra cada uno de los indicadores que podrá ver y sintetiza lo que
dicen acerca del estado en que se encuentra mysql:
Prompt Significado
mysql> Listo para un nuevo comando.
-> Esperando la siguiente línea en un comando de múltiples líneas.
Esperando la siguiente línea, se encuentra abierta una cadena que comienza
'>
con apostrofo (''').
Esperando la siguiente línea, se encuentra abierta una cadena que comienza
">
con comillas dobles ('"').
Esperando la siguiente línea, se encuentra abierta una cadena que comienza
`>
con tilde ('`').
Esperando la siguiente línea, se encuentra abierto un comentario que
/*>
comienza con /*.
Nota: Solo el administrador puede crear los usuarios de conexión a bd MySQL, por tanto
debe acceder al servidor como administrador (Usuario root y su password).
mysql> GRANT ALL ON animales.* TO 'su_nombre_mysql'@'su_host_cliente' IDENTIFIED
BY 'password_usuario';
Donde:
- ALL (dar todos los permisos)
- ON (en)
- animales.* (base de datos animales y todas sus tablas)
- to (al)
- su_nombre_mysql (nombre de usuario de conexión a base de datos MySQL)
- su_host_cliente (equipo del cliente);
- IDENTIFIED BY (identificado por)
- password_usuario (password asignación al usuario)
La base de datos mysql es necesaria porque es la que describe los privilegios de acceso
de los usuarios. La base de datos test se provee para que los usuarios hagan pruebas.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
98
DEFINICIÓN DE BASE DE DATOS
+----------+--------------+---------+------+-------------+----------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+----------+--------------+---------+------+-------------+----------------+
| pelusa | Arnoldo | Gato | f | 1999-02-04 | NULL |
+----------+--------------+---------+------+-------------+----------------+
Actividad
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
99
Conversión de Base de Datos Access a MySQL
Conversión de base de datos Access a MySQL
Si ha iniciado el desarrollo web con la base de datos Access o si tiene una base de datos en
Access y desea pasarlo a la base de datos más utilizada en web como es MySQL, una forma
de convertir es la que a continuación se detalla:
Primero. Instalar el driver ODBC para conectar con una base de datos MySQL
Segundo. Instalar el convertidor de base de datos MS Access a MySQL (MS Access to
MySQL)
Tercero. Utilizar el programa MS Access to MySQL para convertir.
Instalar el driver ODBC para conectar con una base de datos MySQL
Instalar este driver sirve para que desde un sistema Microsoft Windows se pueda acceder a
una base de datos MySQL. Las aplicaciones son variadas, por ejemplo podemos utilizarlo para
crear un DSN asociado a una base de datos MySQL, de modo que nuestras páginas ASP
podrían acceder a dicha base de datos. Otra aplicación es acceder desde Access a la base de
datos MySQL y exportar o importar datos (migrar los datos desde Access a MySQL y desde
MySQL a Access), incluso para crear un back-end de nuestra base MySQL en interfaz Access.
http://www.mysql.com/products/connector/odbc/
mysql-connector-odbc-3.51.24-win32.zip
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
100
Instalar el convertidor de base de datos MS Access a MySQL (MS Access to MySQL)
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
101
Lección 17. Consultas comunes en MySQL
Consultas de una tabla
Actualizar o modificar datos específicos.
Ordenar registros, Cálculos sobre fechas.
Coincidencia de patrones.
Contar registros Administración de datos
Consultas de más de una tabla
Criterios y orden en consultas
Usar mysql en modo batch
Proyecto: Sentencias SQL para BD MySQL
Acceder a MySQL como usuario de una determinada base de datos al que se tiene permisos
para poder accder.
La sentencia SELECT es utilizada para traer información desde una tabla. La sintaxis general
de esta sentencia es:
SELECT seleccionar_Esto
FROM desde_tabla
WHERE condiciones;
seleccionar_esto es lo que se quiere ver. Puede ser una lista de columnas, o * para indicar
“todas las columnas.” desde_tabla indica la tabla donde están los datos a recuperar. La
cláusula WHERE es opcional. Si está presente, condiciones representa las condiciones que
cada registro debe cumplir para retornar como resultado.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
102
Silbador Tomas Ave 2000-02-09
Delgado Benito Serpiente m 2001-04-29
AND and OR pueden ser combinadas; AND tiene mayor precedencia que OR.
mysql> SELECT * FROM mascotas WHERE (especie = 'gato' AND sexo = 'm')
-> OR (especie = 'perro' AND sexo = 'f');
propietario
Arnoldo
Juan
Arnoldo
Benito
Diana
Omar
Tomas
Benito
propietario
Arnoldo
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
103
Juan
Benito
Diana
Omar
Tomas
Actividad.
Convierta la base de datos sistemaNotas de Access a MySQL y crear backup.
Recupere la base de datos sistemaNotas desde el backup creado.
Realice diferentes consultas mostradas hasta de la base de datos sistemaNotas.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
104
Actualizar o modificar
Modificando todas las letras f (femenino) que representan al sexo de la mascotas por h
(hembra).
mysql> UPDATE mascotas SET sexo='h' WHERE sexo='f';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
Ordenar registros
Para ordenar un resultado, se usa la clásula ORDER BY.
mysql> SELECT nombre, nacimiento FROM mascotas ORDER BY nombre;
+-----------+------------+
| nombre | nacimiento |
+-----------+------------+
| Chilpe | 1998-09-11 |
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
105
| colmillo | 2000-08-27 |
| Delgado | 2001-04-29 |
| Garras | 1998-03-17 |
| Navegador | 1989-08-31 |
| Pelusa | 1999-02-04 |
| pulgita | 1989-05-13 |
| Silbador | 2000-02-09 |
+-----------+------------+
Puede forzar a que una columna se ordene en forma sensible a mayúsculas empleando
el modificador BINARY: ORDER BY BINARY columna.
mysql> SELECT nombre, nacimiento FROM mascotas ORDER BY BINARY nombre;
+-----------+------------+
| nombre | nacimiento |
+-----------+------------+
| Chilpe | 1998-09-11 |
| Delgado | 2001-04-29 |
| Garras | 1998-03-17 |
| Navegador | 1989-08-31 |
| Pelusa | 1999-02-04 |
| Silbador | 2000-02-09 |
| colmillo | 2000-08-27 |
| pulgita | 1989-05-13 |
+-----------+------------+
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
106
| Garras | 1998-03-17 | 07-09 | 03-17 |
| Navegador | 1989-08-31 | 07-09 | 08-31 |
| Pelusa | 1999-02-04 | 07-09 | 02-04 |
| pulgita | 1989-05-13 | 07-09 | 05-13 |
| Silbador | 2000-02-09 | 07-09 | 02-09 |
+-----------+------------+--------------------+---------------------+
mysql> SELECT nombre, nacimiento, (RIGHT(CURDATE(),5) < RIGHT(nacimiento,5))
-> FROM mascotas ORDER BY nombre;
+-----------+------------+--------------------------------------------+
| nombre | nacimiento | (RIGHT(CURDATE(),5) < RIGHT(nacimiento,5)) |
+-----------+------------+--------------------------------------------+
| Chilpe | 1998-09-11 | 1 |
| colmillo | 2000-08-27 | 1 |
| Delgado | 2001-04-29 | 0 |
| Garras | 1998-03-17 | 0 |
| Navegador | 1989-08-31 | 1 |
| Pelusa | 1999-02-04 | 0 |
| pulgita | 1989-05-13 | 0 |
| Silbador | 2000-02-09 | 0 |
+-----------+------------+--------------------------------------------+
mysql> SELECT nombre, nacimiento, CURDATE(), (YEAR(CURDATE())- YEAR(nacimiento))
-> - (RIGHT(CURDATE(),5) < RIGHT(nacimiento, 5)) AS edad
-> FROM mascotas ORDER BY nombre;
+-----------+------------+------------+------+
| nombre | nacimiento | CURDATE() | edad |
+-----------+------------+------------+------+
| Chilpe | 1998-09-11 | 2008-07-09 | 9 |
| colmillo | 2000-08-27 | 2008-07-09 | 7 |
| Delgado | 2001-04-29 | 2008-07-09 | 7 |
| Garras | 1998-03-17 | 2008-07-09 | 10 |
| Navegador | 1989-08-31 | 2008-07-09 | 18 |
| Pelusa | 1999-02-04 | 2008-07-09 | 9 |
| pulgita | 1989-05-13 | 2008-07-09 | 19 |
| Silbador | 2000-02-09 | 2008-07-09 | 8 |
+-----------+------------+------------+------+
Una consulta similar se utiliza para determinar la edad a la fecha de muerte de los
animales. Se determinan los animales que han muerto verificando si el valor de la
columna fallecimiento es NULL. Entonces, para todos los valores no NULL calcula la
diferencia entre las fechas de muerte (fallecimiento) y nacimiento (nacimiento):
mysql> SELECT nombre, nacimiento, fallecimiento, (YEAR(fallecimiento)-
-> YEAR(nacimiento)) - (RIGHT(fallecimiento,5) < RIGHT(nacimiento, 5)) AS edad
-> FROM mascotas WHERE fallecimiento IS NOT NULL ORDER BY edad;
+-----------+------------+---------------+------+
| nombre | nacimiento | fallecimiento | edad |
+-----------+------------+---------------+------+
| Navegador | 1989-08-31 | 1997-07-29 | 7 |
+-----------+------------+---------------+------+
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
107
mysql> SELECT nombre, nacimiento FROM mascotas
-> WHERE MONTH(nacimiento) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
Una manera alternativa de alcanzar el mismo resultado es sumar 1 al mes actual para
obtener el mes siguiente, después de emplear la función módulo (MOD) para dejar el
número de mes en 0 si resultara ser 12:
Coincidencia de patrones
Los patrones SQL permiten emplear el caracter '_' para representar coincidencia con un
carácter individual y '%'. En MySQL, por defecto, los patrones SQL no son case-sensitive.
Abajo se muestran algunos ejemplos. Advierta que no se emplean los operadores = o <> para
trabajar con patrones SQL, en lugar de eso se usan los operadores de comparación LIKE o
NOT LIKE.
Para encontrar nombres que comiencen con 'p' (sin considerar mayúscular o minúsculas)
mysql> SELECT * FROM mascotas WHERE nombre LIKE "p%";
+---------+-------------+---------+------+------------+---------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+---------+-------------+---------+------+------------+---------------+
| Pelusa | Arnoldo | Gato | h | 1999-02-04 | NULL |
| pulgita | Arnoldo | Perro | h | 1989-05-13 | NULL |
+---------+-------------+---------+------+------------+---------------+
Los otros patrones que pueden emplearse con MySQL usan expresiones regulares extendidas.
Cuando busque coincidencias con este tipo de patrones, use los operadores REGEXP y NOT
REGEXP (o bien los sinónimos RLIKE y NOT RLIKE).
Actividad
Obtenga los propietarios que perderían sus mascotas, si al cabo de 12 años con siete
meses y 15 dias de vida, tienen que sacrificarlos.
Modifique la fecha de nacimiento de las mascotas simultáneamente a la fecha actual y en
forma proporcional, para que ninguno sea sacrificado y que el mismo se de recien de
aproximadamente de 8 años 3 meses y 25 dias.
Obtenga los nombres de mascotas cuyos nombres no inicien con “p” ni “c”.
Muestre a los propietarios cuya penultima letra sea “a” y antepenultima sea “m”.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
108
Contar registros
Contar propietarios que muestra la columna propietario (sin considerar que estas se
repitan).
mysql> SELECT COUNT(propietario) FROM mascotas;
+--------------------+
| COUNT(propietario) |
+--------------------+
| 8 |
+--------------------+
Nota: para contar los registros que se repiten es necesario utilizar COUNT() con GROUP
BY, sino MySQL emite un mensaje de error.
Cantidad de mascotas agrupadas por especie y sexo, pero solo de Perros y Gatos:
mysql> SELECT especie, sexo, COUNT(*) FROM mascotas
-> WHERE especie='Perro' OR especie='gato' GROUP BY especie, sexo;
Administración de datos en MySQL
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
109
visitas al veterinario o nacimiento de crías, necesita otra tabla. Esta tabla podria contener la
información siguiente:
Un campo con el nombre de la mascota para saber a quien pertenece cada acción,
hecho o evento registrado.
La fecha en que ocurrió la acción.
Un campo con la descripción de la acción.
Un campo con el tipo de acción, a fin de poder clasificarlo.
NOTA:
Los ficheros de texto con los registros, tambien pueden ser definidos con \r\n al final
de cada registro. Y luego ser cargados asi:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
110
Para modificar el campo numero por cod_acc y que sea clave primaria.
mysql> ALTER TABLE acciones CHANGE numero cod_acc VARCHAR(6);
Query OK, 10 rows affected (0.02 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from acciones;
+---------+------------+------------+--------------+----------------------------------+-------+
| cod_acc | nombre | fecha | tipo | comentario | gasto |
+---------+------------+------------+--------------+----------------------------------+-------+
| 1 | Pelusa | 2001-05-15 | parto | 4 gatos: 3 hembras y 1 macho | 14 |
| 2 | Pulgita | 1993-06-23 | parto | 5 cachorros: 2 hembras y 3 macho | 18 |
| 3 | Pulgita | 1994-06-19 | parto | 3 cachorros: 3 hembras | 16 |
| 4 | Chilpe | 2000-03-21 | veterinario | el pico necesitaba enderezo | 15 |
| 5 | Delgado | 1997-08-03 | veterinario | heridas por caida | 120 |
| 6 | Navegador | 2002-10-12 | perrera | | 12 |
| 7 | Colmillo | 2003-10-12 | perrera | | 12 |
| 8 | Colmillo | 2004-08-27 | cumplea | Le dieron un nuevo juguete | 200 |
| 9 | Garras | 2002-03-17 | cumplea | Le dieron un nuevo collar | 120 |
| 10 | Silbador | 2003-12-09 | cumplea | Primer cumplea | 12.5 |
+---------+------------+------------+--------------+----------------------------------+-------+
NOTA:
Se ha eleiminado el campo gasto y todos los datos que esta tiene.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
111
Consultas de varias tablas
+---------+--------------+-------------------------------------+
| nombre | tipo | comentario |
+---------+--------------+-------------------------------------+
| Chilpe | veterinario | el pico necesitaba enderezo |
| Delgado | veterinario | heridas por caida |
+---------+--------------+-------------------------------------+
Suponga que se desea saber a qué edad tuvo sus crías cada mascota.
mysql> SELECT m.nombre,
-> (YEAR(fecha) - YEAR(nacimiento))-
-> (RIGHT(fecha,5) < RIGHT(nacimiento,5)) as edad, comentario
-> FROM mascotas m, acciones a WHERE m.nombre=a.nombre AND tipo="parto";
+---------+------+-------------------------------------+
| nombre | edad | comentario |
+---------+------+-------------------------------------+
| Pelusa | 2 | 4 gatos: 3 hembras y 1 macho |
| pulgita | 4 | 5 cachorros: 2 hembras y 3 macho |
| pulgita | 5 | 3 cachorros: 3 hembras |
+---------+------+-------------------------------------+
Se puede establecer una relación entre dos tablas iguales. A veces es útil combinar una
tabla consigo misma, si se desea comparar entre sí registros de una misma tabla.
Por ejemplo, para formar parejas de mascotas para reproducción, podría unir la tabla
mascotas consigo misma para generar pares de animales macho y hembra de la misma
especie:
mysql> SELECT T1.nombre, T1.sexo, T2.nombre, T2.sexo, T1.especie
-> FROM mascotas AS T1, mascotas AS T2
-> WHERE T1.especie = T2.especie AND T1.sexo = 'h' AND T2.sexo='m';
+---------+------+-----------+------+---------+
| nombre | sexo | nombre | sexo | especie |
+---------+------+-----------+------+---------+
| Pelusa | h | Garras | m | Gato |
| pulgita | h | colmillo | m | Perro |
| pulgita | h | Navegador | m | Perro |
+---------+------+-----------+------+---------+
Actividad
Se muestra el diseño básico de la base de datos BDArticulosVenta. Convertir esta base
de MS-Access a MySQL y hacer las consultas siguientes:
* *
CLIENTE ARTÍCULO
1 * * 1
CLIENTE ORDEN ARTÍCULO
Articulos pedidos por todos los cliente, ordenados por orden alfabetico de clientes.
Mostrar los clientes y la suma pagada por los articulos comprados, en el año 2006.
Mostrar la relación de artículos que ya estan vencidos y los clientes que lo han
comprado.
Mostrar los clientes quienes llevan productos del almacen 1 (codigo AL01).
Mostrar el nombre de los clientes que son solteros, los productos que compran y los
deportes que práctican.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
112
Usar mysql en modo batch
También MySQL puede ejecutar en un modo por lotes. Para hacer esto, los comandos que se
desean ejecutar deben colocarse en un archivo, y posteriormente indicarle a mysql que acepte
como entrada el contenido del mismo.
Donde:
ruta_archivo_batch: es la ruta con el archivo de texto. Ejemplo:
E:\\carpeta_consultas\\...\\consulta.sql
Si se desea que el script continúe su ejecución aún si alguna de sus sentencias produce
errores, se debería usar la opción de línea de comandos --force.
Si se ejecuta una consulta que produce una salida muy extensa, se puede ejecutar a
traves de un paginador en lugar de verla desaparecer rápidamente por la parte superior
de la pantalla:
Si desea obtener el formato por lotes para una salida producida interactivamente, utilice
mysql -t. Para incluir en la salida los comandos que se ejecutan, utilice mysql -vvv.
También pueden ejecutarse archivos de script desde el prompt mysql utilizando los
comandos source o \.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
113
D:\AppServ\MySQL\bin>mysql -t -u root -pmysql notas < e:\\consultas\\alum_x_esc.sql
+---------+---------+------------------------+----------+
| cod_esc | abr_esc | nom_esc | count(*) |
+---------+---------+------------------------+----------+
| 501 | BI | BIOLOGIA | 3 |
| 502 | EN | ENFERMERIA | 3 |
| 503 | MD | MEDICINA | 4 |
| 511 | AQ | ARQUITECTURA | 4 |
| 512 | IE | INGENIERIA ELECTRONICA | 4 |
| 513 | IS | INGENIERIA DE SISTEMAS | 3 |
| 521 | ED | EDUCACION | 3 |
| 522 | CO | CONTABILIDAD | 4 |
| 523 | DE | DERECHO | 2 |
+---------+---------+------------------------+----------+
NOTA:
El password va seguido y junto (sin espacio) a –p
...
mysql> \. e:\\basededatos\\bdmysql\\consultas\\dpto.sql
+---------+---------+---------+---------------+
| coddpto | codprov | coddist | nombre |
+---------+---------+---------+---------------+
| 01 | 00 | 00 | AMAZONAS |
| 02 | 00 | 00 | ANCASH |
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
114
Lección 18. Funciones que provee PHP para manejo de Base
de datos MySQL
Configuración en tiempo de ejecución. Tipos de recursos
Constantes de cliente MySQL
Detalle de funciones de conexión a datos
Proyecto: Conexión y mostrar datos PHP
PHP 5+
Debe verificar si el soporte para MySQL esta habilitado por defecto, sino php_mysql.dll DLL
debe habilitarse al interior de php.ini. Asimismo, PHP necesita acceder a la biblioteca de cliente
MySQL. Un archivo de nombre libmysql.dll es incluido en la distribución de PHP en Windows, y
para que PHP se comunique con MySQL, este archivo necesita estar disponible en la ruta
PATH de los sistemas Windows (Panel de Control -> Sistema. En pestaña
'Variables de Entorno', en 'Variables de Sistema', en Path debe estar
por ejemplo f:\AppServ\MySQL\bin; separado por ―;‖). Aunque copiar
libmysql.dll al directorio de sistema de Windows también funciona (ya que el directorio de
sistema es parte del PATH del sistema por defecto), tal acción no es recomendada.
Al igual que ocurre con cualquier otra extensión (como php_mysql.dll), la directiva de PHP
extension_dir debe definirse con el directorio en donde están ubicadas las extensiones PHP.
Un valor de ejemplo de extension_dir para PHP 5 es “extension_dir =
"f:/AppServ\php5\ext"
Por
Nombre Modificable Cambios
defecto
mysql.allow_persistent "1" PHP_INI_SYSTEM
mysql.max_persistent "-1" PHP_INI_SYSTEM
mysql.max_links "-1" PHP_INI_SYSTEM
mysql.trace_mode "0" PHP_INI_ALL Disponible desde PHP 4.3.0.
mysql.default_port NULL PHP_INI_ALL
mysql.default_socket NULL PHP_INI_ALL Disponible desde PHP 4.0.1.
mysql.default_host NULL PHP_INI_ALL
mysql.default_user NULL PHP_INI_ALL
mysql.default_password NULL PHP_INI_ALL
PHP_INI_SYSTEM en PHP <= 4.3.2. Disponible desde
mysql.connect_timeout "60" PHP_INI_ALL
PHP 4.3.0.
mysql.allow_persistent boolean
Indica si se permiten conexiones persistentes con MySQL.
mysql.max_persistent integer
El número máximo de conexiones persistentes con MySQL por proceso.
mysql.max_links integer
El número máximo de conexiones con MySQL por proceso, incluyendo conexiones
persistentes.
mysql.trace_mode boolean
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
115
Modo de rastreo. Cuando se habilita mysql.trace_mode, se muestran advertencias para la
apertura de tablas/índices, conjuntos de resultados no liberados, y errores SQL. (Se introdujo
en PHP 4.3.0)
mysql.default_port string
El número de puerto TCP predeterminado para usar cuando se conecta con el servidor de
bases de datos, si no se indica otro. Si no se indica un valor predeterminado, el puerto se
obtendrá de la variable de entorno MYSQL_TCP_PORT, la entrada mysql-tcp en /etc/services
o la constante de tiempo de compilación MYSQL_PORT, en ese orden. En Win32 sólo se usa
la constante MYSQL_PORT.
mysql.default_socket string
El nombre de socket predeterminado a ser usado cuando se realicen conexiones con un
servidor de base de datos local, si no se indica algún otro.
mysql.default_host string
La máquina anfitriona predeterminada a ser usada cuando se realicen conexiones con un
servidor de bases de datos, si no se indica otro valor. No es aplicable en SQL safe mode.
mysql.default_user string
El nombre de usuario prodeterminado para conectarse al servidor de bases de datos si no se
indica otro. No es aplicable bajo SQL safe mode.
mysql.default_password string
La contraseña predeterminada a usar cuando se realicen conexiones con el servidor de bases
de datos, si no se indica otro valor. No es aplicable en SQL safe mode.
mysql.connect_timeout integer
Tiempo de espera máximo de conexión, en segundos. Bajo Linux este tiempo de espera es
usado también cuando se espera la primera respuesta del servidor.
Tipos de recursos
Hay dos tipos de recursos usados en el módulo MySQL. El primero es el identificador de enlace
para una conexión de base de datos, el segundo es un recurso que almacena el resultado de
una consulta.
Constantes predefinidas
Estas constantes están definidas por esta extensión y estarán disponibles solamente cuando la
extensión ha sido o bien compilada dentro de PHP o grabada dinámicamente en tiempo de
ejecución.
A partir de PHP 4.3.0, es posible especificar banderas de cliente adicionales para las funciones
mysql_connect() y mysql_pconnect(). Las siguientes constantes están definidas:
Constante Descripción
MYSQL_CLIENT_COMPRESS Usar protocolo de compresión
MYSQL_CLIENT_IGNORE_SPACE Permitir espacios después de nombres de funciones
Permitir tantos segundos de inactividad como indique interactive_timeout (en
MYSQL_CLIENT_INTERACTIVE
lugar de wait_timeout) antes de cerrar la conexión
Usar encripción SSL. Esta bandera se encuentra disponible únicamente con
la versión 4.x o más reciente de la biblioteca cliente de MySQL. La versión
MYSQL_CLIENT_SSL
3.23.x se distribuye tanto con PHP 4 como con los binarios de Windows de
PHP 5.
La función mysql_fetch_array() usa una constante para los diferentes tipos de matrices de
resultado. Las siguientes constantes están definidas:
Constantes MySQL-fetch
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
116
Constante Descripción
MYSQL_ASSOC Las columnas son devueltas en la matriz usando el nombre del campo como índice.
Las columnas son devueltas en la matriz teniendo tanto un índice numérico como un índice
MYSQL_BOTH
correspondiente al nombre del campo.
Las columnas son devueltas en la matriz teniendo un índice numérico a los campos. Este
MYSQL_NUM
índice comienza en 0, el primer campo del resultado.
Nota: La mayoría de funciones de MySQL aceptan identificador_enlace como último parámetro opcional.
Si no es definido, se utiliza la última conexión abierta. Si no existe, se intenta establecer una conexión con
los parámetros predeterminados definidos en php.ini. Si no tiene éxito, las funciones devuelven FALSE.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
117
Lección 19 y 20: Acceso a datos MySQL con PHP
Conectar a MySQL desde PHP
Detalle de funciones de conexión y resultado
Un buscador para una base de datos
Creación de una BD en MySQL desde PHP
Proyecto: Mostrar resultado de SQL en las págs.
NOTA:
En los ejemplos de esta parte, se esta utilizando la base de datos “BDanimales”.
1. mysql_connect -- Abre una conexión a un servidor MySQL
int mysql_connect ([cadena hostname [, cadena usuario [, cadena password
[, bool new_link [, int client_flags]]]]] )
Devuelve: Un identificador de enlace positivo si tiene exito, o falso si hay error.
mysql_connect( )Todos los argumentos son opcionales, y si no hay, se asumen los valores
por defecto ('localhost', usuario propietario del proceso del servidor, password vacío).
Nota: Siempre que específicque "localhost" o "localhost:port" como servidor, la libreria cliente
de MySQL evitará esto y tratará de conectarse a socket local (nombrado pipe en Windows). Si
quiere usar TCP/IP, use "127.0.0.1" en vez de "localhost". Si las librerias cliente de MySQL
intentan conectarse a un socket local equivocado, debe fijar la trayectoria como
mysql.default_host en el archivo de configuración PHP y dejar el campo del servidor en blanco.
El enlace al servidor sera cerrado tan pronto como la ejecución del script finalice, a menos que
se cierre antes explícitamente llamando a mysql_close().
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
118
mysql_close($id);
?>
2. mysql_select_db -- Selecciona un base de datos MySQL
int mysql_select_db(cadena base_de_datos[, int identificador_de_enlace])
mysql_select_db( ) establece la base activa que estará asociada con el identificador de enlace
específicado. Si no se específica un identificador de enlace, se asume el último enlace abierto.
Si no hay ningún enlace abierto, la función intentará establecer un enlace como si se llamara a
mysql_connect( ).
mysql_query() envía una consulta (a la base de datos activa en el servidor asociado con el
identificador_de_enlace dado).
Para otro tipo de sentencia SQL, UPDATE, DELETE, DROP, etc, mysql_query() regresa
TRUE en caso exitoso y FALSE en error.
NOTA: Para ejecutar el Ejemplo, adicione el código de conexión y selección de base de datos.
<?php
// Resultado al ejecutar consulta
$SQL = 'SELECT * WHERE 1=1'; //Cambiar por 'SELECT * FROM mascotas'
$resultado = mysql_query($SQL, $id) or die('Error en SQL: '.mysql_error());
echo "Numero de filas: ".mysql_num_rows($resultado);
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
119
4. mysql_result -- Devuelve datos de un resultado
NOTA: Para ejecutar el Ejemplo, adicione el código de conexión y selección de base de datos.
<?php
// Resultado al ejecutar consulta
$SQL = 'SELECT nombre, propietario FROM mascotas';
$resultado = mysql_query($SQL, $id) or die('Error en SQL: '.mysql_error());
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
120
6. mysql_close -- cierra el enlace con MySQL
int mysql_close ( [int identificador_de_enlace] )
mysql_close() cierra el enlace con la base MySQL que esta asociada con el identificador de
enlace específicado. Si no se específica el identificador de enlace, se asume por defecto el
último enlace.
<?php
$id = mysql_connect('localhost', 'invitado', 'miclave')
or die('No pudo conectarse: '.mysql_error());
echo 'Se conecto con éxito <br>';
mysql_close($id);
echo 'Se cerro la conexión';
?>
<?php
// Identificador de enlace
$id = mysql_connect('localhost', 'root', 'mysql') or die('No pudo conectarse:'. mysql_error());
// Cerrar la conexion
mysql_close($id);
?>
Actividad
El Ejemplo 7, presentarlo en una tabla defenida en HTML.
Efectuar diferentes consultas y presentarlo en tablas y/o celdas con formatos variados.
- Mostrar las mascotas de Arnoldo y Benito
- Mascotas que tienen más de 6 años.
- Mostrar los campos: Nombre, especie, propietario y comentario.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
121
Detalle de funciones MySQL para de conexión y resultado
2. mysql_drop_db -- Borra una base de datos MySQL. Intenta suprimir una base de datos
completa del servidor asociado al identificador de enlace.
int mysql_drop_db ( cadena base_de_datos [, int identificador_de_enlace] )
Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.
3. mysql_create_db (Crear BD) esta función es obsoleta debe usar mysql_query() con una
consulta “CREATE DATABASE BD_nombre”.
mysql_query(―CREATE DATABASE BD_nombre‖, identificador_de_enlace );
9. mysql_fetch_array -- Extrae la fila de resultado como una matriz asociativa, una matriz
numérica o ambas
array mysql_fetch_array ( int id_resultado [, int tipo_de_resultado] )
Devuelve una matriz que corresponde a la sentencia extraida, o falso si no quedan más
filas.
10. mysql_fetch_assoc -- Recupera una fila de resultado como una matriz asociativa
array mysql_fetch_assoc ( resource resultado )
Devuelve una matriz asociativa que corresponde a la fila recuperada y mueve el apuntador
de datos interno hacia adelante. mysql_fetch_assoc() es equivalente a llamar
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
122
mysql_fetch_array() con MYSQL_ASSOC como el segundo parámetro opcional.
Únicamente devuelve una matriz asociativa.
<?php
// Identificador de enlace, como ADMINISTRADOR
$id = @mysql_connect('localhost', 'root', 'mysql')
or die("ERROR_1: ADMINISTRADOR no válido. ".mysql_error());
// Nombre de BD a crear
$nombre_BD = "BDVentaArticulos";
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
123
die ("<br> ERROR_2: YA EXISTE LA BD...<BLINK>".$nombre_BD."</BLINK><br>");
}
}
// Si no existe lo creamos
if($existe=="NO")
{
$crear_BD = @mysql_query("CREATE DATABASE $nombre_BD", $id)
or die("ERROR_3: <BLINK> Imposible crear BD </BLINK>".mysql_error());
echo "<br> Se creo la BD <BLINK>".$nombre_BD."</BLINK><br>";
}
/*
// NOTA: también aquí se puede definir la tabla y sus campos
*/
NOTA: después de crear la base de datos, debe cargar los archivos para BD y también las
tablas que contiene a los operadores y los permisos definidos para el proyecto.
mysql> select * from operadores;
+---------+----------------+-------+-------+----------+--------+------+
| codoper | nombre | login | clave | permisos | estado | tipo |
+---------+----------------+-------+-------+----------+--------+------+
| 1 | Administrador | admin | admin | A | A | A |
| 2 | Gonzalo Neira | neira | neira | CE | A | O |
| 3 | Erika Enriquez | erika | erika | A | I | O |
+---------+----------------+-------+-------+----------+--------+------+
function verificarOperador()
{
/////////////******* Obteniendo conexion (Resource id #2)******//////////////////
$miConexion=conexion();
//echo "Conexión a BD: ".$miConexion."<br>"; //Resultado: Resource id #2
$elUsuario=$_POST['usuario'];
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
124
$laClave=$_POST['clave'];
$codOper;
if($n==0)
{
echo '<h2>[ERROR] No EXISTE Operador. Login y/o clave no registrado... </h2>';
echo '<h3><P><a href = index.php>Regresar</a> </h3>';
die("...Clave o Usuario incorrecto...");
}
if ($codOper>0)
{
?>
<html>
<head>
<title>Página de inicio</title>
</head>
<frameset rows="120,*" border=1>
<frame src="superior.php" scrolling=no noresize>
<frameset cols="200,*">
<frame src="menu.php" scrolling=yes noresize>
<frame src="blanco.php" name="blanco" scrolling=yes noresize">
</frameset>
</frameset>
</html>
<?php
}
?>
Actividad
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
125
Lección 21 y 22. Sentencias SQL en BD MySQL con PHP
Un buscador para una base de datos
Añadir, Modificar, Borrar, insertar registros
Proyecto: Pruebas de ejecución de consultas SQL
<?php
//____________________________________________________________________________CONSULTA
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
$buscado = trim($_POST['buscado']);
//Validando en el servidor
if($buscado=="")
{
echo "[ERROR_1] Escriba una palabra a buscar...".mysql_error()."<br>";
die("<a href = 'r01_buscar.php'> Regresar...</a>");
}
// Resultado al enviar una consulta SQL
$sql = "SELECT * FROM cliente WHERE apeCli LIKE '%$buscado%' ORDER BY codCli";
$r = mysql_query($sql, $miConexion) or die('[ERROR_2] en SQL. '.mysql_error()."<a
href = 'r01_buscar.php'> Regresar...</a>");
$f = mysql_num_rows($r); // Número de FILAS
$c = mysql_num_fields($r); // Número de COLUMNAS
?>
//____________________________________________________________________________ENCABEZADO
<body bgcolor="#fefee1">
<br><br><br>
<table width="100%" border="1" cellspacing="1" cellpadding="3">
<tr>
<th> Codigo </th>
<th> Nombre </th>
<th> Apellido </th>
<th> Teléfono </th>
</tr>
//________________________________________________________________________CUERPO
<?php
while($a=mysql_fetch_array($r))
{
?>
<tr>
<td> <?php echo $a['codCli']; ?> </td>
<td> <?php echo $a['nomCli']; ?> </td>
<td> <?php echo $a['apeCli']; ?> </td>
<td> <?php echo $a['telCli']; ?> </td>
</tr>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
126
<?php
}
?>
</table>
//_____________________________________________________________________________REGRESAR
<br><br>
<a href=r01_buscar.php> Regresar </a>
</body>
SEGUNDO MODO.
NOTA: Archivo: r01_buscar_result_mod2.php ubicado en la carpeta reportes
<?php
//____________________________________________________________________________CONSULTA
// NOTA: CONSULTA igual que el anterior
?>
//____________________________________________________________________________ENCABEZADO
<body bgcolor="#fefee1">
<br><br><br>
<table width="100%" border="1" cellspacing="1" cellpadding="3">
<tr>
<?php
for($i=0; $i<$c; $i++)
{
echo "<th>".mysql_field_name($r, $i)."</th>";
}
?>
</tr>
//________________________________________________________________________CUERPO
<?php
while($a=mysql_fetch_array($r))
{
echo "<tr>";
for($k=0; $k<$c; $k++)
{
echo "<td>".$a[$k]."</td>";
}
echo "</tr>";
}
?>
</table>
//___________________________________________________________________________REGRESAR
<br><br>
<a href=r01_buscar.php> Regresar </a>
</body>
TERCER MODO.
NOTA: Archivo: r01_buscar_result_mod3.php ubicado en la carpeta reportes
<?php
//____________________________________________________________________________CONSULTA
// NOTA: CONSULTA igual que el anterior
?>
//____________________________________________________________________________ENCABEZADO
<body bgcolor="#fefee1">
<br><br><br>
<table width="100%" border="1" cellspacing="1" cellpadding="3">
<tr>
<?php
mysql_field_seek($r, 0);
while($A = mysql_fetch_field($r))
{
echo "<th> $A->name </th>";
}
?>
</tr>
//________________________________________________________________________CUERPO
// NOTA: CUERPO igual que el anterior
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
127
//___________________________________________________________________________REGRESAR
<br><br>
<a href=r01_buscar.php> Regresar </a>
</body>
<center>
<body bgcolor="#fefee1">
<br><br> <h2> Actualizando registros de ALMACEN </h2>
<form name="form1" method="post" action="actualizar_p2_resumen.php">
<?php
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
//RECIBIENDO DATOS
$alm_tabla = $_POST['alm_tabla'];
$ini_codAlm = $_POST['ini_codAlm'];
$i=0;
foreach($alm_tabla as $key => $value)
{
if($key==$i)
{
$a1[]=$value;
$i=$i+2;
}
else
{
$a2[]=$value;
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
128
}
}
// ACTUALIZAR
for($k=0; $k<count($a1); $k++)
{
$cod_mof = $a1[$k];
$dir_mof = $a2[$k];
$cod_ini = $ini_codAlm[$k];
// RESUMEN
echo "<BLINK> Resumen de datos modificados </BLINK><BR>";
while($a=mysql_fetch_array($r3))
{
for($i=0; $i<$c3; $i++)
{
echo mysql_field_name($r3,$i).":___ ".$a[$i]."<br>";
}
echo "<br>";
}
?>
// INSERTANDO REGISTRO
$sql = "INSERT INTO orden (codOrd, codCli, codArt, catOrd, fecOrd, tipOrd) ";
$sql.= "VALUES('$codOrd', '$codCli', '$codArt', '$catOrd', '$fecOrd', '$tipOrd')";
$r = mysql_query($sql, $miConexion) or die("ERROR en SQL_orden".mysql_error());
echo "Registros afectados: ".mysql_affected_rows($miConexion)."<br><br>";
//RESUMEN
echo "<BLINK> Resumen de datos insertados </BLINK><BR>";
while($a=mysql_fetch_array($r2))
{
for($i=0; $i<mysql_num_fields($r2); $i++)
{
echo mysql_field_name($r2,$i).":___ ".$a[$i]."<br>";
}
}
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
129
Definición de funciones para acceso a datos MySQL
Desarrollo de aplicaciones con restricciones del acceso – Operadores y permisos en BD.
Borrar o eliminar registros de una base de datos.
Funciones para reportes después de: actualizar, adicionar o eliminar registros.
Reportes de varias consultas de la base de datos MySQL
Para eliminar registros de órdenes, primero debe diseñar una tabla que muestre la TABLA
ORDEN con todos los campos que esta tiene y acompañando los nombres y descripción de la
TABLA CLIENTE Y ARTÍCULOS, a lado de cada registro, también debe incluir un check que
permita seleccionar los registros a eliminar, como muestra la imagen.
El segundo formulario será para recibir información de los registros a eliminar, pero este
formulario hace referencia a una función para reportar un resumen de los registros eliminados.
El tercer script es la definición de una FUNCIÓN para dar reporte de resumen que el mismo se
ejecuta solo cuando es llamdo por cualquiera de las páginas que ya fueron definidas como:
MODIFICAR REGISTROS, ACTUALIZAR REGISTROS, ELIMINAR REGISTROS, ETC.
PRIMER formulario, el código, muestra la definción del formulario para seleccionar registros a
eliminar.
<center>
<body bgcolor="#fefee1">
<br><br>
<h2><BLINK> Eliminando registros de tabla ORDEN </BLINK></h2>
<form name="form1" method="post" action="eliminar_p2_resumen.php">
<?php
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
130
echo "</tr>";
for($i=0; $i<$f; $i++)
{
echo "<tr>";
for($j=0; $j<$c; $j++)
{
echo "<td>".mysql_result($r, $i, $j)."</td>";
$codAlm = mysql_result($r, $i, 0);
}
echo "<td><input type='checkbox' name='codOrd_eliminar[]' value='$codAlm'> </td>";
echo "<tr>";
}
?>
</table>
<br>
<input type="submit" name="Submit" value="Enviar">
<input type="reset" name="Reset" value="Borrar">
</form>
<body>
</center>
SEGUNDO formulario, este formulario procesa la información recibida del primer formulario.
En la parte final del script se llama a una función definida como resumen_final($conexión;
$tabla, $ordenado_por), que el mismo se detalla en el tercer script.
<center>
<body bgcolor="#fefee1">
<?php
// var_dump($_POST);
include('../funciones_PHP/funcion_conexion.ini.php');
include('../funciones_PHP/funcion_resumen.ini.php');
$miConexion = conexion();
//Recibiendo datos
$codOrd_eliminar = $_POST['codOrd_eliminar'];
// Actualizar
for($k=0; $k<count($codOrd_eliminar); $k++)
{
$reg_eliminar = $codOrd_eliminar[$k];
$sql = "DELETE FROM orden WHERE codOrd='$reg_eliminar' ";
$r = mysql_query($sql, $miConexion) or
die("ERROR en SQL_eliminar...".mysql_error());
$reg+= mysql_affected_rows($miConexion);
}
// Resumen
echo "<h2><BLINK> Resumen despues de eliminar: $reg registros...</BLINK></h2>";
resumen_final($miConexion, 'orden', 'codOrd');
?>
</body>
</center>
TERCER formulario, este script define una función para dar un resumen de los registros
eliminados. Este escript tiene parámetros como: identificador_de_enlace, tabla a usar para la
consulta y finalmente el tercer parámetro es un criterio para ordenar.
Este script esta definida para ser reutilizada para todas las páginas que den un resumen
después de ACTUALIZAR, modificar, eliminar, adicionar registros en la base de datos.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
131
$c2 = mysql_num_fields($r2); //Número de COLUMNAS
?>
<table width="75%" border="1" cellspacing="1" cellpadding="1">
<tr>
<?php
for($i=0; $i < $c2; $i++)
{
echo "<td>".mysql_field_name($r2, $i)."</td>";
}
?>
</tr>
<?php
for($i=0; $i < $f2; $i++)
{
echo "<tr>";
for($j=0; $j < $c2; $j++)
{
echo "<td>".mysql_result($r2, $i, $j)."</td>";
}
echo "</tr>";
}
?>
</table>
<?php
}
?>
Ejemplo de reporte:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
132
$sql.= "WHERE o.codCli=c.codCli ";
$sql.= "GROUP BY o.codCli ";
$sql.= "ORDER BY suma_pedidos desc";
// Resumen
echo "<h2><BLINK> Resultado de reporte... </BLINK></h2>";
?>
<?php
for($i=0; $i < $f; $i++)
{
echo "<tr>";
for($j=0; $j < $c; $j++)
{
echo "<td>".mysql_result($r, $i, $j)."</td>";
}
echo "</tr>";
}
?>
</table>
</body>
</center>
Otros reportes
Reporte 1
Reporte 2
Reporte 3
Reporte 4
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
133
Lección 23 y 24. Evaluación
xx
yy
zz
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
134
Lección 25. AJAX con PHP
Que es ajax
El objeto XMLHttpRequest
- Atributos: onreadystatechange, readyState, responseText, responseXML, status, statusText.
- Métodos: abort, getAllResponseHeaders, getResponseHeader, open, send, setRequestHeader.
Creación del objeto XMLHttpRequest
Realizar una petición con AJAX
- Método: escape
Recibir la petición AJAX
La respuesta AJAX
Tratamiento de la respuesta AJAX
- Método: getElementsByTagName
Mostrar los datos al usuario
Implementaciones de AJAX: Prototype - Funciones Ajax, xaJax - Introducción, xaJax - Funciones
PHP, xaJax – El Objeto, xaJax - En el lado del cliente.
Curso de AJAX
En este curso aprenderemos a utilizar AJAX para crear nuestras propias aplicaciones así como
también encontraremos una referencia completa y con ejemplos de los métodos y atributos que
utilizaremos con esta tecnología:
Que es ajax
Según wikipedia AJAX (Asynchronous JavaScript And XML) és una técnica de desarrollo web
para crear aplicaciones interactivas mediante la combinación de tres tecnologías ya existentes
que conoceremos en este manual. Es una manera de crear una aplicación que responde a las
acciones del usuario sin refrescar la página contra el servidor.
Tecnologías
Para conseguir este efecto, se utilizan la mayoría de las tecnologías disponibles para páginas
web, HTML, CSS, XML, JavaScript y algún lenguaje de servidor cómo puede ser PHP o ASP.
Veamos que función tiene cada lenguaje en la aplicación:
JavaScript - Para manejar el objeto XMLHttpRequest y DOM tratar para los datos recibidos.
HTML - Distribuye en la ventana del navegador los elementos de la aplicación y la
información recibida por el servidor
CSS - Define el aspecto de cada elemento y dato de la aplicación
XML - Es el formato de los datos transmitidos del servidor al cliente (navegador) y que
posteriormente serán mostrados.
Lenguaje de servidor - Genera la información útil en XML y la envía al navegador.
Funcionamiento
El usuario accede a la aplicación que es enviada por el servidor en formato HTML, JavaScript y
CSS. Luego el código JavaScript de la aplicación pide al servidor los datos que quiere mostrar
y este, ejecuta un código de lado de servidor que envía al navegador los datos en formato
XML.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
135
Cada vez que el usuario realiza una acción que significa mostrar unos datos, la capa javascript,
repite la acción anterior de manera invisible al usuario y muestra los datos deseados.
Problemas
El principal problema de la gran mayoría de aplicaciones AJAX (lo digo por experiencia como
usuario de mozilla) es la baja compatibilidad entre navegadores, puesto que la capa JavaScript,
es de una gran complejidad y a menudo por falta de experiencia en el lenguaje, o por falta de
tiempo, se opta por programar solo para Internet Explorer.
Ejemplos
Un excelente ejemplo de aplicación AJAX, bastante compatible entre navegadores es Google
Maps, en ella podrás ver cómo cambiamos la posición del mapa sin recargar la página...
El objeto XMLHttpRequest
Un objeto XMLHttpRequest es una instancia de una API que nos permite la transferencia de
datos en formato XML desde los script del navegador ( JavaScript, JScrip, VBScript ... ) a los
del servidor ( PHP, Perl, ASp, Java ... ) e inversamente.
Metodos y atributos
Atributos:
onreadystatechange
readyState
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
136
responseText
responseXML
status
statusText
Metodos:
abort
getAllResponseHeaders
getResponseHeader
open
send
setRequestHeader
onreadystatechange (atributo)
El atributo onreadystatechange asigna la función que se ejecutará cada vez que readyState
cambie de valor.
Utilización
oXMLHttpRequest.onreadystatechange = fFuncion;
oXMLHttpRequest - Objeto XMLHttpRequest
fFuncion - Función a ejecutar
Frecuentemente utilizamos onreadystatechange para definir una función para leer los datos
recibidos del servidor, en este caso en su interior comprobaríamos que readyState tenga valor
4 y entonces leeremos el valor de responseXML, responseText...
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest previamente haremos que nos
alerte el estado del objeto (readystate) cada vez que este cambie.
readyState (atributo)
El atributo readyState devuelve el estadoactual del objeto XMLHttpRequest, cada vez que
cambia el valor de readyState se lanza la funcion indicada en onreadystatechange
Utilización
iEstado = oXMLHttpRequest.readyState;
iEstado - Estado actual del objeto
0 - Sin inicializar, siempre será:
1 - Abierto (acaba de llamar open)
2 - Enviado
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
137
3 - Recibiendo
4 - A punto
oXMLHttpRequest - Objeto XMLHttpRequest
La propiedad readyState se utiliza en todas las comunicaciones asíncronas para comprovar
que podemos acceder ya a atributos como responseXML y responseText, sólo accesibles en
los estados 3 y 4.
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest previamente haremos que nos
alerte el texto recibido en modo asíncrono.
responseText (atributo)
El atributo responseText devuelve el texto del documento descargado del servidor en una
petición con XMLHttpRequest.
Utilización
sDocumento = oXMLHttpRequest.responseText;
sDocumento - Cadena de caracteres con el texto del documento.
oXMLHttpRequest - Objeto XMLHttpRequest
La propiedad responseText se utiliza para tratar los datos recibidos desde el servidor que no
tienen formato XML, podremos acceder a los datos siempre y cuando el estado de la conexión
devuelto con readyStatechange sea igual a 3 (recibiendo) o 4 (a punto).
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest previamente haremos que nos
alerte el texto recibido en modo asíncrono.
responseXML (atributo)
El atributo responseXML devuelve una referéncia al cuerpo del documento descargado del
servidor en una petición con XMLHttpRequest en formato XML.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
138
Utilización
oDocumento = oXMLHttpRequest.responseXML;
oDocumento - Referéncia al cuerpo del objeto recibido.
oXMLHttpRequest - Objeto XMLHttpRequest
La propiedad responseXML se utiliza para tratar los datos recibidos en formato XML desde el
servidor, podremos acceder a los datos siempre y cuando el estado de la conexión devuelto
con readyStatechange sea igual a 4 (a punto).
Esta propiedad nos devolverá null siempre que la respuesta XML del servidor no tenga el
encabezado text/xml, application/xml o acabe en +xml.
Utilizaremos las propiedades del Modelo de Objetos de Documento (DOM) para tratar los datos
XML recividos.
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest previamente y realizado una
petición de un xml con marcas <item> haremos que nos alerte el número de item's.
status (atributo)
El atributo statusText devuelve el código del estado HTTP de la transmisión devuelto por el
servidor web.
Utilización
iEstado = oXMLHttpRequest.status;
iEstado - Entero con el código HTTP de estado.
oXMLHttpRequest - Objeto XMLHttpRequest
La propiedad status e utiliza para comprobar que no ha habido problemas en la comunicación
con el servidor, podremos acceder a los datos siempre y cuando el estado de la conexión
devuelto con readyStatechange sea igual a 3 (reciviendo) o 4 (a punto).
El código de estado HTTP para una transmisión correcta es el 200, será conveniente
comprobar este dato antes de acceder a los datos con responseXML o responseText, puedes
ver una lista de los otros posibles códigos y su significado en este artículo.
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest mostramos un error cuando la
conexión no ha sido satisfactória.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
139
statusText (atributo)
El atributo statusText devuelve el texto del estado HTTP de la transmisión devuelto por el
servidor web.
Utilización
sEstado = oXMLHttpRequest.statusText;
sEstado -Cadena de caracteres con el texto del estado HTTP.
oXMLHttpRequest - Objeto XMLHttpRequest
La propiedad statusText no es de uso común, normalmente en su lugar usaremos status,
podremos acceder a los datos siempre y cuando el estado de la conexión devuelto con
readyStatechange sea igual a 3 (reciviendo) o 4 (a punto).
Ejemplo
Habiendo creado el objeto XMLHttpRequest oXMLHttpRequest mostramos el texto de estado.
abort (metodo)
El método abort detiene todas las conexiones asíncronas abiertas por el objeto
XMLHttpRequest lo y reinicializa poniendo a cero su estado (readyState).
Utilización
oXMLHttpRequest.abort ();
oXMLHttpRequest - Objeto XMLHttpRequest
Frecuentemente se utiliza abort antes de realizar una nueva petición al servidor a través de un
objeto que está realizando o recibiendo otra petición anterior.
Ejemplos
Vamos a crear un botón para que el usuario pueda detener en cualquier momento la
comunicación a través del objeto oXMLHttpRequest préviamente creado.
Vamos a realizar una petición liberando antes el objeto oXML préviamente creado.
000 <script>
001 // Liberamos el objeto
002 oXML.abort ();
003 // Enviamos los datos
004 oXML.open('GET', 'archivo.txt');
005 // Preparamos la recepción
006 oXML.onreadystatechange = leerDatos;
007 // Realizamos la petición
008 oXML.send('');
009 </script>
getAllResponseHeaders (metodo)
El método getAllResponseHeaders devuelve en una sola cadena de caracteres los
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
140
encabezados HTTP que se han recibido del servidor en una conexión usando el objeto
XMLHttpRequest.
Utilización
sHeaders = oXMLHttpRequest.getAllResponseHeaders ();
sHeaders - Cadena de caracteres con los encabezados.
oXMLHttpRequest - Objeto XMLHttpRequest
La cadena sHeaders contendrá todos los encabezados enviados por el servidor excepto el de
estado ( por ejemplo HTTP/1.1 200 OK), los encabezados serán devueltos separados por la
combinación 'salto de linea' + 'retorno de caro'.
Podremos acceder a los encabezados siempre y cuando el estado de la conexión devuelto con
readyStatechange sea igual a 3 (reciviendo) o 4 (a punto).
Ejemplo
Vamos a mostrar en un alert todos los encabezados recibidos en una conexión.
getResponseHeader (metodo)
El método getResponseHeader devuelve en una sola cadena de caracteres uno de los
encabezados HTTP que se han recibido del servidor en una conexión usando el objeto
XMLHttpRequest.
Utilización
sHeaders = oXMLHttpRequest.getAllResponseHeaders ( sHeaderName );
sHeaders - Cadena de caracteres con los encabezados.
oXMLHttpRequest - Objeto XMLHttpRequest
sHeaderName - Cadena de caracteres con el nombre del encabezado
La cadena sHeaders contendrá todos los encabezados con nombre igual a sHeaderName
enviados por el servidor separados por la combinación 'coma' + 'espacio'.
Podremos acceder a los encabezados siempre y cuando el estado de la conexión devuelto con
readyStatechange sea igual a 3 (reciviendo) o 4 (a punto).
Ejemplo
Vamos a mostrar en un alert todos los encabezados 'X-Powered-By' recibidos en una conexión.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
141
open (metodo)
El método open prepara una conexión HTTP a través del objeto XMLHttpRequest ( con un
método y una URL especificados ) y inicializa todos los atributos del objeto.
Utilización
oXMLHttpRequest.open ( sMetodo, sURL [, bSincronia [, sUsuario [, sPwd ] ] ] );
oXMLHttpRequest - Objeto XMLHttpRequest
sMetodo - String con el método de conexión ( GET o POST ).
sURL - URL para la peticion HTTP
bSincronia - Booleano opcional en true ( por defecto ) para usar modo asíncrono y en false
para síncrono.
sUsuario - Cadena de caracteres opcional con el nombre de usuario para la autenticación
sPwd - Cadena de caracteres opcional con la contraseña del usuario sUsuariopara la
autenticación
Al llamar a open el atributo readyState a 1, resetea los headers de envío y los devuelve
atributos responseText, responseXML, status y statusText a sus valores iniciales
Nota:
No se permiten las llamadas a dominios, puertos o protocolos diferentes al de la página que
llama la función
Frecuentemente se utiliza metodo GET para permitir al navegador guardar datos en cache y
POST para obligar a descargar los datos de nuevo.
La URL puede contener un usuario y una contraseña que se usarán en cada conexión y
tendrán preferéncia ante los pasados por parámetro a la función. Los parametros sUsuario y
sPwd solo se usarán para enviarlos si se recibe una respuesta 401 - Access Denied mientras
que por URL se usarán siempre.
Por definición deberemos usar modo asíncrono para que podemos llamarlo AJAX
Ejemplo
Vamos realizar una conexión para descargar index.htm.
send (metodo)
El método send envía la petición con los datos pasados por parámetro como cuerpo de la
petición a través del objeto XMLHttpRequest.
Utilización
oXMLHttpRequest.send ( mData );
oXMLHttpRequest - Objeto XMLHttpRequest
oData - Cuerpo de la petición HTTP.
El parametro oData puede ser una referéncia al DOM de un documento o una cadena de
caracteres.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
142
Nota:
Se recomienda pasar siempre el parametro oData aunque no sea requerido en algunos
navegadores
Ejemplo
Vamos realizar una conexión para descargar index.htm.
setRequestHeader (metodo)
El método setRequestHeader añade un encabezado HTTP a la petición HTTP a través del
objeto XMLHttpRequest.
Utilización
oXMLHttpRequest.setRequestHeader ( sNombre, sValor);
oXMLHttpRequest - Objeto XMLHttpRequest
sNombre - Nombre del encabezado HTTP.
sValor - Valor del encabezado HTTP.
El parametro sNombre deberá no podrá ser Accept-Charset, Accept-Encoding, Content-Length,
Expect, Date, Host, Keep-Alive, Referer, TE, Trailer, Transfer-Encoding ni Upgrade, tampoco
podrá contener espacios, puntos o saltos de línea.
Ejemplo
Vamos a añadir el encabezado UserAgent a nuestra petición XMLHttpRequest:
Este objeto, esta disponible para la mayoría de navegadores modernos excepto las versiones 5
y 6 de Internet Explorer, para las cuales tendremos que usar un objeto ActiveX llamado
'Microsoft XMLHTTP', por lo tanto , cuando creemos el objeto de comunicación con el servidor
deberemos tener en cuenta el navegador con el que trabaja nuestro usuario.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
143
Además, teniendo en cuenta que es posible que algunos usuarios accedan con un navegador
sin JavaScript o con una versión pobre del mismo, en caso de que el objeto no pueda crearse
de ninguna de la dos maneras, deberemos indicarlo al usuario o mejor todavía, dirigirlo a una
versión tradicional de la aplicación (sin AJAX).
Para hacer el código más limpio, crearemos una función para realizar la conexión que usará
variables locales, además es recomendable incluir todas las funciones que usaremos en un
fichero .js externo e incluirlo en el documento HTML.
000 <script>
001 function AJAXCrearObjeto(){
002 var obj;
003 if(window.XMLHttpRequest) { // no es IE
004 obj = new XMLHttpRequest();
005 } else { // Es IE o no tiene el objeto
006 try {
007 obj = new ActiveXObject("Microsoft.XMLHTTP");
008 }
009 catch (e) {
010 alert('El navegador utilizado no está soportado');
011 }
012 }
013 return obj;
014 }
015 </script>
000 <script>
001 oXML = AJAXCrearObjeto();
002 </script>
Existen dos tipos de petición al servidor que explicaremos en la referéncia del método open, la
petición síncrona y la asíncrona, pero por definición AJAX utiliza comunicación asíncrona que
es la que explicaremos en este artículo.
Al método open, hay que pasarle el método de petición (GET) y la URL que se enviará al
servidor y mediante la cual, el servidor, creará la respuesta que posteriormente leeremos.
000 <script>
001 // Creamos el objeto
002 oXML = AJAXCrearObjeto();
003 // Preparamos la petición
004 oXML.open('GET', 'archivo.txt');
005 // Preparamos la recepción
006 oXML.onreadystatechange = leerDatos;
007 // Realizamos la petición
008 oXML.send('');
009 </script></a href=">
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
144
Para que esto funcione, tendremos que haber declarado la función leerDatos para tratar los
datos recibidos del servidor y mostrarlos al usuario, pero esto lo veremos más adelante.
Paso de parámetros
En la petición AJAX podemos pasar parámetros tanto por POST como por GET a nuestro
servidor.
Para pasar parámetros por GET ( por URL ) , usaremos una URL con parametros en la función
open independientemente de usar el método GET o POST, por ejemplo:
000 <script>
001 // Creamos la variable parametro
002 parametro = 'Datos pasados por GET';
003 // Creamos el objeto
004 oXML = AJAXCrearObjeto();
005 // Preparamos la petición con parametros
006 oXML.open('GET', 'pagina.php?parametro=' + escape(parametro));
007 // Preparamos la recepción
008 oXML.onreadystatechange = leerDatos;
009 // Realizamos la petición
010 oXML.send('');
011 </script></a href=">
Para pasarlos por POST, deberemos usar el método POST en la función open y pasar los
parámetros desde la función send, veamos un ejemplo:
000 <script>
001 // Creamos la variable parametro
002 parametro = 'Datos pasados por POST';
003 // Creamos el objeto
004 oXML = AJAXCrearObjeto();
005 // Preparamos la petición con parametros
006 oXML.open('POST','pagina.php');
007 // Preparamos la recepción
008 oXML.onreadystatechange = leerDatos;
009 // Realizamos la petición
010 oXML.send( 'parametro=' + escape(parametro));
011 </script></a href=">
Nota:
Siempre que enviemos parámetros, será conveniente preparar los datos préviamente usando la
función escape.
escape (metodo)
El método escape devuelve la cadena pasada por parámetro con las transformaciones
nescesárias para ser enviada en una transacción HTTP.
Utilización
sCodificada = escape ( sDescodificada);
sCodificada - Cadena preparada para ser enviada
sDescodificada - Cadena antes de las transformaciones.
La cadena sCodificada es devuelta en formato Unicode, todos los caracteres no ASCII ( signos
de puntuación, espacios, acentos... ) de sDescodificada són sustituidos por su notación %XX,
donde XX es su equivalente hexadecimal.
Ejemplo
Vamos a codificar una cadena no ASCII:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
145
005 cadena = escape ( cadena );
006 // alertamos los datos
007 alert ( cadena );
008 // resultado: "Hola%21%20amigo"
009 -->
010 </script>
Lo primero que haremos será comprobar el estado de la petición y lo haremos con el método
readyState que nos puede devolver cualquiera de los siguientes valores:
0 (No inicializado) - Los datos de la petición no se han definido
1 (Abierto) - La recepción de datos está en curso
2 (Cargado) - La recepción de datos ha finalizado pero los datos no están disponibles
3 (Interactive) - El objeto aún no está listo para otra petición pero ha recibido ya los datos.
4 (Completado) - El objeto está listo para otra petición
Y una vez estamos en estado cargado, ya podemos leer el texto recibido usando el método
responseText, veamos un ejemplo:
Ahora vamos a ver el primer ejemplo completo de AJAX usando lo que hemos aprendido en
este artículo y los dos anteriores de este mismo curso:
000 <script>
001 function leerDatos(){
002 if (oXML.readyState == 4) {
003 alert (oXML.responseText);
004 }
005 }
006 function AJAXCrearObjeto(){
007 var obj;
008 if(window.XMLHttpRequest) { // no es IE
009 obj = new XMLHttpRequest();
010 } else { // Es IE o no tiene el objeto
011 try {
012 obj = new ActiveXObject("Microsoft.XMLHTTP");
013 } catch (e) {
014 alert('El navegador utilizado no está soportado');
015 }
016 }
017 return obj;
018 }
019
020 oXML = AJAXCrearObjeto();
021 oXML.open('GET', 'archivo.txt');
022 oXML.onreadystatechange = leerDatos;
023 oXML.send('');
024 </script>
Podéis ejecutar este ejemplo o descargarlo para modificarlo y probarlo libremente en vuestro
ordenador
La respuesta AJAX
Por definición, AJAX utiliza XML para organizar los datos transmitidos entre el servidor y el
navegador, para que el navegador sea capaz de interpretar estos datos, tendrá que
identificarlos cómo XML y su contenido tendrá que ser un XML válido, o de lo contrario, los
datos no serán utilizables.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
146
Los encabezados
El primer paso para que el navegador interprete el contenido recivido es que tenga el
encabezado de contenido XML (text/xml), esto lo conseguimos enviando desde el servidor el
siguiente encabezado HTTP:
Además, cómo nuestra respuesta XML será habitualmente generada de manera dinámica, es
recomendable enviar también encabezamientos de control de caché para asegurarnos que la
aplicación siempre estará trabajando con los contenidos que solicita y no con una cache
almacenada en su navegador:
Veamos cómo mandar estos encabezados con diferentes lenguajes de programación de lado
de servidor, generalmente deberemos poner estos códigos al principio del todo del documento:
PHP
000 <?php
001 header("Content-Type: text/xml");
002 header("Cache-Control: no-cache, must-revalidate");
003 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
004 ?>
Perl
000 #!/usr/bin/perl
001 print "Content-Type: text/xml";
002 print "Cache-Control: no-cache, must-revalidate";
003 print "Expires: Mon, 26 Jul 1997 05:00:00 GMT";
ASP
000 <%
001 response.ContentType="text/xml"
002 response.CacheControl="no-cache, must-revalidate"
003 response.Expires="Mon, 26 Jul 1997 05:00:00 GMT"
004 %>
El contenido
Cuando el navegador recibe el contenido en XML, lo analizara para estructurar los datos
recibidos para que podamos tratarlos desde nuestra aplicación, para que esto funcione, el
contenido del documento deberá ser XML válido y por lo tando, deberá empezar con la
declaración de versión:
Nota:
Debeis tener cuidado con la declaración de XML cuando trabajais con archivos PHP, porque
PHP interpreta <? como inicio de su código cuando tiene las short tags activadas.
Seguidamente podremos enviar los datos en formato XML correcto (podeis ver el curso de XML
o podeis utilizar el validador de XML del consorcio W3C), veamos un ejemplo:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
147
004 <texto>Texto del mensaje</texto>
005 </mensaje>
006 </xml>
000 <script>
001 function leerDatos(){
002 if (oXML.readyState == 4) {
003 var xml = oXML.responseXML.documentElement;
004 // ...
005 }
006 }
007 </script>
archivo.xml
000 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
001 <xml>
002 <mensaje>
003 <texto>Ejemplo 1</texto>
004 </mensaje>
005 <mensaje>
006 <texto>Ejemplo 2</texto>
007 </mensaje>
008 </xml>
009
Nota:
Para poder tratar los datos recibidos es importante conocer DOM. Antes de continuar puedes
consultar estos enlaces:
Introducción al DOM
Más información sobre DOM
000 <script>
001 var item = xml.getElementsByTagName('mensaje')[0];
002 </script>
La función getElementsByTagName nos devuelve un array con todos los elementos con el
nombre de tag indicado, en este caso serán los elementos <mensaje>.
000 <script>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
148
001 for (i = 0; i < xml.getElementsByTagName('mensaje').length; i++){
002 var item = xml.getElementsByTagName('mensaje')[i];
003 }
004 </script>
000 <script>
001 var item = xml.getElementsByTagName('mensaje')[0];
002 var txt = item.getElementsByTagName('texto')[0];
003 </script>
000 <script>
001 var item = xml.getElementsByTagName('mensaje')[0];
002 var txt = item.getElementsByTagName('texto')[0];
003 alert(txt.firstChild.data)
004 </script>
Ejemplo completo
Este es el archivo del ejemplo que podeis ejecutar aquí y que utiliza lo explicado en este
artículo para parsear el XML anterior:
index.html
000 <html>
001 <head>
002 <title>ProgramaciónWeb - Ejemplo</title>
003 <script>
004 function leerDatos(){
005 if (oXML.readyState == 4) {
006 var xml = oXML.responseXML.documentElement;
007 for (i = 0; i < xml.getElementsByTagName('mensaje').length; i++){
008 var item = xml.getElementsByTagName('mensaje')[i];
009 var txt = item.getElementsByTagName('texto')[0].firstChild.data;
010 alert(txt);
011 }
012 }
013 }
014 function AJAXCrearObjeto(){
015 var obj;
016 if(window.XMLHttpRequest) { // no es IE
017 obj = new XMLHttpRequest();
018 } else { // Es IE o no tiene el objeto
019 try {
020 obj = new ActiveXObject("Microsoft.XMLHTTP");
021 }
022 catch (e) {
023 alert('El navegador utilizado no está soportado');
024 }
025 }
026 return obj;
027 }
028
029 oXML = AJAXCrearObjeto();
030 oXML.open('get', 'archivo.xml');
031 oXML.onreadystatechange = leerDatos;
032 oXML.send('');
033 </script>
034 </head>
035 </html>
getElementsByTagName (metodo)
El método getElementsByTagName devuelve una lista de todos los subelementos del elemnto
actual que tienen un nombre determinado.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
149
Utilización
aElementos = getElementsByTagName ( sNombre);
aElementos - Cadena de subobjetos del elemento.
sNombre - Nombre de los elementos que serán devueltos.
El parámetro sNombre puede contener una cadena de caracteres con el nombre de los
elementos que queremos ( por ejemplo div ) o el caracter especial asterisco ( * ) si queremos
que se nos devuelvan todos los nodos.
Ejemplo
Vamos a obtener el número elementos option de un campo select:
000 <script>
001 // Accedemos al DIV con getElementById
002 miDiv = document.getElementById('miDiv1');
003 // Modificamos su contenido
004 miDiv.innerHTML = '<b>Este es el nuevo contenido</b>';
005 </script>
La manera como pasaremos los datos recibidos del servidor al div, dependerá de cada caso,
pero vamos a ver un ejemplo que puede ser útil, imaginemos que tenemos esta lista de
usuarios en XML:
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
150
usuarios.xml
000 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
001 <xml>
002 <usuario>
003 <id>1</id>
004 <nombre>Eloi</nombre>
005 </usuario>
006 <usuario>
007 <id>2</id>
008 <nombre>Pedro</nombre>
009 </usuario>
010 <usuario>
011 <id>3</id>
012 <nombre>Juan</nombre>
013 </usuario>
014 </xml>
Vamos a suponer que hemos pedido estos datos al servidor y que hemos indicado como
readystatechange handler la función leerDatos, como vimos en el artículo Recibir la petición
AJAX y vamos a centrarnos en el contenido de dicha función para que muestre una lista de
usuarios con enlace a su perfil en el div que hemos creado con id miDiv1:
000 <script>
001 // Recibe y muestra los datos
002 function leerDatos(){
003 // Comprobamos que se han recibido los datos
004 if (oXML.readyState == 4) {
005 // Accedemos al XML recibido
006 var xml = oXML.responseXML.documentElement;
007 // Accedemos al DIV
008 var miDiv = document.getElementById('miDiv1');
009 // Vaciamos el DIV
010 miDiv.innerHTML = '';
011 // Iteramos cada usuario
012 for (i = 0; i < xml.getElementsByTagName('usuario').length; i++){
013 // Accedemos al objeto XML usuario
014 var item = xml.getElementsByTagName('usuario')[i];
015 // Recojemos el id
016 var id = item.getElementsByTagName('id')[0].firstChild.data;
017 // Recojemos el nombre
018 var nombre = item.getElementsByTagName('nombre')[0].firstChild.data;
019 // Mostramos el enlace
020 miDiv.innerHTML += '<a href="/perfil/'+id+'/">'+nombre+'</a><br>';
021 }
022 }
023 }
024 </script>
Podeis ejecutar este ejemplo y ver su código fuente para ver como se muestran los datos en la
pantalla al cargar la página.
Editar
Envía tu artículo
Resolver dudas
Implementaciones de AJAX
Existen muchas implementaciones de AJAX muy interesantes que podemos encontrar por
Internet y nos facilitarán el desarrollo de aplicaciones con comunicación con el servidor.
Vamos a hacer una lista de las que consideramos más interesantes, las ordenaremos en dos
grupos librerías de cliente y librerías de cliente/servidor:
Librerías de cliente
Estas nos permiten trabajar fácilmente con llamadas al servidor y tratar los datos recibidos, la
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
151
ventaja de estas es que no dependen de un lenguaje de servidor pero por esta misma razón
suelen integrarse peor.
prototype - Esta interesante librería de JavaScript dispone de ( entre otros ) la clase Ajax, que
nos facilitarán muchisimo el trabajo en AJaX
Librerías de cliente/servidor
Este tipo de librerías nos permite hacer llamadas a funciones del servidor desde el cliente
usando unas funciones JavaScript autogeneradas a las que llamaremos proxies.
Ajax.NET Professional - Conocido como AjaxPro nos permite crear una proxy para llamar a
métodos .Net del servidor desde JavaScript.
xaJax - xaJax es un framework (marco de trabajo) escrito en PHP de código abierto que
permite crear fácilmente aplicaciones web que utilizan AJaX
XOAD - XOAD es un proxy de PHP usando XMLHttpRequest y JSON
Lista de opciones:
Los constructores de las clases prototype que describimos a continuación pueden recibir las
siguientes opciones:
asynchronous ( true | false ) - Realizar la petición en modo síncrono o asíncrono, por defecto
true
parameters ( string o objeto ) - Parámetros como string tipo '?num=1&page=0' o tipo { 'num':1,
'page':0 }
Lista de clases:
clase Ajax.PeriodicalUpdater
Realiza cada N segundos una petición AJAX y rellena el elemento HTML indicado con la
respuesta recibida.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
152
clase Ajax.Request
Realiza una petición AJAX.
función Ajax.Responders.register
Permite registrar eventos comunes que se lanzarán cuando se produzca un determinado
evento para cualquier petición.
función Ajax.Responders.unregister
Cancela un evento registrado con Ajax.Responders.register
clase Ajax.Updater
Realiza una petición AJAX y rellena el elemento HTML indicado con la respuesta recibida.
xaJax – Introducción
xaJax es un framework (marco de trabajo) escrito en PHP de código abierto que permite crear
fácilmente aplicaciones web que utilizan AJaX sin necesidad siquiera de conocer JavaScript
(aunque sí que hay la posibilidad de hacer funciones en este lenguaje). Puedes bajarte el zip
desde aquí.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
153
En una aplicación AJaX, el servidor crea una página que es enviada al cliente. Éste interactua
con la página (rellena formularios, hace clic en ciertos objetos) que disparan ciertos eventos
(onclick, onchange...) que llaman a funciones JavaScript. Estas funciones pueden o no
interactuar con el servidor (usando AJaX) y recibiendo información de éste, mostrándola al
usuario cambiando el contenido de la misma página.
Este tipo de páginas resultan muy útiles y son uno de los pilares de la Web 2.0. Aún así,
realizar un proyecto AJaX puede resultar muy costoso y largo; pero no siempre es así.
xaJax te permite escribir funciones en PHP que pueden ser accedidas cuando ya la página ha
estado enviada al navegador, cuando el usuario ha disparado un evento o la función PHP ha
sido llamada desde JavaScript. Éstas funciones PHP modifican el contenido o el aspecto de la
página, como lo podría hacer JavaScript, pero repito que se hacen desde PHP, lo que abre un
abanico de posibilidades: PHP puede acceder a bases de datos, al sistema de archivos... Y
todo sin recargar la página!!!
La versión 0.2 del zip consta de tres scripts PHP: xajax.inc.php, que contiene la clase xajax,
xajaxResponse.inc.php, que contiene la clase xajaxResponse, y xajaxCompress.php, que es
una utilidad para, de cierta manera, reducir el peso de un archivo JavaScript. Contiene también,
en la carpeta xajax_js, dos archivos .js; uno que contiene el código original (el
xajax_uncompressed.js) y otro que es el que está comprimido y es el que se usa para enviar al
navegador (el xajax.js). Además de eso, también incorpora dos archivos .txt (la licencia y el
readme) y dos carpetas más (examples, con ejemplos de utilización y tests, donde puedes
probar xaJax).
Funcionamiento
Lo único que hay que hacer es hacer un require_once() al xajax.inc.php de la carpeta donde lo
has instalado en el servidor, local o remoto, y jugar con las posibilidades que te brindan los dos
objetos: xajax y xajaxResponse (éste integrado dentro de la función PHP).
Como he dicho antes, xaJax permitirá a una función JavaScript recibir una respuesta de una
función del servidor. Dicha respuesta estará en formato XML (como es habitual en AJaX) y será
interpretada por la misma función JavaScript que realizará los cambios en la página que se le
piden.
Así, la respuesta (en formato XML) dará unas instrucciones específicas tales como crea una
etiqueta div aquí, dale este formato y ponle este texto, elimina la etiqueta con el id tal, o haz
que se ejecute esta función JavaScript.
De cierta manera, el objeto xajaxResponse contiene la respuesta que realiza la función PHP y
el objeto xajax es el que recibe las peticiones de que se ejecuten las funciones, el que las
gestiona, al igual que todas las respuestas, y el que envia las respuestas en XML de vuelta al
navegador.
Por lo tanto, podemos distinguir dos partes en una página basada en xaJax: una parte sería
todo el código php que contiene las funciones y los objetos xajax y xajaxResponse (además de
todo el código necesario para que la web tenga un entorno dinámico) y otra parte que sería
todo lo que se ejecuta en el navegador.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
154
Recursos y Enlaces
http://www.xajaxproject.org/ Web oficial, donde puedes descargar el zip (inglés).
http://wiki.xajaxproject.org/Documentation Documentación (inglés).
http://jvelazqu.glo.org.mx Traducción de un tutorial de la página oficial.
Las funciones xaJax son funciones escritas en PHP que son llamadas desde JavaScript. Estas
funciones tienen dos objetivos: interactuar con el servidor (por eso se ha llamado a ésta
función, para crear un usuario nuevo, para examinar los archivos que hay en un directorio...) y
devolver una respuesta XML que será enviada al navegador y interpretada por JavaScript.
Esta respuesta será hecha por el objeto xajaxResponse, el que se configurará con métodos y
creará el XML que será enviado al navegador.
El constructor del xajaxResponse consta de dos argumentos: la codificación (por defecto “utf-
8”) y un booleano que si es true muestra los caracteres especiales en el navegador y si es false
los oculta (por defecto, los oculta).
El xajaxResponse será el encargado de, una vez configurado por nosotros a partir de métodos,
crear una respuesta XML. Éste XML será el que tendrá de ser devuelto al navegador, y
interpretado por el JavaScript. Así que ya podemos hacer el esquema de una función xaJax:
Nota:
Desde la versión 0.2, no hace falta llamar al método getXML() para retornar, tan solo hace falta
retornar el objeto xajaxResponse poniendo en este caso return $respuesta;
Éstos comandos (escritos por métodos) permiten cantidad de cosas, todas orientadas a
cambiar el aspecto de la página. En las siguientes páginas de éste artículo hay una lista de
todos los métodos que los escriben (en la versión 0.2).
xaJax – El Objeto
En el capítulo anterior hablábamos de las funciones PHP xaJax que permiten modificar la
página web una vez ya cargada en el navegador. Éstas funciones, pero, han de ser recogidas
por un objeto xajax.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
155
El constructor de éste objeto tiene cuatro argumentos.
$página_petición – Página a la cual se llamará para hacer la petición. Por defecto es la página
actual. Para cambiarla una vez creado el objeto, utiliza setRequestURI($página_petición).
$prefijo – Prefijo que precederá al nombre de las funciones JavaScript. Por defecto “xajax_”.
Para cambiarlo una vez construido el objeto, llama al método setWrapperPrefix($prefijo)
pasándole como argumento el prefijo deseado.
$codificación – Codificación que se usará para hacer las peticiones y respuestas. Por defecto
“utf-8”. Si quieres cambiarla una después de haber construido el objeto, usa el método
setCharEncoding($codificación) para cambiarla.
$debug – Booleano que indica si saldrá la ventana Xajax Debug Output. Por defecto false.
Para cambiar-lo una vez construido el objeto, usa el método debugOn() para activarlo y
debugOff() para desactivarlo.
Así que si creas un objeto xajax sin argumentos, sus variables cogerán los valores por
defecto.
Una vez creado y configurado el objeto, pasaremos a decirle qué funciones podrán ser
accesibles desde JavaScript (serán funciones en las que se cree el objeto xajaxResponse).
Nota:
Si quieres poner en las respuestas y peticiones acentos o caracteres especiales, habrás de
usar una condificación "iso-8859-1", pasándola como argumento al tercer argumento del
constructor o como argumento del método setCharEncoding("iso-8859-1"). También sería
interesante que usaras el método decodeUTF8InputOn() para pasar carácteres especiales en
los argumentos de las funciones xaJax.
Una vez explicado esto ya podemos pasar a explicar como funciona el xaJax en el lado del
cliente. Resulta que el objeto xajax que hemos creado tiene un método que no hemos
explicado antes. Se trata del printJavascript($url, $archivo) que antes de enviar la página al
cliente escribe el código JavaScript necesario para hacer que todo funcione correctamente. En
su primer argumento le habrás de pasar la carpeta donde tienes instalado el xaJax, y si no has
modificado la carpeta del zip, no hará falta que modifiques su segundo argumento.
Y ya está, ahora ya puedes llamar a una función del servidor que modificará la página sin
recargarla tan sólo llamando a una función JavaScript. Aún así, tendrás que poner el prefijo
xajax_ (o el que hayas marcado en el constructor de xajax, ver capítulo anterior) seguido del
nombre de la función PHP.
Ejemplo
Esto es todo lo que voy a explicar sobre xaJax. Si te interesa el tema mírate la documentación
que aunque está en inglés se puede entender perfectamente, y si tienes alguna duda pregunta
en los foros y te responderé. Si el tema tiene éxito, puede que me anime a hacer algún artículo
más sobre xaJax, como por ejemplo a crear tus propias funciones JavaScript xaJax, pero ahora
vamos a poner todo lo que he explicado en práctica.
¿Nunca has visto en un formulario de registro en alguna web que al lado de el campo de texto
de usuario hay un link que te permite comprobar, antes de enviar el formulario, si el nombre de
usuario está libre o está ya en uso? De eso es de lo que trata el ejemplo.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
156
Tenemos quatro campos, el del usuario, dos de contraseñas (el segundo para comprobarla) y
uno de e-mail. Todos ellos son fácilmente validables desde JavaScript; comprobando si el
usuario ha introducido la misma contraseña en los dos campos, comprobando que en el e-mail
hay una arroba, un punto, un nombre de dominio, que no hay ningún carácter especial... pero
en ningún momento podrás comprobar tan sólo con JavaScript si el nombre de usuario está ya
en la base de datos de usuarios de la web. Para eso se requiere AJaX, para hacer entre puente
entre el servidor y el cliente, y con xaJax lo podemos hacer mucho más fácil.
000 <?php
001 require_once('xajax/xajax.inc.php');
002
003 function compruebaUser($user){
004 $disponibilidad="$user está disponible.";
005 if($user=="LloX") $disponibilidad="$user no está disponible.";
006 $disponibilidad.=' <a href="" onclick="xajax_compruebaUser(document.form1.user.v
alue); return false;">Volver a probar</a>.';
007 $respuesta=new xajaxResponse();
008 $respuesta->addAssign("disp", "innerHTML", $disponibilidad);
009 return $respuesta;
010 }
011 $xajax=new xajax();
012 $xajax->setCharEncoding("iso-8859-1");
013 $xajax->decodeUTF8InputOn();
014 $xajax->registerFunction("compruebaUser");
015 $xajax->processRequests();
016 ?>
Éste sería todo el código que se ejecutaría en la parte del servidor. Lo primero que hacemos es
llamar a la librería xaJax, y luego escribimos una función llamada compruebaUser que
comprobará si el usuario que se le ha pasado como argumento está disponible o no, y, en
cualquier caso, devolver una respuesta XML que cambie el contenido de una capa llamada
“disp”, que se encontrará situada debajo del campo de texto. Configuraríamos también el objeto
xajax con la función compruebaUser. Le cambiaríamos la codificación para que se puedan usar
caracteres especiales en las transferencias. El artículo sigue en la siguiente página.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
157
Lección 26. Seguridad en PHP
Restringir el acceso,
Distinción de usuarios
Cookies
Reporte con distinción de usuarios.
Restringir el acceso
Hay formar de restringir el acceso a las páginas, para que solo las personas autorizadas
puedan acceder a ciertas partes de nuestra sitio WEB.
Ejemplo 1
Para que el navegador nos muestre la ventana de petición de nombre de usuario y contraseña
basta con enviar la siguiente cabecera:
<?php
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="Mi reino"');
header('HTTP/1.0 401 Desautorizado');
echo 'Usted ha hecho click en el botón CANCELAR';
exit;
} else {
echo "<p>Hola USUARIO: <BLINK> $PHP_AUTH_USER </BLINK>.</p>";
echo "<p>Tu PASSWORD: <BLINK> $PHP_AUTH_PW </BLINK>.</p>";
}
?>
Este código muestra una ventana para ingresar el nombre de usuario y contraseña,
seguidamente muestra los datos introducidos, después de asignar a las variables,
$PHP_AUTH_USER y $PHP_AUTH_PW. Pero, si el usuario hace clic en el botón CANCELAR
este emite un mensaje alusivo a la acción de cancelar.
Ejemplo 2
<center><br><br><br>
<body background="../imagenes/luces.gif ">
<font color="white"><h2>Ha conseguido el acceso a la
<BLINK> Zona restringida </BLINK></h2><BR><br></font>
<img src="../imagenes/madonna-britney.jpg" height=45% width=25%>
</body>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
158
</center>
Distinción de usuarios
En la anterior página todo aquel que tenía acceso a la parte restringida entraba con el mismo
nombre de usuario y contraseña, esto evidentemente no es una buena solución, es mejor que
cada persona tenga un nombre de usuario y contraseña, ya que de esta forma podemos
inhabilitar a un usuario sin ver comprometida la seguridad de nuestro sito WEB.
En esta página se muestra la forma de realizar esto teniendo un fichero separado con los
nombres de usuario y las contraseñas válidas. Dicho fichero podría tener el siguiente formato:
nombre_de_usuario|contraseña.
Por ejemplo.
kenny|12345
Arturo|54321
Zonia|gati45
Aldo|mir123
<?php
if (!isset($PHP_AUTH_USER))
{
header('WWW-Authenticate: Basic realm="Diferenciando usuarios..."');
header('HTTP/1.0 401 Desautorizado');
echo 'Acceso CANCELADO POR usted...';
exit;
}
$archivo = file("user_pw.txt");
$i = 0;
$validado = false;
while($archivo[$i] && !$validado)
{
$campo = explode("|", $archivo[$i]);
if(($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1])))
$validado=true;
$i++;
}
if(!$validado)
{
header('WWW-Authenticate: Basic realm="Acceso restringuido..."');
header('HTTP/1.0 401 Desautorizado');
echo 'CANCELADO POR usuario...';
exit;
}
?>
<center><br><br><br>
<body background="../imagenes/luces.gif ">
<font color="white"><h2>Ha conseguido el acceso a la
<BLINK> Zona restringida </BLINK></h2><BR><br> </font>
<img src="../imagenes/Horses_07.jpg" height=45% width=25%>
</body>
</center>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
159
Cookie
Realmente las cookies no son mas que cadenas de texto que son enviadas desde el servidor al
cliente (navegador) y almacenadas en este, luego el navegador envía estas cookies al servidor
permitiendo así la identificación del cliente en el servidor.
Funcionamiento
El navegador las envía, permitiendo la identificación del usuario por parte del servidor.
int setcookie (string Nombre [, string Valor [, int Expire [, string Path [, string
Dominio [, int Secure]]]]])
Setcookie() define una cookie que es enviada junto con el resto de la información de la
cabecera(header). Las cookies deben ser enviadas antes de cualquier tag de html, por lo
tanto deberemos realizar la llamada a estas funciones antes de cualquier tag <HTML> o
<HEAD>. Esta es una restricción de las cookies no de PHP.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
160
ponemos domain.com la cookie se transmite tanto para domain.com como para
www.domain.com
Secure. El argumento secure indica que la cookie solo se transmitirá a través de una
conexión segura HTTPS.
Ejemplo
En este ejemplo establecemos una cookie de nombre usuario que contiene el valor Luis, que
dura 1 hora (3600 segundos) válida para todo el dominio webestilo.com
Ejemplo.
En este ejemplo se observa diferentes modos de crear, imprimir e eliminar las cookies.
Creando
<?php
$valor = ' Este en mi cookie para ti ';
setcookie("Cookie_Prueba1", $valor);
setcookie("Cookie_Prueba2", $valor, time()+3600); /* expirar en 1 hora */
setcookie("Cookie_Prueba3", $valor, time()+3600, "/~rasmus/",
".example.com", 1);
?>
<?php
echo "<BLINK> Primer </BLINK> modo de imprimir <br>";
echo $_COOKIE["Cookie_Prueba1"]."<br>";
echo $_COOKIE["Cookie_Prueba2"]."<br>";
echo $_COOKIE["Cookie_Prueba3"]."<br><br>";
Eliminando (solo hay que dejar vacio el valor en la definición de las cookies)
<?php
setcookie ("Cookie_Prueba1", "");
setcookie ("Cookie_Prueba2", "", time() - 3600);
setcookie ("Cookie_Prueba3", "", time() - 3600, "/~rasmus/", ".example.com",
1);
?>
Actividad.
Definir una aplicación que permita crear cookies. Detalle:
- La primera página debe tener un formulario para ingresar el nombre, valor y parámetros para
la cookie.
- La segundo página debe crear las cookies e emitir un resumen.
- La tercera página debe mostrar una lista de todas las cookies existentes, acompañado de un
check que permita seleccionar para eliminar.
- La cuarto página elimina las cookies seleccionadas.
Crear una aplicación que permita definir dos cookies y dar un reporte todo en una sola página.
Crear una aplicación para ejecutar una matriz asociativa de cookies.
Definir una cookie para el proyecto.
Cookies: Definir, imprimir y eliminar
Reportes con distinción de usuarios
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
161
Los ejemplos que se dan son parte del proyecto denominado “proyecto_VentaArticulos”.
Archivo : frames.php
Ubicación : carpeta “proyecto_VentaArticulos”
Observación: No dejar espacio, comentario ni código alguno antes de definir las cookies.
<?php
$valor = ' Visitas ';
setcookie("Cookie_Prueba1", $valor);
setcookie("Cookie_Prueba2", $valor, time()+3600); /* expirar en 1 hora */
setcookie("Cookie_Prueba3", $valor, time()+3600, "/~rasmus/", ".example.com", 1);
?>
<?php
///////////////////// Incluyecdo fichero externo ///////////////////
include("funciones_PHP/funcion_conexion.ini.php");
if ($codOper>0)
{
?>
<html>
<head>
<title>Página de inicio</title>
</head>
<frameset rows="120,*" border=1>
<frame src="superior.php" scrolling=no noresize>
<frameset cols="200,*">
<frame src="menu.php" scrolling=yes noresize>
<frame src="blanco.php" name="blanco" scrolling=yes noresize">
</frameset>
</frameset>
</html>
<?php
}
?>
Archivo : cookies_con_html_1nombre.php
Ubicación : carpeta “seguridad”
<body>
Introduzca:
<FORM ACTION="cookies_con_html_2enviar.php" METHOD="POST">
Nombre cookie: <INPUT TYPE="text" NAME="Nombre"><BR>
Valor cookies: <INPUT TYPE="text" NAME="Valor"><BR>
<INPUT TYPE="submit" VALUE="Enviar">
</FORM>
</body>
Archivo : cookies_con_html_2enviar.php
Ubicación : carpeta “seguridad”
<?php
setcookie($_POST['Nombre'], $_POST['Valor'], time()+3600, "/", "");
?>
<body>
Nombre de cookie: <BLINK><? echo $_POST['Nombre']; ?></BLINK> <br>
Valor de cokie: <BLINK><? echo $_POST['Valor']; ?></BLINK> <br>
que será válida durante una hora.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
162
</body>
Archivo : cookies_con_html_3imprimir.php
Ubicación : carpeta “seguridad”
Archivo : cookies_con_html_4eliminar.php
Ubicación : carpeta “seguridad”
<?php
$a = $_POST['check']; // var_dump($a);
Archivo : r02_productos_mas_vendidos.php
Ubicación : carpeta “reportes”
Observación: Modificar los hipervínculos del archivo menu.php a los reportes.
<?php
////////////// Distinción de usuarios ///////////////////////
if (($PHP_AUTH_USER!="reporte2") || ($PHP_AUTH_PW!="123")) {
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Desautorizado');
echo 'Acceso CANCELADO...';
exit;
}
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
<center>
<body bgcolor="#fefee1">
<br>
<b><h2>Los 5 productos más vendidos </h2></b>
<table width="50%" border="1" cellspacing="1" cellpadding="3">
<tr>
<?php
for($i=0; $i<$c; $i++ )
{
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
163
echo "<th>".mysql_field_name($r, $i)."</th>";
}
?>
</tr>
<?php
for($j=0; $j<$f; $j++ )
{
echo "<tr>";
for($k=0; $k<$c; $k++)
{
echo "<td>".mysql_result($r, $j, $k)."</td>";
}
echo "</tr>";
}
?>
</table>
</body>
</center>
Archivo : r03_clientes_deudores.php
Ubicación : carpeta “reportes”
Observación: Modificar los hipervínculos del archivo menu.php a los reportes.
<?php
////////////// Distinción de usuarios ///////////////////////
if (($PHP_AUTH_USER!="reporte3") || ($PHP_AUTH_PW!="123")) {
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Desautorizado');
echo 'Acceso CANCELADO...';
exit;
}
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
<center>
<body bgcolor="#fefee1">
<br>
<b><h2>Clientes deudores </h2></b>
<table width="50%" border="1" cellspacing="1" cellpadding="3">
<tr>
<?php
for($i=0; $i<$c; $i++ )
{
echo "<th>".mysql_field_name($r, $i)."</th>";
}
?>
</tr>
<?php
for($j=0; $j<$f; $j++ )
{
echo "<tr>";
for($k=0; $k<$c; $k++)
{
echo "<td>".mysql_result($r, $j, $k)."</td>";
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
164
}
echo "</tr>";
}
?>
</table>
</body>
</center>
Archivo : r04_clientes_articulo_dep.php
Ubicación : carpeta “reportes”
Observación: Modificar los hipervínculos del archivo menu.php a los reportes.
<?php
////////////// Distinción de usuarios ///////////////////////
if (($PHP_AUTH_USER!="reporte4") || ($PHP_AUTH_PW!="123")) {
header('WWW-Authenticate: Basic realm="Acceso restringido"');
header('HTTP/1.0 401 Desautorizado');
echo 'Acceso CANCELADO...';
exit;
}
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
<center>
<body bgcolor="#fefee1">
<br>
<b><h2>Clientes solteros, deportistas y productos que compran </h2></b>
<table width="50%" border="1" cellspacing="1" cellpadding="3">
<tr>
<?php
for($i=0; $i<$c; $i++ )
{
echo "<th>".mysql_field_name($r, $i)."</th>";
}
?>
</tr>
<?php
for($j=0; $j<$f; $j++ )
{
echo "<tr>";
for($k=0; $k<$c; $k++)
{
echo "<td>".mysql_result($r, $j, $k)."</td>";
}
echo "</tr>";
}
?>
</table>
</body> </center>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
165
Sesiones en PHP: Definición y funciones
Sesiones, formas de almacenar datos
Definción y funciones de sesiones
Aplicaciones desarrolldas
Carrito de compra
Uso de registros globales
Proyecto. Incluir el carrito de compra con Ajax
Sesiones
Las sesiones basicamente son varibles globales que nos permiten almacenar datos que
necesiten volver a ser usados en otros accesos a la pagina.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
166
Usar unset($_SESSION['Nombre_variable']); para borrar el nombre de una
determinada variable de sesión.
Usar session_unset(); para eliminar todas las variables de la sesión.
Ejemplo 1
Las páginas muestran el uso de la variable denominado “variable_1” en las páginas
especificadas sin que esta sea envia por formularios. Detalle:
Archivo pag1.php
<?php
session_start();
$_SESSION['variable_1'] = 'Hola';
?>
<html>
<body>
<br> <BLINK> Primera </BLINK> Página
<br> <a href='pag2.php'>Ir a la SEGUNDA página</a>
</body>
</html>
Archivo pag1_otro_modo.php
<?php
session_start();
$variable_1 = 'Hola';
session_register('variable_1');
?>
<html>
<body>
<br> <BLINK> Primera </BLINK> Página
<br> <a href='pag2.php'>Ir a la SEGUNDA página</a>
</body>
</html>
Archivo pag2.php
<?php
session_start();
echo $_SESSION['variable_1'];
$_SESSION['variable_1'].='_Mundo'; // Concatenando
?>
<html>
<body>
<br> <BLINK> Segunda </BLINK> Página
<br> <a href='pag3.php'>Pasar a TERCERA página</a>
</body>
</html>
Archivo pag3.php
<?php
session_start();
echo $_SESSION['variable_1'];
?>
<html>
<body>
<br> <BLINK> Tercera </BLINK> Página
<br> <a href='pag2.php'>Ir a la SEGUNDA página</a>
</body>
</html>
Ejemplo 2
La pagina muestra el uso de varias variables previamente registrados en diferentes páginas.
Detalle:
La primera pagina (pagina1.php) obtiene: codOper, nombre, login, clave y permisos de la tabla
operadores al conectarse a la bases de datos de los cuales algunos son registrados para
usarlos en diferentes páginas.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
167
La segunda página (pagina2.php) imprime todas las variables registradas y borra algunas
variables de dos modos diferentes.
La tercera página (pagina3.php) imprime todas las variables registradas restantes y borra todas
las variables de tal manera que cuando pasa a la página2.php ya no imprime nada.
Archivo pag1.php
<?php
session_start();
include('../funciones_PHP/funcion_conexion.ini.php');
$miConexion = conexion();
$Operador = "erika";
$Clave = "erika";
while($a = mysql_fetch_array($r))
{
$Codigo_operador = $a['codoper'];
$Nombre_operador = $a['nombre'];
$Login_operador = $a['login'];
$Clave_operador = $a['clave'];
$Permisos_operador = $a['permisos'];
$Estado_operador = $a['estado'];
}
//session_register('Codigo_operador'); // Quitar comentario
session_register('Nombre_operador');
//session_register('Login_operador'); // Quitar comentario
session_register('Clave_operador', 'Permisos_operador', 'Estado_operador');
?>
<html>
<body>
<br> <BLINK> Primera </BLINK> Página
<br> <a href='pagina2.php'>Ir a la SEGUNDA página</a>
</body>
</html>
Archivo pagina2.php
<?php
session_start();
echo "Codigo Operador: ".$HTTP_SESSION_VARS['Codigo_operador']."<br>";
echo "Nombre Operador: ".$HTTP_SESSION_VARS['Nombre_operador']."<br>";
echo "Login Operador: ".$HTTP_SESSION_VARS['Login_operador']."<br>";
echo "Clave Operador: ".$HTTP_SESSION_VARS['Clave_operador']."<br>";
echo "Permisos Oper: ".$HTTP_SESSION_VARS['Permisos_operador']."<br>";
echo "Estado Operador: ".$HTTP_SESSION_VARS['Estado_operador'];
Archivo pagina3.php
<?php
session_start();
echo "Codigo Operador: ".$_SESSION['Codigo_operador']."<br>";
echo "Nombre Operador: ".$_SESSION['Nombre_operador']."<br>";
echo "Login Operador: ".$_SESSION['Login_operador']."<br>";
echo "Clave Operador: ".$_SESSION['Clave_operador']."<br>";
echo "Permisos Oper: ".$_SESSION['Permisos_operador']."<br>";
echo "Estado Operador: ".$_SESSION['Estado_operador'];
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
168
<br> <a href='pagina2.php'>Ir a la SEGUNDA página</a>
</body>
</html>
Ejemplo 3.
El ejemplo. Muestra un contador de páginas visitadas en una sola página.
<?php
session_register('variable_1');
echo '<a href="'.$PHP_SELF.'"><br>';
echo 'Contador: '.++$_SESSION['variable_1']. '</a>';
?>
Otro equivalente
<?php
session_register('variable_2');
echo '<a href="'.$PHP_SELF.'?'.$SID.'"><br>';
echo 'Contador: '.++$_SESSION['variable_2']. '</a>';
?>
Ejemplo 4.
El ejemplo. Muestra un contador de páginas visitadas en diferentes páginas.
Archivo cuenta_paginas_1.php
<? session_start();
if (!isset($_SESSION["cuenta_paginas"])) {
$_SESSION["cuenta_paginas"] = 1;
} else {
$_SESSION["cuenta_paginas"]++;
}
?>
<body>
<br> <BLINK> Primera </BLINK> página WEB
<? echo "Visita No. ".$_SESSION["cuenta_paginas"]; ?>
<br> <a href='cuenta_paginas_2.php'> Pasar a SEGUNDA página </a>
</body>
Archivo cuenta_paginas_2.php
<? session_start();
if (!isset($_SESSION["cuenta_paginas"])) {
$_SESSION["cuenta_paginas"] = 1;
} else {
$_SESSION["cuenta_paginas"]++;
}
?>
<body>
<br> <BLINK> Segunda </BLINK> página WEB
<? echo "Visita No. ".$_SESSION["cuenta_paginas"]; ?>
<br> <a href='cuenta_paginas_1.php'> Pasar a PRIMERA página </a>
</body>
Ejemplo 5.
La primera página inicia una variable y la segunda página verifica si en la primera se ha iniciado.
<?
session_start();
if($_SESSION['acceso2']==true) {
echo "OK, tienes el acceso permitido";
}
else {
echo "Error, no tienes permiso.";
}
?>
Ejemplo 6.
La primera página muestra la declaración del nombre de la variable para luego mostrarlo.
<?php
session_name('miSesion');
session_register('variable_3');
echo '<a href="'.$PHP_SELF.'?'.$SID.'">';
echo 'Contador: '.++$_SESSION['variable_3'].'</a><br>';
echo 'Ahora el nombre es '.session_name().' y la sesión '.$miSesion.'<br>';
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
169
Carrito de compra
Las sesiones tienen mucha utilidad, por ejemplo para un carrito de compra. El ejemplo muestra
como hacer compra de devirsos productos sin la necesidad de conectarse permanentemente a
la base de datos.
1 <?php
2 session_start();
3 session_register('itemsEnCesta'); // Registrando variable
4 $item=$_POST['item']; // Producto
5 $cantidad=$_POST['cantidad']; // Cantidad
6 $itemsEnCesta=$_SESSION['itemsEnCesta']; // Variable sesión
7
8 if ($item)
9 {
10 if (!isset($itemsEnCesta))
11 {
12 $itemsEnCesta[$item]=$cantidad;
13 }
14 else
15 {
16 foreach($itemsEnCesta as $k => $v)
17 {
18 if ($item==$k)
19 {
20 $itemsEnCesta[$k]+=$cantidad;
21 $encontrado=1;
22 }
23 }
24 if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
25 }
26 }
27 $_SESSION['itemsEnCesta']=$itemsEnCesta;
28 ?>
29
30 <html>
31 <body>
32 <form action="<?=$PHP_SELF."?".$SID?>" method="post">
33 Dime el producto <input type="text" name="item" size="20"><br>
34 Cuantas unidades <input type="text" name="cantidad" size="20"><br>
35 <input type="submit" value="Añadir a la cesta"><br>
36 </form>
37 <?
38 if (isset($itemsEnCesta))
39 {
40 echo'El contenido de la cesta de la compra es:<br>';
41 foreach($itemsEnCesta as $k => $v)
42 {
43 echo 'Artículo: '.$k.' Unidades: '.$v.'<br>';
44 }
45 }
46 ?>
47 </body>
48 </html>
Y a continuación se imprime el formulario y los resultados, si los hubiera, a partir de la linea 30,
donde empieza el HTML.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
170
$itemsEnCesta=$_SESSION['itemsEnCesta']; // Variable sesión
if ($item)
{
if (!isset($itemsEnCesta))
{
$itemsEnCesta[$item]=$cantidad;
}
else
{
foreach($itemsEnCesta as $k => $v)
{
if ($item==$k)
{
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}
}
$_SESSION['itemsEnCesta']=$itemsEnCesta;
include('../funciones_PHP/funcion_conexion.ini.php');
include('../funciones_PHP/funcion_resumen.ini.php');
$miConexion = conexion();
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
171
Lección 27. Funciones del Sistema de Archivos
Modos de apertura de archivos
Funciones: fopen, feof, fgets, fwrite, fclose, fseek, realfile, etc.
Trabajo con buffer
Funciones: ob_start, ob_end_flush, ob_get_contents, etc.
Proyecto. Reporte con funciones de sist. de archivos.
Introducción
PHP proporciona diferentes funciones para el sistema de archivos. Estas funciones permiten
manipular los archivos como copiar, lectura, escritura, tamaño, etc.
El comportamiento de estas funciones está afectado por los valores definidos en php.ini.
allow_url_fopen boolean
Esta opción habilita las envolturas fopen tipo URL que le permiten acceder a objetos
URL como archivos.
Nota: Este parámetro puede ser definido únicamente en php.ini debido a razones de
seguridad.
Nota: Esta opción fue introducida inmediatamente después del lanzamiento de la
versión 4.0.3.
user_agent string
Definir el agente de usuario que PHP envía.
default_socket_timeout integer
Tiempo de espera predeterminado (en segundos) para secuencias basadas en sockets.
Nota: Esta opción de configuración fue introducida en PHP 4.3.0
from string
Definir la contraseña de ftp anónimo (su dirección de correo electrónico).
auto_detect_line_endings boolean
Cuando está habilitada esta opción, PHP examina los datos leídos por fgets() y file()
para ver si está usando convenciones de final de líneo tipo Unix, MS-Dos o Macintosh.
Esto le permite a PHP interoperar con sistemas Macintosh, pero tiene un valor
predeterminado de Off, ya que hay un impacto ligero de rendimiento cuando se
detectan las convenciones EOL para la primera línea, y también porque las personas
que usen retornos de carro como separador de elementos bajo sistemas Unix
percibirían un comportamiento que no es compatible con versiones anteriores.
Nota: Esta opción de configuración fue introducida en PHP 4.3.0
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
172
Veamos el significado y uso de funciones
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
173
pclose -- Cierra un apuntador de archivo de proceso
popen -- Abre un apuntador de archivo de proceso
readfile -- Imprime un archivo
readlink -- Devuelve el objetivo de un enlace simbólico
realpath -- Devuelve el nombre de ruta absoluto simplificado
rename -- Renombra un archivo o directorio
rewind -- Retroceder la posición de un apuntador de archivo
rmdir -- Elimina un directorio
set_file_buffer -- Alias of stream_set_write_buffer()
stat -- Entrega información sobre un archivo
symlink -- Crea un enlace simbólico
tempnam -- Crear un archivo con un nombre único
tmpfile -- Crea un archivo temporal
touch -- Establece la hora de acceso y modificación de un archivo
umask -- Cambia la umask actual
unlink -- Elimina un archivo
'r' Apertura para sólo lectura; ubica el apuntador de archivo al comienzo del mismo.
'r+' Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo del mismo.
Apertura para sólo escritura; ubica el apuntador de archivo al comienzo de éste y lo trunca
'w'
a una longitud de cero. Si el archivo no existe, intenta crearlo.
Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de éste y lo
'w+'
trunca a una longitud cero. Si el archivo no existe, intenta crearlo.
Apertura para sólo escritura; ubica el apuntador de archivo al final del mismo. Si el archivo
'a'
no existe, intenta crearlo.
Apertura para lectura y escritura; ubica el apuntador de archivo al final del mismo. Si el
'a+'
archivo no existe, intenta crearlo.
Creación y apertura para sólo escritura; ubica el apuntador de archivo al comienzo de éste. Si el
archivo ya existe, la llamada a fopen() fallará devolviendo FALSE y generando un error de nivel
'x' E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas
O_EXCL|O_CREAT en la llamada de sistema open(2) interna. Esta opción es soportada en PHP 4.3.2
y versiones posteriores, y sólo funciona con archivos locales.
Creación y apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de éste. Si el
archivo ya existe, la llamada a fopen() fallará devolviendo FALSE y generando un error de nivel
'x+' E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas
O_EXCL|O_CREAT en la llamada de sistema open(2) interna. Esta opción es soportada en PHP 4.3.2
y versiones posteriores, y sólo funciona con archivos locales.
Ejemplo 1.
Lectura del archivo fgets.txt ubicada en el mismo directorio
<?php
$gestor = @fopen("fgets.txt", "r"); //abre archivo
if ($gestor) {
while (!feof($gestor)) //Verifica si está al final
{
$bufer = fgets($gestor, 1024); //Obtiene una línea desde apuntador de arch.
$bufer=nl2br($bufer); //Inserta saltos de línea de HTML antes
echo $bufer; //de cada salto de línea de la cadena
}
fclose ($gestor); //Cierra el apuntador a un archivo abierto
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
174
}
?>
Ejemplo 2.
Escribe un contenido en un archivo abierto
<?php
$nombre_archivo = 'prueba.txt';
$contenido = "Escribe esto al archivo\r\n";
Ejemplo 3.
Escribe un contenido en un archivo abierto
<?php
$nombre_archivo = 'prueba.txt';
for ($i=0;$i<10;$i++)
{
$contenido = "Escribe esto al archivo, linea $i\r\n";
// Escribir $contenido a nuestro archivo abierto.
if (fwrite($gestor, $contenido) === FALSE)
{
echo "No se puede escribir al archivo ($nombre_archivo)";
exit;
}
}
echo "Exito, se escribio; al archivo ($nombre_archivo)";
fclose($gestor);
?>
Ejemplo 4.
Escribe un contenido en un archivo abierto
<?php
$nombre_archivo = 'prueba.txt';
$contenido = "Agregar esto al archivo\r\n";
} else {
echo "No se puede escribir sobre el archivo $nombre_archivo";
}
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
175
Descripcion de las funciones
Establece el indicador de posición para el archivo referenciado por gestor. La nueva posición,
medida en bytes desde el comienzo del archivo, se obtiene al sumar desplazamiento con la
posición especificada por desde, cuyos valores se definen como se indica a continuación:
De tener éxito, la función devuelve 0; de lo contrario devuelve -1. Note que realizar una
reubicación más allá del final de archivo no se considera un error.
Ejemplo.
<?php
$gestor = @fopen("fgets.txt", "r");
if ($gestor)
{
fseek($gestor, 10, SEEK_SET); //desde inicio + desplazamiento
//fseek($gestor, 10, SEEK_CUR); //desde posición actual + desplazamiento
//fseek($gestor, -10, SEEK_END); //desde final + desplazamiento
while (!feof($gestor)) //Verifica si está al final
{
$bufer = fgets($gestor, 1024);
$bufer = nl2br($bufer);
echo $bufer;
}
fclose ($gestor);
}
?>
Lee hasta EOF en el apuntador de archivo dado a partir de la posición actual y escribe los
resultados en el búfer de salida.
El puntero de fichero debe de ser valido y debe de apuntar a un fichero abierto con exito por
fopen() o fsockopen().
Puede que necesite llamar rewind() para restablecer el apuntador de archivo al comienzo de
éste si ya ha escrito datos en el archivo.
Si tan sólo quiere volcar el contenido de un archivo al búfer de salida, sin modificarlo o buscar
un desplazamiento en particular, puede que quiera usar la función readfile(), la cual le ahorra la
llamada a fopen().
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
176
Nota: Cuando se usa fpassthru() sobre un archivo binario en sistemas Windows, debe
asegurarse de abrir el archivo en modo binario, agregando el valor b al modo usado en
la llamada a fopen().
Es recomendable usar la bandera b cuando trate con archivos binarios, incluso si su sistema
no lo requiere, de modo que sus scripts sean más portables.
<?php
// abrir el archivo en modo binario
$nombre = 'img_penguin.png';
$aa = fopen($nombre, 'rb');
Devuelve el número de bytes leídos desde el archivo. Si ocurre un error, FALSE es devuelto y
a menos que la función sea llamada como @readfile(), se genera un mensaje de error.
Ejemplo 1.
<?php
// abrir el archivo en modo binario
$nombre = 'home.png';
Ejemplo 2.
<?php
$filename = 'home.png';
$filename = realpath($filename); //Devuelve el nombre de ruta absoluto simplif.
//echo $filename;
switch ($file_extension)
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpe": case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
177
if (!file_exists($filename)) {
die("EL ARCHIVO NO EXISTE");
}
set_time_limit(0);
@readfile("$filename") or die("Archivo no encontrado.");
?>
include ('funcion_conexion.ini.php');
$miConexion = conexion();
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
178
A004 -> TALLARIN --> 2.5
A005 -> COCACOLA 1L --> 3.5
A006 -> KOLAREAL 3L --> 4.8
A007 -> PAPEL HIGIENICO --> 1.5
A008 -> PANETON --> 13
A009 -> AZUCAR --> 3.2
A010 -> ARROZ --> 2.8
A011 -> LECHE PURA VIDA --> 2.4
$nombre_archivo = 'reporte2.txt';
fclose($gestor);
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
179
Lección 28. Funciones de Directorio
Introducción
Administración de directorios
Funciones: getcwd, chdir, dir, closedir, opendir, readdir, scandir, etc.
Funciones: basename, copy, unlink, etc.
Proyecto: Reportes con funciones de Directorio.
Introducción
El tratamiento de archivos resulta ser una práctica muy común en cualquier sitio web. Muy a
hay la necesidad de procesar un texto para cambiar el formato, buscar una cadena en su
interior o cualquier otro tipo de operación.
PHP proporciona un sin fin de funciones para la gestion de archivos que van desde las más
elementales de apertura, lectura y cierre a otras más rebuscadas como el cálculo de espacio
en el disco duro, tamaño del archivo, gestion de derechos de acceso, etc.
Constantes predefinidas
Estas constantes están definidas por esta extensión y estarán disponibles solamente cuando la
extensión ha sido o bien compilada dentro de PHP o grabada dinámicamente en tiempo de
ejecución.
DIRECTORY_SEPARATOR (string)
PATH_SEPARATOR (string)
Nota: El parámetro PATH_SEPARATOR fue introducido con PHP 4.3.0-RC2.
En algunas variantes de Unix, getcwd() devolverá FALSE si alguno de los directorios padre no
tiene definido el modo de lectura o búsqueda, incluso si el directorio actual lo tiene.
Ejemplo.
<?php
// directorio actual
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
180
echo getcwd() . "<br>";
// cambio de directorio
chdir('dirprueba'); //asumiendo que existe el directorio
// directorio actual
echo getcwd() . "<br>";
// directorio actual
echo $ver=getcwd() . "<br>";
Resultado
F:\AppServ\www\03directorios
F:\AppServ\www\03directorios\dirprueba
F:\AppServ\www
Mi directorio: F:\AppServ\www
class dir
{
dir ( string directorio )
string path
resource handle
string read ( void )
void rewind ( void )
void close ( void )
}
Ejemplo
<?php
$d = dir("F:\\AppServ\\www\\");
echo "Gestor: " . $d->handle . "<br>";
echo "Ruta: " . $d->path . "<br>";
Resultado
Gestor: Resource id #2
Ruta: F:\AppServ\www\
.
..
index.php
phpinfo.php
appserv
...
03directorios
Nota: El orden en el que las entradas de directorio son devueltas por el método read
depende del sistema.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
181
Nota: Se define la clase interna Directory, lo que quiere decir que no será posible
definir sus propias clases con ese nombre. Para una lista completa de clases
predefinidas en PHP, por favor consulte Clases Predefinidas.
is_dir -- Indica si el nombre de archivo es un directorio
bool is_dir ( string nombre_archivo )
Ejemplo.
<?
var_dump(is_dir('un_archivo.txt')) . "\n";
var_dump(is_dir('dirprueba/nueva_carpeta')) . "\n";
Resultado
bool(false)
bool(false)
bool(true)
Ejemplo 1.
<?php
$dir="F:\\AppServ\\www\\";
Devuelve el nombre del siguiente archivo leido desde el directorio. Los nombres de archivo son
devueltos en el orden en que son almacenados por el sistema de archivos.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
182
gestor_dir. El gestor de directorio tipo resource abierto previamente con opendir().
Devuelve el nombre de archivo en caso de éxito, o FALSE si ocurre un error.
if ($gestor = opendir($dir))
{
echo "Gestor de directorio: $gestor<br>";
echo "Archivos:<br>";
closedir($gestor);
}
?>
Trata de crear el directorio especificado por pathname. Devuelve TRUE si todo se llevó a cabo
correctamente, FALSE en caso de fallo.
Tenga en cuenta que debe especifcar el modo como un número octal, lo que significa que
debes anteponerle un 0 al número.
El modo es 0777 por defecto, lo cual significa el acceso más amplio posible. Para mas
información de los modos vea chmod().
Ejemplo 1. Lista todos los archivos del directorio incluyendo el directorio creado
<?php
$dir="F:\\AppServ\\www\\";
if ($gestor = opendir($dir))
{
//Esta es la forma correcto de iterar sobre el directorio.
while (false !== ($archivo = readdir($gestor))) {
echo "$archivo<br>";
}
closedir($gestor);
}
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
183
Funciones de Correo
Introducción
Opciones de configuración de correo
Funcion mail y sus parámetros
Introducción
SMTP string
Usado bajo Windows únicamente: el nombre DNS o dirección IP del servidor SMTP que
debería usar PHP para el envío de correo con la función mail().
smtp_port int
Usado bajo Windows únicamente: Número del puerto para conectarse al servidor especificado
en el parámetro SMTP cuando se envíe correo con mail(); su valor predeterminado es 25. Se
encuentra disponible solo a partir de PHP 4.3.0.
sendmail_from string
Qué dirección de correo "From:" debe ser usada en el correo enviado desde PHP bajo
Windows.
sendmail_path string
Los sistema que no usan sendmail deben definir esta directiva al reemplazo de sendmail que
ofrecen sus sistemas de correo, si existe. Por ejemplo, los usuarios de Qmail pueden definir
este valor normalmente a /var/qmail/bin/sendmail o /var/qmail/bin/qmail-inject. qmail-inject no
requiere ninguna opción para procesar el correo correctamente.
Esta directiva funciona también bajo Windows. Si está definida, smtp, smtp_port y
sendmail_from son ignoradas y se ejecuta el comando especificado.
Descripción
bool mail ( string para, string asunto, string mensaje [, string cabeceras_adicionales [, string
parametros_adicionales]] )
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
184
Lista de parámetros
para
Recipiente, o recipientes del correo.
El formato de esta cadena debe ser compatible con el documento RFC 2822.
Algunos ejemplos son:
[email protected]
[email protected], [email protected]
Usuario <[email protected]>
Usuario <[email protected]>, Otro Usuario [email protected]
asunto
Asunto del correo electrónico a ser enviado. Éste no debe contener caracteres de salto de
línea, o es posiblo que el correo no sea enviado apropiadamente.
mensaje
Mensaje a ser enviado.
Cada línea debe ser sepadarada con un caracter LF (\n). Las líneas no deberían exceder los 70
caracteres.
(Sólo en Windows) Cuando PHP sostiene comunicación con el servidor SMTP directamente, si
un punto es encontrado al comienzo de la línea, éste es removido. Para contrarestar este
comportamiento, reemplace estas ocurrencias con dos puntos.
<?php
$texto = str_replace("\n.", "\n..", $texto);
?>
cabeceras_adicionales (opcional)
Cadena a ser insertada al final de la cabecera de correo electrónico.
Por lo general, este parámetro es usado para agregar cabeceras extra (From, Cc y Bcc).
Múltiples cabeceras extra deben ser separadas con una secuencia CRLF (\r\n).
Nota: Cuando envíe correo, el mensaje debe contener una cabecera From. Ésta puede
definirse con el parámetro cabeceras_adicionales, o puede definirse un valor
predeterminado en php.ini. No hacer esto resultará en un mensaje de error similar a:
Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing.
Nota: Si los mensajes no son recibidos, intente usar un caracter LF (\n) solamente.
parametros_adicionales (opcional)
El parámetro parametros_adicionales puede ser usado para pasar un parámetro extra al
programa configurado para ser usado cuando se envíe correo mediante la opción de
configuración sendmail_path. Por ejemplo, este parámetro puede usarse para definir la
dirección de sobre del origen cuando se usa sendmail con la opción -f.
El usuario bajo el que corre su servidor web debe ser agregado como un usuario confiable en
la configuración de sendmail para prevenir que se agregue una cabecera 'X-Warning' a los
mensajes cuando el origen de sobre (-f) sea definido usando este método. Para usuarios de
sendmail, este archivo es /etc/mail/trusted-users.
Valores retornados
Devuelve TRUE si el correo fue aceptado satisfactoriamente para su envío, o FALSE de lo
contrario.
Es importante notar que solo porque el correo sea aceptado para su envio NO quiere decir que
el correo realmente vaya a llegar a su destino planeado.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
185
Ejemplos 1. Envío de correo.
<?php
// El mensaje
$mensaje = "Un mensaje muy pero muy
laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaarga...";
// Cabecera
$cabeceras = 'From: [email protected]';
?>
Ejemplo 2. Envío de correo para dos o más clientes con cabeceras extra.
<?php
$para = '[email protected]'. ','.'[email protected]';
$asunto = 'mis_asuntos';
$mensaje = "hola, como estas \nnosotros estamos bien \ncomo siempre...";
if (!$envio)
echo "No se puedo enviar el correo";
else
echo "Correo enviado satisfactoriamente";
?>
// asunto
$asunto = 'Recuerden mi Cumpleaño es en Diciembre...';
// mensaje
//Muestra mensaje con html
$mensaje = '
<html>
<head> <title> Cumpleaños para Diciembre</title> </head>
<body>
<table border=1>
<tr> <th colspan=4>¡Aquí están los cumpleaños que vienen en Diciembre!</th> </tr>
<tr> <th>Persona</th><th>Día</th><th>Mes</th><th>Año</th> </tr>
<tr> <td>Juan </td><td> 3</td><td>Diciembre</td><td>1970</td> </tr>
<tr> <td>Erika </td><td>17</td><td>Diciembre</td><td>1973</td> </tr>
</table>
</body>
</html> ';
// Cabeceras adicionales
$cabeceras .= 'From: Recordatorio de Cumpleaños <[email protected]>' . "\r\n";
$cabeceras .= 'Cc: [email protected]' . "\r\n";
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
186
$cabeceras .= 'Bcc: [email protected]' . "\r\n";
// Enviarlo
$envio=mail($para, $asunto, $mensaje, $cabeceras);
if (!$envio)
"Error al enviar el correo";
else
echo $mensaje;
?>
$para = '[email protected]';
$desde = '[email protected]';
$subject = "Correo generado desde PHP con archivo adjunto";
$fileatt = $nombre_archivo;
$fileatttype = "application/excel";
$fileattname = "Archivo_adjunto.xls"; //Este es el nombre del archivo
$mensaje="Mensaje creado desde php usando la funcion mail() con archivo adjunto.";
$mensaje = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$mensaje . "\n\n";
$mensaje .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatttype};\n" .
" name=\"{$fileattname}\"\n" .
"Content-Disposition: attachment;\n" .
" filename=\"{$fileattname}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
mail($para,$subject,$mensaje,$cabeceras);
?>
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
187
Lección 29: Clases y Objetos en PHP
Las bases: clase, nuevo objeto, extendiendo objetos.
Auti carga de objetos.
Constructores y destructores
Visibilidad
Alcances del operador de resolución(::)
Proyecto. Librerias en el proyecto.
En PHP 5 hay un nuevo modelo de Objetos. El manejo de PHP de objetos ha sido reescrito por
completo, permitiendo un mejor desempeño y mas características.
Las Bases
Clase
Cada definición de clase empieza con la palabra "class", seguida por un nombre de clase, el
cual puede ser cualquier nombre que no esté en la lista de palabras reserved en PHP. Seguida
por un par de llaves, las cuales contienen la definición de los miembros de la clase y los
métodos. Una seudo variable $this está disponible cuando un método es llamado dentro del
contexto de un objeto.
$this es una referencia al objeto que se está usando (usualmente el objeto al que el método
pertenece, pero puede ser otro objeto, si un método es llamado estáticamente desde el
contexto de un objeto secundario).
Nuevo objeto
Para crear una instancia de un objeto, un nuevo objeto debe ser creado y asignado a una
variable. Un objeto siempre será asignado cuando se crea un objeto nuevo a menos que el
objeto tenga un constructor definido que arroje una excepción en caso de error.
Cuando se asigna una instancia de un objeto previamente creado a una nueva variable, la
nueva variable accesará la misma instancia que la del objeto a la que fue asignada. Este
comportamiento es el mismo cuando se pasan instancias a una función. Una nueva instancia
de un objeto previamente creado puede ser hecho clonandolo.
<?php
class SimpleClass
{
// Declaración de miembros
public $variable = 'Valor por defecto';
// Declaración de funciones
public function mostrarTexto()
{
echo $this->variable;
}
}
Asignamiento de Objeto
<?php
class SimpleClass
{
// Declaración de miembros
public $variable = 'Valor por defecto';
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
188
// Declaración de funciones
public function mostrarTexto() {
echo $this->variable;
}
}
// Asignamiento de objetos
$instance = new SimpleClass(); // Creando objeto
$assigned = $instance; // asignando objeto creado
$reference =& $instance; // hacen referencia a una misma variable
$instance->variable = '$assigned tendrá este valor';
$instance = null; // $instance y $reference se vuelve null
echo "<br>";
var_dump($instance);
echo "<br>";
var_dump($reference);
echo "<br>";
var_dump($assigned);
?>
NULL
NULL
object(SimpleClass)#1 (1) {
["variable"]=> string(27) "$assigned tendrá este valor"
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
189
Extendiendo objetos
Una clase puede heredar métodos y miembros de otra clase usando la palabra 'extends' en la
declaración. No es posible extender de múltiples clases, una clase puede heredar solo de una
clase base.
Los métodos de herencia y sus miembros pueden ser evitados, redeclarandolos con el mismo
nombre con el que los definió la clase padre, a menos que la clase padre haya definido un
método como final. Es posible accesar a los métodos o miembros redeclarados haciendo
referencia a ellos con parent::
<?php
class SimpleClass
{
// Declaración de miembros
public $variable = 'Valor por defecto';
// Declaración de funciones
public function mostrarTexto()
{
echo $this->variable;
}
}
Extendiendo la clase
Redefinido en el hijo
Constructores y Destructores
Constructor
void __construct ( [mixed args [, ...]] )
PHP 5 permite a los desarrolladores declarar métodos constructores para las clases. Las
clases que tienen un método constructor llaman a este método cada vez que se crea un nuevo
objeto, para cualquier inicialización que el objeto puede necesitar antes de ser usado.
Nota: Los constructores padres no son llamados implicitamente si la clase hijo define un
constructor. Para poder ejecutar el constructor de la clase padre, se debe hacer una llamada a
parent::__construct() dentro del constructor de la clase hijo.
<?php
class BaseClass {
function __construct() {
print "Dentro del contructor de BaseClass<br>";
}
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
190
print "Dentro del constructor de SubClass<br>";
}
}
Para tener compatibilidad con versiones anteriores, si PHP 5 no encuentra una función
__construct() para una clase dada, buscará la forma de la función del constructor que se
usaba anteriormente por el nombre de la clase. Efectivamente, esto significa que el único caso
que puede tener compatibilidad es si la clase tiene un método llamado __construct() el cual
fue usado para semánticas diferentes.
Destructores
<?php
class miClaseDestructor
{
public $name;
function __construct() {
print "Dentro de constructor<br>";
$this->name = "mi Clase Destructor";
}
function __destruct() {
print "Destruyendo " . $this->name . "<br>";
}
}
Como los constructores, los destructores de la clase padre no serán llamados explícitamente
por el compilador. Para ejecutar un destructor padre, se debe tener una llamada explícita a
parent::__destruct() en el cuerpo del destructor.
Nota: El destructor es llamado durante la finalización del script, de tal manera que los
headers ya han sido enviados.
Nota: Intentar arrojar una excepción desde un destructor produce un error fatal.
Dentro de constructor
Destruyendo mi Clase Destructor
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
191
Visibilidad
Los miembros de la clase deben estar definidos con public, private o protected.
<?php
class MyClass
{
public $publico = 'var_Publica';
protected $protegido = 'var_Protegida';
private $privado = 'var_Privado';
function printHello()
{
echo $this->publico."<br>";
echo $this->protegido."<br>";
echo $this->privado."<br>";
}
}
Los métodos de clase deben ser definidos con public, private o protected. Los métodos sin
ninguna declaración son tomados como public.
El alcance del operador de resolución o en términos simples, dobles dos puntos, es un símbolo
que permite acceso a los miembros o métodos estaticos, constantes, y eliminados de una
clase.
<?php
class miClase {
const valor_constante = 'Un valor constante';
}
echo miClase::valor_constante;
?>
Dos palabras reservadas self y parent son usadas para accesar los miembros o métodos
desde adentro de la definición de la clase.
<?php
class miClase {
const valor_constante = 'Un valor constante';
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
192
class otraClase extends miClase
{
public static $mi_estatico = 'Variable estatico';
otraClase::miFuncion();
?>
Declarar miembros de clases o métodos como estáticos, los hace accesibles desde afuera del
contexto del objeto. Un miembro o método declarado como estático no puede ser accesado
con una variable que es una instancia del objeto y no puede ser redefinido en una extensión de
la clase. La declaración static debe estar después de la declaración de visibilidad.
A causa de que los métodos estáticos son accesibles sin que se haya creado una instancia del
objeto, la pseudo variable $this no está disponible dentro de los métodos declarados como
estáticos.
De hecho las llamadas a métodos static son resueltas en tiempo de ejecución. Cuando sea
explícitamente un nombre de clase, el método ya ha sido identificado completamente y no es
necesario aplicar las reglas de herencia. Si la llamada es hecha por self entonces self es
traducido a la clase actual, esto es, la clase a la que pertenece el código. Aquí tampoco aplican
las reglas de herencia.
Las propiedades estáticas no pueden ser accesadas a través del objeto usando el operador de
flecha ->.
<?php
class A
{
public static $mi_estatico = 'variable estatico';
class B extends A
{
public function fun_static_B() {
return parent::$mi_estatico;
}
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
193
Lección 30. Librería FPDF. Funciones PDF.
Introducción
Consideraciones a tener en cuenta
Manual de Referencia de la librería FPDF
Desarrollo de aplicaciones
Proyecto. Reportes que use PDF
Introducción
Las funciones PDF en PHP pueden crear archivos PDF utilizando la librería FPDF. Donde
FPDF es freeware (programa de libre distribución). No hay limitaciones de uso. Puede usarlo
libre y gratuitamente en su aplicación (comercial o no), con o sin modificaciones.
La documentación en esta sección solamente es una descripción de las funciones de la
biblioteca PDFlib y no debería considerarse una referencia exhaustiva. Se ha de consultar la
documentación incluida en el código fuente de la distribución de PDFlib para una completa y
detallada explicación de cada función. Proporciona muy buena descripción de las capacidades
de PDFlib y contiene actualizada la documentación de todas las funciones.
El máximo de memoria reservada para los scripts en PHP es, por defecto, de 8 MB. Para
documentos muy extensos, especialmente si contienen imágenes, este límite puede
alcanzarse (ya que el fichero se construye en memoria). El límite se define en el fichero
php.ini.
El tiempo máximo de ejecución es por defecto de 30 segundos. Este límite puede ser
fácilmente sobrepasado. Se define en php.ini y puede ser modificado dinámicamente
mediante set_time_limit().
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
194
Ln - salto de línea
MultiCell - imprime texto con saltos de línea
Output - guarda o envía el documento
PageNo - número de página
Rect - dibuja un rectangulo
SetAuthor - establece el autor del documento
SetAutoPageBreak - establece el modo de salto de pagina automático
SetCompression - cambia la compresión en activo o inactivo
SetCreator - establece el creador del documento
SetDisplayMode - establece el modo de presentación
SetDrawColor - establece el color de graficación
SetFillColor - establece el color de relleno
SetFont - establece la fuente
SetFontSize - establece el tamaño de la fuente
SetKeywords - asocia las palabras claves con el documento
SetLeftMargin - establece el márgen izquierdo
SetLineWidth - establece el ancho de la línea
SetLink - establece el enlace de destino
SetMargins - establece los márgenes
SetRightMargin - establece el márgen derecho
SetSubject - establece el tema del documento
SetTextColor - establece el color del texto
SetTitle - establece el título del documento
SetTopMargin - Establece el márgen superior
SetX - establece la posición actual de x
SetXY - establece la posición actual de x y y
SetY - establece la posición actual de y
Text - imprime una cadena
Write - imprime el siguiente texto
Descripción de funciones
Cell
Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, int fill [, mixed link]]]]]]])
Imprime una celda (de área rectangular) bordes opcionales, color de fondo y secuencia de
caracteres. La esquina superior izquierda de la celda corresponde a la posición actual. El texto
puede ser alineado o centrado. Despues de invocar, la posición actual se desplaza a la
derecha o la siguietne línea. Es posible poner una referencia en el texto.
Si esta el salto de página automático habilitado y la celda esta por fuera del límite, es realizado
un salto de página antes de producir la salida.
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
195
link URL o identificador retornado por AddLink().
Desarrollo de aplicaciones
Ejemplo 1.
El código muestra la definición de una celda con un texto.
<?php
require('fpdf/fpdf.php');
$pdf=new FPDF();
Ejemplo 2.
El código muestra la definición encabezado, cuerpo y pie de pagina
<?php
require('fpdf/fpdf.php');
Resultado
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
196
Ejemplo 3.
El código muestra la definición lectura de archivo de texto
<?php
require('fpdf/fpdf.php');
function Footer()
{
$this->SetFont('Times','',12); // Fuente
$this->MultiCell(0,5,$txt); // Imprimimos el texto justificado
$this->Ln(); // Salto de línea
$this->SetFont('','I'); // Cita en itálica, '' última fuente usada
$this->Cell(0,5,'(fin del extracto)');
}
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
197
Taller de Programación Web con PHP y MySQL Prof. Gonzalo Neira Calsin
198