Desarrollo Web Con PHP - Oscar Capuñay Uceda
Desarrollo Web Con PHP - Oscar Capuñay Uceda
Desarrollo Web Con PHP - Oscar Capuñay Uceda
PHP
Oscar Capuay Uceda
http://alexyniorlls.blogspot.com 2 of 328.
Contenido
DEDICATORIA
AGRADECIMIENTOS
INTRODUCCIN
I.
11
11
11
16
16
16
17
II. DHTML
18
HTML
FORMATO DE TEXTO CON HTML
LISTAS
COMENTARIOS NO VISIBLES EN LA PANTALLA
CARACTERES ESPECIALES
ENLACES O HIPERVNCULOS
IMGENES
TABLAS
FORMULARIOS
HTML 4
JAVASCRIPT
ELEMENTOS BSICOS
COMENTARIOS
LITERALES
TIPOS DE DATOS
VARIABLES
OPERADORES
ESTRUCTURAS DE CONTROL
OBJETOS
OBJETOS PREDEFINIDOS
EVENTOS
DEFINICIN MEDIANTE CDIGO
MODELO DE OBJETOS DEL DOCUMENTO
OBJETO WINDOW
OBJETO DOCUMENT
OBJETO FORM
OTROS OBJETOS
18
21
21
24
25
27
30
33
40
47
63
64
64
65
66
66
67
70
72
73
77
79
80
81
84
85
90
http://alexyniorlls.blogspot.com 3 of 328.
FICHEROS .JS
HOJAS DE ESTILO EN CASCADA
SINTAXIS Y TIPOS BSICOS DE DATOS EN CSS2
PALABRAS CLAVE
92
93
97
99
101
QUE ES PHP?
VARIABLES
CONSTANTES
TIPOS DE DATOS
EXPRESIONES
OPERADORES
OPERADORES DE ARITMTICA
OPERADORES DE ASIGNACIN
OPERADORES DE COMPARACIN
OPERADORES DE CONTROL DE ERRORES
OPERADORES DE EJECUCIN
OPERADORES DE INCREMENTO/DECREMENTO
OPERADORES DE LGICA
OPERADORES DE CADENA
OPERADORES DE MATRICES
OPERADORES DE TIPO
101
101
101
102
102
104
105
105
106
107
108
108
110
110
111
112
115
SI (CONDICIONAL): IF
ELSE
ELSEIF
FOR
WHILE
DO..WHILE
115
116
116
117
117
117
119
126
131
134
134
139
145
153
160
167
172
179
http://alexyniorlls.blogspot.com 4 of 328.
189
CLASES EN PHP
INSTANCIA DE UN OBJETO
EXTENDIENDO OBJETOS
AUTO CARGA DE OBJETOS
ACCESO A MYSQL CON PHP ORIENTADO A OBJETOS
MYSQLI
MYSQLI_STMT
MYSQLI_RESULT
PAGINANDO RESULTADOS
ARQUITECTURA MVC
MVC CON PHP
MVC Y PHP CON ACCESO A BASE DE DATOS
PDO PHP DATA OBJECT
CLASES PREDEFINIDAS
CONEXIONES CON PDO
EJECUCIN DE SENTENCIAS PREPARADAS CON PDO
189
189
190
191
193
193
195
196
204
207
207
214
217
217
220
223
227
227
229
231
244
248
250
255
259
IMGENES
ARCHIVOS PDF
FPDF
ARCHIVOS XLS
259
266
266
276
283
AJAX
XAJAX
EVENTOS CON XAJAX
TRABAJO CON FORMULARIOS EN XAJAX
ERROR COMN
BSQUEDA EN BASE DE DATOS CON XAJAX
ADMINISTRACIN DE DATOS CON AJAX
CONTROLADOR CON AJAX
CAPA DE DATOS CON AJAX
283
284
293
295
300
301
303
303
308
http://alexyniorlls.blogspot.com 5 of 328.
310
X. REFERENCIAS BIBLIOGRAFICAS
315
XI. ANEXOS
316
LISTA DE EJEMPLOS
LISTA DE TABLAS
LISTA DE FIGURAS
316
320
321
http://alexyniorlls.blogspot.com 6 of 328.
http://alexyniorlls.blogspot.com 7 of 328.
Dedicatoria
Este libro lo dedico a Dios, a mi esposa Kelly, y a mi
hijo Oscar Armando.
Agradecimientos
Este libro es gracias a la bendicin de Dios, al apoyo y
aliento de mis padres, a la colaboracin de mis
hermanos Carlos, Jaime y Benjamn y al amor de mi
esposa Kelly.
http://alexyniorlls.blogspot.com 8 of 328.
http://alexyniorlls.blogspot.com 9 of 328.
Introduccin
Introduccin
PHP desde el ao 1997 ha crecido aceleradamente, su versin 4 lanzada en
el 2000 gan mucha popularidad y logr estar instalado en mas de la cuarta
parte de los servidores Web a nivel mundial, esto la convirti en el 2003 en la
plataforma Web con mayor presencia en Internet en comparacin con sus
similares.
En la actualidad muchas empresas han optado por el desarrollo de sus
aplicaciones con PHP, esto ha generado una creciente demanda de
profesionales con habilidades y conocimiento de este lenguaje, es por este
motivo que decid escribir este libro, y aportar algunos conocimientos
basados en la experiencia obtenida en los ltimos seis aos desarrollando
aplicaciones Web.
http://alexyniorlls.blogspot.com 10 of 328.
http://alexyniorlls.blogspot.com 11 of 328.
I.
Figura 1.
http://alexyniorlls.blogspot.com 12 of 328.
11
Figura 2.
Figura 3.
http://alexyniorlls.blogspot.com 13 of 328.
12
Figura 4.
Luego indicamos el nombre del acceso directo que nos permitir cargar
WAMP desde el men de inicio.
Figura 5.
http://alexyniorlls.blogspot.com 14 of 328.
13
Figura 6.
Figura 7.
Instalando WAMP
http://alexyniorlls.blogspot.com 15 of 328.
14
Figura 8.
Figura 9.
Men de WAMP
http://alexyniorlls.blogspot.com 16 of 328.
15
Instalacin en Linux
Instalacin de Apache
Primero debemos ubicarnos en el directorio donde hemos descargado
apache:
cd /usr/src/web/apache
Luego descomprimimos apache de la siguiente forma:
tar xzvf apache_2.2.4.tar.gz
Ahora pasamos a instalarlo:
./configure --prefix=/usr/local/web/apache
module=userdir
--enable-module=so
--enable-
Instalacin de PHP
El primer paso es descomprimir el archivo descargado: forma:
tar xjvf php-5.0.2.tar.bz2
Ahora hay que instalarlo de la siguiente forma:
cd php-5.2.4
/configure --prefix=/usr/local/web/php --withapxs=/usr/local/web/apache/bin/apxs
make && make install
cp php.ini-dist /usr/local/lib/php.ini
Ahora hay que modificar el archivo de configuracin de Apache: httpd.conf,
para que Apache reconozca el PHP:
AddType application/x-httpd-php .php .phtml
Si queremos configurar las pginas que sern el inicio de de los directorios,
entonces debemos ir a la lnea DirectoryIndex del archivo httpd.conf y
modificarla.
Para probar PHP podemos escribir una pgina llamada index.php muy
simple que imprima un saludo: Hola PHP utilizando el siguiente cdigo:
< ?php
echo Hola PHP;
?>
http://alexyniorlls.blogspot.com 17 of 328.
16
Instalacin de MySQL
Nos ubicamos en el directorio donde descargamos el programa y luego
descomprimimos el archivo:
tar xzvf mysql-max-4.1.7-pc-linux-i686.tar.gz
Una vez descomprimo el archivo realizamos los siguientes pasos:
groupadd mysql
useradd -g mysql mysql
cp -R mysql-max-4.1.7-pc-linux-i686 /usr/local/web/mysql
cd /usr/local/web/mysql
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
chgrp -R mysql .
bin/mysqld_safe --user=mysql &
Con estos pasos realizados quedar instalado nuestro servidor de base de
datos en /usr/local/web/mysql/.
http://alexyniorlls.blogspot.com 18 of 328.
17
DHTML
II.
DHTML
HTML
HTML es un lenguaje que permite definir los elementos que conforman una
pgina Web. Los diseadores y programadores de pginas Web utilizan el
lenguaje HTML de modo que los navegadores que utilizamos los usuarios
muestran las pginas Web despus de interpretar su contenido HTML.
El W3C define el lenguaje HTML como un lenguaje reconocido
universalmente y que permite publicar informacin de forma global. Desde
su primera definicin, el lenguaje HTML ha sido un lenguaje utilizado
exclusivamente para crear documentos electrnicos pero es un lenguaje que
se utiliza en la mayora de aplicaciones electrnicas (aplicaciones Web
comerciales, educativas, financieras y tambin muy utilizada en buscadores,
etc.).
El lenguaje HTML, cuenta con un conjunto de etiquetas o tambin llamadas
"Tags", las cuales funcionan de la siguiente manera:
<tag> Modelo de Inicio de una etiqueta.
</tag> modelo de Cierre de una etiqueta.
El texto o cualquier elemento de la pgina Web, que est entre ambas
etiquetas (de inicio y cierre), estar influenciado por la accin que stas
realicen. Por ejemplo, todo el documento HTML debe estar entre las
etiquetas <HTML> y </HTML>.
<HTML>
[Documento Web]
</HTML>
Hay que considerar que no todos los tags tienen etiqueta de cierre. Aunque
se recomienda que las etiquetas o tags que no tienen incluyan un / antes
del cierre. Por ejemplo la etiqueta BR se recomienda escribirla as: <br />.
Es indiferente escribir las etiquetas en maysculas o minsculas. Pero se
recomienda escribirlas en minsculas. Para diferenciarlas del texto comn,
las escribiremos en maysculas.
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 19 of 328.
18
DHTML
Toda pgina Web, esta dividida en dos partes bien definidas: la primera es la
cabecera o encabezado y la segunda es el cuerpo o contenido del
documento.
La cabecera se define con la etiqueta <HEAD> y su finalizacin es con
</HEAD>. En la cabecera se coloca la informacin sobre la pgina Web,
pero hay que tener en cuenta que esta informacin no se muestra en el
navegador, excepto el ttulo de la pgina que se muestra en la barra de ttulo
de la ventana del navegador, el cual se encuentra entre las etiquetas
<TITLE> y </TITLE>.
El cuerpo, est comprendido entre las etiquetas <BODY> y </BODY>.
Dentro de ste est todo lo que queremos que aparezca en la pantalla
principal (texto, imgenes, etc.)
Por lo mencionado anteriormente, podemos concluir que la estructura de un
documento Web (pgina Web) tiene dos partes: el encabezado y el cuerpo, y
que de acuerdo a las etiquetas utilizadas para delimitar estas partes, las
etiquetas HTML para construir una pgina Web deben estar en el siguiente
orden:
<HTML>
<HEAD>
<TITLE> Ttulo de la pgina </TITLE>
</HEAD>
<BODY>
[En este lugar escribiremos el contenido de la pgina]
</BODY>
</HTML>
Antes de crear nuestra primera pgina Web, debemos tener ciertas
consideraciones sobre el texto que vamos a incluir en el documento: No hay
necesidad de tratar de justificar el texto al ancho del navegador, pues el texto
de una pgina Web se caracteriza por justificarse de acuerdo al ancho que
tome la ventana, adems cuando queramos pasar a un nuevo prrafo, es
necesario utilizar la etiqueta <P>.
El contenido de la pgina puede tener varios ttulos, los cuales escribiremos
entre las etiquetas <H1> y </H1>, <H2> y </H2>, etc. (hasta H6), el nmero
en la etiqueta de ttulo indica el tamao de los caracteres de la frase o
palabra. El tamao mayor es el correspondiente al nmero 1.
Una etiqueta muy interesante es la de centrado <CENTER> y </CENTER>
(debemos tomar en cuenta que a esta etiqueta no la soportan todos los
navegadores, aunque s la mayora de ellos). Esta etiqueta centra todo lo
que est dentro de ella, ya sea texto, imgenes, etc.
Existen otros tags como por ejemplo, los separadores horizontales
(horizontal rules), que se insertan con la etiqueta <HR> (este tag no tiene la
correspondiente etiqueta de cierre). Con ella se obtiene una raya horizontal
http://alexyniorlls.blogspot.com 20 of 328.
19
DHTML
tan ancha como la pantalla, y con la apariencia de estar embutida sobre el
fondo, o podemos tambin especificar su ancho en pxeles o en porcentaje
respecto al ancho de la ventana.
Ejemplo 1:
Ejercicio01.html
<HTML>
<HEAD>
<TITLE> Mi Primer Ejercicio </TITLE>
</HEAD>
<BODY>
<H1> <CENTER> Ejercicio 1 </CENTER> </H1>
<HR>
Esta es mi primera pgina Web programando con HTML, aun es muy sencillo el
diseo pero pronto haremos pginas ms complejas.
<P> Este es el segundo prrafo.
</BODY>
</HTML>
Resultado Web
http://alexyniorlls.blogspot.com 21 of 328.
20
DHTML
Listas
Cuando tenemos un conjunto de elementos es necesario mostrarlos en
forma de listas, las cuales pueden ser de diferentes tipos:
1. Listas sin orden (sin numerar)
2. Listas ordenadas (numeradas)
3. Listas de definicin.
Una lista sin orden (Unordered List) sirve para presentar cosas que, por no
tener un orden determinado, no necesitan ir precedidas por un nmero. Su
estructura es la siguiente:
<UL>
<LI> Naranja
<LI> Manzana
<LI> Fresa
<LI> Etc.
</UL>
Como se puede apreciar, para crear una lista de este tipo se utiliza la
etiqueta <UL>, y luego para cada elemento la etiqueta <LI> (List Item).
http://alexyniorlls.blogspot.com 22 of 328.
21
DHTML
Resultado Web
<UL>
<LI> Mamferos
<LI> Peces
<UL>
<LI> Sardina
<LI> Bacalao
</UL>
<LI> Aves
</UL>
Resultado Web
<OL>
<LI> Introduccion
<LI> Conceptos Basicos
<LI> Aplicaciones
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 23 of 328.
22
DHTML
<LI> Bibliografia
</OL>
El texto aparecer de la siguiente forma:
<DL>
<DT> HTML
<DD> Son las iniciales de HyperText Markup Language
<DT> WWW
<DD> Son las iniciales de World Wide Web
</DL>
Su resultado es:
http://alexyniorlls.blogspot.com 24 of 328.
23
DHTML
Comentarios
Ejercicio02.html
<HTML>
<HEAD>
<TITLE> Ejercicio 2 </TITLE>
</HEAD>
<BODY>
<CENTER>
<H1> Mis Cursos </H1>
</CENTER>
<HR>
Sin un orden particular, mis <B> cursos </B> son los siguientes:
<UL>
<LI> Redes de computadoras
<LI> Ingenieria de Software
<UL>
<LI> Herramientas Case
<LI> Software de Aplicacin I
<LI> Software de Aplicacin II
</UL>
<LI> Sistemas de Informacin Gerencial
</UL>
Los cursos que me gustan son <I> (en orden de preferencia): </I>
<OL>
<LI> Ingenieria de Software
<LI> Sistemas de Informacin Gerencial
<LI> Redes de Computadoras
</OL>
</BODY>
</HTML>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 25 of 328.
24
DHTML
Resultado Web:
Caracteres especiales
Hemos podido notar en los ejemplos anteriores, que las palabras no
aparecen con tildes, y no hemos utilizado algunos otros caracteres
especiales, esto debido a que existen algunas limitaciones para escribir el
texto. Una de ellas es debido a que las etiquetas se forman como un
comando escrito entre los smbolos "<" y ">". Por tanto, si se quisieran
escribir estos caracteres como parte normal del texto, provocara una
ambigedad, ya que el navegador podra interpretarlos como el comienzo o
final de una etiqueta, en vez de un carcter ms del texto.
Para superar estas limitaciones, existen cdigos para escribir estos
caracteres y otros relacionados junto con las etiquetas.
Tabla 1.
<
>
&
"
obtenemos
obtenemos
obtenemos
obtenemos
Podemos ver, que estos cdigos empiezan siempre con el signo & y
acaban siempre con ;. De igual manera, existen cdigos para escribir letras
especficas de distintos idiomas. Los cdigos de las vocales acentuadas se
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 26 of 328.
25
DHTML
forman comenzando con &, seguido de la vocal en cuestin, seguido de la
palabra acute (aguda) y terminando con el signo: ; (punto y coma).
Tabla 2.
- á
- é
- í
- ó
- ú
- ñ
- ¿
- Á
- É
- Í
- Ó
- Ú
- Ñ
- ¡
Todo esto, que como se ve es muy laborioso, puede parecer intil ya que si
escribimos nuestro texto sin hacer ningn caso de estas convenciones,
escribiendo las letras acentuadas y dems signos directamente, es muy
posible que el resultado lo veamos correctamente en nuestro navegador,
pero nunca podremos estar seguros que les ocurra lo mismo a todos los que
accedan a nuestras pginas con otros navegadores distintos.
Para corregir el ejercicio anterior con vocales acentuadas utilizaremos el
siguiente ejemplo.
Ejemplo 3:
Uso de tildes
Ejercicio03.html
<HTML>
<HEAD>
<TITLE> Ejercicio 3 </TITLE>
</HEAD>
<BODY>
<CENTER>
<H1> Mis Cursos </H1>
</CENTER>
<HR>
Sin un orden particular, mis <B> cursos </B> son los siguientes:
<UL>
<LI> Redes de computadoras
<LI> Ingeniería de Software
<UL>
<LI> Herramientas Case
<LI> Software de Aplicación I
<LI> Software de Aplicación II
</UL>
<LI> Sistemas de Información Gerencial
</UL>
Los cursos que me gustan son <I> (en orden de preferencia): </I>
<OL>
<LI> Ingeniería de Software
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 27 of 328.
26
DHTML
Enlaces o hipervnculos
El xito de la Web, se basa justamente en este elemento: el Hipervnculo o
enlace, pues nos da la posibilidad de unir los distintos documentos repartidos
por todo el mundo.
Estructura de los enlaces
Los enlaces, en general, tienen la siguiente estructura:
<A REF = "xxx" > yyy </A>
xxx : es el destino del hipervnculo.
yyy : es el texto que generalmente aparece subrayado y con un color
especial, el cual indicar en la pantalla la existencia de un enlace.
http://alexyniorlls.blogspot.com 28 of 328.
27
DHTML
Tipos de enlaces
Los enlaces los podemos clasificar en cuatro tipos:
Enlaces dentro de la misma pgina
Enlaces con otra pgina nuestra
Enlaces con una pgina fuera de nuestro sistema
Enlaces con una direccin de correo electrnico
Enlaces dentro de la misma pgina
Cuando tenemos documentos (o pginas Web) muy extensos, es
adecuado trabajar con este tipo de enlaces, pues nos permite dar un salto
desde una posicin a otra determinada, dentro de la misma pgina. En
este caso, lo que antes hemos llamado XXX, es decir, el destino del
enlace, en este caso el sitio dentro de la pgina a donde queremos saltar,
se sustituye por #marcador (la palabra marcador puede ser cualquier
palabra). Lo que hemos llamado antes YYY es la palabra (o palabras) que
aparecern en la pantalla en color (en forma de hipertexto). Su estructura
es, entonces:
<A HREF="#marcador"> YYY </A>.
En el sitio exacto a donde queremos saltar, debemos poner la siguiente
etiqueta: <A NAME="marcador"> </A>
Por ejemplo, si quiero saltar desde aqu a la pantalla final, pongo la siguiente
etiqueta:<A HREF="#final"> Haga Click aqu para ir al final</A>.
En el final del documento se inserta esta etiqueta: <A NAME="final"> </A>.
Enlaces con otra pgina nuestra
Generalmente cuando vamos a crear un Sitio Web, contamos con varias
pginas, las cuales necesitamos enlazar unas con otras. Contamos siempre
con una pgina que ser la Inicial o principal y otras enlazadas a ella.
Supongamos que queremos enlazar con la pgina creada en el ejemplo del
captulo anterior, que la hemos llamado ejemplo2.html. En este caso,
simplemente sustituimos lo que hemos llamado XXX (el destino del enlace)
por el nombre del archivo: <A HREF="ejemplo2.html"> Ejemplo 2 </A>
Si queremos que vaya a un sitio concreto de otra pgina nuestra en vez de ir
al principio de la pgina, adonde va por defecto, en ese sitio tenemos que
colocar una marca o marcador (ver seccin anterior), y completar el enlace
con la referencia a ese marcador.
En este ejemplo podremos hacer un enlace de este tipo:
Deseo poner un enlace desde aqu a otra pgina (supongamos que se llame
pag5.html), pero a un sitio concreto de esa pgina, donde he puesto el
marcador <A NAME="cursos"></A>. Entonces la etiqueta tiene que ser: <A
HREF="pag5.html#cursos"> Cursos </A>.
http://alexyniorlls.blogspot.com 29 of 328.
28
DHTML
Si la pgina a la que quiero saltar est, por ejemplo en el subdirectorio
cursos, entonces en la etiqueta tendra que haber puesto "cursos/pag5.html".
Segn el prrafo anterior, la etiqueta tiene que ser: <A
HREF="cursos/pag5.html#cursos"> Cursos </A>.
Y a la inversa, si quiero saltar desde una pgina a otra que est en un
directorio anterior o nivel superior, en la etiqueta tendra que haber puesto
"../pag5.html". Esos dos puntos (..) hace que se dirija al directorio anterior.
Obsrvese que se debe utilizar el smbolo / para indicar los subdirectorios, y
no este otro \, que es propio nicamente de Windows. Podemos evitar todas
estas complicaciones colocando todos los archivos en un solo directorio,
pero si tenemos muchas pginas lo mejor es tenerlas en directorios, pues
nos facilitar el mantenimiento de ellas.
Enlaces con una pgina fuera de nuestro sistema
Si queremos enlazar con una pgina que est fuera de nuestro Sitio Web (es
decir, que est en un servidor distinto), es necesario conocer su direccin
completa, o URL (Uniform Resource Locator). El URL podra ser, adems de
la direccin de una pgina del Web, una direccin de ftp, gopher, etc.
Una vez conocida la direccin (o URL), la colocamos en vez de lo que
hemos llamado anteriormente xxx (el destino del enlace). Si queremos
enlazar con la pgina de la Nasa (cuyo URL es: http://www.nasa.com), la
etiqueta sera:
<A HREF="http://www.nasa.com/">Pgina inicial de la Nasa </A>
Es importante escribir estas direcciones correctamente (respetando las
maysculas y minsculas, pues los servidores UNIX s las distinguen)
Enlaces con una direccin de Correo Electrnico
En este caso, sustituimos lo que se ha llamado antes xxx (el destino del
enlace) por mailto: seguido de la direccin de correo electrnico. La
estructura de la etiqueta es:
<A HREF="mailto: usuario@servidoremail">Texto del enlace</A>
Ejemplo 4:
Enlaces
http://alexyniorlls.blogspot.com 30 of 328.
29
DHTML
Resultado Web:
Imgenes
La etiqueta que nos sirve para incluir imgenes en las pginas Web es muy
similar a la de enlaces a otras pginas. A esta etiqueta se le indica el nombre
y la localizacin de un archivo que contiene una imagen.
La estructura de la etiqueta es:
<IMG SRC="imagen.gif">
Con el comando IMG SRC (Image Source, origen o fuente de la imagen) se
indica que se quiere mostrar una imagen llamada imagen.gif (el nombre que
tenga el archivo).
Dentro de la etiqueta se pueden aadir otros comandos, tal como ALT
http://alexyniorlls.blogspot.com 31 of 328.
30
DHTML
Para elegir la posicin de la imagen con respecto al texto hay distintas
posibilidades. La ms sencilla es colocarla entre dos prrafos, con un titular
a un lado.
De momento nos vamos a limitar a escoger la posicin del titular con
respecto a la imagen (si es que queremos ponerle un titular, claro est). Se
puede poner arriba, en medio o abajo del lado de la imagen. Para ello se
aade el comando ALIGN a la etiqueta, de la siguiente manera:
Imgenes
<HTML>
<HEAD>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 32 of 328.
31
DHTML
http://alexyniorlls.blogspot.com 33 of 328.
32
DHTML
Tablas
Las etiquetas necesarias para crear tablas son:
<TABLE> Y </TABLE> para especificar el inicio y final de la tabla.
A esta etiqueta le podemos aadir un comando: BORDER, que sirve para
especificar el grosor del borde de las celdas. La manera de especificar esta
caracterstica es la siguiente:
<TABLE BORDER=[espesor]>
[resto de las etiquetas]
</TABLE>
Por ejemplo: si queremos una tabla con un borde de una unidad de espesor,
escribiremos el siguiente cdigo:
<TABLE BORDER=1>
[resto de las etiquetas]
</TABLE>
Dentro de estas etiquetas, es necesario especificar las filas y columnas que
contendr la tabla.
Las etiquetas para formar cada fila (row) de la tabla, que son: <TR> y </TR>.
Estas etiquetas tenemos que repetirlas tantas veces como filas queremos
que tenga la tabla. Las etiquetas para crear columnas son: <TD> y </TD>,
que engloban el contenido de cada celda concreta (texto, imgenes, etc.).
Hay que repetirla tantas veces como celdas queremos que haya en esa fila.
Ejemplo 6: Tablas
Ejercicio06.html
<HTML>
<HEAD><TITLE> Ejercicio 6 </TITLE></HEAD>
<BODY BGCOLOR="#CCFFFF" TEXT="#AA0000">
<CENTER>
<H1> Ejercicio 6 </H1>
</CENTER>
<!-- Lnea horizontal con 75% de ancho de la ventana -->
<HR width=75%>
<A HREF="ejercicio01.html"> <IMG SRC="iconos/nuevo.gif" WIDTH=20 HEIGHT=22
border="0"> </A>
<TABLE BORDER=1>
<TR><TD>fila1-celda1</TD> <TD>fila1-celda2</TD> <TD>fila1-celda3</TD></TR>
<TR><TD>fila2-celda1</TD> <TD>fila2-celda2</TD> <TD>fila2-celda3</TD></TR>
</TABLE>
</BODY>
</HTML>
http://alexyniorlls.blogspot.com 34 of 328.
33
DHTML
Resultado Web:
<table BORDER="1">
<caption>Ejemplo de filas desiguales </caption>
<tr>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 35 of 328.
34
DHTML
<td>fila1-celda1</td>
<td>fila1-celda2</td>
<td>fila1-celda3</td>
</tr>
<tr>
<td>fila2-celda1</td>
<td>fila2-celda2</td>
</tr>
</table>
Resultado Web:
<TABLE BORDER="1">
<CAPTION>Ejemplo de filas desiguales </CAPTION>
<TR>
<TH>Columna 1</TH> <TH>Columna 2</TH> <TH>Columna 3</TH>
</TR>
<TR>
<TD>fila1-celda1</TD>
<TD>fila1-celda2</TD>
<TD>fila1-celda3</TD>
</TR>
<TR>
<TD>fila2-celda1</TD>
<TD>fila2-celda2</TD>
</TR>
</TABLE>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 36 of 328.
35
DHTML
Resultado Web
http://alexyniorlls.blogspot.com 37 of 328.
36
DHTML
columnas, o ROWSPAN=nmero para extenderse verticalmente sobre un
nmero determinado de filas.
Por ejemplo, en la tabla anterior vamos a aadir una fila con una sola celda,
que abarca a tres columnas:
<TABLE BORDER="1">
<CAPTION>Ejemplo de filas desiguales </CAPTION>
<TR>
<TH>Columna 1</TH> <TH>Columna 2</TH> <TH>Columna 3</TH>
</TR>
<TR>
<TD COLSPAN=3> Celda sobre 3 columnas </TD>
<TR>
<TR>
<TD>fila1-celda1</TD>
<TD>fila1-celda2</TD>
<TD>fila1-celda3</TD>
</TR>
<TR>
<TD>fila2-celda1</TD>
<TD>fila2-celda2</TD>
</TR>
</TABLE>
Resultado Web
<TABLE BORDER="1">
<CAPTION>Ejemplo de filas desiguales </CAPTION>
<TR>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 38 of 328.
37
DHTML
http://alexyniorlls.blogspot.com 39 of 328.
38
DHTML
Se puede combinar este atributo con CELLSPACING, visto lneas atrs. Por
ejemplo, una tabla con bordes de 5 de espesor, separacin entre celdas de
15 y separacin del contenido con respecto a los bordes de las celdas de 20,
lo obtendramos con:
ejemplo06.html
<HTML>
<HEAD>
<TITLE> Tablas </TITLE>
</HEAD>
<BODY>
<CENTER>
<H1> Tablas </H1>
</CENTER>
<HR width=75%>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 40 of 328.
39
DHTML
Formularios
Los formularios permiten a los usuarios enviar informacin al servidor, en el
cual hay instalado(s) programa(s) que procesan esta informacin.
Estructura de un formulario
La estructura de un formulario es la siguiente:
Etiqueta de inicio:
Cuerpo del formulario, con los distintos elementos para poder
introducir los datos.
Botones de envo y de borrado.
Etiqueta de cierre </FORM>
http://alexyniorlls.blogspot.com 41 of 328.
40
DHTML
Etiqueta de inicio
http://alexyniorlls.blogspot.com 42 of 328.
41
DHTML
En el caso que hemos visto, si hubiramos cambiado la etiqueta
correspondiente por:
http://alexyniorlls.blogspot.com 43 of 328.
42
DHTML
Introduccin por medio de Listas Desplegables
Si queremos que el usuario, en vez de introducir un texto, como hemos visto
en los casos anteriores, escoja entre varias opciones que le presentamos
nosotros, haremos uso de un formulario en forma de listas desplegables.
Se consigue con la etiqueta de inicio <SELECT NAME="yyy"> y la de cierre
</SELECT>. Las distintas opciones a escoger se consiguen con la etiqueta
<OPTION>.
Ejemplo: Pedimos al usuario que elija su color preferido:
http://alexyniorlls.blogspot.com 44 of 328.
43
DHTML
Botones de radio
Cuando queremos que el usuario elija una nica opcin entre varias,
podemos hacer uso de los botones de radio, que se consiguen con la
etiqueta:
http://alexyniorlls.blogspot.com 45 of 328.
44
DHTML
<P><INPUT TYPE="reset" VALUE="Borrar datos">
Se puede comprobar su funcionamiento, escribiendo algo en el formulario y
pulsando luego el botn de borrado.
Consideraciones finales
Hasta ahora hemos visto uno a uno los diferentes elementos que se pueden
utilizar. Pero no hay ningn inconveniente en usar, dentro del mismo
formulario, distintos tipos de introduccin de datos. Al pulsar el usuario el
botn de envo recibiramos en email suyo con las distintas parejas
NAME=VALUE de cada elemento, encadenadas con el smbolo &.
Ejemplo 10:
Formulario 2
Ejercicio10.html
<HTML>
<HEAD><TITLE>LIBRO DE VISITAS</TITLE></HEAD>
<BODY>
<P><CENTER>
<H2>Libro de visitas</H2>
<P>
<FORM ACTION=mailto:xy@ab METHOD="POST" ENCTYPE="TEXT/PLAIN">
Tu nombre:
<BR><INPUT TYPE="text" NAME="Nombre">
<P>Escribe tus comentarios:
<BR><TEXTAREA NAME="Comentarios" ROWS="6" COLS="40">
</TEXTAREA>
<P><INPUT TYPE="submit" VALUE="Enviar datos">
<INPUT TYPE="reset" VALUE="Borrar datos">
</FORM>
<P><HR><P>
</BODY>
</HTML>
Resultado Web:
http://alexyniorlls.blogspot.com 46 of 328.
45
DHTML
Resultado de ejercicio10.html
http://alexyniorlls.blogspot.com 47 of 328.
46
DHTML
HTML 4
La especificacin 4.0 de HTML, nos trae algunas novedades respecto a la
versin 3.2, las cuales sern comentadas a continuacin:
Elementos nuevos
Los nuevos elementos en HTML 4.0 son: ABBR, ACRONYM, BDO,
BUTTON, COL, COLGROUP, DEL, FIELDSET, FRAME, FRAMESET,
IFRAME, INS, LABEL, LEGEND, NOFRAMES, NOSCRIPT, OBJECT,
OPTGROUP, PARAM, SPAN, TBODY, TFOOT, THEAD y Q.
Cambios en los atributos
Casi todos los atributos que especifican el formato (tamao, color,
alineacin, etc) de un documento HTML han sido desaprobados en
favor de las hojas de estilo en cascada.
La lista de atributos del apndice indica qu atributos han sido
desaprobados.
Los atributos id y class permiten a los autores asignar informacin de
nombre y clase a los elementos para las hojas de estilo, como
identificadores de vnculo, para los scripts, para declaraciones de
objetos, para tratamientos genricos del documento, etc.
Veamos a continuacin detalles de algunas nuevas etiquetas:
Frames
Frames (en ingls, marcos o cuadros) es un procedimiento del lenguaje
HTML para dividir la pantalla en diferentes zonas, o ventanas, que pueden
actuar independientemente unas de otras, como si se trataran de pginas
diferentes, pues incluso cada una de ellas pueden tener sus propias barras
de desplazamiento. Los navegadores que lo implementan son el Netscape
2.0, y el Explorer 2.0 en adelante. Una de sus caractersticas ms
importantes es que pulsando un enlace situado en un frame, se puede
cargar en otro frame una pgina determinada. Esto se utiliza frecuentemente
para tener un frame estrecho en la parte lateral (o superior) con un ndice del
contenido en forma de diferentes enlaces, que, al ser pulsados cargan en la
ventana principal las distintas pginas. De esta manera se facilita la
navegacin entre las pginas, pues aunque se vaya pasando de unas a
otras, siempre estar a la vista el ndice del conjunto.
Para comprender los distintos conceptos vamos a desarrollar un ejemplo,
creando una pgina con dos frames. El de la izquierda va a servir de ndice
de lo que veamos en el de la derecha, y en ste veremos inicialmente una
pgina de presentacin. Se podr acceder tambin aqu a las pginas
creadas anteriormente, si se pulsa un enlace en el frame de la izquierda.
Documento de definicin de los frames
Lo primero que tenemos que hacer es crear un documento HTML en el que
definiremos cuntas zonas va a haber, qu distribucin y tamao van a
tener, y cul va ser el contenido de cada una de ellas.
http://alexyniorlls.blogspot.com 48 of 328.
47
DHTML
En el ejemplo que vamos a desarrollar, la pgina va a tener dos frames
distribuidos en columnas (es decir, uno al lado del otro, en vez de uno
encima del otro, lo que sera una distribucin en filas).
Con respecto al tamao, haremos que el primero (el de la izquierda) ocupe el
20% del ancho de la pantalla, y el otro, el 80% restante.
Y con respecto al contenido, el frame de la izquierda va a contener un
documento HTML que va a servir de ndice de lo que veamos en el otro (y
que vamos a llamar pagind.html), y el de la derecha otro documento HTML
que va a servir de pgina de presentacin (al que llamaremos pagpre.html).
Todo lo anterior se refleja en el siguiente documento HTML:
Ejemplo 11:
Uso de frames
Ejercicio11.html
<HTML>
<HEAD>
<TITLE>Mi página con frames</TITLE>
</HEAD>
<FRAMESET COLS="20%, 80%">
<FRAME SRC="ejercicio11a.html">
<FRAME SRC="ejercicio11b.html" NAME="principal">
</FRAMESET>
<NOFRAMES>
Estas utilizando un navegador que no soporta frames.
<A HREF="ejercicio12.html"> ir a página sin frames </A>.
</NOFRAMES>
</HTML>
Ejercicio11a.html
<html>
<head>
<title>marco 1</title>
</head>
<body>
marco 1
</body>
</html>
Ejercicio11b.html
<html>
<head>
<title>marco 2</title>
</head>
<body>
marco 2
</body>
</html>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 49 of 328.
48
DHTML
Resultado Web
<FRAME SRC="ejercicio11a.html">
<FRAME SRC="ejercicio11b.html" NAME="principal">
Con esto se define que el contenido del primer frame (el de la izquierda) sea
el documento HTML ejercicio11a.html y el del segundo (el de la derecha) sea
el documento HTML ejercicio11b.html.
Podemos ver en la etiqueta del segundo marco que se ha incluido el atributo
NAME="principal", pero no as en el primero, debido a que se necesita dar
un nombre al segundo frame, pues, podramos utilizar hipervnculos en el
primer marco que muestren pginas Web en el segundo, utilizando la
etiqueta
TARGET,
por
ejemplo:
<a
href=ejercicio12.html
TARGET=principal>ejercicio 12</a>. Segn este ejemplo la pgina
ejercicio12.html se abrir en el frame del lado derecho de la pgina.
Para el caso que el navegador no soporte FRAMES se utiliza la etiqueta
<NOFRAMES> y </NOFRAMES>. Se aaden al final del documento de
definicin de los frames, y a se pone entre ambas lo que queremos que vean
los que acceden con un navegador que no soporta frames. Puede incluso
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 50 of 328.
49
DHTML
ser el cdigo HTML de una pgina completa (lo que normalmente va entre
las etiquetas <BODY> y </BODY>)
Un segundo diseo con frames podra ser dividiendo la pgina de manera horizontal.
Ejemplo11c.html
<HTML>
<HEAD>
<TITLE>Mi página con frames</TITLE>
</HEAD>
<FRAMESET ROWS="20%, 80%">
<FRAME SRC="ejercicio11a.html">
<FRAME SRC="ejercicio11b.html" NAME="principal">
</FRAMESET>
<NOFRAMES>
Estas utilizando un navegador que no soporta frames.
<A HREF="ejercicio12.html"> ir a página sin frames </A>.
</NOFRAMES>
</HTML>
Resultado Web:
http://alexyniorlls.blogspot.com 51 of 328.
50
DHTML
Etiqueta ACRONYM
Indica un acrnimo (es la suma de los significados de las palabras que lo
forman. Por ejemplo HTML, (Hyper Text Markup Language).
Etiqueta ABBR
Indica una forma abreviada (etc, Dr, Ing, Corp, etc.).
Los elementos ABBR y ACRONYM permiten a los autores indicar claramente la
aparicin de abreviaturas y acrnimos.
Ejemplo 12:
Acrnimos y Abreviaturas
Ejemplo12.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<ACRONYM title="World Wide Web">WWW</ACRONYM>
<ACRONYM lang="en"
title="Hyper Text Markup language">
HTML
</ACRONYM>
<br>
<ABBR lang="es" title="Doctor">Dr</ABBR>
<ABBR title="Señor">Sr</ABBR>
</body>
</html>
Resultado Web:
http://alexyniorlls.blogspot.com 52 of 328.
51
DHTML
Carlos dice:
<Q lang="es"> Estoy aprendiendo HTML </Q><br>
Jaime dice:
<Q lang="es"> Es un lenguaje fácil de aprender </Q>
Resultado Web:
INS y DEL
Ejercicio14.html
<INS datetime="2008-09-25T08:15:30-05:00"
cite="http://oscar.capunay.com/index.php">Ejemplo de texto nuevo.
Este texto fue agregado.
</INS>
<P>
Esta frase tiene <DEL>una palabra borrada</DEL> algo borrado.
</P>
Resultado Web:
http://alexyniorlls.blogspot.com 53 of 328.
52
DHTML
OBJECT
Esta etiqueta se usa cuando un elemento Web ser representado utilizando
un plug-in de algn software externo al agente o navegador utilizado.
PARAM
Las etiquetas PARAM especifican un conjunto de valores que pueden ser
necesarios para un objeto en tiempo de ejecucin. Puede aparecer cualquier
nmero de elementos PARAM en el contenido de un elemento OBJECT o
APPLET, y en cualquier orden, pero deben ser colocados al principio del
contenido del elemento OBJECT o APPLET que los contienen.
Ejemplo 15:
OBJECT Y PARAM
Ejemplo15.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo de OBJECT, PARAM y EMBED</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swfl
ash.cab#version=6,0,0,0"
WIDTH="100%" HEIGHT="100%" ALIGN="" id="intro2">
<PARAM NAME=movie VALUE="intro2.swf">
<PARAM NAME=loop VALUE=false>
<PARAM NAME=menu VALUE=false>
<PARAM NAME=quality VALUE=high>
<PARAM NAME=scale VALUE=exactfit>
<PARAM NAME=bgcolor VALUE=#080638>
<EMBED src="intro2.swf" loop=false menu=false quality=high scale=exactfit
bgcolor=#080638
WIDTH="100%"
HEIGHT="100%"
NAME="intro2"
ALIGN=""
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED
>
</OBJECT>
</body>
</html>
Resultado Web:
http://alexyniorlls.blogspot.com 54 of 328.
53
DHTML
Ejercicio16.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo de THEAD, TFOOT y TBODY</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 55 of 328.
54
DHTML
<table>
<thead>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="3">Pie de la tabla</th>
</tr>
</tfoot>
<tbody>
<tr><td>1</td> <td>Kelly</td> <td>Quiroz Ch</td> </tr>
<tr> <td>2</td> <td>Carlos</td> <td>Capuay Uceda</td> </tr>
<tr> <td>3</td> <td>Marco</td> <td>Quiroz Chavil</td> </tr>
<tr> <td>4</td> <td>Jaime</td> <td>Capuay Uceda</td> </tr>
</tbody>
</table>
</body>
</html>
Resultado Web:
http://alexyniorlls.blogspot.com 56 of 328.
55
DHTML
FORMULARIOS
El elemento BUTTON
Los botones creados con el elemento BUTTON funcionan exactamente igual
que los botones creados con el elemento INPUT, pero ofrecen posibilidades
ms ricas de representacin: el elemento BUTTON puede tener contenido.
Por ejemplo, un elemento BUTTON que contenga una imagen se parece y
funciona como un elemento INPUT cuyo atributo type sea igual a "image",
pero el tipo de elemento BUTTON permite un contenido.
Los navegadores pueden representar los botones BUTTON con un relieve y
un movimiento arriba/abajo al pulsarlos, mientras que pueden representar los
botones INPUT como imgenes "planas".
El siguiente ejemplo extiende un ejemplo previo, pero creando los botones
de envo y de restablecer con BUTTON en lugar de INPUT. Los botones
contienen imgenes sacadas de elementos IMG.
Ejemplo 17:
Ejercicio17.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo de BUTTON</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<FORM action="http://oscar.capunay.com/datos/formulario" method="post">
<P>
Nombre: <INPUT type="text" name="txtnombre"><BR>
Apellido: <INPUT type="text" name="txtapellido"><BR>
email: <INPUT type="text" name="txtemail"><BR>
sexo: <INPUT type="radio" name="optsexo" value="H"> Hombre
<INPUT type="radio" name="optsexo" value="M"> Mujer<BR>
<BUTTON name="enviar" value="enviar" type="submit">
Editar<IMG src="iconos/editar.gif" alt="Enviar Datos"></BUTTON>
<BUTTON name="reiniciar" type="reset">
Restablecer<IMG
src="iconos/nuevo.gif"
alt="Limpiar"
width="12"></BUTTON>
</P>
</FORM>
</body>
</html>
Resultado Web:
http://alexyniorlls.blogspot.com 57 of 328.
56
DHTML
Ejercicio18.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo de OPTGROUP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<FORM
action="http://oscar.capunay.com/datos/registro.php"
method="post">
<P>
<SELECT name="Producto" size="1">
<OPTION selected label="ninguno" value="ninguno"> Ninguno</OPTION>
<OPTGROUP label="Limpieza">
<OPTION label="escoba" value="limp001">Escoba</OPTION>
<OPTION
label="jabón"
value="limp002">jabón</OPTION>
<OPTION label="detergente" value="limp003">Detergente</OPTION>
</OPTGROUP>
<OPTGROUP label="Dulces">
<OPTION label="chocolate" value="dulc001">Chocolate</OPTION>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 58 of 328.
57
DHTML
<OPTION label="caramelo" value="dulc002">Caramelo</OPTION>
<OPTION label="gelatina" value="dulc003">Gelatina</OPTION>
</OPTGROUP>
<OPTGROUP label="Bebidas">
<OPTION label="pepsi" value="bebi001">PEPSI</OPTION>
<OPTION label="cola-cola" value="bebi002">Coca Cola</OPTION>
</OPTGROUP>
</OPTGROUP>
</SELECT>
</FORM>
</body>
</html>
Resultado Web:
Ejercicio19.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ejemplo FIELDSET y LEGEND</title>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 59 of 328.
58
DHTML
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<FORM action="data/proceso1.php" method="post">
<FIELDSET>
<LEGEND>Datos Personales </LEGEND>
Nombres:<INPUT name="txtnombres" type="text" tabindex="1"><br>
Apellidos:<INPUT name="txtapellidos" type="text" tabindex="2"><br>
Ciudad: <INPUT name="txtciudad" type="text" tabindex="3"><br>
Teléfono: <INPUT name="txtfono" type="text" tabindex="4"><br>
</FIELDSET>
<FIELDSET>
<LEGEND>Datos Internet</LEGEND>
Página personal:<INPUT name="txtpagina" type="text" size="50"
tabindex="5"><br>
Blog:<INPUT name="txtblog" type="text" size="40" tabindex="2"><br>
Correo Electrónico: <INPUT name="txtcorreo" type="text" size="30"
tabindex="3"><br>
Skype: <INPUT name="txtfono" type="text" size="10" tabindex="4"><br>
ICQ: <INPUT name="txtfono" type="text" size="10" tabindex="4"><br>
</FIELDSET>
<button type="submit">Enviar</button>
</FORM>
</body>
</html>
Resultado Web:
http://alexyniorlls.blogspot.com 60 of 328.
59
DHTML
Etiquetas DIV y SPAN
Las etiquetas DIV y SPAN, junto con los atributos id y class, ofrecen un
mecanismo genrico para aadir estructura a los documentos. Estos
elementos especifican si su contenido es en lnea (SPAN) o en bloque (DIV)
pero no imponen ningn otro estilo de presentacin al contenido, por este
motivo, se pueden aplicar hojas de estilo en cascada a estas etiquetas.
Ejemplo 20:
DIV y SPAN
Ejercicio20.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
<!-function toggle(obj){
var objID = document.getElementById(obj);
objID.style.display = (objID.style.display == "none")?"":"none";
}
// -->
</script>
<title>menu</title>
</head>
<body>
<table>
<tr>
<th width="16"><a href="#" onClick="toggle('tablas');return false;"
title="Ocultar o Mostrar Menu">
<img src="iconos/nuevo.gif" alt="despliegue" width="16" height="16"
border="0"></a></th>
<th><SPAN>Tablas</SPAN></th>
</tr>
</table>
<div id="tablas" style="display: none;">
<table>
<tr>
<td><a
href="universidad.php"
target="principal">Universidades</a></td>
</tr>
<tr>
<td><a href="facultad.php" target="principal">Facultades</a></td>
</tr>
<tr>
<td><a href="escuela.php" target="principal">Escuelas</a></td>
</tr>
<tr>
<td><a href="semestre.php" target="principal">Semestre</a></td>
</tr>
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 61 of 328.
60
DHTML
</table>
</div>
<table>
<tr>
<th width="16"><a href="#" onClick="toggle('academico');return
false;" title="Ocultar o Mostrar Menu">
<img src="iconos/nuevo.gif" alt="despliegue2" width="16" height="16"
border="0"></a></th>
<th><SPAN>Maestros</SPAN></th>
</tr>
</table>
<div id="academico" style="display: block;">
<table>
<tr>
<td><a href="alumno.php" target="principal">Alumnos</a></td>
</tr>
<tr>
<td><a href="curso.php" target="principal">Cursos</a></td>
</tr>
<tr>
<td><a href="evaluacion.php" target="principal"> Evaluaciones
</a></td>
</tr>
<tr>
<td><a href="registro.php" target="principal">Registro</a></td>
</tr>
<tr>
<td><a href="asistencia.php"
target="principal">Inasistencias</a></td>
</tr>
<tr>
<td><a href="resultado.php" target="principal">Resultados</a></td>
</tr>
<tr>
<td><a href="mensaje.php" target="principal">Mensajes</a></td>
</tr>
<tr>
<td><a href="encuesta.php" target="principal">Encuestas</a></td>
</tr>
</table>
</div>
</body>
</html>
Podemos ver en este ejemplo que podemos ocultar o hacer visible las DIV.
Resultado Web:
http://alexyniorlls.blogspot.com 62 of 328.
61
DHTML
http://alexyniorlls.blogspot.com 63 of 328.
62
DHTML
JavaScript
JavaScript, al igual que Java o VRML, es una de las mltiples maneras que
han surgido para extender las capacidades del lenguaje HTML. Al ser la ms
sencilla, es por el momento la ms extendida. Es importante saber que:
JavaScript no es un lenguaje de programacin propiamente dicho. Es un
lenguaje script u orientado a documento, como pueden ser los lenguajes de
macros que tienen muchos procesadores de texto. Nunca se podr hacer un
programa con JavaScript, tan slo se podr mejorar una pgina Web con
algunas cosas sencillas. JavaScript y Java son dos cosas distintas,
principalmente porque Java s que es un lenguaje de programacin
completo. Lo nico que comparten es la misma sintaxis. Existen tres
versiones de JavaScript. Casi todo lo que se ha escrito en este documento
funciona con la versin 1.0, que naci con el Netscape Navigator 2.0.
Tambin existe una versin 1.3, introducida en la versin 4.06. Esta versin
es una pequea revisin de la 1.2 creada para ajustarse al estndar
internacional ECMA que regula el lenguaje JavaScript.
Vamos a realizar nuestro primer "programa" en JavaScript. Haremos surgir
una ventana que nos muestre el mensaje "hola, Web". As podremos ver los
elementos principales del lenguaje. El siguiente cdigo es una pgina Web
completa con un botn que, al pulsarlo, muestra el mensaje.
Ejemplo 21:
funcin alert
HolaWeb.html
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function HolaWeb() {
alert("Hola, Web!");
}
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<INPUT TYPE="button" NAME="Boton" VALUE="Pulsame"
onClick="HolaWeb()">
</FORM>
</BODY>
</HTML>
Ahora vamos a ver, paso por paso, que significa cada uno de los elementos
extraos que tiene la pgina anterior:
<SCRIPT LANGUAGE="JavaScript">
</SCRIPT>
http://alexyniorlls.blogspot.com 64 of 328.
63
DHTML
Dentro de estos elementos ser donde se puedan poner funciones en
JavaScript.
Por otra parte el cdigo de JavaScript puede ser incluido en la pgina Web
de la siguiente manera:
function HolaWeb() {
alert("Hola, Web!");
}
Aunque JavaScript est orientado a objetos no es de ningn modo tan
estricto como Java, donde nada est fuera de un objeto. En el cdigo de la
funcin vemos una llamada al mtodo alert (que pertenece al objeto
window) que es la que se encarga de mostrar el mensaje en pantalla.
<FORM>
<INPUT TYPE="button" NAME="Boton" VALUE="Pulsame"
onClick="HolaWeb()">
</FORM>
Dentro del elemento que usamos para mostrar un botn vemos una cosa
nueva: onClick. Es un controlador de evento. Cuando el usuario pulsa el
botn, el evento click se dispara y ejecuta el cdigo que tenga entre comillas
el controlador de evento onClick, en este caso la llamada a la funcin
HolaWeb(), que tendremos que haber definido con anterioridad. Existen
muchos ms eventos que iremos descubriendo segn avancemos. En
realidad, podramos haber escrito lo siguiente:
<FORM>
<INPUT TYPE="button" NAME="Boton" VALUE="Pulsame"
onClick="alert('Hola,Mundo!')">
</FORM>
Elementos bsicos
Comentarios
Un comentario es una parte de nuestro programa que el ordenador ignora y
que, por tanto, no realiza ninguna tarea. Se utilizan generalmente para poner
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 65 of 328.
64
DHTML
en lenguaje humano lo que estamos haciendo en el lenguaje de
programacin y as hacer que el cdigo sea ms comprensible.
En JavaScript existen dos tipos de comentarios. El primero nos permite que
el resto de la lnea sea un comentario. Para ello se utilizan dos barras
inclinadas:
var i = 1; // Aqui esta el comentario
Sin embargo, tambin permite un tipo de comentario que puede tener las
lneas que queramos. Estos comentario comienzan con: /* y terminan por */.
Literales
Se llama as a los valores que puede tomar una variable o una constante.
Aparte de los distintos tipos de nmeros y valores booleanos:
"Soy una cadena"
3434
3.43
true, false
Tambin podemos especificar arrayso vectores:
vacaciones = ["Navidad", "Semana Santa", "Verano"];
alert(vacaciones[0]);
Dentro de las cadenas podemos indicar varios caracteres especiales, con
significados especiales. Estos son los ms usados:
Tabla 3.
Carcter
\n
\t
\'
\"
\\
\999
Significado
Nueva lnea
Tabulador
Comilla simple
Comilla doble
Barra invertida
El nmero ASCII (segn la codificacin Latin-1) del carcter en
hexadecimal
http://alexyniorlls.blogspot.com 66 of 328.
65
DHTML
Tipos de datos
En Javascript los tipos de datos se asignan dinmicamente segn
asignamos valores a las distintas variables y son los clsicos: cadenas de
texto, varios tipos de enteros y reales, valores booleanos, vectores, matrices,
referencias y objetos.
Variables
Las variables son nombres que ponemos a los lugares donde almacenamos
la informacin. En Javascript, deben comenzar por una letra o un subrayado
(_), pudiendo haber adems dgitos entre los dems caracteres.
No es necesario declarar una variable, pero cuando se hace es por medio
de la palabra reservada var. Una variable, cuando no es declarada, tiene
siempre mbito global, mientras que en caso contrario ser de mbito
global si est definida fuera de una funcin, y local si est definida dentro:
var x;
// Accesible fuera y dentro de pruebas
y = 2;
// Accesible fuera y dentro de pruebas
function pruebas() {
var z;
// Accesible slo dentro de pruebas
w = 1;
// Accesible fuera y dentro de pruebas
}
Se pueden declarar varias variables en una misma sentencia separndolos
por comas:
var x, y, z;
El tipo de datos de la variable ser aquel que tenga el valor que asignemos a
la misma, a no ser que le asignemos un objeto por medio del operador new.
Vectores y matrices
Estos tipos de datos complejos son un conjunto ordenado de elementos,
cada uno de los cuales es en s mismo una variable distinta. En Javascript,
los vectores y las matrices son objetos. Como veremos que hacen todos
los objetos, se declaran utilizando el operador new:
http://alexyniorlls.blogspot.com 67 of 328.
66
DHTML
El vector tendr inicialmente 20 elementos (desde el 0 hasta el 19). Si
queremos ampliarlo no tenemos ms que asignar un valor a un elemento
que est fuera de los lmites del vector:
miEstupendoVector[25] = "Algn valor"
De hecho, podemos utilizar de ndices cualquier expresin que deseemos
utilizar. Ni siquiera necesitamos especificar la longitud inicial del vector si no
queremos:
Operadores
Los operadores nos permiten unir identificadores y literales para formar
expresiones. Las expresiones son el resultado de operaciones matemticas
o lgicas. Un literal o una variable son expresiones, pero tambin lo son esos
mismos literales y variables unidos entre s mediante operadores.
JavaScript dispone de muchos ms operadores que la mayora de los
lenguajes, si exceptuamos a sus padres C, C++ y Java. Algunos de ellos no
los estudiaremos debido a su escasa utilidad y con algunos otros
(especialmente el condicional) deberemos andarnos con cuidado, ya que
puede lograr que nuestro cdigo no lo entendamos ni nosotros.
Operadores aritmticos
JavaScript dispone de los operadores aritmticos clsicos y algn que otro
ms:
Tabla 4.
Operadores aritmticos
Descripcin
Smbolo
Expresin
ejemplo
de Resultado
ejemplo
Multiplicacin
2*4
Divisin
5/2
2.5
5%2
Suma
2+2
Resta
7-2
Incremento
++
++2
Decremento
--
--2
http://alexyniorlls.blogspot.com 68 of 328.
del
67
DHTML
Menos unario
-(2+4)
-6
a = 1;
b = ++a;
En este primer caso, a valdr 2 y b 2 tambin. Sin embargo:
a = 1;
b = a++;
Ahora, a sigue valiendo 2, pero b es ahora 1. Es decir, estos operadores
modifican siempre a su operando, pero si se colocan detrs del mismo se
ejecutan despus de todas las dems operaciones.
Operadores de comparacin
Podemos usar los siguientes:
Tabla 5.
Operadores de comparacin
Descripcin
Igualdad
==
2 == '2'
Verdadero
Desigualdad
!=
2 != 2
Falso
Igualdad estricta
===
2 === '2'
Falso
2 !== 2
Falso
Menor que
<
2<2
Falso
Mayor que
>
3>2
Verdadero
<=
2 <= 2
Verdadero
>=
1 >= 2
Falso
Operadores lgicos
Estos operadores permiten realizar expresiones lgicas complejas:
Tabla 6.
Operadores lgicos
!(2 = 2)
Falso
http://alexyniorlls.blogspot.com 69 of 328.
68
DHTML
Y
&&
(2 = 2) && (2 >= 0)
Verdadero
||
(2 = 2) || (2 <> 2)
Verdadero
Operadores de asignacin
Normalmente los lenguajes tienen un nico operador de asignacin, que en
JavaScript es el smbolo =. Pero en este lenguaje, dicho operador se puede
combinar con operadores aritmticos y lgicos para dar los siguientes:
Tabla 7.
Operadores de asignacin
x=x+y
x -= y
x=x-y
x /= y
x=x/y
x *= y
x=x*y
x%y
x=x%y
Operadores Especiales
Vamos a incluir en este apartado operadores que no hayan sido incluidos en
los anteriores. La concatenacin de cadenas, por ejemplo, se realiza con el
smbolo +. El operador condicional tiene esta estructura:
condicin ? valor1 : valor2
Si la condicin se cumple devuelve el primer valor y, en caso contrario, el
segundo. El siguiente ejemplo asignara a la variable a un 2:
a=2>3?1:2
Para tratar con objetos disponemos de tres operadores:
Tabla 8.
Operadores especiales
Descripcin
Smbolo Ejemplo
Crear un objeto
new
Borrar un objeto
delete
delete a
Referencia al
objeto actual
this
Elimina
el
anteriormente creado
vector
http://alexyniorlls.blogspot.com 70 of 328.
69
DHTML
Estructuras de control
Estas estructuras se pueden clasificar en dos grandes grupos: bifurcaciones
condicionales y bucles. Aparte de los dos tipos clsicos de estructuras de
control, en JavaScript disponemos de algunas estructuras adicionales para
facilitar el manejo de objetos.
a) Bifurcaciones condicionales
Una bifurcacin condicional en una estructura que realiza una tarea u otra
dependiendo del resultado de evaluar una condicin. La primera que vamos
a estudiar es la estructura if...else. Esta estructura es la ms sencilla y
antigua de todas:
a=5;
b=7;
if (a>b)
alert(a es mayor que b);
else
alert(a no es mayor que b);
Hay que indicar que el else es opcional..
La siguiente estructura bifurca segn los distintos valores que pueda tomar
una variable especfica. Es la sentencia switch:
switch(color) {
case "azul":
alert( El color elegido es el azul);
break;
case "rojo":
alert( El color elegido es el rojo);
break;
default:
alert( El color por defecto es negro);
}
Hay que indicar que no es compatible con estndar ECMA y no es soportado
por el Explorer 3.
Bucles
Un bucle es una estructura que permite repetir una tarea un nmero de
veces, determinado por una condicin. Para hacer bucles podemos utilizar
las estructuras while y do...while. Estos bucles iteran indefinidamente
mientras se cumpla una condicin. La diferencia entre ellas es que la primera
comprueba dicha condicin antes de realizar cada iteracin y la segunda lo
hace despus:
var numero=0;
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 71 of 328.
70
DHTML
while (numero==1) {
alert('Soy un while');
}
do {
alert('Soy un do...while');
} while (numero==1);
En este caso solo veramos aparecer una ventana diciendo que es un
var numero = 4;
for (n = 2, factorial = 1; n <= numero; n++)
factorial *= n;
Por ltimo, hay que decir que la ejecucin de la sentencia break dentro de
cualquier parte del bucle provoca la salida inmediata del mismo. Aunque a
veces no hay ms remedio que utilizarlo, es mejor evitarlo para mejorar la
legibilidad y elegancia del cdigo.
http://alexyniorlls.blogspot.com 72 of 328.
71
DHTML
Este ejemplo sumara dos a todos los elementos del vector. Sin embargo,
conviene tener cuidado ya que, de los navegadores de Microsoft, slo la
versin 5 lo soporta.
La otra estructura es with, que nos permitir una mayor comodidad cuando
tengamos que tratar con muyas propiedades de un mismo objeto. En lugar
de tener que referirnos a todas ellas con un objeto.propiedad podemos
hacer:
with (objeto) {
propiedad1 = ...
propiedad2 = ...
...
}
Objetos
Un objeto es una estructura que contiene tanto variables (llamadas
propiedades) como las funciones que manipulan dichas variables (llamadas
mtodos).
A partir de esta estructura se ha creado un nuevo modelo de programacin
(la programacin orientada a objetos) que atribuye a los objetos propiedades
como herencia o polimorfismo.
Como veremos, JavaScript simplifica en algo este modelo.
Creacin mediante constructores
Un constructor es una funcin que inicializa un objeto. Cuando creamos un
objeto nuevo del tipo que sea, lo que hacemos en realidad es llamar al
constructor pasndole argumentos. Por ejemplo, si creamos un objeto Array
de esta manera:
vector = new Array(9);
En realidad, estamos llamando a un constructor llamado Array que admite
un parmetro. Sera algo as:
function Array(longitud) {
...
}
Vamos a crear nuestro primero objeto. Supongamos que queremos codificar
en Javascript una aplicacin que lleve nuestra biblioteca de libros tcnicos
de Informtica. Para lograrlo, crearemos un objeto Libro que guarde toda la
informacin de cada libro. Este sera el constructor:
http://alexyniorlls.blogspot.com 73 of 328.
72
DHTML
Como vemos, accederemos a las propiedades y mtodos de nuestros
objetos por medio de la referencia this. Ahora podemos crear y acceder a
nuestros objetos tipo Libro:
miLibro = new
"JavaScript");
Libro("JavaScript
Bible",
"Danny
Goodman",
alert(miLibro.autor);
Los mtodos tambin podemos incluirlos de la siguiente forma:
function escribirLibro() {
alert("El libro " + this.titulo + " de " + this.autor +
" trata sobre " + this.tema);
}
Para incluirlo en nuestro objeto aadimos la siguiente lnea a nuestra funcin
constructora:
this.escribir = escribirLibro;
Y podremos acceder al mismo de la manera normal:
miLibro.escribir();
Objetos predefinidos
JavaScript dispone de varios objetos predefinidos para acceder a muchas de
las funciones normales de cualquier lenguaje, como puede ser el manejo de
vectores o el de fechas. En algunos casos estaremos tratando con objetos
aunque no nos demos cuenta, ya que los usos ms habituales de los
mismos disponen de abreviaturas que esconden el hecho de que sean
objetos.
a) Objeto Array
Como dijimos antes, este objeto permite crear vectores. Se inicializa de
cualquiera de las siguientes maneras:
http://alexyniorlls.blogspot.com 74 of 328.
73
DHTML
concat(vector2): Aade los elementos de vector2 al final de los del vector
que invoca el mtodo, devolviendo el resultado. No funciona en Explorer 3 y
no forma parte del estndar ECMA.
sort(funcionComparacion):
Ordena
los
elementos
del
vector
alfabticamente. Si se aade una funcin de comparacin como parmetro
los ordenar utilizando sta. Dicha funcin debe aceptar dos parmetros y
devolver 0 si son iguales, menor que cero si el primer parmetro es menor
que el segundo y mayor que cero si es al revs.
function compararEnteros(a,b) {
return a<b ? -1 : (a==b ? 0 : 1);
}
Usando esta funcin ordenara numricamente (y de menor a mayor) los
elementos del vector.
b) Objeto Date
Este objeto nos permitir manejar fechas y horas. Se invoca as:
getTime()
setTime(milisegundos)
Obtienen y ponen, respectivamente, la fecha y la hora tomados como
milisegundos transcurridos desde el 1 de enero de 1970.
getYear()
setYear(ao)
Obtienen y poner, respectivamente, el ao de la fecha. ste se devuelven
como nmeros de 4 dgitos excepto en el caso en que estn entre 1900 y
1999, en cuyo caso se devolvern las dos ltimas cifras. Hay que tener
cuidado, ya que la implementacin de stos mtodos puede variar en las
ltimas versiones de Netscape.
getFullYear()
setFullYear(ao)
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 75 of 328.
74
DHTML
Realizan la misma funcin que los anteriores, pero sin tantos los, ya que
siempre devuelven nmeros con todos sus dgitos. Funciona en Explorer 4 y
Netscape 4.06 y superiores.
getMonth()
setMonth(mes)
getDate()
setDate(dia)
getHours()
setHours(horas)
getMinutes()
setMinutes(minutos)
getSeconds()
setSeconds(segundos)
Obtienen y ponen, respectivamente, el mes, da, hora, minuto y segundo de
la fecha, tambin respectivamente, respectivamente hablando.
getDay()
Devuelve el da de la semana de la fecha en forma de nmero que va del 0
(domingo) al 6 (sbado).
c) Objeto Math
Este objeto no est construido para que tengamos nuestras variables Math,
sino como un contenedor donde meter diversas constantes (como Math.E y
Math.PI) y los siguientes mtodos matemticos:
Tabla 9.
Mtodo
Descripcin
Expresin
ejemplo
abs
Valor absoluto
Math.abs(-2)
Funciones
sin, cos,
reciben el
tan
radianes
de Resultado
del ejemplo
2
trigonomtricas,
argumento en Math.cos(Math.PI) -1
asin,
acos,
atan
Funciones
inversas
exp, log
Exponenciacin
base E
ceil
Devuelve
el
entero
ms
pequeo mayor o igual al Math.ceil(-2.7)
argumento
-2
floor
-3
trigonomtricas
y
logaritmo,
Math.asin(1)
1.57
Math.log(Math.E)
http://alexyniorlls.blogspot.com 76 of 328.
75
DHTML
round
Devuelve
el
entero
ms
Math.round(-2.7)
cercano o igual al argumento
-3
min, max
pow
Exponenciacin,
siendo
el
primer argumento la base y el Math.pow(2,4)
segundo el exponente
16
sqrt
Raz cuadrada
Math.sqrt(4)
d) Objeto Number
Al igual que en el caso anterior, no se pueden crear objetos de tipo
Number, sino que debemos referirnos al genrico. Este objeto contiene
como propiedades los siguientes valores numricos.
Tabla 10.
Propiedad
Descripcin
NaN
MAX_VALUE y MIN_VALUE
NEGATIVE_INFINITIVE
POSITIVE_INFINITIVE
e) Objeto String
Al crear una cadena estamos creando a la vez un objeto String asociado.
Su utilidad est en sus mtodos, entre los que cabe destacar:
charAt(pos) y charCodeAt(pos)
Devuelven el caracter o el cdigo numrico del carcter que est en la
posicin indicada de la cadena.
indexOf(subcadena)
Devuelven la posicin de la subcadena dentro de la cadena, o -1 en caso de
no estar.
split(separador)
Devuelven un vector con subcadenas obtenidas separando la cadena por el
carcter separador. No funciona en Explorer 3.
cadena = "Navidad,Semana Santa,Verano";
vector = cadena.split(",");
En el ejemplo, el vector tendr tres elementos con cada una de las
vacaciones de un escolar espaol normal.
concat(cadena2)
Devuelve el resultado de concatenar cadena2 al final de la cadena. No
funciona en Explorer 3 y no forma parte del estndar ECMA.
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 77 of 328.
76
DHTML
substr(indice,longitud) y substring(indice1, indice2)
Devuelven una subcadena de la cadena, ya sea cogiendo un nmero de
caracteres a partir de un ndice o pillando todos los caracteres entre dos
ndices.
toLowerCase()y toUpperCase()
Transforman la cadena a minsculas y maysculas, respectivamente.
Eventos
Un evento, como su mismo nombre indica, es algo que ocurre. Para que una
rutina nuestra se ejecute slo cuando suceda algo extrao deberemos
llamarla desde un controlador de eventos. Estos controladores se asocian a
un elemento HTML y se incluyen as:
<A HREF="http://home.netscape.com" onMouseOver="MiFuncion()">
Lista de eventos
Aqu tienes una pequea gua de eventos definidos en JavaScript.
Tabla 11.
Eventos de JavaScript
Evento
Descripcin
OnLoad
OnUnLoad
Salir
de
una
(descargarla)
pgina
<BODY...><FRAMESET...>
<A
<AREA...>
HREF..>
onMouseOut
HREF..>
onSubmit
Enviar un formulario
<FORM...>
onClick
Pulsar un elemento
onBlur
Perder el cursor
<INPUT
<TEXTAREA...>
TYPE="text"...>
OnChange
TYPE="text"...>
OnFocus
Conseguir el cursor
<INPUT
<TEXTAREA...>
TYPE="text"...>
OnSelect
Seleccionar texto
<INPUT
<TEXTAREA...>
TYPE="text"...>
http://alexyniorlls.blogspot.com 78 of 328.
77
DHTML
impidiendo, de paso, que quien est viendo la pgina pueda hacer uso del
mismo).
Ejemplo 22:
Eventos
eventos.html
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- Los comentarios esconden el cdigo a navegadores sin JavaScript
function Alarma() {
alert("Se activo la funcin Alarma");
return true;
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<A HREF="eventos.html" onMouseOver="Alarma()">
Pasa por aqu encima
</A>
</BODY>
</HTML>
Resultado Web:
http://alexyniorlls.blogspot.com 79 of 328.
78
DHTML
load1.html
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- Los comentarios ocultan el cdigo a browsers sin JScript
function Saludo() {
alert("Hola");
}
// -->
</SCRIPT>
</HEAD>
<BODY onLoad="Saludo()">
...
</BODY>
</HTML>
http://alexyniorlls.blogspot.com 80 of 328.
79
DHTML
http://alexyniorlls.blogspot.com 81 of 328.
80
DHTML
Objeto Window
Es el objeto principal. Define la ventana sobre la que estamos trabajando e
incluye los objetos referentes a la barra de tareas, el documento o la
secuencia de direcciones de la ltima sesin. En este captulo veremos los
mtodos y propiedades ms utilizadas, al menos por m, dejando el estudio
de dichos objetos para sus captulos correspondientes.
An cuando el objeto se llame Window, disponemos siempre de una
referencia a l llamada window (recuerde que Javascript distingue entre
maysculas y minsculas). Ser con esa referencia con la que trabajemos.
Por ltimo, indicar que en Javascript, se supone que todas las propiedades y
mtodos que llamamos sin utilizar ninguna referencia, en realidad se hacen
utilizando esa referencia window. As, por ejemplo, cuando ejecutamos el
mtodo alert en realidad lo que estamos haciendo es ejecutar el mtodo
window.alert.
[Variable=][window.]open(URL, nombre, propiedades)
Permite crear (y abrir) una nueva ventana. Si queremos tener acceso a ella
desde la ventana donde la creamos deberemos asignarle una variable, si no
simplemente invocamos el mtodo: el navegador automticamente sabr
que pertenece al objeto window. El parmetro URL es una cadena que
contendr la direccin de la ventana que estamos abriendo: si est en
blanco, la ventana se abrir con una pgina en blanco. El nombre ser el
que queramos que se utilice como parmetro de un TARGET y las
propiedades son una lista separada por comas de algunos de los
siguientes elementos:
toolbar[=yes|no]
location[=yes|no]
directories[=yes|no]
status[=yes|no]
menubar[=yes|no]
scrollbars[=yes|no]
resizable[=yes|no]
width=pixels
height=pixels
Debemos tener cuidado con las propiedades que modifiquemos, es posible
que algunas combinaciones de los mismos no funcionen en todos los
navegadores. El Explorer 4, por ejemplo, da error ante la combinacin
toolbar=no, directories=no, menubar=no. Veamos un ejemplo:
Ejemplo 24:
Funcin open()
ventanas.html
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 82 of 328.
81
DHTML
function AbrirVentana() {
MiVentana=open("","ventana2","toolbar=no,directories=no,menubar=no,status=yes");
MiVentana.document.write("<HEAD><TITLE>Una
nueva
ventana</TITLE></HEAD>");
MiVentana.document.write("<CENTER><H1><B>Texto
de
prueba</B></H1></CENTER>");
}
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<INPUT TYPE="button" NAME="Boton1" VALUE="Abrir otra ventana"
onClick="AbrirVentana()">
</FORM>
</BODY>
</HTML>
Este ejemplo muestra la posibilidad de abrir nuevas ventanas de nuestro
navegador con JavaScript. Se llama a la funcin AbrirVentana desde el
evento onClick, como ya sabemos hacer desde el primer ejemplo. Esta
funcin crea la nueva ventana MiVentana y escribe en ella por medio del
objeto Document todo el cdigo HTML de la pgina.
Resultado Web:
http://alexyniorlls.blogspot.com 83 of 328.
82
DHTML
http://alexyniorlls.blogspot.com 84 of 328.
83
DHTML
Define la cadena de caracteres que saldr por defecto en la barra de estado.
Cuando no la especificamos, defaultStatus ser igual al ltimo valor que
tom status.
setTimeout("funcin",tiempo)
Llama a funcin cuando hayan
Objeto Document
Este objeto representa el documento HTML en el que estamos. Se accede a
l por medio de la referencia document. Su mayor importancia viene por el
nmero de vectores que posee, que referencian a objetos Image, Form o
Link, los cuales permiten acceder a las imgenes, formularios y enlaces del
documento, respectivamente.
lastModified
Contiene la fecha y hora en que se modific el documento por ltima vez y
se suele usar en conjuncin con write para aadir al final del documento
estas caractersticas.
bgColor
Modifica el color de fondo del documento. El color deber estar en el formato
usado en HTML. Es decir, puede ser red o FF0000.
forms[]
Vector que contiene los formularios del documento. El primero ser el
nmero 0, el segundo el 1, etc..
images[]
Vector que contiene las imgenes del documento. Se ordenan igual que en
el anterior caso, aunque tambin permiten ser accedidas con el nombre
como ndice. Es decir, a una imagen definida como <IMG SRC=".."
NAME="miImagen">
se
puede
acceder
con
document.inages["miImagen"].
links[]
Vector que contiene los enlaces del documento. Se ordenan igual que en los
dos anterioers, aunque no se suele utilizar en el cdigo Javascript. Su razn
de ser es que, al ser los enlaces objetos, permiten incluir cdigo Javascript
en ellos por medio de la pseudo-URL javascript:codigo.
write(cadena) y writeln(cadena)
Escribe el cdigo HTML indicado en cadena en nuestro documento HTML.
writeln hace lo mismo, pero incluyendo al final un retorno de carro.
close()
Cierra el documento, impidiendo escribir de nuevo en l.
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 85 of 328.
84
DHTML
Cmo escribir en el documento
A la hora de escribir en un documento por medio de write o writeln hay
que tener en cuenta un hecho fundamental. Para poder escribir en un
documento, ste debe estar abierto y, al abrirlo, se destruye todo el
cdigo que haya en l.
Ejemplo 25:
escribir.html
<HTML>
<HEAD>
<TITLE>Escribe y no sobreescribe</TITLE>
</HEAD>
<BODY>
Esta página fue modificada por ltima vez el da
<script language="JavaScript" type="text/javascript">
document.write(document.lastModified);
</SCRIPT>
</BODY>
</HTML>
Resultado Web:
Objeto Form
Los formularios siempre han sido la mejor manera de facilitar la
comunicacin entre los usuarios y los creadores de una Web. Sin embargo,
la implementacin de los mismos en el lenguaje HTML ha provocado ciertos
problemas debido a sus carencias. Estos problemas han intentado
solventarse con scripts, situados tanto en el servidor como en el navegador.
Los programas que se ejecutan en el navegador suelen estar escritos en
JavaScript, y realizan tareas simples de validacin. En muchas ocasiones
estn combinados con scripts CGI que modifican el mensaje generado por
un formulario para facilitar su lectura y manejo.
http://alexyniorlls.blogspot.com 86 of 328.
85
DHTML
El vector document.forms contiene todos los formularios de un
documento. As, se accedera al primer formulario definido como
document.forms[0]. Sin embargo, si usamos el parmetro NAME en la
etiqueta HTML:
<FORM NAME="miFormulario">
Entonces podremos acceder al formulario con document.miFormulario,
que resulta bastante ms cmodo y estable ante la posibilidad de variacin
del nmero y posicin de formularios en el documento. Estos son los
mtodos y propiedades del objeto Form:
submit()
Enva el formulario.
reset()
Devuelve los valores de un formulario a su estado inicial.
elements[]
Contiene todos y cada uno de los elementos de los que consta el formulario,
es decir, los botones, cajas de textos, listas desplegables, etc. que
componen un formulario. Cada elemento puede ser un objeto distinto, por lo
que deberemos averiguar de qu tipo son por medio de la propiedad comn
type.
Objetos Text
Cuatro elementos HTML distintos (text, textarea, password y hidden) son,
desde el punto de vista del DOM, objetos tan parecidos entre s que vamos a
estudiarlos conjuntamente. En realidad, slo tienen tres propiedades
verdaderamente importantes: name, type y value.
Los mtodos que podemos utilizar en estos objetos son:
blur(). Pierde el foco del ratn sobre el objeto especificado.
focus(). Obtiene el foco del ratn sobre el objeto especificado.
select(). Selecciona el texto dentro del objeto dado.
Como ejemplo de su uso, vamos a ver ahora el cdigo de nuestro primer
formulario con validacin, que comprueba si la direccin de correo
electrnico que introduce el usuario es correcta:
formularios.html
<HTML>
<HEAD>
<TITLE>Ejemplo de formularios</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function validar(direccion) {
if (direccion.indexOf("@") != -1)
return true;
else {
alert('Debe escribir una direccin vlida');
Oscar E Capuay Uceda
http://alexyniorlls.blogspot.com 87 of 328.
86
DHTML
return false;
}
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form1" METHOD="POST" ACTION="mailto:[email protected]"
ENCTYPE="text/plain" onSubmit="return validar(this.email.value)">
Envíame tu e-mail: <INPUT NAME="email" TYPE="text"><BR>
<INPUT TYPE="submit" VALUE="Enviame tu e-mail">
</FORM>
</BODY>
</HTML>
Resultado Web
http://alexyniorlls.blogspot.com 88 of 328.
87
DHTML
El cdigo es sencillo: el cdigo llamado por el controlador de evento
onSubmit debe devolver false si deseamos que el formulario no sea
enviado. As pues, llamamos a la funcin que comprueba si hay alguna
arroba en el campo email del formulario.
La manera de llamar a esta funcin es quizs lo ms complicado. La funcin
validar recibe una cadena de caracteres, devolviendo verdadero o falso
dependiendo de que haya o no una arroba dentro de ella. El controlador
utiliza para llamar a esta funcin lo siguiente:
this.email.value
http://alexyniorlls.blogspot.com 89 of 328.
88
DHTML
evento onChange (que se ejecuta cuando el usuario cambia la opcin
escogida en la lista) que llamar a una rutina que explicamos ms adelante:
Ejemplo 26:
select.html
<HTML>
<HEAD>
<TITLE>Ejemplo de Select</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function irA(menu){
window.location.href = menu.options[menu.selectedIndex].value;
}
</SCRIPT>
</HEAD>
<BODY>
<FORM name="formulario">
<SELECT NAME="menu" SIZE=1 onChange ="irA(this)">
<OPTION VALUE="">Visitar
<OPTION VALUE="http://www.w3c.org">W3C
<OPTION VALUE="http://www.capunay.com">Capunay
<OPTION VALUE="http://www.google.com.pe">Google
</SELECT>
</FORM>
</BODY>
</HTML>
La funcin irA simplemente utiliza la opcin elegida para obtener por medio
de su valor la direccin de la pgina a la que debe acudir.
Resultado Web:
http://alexyniorlls.blogspot.com 90 of 328.
89
DHTML
Otros objetos
El modelo de objetos del documento define varios objetos, por as decirlo,
"menores", que no tienen relacin con nada fsico de la pgina en la que
estamos. Es decir, no guardan relacin con las etiquetas HTML que estn en
ellas escritas.
Objeto History
Se accede a este objeto por medio de la referencia document.history y
contiene todas las direcciones que se han visitado en la sesin actual.
Aunque no permite acceder a ellas, dispone de varios mtodos para sustituir
el documento actual por alguno que el usuario ya haya visitado:
back()
Volver a la pgina anterior. Es muy sencillo de utilizar:
<A HREF="javascript:window.history.back()">
forward()
Ir a la pgina siguiente.
go(donde)
Ir a donde se indique, siendo donde un nmero tal que go(1)=forward()
y go(-1)=back().
Objeto Location
Se accede a este objeto por medio de la referencia document.location y
contiene informacin sobre la direccin de la pgina actual en varias
propiedades.
href
Permite el acceso a la direccin de la pgina actual. Si lo cambiamos, pues
cambiaremos de pgina.
protocol
Protocolo de la pgina actual. Habitualmente http.
host
Mquina donde se alberga la pgina actual.
pathname
Camino de la pgina actual.
hash
Si hemos accedido a una pgina por medio de un ancla, contiene una
almohadilla seguida de ese ancla. Por ejemplo, #location.
search
http://alexyniorlls.blogspot.com 91 of 328.
90
DHTML
Puede que hallas notado que muchas pginas (especialmente en los
motores de bsqueda) tienen unas direcciones inmensas con una estructura
como: pagina.php?busq=HTML+en+espanol&tipo=Y. Esta propiedad
permite acceder a esa ltima parte de la direccin (a partir de la
interrogacin, inclusive). Puede ser til para pasar parmetros de una pgina
a otra.
Objeto Navigator
Se accede a l por medio de la referencia navigator y nos permite
averiguar varias caractersticas del navegador que usamos. Por ejemplo:
appName
Nombre del navegador.
appVer
Nmero principal de versin.
language
Idioma del mismo.
platform
Plataforma donde esta ejecutndose.
No podemos sobreescribir estos atributos, pero s leerlos.
Objeto Screen
Como caba esperarse, se puede acceder a este objeto por medio de la
referencia screen. Nos permitir conocer la configuracin de la pantalla del
usuario. Al igual que en el anterior objeto, todos sus atributos son de slo
lectura. Conviene indicar que este objeto slo est disponible desde las
versiones 4.0 de ambos navegadores.
height :Altura de la resolucin de la pantalla.
width :Anchura de la resolucin de la pantalla.
pixelDepth :Nmero de bits por pixel.
Ejemplo:
if (window.screen)
texto=screen.width + "x" + screen.height + "x" + Math.pow(2,screen.colorDepth) + "
colores.";
else
texto="quien sabe cuantos colores, necesito que tengas Communicator o IE4 para
averiguarlo.";
document.write(texto);
Puede verse que antes de acceder al objeto, investigo si ste existe,
mostrando un mensaje de circunstancias en caso de que no sea as.
http://alexyniorlls.blogspot.com 92 of 328.
91
DHTML
Ficheros .js
Un fichero .js es un archivo donde podremos guardar funciones y variables
globales que podrn leerse desde cualquier pgina HTML. Gracias a ellos
podremos evitar el tener que duplicar funciones que se necesiten en ms de
un documento. Podremos incorporarlos a nuestras pginas de esta manera:
Ejemplo 27:
Uso de archivos js
externo.html
<HTML>
<HEAD>
<TITLE>Mi Pgina</TITLE>
<SCRIPT LANGUAGE="Javascript" SRC="funciones.js">
<!-alert('Error con el fichero js');
// -->
</SCRIPT>
</HEAD>
<BODY>
Lo que sea.
</BODY>
</HTML>
El cdigo que incluyamos entre un <SCRIPT SRC> y un </SCRIPT> slo se
ejecutar en caso de que la lectura del fichero .js falle. Por otra parte, hay
que indicar que el fichero en cuestin contendr slo cdigo en Javascript,
no etiquetas HTML de ningn tipo, ni siquiera las de apertura y cierre de
SCRIPT.
http://alexyniorlls.blogspot.com 93 of 328.
92
DHTML
http://alexyniorlls.blogspot.com 94 of 328.
93
DHTML
Aqu Mostraremos cun fcil puede ser disear unas simples hojas de estilo.
Para esta gua, necesitar saber un poco del cdigo HTML y alguna
terminologa bsica de composicin grfica. Comenzamos con un pequeo
documento HTML:
Ejemplo 28:
HTML y CSS
http://alexyniorlls.blogspot.com 95 of 328.
94
DHTML
<HTML>
<HEAD>
<TITLE>La Web de OscarCap</TITLE>
</HEAD>
<BODY>
<H1>La Web de OscarCap</H1>
<P>Esta página le ayudará a diseñar páginas Web.
</BODY>
</HTML>
Para establecer el color azul para el texto de los elementos H1, puede
escribir la siguiente regla CSS:
H1 { color: blue }
Una regla CSS consta de dos partes principales: un selector ('H1') y una
declaracin ('color: blue'). La declaracin tiene dos partes: una propiedad
('color') y un valor ('blue').
La especificacin HTML 4.0 define de qu manera las reglas de las hojas de
estilo pueden especificarse para los documentos HTML: ya sea dentro del
documento HTML o a travs de una hoja de estilo externa. Para poner la
hoja de estilo dentro del documento, use el elemento STYLE:
Ejemplo 29:
Style
http://alexyniorlls.blogspot.com 96 of 328.
95
DHTML
</BODY>
</HTML>
El elemento LINK especifica:
el tipo de vnculo: a una hoja de estilo ("stylesheet").
la ubicacin de la hoja de estilo a travs del atributo "href".
el tipo de hoja de estilo que se vincula: "text/css".
Para mostrar la ntima relacin entre una hoja de estilo y el sistema
estructurado de marcas, continuamos usando el elemento STYLE en esta
gua. Agreguemos ms colores:
Ejemplo 30:
http://alexyniorlls.blogspot.com 97 of 328.
96
DHTML
<H1>La Web de OscarCap</H1>
<P> Esta página Web te enseñará mucho.
</BODY>
</HTML>
Lo primero que se puede observar es que varias declaraciones se agrupan
en un bloque encerrado por llaves ({...}) y separado por un punto y coma, no
obstante la ltima declaracin tambin debe estar seguida por un punto y
coma.
La primera declaracin en el elemento BODY establece la familia de fuentes
"Gill Sans". Si esa fuente no est disponible, el navegador del usuario usar
la familia 'sans-serif' que es una de las cinco familias de fuentes genricas
que todas las aplicaciones del usuario reconocen. Los elementos hijos de
BODY heredarn el valor de la propiedad 'font-family'.
La segunda declaracin establece el tamao de la fuente del elemento
BODY en 12 puntos. La unidad de medida "punto" es normalmente usada en
la tipografa impresa para indicar el tamao de la fuente y otras dimensiones.
Es un ejemplo de unidad de medida absoluta que no vara segn el entorno.
La tercera declaracin usa una unidad de medida relativa que vara de
acuerdo a las circunstancias. La unidad "eme" est relacionada con el
tamao de la fuente del elemento. En este caso el resultado es que el
margen alrededor del elemento BODY es tres veces mayor que el tamao de
la fuente.
Comando
Definicin
IDENT
ATKEYWORD
STRING
{ident}
@{ident}
Comando CSS
{string}
http://alexyniorlls.blogspot.com 98 of 328.
97
DHTML
Comando
HASH
NUMBER
PERCENTAGE
DIMENSION
URI
UNICODERANGE
CDO
CDC
;
{
}
(
)
[
]
S
COMMENT
FUNCTION
INCLUDES
DASHMATCH
Definicin
#{name}
{num}
{num}%
{num}{ident}
url\({w}{string}{w}\)
|url\({w}([!#$%&*~]|{nonascii}|{escape})*{w}\)
U\+[0-9A-F?]{1,6}(-[0-9A-F]{1,6})?
<!--->
;
\{
\}
\(
\)
\[
\]
[ \t\r\n\f]+
\/\*[^*]*\*+([^/][^*]*\*+)*\/
{ident}\(
~=
|=
cualquier otro carcter no equivalente con las reglas
anteriores
DELIM
Las macros entre llaves ({}) arriba son definidas como sigue:
Tabla 13.
Macros CSS
Macro
Definicin
Ident
name
nmstart
nonascii
unicode
escape
{nmstart}{nmchar}*
{nmchar}+
[a-zA-Z]|{nonascii}|{escape}
[^\0-\177]
\\[0-9a-f]{1,6}[ \n\r\t\f]?
{unicode}|\\[ -~\200-\4177777]
nmchar [a-zA-Z0-9]|{nonascii}|{escape}
[0-9]+|[0-9]*\.[0-9]+
num
{string1}|{string2}
string
http://alexyniorlls.blogspot.com 99 of 328.
98
DHTML
Macro Definicin
string1 \"([\t !#$%&(-~]|\\{nl}|\'|{nonascii}|{escape})*\"
string2 \'([\t !#$%&(-~]|\\{nl}|\"|{nonascii}|{escape})*\'
\n|\r\n|\r|\f
nl
[ \t\r\n\f]*
w
Abajo est la sintaxis central para CSS. Las secciones siguientes describen
cmo usarla.
Tabla 14.
hoja de estilo
estamento
regla-arroba
bloque
regla
selector
declaracin
propiedad
valor
otros
Secciones CSS
Palabras clave
Las palabras clave toman la forma de identificadores. Las palabras clave no
deben ir entre comillas ("..." o '...'). De este modo, red es una palabra clave,
pero "red" no lo es. (Es una cadena.)
Otros ejemplos ilcitos:
width: "auto";
border: "none";
font-family: "serif";
background: "red";
99
III.
Para iniciar debemos conocer algunos conceptos bsicos, para ello nos
haremos una pregunta:
Que es PHP?
PHP (acrnimo de "PHP: Hypertext Preprocessor") es un lenguaje de
"cdigo abierto" interpretado, de alto nivel, embebido en pginas HTML y
ejecutado en el servidor [1]. Este lenguaje se caracteriza porque solo es
interpretado pero no compilado, y es embebido en el cdigo HTML, lo que le
da una alto rendimiento y potencia.
A diferencia de otros lenguajes script como JavaScript, PHP es un lenguaje
script que se ejecuta en el servidor Web, de tal manera que, solamente el
resultado de su ejecucin es enviado al cliente Web (navegador). Tomando
en cuenta lo escrito anteriormente podemos decir que, el cdigo fuente
escrito en PHP no aparecer en el cdigo fuente de la pgina Web que
muestra el navegador.
Viendo el lenguaje desde el punto de vista del programador podemos decir
que es un lenguaje con una sintaxis similar a C; se puede usar en tres
campos: el primero - el mas tradicional - es en los scripts del lado del
servidor, el segundo es la ejecucin de scripts en la lnea de comandos del
sistema operativo (Linux o Windows); y el tercero en el desarrollo de
aplicaciones de interfaz grfica con PHP-GTK.
Variables
Las variables en PHP pueden almacenar datos de diferentes tipos, sin
necesidad de ser declaradas previamente. La sintaxis para el uso de
variables esta definido por el siguiente modelo: $var , es decir, toda variable
debe iniciar con el smbolo de dlar ($) y luego se escribe el nombre de la
variable.
Por ejemplo para hacer referencia a la variable edad se escribe $edad.
Constantes
Se puede definir una constante usando la funcin define(). Una vez definida,
no puede ser modificada ni eliminada.
Para obtener el valor de una constante solo es necesario especificar su
nombre. A diferencia de las variables, no se tiene que especificar el prefijo $.
Estas son las diferencias entre constantes y variables:
101
Definicin de constantes
<?php
define("CONSTANT", "Desarrollo Web.");
echo CONSTANT; // imprime "Desarrollo Web"
?>
Tipos de datos
PHP soporta ocho tipos primitivos. Cuatro tipos escalares: bolean
Integer, float (nmero de punto-flotante, tambin conocido como 'double'),
string Dos tipos compuestos: array, object Y finalmente dos tipos especiales:
resource y NULL.
Expresiones
Las expresiones son la piedra angular de PHP. En PHP, casi cualquier cosa
que escribes es una expresin. La forma ms simple y ajustada de definir
una expresin es "cualquier cosa que tiene un valor".
Las formas ms bsicas de expresiones son las constantes y las variables.
Cuando escribes "$a = 5", ests asignando '5' a $a. '5', obviamente, tiene el
valor 5 , en otras palabras '5' es una expresin con el valor 5 (en este caso,
'5' es una constante entera).
Las funciones son un ejemplo algo ms complejo de expresiones.
Ejemplo 32:
<?php
function foo () {
return 5;
}
?>
Suponiendo que ests familiarizado con el concepto de funciones, asumirs
que escribir $c = foo() es esencialmente lo mismo que escribir $c = 5, y has
acertado. Las funciones son expresiones que valen el valor que retornan.
Como foo() devuelve 5, el valor de la expresin 'foo()' es 5. Normalmente las
funciones no devuelven un valor fijo, sino que suele ser calculado.
Desde luego, los valores en PHP no se limitan a enteros, y lo ms normal es
que no lo sean. PHP soporta tres tipos escalares: enteros, punto flotante y
cadenas (los tipos escalares son aquellos cuyos valores no pueden 'dividirse'
en partes menores, no como los arrays, por ejemplo). PHP tambin soporta
dos tipos compuestos (no escalares): arrays y objetos. Se puede asignar
cada uno de estos tipos de valor a variables o bien retornarse de funciones,
sin ningn tipo de limitacin.
102
103
Operadores
Un operador es algo a lo recibe uno o ms valores y produce otro valor.
Existen tres tipos de operadores:
El operador unario, el cual opera sobre un nico valor, por ejemplo: !
(operador de negacin) o ++ (operador de incremento).
Segundo, los operadores binarios; este grupo contiene la mayora de
operadores que soporta PHP.
Y el 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 ejecucin. Rodear las expresiones ternarias con parntesis es una
muy buena idea. [4]
Existen varios tipos de operadores, a continuacin veremos algunas clases:
104
Operadores de Aritmtica
Tabla 15.
Ejemplo
-$a
$a + $b
$a - $b
$a * $b
$a / $b
$a % $b
Operador
Negacin
Adicin
Substraccin
Multiplicacin
Divisin
Mdulo
Resultado
El opuesto de $a
Suma de $a y $b.
Diferencia entre $a y $b.
Producto de $a y $b.
Cociente de $a y $b.
Resto de $a dividido por $b.
Operadores de Asignacin
El operador bsico de asignacin es "=". A primera vista, usted podra
pensar en l como "es igual a". No lo haga. Lo que quiere decir en realidad
es que el operando de la izquierda recibe el valor de la expresin a la
derecha (es decir, "se define a").
El valor de una expresin de asignacin es el valor que se asigna. Es decir,
el valor de "$a = 3" es 3.
Ejemplo 33:
Operador de asignacin
<?php
$a = ($b = 4) + 5; // $a es igual a 9 ahora, y $b ha sido definido a 4.
?>
En conjunto con el operador bsico de asignacin, existen "operadores
combinados" para todos los operadores de aritmtica binaria, unin de
matrices y de cadenas, que le permiten usar un valor en una expresin y
luego definir su valor como el resultado de esa expresin.
Ejemplo 34:
<?php
$a = 3;
$a += 5; // define $a como 8, como si hubisemos dicho: $a = $a + 5;
$b = "Hola ";
$b .= "a todos!"; // (Ojo con el punto . Despus de la variable $b) define $b
como "Hola a todos!", tal como $b = $b . "a todos!";
?>
Note que la asignacin copia la variable original en la nueva (asignacin por
valor), de modo que cualquier cambio a una no afecta a la otra. Esto puede
resultar de importancia si necesita copiar algo como una matriz de gran
Oscar E Capuay Uceda
105
Operadores de Comparacin
Estos operadores permiten comparar dos valores y son los siguientes:
Tabla 16.
Ejemplo
$a == $b
$a === $b
Operador
Igual
Idntico
$a != $b
$a <> $b
$a !== $b
Diferente
Diferente
No idnticos
$a < $b
Menor que
$a > $b
Mayor que
$a <= $b
Menor o igual
que
Mayor o igual
que
$a >= $b
Resultado
TRUE si $a es igual a $b.
TRUE si $a es igual a $b, y son del
mismo tipo.
TRUE si $a no es igual a $b.
TRUE si $a no es igual a $b.
TRUE si $a no es igual a $b, o si no
son del mismo tipo.
TRUE si $a es estrictamente menor
que $b.
TRUE si $a es estrictamente mayor
que $b.
TRUE si $a es menor o igual que $b.
TRUE si $a es mayor o igual que $b.
Operador ternario
<?php
Oscar E Capuay Uceda
106
<?php
// a primera vista, lo siguiente parece imprimir 'true'
echo (true?'true':false?'t':'f');
// sin embargo, la salida real de la lnea anterior es 't'
// esto se debe a que las expresiones ternarias
// son evaluadas de izquierda a derecha
// la siguiente es una versin ms obvia del cdigo
// presentado anteriormente
echo ((true ? 'true' : 'false') ? 't' : 'f');
// aqu puede ver que la primera expresin
// es evaluada como 'true', la cual
// en su lugar evala a (bool)true, devolviendo por lo tanto
// la rama de verdad de la segunda expresin ternaria.
?>
107
Control de errores
<?php
/* Error intencional de archivo */
$mi_archivo = @file ('archivo_que_no_existe') or
die ("La apertura de archivo ha fallado: el error fue '$php_errormsg'");
// esto funciona con cualquier expresin, no solo con funciones:
$valor = @$cache[$llave];
// no producir una anotacin si el ndice $llave no existe.
?>
Nota: El operador @ trabaja slo 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 sencencias include(), constantes, y as sucesivamente. No
puede usarlo sobre definiciones de funcin o clase, ni sobre estructuras
condicionales como if y foreach, y as sucesivamente.
Operadores de ejecucin
PHP soporta un operador de ejecucin: las comillas invertidas (``).
PHP ejecuta el contenido entre las comillas como si se tratara de un
comando del intrprete de comandos; su salida ser devuelta (puede ser
asignada a una variable).El uso del operador de comillas invertidas es
idntico al de shell_exec().
Ejemplo 38:
Operador de ejecucin
<?php
$salida = `dir *.*`;
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
PHP ofrece soporte de operadores de pre- y post-incremento y decremento,
estilo lenguaje C.
Nota: Los operadores de incremento/decremento no afectan a los valores
booleanos. Decrementar valores NULL tampoco tiene efecto, aunque
incrementarlos resulta en 1.
Tabla 17.
Ejemplo
Operador
Efecto
108
Pre-incremento
$a++
Post-incremento
--$a
Pre-decremento
$a--
Post-decremento
Ejemplo 39:
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a++ . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Preincremento</h3>";
$a = 5;
echo "Debe ser 6: " . ++$a . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a-- . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debe ser 4: " . --$a . "<br />\n";
echo "Debe ser 4: " . $a . "<br />\n";
?>
Note como se trabaja los incrementos y decrementos sobre variables de
caracter.
Ejemplo 40:
operadores_i.php
<?php
$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
Resultado Web:
109
Operadores de Lgica
Tabla 18.
Ejemplo
$a and $b
$a && $b
$a or $b
$a || $b
$a xor $b
! $a
Operadores lgicos
Operador
Y
Resultado
TRUE si tanto $a como $b son TRUE.
O exclusivo
(Xor)
Negacin
La razn para tener las dos variaciones diferentes de los operadores "and" y
"or" es que ellos operan con precedencias diferentes. Para el caso de "and":
"&&" tiene mayor precedencia que "and", analgicamente ocurre con "or".
Operadores de Cadena
Existen dos operadores para datos tipo string. El primero es el operador de
concatenacin ('.'), el cual devuelve el resultado de concatenar sus
argumentas a lado derecho e izquierdo. El segundo es el operador de
asignacin sobre concatenacin ('.='), el cual adiciona el argumento del lado
derecho al argumento en el lado izquierdo.
Ejemplo 41:
Operadores de cadena
<?php
$a = "Hola ";
$b = $a . "Mundo!"; // ahora $b contiene "Hola Mundo!"
$a = "Hola ";
$a .= "Mundo!";
?>
110
Operadores de Matrices
Tabla 19.
Ejemplo
$a + $b
$a == $b
Operador
Unin
Igualdad
$a === $b
Identidad
$a != $b
$a <> $b
$a !== $b
No-igualdad
No-igualdad
No-identidad
Operadores de matrices
Resultado
Unin de $a y $b.
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 orden y de
los mismos tipos.
TRUE si $a no es igual a $b.
TRUE si $a no es igual a $b.
TRUE si $a no es idntico a $b.
Operadores de matrices
operadores_m.php
<?php
$a = array("a" => "manzana", "b" => "banano");
$b = array("a" => "pera", "b" => "fresa", "c" => "cereza");
$c = $a + $b; // Unin de $a y $b
echo "<br>Unin de \$a y \$b: <br>";
var_dump($c);
$c = $b + $a; // Unin de $b y $a
echo "<br>Unin de \$b y \$a: <br>";
var_dump($c);
?>
Resultado Web:
111
Comparacin de matrices
comp_matrices.php
<?php
$a = array("manzana", "pltano");
$b = array(1 => "pltano", "0" => "manzana");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Resultado Web:
Operadores de Tipo
instanceof es usado para determinar si una variable PHP es una instancia
de objeto de cierta clase:
Ejemplo 44:
instanciade.php
<?php
class MiClase
{
}
class NoMiClase
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof NoMiClase);
?>
Resultado Web:
112
instanciadehe.php
<?php
class ClasePadre
{
}
class MiClase extends ClasePadre
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof ClasePadre);
?>
Resultado Web:
<?php
interface MiInterfaz
{
}
class MiClase implements MiInterfaz
{
}
Oscar E Capuay Uceda
113
<?php
interface MiInterfaz
{
}
class MiClase implements MiInterfaz
{
}
$a = new MiClase;
$b = new MiClase;
$c = 'MiClase';
$d = 'NoMiClase';
var_dump($a instanceof $b); // $b es un objeto de la clase MiClase
var_dump($a instanceof $c); // $c es una cadena 'MiClase'
var_dump($a instanceof $d); // $d es una cadena 'NoMiClase'
?>
El resultado del ejemplo sera:
bool(true)
bool(true)
bool(false)
El operador instanceof fue introducido en PHP 5. Anteriormente is_a() era
usado, pero desde entonces is_a() ha sido marcada como funcin obsoleta,
prefirindose el uso de instanceof.
114
Estructuras de Control
Si (condicional): if
Permite la ejecucin condicional de ordenes o comandos, tomando como
base el resultado de una o varias condiciones. La sentencia if en PHP tiene
la misma sintaxis bsica utilizada en el lenguaje C.
<?php
if (expresin condicional)
{
Sentencia(s) cuando la expresin es verdadera
}
?>
Ejemplo 48:
<?php
if ($a > $b)
print "a es mayor que b";
?>
El ejemplo mostrara a es mayor que b si la variable $a fuera mayor que $b.
El uso de las llaves es para la ejecucin de un conjunto de sentencias.
Ejemplo 49:
<?php
if ($a > $b) {
echo "a es mayor que b";
$mayor = $a;
$menor = $b;
}
?>
Las sentencias if se pueden anidar indefinidamente dentro de otras.
115
Estructuras de Control
Ejemplo 50:
If anidado
<?php
If ( $a > $b )
If ( $a % $c == 0 )
{
echo a es mltiplo y mayor que b;
$mayor = $a;
}
}
?>
Else
La sentencia else es un complemento de if debido que muchas veces
queremos indicar la ejecucin de sentencias en caso la expresin
condicional del if resulte falsa.
Ejemplo 51:
<?php
if ($a > $b) {
echo "a es mayor que b";
} else {
echo "a NO es mayor que b";
}
?>
elseif
Tambin se puede escribir else if (con espacio entre las palabras).
elseif es una combinacin de if y else. En caso la sentencia condicional
resulte falsa, y existan varios casos que puedan cumplirse se puede usar
elseif para cada uno de dichos casos.
Ejemplo 52:
Uso de elseif
<?php
if ($a > $b) {
echo "a es mayor que b";
} elseif ($a < $b) {
echo "a es menor que b";
} else {
echo "a es igual que b";
}
?>
Puede haber varios elseifs dentro de la misma sentencia if. La primera
expresin elseif (si hay alguna) que resulte verdadera se ejecuta. La
sentencia elseif se ejecuta slo si la expresin if precedente y cualquier
expresin elseif precedente se resulta falsa.
Oscar E Capuay Uceda
116
Estructuras de Control
for
Los bucles for son los bucles ms complejos en PHP. Su comportamiento y
sintaxis es similar a la definida en el lenguaje C.
for (expr1; expr2; expr3) sentencia
La primera expresin (expr1) se ejecuta una vez al principio del bucle.
Al comienzo de cada iteracin, se evala expr2. Si resulta verdadera, el
bucle contina y las sentencias anidadas se ejecutan. Si resulta falsa, la
ejecucin del bucle finaliza.
Al final de cada iteracin, se ejecuta expr3.
Ejemplo 53:
Imprimir los nmeros del 1 al 10 utilizando la sentencia for
<?php
for ($i = 1; $i <= 10; $i++) {
print $i;
}
while
Los bucles while son los tipos de bucle ms simples en PHP. Se comportan
como su contrapartida en C. La forma clsica de una sentencia while es:
while (expr)
{
Sentencias
}
Como con la sentencia if, se pueden agrupar multiples sentencias dentro del
mismo bucle while encerrando un grupo de sentencias con llaves, o usando
la sintaxis alternativa:
while (expr): sentencia ... endwhile;
do..while
Los bucles do..while son muy similares a los bucles while, excepto que las
condiciones se comprueban al final de cada iteracin en vez de al principio.
La principal diferencia frente a los bucles regulares while es que se garantiza
la ejecucin de la primera iteracin de un bucle do..while (la condicin se
comprueba slo al final de la iteracin), mientras que puede no ser
necesariamente ejecutada con un bucle while regular (la condicin se
comprueba al principio de cada iteracin, si esta se evala como FALSE
desde el principio la ejecucin del bucle finalizar inmediatamente).
Hay una sola sintaxis para los bucles do..while:
117
Estructuras de Control
Ejemplo 54:
<?php
$i = 0;
do {
print $i;
} while ($i>0);
?>
El bucle de arriba se ejecutara exactamente una sola vez, despus de la
primera iteracin, cuando la condicin se comprueba, se evala como
FALSE ($i no es ms grande que 0) y la ejecucin del bucle finaliza.
118
V.
Pagina01.php
<HTML>
<HEAD>
<TITLE> Primer Ejemplo PHP </TITLE>
</HEAD>
<BODY>
El siguiente código imprime Hipertext Preprocessor<BR>
<?php
echo "Hipertext Preprocessor";
?>
</BODY>
</HTML>
Cuando un cliente Web (navegador o browser) hace una solicitud a un
servidor Web, ste ubica el archivo solicitado y verifica si contiene cdigo
PHP o no, en caso que slo sea HTML, el archivo es enviado directamente
al cliente, pero en caso que tenga cdigo PHP es enviado a ser procesado el
documento que ha sido solicitado para ser procesado y luego enviar el
resultado del procesamiento al cliente. Segn el ejemplo anterior, el
documento sera enviado a ser procesado, en este proceso se interpretara
las lneas de cdigo y despus el resultado sera enviado al cliente.
A continuacin veremos el resultado de la solicitud y procesamiento de la
pgina programada anteriormente (pagina01.php).
Pagina01.php
<HTML>
<HEAD>
<TITLE> Primer Ejemplo PHP </TITLE>
</HEAD>
<BODY>
El siguiente código imprime Hipertext Preprocessor<BR>
Hipertext Preprocessor
</BODY>
</HTML>
Oscar E Capuay Uceda
119
120
Comentarios
<?php
// Este es un ejemplo de una lnea
/*
Este es otro ejemplo,
pero tiene
varias lneas
comentadas
*/
?>
Ejemplo 57:
Sentencia if (1)
pagina02.php
<HTML>
<HEAD>
<TITLE> Ejemplo de la sentencia if </TITLE>
</HEAD>
<BODY>
El siguiente código utiliza la sentencia if de php<BR>
<?php
$nota=12;
if($nota>=10.5)
echo
"<em>Felicitaciones<em>,
Ud.
obtuvo
el
calificativo
de
<strong>$nota</strong> (APROBADO)";
else
echo
"Ud.
obtuvo
el
calificativo
de
<strong>$nota</strong>
(DESAPROBADO)";
?>
</BODY>
</HTML>
Ejemplo 58:
Sentencia if (2)
pagina03.php
<HTML>
<HEAD>
Oscar E Capuay Uceda
121
Sentencia if (3)
pagina04.php
<HTML>
<HEAD>
<TITLE> Ejemplo de la sentencia if </TITLE>
</HEAD>
<BODY>
El siguiente código utiliza la sentencia if de php<BR>
<?php
$nota=12;
if($nota>=10.5)
{ ?>
<em>Felicitaciones<em>, Ud. obtuvo el calificativo de <strong><?php echo
$nota ?></strong> (APROBADO)
<?php }
else
{ ?>
Ud. obtuvo el calificativo de <strong><?php echo $nota ?></strong>
(DESAPROBADO)
<?php }
?>
</BODY>
</HTML>
Todos los ejemplos de la sentencia if generan la siguiente salida Web.
122
Pagina05.php
<HTML>
<HEAD>
<TITLE> Ejemplo de la sentencia for </TITLE>
</HEAD>
<BODY>
Uso de la sentencia for de php<BR>
<?php
$filas=15;
echo "<table border=\"1\">"; //iniciamos la tabla
for($i=1;$i<=$filas;$i++) //creamos varias filas con el for
{
echo "<tr><td>$i</td><tr>"; // escribir fila con el valor de: i
}
echo "</table>"; //cerramos la tabla
?>
</BODY>
</HTML>
Resultado Web
123
pagina06.php
<HTML>
<HEAD><TITLE> Ejemplo de la sentencia for </TITLE></HEAD>
<BODY> Uso de la sentencia for de php<BR>
<?php
$filas=15; $columnas=5;
echo "<table border=\"1\">"; //iniciamos la tabla
for($i=1;$i<=$filas;$i++) //creamos varias filas con el for
{
echo "<tr>"; // crear fila
for($j=1;$j<=$columnas;$j++)
{
echo "<td>$i $j</td>"; //escribir columnas (celdas)
}
echo "<tr>"; // terminar la fila
}
echo "</table>"; //cerramos la tabla
?>
</BODY>
</HTML>
Oscar E Capuay Uceda
124
125
formulario01.html
<html>
<head>
<title>Formulario</title>
</head>
<body>
<form name="form1" method="post" action="pagina08.php">
Ingresa tu nombre
<input name="txtnombre" type="text" id="txtnombre">
<input type="submit" name="Submit" value="Enviar">
</form>
</body>
</html>
En la etiqueta form, en su propiedad action, especificamos el destino de los
datos, es decir, la pgina PHP que recibir los datos del formulario. En este
caso pagina08.php, y no olvidemos que en el mtodo estamos especificando
POST.
Adems debemos tomar en cuenta el nombre del objeto (caja de texto
input tipo text) txtnombre, pues ser en nombre que usaremos en la pgina
de destino.
pagina08.php
<HTML>
<HEAD><TITLE> Ejemplo de envio de datos</TITLE></HEAD>
<BODY>
Tu nombre es:
<?php
echo $_POST[txtnombre];
?>
</table>
</BODY>
</HTML>
En esta pgina podemos ver que usamos el array $_POST de PHP para
acceder a los datos enviados a travs de este mtodo. Tambien podemos
Oscar E Capuay Uceda
126
127
128
129
130
formulario04.html
<html>
<head>
Oscar E Capuay Uceda
131
132
133
134
Figura 72.
135
136
137
138
139
140
141
142
143
Figura 91. Operacin realizada con xito y el script SQL que ha sido
ejecutado.
Siempre phpmyadmin nos mostrar el script SQL que acabamos de ejecutar,
en este caso la orden de insercin en la tabla persona.
Luego podemos ver la lista de registros haciendo click en Examinar.
144
Conexin a MySQL
pagina12.php
<?php
$conex=mysql_connect("localhost","root","") or die(mysql_error());
mysql_select_db("dbdemo",$conex) or die(mysql_error());
?>
La funcin mysql_connect abre una conexin a un servidor MySQL, y
necesita para ello tres parmetros: el nombre o direccin del servidor de
base de datos, un nombre de usuario y su contrasea. Podemos observar
luego de la funcin mysql_connect que aparece el operador OR el cual nos
permite ejecutar la orden die() en caso que la conexin fallara. La orden die()
imprime un mensaje y termina el script actual, en este caso el mensaje ser
el resultado de la ejecucin de la funcin mysql_error() retorna el texto del
error de la ltima funcin MySQL o '' (cadena vaca) si no ocurri error.
Una vez hecha la conexin almacenamos en la variable $conex el
identificador de enlace de dicha conexin. Esta variable la utilizaremos para
seleccionar la base de datos a la cual accederemos mediante la funcin
mysql_select_db() que tiene como primer parmetro el nombre de la base de
datos.
Ahora veremos una pgina que incluye el script escrito en pagina12.php para
realizar la conexin y luego hacer una consulta de todos los registros de la
tabla persona.
Ejemplo 66:
Listado de registros
pagina13.php
<?php
include "pagina12.php"; //incluimos la conexion
$sql="select * from persona"; //consulta sql
$rspersona=mysql_query($sql) or die(mysql_error());//ejecucion de la
sentencia sql
while($reg=mysql_fetch_array($rspersona)) {
echo $reg[idpersona]." - ".$reg[nombres]." ".$reg[apellidos]."<br>";
}
?>
Podemos ver en el script que con la funcin mysql_query podemos ejecutar
una sentencia SQL la cual almacena el resultado en la variable $rspersona.
Oscar E Capuay Uceda
145
146
Ejemplo 68:
Formulario05.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Nuevo registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pagina15.php">
Oscar E Capuay Uceda
147
148
Edicin de registros
Pagina16.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php
include "pagina12.php";
$sql="select * from persona where idpersona='$_GET[idpersona]'";
$rs=mysql_query($sql) or die(mysql_error());
//ejecutar sentencia
if(mysql_num_rows($rs)>0)
149
150
pagina17.php
<?php
include "pagina12.php";
//sentencia para editar el registro
$sql="update persona set nombres='$_POST[nombres]',
apellidos='$_POST[apellidos]', email='$_POST[email]',
telefono='$_POST[telefono]' where idpersona='$_POST[idpersona]'";
//ejecutar sentencia
mysql_query($sql) or die(mysql_error());
echo "La persona fue actualizada exitosamente<br>";
echo "<a href='pagina14.php'>Listado de Personas</a>";
?>
Resultado Web:
Eliminacin de registros
pagina18.php
<?php
include "pagina12.php";
//sentencia para eliminar el registro
$sql="delete from persona where idpersona='$_GET[idpersona]'";
Oscar E Capuay Uceda
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
Conexin a PostgreSQL
pagina22.php
<?php
//conexion al servidor PostgreSQL
$conex=pg_connect("host=localhost dbname=dbdemo port=5432 user=oscar
password=123456") or die("Error en la conexin");
?>
pagina23.php
<?php
include "pagina22.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=pg_query($sql) or die(pg_last_error($conex));
while($reg=pg_fetch_array($rspersona)) {
echo $reg[idpersona]." - ".$reg[nombres]." ".$reg[apellidos]."<br>";
}
?>
La funcin pg_last_error() muestra el ltimo error ocurrido en la conexin
activa, la cual es el parmetro.
172
pagina24.php
<?php
include "pagina22.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=pg_query($sql) or die(pg_last_error($conex));
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=pg_fetch_array($rspersona))
{ ?>
<tr>
<td><?php echo "$registro[idpersona]"?></td>
<td><?php echo "$registro[nombres]"?></td>
<td><?php echo "$registro[apellidos]"?></td>
<td><a href="pagina26.php?idpersona=<?php echo
"$registro[idpersona]"?>">editar</a></td>
<td><a href="pagina28.php?idpersona=<?php echo
"$registro[idpersona]"?>">eliminar</a></td>
</tr>
<?php
}
//Liberar conjunto de resultados
pg_free_result($rspersona);
Oscar E Capuay Uceda
173
formulario06.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Nuevo registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pagina25.php">
<table width="80%" border="0" align="center">
<tr> <th colspan="2">Nuevo Registro</th> </tr>
<tr>
<td>Nombres</td> <td><input name="nombres" type="text"
id="nombres" size="50" maxlength="50" /></td>
</tr>
<tr>
<td>Apellidos</td> <td><input name="apellidos" type="text"
id="apellidos" size="50" maxlength="50" /></td>
</tr>
<tr>
174
175
pagina26.php
<html>
<head>
<?php
include "pagina22.php";
$sql="select * from persona where idpersona='$_GET[idpersona]'";
$rs=pg_query($sql) or die(pg_last_error());
if(pg_num_rows($rs)>0) $registro=pg_fetch_array($rs);
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Edición de registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pagina27.php">
<input type="hidden" name="idpersona" value="<?php echo
$_GET[idpersona]?>">
<table width="80%" border="0" align="center">
<tr> <th colspan="2">Edición de Persona</th> </tr>
<tr>
<td>Nombres</td> <td><input name="nombres" type="text"
id="nombres" size="50" maxlength="50" value="<?php echo
$registro[nombres]?>" /></td>
</tr>
<tr>
<td>Apellidos</td>
<td><input name="apellidos" type="text" id="apellidos" size="50"
maxlength="50" value="<?php echo $registro[apellidos]?>" /></td>
</tr>
<tr>
<td>E-Mail</td>
<td><input name="email" type="text" id="email" size="50"
maxlength="100" value="<?php echo $registro[email]?>"/></td>
</tr>
Oscar E Capuay Uceda
176
177
pagina28.php
<?php
include "pagina22.php";
//sentencia para eliminar el registro
$sql="delete from persona where idpersona='$_GET[idpersona]'";
//ejecutar sentencia
pg_query($sql) or die(pg_last_error());
echo "La persona fue eliminada exitosamente<br>";
echo "<a href='pagina24.php'>Listado de Personas</a>";
?>
178
179
180
181
Conexin a MS-SQLServer
pagina29.php
<?php
//conexion al servidor MS-SQLServer
$conex=mssql_connect("LAPTOP\\","oscar","123456") or die("Error en la
conexin");
mssql_select_db("dbdemo",$conex) or die("Error al seleccionar la BD");
?>
Ahora probemos listando los registros.
pagina30.php
<?php
include "pagina29.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=mssql_query($sql) or die("Error sql");
while($reg=mssql_fetch_array($rspersona)) {
echo $reg[idpersona]." - ".$reg[nombres]." ".$reg[apellidos]."<br>";
}
?>
Resultado Web:
182
Listado de registros
pagina31.php
<?php
include "pagina29.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=mssql_query($sql) or die("error en la consulta");
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=mssql_fetch_array($rspersona))
{ ?>
<tr>
<td><?php echo "$registro[idpersona]"?></td>
<td><?php echo "$registro[nombres]"?></td>
<td><?php echo "$registro[apellidos]"?></td>
<td><a href="pagina33.php?idpersona=<?php echo
"$registro[idpersona]"?>">editar</a></td>
<td><a href="pagina35.php?idpersona=<?php echo
"$registro[idpersona]"?>">eliminar</a></td>
</tr>
<?php
}
//Liberar conjunto de resultados
mssql_free_result($rspersona);
// Cerrar conexion
mssql_close($conex);
?>
183
Ejemplo 78:
formulario07.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Nuevo registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pagina32.php">
<table width="80%" border="0" align="center">
<tr>
<th colspan="2">Nuevo Registro</th>
</tr>
<tr>
<td>Nombres</td> <td><input name="nombres" type="text"
id="nombres" size="50" maxlength="50" /></td>
</tr>
<tr>
<td>Apellidos</td> <td><input name="apellidos" type="text"
id="apellidos" size="50" maxlength="50" /></td>
</tr>
<tr>
<td>E-Mail</td> <td><input name="email" type="text" id="email"
size="50" maxlength="100" /></td>
</tr>
<tr>
<td>Teléfono</td> <td><input name="telefono" type="text"
id="telefono" maxlength="15" /></td>
</tr>
<tr>
<th colspan="2"><input name="Submit" type="submit" class="boton"
value="Guardar" /> <input name="Submit2" type="button" class="boton"
value="Cancelar" onclick="location='pagina14.php'" /></th>
</tr>
</table>
</form>
</body>
</html>
184
185
pagina33.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php
include "pagina29.php";
$sql="select * from persona where idpersona='$_GET[idpersona]'";
$rs=mssql_query($sql) or die("error en la consulta");
//ejecutar sentencia
if(mssql_num_rows($rs)>0)
$registro=mssql_fetch_array($rs);
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Edición de registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pagina34.php">
<input type="hidden" name="idpersona" value="<?php echo
$_GET[idpersona]?>">
<table width="80%" border="0" align="center">
<tr>
<th colspan="2">Edición de Persona</th>
</tr>
<tr>
<td>Nombres</td>
<td><input name="nombres" type="text" id="nombres" size="50"
maxlength="50" value="<?php echo $registro[nombres]?>" /></td>
</tr>
<tr> <td>Apellidos</td>
<td><input name="apellidos" type="text" id="apellidos" size="50"
maxlength="50" value="<?php echo $registro[apellidos]?>" /></td>
</tr>
<tr> <td>E-Mail</td>
<td><input name="email" type="text" id="email" size="50" maxlength="100"
value="<?php echo $registro[email]?>"/></td>
</tr>
<tr> <td>Teléfono</td>
<td><input name="telefono" type="text" id="telefono" maxlength="15"
value="<?php echo $registro[telefono]?>"/></td>
</tr>
<tr>
<th colspan="2"><input name="Submit" type="submit" class="boton"
value="Guardar" /> <input name="Submit2" type="button" class="boton"
value="Cancelar" onclick="location='pagina31.php'" /></th>
</tr>
</table>
</form>
Oscar E Capuay Uceda
186
pagina35.php
<?php
include "pagina29.php";
//sentencia para eliminar el registro
$sql="delete from persona where idpersona='$_GET[idpersona]'";
//ejecutar sentencia
Oscar E Capuay Uceda
187
188
pagina19.php
<?php
class MiClase
{
// Declaracin de un miembro de la clase
public $variable = 'demo'; // demo es el valor por defecto de $variable
// Declaracin de un mtodo
public function ver() {
echo $this->variable; //imprime el valor de $variable
}
}
?>
Instancia de un 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 excepcin en caso de error. Las clases deben ser definidas antes
de crear las instancias (y en algunos casos esto es un requerido).
Cuando se asigna una instancia de un objeto previamente creado a una
nueva variable, la nueva variable accesar a la misma instancia que la del
objeto a la que fue asignada. Este comportamiento es el mismo cuando se
pasan instancias a una funcin. Una nueva instancia de un objeto
previamente creado puede ser hecha clonndolo. [3]
Ejemplo 82:
pagina20.php
<?php
include "pagina19.php"; //definicin de MiClase
//Creando una instancia
$instancia = new MiClase();
// Asignacin del Objeto
$asignado = $instancia;
$referencia =& $instancia;
Oscar E Capuay Uceda
189
Extendiendo objetos
Una clase puede heredar mtodos y miembros de otra clase usando la
palabra 'extends' en la declaracin. No es posible extender de mltiples
clases, una clase puede heredar solo de una clase base.
Los mtodos heredados y sus miembros pueden ser evitados,
redeclarndolos con el mismo nombre con el que los defini la clase padre, a
menos que la clase padre haya definido un mtodo como final. Es posible
accesar a los mtodos o miembros redeclarados haciendo referencia a ellos
con parent::
Ejemplo 83:
pagina21.php
<?php
include "pagina19.php";
class ExtendClass extends MiClase
{
// Redefinicin de mtodo
function ver()
{
echo "clase con nuevo método\n";
parent::ver();
}
}
$extended = new ExtendClass();
$extended->ver();
?>
190
Auto carga
clase1.php
<?php
class clase1
{
// Declaracin de un miembro de la clase
public $texto = 'esta es la clase1';
// Declaracin de un mtodo
public function mostrar() {
echo $this->texto; //imprime el valor de $variable
}
}
?>
Oscar E Capuay Uceda
191
192
mysqli
Representa una conexin entres PHP y la base de datos MySQL.
Constructor
mysqli - constructor de un nuevo objeto mysqli
Mtodos
autocommit - cambia en ON u OFF las modificaciones de auto-commiting en
la base de datos.
change_user - cambia el usuario del identificador de enlace especificado.
character_set_name - regresa el conjunto de caracteres del identificador de
enlace especificado.
close - cierra una conexin previamente abierta.
commit - completa la transaccin actual.
connect - abre una nueva conexin al servidor de MySQL.
debug - realiza operaciones de rastreo.
dump_debug_info - vaca informacin de rastreo.
get_client_info - retorna la versin del cliente.
get_host_info - retorna el tipo de conexin usada.
get_server_info - retorna la versin del servidor MySQL.
get_server_version - retorna la versin del servidor MySQL
init - inicializa el objeto mysqli.
info - obtiene informacin acerca de la consulta ms recientemente
ejecutada.
kill - solicita al servidor destruir un thread de mysql.
Oscar E Capuay Uceda
193
194
mysqli_stmt
Representa una sentencia preparada.
Mtodos
bind_param - enlaza variables a una sentencia preparada.
bind_result - enlaza variables a una sentencia preparada para el
almacenamiento del resultado.
close - cierra la sentencia preparada.
data_seek - busca a una fila arbitrariamente en el resultado.
execute - ejecuta una sentencia preparada.
fetch - obtiene el resultado de la sentencia preparada en variables lmite.
free_result - libera la memoria del resultado almacenado para el manejador
de la sentencia dada.
result_metadata - obtiene un resultado de la sentencia preparada para
informacin de metadatos.
prepare - prepara una consulta SQL.
send_long_data - enva datos en partes.
reset - resetea una sentencia preparada.
Oscar E Capuay Uceda
195
Propiedades
affected_rows - retorna las filas afectadas de la ltima sentencia ejecutada.
errno - retorna el cdigo de error para la llamada a funcin ms reciente.
error - retorna el mensaje de error para la llamada a funcin ms reciente.
param_count - retorna el numero de parmetros para la sentencia preparada
dada.
sqlstate - retorna una cadena conteniendo el cdigo de error SQLSTATE
para la llamada a funcin ms reciente.
mysqli_result
Representa el resultado obtenido de la consulta hecha en la base de datos.
Mtodos
close - cierra el resultado.
data_seek - mueve el puntero interno del resultado.
fetch_field - obtiene la informacin de la columna en el resultado.
fetch_fields - obtiene la informacin para todas las columnas del resultado.
fetch_field_direct - obtiene informacin de la columna para la columna dada.
fetch_array - recupera una fila como una matriz asociativa, una matriz
numrica, o ambos.
fetch_assoc - obtiene una fuka como una matriz asociativa.
fetch_object - obtiene una fila como un objeto.
fetch_row - obtiene una fila como una matriz enumerada.
close - libera la memoria ocupada por el resultado.
field_seek - fija el apuntador del resultado a la posicin especificada.
Propiedades
current_field - retorna la posicin de puntero actual.
field_count - retorna el nmero de campos en el resultado.
196
Ejemplo 85:
mysqli-connect.php
<?php
$mysqli = new mysqli("localhost", "root", "", "dbdemo");
/* verifica la conexin */
if (mysqli_connect_errno()) {
printf("Conexin fallida:<br> %s\n", mysqli_connect_error());
exit();
}
printf("Server MySQL:<br> %s\n", $mysqli->host_info);
/* Cerrar la conexin */
$mysqli->close();
?>
Resultado Web:
197
Ejemplo 86:
mysqli-lista.php
<?php
include "mysqli-conexion.php"; //incluimos la conexin
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=$mysqli->query($sql) or die($mysqli->error);
//listado
while($reg=$rspersona->fetch_object()) {
echo $reg->idpersona." - ".$reg->nombres." ".$reg->apellidos."<br>";
}
?>
Resultado Web:
198
formulario08.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
Oscar E Capuay Uceda
199
200
mysqli-insertar.php
<?php
include "mysqli-conexion.php";
//sentencia para insertar el usuario
$sql="insert into persona
values('','$_POST[nombres]','$_POST[apellidos]','$_POST[email]','$_POST[t
elefono]')";
//ejecutar sentencia
$mysqli->query($sql) or die($mysqli->error);
echo "La persona fue registrada exitosamente<br>";
echo "<a href='mysqli-listado.php'>Listado de Personas</a>";
?>
Resultado Web:
mysqli-editar.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php
include "mysqli-conexion.php";
$sql="select * from persona where idpersona='$_GET[idpersona]'";
$rs=$mysqli->query($sql) or die($mysqli->error);
//ejecutar sentencia
if($rs->num_rows>0)
$registro=$rs->fetch_object();
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Edición de registro</title>
</head>
201
202
mysql-eliminar.php
<?php
include "mysqli-conexion.php";
//sentencia para eliminar el registro
$sql="delete from persona where idpersona='$_GET[idpersona]'";
//ejecutar sentencia
$mysqli->query($sql) or die($mysqli->error());
echo "La persona fue eliminada exitosamente<br>";
echo "<a href='mysqli-listado.php'>Listado de Personas</a>";
?>
Resultado Web:
203
Paginando resultados
Ejemplo 90:
Paginacin de resultados
mysqli-listado-paginacion.php
<?php
include "mysqli-conexion.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=$mysqli->query($sql) or die($mysqli->error);
$numreg=$rspersona->num_rows;
$regxpag=3;
if(!isset($_GET['p']))$_GET['p']=1;
$inicio=$regxpag*($_GET['p']-1);
$sql=$sql ." limit $inicio,$regxpag";
$numpag=ceil($numreg/$regxpag);
$rspersona=$mysqli->query($sql) or die($mysqli->error);
echo "Registros encontrados:" . $numreg;
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch_object())
{ ?>
<tr>
<td><?php echo "$registro->idpersona"?></td>
<td><?php echo "$registro->nombres"?></td>
<td><?php echo "$registro->apellidos"?></td>
<td><a href="mysqli-editar.php?idpersona=<?php echo "$registro>idpersona"?>">editar</a></td>
<td><a href="mysqli-eliminar.php?idpersona=<?php echo "$registro>idpersona"?>">eliminar</a></td>
</tr>
<?php
}
$rspersona->close(); //cerramos resultado de la consulta
$mysqli->close(); //cerr=amos la conexin
?>
</table>
Oscar E Capuay Uceda
204
205
206
Arquitectura MVC
Todos los que estamos inmersos en el mundo de la programacin sabemos
que en todo programa los datos que se procesan pueden ser ingresados y
mostrados en formas diferentes dependiendo del tipo y diseo de la interfaz,
y sobre todo en el desarrollo Web esto se ve aun ms acentuado debido a
que los desarrolladores Web muchas veces son muy buenos programando
pero no diseando interfaces, por lo general las empresas de este rubro
optan por utilizar dos equipos de trabajo: los codificadores quienes se
encargan de implementar los algoritmos y los diseadores para darle un
buena presentacin a la aplicacin, pero las dificultades inician cuando
alguna parte del cdigo que un equipo hace influye sobre el diseo que
realiza el otro equipo. Para dar solucin a este tipo de problemas han
surgido arquitecturas de desarrollo que nos permiten desarrollar aplicaciones
separando la lgica del diseo de la interfaz, una de ellas es la Arquitectura
MVC (Modelo Vista Controlador).
207
208
209
210
_modelo.php
<?php
class ClaseX
{
protected $plantilla_propia = "_listar.php";
protected $arrayx= array();
public function show()
{
include ($this->plantilla_propia);
}//fun
public function CargarDatos()
{
$this->arrayx = array("Abel", "Marco","Pedro");
}//fun
}//class
?>
Ejemplo 92:
_listar.php
<?php
foreach ($this->arrayx as $elemento)
{
echo $elemento["nombre"];
echo "";
}//foreach
?>
Oscar E Capuay Uceda
211
_controlador.php
<?php
include ("./_modelo.php");
$objX = new ClaseX();
//aqu habra que implementar una clase que
//determine las caracteristicas de la pagina
//pero para poner un ejemplo sencillo vamos
//a saltarnos esa parte en este artculo
$titulo = "pagina nueva";
$objX->CargarDatos();
include ("_vista.php");
?>
Ejemplo 94:
_vista.php
<html>
<head>
<title><?php echo $titulo; ?></title>
</head>
<body>
<?php $objX->show(); ?>
</body>
</html>
El punto clave en una Vista como la de este ejemplo es que no uses
instrucciones PHP ms all de las que muestren datos. Por qu? Pues si la
lgica de tu aplicacin se est decidiendo en la Vista entonces para qu
queremos el Controlador? ;) Simplificando mucho el concepto eso quiere
decir que uses echo y metodos de tus objetos (Modelo) que hagan echo de
alguna forma aunque tu los llames show o muestra_datos o lo que t
quieras.
El inventor y gur del PHP Rasmus Lerdorf, public hace algn tiempo, en
febrero del ao 2006 un bastante mal entendido artculo, titulado The no
framework PHP MVC framework
Aqu, Rasmus nos habla sobre como implementar un sencillo MVC usando
solo PHP puro. Bueno, estoy de acuerdo hasta un cierto punto con este
artculo y es que implementar el MVC sin usar un framework que vaya ms
all de nuestras necesidades nos va a beneficiar en cuanto a la memoria que
usa cada script PHP. Ms tarde hablaremos sobre la optimizacin. Algunos
Oscar E Capuay Uceda
212
213
modelo_bd.php
<?php
class BaseDatos
{
protected $servidor="localhost";
protected $usuario="root";
protected $password="";
protected $link;
public $rs;
public function conectar()
{
$this->link=mysql_connect($this->servidor,$this>usuario,$this->password) or die(mysql_error());
mysql_select_db("dbdemo",$this->link) or die(mysql_error());
}
public function consultar($sql)
{
$this->rs=mysql_query($sql) or die(mysql_error());
}
} //fin clase
class ClaseDatos
{
protected $plantilla_listado = "lista_bd.php";
protected $data= array();
protected $recset;
protected $registro;
*
214
lista_bd.php
<table border="1">
<?php
while($this->leer_registro()) { ?>
<tr>
<?php
foreach($this->registro as $k => $v){
?>
<td><?php echo $this->registro[$k]?></td>
<?php
}
?>
</tr>
<?php } ?>
</table>
Ejemplo 97:
vista_bd.php
<html>
<head>
<title><?php echo $titulo; ?></title>
</head>
<body>
<?php $objData->show(); ?>
</body>
</html>
Ejemplo 98:
controlador_bd.php
<?php
include ("modelo_bd.php");
$objData = new ClaseDatos();
$sql="select * from persona";
Oscar E Capuay Uceda
215
216
Controladores PDO
Controlador
Base de Datos
PDO_DBLIB
PDO_FIREBIRD
Firebird/Interbase 6
PDO_IBM
IBM DB2
PDO_INFORMIX
PDO_MYSQL
MySQL 3.x/4.x/5.x
PDO_OCI
PDO_ODBC
PDO_PGSQL
PostgreSQL
PDO_SQLITE
Clases predefinidas
PDO
Representa una conexin entre PHP y un servidor de base de datos.
Constructor
PDO - construye un nuevo objeto PDO
Mtodos
beginTransaction inicia una transaccin.
commit - efecta la transaccin.
217
PDOStatement
Representa una sentencia preparada, luego que la sentencia es ejecutada,
un conjunto de registros.
Mtodos
bindColumn - relaciona variable a una columna de salida en un conjunto de
registros.
bindParam - relaciona una variable PHP a un parmetro en la sentencia
preparada.
bindValue - binds un valor a un parmetro en la sentencia preparada.
closeCursor - cierra el cursor, permitiendo ejecutar nuevamente la sentencia.
columnCount - retorna el nmero de columnas del conjunto de registros.
errorCode - retorna un cdigo de error, si lo hay, de la sentencia.
errorInfo - retorna un arreglo de informacin de un error, si lo hay, de la
sentencia.
execute ejecuta la sentencia preparada.
fetch lee un registro de un conjunto de registros.
218
219
pdo-connect.php
<?php
$conn = new PDO('mysql:host=localhost;dbname=dbdemo',"root","");
//$conn = new PDO('mssql:host=localhost;dbname=dbmicro',"sa","");
//$conn = new PDO('pgsql:host=localhost;dbname=dbpos',"postgres","psql");
?>
Ahora veremos una lista simple obtenida de la tabla persona.
Ejemplo 100:
pdo-lista.php
<?php
try {
include "pdo-connect.php";
foreach ($conn->query('SELECT * from persona') as $registro) {
print_r($registro);
}
$conn = null; //cierre de conexin
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
220
pdo-listado.php
<?php
include "pdo-connect.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
$rspersona=$conn->query($sql);
?>
<form name="form1" action="pdo-eliminar.php" method="post">
<table>
<tr>
<th>Eliminar</th>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch())
{ ?>
<tr>
<td><input
type="checkbox"
name="chkelim[]"
value="<?php
$registro[idpersona]?>" /></td>
<td><?php echo $registro[idpersona]?></td>
<td><?php echo $registro[nombres]?></td>
<td><?php echo $registro[apellidos]?></td>
<td><a
href="pdo-editar.php?idpersona=<?php
$registro[idpersona]?>">editar</a></td>
</tr>
<?php
Oscar E Capuay Uceda
echo
echo
221
pdo-nuevo.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Nuevo registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pdo-insertar.php">
<table width="80%" border="0" align="center">
<tr>
<th colspan="2">Nuevo Registro</th>
</tr>
<tr>
<td>Nombres</td>
<td><input name="nombres" type="text" id="nombres" size="50"
maxlength="50" /></td>
Oscar E Capuay Uceda
222
Resultado Web:
223
pdo-eliminar.php
<?php
include "pdo-connect.php";
$sentencia=$conn->prepare("delete from persona where idpersona=:id");
$sentencia->bindParam(':id',$valor);
foreach($_POST[chkelim] as $indice => $valor) {
$sentencia->execute();
}
header("location: pdo-listado.php");
?>
Ejemplo 104:
pdo-editar.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php
include "pdo-connect.php";
$sql="select * from persona where idpersona=" . $_GET[idpersona];
$rspersona=$conn->query($sql);
$registro=$rspersona->fetch();
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Edición de registro</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="pdo-actualizar.php">
Oscar E Capuay Uceda
224
225
226
Seguridad Web
http://www.php.net/manual/es/security.general.php
227
Seguridad Web
$archivo = $_POST['archivo'];
//generamos la ruta para el borrado del archivo directorio del usuario
$directorio = "/home/$usuario";
//orden de eliminacin del archivo
unlink("$directorio/$archivo");
echo "El archivo: $archivo ha sido eliminado!";
?>
Si alguien desea atacar el sistema de archivos podra escribir en el
formulario datos para eliminar por ejemplo el archivo de passwords del
sistema operativo, en el caso que PHP tuviera acceso de root.
Ejemplo 106:
<?php
// Para el caso del nombre del usuario enviamos: "../etc"
// Para el caso del nombre del archivo enviamos: "passwd"
$usuario = $_POST['nombre_usuario'];
$archivo = $_POST['archivo'];
//generando la ruta del directorio obtendramos lo siguiente: "/home/../etc"
$directorio = "/home/$nombre_usuario";
// El archivo que se va a eliminar es: "/home/../etc/passwd"
unlink("$directiorio/$archivo");
echo "El archivo ha sido eliminado!";
?>
Para mejorar el control y la validacin de los datos enviados por el usuario
utilizaremos funciones que nos permitan verificar el tipo de datos correcto.
Por ejemplo:
if
(!ctype_alnum($nombre_usuario)
||
!preg_match('/^(?:[a-z0-9_]|\.(?!\.))+$/iD', $archivo_usuario)) {
die("Nombre de usuario o archivo incorrecto");
}
ctype_alnum: es una funcin que devuelve TRUE cuando la cadena contiene
solamente caracteres alfanumricos, es decir, letras y/o nmeros.
preg_match: es una funcin que realiza una comparacin en base a una
expresin regular.
228
Seguridad Web
Md5
md5.php
<?php
$texto="miclavedeacceso";
$cifrado=md5($texto);
echo "mi clave cifrada es:".$cifrado;
// el texto cifrado con MD5 de 128bits genera una cadena de 32 caracteres
de longitud.
?>
Resultado Web:
229
Seguridad Web
Desarrollaremos ahora un formulario para el acceso de usuarios teniendo
como supuesto que la tabla de usuarios se llama: user, y los campos donde
estn registrados
los nombres de usuario y clave de acceso son:
user_nombre y user_clave respectivamente.
El script para este caso sera:
Ejemplo 108:
acceso-md5.php
<?php
include "conexion.php"; //conexion a la BD
//datos provenientes del formulario
$usuario=$_POST[txtusuario];
$clave=$_POST[txtclave];
$clave_cifrada=md5($clave);
$sql="select * from user
user_clave='".$clave_cifrada."'";
where
user_nombre='".$usuario."'
and
$rs=mysql_query($sql) or die(mysql_error());
//si existe un usuario con dichos datos
if(mysql_num_rows($rs)==1) echo "Datos correctos";
else echo "Datos incorrectos";
?>
Con este script no sera suficiente para dar la seguridad adecuada a nuestra
aplicacin Web. A continuacin veremos otro punto importante que debemos
tomar en cuenta.
230
Seguridad Web
Inyeccin SQL
Una consulta SQL no es una orden confiable a la que no se le debe prestar
la atencin debida, sino por el contrario es en la que ms cuidado debemos
tener puesto que a travs de ella se puede burlar los controles de acceso a
cualquier sistema Web e incluso permitir el acceso a comandos del sistema
operativo.
La Inyeccin de comandos SQL es una tcnica utilizada para alterar
comandos SQL definidos en una aplicacin con la finalidad de mostrar datos,
sobrescribirlos, eliminarlos o ejecutar rdenes que no fueron establecidas
por el desarrollador. La manera de realizar las alteraciones es a travs de los
datos enviados por un usuario y su combinacin con parmetros utilizados
en las sentencias SQL. A continuacin veremos ejemplos que nos ayudarn
a ver estos casos con mayor detalle.
Ejemplo 109:
<?php
$sql="SELECT
zona=$zona";
nombre,
apellidos,
direccion
FROM
cliente
WHERE
$result = mysql_query($sql);
?>
En este ejemplo la variable $zona es enviada por el usuario. Utilizando la
variable $zona enviaremos la siguiente cadena: union select * from usuario
-En la cadena podemos ver una comilla simple ( ) al inicio y doble guin ( -- )
al final.
Si reemplazamos esta cadena en lugar de la variable $zona veremos que el
resultado de la consulta mostrar todos los datos registrados en la tabla
usuario.
Utilizando como base el ejemplo anterior haremos inyeccin SQL en una
pgina con un listado que utiliza hipervnculos para la paginacin de
resultados.
Ejemplo 110:
inyeccion01.php
<?php
include "mysqli-conexion.php"; //incluimos la conexion
$cantidad=2; //numero de registros por pagina
//verificamos si existe la variable
Oscar E Capuay Uceda
231
Seguridad Web
if(!isset($_GET[p])) $_GET[p]=0;
//hallamos el total de registros
$sql="select * from persona";
$rspersona=$mysqli->query($sql) or die($mysqli->error);
$nr=$rspersona->num_rows;
//paginacin de resultados
$sql="select idpersona,nombres,apellidos from persona limit " . $_GET[p] .
",$cantidad";
$rspersona=$mysqli->query($sql) or die($mysqli->error);
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch_object())
{ ?>
<tr>
<td><?php echo "$registro->idpersona"?></td>
<td><?php echo "$registro->nombres"?></td>
<td><?php echo "$registro->apellidos"?></td>
<td><a
href="mysqli-editar.php?idpersona=<?php
echo
"$registro>idpersona"?>">editar</a></td>
<td><a
href="mysqli-eliminar.php?idpersona=<?php
echo
"$registro>idpersona"?>">eliminar</a></td>
</tr>
<?php
}
?>
<tr><td colspan="5">Página:
<?php
for($i=1;$i<=ceil($nr/$cantidad);$i++)
{
$inicio=$cantidad*($i-1);
echo "<a href='?p=$inicio'>$i</a> ";
}
?>
</td></tr>
</table>
<br>
<a href="formulario08.html">Agregar Registro</a>
<?php
$rspersona->close(); //cerramos resultado de la consulta
$mysqli->close(); //cerramos la conexin
?>
232
Seguridad Web
Resultado Web:
233
Seguridad Web
234
Seguridad Web
pretenda inyectar SQL. Para el caso anterior debemos analizar y verificar
que el valor de la variable p sea un nmero obligatoriamente, entonces
aadimos la lnea:
if(!is_numeric($_GET[p])) $_GET[p]=0;
is_numeric es una funcin que devuelve TRUE si el valor de la variable es
numrico.
En caso que no sea numrico le asignamos CERO, segn la lnea de cdigo
anterior.
inyeccion02.php
<?php
include "mysqli-conexion.php"; //incluimos la conexion
$cantidad=2; //numero de registros por pagina
//verificamos si existe la variable
if(!isset($_GET[p])) $_GET[p]=0;
//hallamos el total de registros
$sql="select * from persona";
$rspersona=$mysqli->query($sql) or die($mysqli->error);
$nr=$rspersona->num_rows;
//verificamos si es p tiene valor numrico
if(!is_numeric($_GET[p])) $_GET[p]=0;
//paginacin de resultados
$sql="select idpersona,nombres,apellidos from persona limit " . $_GET[p] .
",$cantidad";
$rspersona=$mysqli->query($sql) or die($mysqli->error);
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch_object()) {
?>
<tr>
<td><?php echo "$registro->idpersona"?></td>
<td><?php echo "$registro->nombres"?></td>
Oscar E Capuay Uceda
235
Seguridad Web
<td><?php echo "$registro->apellidos"?></td>
<td><a
href="mysqli-editar.php?idpersona=<?php
>idpersona"?>">editar</a></td>
<td><a
href="mysqli-eliminar.php?idpersona=<?php
>idpersona"?>">eliminar</a></td>
</tr>
echo
echo
"$registro"$registro-
<?php
}
?>
<tr><td colspan="5">Página:
<?php
for($i=1;$i<=ceil($nr/$cantidad);$i++)
{
$inicio=$cantidad*($i-1);
echo "<a href='?p=$inicio'>$i</a> ";
}
?></td></tr>
</table>
<br>
<a href="formulario08.html">Agregar Registro</a>
<?php
$rspersona->close(); //cerramos resultado de la consulta
$mysqli->close(); //cerramos la conexin
?>
Con esta modificacin ejecutaremos la misma URL:
236
Seguridad Web
para esta tabla: login (nombre del usuario) y clave (password del usuario) y
luego registramos algunos registros.
237
Seguridad Web
Resultado Web:
238
Seguridad Web
SELECT * from usuario WHERE login='loquesea' AND password= OR =
Si logramos generar una cadena como la anterior entonces no
necesitaremos tener un nombre de usuario correcto ni su respectiva clave
puesto que la condicin (WHERE) siempre resultar verdadera y por lo tanto
nos devolver todos los registros de la tabla usuario. Pero para llegar a
generar la ltima cadena debemos partir de la que suponemos se ha escrito
en el script, en este caso la que est en nuestro archivo inyeccion03.php.
Cadena inicial:
$sql="SELECT * from usuario WHERE login='" . $_POST[usuario] . "' and
clave='" . $_POST[passw] . "'";
Ahora a $_POST[usuario] le podemos dar cualquier valor, en este caso:
loquesea y a $_POST[passw] le daremos el valor: ' OR ''=' , con estos
valores resultara:
SELECT * from usuario WHERE login='loquesea' AND password= OR =
Probemos esto en el navegador con nuestro formulario09.html
239
Seguridad Web
Pero si magic_quotes se encuentra inactivo tendremos el siguiente
resultado:
240
Seguridad Web
</tr>
</table>
</form>
</body>
</html>
Una vez cargado el formulario, ingresamos los datos de prueba.
Resultado Web:
get_magic_quotes_gpc y addslashes
comillas-magicas.php
<?php
if (!get_magic_quotes_gpc()) {
$password = addslashes($_POST['passw']);
} else {
$password = $_POST['passw'];
}
$sql="SELECT * from usuario WHERE login='" . $_POST[usuario] . "' and
clave='" . $password . "'";
//imprimir sentencia SQL
echo $sql;
?>
Veamos ahora el resultado:
241
Seguridad Web
Podemos notar que se le agrega un \ (slash) a cada comilla, sin importar la
configuracin de las comillas mgicas, el script anterior no ayudara a evitar
la inyeccin SQL.
Con este script mejoramos el control del acceso a usuarios, pero cabe
resaltar una funcin creada para evitar este tipo de inyecciones SQL en
servidores MySQL, llamada: mysqli_real_escape_string (programacin
orientada a objetos) o mysql_real_escape_string (programacin
procedimental). Veamos un ejemplo con estilo orientado a objetos:
Ejemplo 112:
mysqli_real_escape_string
formulario11.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Acceso al sistema</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="inyeccion04.php">
<table width="50%" border="0" align="center">
<tr> <th colspan="2">Acceso al sistema</th></tr>
<tr>
<td>Usuario</td> <td><input name="usuario" type="text" id="usuario"
maxlength="20" /></td>
</tr>
<tr>
<td>Password</td>
<td><input
name="passw"
type="password"
id="passw" maxlength="40" /></td>
</tr>
<tr>
<th
colspan="2"><input
name="Submit"
type="submit"
class="boton" value="Entrar" /> </th> </tr>
</table>
</form>
</body>
</html>
inyeccion04.php
<?php
//incluimos la conexion
include "mysqli-conexion.php";
$usuario =$mysqli->real_escape_string($_POST['usuario']);
$password=$mysqli->real_escape_string($_POST['passw']);
$sql="SELECT
*
from
usuario
WHERE
login='$usuario'
clave='$password'";
//imprimir sentencia SQL
Oscar E Capuay Uceda
and
242
Seguridad Web
echo $sql;
?>
Resultado Web:
243
Seguridad Web
Sesiones
Las sesiones en PHP son un mecanismo para preservar datos a lo largo de
varios accesos lo que permite construir aplicaciones Web ms
personalizadas.
A cada visitante que accede a su Web se le asigna un identificador nico,
llamado "session id" (identificador de sesin). ste se almacena en una
cookie por parte del usuario o se propaga en la URL.
Las Cookies sirven para almacenar datos en el navegador del usuario. Se
pueden poner cookies usando la funcin setcookie(). Las Cookies son parte
de la cabecera HTTP, por tanto la funcin setcookie() debe ser llamada
antes de que se produzca cualquier salida al navegador.
El soporte de las sesiones le permite registrar un nmero arbitrario de
variables que se conservarn en las siguientes peticiones. Cuando un
visitante acceda a su Web, PHP comprobar automticamente (si
session.auto_start est puesto a 1) o cuando usted lo especifique (de forma
explcita mediante session_start() o implcita a travs de session_register())
si se le ha enviado un "session id" especfico con su peticin, en cuyo caso
se recrean las variables que se haban guardado anteriormente.
Todas las variables registradas son almacenadas tras finalizar la peticin.
Las variables que estn indefinidas se marcan como no definidas. En los
subsiguientes accesos, no estarn definidas por el mdulo de sesiones a
menos que el usuario las defina ms tarde.
Las opciones de configuracin track_vars y register_globals influyen
notablemente en la forma en que las variables de la sesin se almacenan y
restauran. A partir de PHP 4.0.3, track_vars siempre est activado. A partir
de PHP 4.1.0, $_SESSION est disponible como variable global, al igual que
$_POST,
$_GET,
$_REQUEST
y
dems.
Al
contrario
que
$HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se
debe usar global para $_SESSION.
Si track_vars est activado y register_globals est desactivado, slo los
miembros del vector asociativo global $HTTP_SESSION_VARS pueden ser
registrados como variables de la sesin. Las variables restauradas de la
sesin slo estarn disponibles en el vector $HTTP_SESSION_VARS.
Se recomienda usar $_SESSION (o $HTTP_SESSION_VARS con PHP
4.0.6 o inferior) por seguridad y para hacer el cdigo ms legible. Con
$_SESSION o $HTTP_SESSION_VARS, no es necesario usar las funciones
session_register() / session_unregister() / session_is_registered(). Los
usuarios pueden acceder a una variable de la sesin como si se tratase de
una variable normal.
Si register_globals est activado, todas las variables globales pueden ser
registradas como variables de la sesin, y las variables de la sesin sern
restauradas a sus correspondientes variables globales. Como PHP debe
Oscar E Capuay Uceda
244
Seguridad Web
saber qu variables globales estn registradas como variables de la sesin,
los usuarios deben registrar las variables con la funcin session_register(),
mientras que con $HTTP_SESSION_VARS/$_SESSION no es necesario
usar session_register().
Si est usando $HTTP_SESSION_VARS/$_SESSION y desactiva
register_globals, no use session_register(), session_is_registered() ni
session_unregister().
Se recomienda desactivar register_globals por motivos de seguridad y
rendimiento.
Ejemplo 113:
ingreso01.php
<form action="verifica01.php" method="post">
<table
width="70%"
border="0"
cellspacing="1"
align="center">
<caption>
Acceso al sistema
</caption>
cellpadding="2"
<tr>
<td>Usuario</td>
<td><input type="text" name="txtusuario" id="txtusuario" maxlength="20">
</td>
</tr>
<tr>
<td>Password</td>
<td><input
name="txtclave"
type="password"
id="txtclave"
maxlength="50"></td>
</tr>
<?php
if($_GET['error']==1) {
?>
<tr><td colspan="2">Datos Incorrectos</td></tr>
<?php } ?>
<tr>
<th
colspan="2"><input
type="submit"
name="Submit"
value="Entrar"></th>
</tr>
</table>
</form>
<?php
echo "Su dirección IP es: ".$_SERVER['REMOTE_ADDR'];
?>
<br>
<?php
echo "Navegador: ".$_SERVER['HTTP_USER_AGENT'];
?>
Oscar E Capuay Uceda
245
Seguridad Web
<br>
<?php
echo "Idioma: ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];
?>
Resultado Web:
Ejemplo 114:
verifica01.php
<?php
include "mysqli-conexion.php"; //incluimos la conexion
//Proteger de caracteres especiales a la sentencia SQL
$usuario =$mysqli->real_escape_string($_POST['txtusuario']);
$clave =$mysqli->real_escape_string($_POST['txtclave']);
//ciframos la clave escrita por el usuario para compararla en la BD
$clave=md5($clave);
//sentencia sql
$sql="select * from usuario where login='$usuario' and clave='$clave'";
//ejecutamos la consulta
$rsusuario=$mysqli->query($sql) or die($mysqli->error);
if($rsusuario->num_rows==1)
{
//datos correctos
$reg=$rsusuario->fetch_object();
session_start();
$_SESSION['idusuario']=$reg->idusuario;
$_SESSION['usuario']=$reg->usuario;
246
Seguridad Web
$_SESSION['tipo']=$reg->tipo;
} else header("location: ingreso01.php?error=1");
?>
Probamos con datos incorrectos.
247
Seguridad Web
Autenticacin HTTP
auth01.php
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Sistema Web"');
header('HTTP/1.0 401 Unauthorized');
echo 'Operación cancelada';
exit;
} else {
echo "<p>Bienvenido {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Acceso al sistema con password:
{$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>
Resultado Web:
248
Seguridad Web
Si cancelamos la operacin tenemos el siguiente resultado en el navegador,
segn lo establecido en el cdigo.
249
Seguridad Web
Login
Ahora que ya tenemos el script de autenticacin de usuarios,
desarrollaremos el script para verificar el nombre de usuario y contrasea en
la base de datos. Utilizaremos una tabla usuario, con campos que contengan
el nombre y contrasea del usuario.
250
Seguridad Web
Como podemos observar en la figura anterior, para ingresar un nuevo
registro debemos aplicar la funcin md5 a la contrasea del usuario.
Ahora desarrollaremos el script de logeo de usuarios. Para ello podremos
usar como mecanismo de ingreso de datos el script de autenticacin
desarrollado en el tema anterior o usar un formulario HTML como el
siguiente:
Ejemplo 116:
entrar.php
<HTML>
<HEAD>
<TITLE>Login</TITLE>
</HEAD>
<BODY>
<form name="form1" action="logeo.php" method="post">
<table align="center" width="50%">
<tr><th colspan="2">Ingreso al sistema</th></tr>
<tr><td>Usuario</td>
<td><input type="text" name="txtusuario"></td></tr>
<tr><td>Password</td>
<td><input type="password" name="txtclave"></td></tr>
<tr><th colspan="2"><input type="submit" value="Entrar"></th></tr>
</table>
<?php
if($_GET['error']==1) echo "Datos Incorrectos";
if($_GET['error']==2) echo "Debe logearse";
?>
</form>
</BODY>
</HTML>
Resultado Web:
251
Seguridad Web
Ejemplo 117:
Logeo de usuarios
logeo.php
<?php
include "mysqli-conexion.php";
$usuario=$mysqli->real_escape_string($_POST['txtusuario']);
$clave=md5($_POST['txtclave']);
$sql="select * from usuario where login='$usuario' and clave='$clave'";
$rsusuario=$mysqli->query($sql) or die($mysqli->error);
if($rsusuario->num_rows==1) {
$registro=$rsusuario->fetch_object();
session_start();
$_SESSION['sidusuario']= $registro->idusuario;
$_SESSION['susuario']= $usuario;
header("location: mysqli-listado-logeado.php");
}
else header("location: entrar.php?error=1");
?>
En este script utilizamos el mtodo real_escape_string. Esta funcin es
usada para crear una cadena SQL sin inyeccin SQL. Los caracteres
codificados son NULL (ASCII 0), \n, \r, \, ', ", y Control-Z. Adems usamos la
funcin md5 para cifrar la clave escrita en el formulario y compararla con la
cadena cifrada guardada en la base de datos.
Si el nmero de registros es 1 (uno), significa que los datos son correctos y
pertenecen a uno y solo un usuario (no pueden haber varios usuarios con el
mismo nombre). Por lo que debemos iniciar una sesin utilizando la funcin
session_start. El apoyo que PHP proporciona para las sesiones consiste en
una forma de conservar ciertos datos a lo largo de los subsiguientes
accesos, lo cual le permite construir aplicaciones ms personalizadas e
incrementar el atractivo de su sitio Web.
Utilizaremos tambin, al array $_SESSION[] para registrar las variables de
sesin de nuestra aplicacin, en este caso especfico, para registrar el
identificador del usuario (idusuario) y su nombre de usuario (usuario).
A partir de PHP 4.1.0, $_SESSION est disponible como variable global, al
igual que $_POST, $_GET, $_REQUEST y dems. Al contrario que
$HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se
debe usar global para $_SESSION.
Cuando los datos ingresados son incorrectos, retornar a la pgina inicial, de
lo contrario el script redirecciona el navegador hacia el listado de personas
(archivo: mysqli-listado.php), el cual, tiene dos nuevas lneas de cdigo con
respecto al ejemplo 76.
252
Seguridad Web
Resultado Web cuando los datos son incorrectos
mysqli-listado-logeado.php
<?php
session_start();
if(!isset($_SESSION['sidusuario'])) header("location: entrar.php?error=2");
include "mysqli-conexion.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=$mysqli->query($sql) or die($mysqli->error);
echo "Usuario:" . $_SESSION['susuario'];
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Editar</th>
<th>Eliminar</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch_object())
{ ?>
<tr>
<td><?php echo "$registro->idpersona"?></td>
<td><?php echo "$registro->nombres"?></td>
<td><?php echo "$registro->apellidos"?></td>
Oscar E Capuay Uceda
253
Seguridad Web
<td><a
href="mysqli-editar.php?idpersona=<?php
echo
>idpersona"?>">editar</a></td>
<td><a
href="mysqli-eliminar.php?idpersona=<?php
echo
>idpersona"?>">eliminar</a></td>
</tr>
<?php
}
$rspersona->close(); //cerramos resultado de la consulta
$mysqli->close(); //cerr=amos la conexin
?>
</table>
<br>
<a href="formulario08.html">Agregar Registro</a>
"$registro"$registro-
Resultado Web:
254
Seguridad Web
CAPTCHA
Este nombre proviene del acrnimo de: Completely Automatic Public Turing
Test to Tell Computers and Humans Apart, que traducido al espaol
significa: Prueba de Turing pblica y automtica para diferenciar a mquinas
y humanos.
Se trata de una prueba desafo-respuesta utilizada en computacin para
determinar cundo el usuario es o no humano. El trmino se empez a
utilizar en el ao 2000 por Luis von Ahn, Manuel Blum y Nicholas J. Hopper
de la Carnegie Mellon University, y John Langford de IBM.
La tpica prueba consiste en que el usuario introduzca un conjunto de
caracteres que se muestran en una imagen distorsionada que aparece en
pantalla. Se supone que una mquina no es capaz de comprender e
introducir la secuencia de forma correcta por lo que solamente el humano
podra hacerlo.
Como el test es controlado por una mquina en lugar de un humano como
en la Prueba de Turing, tambin se denomina Prueba de Turing Inversa.
Los CAPTCHAs son utilizados para evitar que robots, tambin llamados
spambots, puedan utilizar ciertos servicios. Por ejemplo, para que no puedan
participar en encuestas, registrarse para usar cuentas de correo electrnico
(o su uso para envo de correo basura) o, ms recientemente, para evitar
que correo basura pueda ser enviado por un robot (el remitente debe pasar
el test antes de que se entregue al destinatario). [8]
El sistema CAPTCHA tiene las siguientes caractersticas por definicin:
Son completamente automatizados, es decir, no es necesario ningn
tipo de mantenimiento / intervencin humana para su realizacin.
Esto supone grandes beneficios en cuanto a fiabilidad y coste.
El algoritmo utilizado es pblico. De esta forma la ruptura de un
captcha pasa a ser un problema de inteligencia artificial y no la
ruptura de un algoritmo secreto.
A continuacin construiremos con PHP un CAPTCHA.
El primer paso es disear y programar el formulario en el que aparecer
nuestro CAPTCHA:
Ejemplo 119:
Formulario CAPTCHA
form-catcha.php
<?php
session_start();
if(isset($_POST["palabra"])) {
if($_POST["palabra"] == $_SESSION["oculto"])
die("Felicidades! Ha ledo correctamente la palabra.");
else
Oscar E Capuay Uceda
255
Seguridad Web
die("No has adivinado la palabra. Prueba otra vez");
} else {
?>
<form method="post" action="">
<img src="capu-captcha.php">
<input type="text" name="palabra">
<input type="submit" value="Comprobar">
</form>
<?php
}
?>
Ejemplo 120:
Generador CAPTCHA
capu-captcha.php
<?php
session_start();
// estas cabeceras evitan que se almacene la imagen en el cach
header ("Expires: Sat, 12 Jul 2008 09:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-store, no-cache, must-revalidate");
header ("Cache-Control: post-check=0, pre-check=0", false);
header ("Pragma: no-cache");
// creamos la imagen con el tamao determinado
$imagen = imagecreate(250, 100);
// elegimos los colores para el fondo y el texto
$rojo = mt_rand(150,200);
$verde = mt_rand(150,200);
$azul = mt_rand(200,250);
$rojo_fondo = mt_rand(80,120);
$verde_fondo = mt_rand(80,120);
$azul_fondo = mt_rand(80,200);
$rojo_basura = $rojo+55;
$verde_basura = $verde+55;
$azul_basura = $azul+5;
$color_texto = imagecolorallocate($imagen,$rojo,$verde,$azul);
$color_fondo =
imagecolorallocate($imagen,$rojo_fondo,$verde_fondo,$azul_fondo);
$color_basura =
imagecolorallocate($imagen,$rojo_basura,$verde_basura,$azul_basura);
//aplicamos el color de fondo
imagefill($imagen,0, 0, $color_fondo);
// construimos la palabra
$caracteres =
"ABCDEFGHJKMNPRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";
Oscar E Capuay Uceda
256
Seguridad Web
//indicar la cantidad de caracteres que tendr la palabra del CAPTCHA
$cantidad=6;
for($i=1;$i<=$cantidad;$i++) {
$pos = mt_rand(0,strlen($caracteres)-1);
$palabra.= substr($caracteres,$pos,1);
}
// comprobamos la existencia de la funcin ImageTTFText()
$fontsList = array(
"./fonts/VeraMoBd.ttf",
"./fonts/VeraMoBI.ttf",
"./fonts/VeraMono.ttf",
"./fonts/VeraMoIt.ttf"
);
$randFontNo = mt_rand(0, sizeof($fontsList)-1);
$randFontPath = realpath($fontsList[ $randFontNo ]);
// al azar las seales al fondo del respectivo texto ImageTTFText
for($i=1;$i<20;$i++){
$x
= mt_rand(0, 250); // pos x
$y
= mt_rand(0, 100); // pos y
$car = chr(mt_rand(45, 250)); //caracter aleatorio
$angulo = mt_rand(3,180);
imagettftext($imagen, 12, $angulo, $x, $y, $color_basura,
$randFontPath, $car);
}
// imprimir la palabra
$x = mt_rand(10,120);
$y = mt_rand(40,65);
imagettftext($imagen, 28, mt_rand(-10,10), $x, $y, $color_texto,
$randFontPath, $palabra);
//ensuciamos la imagen con lneas
for($i=1;$i<60;$i++){
$x = mt_rand(0, 250);
$y = mt_rand(0, 100);
imageline($imagen, $x, $y, $x+mt_rand(-40,40), $y+mt_rand(40,40), $color_basura);
}
// enviamos mediante la sesin la palabra elegida
$_SESSION["oculto"] = $palabra;
// enviamos la cabecera correspondiente al navegador y luego la imagen
header("Content-type: image/png");
imagepng($imagen);
// eliminamos la imagen
imagedestroy($imagen);
?>
257
Seguridad Web
Resultados Web:
Podemos ver a continuacin varios ejemplos de los CAPTCHAs generados.
258
Ver configuracin GD
gdinfo.php
<?php
var_dump(gd_info());
?>
Resultado Web:
Mi primera imagen
imagen01.php
<?php
$im = imagecreate(100, 50);
$color_fondo = imagecolorallocate($im, 255, 55, 55);
$color_texto = imagecolorallocate($im, 233, 214, 51);
imagestring($im, 2, 5, 5, "Texto de prueba", $color_texto);
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
?>
Oscar E Capuay Uceda
259
260
Grfico de barras
imagen03.php
<?php
header("Content-type: image/jpeg");
$img=imagecreate(500,500);
$color_azul=imagecolorallocate($img,50,50,255);
$color_amarillo=imagecolorallocate($img,255,255,0);
$verde=imagecolorallocate($img,0,255,0);
imageline($img,50,50,50,450,$color_amarillo);
imageline($img,50,450,450,450,$color_amarillo);
imagefilledrectangle($img,100,350,150,450,$verde);
imagefilledrectangle($img,200,250,250,450,$verde);
imagefilledrectangle($img,300,150,350,450,$verde);
imagefilledrectangle($img,400,50,450,450,$verde);
imagestring($img,4,220,30,"Grafico Ejemplo",$color_amarillo);
imagejpeg($img);
imagedestroy($img);
?>
Resultado Web:
261
262
imagen05.php
<?php
$aleatorio = rand(1,8);
for($i=0;$i<=$aleatorio;$i++){$datos[$i]=rand(2,50);};//llenamos el array de
datos.
$ancho='600';$alto='400';//ancho y alto de la imagen
$cx = '300';$cy ='150'; //coordenadas de la figura
$sx = '600';$sy='300';$sz ='100';// dimensiones X,Y,Z
$datos_sum = array_sum($datos);
//angulos
for($i=0;$i<=$aleatorio;$i++){
$angulo[$i] = (($datos[$i] / $datos_sum) * 360);
$angulo_sum[$i] = array_sum($angulo);
};
$im = imagecreate ($ancho,$alto);
$fondo = imagecolorallocate($im, 255, 255, 255);
//colores aleatorios
for($i=0;$i<=$aleatorio;$i++){
$r=rand(50,255);$g=rand(50,255);$b=rand(50,255);
$colors[$i] = imagecolorallocate($im,$r,$g,$b);
$colord[$i] = imagecolorallocate($im,($r/1.5),($g/1.5),($b/1.5));
}
for($z=1;$z<=$sz;$z++){
imagefilledarc($im,$cx,($cy+$sz)$z,$sx,$sy,0,$angulo_sum[0],$colord[0],IMG_ARC_EDGED);
for($i=1;$i<=$aleatorio;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angulo_sum[$i1],$angulo_sum[$i],$colord[$i],IMG_ARC_NOFILL);
}
}
imagefilledarc($im,$cx,$cy,$sx,$sy,0 ,$angulo_sum[0], $colors[0],
IMG_ARC_PIE);
for($i=1;$i<=$aleatorio;$i++){
imagefilledarc($im,$cx,$cy,$sx,$sy,$angulo_sum[$i-1] ,$angulo_sum[$i],
$colors[$i], IMG_ARC_PIE);
}
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
La funcin rand tiene dos parmetros opcionales que sirven para especificar
el valor mnimo y mximo del nmero aleatorio que se quiere obtener.
Oscar E Capuay Uceda
263
Crculo
imagen06.php
<?php
// crear una imagen de 200*200
$img = imagecreate(200, 200);
// definir los colores
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
// dibujar un circulo negro
imagearc($img, 100, 100, 150, 150, 0, 360, $black);
Oscar E Capuay Uceda
264
265
Archivos PDF
Las funciones PDF en PHP pueden crear archivos PDF utilizando la
biblioteca PDFlib. Esta biblioteca est disponible para descargar en
http://www.pdflib.com/products/pdflib-family/, pero requiere la compra de una
licencia para uso comercial. Debido a que la licencia de PDFLib tiene
limitaciones para su uso comercial, en este libro veremos el uso de una clase
que tiene el mismo fin, su nombre es: FPDF.
FPDF
FPDF es una clase escrita en PHP que permite generar documentos PDF
directamente desde PHP, es decir, sin usar la biblioteca PDFlib.
FPDF es freeware. No hay limitaciones de uso. Puede usarlo libre y
gratuitamente en su aplicacin comercial o no, con o sin modificaciones.
Entre las ventajas ms resaltantes de FPDF tenemos: funciones de alto
nivel. Esta es una lista de sus principales caractersticas:
266
FPDF
pdf01.php
<?php
define('FPDF_FONTPATH','font/'); //directorio de las fuentes
require('fpdf.php'); //llamamos a la clase FPDF
$pdf=new FPDF(); //instanciamos la clase
$pdf->AddPage(); //agregamos la primera pgina
$pdf->SetFont('Courier','',16);//establecemos la fuente y sus atributos
$pdf->cell(10); //celda de 10mm de ancho
//celda de 0 ancho y 10mm de alto
$pdf->Cell(0,10,'Esta es una prueba FPDF',0,1);
$pdf->Output();
?>
Resultado Web:
267
268
<?php
define('FPDF_FONTPATH','font/'); //directorio de las fuentes
include('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(180,10,'GENERANDO PDFs CON FPDF',0,1,'C');
Oscar E Capuay Uceda
269
270
pdf03.php
<?php
define('FPDF_FONTPATH','font/');
require('fpdf.php');
//extensin de la clase FPDF
//extiende los mtodos de encabezado (header) y pie de pgina (footer)
class PDF extends FPDF
{
//Columna actual
var $col=0;
//Ordenada de comienzo de la columna
var $y0;
//personalizamos el encabezado
function Header()
{
global $title;
$this->SetFont('Arial','B',15);
$this->SetX(30);//(210-$w)/2);
$this->SetDrawColor(20,20,200);
$this->SetFillColor(255,255,180);
$this->SetTextColor(80,80,255);
$this->SetLineWidth(1);
$this->Cell(0,10,$title,1,1,'C',1);
//imagen que aparecer en el encabezado
$this->Image('imagenes/correo.jpg',11,10,16);
$this->Ln(10);
//Guardar ordenada
$this->y0=$this->GetY();
}
//personalizamos el pie de pgina
function Footer()
{
$this->SetY(-15);
$this->SetFont('Arial','I',8);
$this->SetTextColor(128);
$this->Cell(0,10,'Pgina '.$this->PageNo(),0,0,'C');
}
271
function ChapterTitle($num,$titulo)
{
$this->SetFont('Arial','B',13);
$this->SetFillColor(215,215,255);
$this->Cell(0,6,"Captulo $num : $titulo",0,1,'L',1);
$this->Ln(4);
$this->y0=$this->GetY();
}
function ChapterBody($fichier)
{
$f=fopen($fichier,'r');
$txt=fread($f,filesize($fichier));
fclose($f);
$this->SetFont('Arial','',12);
Oscar E Capuay Uceda
272
273
pdf04.php
<?php
define('FPDF_FONTPATH','font/');
require_once "fpdf.php";
require_once "mysqli-conexion.php";
$sql="select * from persona";
$rspersona=$mysqli->query($sql) or die($mysqli->error);
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(180,10,'Listado de Personas',0,1,'C');
$pdf->Ln();
Oscar E Capuay Uceda
274
275
Archivos XLS
Los archivos XLS pueden ser generados en PHP utilizando la funcin
header() para establecer los encabezados del archivo que vamos a generar,
en este caso escribiremos:
header("Content-type: application/vnd.ms-excel");
Veamos un primer ejemplo.
Ejemplo 131:
XLS simple
xls01.php
<?php
// Enviamos los encabezados de hoja de calculo
header("Content-type: application/vnd.ms-excel");
// Creamos la tabla
$letra = array ("A","B","C","D","E","F","G","H","I","J");
?>
<table>
<?php
$filas=10;
$columnas=10;
for ($i=0;$i<$filas;$i++){
?>
<tr>
<?php
for ($j=0;$j<$columnas;$j++){
?>
<td>
<?php
echo $i . $j;
?>
</td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
Resultado:
Note que aparece la ventana de descarga para el archivo xls01.php y es
reconocido como archivo xls (Microsoft Office Excel).
276
xls02.php
<?PHP
header("Content-type: application/vnd.ms-excel");
//indicamos el nombre del archivo que se va a generar
header("Content-Disposition: filename='resumen.xls'");
?>
<table border=1>
277
278
Ejemplo 133:
xls03.php
<?php
//incluimos los archivos
require_once("excel.php");
require_once("excel-ext.php");
//llenamos el array data con datos de prueba
$data = array(
array("Nombre"=>"Carlos", "Nota"=>18),
array("Nombre"=>"Kelly", "Nota"=>18),
array("Nombre"=>"Dante", "Nota"=>17),
array("Nombre"=>"Oscar", "Nota"=>14)
);
//creamos el archivo XLS
createExcel("ejemplo3.xls", $data);
?>
279
xls04.php
<?php
//incluimos los archivos
require_once("excel.php");
require_once("excel-ext.php");
//Conexion a MySQL
$con = mysql_connect("localhost","root","");
mysql_select_db("dbdemo", $con);
//sentencia sql
$sql = "SELECT * FROM persona";
//ejecutar la sentencia sql
$res = mysql_query($sql, $con) or die(mysql_error());
// Creamos el array con los datos
while($reg = mysql_fetch_assoc($res)) $data[] = $reg;
// Generamos el Excel
createExcel("personas.xls", $data);
?>
280
xls05.php
<?php
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: filename=\"listado.xls\"");
include "mysqli-conexion.php"; //incluimos la conexion
//consulta sql
$sql="select * from persona";
//ejecucion de la sentencia sql
$rspersona=$mysqli->query($sql) or die($mysqli->error);
?>
<table>
<tr>
<th>Id</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>E-Mail</th>
<th>Teléfono</th>
</tr>
<?php
//mostrar los registros
while($registro=$rspersona->fetch_object())
{ ?>
<tr>
<td><?php echo "$registro->idpersona"?></td>
<td><?php echo "$registro->nombres"?></td>
<td><?php echo "$registro->apellidos"?></td>
<td><?php echo "$registro->email"?></td>
Oscar E Capuay Uceda
281
282
PHP + AJAX
AJAX
AJAX, acrnimo de Asynchronous JavaScript And XML (JavaScript
asncrono y XML), es una tcnica de desarrollo web para crear aplicaciones
interactivas o RIA (Rich Internet Applications). stas se ejecutan en el
cliente, es decir, en el navegador de los usuarios y mantiene comunicacin
asncrona con el servidor en segundo plano. De esta forma es posible
realizar cambios sobre la misma pgina sin necesidad de recargarla. Esto
significa aumentar la interactividad, velocidad y usabilidad en la misma.
AJAX es una combinacin de cuatro tecnologas ya existentes:
283
PHP + AJAX
Esta tcnica funcion en ambos navegadores, Internet Explorer versin 4 y
Netscape Navigator versin 4. Microsoft la utiliz en el Outlook Web Access
provisto con la versin 2000 de Microsoft Exchange Server.
La comunidad de desarrolladores web, primero colaborando por medio del
grupo de noticias microsoft.public.scripting.remote y despus usando blogs,
desarrollaron una gama de tcnicas de scripting remoto para conseguir los
mismos resultados en diferentes navegadores. Los primeros ejemplos
incluyen la librera JSRS en el ao 2000, la introduccin a la tcnica
imagen/cookie en el mismo ao y la tcnica JavaScript bajo demanda
(JavaScript on Demand) en 2002. En ese ao, se realiz una modificacin
por parte de la comunidad de usuarios al Microsoft's Remote Scripting para
reemplazar el applet Java por XMLHttpRequest.
Frameworks de Scripting Remoto como el ARSCIF aparecieron en 2003
poco antes de que Microsoft introdujera Callbacks en ASP. NET.
Desde que XMLHttpRequest est implementado en la mayora de los
navegadores, raramente se usan tcnicas alternativas. Sin embargo, todava
se utilizan donde se requiere una mayor compatibilidad, una reducida
implementacin, o acceso cruzado entre sitios Web. Una alternativa, el
Terminal SVG (basado en SVG), emplea una conexin persistente para el
intercambio continuo entre el navegador y el servidor.[6]
XAJAX
XAJAX es una librera PHP que Ud puede incluir en su script PHP para
proveer una forma fcil en sus pginas Web la llamada a funciones o
mtodos de objetos usando AJAX (Asynchronous JavaScript And XML).
Simplemente registra una o mas funciones/mtodos con el objeto xajax
quien retorna XML como respuesta y agrega una sentencia en su cabecera
HTML para incluir un archivo de JavaScript y ejecutar un proceso que
muestre el resultado desde alguna parte del HTML, para ello agregamos una
simple llamada a una funcin de JavaScript en su HTML, y XAJAX se
encarga del resto! [7]
A mi parecer es una de las mejores libreras para trabajar con PHP y AJAX,
la versin que utilizaremos es la 0.2.5 (estable). Esta librera ha sido
desarrollada por: Jared White ([email protected]), J. Max Wilson
([email protected]) y Eion Robb ([email protected]) y el
sitio Web oficial es: http://www.xajaxproject.org.
Veamos ahora algunos ejemplos.
Ejemplo 135:
xajax01.php
<?php
require ('xajax/xajax.inc.php');
284
PHP + AJAX
//implementamos la funcion que imprime el texto en el textbox
function frase($texto)
{
$objResponse = new xajaxResponse();
//asignar $texto en la propiedad "value" del objeto "text1"
$objResponse->addAssign("text1","value",$texto);
return $objResponse;
}
// Instanciamos xajax.
$xajax = new xajax();
// Funciones que sern llamadas desde JavaScript
$xajax->registerFunction("frase");
// Procesar cualquier requerimiento
// Debe ser llamado antes de cualquier cabecera o salida HTML
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax01</title>
<?php
//esta orden debe estar dentro de las etiquetas <head> y </head>
$xajax->printJavascript('xajax'); // directorio donde se encuentra el
archivo xajax.inc.php.
?>
</head>
<body style="text-align:center;">
<input type="text" id="text1" name="text1" value="" size="30" />
<input type="button" onclick="xajax_frase('esta es la frase de prueba')"
value="Primera Frase" />
<input type="button" onclick="xajax_frase('esta es otra frase')" value="Otra
Frase" />
</body>
</html>
Podemos notar en los botones la llamada a la funcin xajax_frase, la cual
enva como parmetro la frase que aparecer en la caja de texto.
Resultado Web:
285
PHP + AJAX
Ejemplo 136:
xajax02.php
<?php
require ('xajax/xajax.inc.php');
//implementamos la funcion que asugna HTML al DIV
function asig_html()
{
$html="<h1>Título Asignado</h1>Este es el HTML
asignado.";
$objResponse = new xajaxResponse();
$objResponse->addAssign("div1","innerHTML",$html);
return $objResponse;
}
// Instanciamos xajax.
$xajax = new xajax();
//Registramos la funcin
$xajax->registerFunction("asig_html");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax02</title>
<?php
//directorio donde se encuentra el archivo xajax.inc.php.
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<div id="div1"> texto inicial </div>
<input type="button" onclick="xajax_asig_html()" value="Asignar HTML" />
</body>
</html>
Resultado Web:
286
PHP + AJAX
Al hacer click en el botn, aparecer el siguiente resultado:
xajax03.php
<?php
//incluimos la clase xajax
require ('xajax/xajax.inc.php');
function prueba($num)
{
if ($num==0)
$texto = "Primer mensaje de prueba";
else
$texto = "Este es el segundo mensaje de prueba";
$objResponse = new xajaxResponse();
$objResponse->addAssign("division1","innerHTML",$texto);
return $objResponse;
}
function setColor($sColor)
{
$objResponse = new xajaxResponse();
$objResponse->addAssign("division1","style.color", $sColor);
return $objResponse;
}
// Instanciamos xajax.
$xajax = new xajax();
// Funciones que sern llamadas desde JavaScript
$xajax->registerFunction("prueba");
Oscar E Capuay Uceda
287
PHP + AJAX
$xajax->registerFunction("setColor");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax03</title>
<?php
//esta orden debe estar dentro de las etiquetas <head> y </head>
$xajax->printJavascript('xajax'); // directorio donde se encuentra el
archivo xajax.inc.php.
?>
</head>
<body style="text-align:center;">
<div id="division1" name="division1"> </div>
<br/>
<button onclick="xajax_prueba(0)">Primera Prueba</button>
<button onclick="xajax_prueba(1)">Segunda prueba</button>
<select
id="colores"
name="colores"
onchange="xajax_setColor(document.getElementById('colores').value);">
<option value="black" selected="selected">Negro</option>
<option value="red">Rojo</option>
<option value="green">Verde</option>
<option value="blue">Azul</option>
</select>
<script type="text/javascript">
// llama a la funcin de prueba al cargar la pgina
xajax_prueba(0);
// llama a la funcin SetColor al cargar la pgina
xajax_setColor(document.getElementById('colores').value);
</script>
</body>
</html>
Resultado Web:
288
PHP + AJAX
Podemos comprobar en este ejemplo a travs de nuestro navegador que la
frase cambia dependiendo del botn que presionemos y del color que
elijamos pero todo esto sin recargar la pgina, es decir, utilizando AJAX.
Ejemplo 138: Ocultar y Mostrar un DIV
xajax04.php
<?php
require ('xajax/xajax.inc.php');
function alternar($estado)
{
if($estado=="none") {
$valor="";
$texto="Ocultar";
}
else {
$valor="none";
$texto="Ver";
}
$objResponse = new xajaxResponse();
//asignacin a la propiedad display
$objResponse->addAssign("div1","style.display",$valor);
//asignacin del texto del botn
$objResponse->addAssign("boton1","value",$texto);
return $objResponse;
}
// Instanciamos xajax.
$xajax = new xajax();
//Registramos la funcin
$xajax->registerFunction("alternar");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax04</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<div id="div1" style="display: block"> texto del div </div>
<input
type="button"
id="boton1"
name="boton1"
onclick="xajax_alternar(document.getElementById('div1').style.display)"
value="Ocultar" />
</body>
</html>
Oscar E Capuay Uceda
289
PHP + AJAX
En este ejemplo analizamos display propiedad del estilo definido en la
etiqueta DIV. Si display es igual a none entonces el DIV es invisible sino se
puede ver su contenido. Por lo tanto, debemos modificar esa propiedad para
cambiar de visible a invisible o viceversa.
Para obtener el valor de display usamos la orden de javascript:
document.getElementById() que sirve para hacer referencia a un objeto
mediante su ID (Identificador), y luego especificamos la propiedad del estilo
que queremos obtener. Una vez obtenido el valor, ste ser enviado como
parmetro a la funcin alternar (xajax_alternar).
Resultado Web:
xajax05.php
<?php
require ('xajax/xajax.inc.php');
function numeros($numero)
{
for($i=1;$i<=$numero;$i++) {
$resultado.= $i . " ";
}
Oscar E Capuay Uceda
290
PHP + AJAX
$objResponse = new xajaxResponse();
$objResponse->addAssign("div1","innerHTML",$resultado);
return $objResponse;
}
// Instanciamos xajax.
$xajax = new xajax();
$xajax->registerFunction("numeros");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax05</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<input
type="text"
id="text1"
name="text1"
onkeyup="xajax_numeros(this.value)" />
<div id="div1" style="display: block"> texto del div </div>
</body>
</html>
Al final del ejemplo vemos la orden de javascript: this.value, la cual nos sirve
para obtener el valor del objeto actual, es decir, de la caja de texto: text1.
Resultado Web:
xajax06.php
<?php
require ('xajax/xajax.inc.php');
function imagen($ruta)
{
Oscar E Capuay Uceda
291
PHP + AJAX
$resultado="<img src='$ruta' alt='imagen con xajax'>";
$objResponse = new xajaxResponse();
$objResponse->addAssign("divimagen","innerHTML",$resultado);
return $objResponse;
}
$xajax = new xajax();
$xajax->registerFunction("imagen");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax06</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<div id="divimagen"></div>
<select id="lista" name="lista" onchange="xajax_imagen(this.value)">
<option value="">[seleccione una imagen]</option>
<option value="imagenes/correo.jpg">Correo</option>
<option value="imagenes/grafico.jpg">Gráfico</option>
<option value="imagenes/navegador.jpg">Navegador</option>
<option value="imagenes/teclado.jpg">Teclado</option>
</select>
</body>
</html>
La funcin imagen definida en este ejemplo inserta la etiqueta IMG en el DIV
para mostrar la imagen seleccionada a travs de la lista desplegable, la cual,
en su evento ochange enva la ruta de la imagen que se mostrar.
Resultado Web:
292
PHP + AJAX
Al seleccionar un elemento de la lista se mostrar la imagen elegida.
xajax07.php
<?php
require ('xajax/xajax.inc.php');
Oscar E Capuay Uceda
293
PHP + AJAX
function nuevo_codigo($objeto,$codigo_js)
{
$objResponse = new xajaxResponse();
$objResponse->addEvent("$objeto","onclick",$codigo_js);
return $objResponse->getXML();
}
$xajax = new xajax();
$xajax->registerFunction("nuevo_codigo");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax07</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<input type="button" name="boton1" id="boton1" value="Boton 1" onclick=""
/>
<input
type="button"
value="abrir
ventana"
onclick="xajax_nuevo_codigo('boton1','open(\'md5.php\',\'w1\',\'\')')" />
<input
type="button"
value="alert"
onclick="xajax_nuevo_codigo('boton1','alert(\'ejemplo de xajax\')')" />
</body>
</html>
Con el mtodo addEvent se puede establecer el cdigo de javascript que
ser ejecutado en un evento de un objeto determinado. Por lo tanto,
necesitamos tres parmetros: objeto, evento y cdigo.
Resultado Web:
294
PHP + AJAX
xjax08.php
<?php
require ('xajax/xajax.inc.php');
function datos($formulario)
{
//los indices son los nombres de los objetos del formulario
$frase=$formulario['text1'];
//contamos los elementos seleccionados
$cantidad=count($formulario['chk']);
$resultado="la frase es:" . $frase . "\n";
$resultado.=$cantidad . " temas seleccionados";
$objResponse = new xajaxResponse();
$objResponse->addAlert($resultado);
return $objResponse;
}
$xajax = new xajax();
Oscar E Capuay Uceda
295
PHP + AJAX
$xajax->registerFunction("datos");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax08</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<form id="form1" name="form1">
Frase <input type="text" size="40" name="text1" id="text1" /><br />
Temas:<br />
<input type="checkbox" id="chk[]" name="chk[]" value="php" /> PHP<br />
<input type="checkbox" id="chk[]" name="chk[]" value="javascript" />
JavaScript<br />
<input type="checkbox" id="chk[]" name="chk[]" value="css" /> CSS<br />
<input
type="button"
name="boton1"
id="boton1"
value="Aceptar"
onclick="xajax_datos(xajax.getFormValues('form1'))" />
</body>
</html>
El mtodo addAlert ejecuta la funcin alert() de javascript desde el cdigo
AJAX.
Para obtener los valores de los objetos del formulario utilizamos el mtodo
getFormValues de la clase xajax en javascript.
Resultado Web:
296
PHP + AJAX
Ejemplo 143:
xajax09.php
<?php
require ('xajax/xajax.inc.php');
function datos($formulario)
{
//los indices son los nombres de los objetos del formulario
$frase=$formulario['text1'];
//contamos los elementos seleccionados
$cantidad=count($formulario['chk']);
$resultado = "La frase es:" . $frase . "\n";
$resultado.= $cantidad . " temas seleccionados";
$objResponse = new xajaxResponse();
$objResponse->addAlert($resultado);
return $objResponse;
}
$xajax = new xajax();
$xajax->registerFunction("datos");
$xajax->processRequests();
?>
Oscar E Capuay Uceda
297
PHP + AJAX
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>xajax08</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
<form id="form1" name="form1">
Frase <input type="text" size="40" name="text1" id="text1" value="texto de
prueba" disabled="disabled" /><br />
Temas:<br />
<input type="checkbox" id="chk[]" name="chk[]" value="php" /> PHP<br />
<input type="checkbox" id="chk[]" name="chk[]" value="javascript" />
JavaScript<br />
<input type="checkbox" id="chk[]" name="chk[]" value="css" /> CSS<br />
<input type="button" name="boton1" id="boton1" value="Enviar sin
deshabilitados" onclick="xajax_datos(xajax.getFormValues('form1'))" />
<input type="button" name="boton1" id="boton1" value="Enviar con
deshabilitados" onclick="xajax_datos(xajax.getFormValues('form1',true))" />
</body>
</html>
La diferencia est en el uso de la orden xajax.getFormValues, en la cual se
debe incluir un segundo parmetro (true) para obtener los valores
incluyendo los objetos deshabilitados.
Resultado Web:
298
PHP + AJAX
299
PHP + AJAX
Error comn
Uno de los errores comunes que aparecen cuando usamos xajax, es el
siguiente:
xajax_errorcomun.php
-- inicio del archivo --<?php
require ('xajax/xajax.inc.php');
function datos($formulario)
{
$frase=$formulario['text1'];
$cantidad=count($formulario['chk']);
$resultado = "La frase es:" . $frase . "\n";
$resultado.= $cantidad . " temas seleccionados";
$objResponse = new xajaxResponse();
$objResponse->addAlert($resultado);
return $objResponse;
}
$xajax = new xajax();
$xajax->registerFunction("datos");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-- continua el archivo --Oscar E Capuay Uceda
300
PHP + AJAX
xajax_buscar.php
<?php
require "pagina12.php"; //conexion a la base de datos dbdemo
require "xajax/xajax.inc.php";
function buscar($id)
{
if($id>0) {
$rs=mysql_query("select * from persona where idpersona=$id");
if(mysql_num_rows($rs)>0) {
$registro=mysql_fetch_array($rs);
$nombrecompleto=$registro['nombres'] . " " .
$registro['apellidos'];
}
else {
$nombrecompleto="no se encontr el codigo
ingresado";
}
}
$resultado=htmlentities($nombrecompleto);
$objResponse = new xajaxResponse();
$objResponse->addAssign("label1","innerHTML",$resultado);
return $objResponse;
}
$xajax = new xajax();
$xajax->registerFunction("buscar");
$xajax->processRequests();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Buscar</title>
<?php
$xajax->printJavascript('xajax');
?>
</head>
<body style="text-align:center;">
IdPersona
<input
type="text"
size="3"
name="text1"
id="text1"
onkeyup="xajax_buscar(this.value)" />
<label id="label1"></label>
</body>
</html>
301
PHP + AJAX
En el ejemplo, enviamos el ID de la persona a la funcin buscar
(xajax_buscar) para que sea consultado y luego mostramos el nombre de la
persona con dicho Id.
Resultado Web:
302
PHP + AJAX
xajax_controlador_persona.php
<?php
require_once ("xajax_modelo_persona.php");
include ("xajax_logica_persona.php");
$nrxp=5; //numero de registros por pagina
$titulo = "Personas";
include ("xajax_vista_persona.php");
?>
xajax_logica_persona.php
<?php
require_once ("xajax/xajax.inc.php");
require_once ("xajax_modelo_persona.php");
$xajax = new xajax();
function guardar($formulario){
$objpersona = new clspersona();
if($formulario[accion]=="insertar"){
$ssql="insert into persona (nombres, apellidos, email, telefono)
values ('".$formulario['nombres']."', '".$formulario['apellidos']."',
'".$formulario['email']."','".$formulario['telefono']."')";
if ($objpersona->comando($ssql))
$salida = "Insertado correctamente";
else $salida = "No se ha insertado.";
}
else{
$sql="update persona set nombres='". $formulario['nombres'] ."',
apellidos='". $formulario['apellidos'] ."', email='". $formulario['email'] ."',
telefono='". $formulario['telefono'] ."' where idpersona='".
$formulario['idpersona']. "'";
if ($objpersona->comando($sql))
$salida = "Editado correctamente";
else $salida = "No se ha editado.";
}
$respuesta = new xajaxResponse();
$respuesta->addAssign("mensaje","innerHTML",$salida);
return $respuesta;
}
303
PHP + AJAX
function ver_datos($id){
$objpersona = new clspersona();
$ssql="select * from persona where idpersona='$id'";
$objpersona->consulta($ssql);
$reg=$objpersona->leer_registro();
$respuesta = new xajaxResponse();
$respuesta->addAssign("nombres", "value", $reg['nombres']);
$respuesta->addAssign("apellidos", "value", $reg['apellidos']);
$respuesta->addAssign("email", "value", $reg['email']);
$respuesta->addAssign("telefono", "value", $reg['telefono']);
$respuesta->addAssign("accion", "value", "editar");
return $respuesta;
}
function limpiar(){
$respuesta = new xajaxResponse();
$respuesta->addAssign("nombres", "value", "");
$respuesta->addAssign("apellidos", "value", "");
$respuesta->addAssign("email", "value", "");
$respuesta->addAssign("telefono", "value", "");
$respuesta->addAssign("accion", "value", "insertar");
return $respuesta;
}
function eliminar($formulario){
$objpersona = new clspersona();
$lista=$formulario[chk];
if(count($lista)>0){
foreach($lista as $k => $v)
{
$ssql="delete from persona where
idpersona='".$v."'";
$objpersona->comando($ssql);
}
$salida="Elementos eliminados correctamente";
}
else $salida="No hay elementos seleccionados";
$respuesta = new xajaxResponse();
$respuesta->addAssign("mensaje","innerHTML",$salida);
return $respuesta;
}
function registros($nrxp,$formulario,$frmbuscar,$pagina)
{
$objpersona = new clspersona();
$busqueda=" where $frmbuscar[campo] like '%$frmbuscar[texto]%'";
$sql="select * from persona $busqueda";
$objpersona->consulta($sql);
$numreg=$objpersona->nr;
$orden=$formulario[orden];
$sentido=$formulario[sentido];
Oscar E Capuay Uceda
304
PHP + AJAX
$campo_actual=$formulario[actual];
//sentido
if($campo_actual==$orden)
{
if($sentido=="asc") $sentido="desc";
else $sentido="asc";
}
else $sentido="asc";
//$pagina=$formulario[pagina];
$sql.=" order by ".$orden." ".$sentido;
//resultados
$inicio=($pagina-1)*$nrxp;
$sql.=" limit $inicio,$nrxp";
$objpersona->consulta($sql);
$nrt=$objpersona->nr;
$salida="<table
width=\"100%\"
class=\"listado\"
id=\"tab_registros\">";
for($i=1;$i<=$nrt;$i++){
$reg=$objpersona->leer_registro();
$salida.="
<tr onMouseDown=\"fila(this)\">
<td
style=\"width:16\"><input type=\"checkbox\" name=\"chk[]\"
value=\"$reg[idpersona]\" onClick=\"setPointer('#D0D090',this)\"></td>
<td
style=\"width:40px\"><a
href=\"#\"
onClick=\"xajax_ver_datos('$reg[idpersona]');ver_div('formulario');\"><img
src=\"iconos/editar.gif\" border=\"0\"></a></td>
<td style=\"width:23%\">$reg[nombres]</td>
<td style=\"width:23%\">$reg[apellidos]</td>
<td style=\"width:23%\">$reg[email]</td>
<td style=\"width:23%\">$reg[telefono]</td>
</tr>";
}
$encontrados="$numreg registros encontrados";
$salida.="</table>";
$respuesta = new xajaxResponse();
$respuesta->addAssign("registros","innerHTML",$salida);
$respuesta->addAssign("mensaje","innerHTML",$encontrados);
$respuesta->addAssign("orden","value",$orden);
$respuesta->addAssign("sentido","value",$sentido);
return $respuesta;
}
function paginas($nrxp,$frmbuscar,$pagina)
{
$objpersona = new clspersona();
$busqueda=" where $frmbuscar[campo] like '%$frmbuscar[texto]%'";
$sql="select * from persona $busqueda";
$objpersona->consulta($sql);
$mgp=10; //maximo grupo de pginas
$salida="Páginas:";
$npag=ceil($objpersona->nr/$nrxp);
Oscar E Capuay Uceda
305
PHP + AJAX
for($i=1;$i<=$npag;$i++){
if($i!=$pagina)
$enlace="<a href='#'
onClick=\"frm1.actual.value='';xajax_registros($nrxp,xajax.getFormValues('fr
m1'),xajax.getFormValues('frmbuscar'),'$i');xajax_paginas($nrxp,xajax.getFor
mValues('frmbuscar'),'$i');\">$i</a>";
else $enlace=" $i ";
$salida.=$enlace." ";
}
$respuesta = new xajaxResponse();
$respuesta->addAssign("paginas","innerHTML",$salida);
return $respuesta;
}
$xajax->registerFunction("guardar");
$xajax->registerFunction("ver_datos");
$xajax->registerFunction("limpiar");
$xajax->registerFunction("eliminar");
$xajax->registerFunction("registros");
$xajax->registerFunction("paginas");
$xajax->processRequests();
?>
Resultado Web:
Listado de personas
306
PHP + AJAX
Insercin de registro
Edicin de registro
307
PHP + AJAX
Seleccin de registros
xajax_modelo_persona.php
<?php
require_once "xajax_conexion.php";
class clspersona
{
protected $rs; //resultado de una sentencia sql
public $nr; //numero de registros
public function leer_registro()
{
308
PHP + AJAX
$reg=mysql_fetch_array($this->rs,MYSQL_ASSOC) or
die(mysql_error());
return $reg;
}
public function consulta($sql)
{
$objBase = new BaseDatos();
$objBase->conectar();
$rs=$objBase->query($sql);
$this->rs=$rs;
$this->nr=$objBase->num_rows($this->rs);
}
public function comando($sql)
{
$objBase = new BaseDatos();
$objBase->conectar();
$rs=$objBase->query($sql);
$this->rs=$rs;
return $this->rs;
}
}
?>
xajax_conexion.php
<?php
class BaseDatos
{
protected $servidor="localhost";
protected $usuario="root";
protected $password="";
public function conectar()
{
$link=mysql_connect($this->servidor,$this->usuario,$this>password) or die(mysql_error());
mysql_select_db("dbdemo",$link) or die(mysql_error());
}
public function query($sql)
{
$rs=mysql_query($sql) or die(mysql_error());
return $rs;
}
public function num_rows($rs)
{
$nr=mysql_num_rows($rs) or die(mysql_error());
return $nr;
}
}
?>
Oscar E Capuay Uceda
309
PHP + AJAX
xajax_vista_persona.php
<html lang="es">
<head>
<title>Personas</title>
<script type="text/javascript" src="js/funciones.js"></script>
<?php $xajax->printJavascript('xajax/');?>
<link href="css/estilo.css" rel="stylesheet" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<body>
<div id="menu">
<table width="100%">
<caption><?php echo $titulo?></caption>
<tr>
<td class="menu">
<a href="#" onClick="xajax_limpiar();ver_div('formulario');"><img
src="iconos/nuevo.gif" height="16" alt="nuevo"></a>
<a href="#" onClick="xajax_eliminar(xajax.getFormValues('frmlistado'));
xajax_paginas(<?php echo
$nrxp?>,xajax.getFormValues('frmbuscar'),frm1.pagina.value);xajax_registro
s(<?php echo
$nrxp?>,xajax.getFormValues('frm1'),xajax.getFormValues('frmbuscar'),'1');">
<img src="iconos/borrar.gif" height="16" alt="borrar"></a>
<a href="#" onClick="ver_div('busqueda')">
<img src="iconos/buscar.gif" height="16" alt="buscar"></a>
</td>
</tr>
</table>
</div>
<div id="busqueda" style="display: none;">
<form name="frmbuscar" id="frmbuscar" method="post" action="">
<table width="100%">
<tr><td class="etiqueta">Campo</td>
<td>
<select name="campo" class="campo">
<option value="nombres">Nombres</option>
<option value="apellidos">Apellidos</option>
<option value="email">E-Mail</option>
<option value="telefono">Telfono</option>
</select>
<input type="text" id="texto" name="texto"
class="campo">
<input type="button" value="Buscar"
onClick="xajax_registros(<?php echo
$nrxp?>,xajax.getFormValues('frm1'),xajax.getFormValues('frmbuscar'),'1');x
Oscar E Capuay Uceda
310
PHP + AJAX
ajax_paginas(<?php echo
$nrxp?>,xajax.getFormValues('frmbuscar'),frm1.pagina.value);"
class="boton">
<input type="button"
onClick="frmbuscar.texto.value='';xajax_registros(<?php echo
$nrxp?>,xajax.getFormValues('frm1'),xajax.getFormValues('frmbuscar'),'1');x
ajax_paginas(<?php echo
$nrxp?>,xajax.getFormValues('frmbuscar'),frm1.pagina.value);ocultar_div('bu
squeda'); return false;" value="Ver Todos" class="boton"></td></tr>
</table>
</form>
</div>
<div id="formulario" style="display: none;">
<form name="frm1" id="frm1" action="">
<div id="ocultos">
<input type="hidden" name="accion" id="accion" value="">
<input type="hidden" name="orden" id="orden" value="1">
<input type="hidden" name="actual" id="actual" value="">
<input type="hidden" name="sentido" id="sentido" value="asc">
<input type="hidden" name="pagina" id="pagina" value="1">
</div>
<table width="100%">
<tr>
<td class="etiqueta">Nombres</td>
<td><input name="nombres" type="text" class="campo"
id="nombres" size="50"></td>
</tr>
<tr>
<td class="etiqueta">Apellidos</td>
<td><input name="apellidos" type="text" class="campo"
id="apellidos" size="50"></td>
</tr>
<tr>
<td class="etiqueta">E-Mail</td>
<td><input name="email" type="text" class="campo" id="email"
size="60"></td>
</tr>
<tr>
<td class="etiqueta">Telfono</td>
<td><input name="telefono" type="text" class="campo" id="telefono"
size="15"></td>
</tr>
<tr>
<th colspan="2"> <input type="button" value="Guardar"
onClick="xajax_guardar(xajax.getFormValues('frm1'));xajax_registros(<?php
echo
$nrxp?>,xajax.getFormValues('frm1'),xajax.getFormValues('frmbuscar'),'1');x
ajax_paginas(<?php echo
$nrxp?>,xajax.getFormValues('frmbuscar'),frm1.pagina.value);ocultar_div('for
mulario')" class="boton">
Oscar E Capuay Uceda
311
PHP + AJAX
<input type="button" onClick="ocultar_div('formulario'); return
false;" value="Cancelar" class="boton"></th>
</tr>
</table>
</form>
</div>
<div id="mensaje" class="mensaje"> </div>
<div id="encabezado">
<form action="">
<table width="100%" class="listado">
<tr>
<th style="width:16px"><input type="checkbox" name="allcheck"
value="checkbox" title="Selecciona todos"
onClick="seleccionar_all('#D0D090',3);"></th>
<th style="width:40px">Editar</th>
<th style="width:24%"><?php enlacelis("Nombres",2,$nrxp,1) ?></th>
<th style="width:24%"><?php enlacelis("Apellidos",3,$nrxp,1) ?></th>
<th style="width:24%"><?php enlacelis("E-Mail",4,$nrxp,1) ?></th>
<th style="width:24%"><?php enlacelis("Telefono",5,$nrxp,1) ?></th>
</tr>
</table>
</form>
</div>
<form id="frmlistado" name="frmlistado" action="">
<div id="registros"> </div>
</form>
<div id="paginas" class="paginado"> </div>
<script type="text/javascript">
xajax_registros(<?php echo
$nrxp?>,xajax.getFormValues('frm1'),xajax.getFormValues('frmbuscar'),'1');
xajax_paginas(<?php echo
$nrxp?>,xajax.getFormValues('frmbuscar'),frm1.pagina.value);
</script>
</html>
<?php
function enlacelis($titulo_columna,$campo_orden,$nrxp,$pagina)
{
echo "<a href=\"#\" onClick=\"frm1.orden.value='$campo_orden';
xajax_registros($nrxp,xajax.getFormValues('frm1'),xajax.getFormValues('frm
buscar'),'$pagina');
xajax_paginas($nrxp,xajax.getFormValues('frmbuscar'),frm1.pagina.value);
frm1.actual.value='$campo_orden';\">$titulo_columna</a>";
}
?>
Ejemplo 149:
312
PHP + AJAX
funciones.js
<!-// JavaScript Document
var filasel;
function fila(filsel){
filasel = filsel;
return filasel;
}
313
PHP + AJAX
}
}
function compCheck(){
var sw=0;
for(var x=0; x<document.forms[0].length; x++ ){
if (document.forms[0].elements[x].checked){
sw=1;
}
}
if(sw!=1){
alert ("Por favor, selecciona los registros quee deseas
elimiar.");
return(false);
}
}
function toggle(obj){
var objID = document.getElementById(obj);
objID.style.display = (objID.style.display == "none")?"":"none";
}
function ver_div(obj){
var objID = document.getElementById(obj);
objID.style.display ="block";
}
function ocultar_div(obj){
var objID = document.getElementById(obj);
objID.style.display ="none";
}
-->
314
Referencias Bibliogrficas
X.
REFERENCIAS BIBLIOGRAFICAS
315
Anexos
XI. Anexos
Lista de Ejemplos
Ejemplo 1:
Ejemplo 2:
Ejemplo 3:
Ejemplo 4:
Ejemplo 5:
Ejemplo 6:
Ejemplo 7:
Ejemplo 8:
Ejemplo 9:
Ejemplo 10:
Ejemplo 11:
Ejemplo 12:
Ejemplo 13:
Ejemplo 14:
Ejemplo 15:
Ejemplo 16:
Ejemplo 17:
Ejemplo 18:
Ejemplo 19:
Ejemplo 20:
Ejemplo 21:
Ejemplo 22:
Ejemplo 23:
Ejemplo 24:
Ejemplo 25:
Ejemplo 26:
Ejemplo 27:
Ejemplo 28:
Ejemplo 29:
Ejemplo 30:
Ejemplo 31:
Ejemplo 32:
Ejemplo 33:
Ejemplo 34:
Ejemplo 35:
Ejemplo 36:
Ejemplo 37:
Ejemplo 38:
Ejemplo 39:
Ejemplo 40:
Ejemplo 41:
Ejemplo 42:
Ejemplo 43:
Ejemplo 44:
Ejemplo 45:
UT
TU
TU
UT
TU
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
UT
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
UT
TU
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
316
Anexos
Ejemplo 46:
Ejemplo 47:
Ejemplo 48:
Ejemplo 49:
Ejemplo 50:
Ejemplo 51:
Ejemplo 52:
Ejemplo 53:
Ejemplo 54:
Ejemplo 55:
Ejemplo 56:
Ejemplo 57:
Ejemplo 58:
Ejemplo 59:
Ejemplo 60:
Ejemplo 61:
Ejemplo 62:
Ejemplo 63:
Ejemplo 64:
Ejemplo 65:
Ejemplo 66:
Ejemplo 67:
Ejemplo 68:
Ejemplo 69:
Ejemplo 70:
Ejemplo 71:
Ejemplo 72:
Ejemplo 73:
Ejemplo 74:
Ejemplo 75:
Ejemplo 76:
Ejemplo 77:
Ejemplo 78:
Ejemplo 79:
Ejemplo 80:
Ejemplo 81:
Ejemplo 82:
Ejemplo 83:
Ejemplo 84:
Ejemplo 85:
Ejemplo 86:
Ejemplo 87:
Ejemplo 88:
Ejemplo 89:
Ejemplo 90:
Ejemplo 91:
Ejemplo 92:
Ejemplo 93:
Ejemplo 94:
Ejemplo 95:
Ejemplo 96:
UT
TU
TU
UT
TU
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
317
Anexos
Ejemplo 97: vista_bd.php ___________________________________
Ejemplo 98: controlador_bd.php ______________________________
Ejemplo 99: Conexin a MySQL con PDO ______________________
Ejemplo 100: Lista de personas con PDO y manejo de errores ______
Ejemplo 101: Listado de registros con PDO, con eliminacin mltiple _
Ejemplo 102: Insercin de registros con PDO ____________________
Ejemplo 103: Eliminacin mltiple de registros con PDO ___________
Ejemplo 104: Edicin de registros con PDO. _____________________
Ejemplo 105: Borrar un archivo de un usuario____________________
Ejemplo 106: Ataque mediante el borrado de archivos _____________
Ejemplo 107: Md5 _________________________________________
Ejemplo 108: Script para acceso de usuarios ____________________
Ejemplo 109: Inyeccin SQL en una sentencia SELECT ___________
Ejemplo 110: Paginacin de resultados con Inyeccin SQL _________
Ejemplo 111: get_magic_quotes_gpc y addslashes _______________
Ejemplo 112: mysqli_real_escape_string _______________________
Ejemplo 113: Ingreso de un usuario a la aplicacin _______________
Ejemplo 114: Verifica datos del usuario_________________________
Ejemplo 115: Autenticacin HTTP _____________________________
Ejemplo 116: Formulario para el logeo de usuarios _______________
Ejemplo 117: Logeo de usuarios ______________________________
Ejemplo 118: Verifica si el usuario se ha logeado _________________
Ejemplo 119: Formulario CAPTCHA ___________________________
Ejemplo 120: Generador CAPTCHA ___________________________
Ejemplo 121: Ver configuracin GD____________________________
Ejemplo 122: Mi primera imagen ______________________________
Ejemplo 123: Rectngulo y texto ______________________________
Ejemplo 124: Grfico de barras _______________________________
Ejemplo 125: Pie __________________________________________
Ejemplo 126: Crculo _______________________________________
Ejemplo 127: FPDF ________________________________________
Ejemplo 128: PDF con salto de pgina _________________________
Ejemplo 129: PDF con captulos ______________________________
Ejemplo 130: PDF con datos de MySQL ________________________
Ejemplo 131: XLS simple ____________________________________
Ejemplo 132: XLS con frmulas ______________________________
Ejemplo 133: XLS con xlsStream _____________________________
Ejemplo 134: XLS con datos de MySQL ________________________
Ejemplo 135: Asignacin de valores a propiedades de un objeto HTML
Ejemplo 136: Asignacin de HTML a innerHTML de una etiqueta DIV _
Ejemplo 137: Asignacin de innerHTML y estilos con XAJAX _______
Ejemplo 138: Ocultar y Mostrar un DIV _________________________
Ejemplo 139: Imprimir nmeros del 1 a N _______________________
Ejemplo 140: Cargar una imagen con XAJAX ____________________
Ejemplo 141: Cambiar el cdigo javascript establecido para un evento
Ejemplo 142: Obtener datos de un formulario ____________________
Ejemplo 143: Obtener datos incluyendo objetos deshabilitados. _____
Ejemplo 144: Archivo con una lnea en blanco antes de iniciar PHP. __
Ejemplo 145: Bsqueda del nombre segn el cdigo con XAJAX ____
Ejemplo 146: Controlador para mantenimiento con AJAX ___________
Ejemplo 147: Modelo para mantenimiento con AJAX ______________
TU
UT
TU
TU
UT
TU
TU
UT
UT
UT
TU
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
215
215
220
220
221
222
224
224
227
228
229
230
231
231
241
242
245
246
248
251
252
253
255
256
259
259
260
261
262
264
267
269
271
274
276
277
279
280
284
286
287
289
290
291
293
295
297
300
301
303
308
318
Anexos
Ejemplo 148:
Ejemplo 149:
TU
UT
TU
TU
UT
TU
UT
UT
319
Anexos
Lista de Tablas
Tabla 1.
Tabla 2.
Tabla 3.
Tabla 4.
Tabla 5.
Tabla 6.
Tabla 7.
Tabla 8.
Tabla 9.
Tabla 10.
Tabla 11.
Tabla 12.
Tabla 13.
Tabla 14.
Tabla 15.
Tabla 16.
Tabla 17.
Tabla 18.
Tabla 19.
Tabla 20.
320
Anexos
Lista de Figuras
Figura 1.
Figura 2.
Figura 3.
Figura 4.
Figura 5.
Figura 6.
Figura 7.
Figura 8.
Figura 9.
Figura 10.
Figura 11.
Figura 12.
Figura 13.
Figura 14.
Figura 15.
Figura 16.
Figura 17.
Figura 18.
Figura 19.
Figura 20.
Figura 21.
Figura 22.
Figura 23.
Figura 24.
Figura 25.
Figura 26.
Figura 27.
Figura 28.
Figura 29.
Figura 30.
Figura 31.
Figura 32.
Figura 33.
Figura 34.
Figura 35.
Figura 36.
Figura 37.
Figura 38.
Figura 39.
Figura 40.
Figura 41.
Figura 42.
Figura 43.
Figura 44.
Figura 45.
Figura 46.
Figura 47.
Figura 48.
U
TU
11
12
12
13
13
14
14
15
15
20
22
22
23
23
25
27
30
32
34
34
35
36
37
38
39
40
42
49
50
51
52
52
54
55
57
58
59
62
78
78
79
80
82
83
85
87
87
89
321
Anexos
Figura 49.
Figura 50.
Figura 51.
Figura 52.
Figura 53.
Figura 54.
Figura 55.
Figura 56.
Figura 57.
Figura 58.
Figura 59.
Figura 60.
Figura 61.
Figura 62.
Figura 63.
Figura 64.
Figura 65.
Figura 66.
Figura 67.
Figura 68.
Figura 69.
Figura 70.
Figura 71.
Figura 72.
Figura 73.
Figura 74.
Figura 75.
Figura 76.
Figura 77.
Figura 78.
Figura 79.
Figura 80.
322
Anexos
Figura 97.
Figura 98.
Figura 99.
Figura 100.
Figura 101.
Figura 102.
Figura 103.
Figura 104.
Figura 105.
Figura 106.
Figura 107.
Figura 108.
Figura 109.
Figura 110.
Figura 111.
Figura 112.
Figura 113.
Figura 114.
Figura 115.
Figura 116.
Figura 117.
Figura 118.
Figura 119.
Figura 120.
Figura 121.
Figura 122.
Figura 123.
Figura 124.
Figura 125.
Figura 126.
Figura 127.
Figura 128.
Figura 129.
Figura 130.
Figura 131.
Figura 132.
Figura 133.
Figura 134.
Figura 135.
Figura 136.
Figura 137.
Figura 138.
Figura 139.
Figura 140.
Figura 141.
Figura 142.
Figura 143.
Figura 144.
Figura 145.
Figura 146.
Figura 147.
U
151
151
153
153
154
154
155
155
156
156
156
157
157
158
158
159
159
160
160
161
161
162
162
163
163
164
164
165
165
166
166
167
167
168
168
169
169
169
170
170
170
171
171
172
173
174
175
176
177
178
178
323
Anexos
Figura 148.
Figura 149.
Figura 150.
Figura 151.
Figura 152.
Figura 153.
Figura 154.
Figura 155.
Figura 156.
Figura 157.
Figura 158.
Figura 159.
Figura 160.
Figura 161.
Figura 162.
Figura 163.
Figura 164.
Figura 165.
Figura 166.
Figura 167.
Figura 168.
Figura 169.
Figura 170.
Figura 171.
Figura 172.
Figura 173.
Figura 174.
Figura 175.
Figura 176.
Figura 177.
Figura 178.
Figura 179.
Figura 180.
Figura 181.
Figura 182.
Figura 183.
Figura 184.
Figura 185.
Figura 186.
Figura 187.
Figura 188.
Figura 189.
Figura 190.
Figura 191.
Figura 192.
Figura 193.
Figura 194.
Figura 195.
Figura 196.
Figura 197.
Figura 198.
U
179
179
180
180
181
181
182
183
185
187
187
188
190
191
192
197
198
199
200
201
202
203
203
205
207
209
216
221
222
223
225
229
233
233
234
234
234
236
236
237
238
238
239
239
240
241
241
243
246
247
247
324
Anexos
Figura 199.
Figura 200.
Figura 201.
Figura 202.
Figura 203.
Figura 204.
Figura 205.
Figura 206.
Figura 207.
Figura 208.
Figura 209.
Figura 210.
Figura 211.
Figura 212.
Figura 213.
Figura 214.
Figura 215.
Figura 216.
Figura 217.
Figura 218.
Figura 219.
Figura 220.
Figura 221.
Figura 222.
Figura 223.
Figura 224.
Figura 225.
Figura 226.
Figura 227.
Figura 228.
Figura 229.
Figura 230.
Figura 231.
Figura 232.
Figura 233.
Figura 234.
Figura 235.
Figura 236.
Figura 237.
Figura 238.
Figura 239.
Figura 240.
Figura 241.
Figura 242.
Figura 243.
Figura 244.
Figura 245.
Figura 246.
Figura 247.
Figura 248.
Figura 249.
U
248
249
249
249
250
250
251
253
254
258
258
258
259
260
260
261
262
264
265
267
270
270
274
275
277
277
278
278
280
281
282
282
285
286
287
288
290
290
291
292
293
293
294
295
295
296
297
297
298
299
299
325
Anexos
Figura 250.
Figura 251.
Figura 252.
Figura 253.
Figura 254.
Figura 255.
Figura 256.
Figura 257.
Figura 258.
Figura 259.
Figura 260.
U
299
299
300
302
302
302
306
307
307
308
308
326
https://www.facebook.com/IngAlexisLlontop
http://alexyniorlls.blogspot.com
http://fullengineeringbook.blogspot.com
http://reprofull.blogspot.com