Está en la página 1de 247

Pginas WEB dinmicas

Tipos de pginas web


Un ejemplo de pgina esttica

Una sencilla clasificacin de los Cualquier usuario que acceda a sta -ya sea en modo local, o a travs de un servidor
tipos de pginas web podra ser remoto visualizar siempre la misma fecha: 11 de julio de 2005.
esta:
<HTML>
Pginas estticas <HEAD>
Pginas dinmicas </HEAD>
<BODY>
Pginas estticas Hoy es 11-7-2006 y son las 14:23:57 horas
</BODY>
Diremos que una pgina es </HTML>
esttica cuando sus contenidos no
pueden ser modificados ni desde
el servidor que la aloja (ordenador ejemplo1.html
remoto) ni tampoco desde el
cliente (navegador) mediante
ninguna intervencin del usuario ni Una par de pginas dinmicas
tampoco a travs de ningn
programa.
Si pulsas en el enlace del primero de estos dos ejemplos vers que la fecha que
Pginas dinmicas aparece en la pgina es la fecha actual de tu sistema, y adems, cada vez que pulses el
botn Actualizar de tu navegador podrs comprobar que se actualiza la hora.
Llamaremos dinmicas a las
pginas cuyos contenidos s Una intervencin del usuario modifica los contenidos.
pueden ser modificados de forma
automtica o mediante la
intervencin de un usuario bien <HTML>
sea desde el cliente y/o desde el <HEAD>
servidor. <script language="JavaScript">
var son= new Date();
Para que esas modificaciones var fecha=son.getDate()+" - "+(son.getMonth()+1)+" - "+son.getFullYear();
puedan producirse es necesario
var hora=son.getHours()+":"+son.getMinutes()+":"+son.getSeconds();
que algo o alguien especifique:
document.write('Hoy es '+fecha+' y son las '+hora+' horas');
qu, cmo, cundo, dnde y de
qu forma deben realizarse, y que </script>
exista otro algo o alguien capaz de </HEAD>
acceder, interpretar y ejecutar <BODY>
tales instrucciones en el momento </BODY>
preciso. </HTML>

Igual que ocurre en la vida


cotidiana, las especificaciones y las ejemplo2.html
instrucciones requieren: un
lenguaje para definirlas; un
En este otro ejemplo la modificacin de los contenidos no requiere intervencin alguna
soporte para almacenarlas y un
por parte del usuario. Cada 5 segundos (fjate donde dice var frecuencia=5000). Cinco
intrprete capaz de eje- cutarlas.
mil es el perodo de actualizacin, expresado en milisegundos) se rescribirn de forma
Somos capaces de entender unas automtica la fecha y la hora. Tenemos un cronmetro automtico.
instrucciones escritas en castellano
pero si estuvieran escritas en <HTML>
blgaro las cosas seguramente
<HEAD>
seran bastante distintas, y, por
supuesto, a un blgar@ le pasara <script language="JavaScript">
justamente lo contrario. var reloj=0;
var frecuencia=5000;
Igual ocurre con los programas function actualiza(){
intrpretes de los lenguajes de var son= new Date();
script. Ellos tambin requieren var fecha=son.getDate()+" - "+(son.getMonth()+1)+" - "+son.getFullYear();
rdenes escritas en su propio var hora=son.getHours()+":"+son.getMinutes()+":"+son.getSeconds();
idioma. var escribe='Hoy es '+fecha+' y son las '+hora+' horas';
var situa=document.getElementById('capa0');
Scripts situa.innerHTML=escribe;
reloj=setTimeout("actualiza()",frecuencia);
Se llama script a un conjunto de }
instrucciones escritas en un </script>
lenguaje determinado que van </HEAD>
incrustadas dentro de una pgina <BODY onLoad="actualiza()";>
WEB de modo que su intrprete <div id="capa0">
pueda acceder a ellas en el </div>
momento en el que se requiera su </BODY>
ejecucin. </HTML>
Cuando se incrustan scripts en
una pgina WEB empiezan a ejemplo3.html
convivir en un mismo docu- mento
informaciones destina- das a
distintos intrpretes.
Ejercicio n 1
Por una parte, el cdigo HTML que
ha de ser interpretado por el Abre tu block de notas y escribe el cdigo fuente del ejemplo n 3 prestando especial
navegador, y por la otra, los
atencin a la trascripcin de las maysculas y las minsculas (JavaScript, igual que PHP,
scripts que han de ser ejecuta- dos
dependiendo del lenguaje en el diferencia entre unas y otras) y tambin a las comillas y a los punto y coma que aparecen
que hayan sido escritos por su al final de cada lnea.
intrprete correspon- diente. Guarda el documento con el nombre ejercicio1.html, luego abrlo con el navegador y
comprueba el funcionamiento del cronmetro.
La manera de diferenciar los
Una vez que hayas comprobado que funciona, prueba a sustituir el 5000 por otros valores
contenidos es delimitar los scripts
marcando su comienzo con una numricos y comprueba como se modifica la frecuencia del cronmetro.
etiqueta de apertura <script> y
sealando el final con una etiqueta
de cierre </script>.
Servidores y clientes
Lo que no est contenido entre
esas etiquetas se considerar Es frecuente observar en la calle que son muchas las personas que cuando se refieren
cdigo HTML.
a los servidores lo hacen con s se tratara de mquinas complejsimas, misteriosas,
La posibilidad de insertar en un lejanas y enormes que, bajo esa aureola de cripticismo, parecen totalmente distintas al
mismo documento scripts ordenador que usamos habitualmente. Nada ms lejos de la realidad!
desarrollados en distintos len-
guajes obliga a especificar cul se Intentaremos aclarar algunos conceptos con ejemplos cotidianos. Pensemos en esos
ha utilizado en cada caso, para ordenadores remotos (tambin llamados host) como si se tratara de uno esos sitios
que en el momento en el que desde los que se sirven comidas a domicilio.
vayan a ser ejecutados se invoque
el intrprete adecuado. Quiz lo primero en lo que se te ocurra pensar sea en una pizza, no porque
desconozcas que tambin es posible comprar otras cosas sino por la popularidad de ese
Para ello, dentro de la propia tipo de servicio. Algo similar ocurre con los host. La frecuencia con la que accedemos a
etiqueta de apertura (<script>) se
ellos en demanda de pginas web hace que tendamos a identificarlos con ellas, pero...
inserta una referencia al tipo de
tambin los host ofrecen o pueden ofrecer ms servicios. Sigamos con las comidas a
lenguaje con esta sintaxis:
domicilio.
language="nombre"
Cada una de esas empresas puede atender peticiones de uno solo o de varios
Por ejemplo: servicios distintos (pizzas, helados, o platos regionales, por citar algunos ejemplos), pero
la oferta de cada uno de esos servicios requiere una infraestructura adecuada a cada
<script language="PHP"> caso. La oferta de pizzas exigir disponer de un horno, y la de helados necesitar de una
......
instalacin frigorfica.
...... instrucciones ..
......
Pues bien, algo muy similar ocurre con los host. Tambin stos pueden ofrecer uno o
</script>
varios servicios (pginas web, correo electrnico, transferencias FTP, noticias, etctera) y
indicara que las instrucciones tambin es necesario que cada servicio disponga de su propia infraestructura, que en
estn escritas con la sintaxis de este caso sera un programa distinto (software de servidor) para cada uno de ellos.
PHP.
Como puedes ver, no basta con hablar de servidores. Es necesario especificar
Por el contrario, en este otro tambin qu es lo que sirven, para lo cual habra que decir: servidor de pginas web,
supuesto: servidor de correo, etctera y tener presente que -aunque convivan en el mismo host
cada uno de ellos requiere su propio software y su propia configuracin.
<script language="JavaScript">
......
Resumiendo, cuando en lenguaje coloquial hablamos de un servidor estamos aludiendo
...... instrucciones ..
...... un host (ordenador remoto) el tamao y la lejana carecen de importancia provisto de
</script> programas (software de servidor) que, cuando est accesible (conectado a Internet) y
con el software activo (servidor en funcionamiento) es capaz de atender peticiones y
estaramos sealando que en las devolver a los clientes los documentos solicitados, o un mensaje de error, en el caso de
instrucciones contenidas en el que no estuvieran disponibles.
script se ha utilizado sintaxis de
JavaScript. Veamos un ejemplo de como se desarrolla ese proceso de peticin-respuesta.
Para el caso concreto de PHP, Para leer el correo electrnico necesitas disponer de un programa supongamos que
existe una sintaxis alternativa, es Outlook Express instalado en tu ordenador y hacer, a travs de l, una peticin a
mucho ms cmoda y que es la
un ordenador remoto (host). Si quisieras visualizar pginas web tendras que utilizar un
que se usa habitualmente.
programa distinto Internet Explorer, por ejemplo capaz de realizar esta otra tarea.
Es la siguiente:
Al programa que utilizamos para realizar cada peticin le llamaremos cliente.
<?
...... Qu es una peticin?
......instrucciones..
...... Una peticin es un conjunto de datos que un cliente (recuerda que el cliente siempre
?> es uno de los programas instalados en tu ordenador) enva a travs de Internet
solicitando una respuesta determinada por parte de un ordenador remoto.
<? har la misma funcin que
<script language="PHP"> y ?> Qu contendra esa peticin?
ser equivalente a </script>.
Cada tipo de peticin tendr contenidos distintos. Por ejemplo, cuando se trata de
Lenguajes leer mensajes de correo, la peticin realizada por el cliente (Outlook Express)
contendra, entre otros, muchos de los datos de la configuracin de la cuenta, tales
como: el protocolo (forma de comunicacin) en el caso del correo lo habitual sera el
Hay mltiples posibilidades en
cuanto a lenguajes de script. Pero
protocolo POP (Post Office Protocol), el nombre de host donde est alojado el buzn
antes de hacer mencin a algunos (servidor POP servidor de correo entrante), el nombre de la cuenta, la contrasea de
de ellos es conveniente hacer una acceso, y algunas otras informaciones relativas a la gestin de esa cuenta tales como si
clasificacin previa. deben conservarse o no los mensajes en el servidor, etctera.

Los lenguajes de script pueden Qu ocurre con esa peticin?


clasificarse en dos tipos:
Cualquier peticin pasa en primera instancia por un servidor de nombres de dominio
Del lado del cliente (Domain Name Server) DNS, una especie de gua telefnica que contiene los nombres de
Del lado del servidor los servidores y las direcciones IP a travs de las cuales estn conectados a Internet.
En la columna derecha hemos Podra decirnos los datos son ficticios que olmo.cnice.mecd.es es el nombre de un
comentado algunos conceptos host que est conectado a Internet a travs de la direccin IP 111.112.113.114
sobre servidores y clientes que
pueden serte tiles a la hora de Una vez resuelta esa peticin por el servidor DNS (direccionamiento de la peticin a la
analizar las diferencias entre estos IP correspondiente) se comprobar si esa IP est activa (si efectivamente hay un
dos tipos de lenguaje. ordenador conectado a travs de ella) y, en caso de estarlo, se determinar si ese
ordenador al que estamos accediendo es capaz de atender la peticin.
Lenguajes
del lado del cliente Qu tiene que ocurrir para que pueda atenderse una peticin?
Diremos que un lenguaje es del Es necesario que el ordenador remoto tenga instalado y funcionando el software
lado del cliente cuando el
de servidor adecuado al protocolo de nuestra peticin. Ello quiere decir -siguiendo
intrprete que ha de ejecutar sus
con el ejemplo que el ordenador remoto debe tener instalado y funcionando un software
scripts es accesible desde ste
el cliente sin que sea necesario especfico de servidor de correo capaz de interpretar el protocolo POP3 especificado en
hacer ninguna peti- cin al la peticin.
servidor.
Cuidado!
Seguramente te ha ocurrido
alguna vez que al intentar acceder El ordenador remoto debe tener instalado y funcionando el software adecuado a cada
a una pgina web ha aparecido un
mensaje diciendo que la correcta
tipo de peticin (servicio) que deba atender.
visualizacin de la pgina requiere No basta con decir servidor, es preciso conocer los servicios que presta y es factible que un
un plug-in determinado, y que, a mismo ordenador preste -simultneamente- varios servicios, siempre que tenga instalado y
la vez, se te haya ofrecido la posi-
activo el software especfico para cada uno de esos servicios.
bilidad de descargarlo en ese
momento.
Cuando el ordenador remoto acepta la peticin el software de servidor y/o las
Eso ocurre porque cuando el
navegador que en el caso de las aplicaciones del lado del servidor (software instalado en el ordenador remoto y
pginas web es el cliente trata de vinculado con el software de servidor) resuelven la peticin (comprobar que el nombre
interpretar la pgina, encuentra de la cuenta y la contrasea son correctas, comprobar si existen mensajes, borrarlos del
incrustado en ella algo (un buzn si as lo especifica la peticin, etc.) y devuelven al cliente (recuerda que el
fichero de sonido, una animacin cliente era nuestro Outlook Express) la informacin requerida.
Flash, etctera) que de forma
muy similar a lo que ocurre con los Solo falta que una vez recibida la respuesta Outlook Express (cliente) interprete la
scripts requiere un intrprete informacin recibida y nos permita visualizar o imprimir el contenido de los mensajes
adecuado del que no dispone en descargados del servidor.
ese momento.

Cuando los scripts contenidos en Servidor y cliente en una misma mquina


un documento son de este tipo, el
servidor lo entrega al cliente si
efectuar ningn tipo de Hasta ahora -al referirnos a servidores y clientes hemos hecho alusin a dos
modificacin. mquinas: nuestro propio ordenador (ordenador local) en el que estaran instaladas las
aplicaciones cliente y un ordenador remoto en el que se alojaran las aplicaciones de
Lenguajes servidor. Eso es lo ms habitual, pero no es la nica posibilidad.
del lado del servidor
Dado que servidor y cliente son nicamente aplicaciones es perfectamente posible
Un lenguaje es del lado del
que ambas convivan dentro de la misma mquina.
servidor cuando la ejecucin de
sus scripts se efecta, por
La diferencia sustancial sera que ahora no es necesario el servidor de DNS para
instancia de este el servidor,
buscar la direccin IP. Utilizaramos una IP (habitualmente la 127.0.0.1) reservada
antes de dar respuesta a la
peticin, de manera que el cliente para estos casos preestablecida en la configuracin del servidor y a travs de ella se
no recibe el documento original canalizaran las peticiones a nuestro propio servidor. Ya hablaremos ms adelante de esta
sino el resultante de esa IP.
interpretacin previa.

Cuando se usan estos tipos de Esquemas de diferentes peticiones de pginas WEB


lenguaje el cliente recibe un
documento en el que cada script Intentaremos resumir de forma esquemtica los procesos de algunos de los diferentes
contenido en el original habr sido
tipos de peticiones de pginas WEB.
sustituido por los resultados de su
ejecucin.
Aqu tenemos la ms sencilla de ellas:
Esto es algo a tener muy en
cuenta, porque, en este caso, los
usuarios no tendrn la posibilidad
de visualizar el cdigo fuente,
mientras que cuando se trata de
lenguajes del lado del cliente
siempre es posible visualizar los
scripts, bien sea de forma directa
mirando el cdigo fuente de la
pgina recibida o leyendo el
contenido de ficheros externos
vinculados a ella que son
bastante fciles de encontrar en la
cach del navegador.

La utilizacin de este tipo de


scripts requiere que el intrpre- te
del lenguaje sea accesible est
del lado desde el propio servidor.

Cmo resuelve sus dudas el


servidor?

Dado que en unos casos el


servidor debe entregar el
documento original pginas
estticas o pginas dinmicas en
las que se usan lenguajes del lado
del cliente mientras que en otros
casos pginas dinmicas usando
lenguajes del lado del servidor
tiene que devolver el resultado de Si observas con detenimiento el esquema de la parte superior es posible que
la ejecucin de los scripts, es encuentres algo que no te cuadre... porque en el esquema hay un servidor que parece
razonable que te preguntes: imprescindible para atender las peticiones y sin embargo t sin tener instalado
cmo sabe el servidor lo que debe
ningn servidor eres capaz de visualizar tus propias pginas web sin ms hacer un
hacer en cada caso?
doble click sobre su icono.
La respuesta es simple. Eso hay
que decrselo. Y se le dice de una Eso es cierto, pero fjate en las dos direcciones que aparecen en esta otra imagen.
forma bastante simple. Se indica al
poner la extensin al documento.

Si en la peticin se alude a un
documento con extensin .htm o .
html el servidor entender que
esa pgina no requiere la
intervencin previa de ningn
intrprete de su lado y entre- gar
la pgina tal cual. La de la izquierda consecuencia de haber hecho doble click sobre el icono del
documento contiene como direccin una ruta (el path que conduce hasta el documento)
Si en esa peticin se aludiera a
mientras que en la de la derecha aparece el sintagma http al principio de la direccin.
una extensin distinta .php, por
ejemplo el servidor enten- dera
En el primer caso no hemos hecho ninguna peticin de pgina web sino que hemos
que antes de servir la pgina debe
abierto un documento cuya extensin (html) est asociada con Internet Explorer en
leerla y requerir al intrprete de
PHP que ejecute los scripts nuestra configuracin de Windows. El proceso ha sido exactamente el mismo que si
desarrollados en ese lenguaje (en hubiramos hecho doble click sobre el icono de un documento con extensin txt, con la
caso de que los contuviera) y nica salvedad de que en este ltimo caso se habra abierto el block de notas (por la
devolvera al cliente el asociacin de extensiones y aplicaciones en la configuracin de Windows).
documento que resultara de las En el segundo caso las cosas son distintas. Se incluye el sintagma http acrnimo de
eventuales ejecuciones de tales HiperText Transfer Protocol para indicar que ese es el protocolo que debe ser utilizado
scripts. y que ser preciso que el servidor que reciba la peticin sea capaz de interpretarlo. Por
eso a los servidores que alojan pginas web se les suele llamar servidores HTTP y se
Algunos lenguajes les requiere que soporten este protocolo.
con nombre y apellidos
Siguiendo con los esquemas, he aqu el correspondiente a una peticin de pgina en la
que hay incrustados scripts escritos en lenguaje del lado del cliente:
Sin pretender hacer una enu-
meracin exhaustiva, los len-
guajes de script ms populares son
los siguientes:

Del lado del cliente

DHTML
JavaScript
VBScript

DHTML no es exactamente un
lenguaje de programacin. Se
trata ms bien de una serie de
capacidades que se han ido
aadiendo a los navegadores
modernos mediante las cuales las
pginas pueden contener hojas de
estilo y/o organizarse en capas
susceptibles de ser
redimensionadas, modificadas,
desplazadas y/o ocultadas.

JavaScript es uno de los


lenguajes ms populares. Cada
navegador incluye su propio
intrprete y es frecuente que los
resultados de visualizacin sean
algo distintos segn el navegador
y la versin que se utilice.

Parece ser que las versiones ms


recientes de los distintos Como puedes observar no requiere nada distinto a lo del supuesto anterior. La
navegadores se aproximan a un
diferencia sera que en este caso se haran llamadas al intrprete de JavaScript incluido
estndar ECMA Script-262 que
en los navegadores, tal como comentamos al margen y/o a eventuales plugins
ha sido desarrollado por la ECMA
(Asociacin Europea de necesarios para interpretar otros tipos de script.
Normalizacin de Sistemas de
Informacin y Comunicacin), lo Y por ltimo, el esquema ms complejo: un ejemplo de convivencia en un mismo
que hace suponer que en un futuro documento de varios scripts y varios tipos de lenguaje.
muy prximo todos los
navegadores se ajustarn a esa
especificacin y que, con ello, las
pginas web ya se visualizarn de
forma idntica en todos ellos.

VBScript es un lenguaje de script


derivado de VisualBasic y diseado
especficamente para los
navegadores de Microsoft.

Del lado del servidor

Los ms populares de este tipo


son:
PHP
ASP
Perl
JSP

Cada uno de ellos tiene sus


propias peculiaridades. Pero dado
que aqu tratamos sobre PHP
quiz sea conveniente a modo de
recordatorio hacer algunas
precisiones sobre los requisitos
imprescindibles para trabajar con
este lenguaje.

Requisitos para el uso del


lenguaje PHP
Aqu ya es preciso que, adems de un servidor capaz de soportar el protocolo HTTP,
De acuerdo a lo comentado en los est instalado del lado del servidor un intrprete PHP, un servidor de bases de datos
prrafos anteriores y en los MySQL y que, adems, estn configurados de modo que puedan interactuar entre ellos.
esquemas que tenemos a la
derecha, el uso del lenguaje PHP El lenguaje PHP dispone de funciones que le permiten acceder a muy diversos tipos de
requiere tener instalado y servidores de bases de datos pudiendo: crear, consultar, borrar y modificar tanto
configurado:
bases de datos como tablas y registros de las mismas.
Un software de servidor
configurado para interactuar con el Nosotros vamos a utilizar MySQL, unos de los gestores ms potentes y populares que
intrprete de PHP que soporte el existen en este momento.
protocolo HTTP y que en nuestro
caso ser el denominado servidor
Apache.
Diferentes servicios de hosting
El intrprete de PHP. Cuando empezamos a trabajar con pginas dinmicas elaboradas mediante scripts de
Un software de servidor de PHP (lenguaje del lado del servidor) suele surgirnos las necesidad o simplemente el
bases de datos capaz de ser deseo de publicarlas en algn espacio de alojamiento (hosting), sea gratuito o de pago.
gestionado mediante funciones
Si queremos publicar pginas en las que utilicemos PHP y bases de datos MySQL
propias de PHP.
habremos de buscar un hosting que, aparte de espacio de alojamiento, nos ofrezca
Utilizaremos el servidor de bases estos dos servicios. Adems, antes de elegir uno deberamos informarnos sobre la
de datos conocido como MySQL. funcionalidad que nos ofrece, ya que es importante conocer no slo las versiones de PHP
y MySQL de que dispone sino tambin las restricciones que puedan existir para su uso
En las pginas siguientes (bastante frecuentes y por razones de seguridad en la mayora de los casos).
trataremos sobre la forma de
realizar los procesos de instalacin Si decides publicar tus pginas no te precipites en la eleccin de un hosting. A lo
y configuracin de estas largo de este curso te iremos dando algunas pautas que te permitirn hacer una eleccin
aplicaciones. acorde con tus necesidades.

Anterior Indice Siguiente


Instalacin del editor Dev-PHP

Editor Dev-PHP
El editor Dev-PHP

A lo largo del curso va a sernos de En el directorio Extras de este CD encontrars un fichero llamado devphp2012.exe.
gran utilidad el uso un editor de Tambin podrs descargar este programa de instalacin desde la direccin: http://devphp.
textos que nos permita identificar sourceforge.net/.
los nmeros de lnea de nuestros
scripts y que a la vez nos ayude En la opcin Downloads de esta pgina encontrars enlaces a la ltima versin de
mediante resaltado de textos a este editor. Probablemente tendrs dos opciones de descarga: Dev-PHP IDE 2.0.12 y
depurar la sintaxis. FullPackage with php. Sera suficiente con descargar la primera ya que la segunda
mucho ms pesada incluye el intrprete de PHP.
Existen multitud de editores y
podrs utilizar a tu gusto este o
cualquier otro que uses Configuracin de Dev-PHP en castellano
habitualmente. El hecho de
sugerirte este obedece a al hecho
de que es gratuito, bastante Una vez hayas descomprimido el fichero spDevPHP.zip al que hacemos referencia al
completo, consume pocos recursos margen la configuracin en castellano de Dev-PHP sigue la secuencia que puedes ver en
y se va actualizando las imgenes.
peridicamente.

Instalacin

La instalacin de este editor no


presenta ninguna dificultad. Se
instala y se desinstala de la
forma habitual en que se realizan
estos procesos en Windows. Elegida la opcin del men Options->General Options y una vez en ella la pestaa
Extras, bastar con abrir el fichero spanish.lng y pulsar OK para activar la opcin en
castellano.
Configuracin

Al realizar la instalacin, Dev-PHP


se autoconfigura utilizando la
lengua inglesa. Aunque incluye
libreras en castellano lo cierto es
que la traduccin al menos en
este momento est bastante
incompleta.

Para tratar de subsanar esa


deficiencia hemos incluido en el
directorio Extras de este CD el
fichero spDevPHP.zip con una
versin mejorada.

Para utilizarla es suficiente


descomprimir este fichero en el
subdirectorio lang dentro del
directorio donde fue instalado Dev-
PHP, que por defecto sera el que
ests viendo en la imagen
sobrescribiendo la versin previa.

Mensajes de error

Al utilizar una opcin de idioma


distinta del ingls es posible que
puedas encontrarte con algunas
opciones del men que presenten
mensajes de error similares al de Traduccin personalizada
esta imagen.
El directorio de instalacin de Dev-PHP contiene el programa translator.exe.

Ello es debido a que el fichero de


idioma contiene algunos campos
en blanco (el cdigo del mensaje
de error indica el nmero de lnea Al ejecutarlo se abrir una ventana dual tal como la que ves en la imagen.
en que esto se produce). Para
corregirlos puede usarse la
herramienta de traduccin que
incluye el propio Dev-PHP.

En la ltima de las imgenes de la


derecha puedes observar que la
lnea 214 est en blanco -en la
versin en castellano- y esa es la
razn que justifica el mensaje de
error. Bastara con introducir all
un texto para que el cdigo de
error fuera sustituido por ese texto. En la parte derecha puede abrirse -desde el icono OPEN- el fichero del idioma que
queramos modificar y escribir en los campos correspondientes las versiones traducidas de
Realizados estos cambios no son los situados en la parte izquierda de la misma fila. Hechos los cambios, debemos guardar
necesarios si deseas utilizar la el fichero modificado pulsando sobre el icono SAVE.
versin en ingls Dev-PHP ya
estar listo para ser utilizado como En la imagen inferior tienes el ejemplo del campo 214, en blanco en la versin
editor para la configuracin de las
espaola, que produce el aparente mensaje de error en la opcin Ver del men de Dev-
aplicaciones que vamos a instalar PHP.
a continuacin.

Anterior Indice Siguiente


Instalando Apache 1.3.35

Qu es
Proceso de instalacin
un servidor WEB?
En el CD-ROM que contiene los materiales de este curso hay un directorio llamado
Software. En l tienes un fichero llamado apache_1.3.35-win32-x86-src.msi.
Podramos definir un servidor WEB
como una aplicacin que permite
Al hacer doble click sobre su icono deber aparecer una pantalla como esta:
acceder a los recursos contenidos
en algunos de los directorios del
ordenador que la alberga a
usuarios remotos que realizan sus
peticiones mediante el protocolo
HTTP.

Por tanto, instalar un servidor web


no es otra cosa que instalar y
configurar un progra- ma en una
unidad o directorio de un
ordenador cualquiera.

Qu es Apache?

Bajo este nombre suele hacerse


referencia a Apache Software
Foundation, orga- nizacin
norteamericana que se autodefine
con el objetivo de ... facilitar
ayuda organiza- tiva, legal y
financiera para los proyectos de
desarrollo de software tipo Open
Source (cdigo abierto).

Uno de los proyectos ms


populares de Apache es el Si en vez de esta pantalla apareciera un mensaje de error, es muy probable que se
desarrollo y suministro -de forma deba a que no tienes instalada la aplicacin Windows Installer Redistributable
gratuita y libre- de un software
necesaria para ejecutar los ficheros con extensin .msi.
de servidor HTTP, conocido
tambin como el servidor Apache.
Las versiones modernas de Windows a partir de Windows98 la tienen incorporada,
La corta pero si por cualquier circunstancia usando Windows98 no dispones de ella, puedes
historia de Apache descargarla desde este enlace.

Apache Software Foundation tiene Al pulsar Next en la ventana anterior se llega a esta otra en la que es preciso tener
su origen en febrero de 1995. seleccionada la opcin I accept the terms in the license agreement para que se active el
Hasta ese momento el software botn Next y poder continuar la instalacin.
ms popular de servidores de
HTTP era el desarrollado por Rob
McCool, miembro del Centro
Nacional para Aplicaciones de
Super computacin (NCSA), de la
Universidad de Illinois.

El desarrollo de aquel primitivo


software de servidor de NCSA
(software de dominio pblico y
cdigo abierto) tuvo algunos
problemas a mediados del ao
1994.

Esta circunstancia oblig a que


muchos de los webmasters que
utilizaban aquella aplicacin
tuvieran que desarrollar sus
propias extensiones y corregir de
forma individual los fallos de
funcionamiento de la aplicacin
original.

Un pequeo grupo de aquellos


webmasters entr en contacto -va
e-mail- con el objetivo de
coordinar y conjuntar sus tra- Al llegar a esta otra ventana las anteriores solo requieren ir pulsando en el botn
bajos de correccin y mejora de la Next es imprescindible rellenar los campos Network Domain, Server Name y
aplicacin original de NCSA. Administrator's e-mail adress.
Fueron Brian Behlendorf y Cliff
Skolnick quienes -a travs de una
lista de correo- coor- dinaron el
trabajo y lograron establecer un
espacio com- partido de libre
acceso para quienes participaran
en el proyecto en un ordenador
instalado en California.

En febrero de 1995, ocho


colaboradores del primitivo
proyecto decidieron aunar sus
esfuerzos de forma organizada y
fundaron lo que fue conocido como
Grupo Apache.

Usando como base el HTTPD 1.3


de NCSA y aplicando los patchs
desarrollados hasta ese momento,
lanzaron la primera versin oficial
(versin 0.6.2) del software de
servidor de Apache en abril de
1995.

Aquella primera versin entr en


un rpido e intenso proceso de
mejoras y alcanz una gran
implantacin como software de
servidor inicialmente era slo
para UNIX para diferentes
plataformas, una de las cuales es
la versin para Windows cuya
instalacin te estamos explicando
a la derecha, y que frente a otras
alternativas de servidor local de
HTTP tiene las ventajas de ser
gratuita y muy eficaz.

Manual o automtico

Al describir el proceso de
instalacin aqu a la derecha
sugeramos elegir la opcin Run
when started manually, only for
me frente a la otra alternativa
Como Network Domain y como Administrator's e-mail adress puedes poner nombres
posible la reco- mendada en la
cualesquiera siempre que no contengan espacios ni caracteres especiales y en el
pantalla de instalacin Run as a
service for All Users. caso de la direccin e-mail sta debe contener el smbolo @. Como Server Name escribe
localhost.
La instalacin recomendada
contempla el uso del servidor Por ltimo, elige la opcin Run when started manually, only for me (al margen te
como un servidor de red de rea comentamos el por qu de esa eleccin) y pulsa de nuevo Next.
local accesible desde el resto de
los ordenadores de esa red. Es En la pantalla que aparece inmediatamente despus de la anterior se permite elegir el
lgico que en esas circunstancias modo de instalacin: Complete Custom. Elige la opcin Complete y pulsa nuevamente
el servidor se configure con sobre Next.
autorranque y que se inicie
automticamente en el momento
en que se arranca el ordenador,
con lo cual empezar a consumir a
partir de ese instante y en todo
momento recursos del sistema.

En nuestro caso, la situacin es


excepcional. Slo vamos a utilizar
el servidor para probar y depurar
nuestros propios scripts PHP y en
ello, segura- mente vamos a
ocupar slo una pequea parte del
tiempo de uso del ordenador, por
lo que parece ser ms eficaz la
opcin de arrancarlo nica- mente
cuando sea necesario y, de esa
forma, ahorrar esos recursos del
sistema que nos podran
ralentizar el uso de otros
programas cuando no
necesitemos usar el servidor.

En cualquier caso, el proceso de


instalacin es idntico para ambas
opciones.
Te aparecer esta nueva pantalla en la que el instalador nos indica el directorio por
defecto en el que pretende instalar el servidor Apache.
Directorio de instalacin

Te hemos sugerido cambiar el


directorio de instalacin por
razones de comodidad.

Cuando configuremos PHP hemos


de escribir de forma repetida los
paths de ese directorio y con la
opcin recomendada la ruta es
mucho ms corta y con menos
riesgo de errores.

Arrancar Apache

Al optar por la configuracin con


arranque manual cada vez que
queramos poner en marcha el
servidor tendremos que acceder al
icono Apache.exe, que encontrars
en el directorio c:\Apache tal
como puedes ver en la primera de
las imgenes que tienes un poco
ms abajo. En este caso aunque no es necesario hacerlo vamos a pulsar sobre Change y
cambiarlo. Tambin al margen te explicamos las razones de esta opcin.
En el momento del arranque,
aparece una ventana de MS-DOS
Despus del Change de la ventana anterior aparecer esta otra. Ponla con la misma
tal como la que ves en la segunda
imagen. configuracin que aparece en la imagen, es decir, con Look in: (C:) y deja como Folder
name: C:\
No la cierres nunca!

Si lo haces slo conseguiras


apagar el servidor y adems lo
haras de una forma muy poco
ortodoxa. Si te resulta incmoda
minimzala pero no la cierres.

Cuando arranques Apache por


primera vez irn apareciendo en
esta ventana de MS-DOS una serie
de lneas se trata de un test de
configuracin y en caso de que
algo vaya mal te aparecer un
mensaje de error.

En los sucesivos arranques solo te


aparecer por el momento lo
siguiente:

Apache 1.3.35 (Win 32)


runnig...

Una vez que instalemos y


configuremos PHP dir algo ms,
pero por el momento slo eso.

Una pgina de prueba

Con el servidor arrancado y


funcionando, bastar con que Como podrs leer en la propia pantalla de instalacin, es muy importante poner la
abras tu navegador y escribas en barra invertida (\) detrs de C: al indicar el Folder name. No te olvides de hacerlo.
la barra de direcciones lo siguiente:

http://localhost/
Una vez hayas pulsado OK volver a aparecer la ventana que permite cambiar el
o, tambin directorio de instalacin. Comprueba que ahora diga Install Apache HTTP Server to
http://127.0.0.1/ the folder C:\ y pulsa Next en esa ventana y en las siguientes.

con lo que deber abrrse una Aparecer una ltima ventana donde dice Installation Wizard Completed y una vez que
pgina idntica a la ves un la hayas pulsado el botn Finish la instalacin de Apache habr terminado.
ltima de las imgenes. Esa ser
la prueba definitiva de que el
servidor est funcionando Probando Apache
correctamente.

Si te ests preguntado por qu Estas tres imgenes ilustran el proceso de prueba que te describimos al margen.
esas direcciones localhost
127.0.0.1 o por qu no hemos
escrito el nombre de ninguna de
pgina web, ten un poco de
paciencia! Trataremos de ello
cuando configuremos Apache.

Apagar Apache

Aunque se puede desconectar


Arranque del servidor Apache
cerrando la ventana de MS-DOS, el
mtodo correcto es: establecer
esa ventana como ventana
activa, pulsar las teclas Ctrl+C y Cuidado!
esperar unos pocos segundos.
Transcurrido ese tiempo la ventana A partir de la versin 1.3.27, al ejecutar Apache bajo Windows98 aparece un mensaje de
MS-DOS se cerrar advertencia no afecta al buen funcionamiento del servidor tal como puedes ver en la
automticamente y se habr imagen.
apagado Apache.
En versiones ms recientes de Windows (NT, XP, 2000) este mensaje no aparece.
Desinstalacin
de Apache 1.3.35

El servidor Apache 1.3.35 se


desinstala como cualquier otro
programa de Windows. Bastar
con acceder a Paneles de control,
opcin de Agregar o quitar
programas elegirlo en la lista de
programas instalados y Ventana de MS-DOS que debe permanecer abierta mientras Apache est funcionando
desinstalarlo.

Antes de ejecutar ese proceso es


necesario que el servidor est
apagado y saber que quedarn
algunos restos de la instalacin
que si fuera necesario habra
que eliminar manualmente.

El desinstalador de Apache no
eliminar ni el directorio raz C:
\Apache ni los subdi- rectorios
conf y htdocs del mismo. La
razn es la seguridad. El directorio
conf contiene los archivos de
configuracin del servidor en
pginas posteriores veremos que
hay que modificar sus valores por
defecto y al no eliminarlos nos
estar dando la opcin de poder
reutilizarlos (sin tener que
empezar de cero) en futuras
instalaciones.

Lo mismo ocurre con htdocs. En


ese directorio sern donde se
Pgina de prueba del servidor Apache
almacenen los documentos que
vayamos creando pginas web,
imgenes, etc. y, como es lgico,
un error en el proceso de Nombres de dominio en un servidor local
desinstalacin podra provocar su
prdida. Esa es la razn de que se Est opcin no es necesaria para realizar la instalacin propuesta para seguir este
conserven. curso, pero es posible que te apetezca tener tu propio dominio local para poner una
Por idnticas razones, si al
direccin personalizada en vez de usar localhost como nombre de dominio.
reinstalar Apache ya existieran
esos directorios el instalador no los
Si utilizas Windows98 encontrars un fichero con el nombre hosts o hosts.sam
sobrescribira manteniendo en el directorio Windows. Si tu sistema operativo es W2000, NT XP Pro tendrs que
configuraciones y documentos de buscar ese fichero en:\winnt\system32\drivers\etc\ y si se trata de XP Home lo
la versin anterior. encontrars en: \windows\system32\drivers\etc\

Al editar ese fichero hosts.sam- encontrars algo similar a esto:


Nombres de dominio
en redes locales
# For example:
#
Cuando se utiliza un servidor a # 102.54.94.97 rhino.acme.com # source server
travs de una red de rea local, lo # 38.25.63.10 x.acme.com # x client host
habitual es acceder a l
escribiendo como direccin la IP de
ordenador en el que se encuentra 127.0.0.1 localhost
instalado el servidor.
Si aades una lnea como la sealada en rojo la IP 127.0.0.1 ha de mantenerse y
Mediante un proceso similar al
pones cualquier nombre de dominio (mispruebas.com) en el caso del ejemplo
descrito a la derecha, se puede
modificar el fichero HOSTS de uno
(o varios) de los equipos de la red # For example:
aadiendo una lnea con el nombre #
del dominio ficticio precedida de la # 102.54.94.97 rhino.acme.com # source server
direccin IP del servidor. # 38.25.63.10 x.acme.com # x client host
Si la IP del servidor local fuera
168.0.12.234, al incluir en el 127.0.0.1 localhost
fichero hosts una lnea como esta: 127.0.0.1 mispruebas.com
168.0.12.234 mispruebas.com
podramos acceder a l tanto
bastar con que guardes el fichero con los cambios con el nombre hosts (sin ninguna
mediante:
extensin y en el mismo directorio). A partir de ese momento, ya podrs escribir en el
http://168.0.12.234
como a travs de: navegador -con Apache en marcha- cualquiera de las dos direcciones:
http://mispruebas.com
http://localhost


http://mispruebas.com

Cuidado!

Si tienes configurado tu navegador de forma que realice la conexin a Internet a travs de


un servidor proxy habrs de activar la opcin No usar servidor proxy para servidores locales
y aadir en la lista de excepciones (direcciones a las que no se accede a travs del proxy) el
dominio local que acabas de crear.

En esta imagen tienes un ejemplo de esta modificacin sobre Internet Explorer.

En otros navegadores el proceso de modificacin es muy similar a este que ves en la


imagen.

Anterior Indice Siguiente


Instalacin de PHP 4.4.2

Qu es PHP?
Instalando el PHP

El lenguaje PHP -acrnimo de En el CD-ROM del curso dentro de la carpeta Software podrs encontrar un fichero
Hypertext Pre Processor- suele llamado php-4.4.2-Win32.zip.
definirse como: interpretado y de
alto nivel. El cdigo de sus Si tienes instalado Winzip, al hacer doble click sobre el icono se te abrir la ventana de
instrucciones va insertado en este descompresor y al pulsar sobre el icono Extract se te abrir una ventana como la que
pginas HTML (es un lenguaje de aparece en la imagen.
script) y es interpretado, siempre,
en el servidor. Si has seguido los pasos indicados en la pgina anterior para la instalacin del servidor
Apache, tendrs en tu ordenador un directorio llamado C:\Apache.
Se trata un lenguaje de estilo
clsico, cercano en su sintaxis a C+ Selecciona como directorio de descompresin C:\Apache tal como ests viendo en la
+. figura y presta atencin a que en las opciones de descompresin de Winzip est
seleccionada la opcin All files y marcada nicamente la casilla de verificacin Use folder
Qu se necesita para names.
trabajar con PHP?

Para trabajar con PHP es necesario


tener instalado un servidor HTTP
en nuestro caso, Apache para
Windows y configurarlo de tal
manera que sea posible la
interaccin entre ambas
aplicaciones.

Podemos
probar ahora PHP?

Si ya has realizado el proceso de


instalacin tal como lo hemos
descrito en la columna de la
derecha, puede que te preguntes
si como hemos hecho al instalar
Apache es posible hacer ahora
una prueba de su funcionamiento.

La respuesta es NO. Analiza con un


poco de detenimiento el proceso
que hemos seguido y observars
que no hemos hecho una
instalacin sino que nos hemos
limitado a des- comprimir una
serie de ficheros colocndolos en
unos directo- rios determinados.

Lo hemos hecho as porque lo que


acabamos de instalar no es una
aplicacin que pueda funcionar Una vez que hayas pulsado sobre el botn Extract de la imagen anterior y descomprimido
de forma autnoma, sino el el fichero php-4.4.2-Win32.zip se te crear en el directorio C:\Apache un subdirectorio
intrprete de un len- guaje de llamado php-4.4.2-Win32, que contendr a su vez una serie de subdirectorios necesarios
scripts del lado del servidor que para el correcto funcionamento de PHP.
requiere ser invocado por medio
de un software de servidor. Por razones de comodidad a la hora de hacer las configuraciones vamos a cambiar el
nombre de la carpeta php-4.4.2-Win32 y dejarla simplemente como php4 tal como puedes
As que, antes de que pueda ser
utilizado, tendremos que indicarle ver en la imagen inferior.
al servidor el sitio dnde ha de
buscarlo y cundo debe utilizarlo.

Para ello es imprescindible


efectuar algunos cambios en las
configuraciones que se han creado
por defecto para PHP y Apache.

Eso ser lo que veamos en las


pginas siguientes.
Una vez hayas renombrado el directorio anterior, el proceso de instalacin de PHP habr
terminado.

Anterior Indice Siguiente


Configuracin de Apache 1.3.35

Para facilitar las cosas


Modificacin del fichero httpd.conf
para configurar PHP como mdulo de Apache
A lo largo de este proceso y en
otros sucesivos vas a encontrar Tal como comentbamos en la pgina anterior la utilizacin de PHP requiere introducir
ficheros que tienen el mismo algunos cambios en la configuracin de Apache.
nombre y que se dife- rencian slo
por la extensin. En el momento en el que se instala Apache se crea automticamente en el
subdirectorio C:\Apache\conf un fichero llamado httpd.conf que contiene la
Sera una buena idea tener
configuracin por defecto del servidor Apache.
Windows configurado de forma que
se visualicen siempre las
Tendremos que modificarlo. Pero, como precaucin por si tenemos algn problema y
extensiones de todos los tipos de
ficheros.
necesitamos volver a utilizar el fichero de la configuracin por defecto, vamos a hacer
una copia de seguridad. Abriremos el documento httpd.conf con un editor de textos
Te sugerimos que hagas esta cualquiera lo ms cmodo ser utilizar Dev-PHP que seala los nmeros de lnea y
modificacin. Por si nunca has con la opcin guardar como crearemos una copia con el nombre httpd.orig
usado esa opcin de Windows, te
describimos cmo hacerlo.
Cuidado!
Bastar con que hagas doble click
en el icono Mi PC y vayas a la Si has utilizado el block de notas de Windows es probable que en el proceso anterior no te
opcin Ver (en el caso de haya guardado como httpd.orig sino como httpd.orig.txt.
Windows2000 o XP habrs de ir a Comprueba los ficheros del directorio c:\Apache\conf y si te ha ocurrido lo que
la opcin Herramientas) de la comentamos tendrs que recurrir al conocido mtodo de pulsar sobre el icono del fichero
ventana que se abre. En el con el botn derecho del ratn, elegir la opcin Cambiar nombre y quitar el .txt que aparece
submen de esa opcin elige
al final del nombre del archivo.
Opciones de Carpeta.

Una vez en Opciones de Carpeta


debes elegir la opcin Ver de la
Una vez hecho esto ya podremos hacer las modificaciones con toda tranquilidad, as
nueva ventana y buscar la lnea que volveremos a abrir el fichero httpd.conf para hacer los cinco cambios siguientes:
en la que dice Ocultar extensiones
para los tipos de archivos Fichero inicial httpd.conf
conocidos y, desmarcando su
casilla de verificacin y pulsando Guardar como httpd.conf
sobre Aplicar y Aceptar ya podrs
Modificaciones en el fichero inicial
visualizar las extensiones de todos
los ficheros. Lnea Cambios
Donde dice:
Efecto de los cambios
Options Indexes FollowSymLinks MultiViews
en httpd.conf 335
cambiar por:

La configuracin de Apache Options -Indexes FollowSymLinks MultiViews


permite mltiples opciones y
ofrece muchas posibilidades. Donde dice:
Tantas, que justificaran todo un #
curso dedicado al estudio de este 176
servidor y sus opciones de cambiar por:
configuracin.
LoadModule php4_module c:/Apache/php4/sapi/php4apache.dll
No entraremos en ese mbito, Donde dice:
pero s trataremos de conocer de
forma somera los por qus de las ClearModuleList
modificaciones que comentamos a 205
aadir inmediatamente despus una nueva lnea con
la derecha.
AddModule mod_php4.c
Mediante la primera de ellas le
estamos diciendo a Apache que Donde dice:
cuando reciba una peticin
DirectoryIndex index.html
dirigida a uno cualquiera de los 386
directorios accesibles a travs de cambiar por:
HTTP en la que no se especifique
ningn nombre de pgina, debe DirectoryIndex index.html index.htm index.php
comprobar si en ese directorio Donde dice:
existe alguna pgina llamada index.
html. (lnea en blanco)
728
En caso de que dicha pgina cambiar por:
existiera la mostrara y en caso AddType application/x-httpd-php .php
contrario volvera a comprobar
para ver si existe alguna otra Una vez efectuados estos cambios ya podremos guardar el fichero, sin cambiar su
llamada index.php (el segundo nombre original httpd.conf, y tendremos lista la nueva configuracin de Apache.
nombre de pgina contenido en
esa lnea).
Algunos detalles importantes sobre httpd.conf
En caso de no encontrar esa
coincidencia deber continuar
comprobando una a una, y de Si con la configuracin descrita ms arriba intentamos acceder a la direccin:
forma secuencial, la existencia de http://localhost/images/ nos aparecera un mensaje con este:
las pginas siguientes hasta
encontrar alguna cuyo nombre
coincidiera con uno de la lista
establecida en la configuracin de
httpd.conf. En el caso de que no
encontrara ninguna que coincida
con los nombres indi- cados en
esta directiva dara un mensaje de
error del tipo: File not found.

Esta opcin de configuracin de


Apache es la que nos permite
escribir direcciones del estilo www.
cnice.mecd.es en las que sin
especificar ningn nombre de
pgina nos aparece en pantalla el
mismo contenido que si
hubiramos escrito:
www.cnice.mecd.es/index.html

Como podrs ver, esta opcin de


configuracin aade mayor
comodidad para al usuario.

En la segunda modificacin le
hemos indicado a Apache que
deber cargar un mdulo que se
encuentra en el sitio que indican la
ruta y el nombre del fichero.
Este mdulo es el que permite esto ocurre como consecuencia de haber puesto el signo menos delante de Indexes
que el servidor interacte con PHP (cuidado! debe ir pegado a Indexes sin ningn espacio intermedio) en la lnea Options -
cuando sea necesario.
Indexes FollowSymLinks MultiViews.
En la tercera modificacin
indicamos al servidor que debe El subdirectorio images no contiene ficheros con nombre index.html, ni tampoco index.
utilizar un mdulo propio php ni index.htm (los especificados en la directiva DirectoryIndex) y el signo menos lo
(programa escrito en lenguaje C) que hace es denegar el acceso (en el caso de no indicar el nombre de algn documento
mod_php4.c especfico para PHP en la direccin) a los directorios que no los contengan.
y para este tipo de configuracin.
Si no hubiramos modificado esa directiva nos aparecera una lista con todos los ficheros
Aqu estamos instalando PHP como contenidos en ese subdirectorio, tal como puedes ver en esta imagen.
mdulo de Apache, pero existe
otra posibilidad conocida como
instalacin en modo CGI
(Common Gateway Interface).

Esta configuracin se comenta en


el apartado titulado: Otras
instalaciones.

Mediante la cuarta modificacin


AddType application/x-httpd-php
se le indica a Apache que los
nicos ficheros susceptibles de
contener scripts que deban ser
ejecutados por el intrprete de
PHP son aquellos que tienen como
extensin .php. Si un fichero con
extensin distinta contuviera
scripts PHP stos no seran
ejecutados.

Otras modificaciones
en httpd.conf
Aunque no vamos a modificarlos, es conveniente saber que existen algunos otros
A lo largo de curso iremos elementos importantes en httpd.conf.
incorporando algunos servicios que
requerirn algunos otros cambios DocumentRoot "C:/Apache/htdocs"
en la configuracin de Apache.
Esta lnea que se ha incluido automticamente al hacer la instalacin indica la ruta y el
Hablaremos de ellos cuando sea nombre del directorio en el que, obligatoriamente, han de estar los documentos y los
necesario realizarlos. subdirectorios susceptibles de ser servidos a travs del protocolo HTTP.

Cualquier documento que estuviera fuera de este directorio sera inaccesible, por lo
tanto todos los documentos que vayamos generando a lo largo del curso, deberemos
guardarlos dentro de este directorio htdocs.

Como es lgico, bastara cambiar esa lnea de la configuracin para utilizar como raz del
servidor otro directorio cualquiera.

ServerName localhost

Esta otra lnea tambin contenida en httpd.conf es la que determina el nombre del
servidor y a travs de ella se identifican las peticiones que el navegador realiza a ese
servidor. Por esta razn, cuando probbamos la instalacin de Apache, escribamos como
direccin http://localhost.

Anterior Indice Siguiente


Configuracin de PHP 4.4.2

Los cambios en php.ini


Antes de empezar la configuracin

Con la configuracin de PHP Si abrimos nuestro directorio: C:\Apache\php4 encontraremos dentro de l un


ocurre lo mismo que en el caso de fichero llamado php4ts.dll que deberemos copiar a nuestro sistema en el directorio que
Apache. Tambin existen un se indica en la siguiente tabla:
montn de posibilidades de
configuracin iremos viendo Fichero original c:\Apache\php4\php4ts.dll
algunas de ellas a medida que
vaya siendo necesario a travs de Copiar en el subdirectorio que se indica (dentro del que contiene el S.O.)
las cuales se puede modificar de
S.O. Directorio
forma sustancial el
comportamiento de PHP. Windows98 \system
Cuando nos hemos referido a la W2000
eleccin de hosting hemos Windows NT \system32
comentado que sus niveles de Windows XP
prestaciones son distintos y que
muchos de ellos tienen
desactivadas algunas de las
funciones. Pues bien, es en este Si ya tuviramos un fichero con ese nombre en el directorio de destino tendremos
fichero y en una lnea donde dice que sobrescribirlo sustituyendo el preexistente por el que tenemos en C:\Apache
disable_functions = en la que se \php4.
podra incluir la lista de funciones
a desactivar.
Configuracin de PHP
Modificando directivas en este
fichero podremos establecer
tambin restricciones relativas a En el directorio C:\Apache\php4 tenemos un fichero llamado php.ini-dist. Lo
cuestiones de seguridad, as como abriremos con un editor de textos por ejemplo el Dev-PHP y haremos estas
activar extensiones por medio de modificaciones:
las cuales libreras dinmicas se
aaden nuevas funciones de PHP Fichero inicial php.ini-dist
con las que podramos crear
ficheros en formato PDF o Guardar como php.ini
imgenes din- micas, por citar
Modificaciones en el fichero inicial
dos ejemplos.
Lnea Cambios
Ya iremos hablando de ello. Por el
momento ser suficiente con Donde dice:
utilizar la configuracin que doc_root =
comentamos a la derecha. 421
cambiar por:

Nuestras modificaciones doc_root=c:\Apache\htdocs\


Donde dice:
Vamos a comentar ahora las
modificaciones del php.ini que ;extension_dir="./"
describimos aqu a la derecha. 428
cambiar por:
En la primera hemos asignado extension_dir ="c:\Apache\php4\extensions\"
como valor de doc_root una ruta
que, como observars, apunta el Donde dice:
directorio htdocs. En otras register_globals= Off"
palabras, le estamos diciendo a 365
PHP en que sitio del ordenador cambiar por:
fjate que incluimos una ruta
absoluta se ubicarn los ficheros
register_globals=On
cuyos scripts debe interpretar.

Con la segunda modificacin


extension_dir = le hemos Cuidado!
sealado al intrprete de PHP en
qu sitio debe buscar las En la configuracin de PHP (php.ini) bajo Windows debemos usar siempre la barra
extensiones que eventualmente invertida ( \ ) a la hora de escribir los paths.
pueda necesitar. Cuando tratamos la configuracin de Apache (httpd.conf) tambin bajo Windows lo hemos
hecho al revs, hemos escrito todos los paths utilizando la barra normal ( / ).
Estas extensiones, que vienen con
la instalacin de PHP, se Ten muy presente que estas sintaxis son distintas y cuando efectes modificaciones de
descomprimen por defecto en configuracin utiliza la adecuada a cada uno de los ficheros.
un subdirectorio llamado
extensions y esa es la razn por la
que la ruta incluida en esta Una vez que hayamos modificado los apartados anteriores guardaremos el fichero con
modificacin apunta a un directorio el nombre php.ini en el directorio donde est instalado nuestro sistema operativo. Si
con ese nombre. estamos utilizando Windows98 o WindowsXP ser el directorio Windows y si se trata
de NT 2000 seguramente se llamar winnt.
Es muy importante la tercera de
las modificaciones. Poner
register_globals=On tiene la Un script de prueba
ventaja de permitir gestionar los
datos recibidos por los scripts de
una forma muy sencilla, pero esto Para comprobar que todo funciona correctamente deberemos escribir nuestro primer
conlleva un grave riesgo de script PHP.
seguridad.
Abriremos nuestro editor Dev-PHP y escribiremos exactamente esto:
Tanto es as que se comenta que,
las prximas versiones de PHP no <? phpinfo(); ?>
van a permitir que se modifique
esta directiva que quedar
desactivada de forma definitiva. Ahora lo guardaremos en C:\Apache\htdocs recuerda que este es el que hemos
configurado como directorio raz de servidor con el nombre info.php
Sern muchas las veces en las que
hagamos mencin de ella y sern Recuerda tambin que es probable que el block de notas haya aadido la extensin .
tambin bastantes los casos en los
txt y que el fichero puede haber sido guardado como info.php.txt. Lo comprobaremos
que, a lo largo del curso, vayamos
mirando el directorio htdocs y cambiando el nombre si fuera necesario.
cambiando su configuracin.

Eventuales problemas Probando el primer script


de instalacin
Una vez instalados y configurados Apache y PHP y creado el fichero info.php, ha
Esperamos que las configura- llegado el momento de comprobar si hemos hecho correctamente las configuraciones y si
ciones no te hayan dado ningn todo funciona bien.
problema y que todo te est
funcionando correctamente. Arrancaremos el servidor Apache y una vez que tengamos la ventana de MS-DOS
abierta, deberemos visualizar en ella lo siguiente:
De no ser as, te sugeriramos que
fueras comprobando esta lista de
chequeo:

Est instalado Apache en el


directorio c:\Apache?
Est instalado PHP en el
directorio c:\Apache\php4?
Has copiado en el directorio del
sistema la librera llamada php4ts. lo que significara que Apache est funcionando con el mdulo PHP.
dll que viene con la instalacin de
PHP? Solo faltara abrir el navegador y escribir una de estas dos direcciones:
Est el fichero php.ini en el http://localhost/info.php o http://127.0.0.1/info.php y aparecera en pantalla una pgina
directorio windows? como esta:
Est en c:\Apache\conf el
fichero llamado httpd.conf?
Has constatado que el fichero
php.ini contiene con la sintaxis
correcta todas las modificaciones
indicadas?
Has comprobado la sintaxis de
las modificaciones que has
efectuado en httpd.conf?
Has comprobado la sintaxis del
fichero info.php?
Has comprobado que est en
htdocs el fichero info.php ?

Pensamos que despus de verificar


todas esta lista de puntos de
comprobacin no debe existir
ningn problema de
funcionamiento, pero si se diera De ser as, el proceso de instalacin y configuracin habra terminado y esa pgina nos
esa circunstancia, es muy probable estara facilitando toda la informacin relativa a la configuracin actual de nuestro PHP.
que el origen est en un error de
sintaxis en uno de los ficheros de
configuracin. Cuidado!

Para esta muy improbable Como medida de seguridad y anticipndonos a razones que comentaremos ms adelante,
emergencia, te hemos puesto en el guarda con el mismo nombre una copia del fichero php.ini, que acabamos de configurar,
directorio cursoPHP del CD-ROM en el directorio c:\Apache\php4\
una carpeta llamada
Configuraciones donde tienes
ambos ficheros: httpd.conf y php.
ini.
Anterior Indice Siguiente
Autoinstalacin de Apache+PHP

Precauciones previas
Instalacin automtica
En el directorio Extras del CD-ROM encontrars un fichero llamado Apache_PHP.exe.
Esta instalacin no es otra cosa Bastar con que hagas doble click sobre su icono y comenzar el proceso de instalacin
que una alternativa de emergencia automtica cuyas ventanas y secuencia de instalacin puedes ver en la imagen.
para aquellos casos en los que
tengas dificultades durante el
proceso de instalacin y
configuracin manual.

Si, por alguna circunstancia,


recurres a este procedimiento
(esperamos y deseamos que no te
resulte necesario) de instalacin
despus de haber intentado las
instalaciones descritas en las
pginas anteriores, es muy
conveniente que antes de ejecutar
esta instalacin hagas una
desinstalacin previa de las
versiones anteriores (desde la
opcin agregar o quitar
programas) y que -despus de
desinstalar- borres el directorio C:
\Apache.

La instalacin automtica

La utilidad que comentamos aqu


no hace otra cosa que realizar de
forma automtica los procesos
descritos en pginas anteriores. Es
decir:

Instalar Apache en el

Una vez concluido el proceso anterior aparecer un nuevo grupo de programas tal
directorio c:\Apache
como el que ves en esta imagen.
Descomprimir PHP en c:
\Apache\php4

Incluir los ficheros httpd.



Haciendo doble click sobre su icono, arrancara el servidor Apache se abrir una
conf y php.ini con las
ventana de MS-DOS como esta:
modificaciones
anteriormente descritas

Copiar al directorio del


sistema el fichero php4ts.dll

Copiar el fichero php.ini al


directorio windows

Crear el script info.php en


el directorio htdocs. que nos indicara que Apache est funcionando con el mdulo PHP.

Desinstalacin Solo faltara abrir el navegador y escribir una de estas dos direcciones:
http://localhost/info.php o http://127.0.0.1/info.php y aparecera en pantalla una pgina
como esta:
Para realizar la desinstalacin es
necesario tener apagado el
servidor Apache. Basta con
acceder a la opcin Agregar o
quitar programas y elegir: Apache
1.3.35 + PHP 4.4.2 para que se
realice la desinstalacin completa y
el borrado tanto del fichero php.ini
del directorio Windows como de
php4ts.dll del directorio del
sistema.

De ser as, el proceso de instalacin y configuracin habra terminado y esa pgina nos
estara facilitando toda la informacin relativa a la configuracin actual de nuestro PHP.

Apagar Apache

Aunque se puede desconectar cerrando la ventana de MS-DOS, el mtodo correcto es:


establecer esa ventana como ventana activa, pulsar las teclas Ctrl+C y esperar unos
pocos segundos. Transcurrido ese tiempo la ventana MS-DOS se cerrar automticamente
y se habr apagado Apache.

Anterior Indice Siguiente


Instalando MySQL 4.0

Acceso a
Proceso de instalacin MySQL
las bases de datos
Dentro del directorio Software del CD-ROM del curso podrs encontrar el fichero
mysql-4.0.26-win32.zip que contiene los ficheros de instalacin de MySQL. Lo primero
El acceso y tratamiento de la
informacin en bases de datos que tenemos que hacer es descomprimirlo en un directorio provisional, en cualquier parte
MySQL requiere que los usuarios de nuestro disco duro.
estn identificados mediante un
nombre (login) y opcionalmente
una contrasea de acceso.

El propio instalador de MySQL


incluye, por defecto, un login con
nombre root, que utiliza como
password una cadena vaca.

A cada usuario se le pueden


asignar privilegios de modo que,
por ejemplo, solo pueda realizar
consultas, o acceder a tablas
concretas. El usuario root goza de
todos los privilegios posibles y
podra ser usado para todos los
supuestos de este curso. No
obstante, como en situaciones
reales es un usuario
desaconsejable por el riesgo que
entraa utilizar usuarios por
defecto, vamos a crear un nuevo
usuario con contrasea y con
todos los privilegios que ser
el que utilizaremos en los ejemplos
relativos a MySQL.

Arrancar y parar el
servidor MySQL

La gestin habitual de MySQL se


realiza a travs de la pantalla de
Una de las opciones posibles es la que aparece en esta imagen.
MS-DOS (en el caso de
Windows98) o mediante su
Una vez efectuada la descompresin, aparecer dentro del directorio provisional que
equivalente Smbolo del sistema
acabamos de crear un fichero llamado setup.exe.
en las versiones de Windows ms
recientes.
Al hacer doble click sobre su icono, comenzar el proceso de instalacin que nos ir
Alternativamente, es posible indicando que se instalar por defecto en c:\mysql (Destination folder: c:\mysql) y que la
configurar la opcin de efectuar instalacin ser Typical. Mantendremos esas opciones dejando que se complete el proceso
esos procesos desde Windows y a partir de ese momento ya podremos borrar el directorio provisional cuando nos
utilizando un programa llamado parezca oportuno.
WinMySQLadmin.

Aunque a lo largo del curso Puesta en servicio desde la consola de MS-DOS


utilizaremos esta ltima opcin
(por razn de comodidad) vamos a
realizar la puesta en servicio y la Arrancar MySQL
configuracin de un nuevo usuario
desde la consola de DOS. Para poner en marcha MySQL basta con ejecutar este comando:

Algunos comandos
para ejecutar MySQL
desde MS-DOS
a partir de su ejecucin el servidor MySQL ya estar activo y podramos gestionarlo desde
Antes de empezar a ejecutar los PHP desde la propia consola MS-DOS.
comandos de MySQL es necesario
situarse en el subdirectorio bin
que est dentro de c:\mysql. Cuidado!

Para ello hemos de escribir en el En algunas versiones de Windows es posible que, al arrancar el servidor, se quede el cursor
prompt de DOS lo siguiente: intermitente en la ventana de MS-DOS sin que regrese al prompt. Basta con cerrar la
ventana Smbolo del Sistema y reabrirla. El servidor seguir activo y ya ser posible la
CD C:\mysql\bin
ejecucin de comandos desde esta consola.
Una vez en el directorio bin (all
estn los ejecutables de MySQL)
los comandos bsicos de arrancar Apagar el servidor MySQL
y parar, as como el de creacin de
un usuario los tienes descritos Para poder apagar el servidor es necesario utilizar un nombre de usuario. En este caso
junto a las ilustraciones de la
utilizaremos el nombre de usuario root (el usuario que se crea por defecto.
derecha.
La sintaxis sera la siguiente:
Creacin de un nuevo
usuario

Ser preciso que creemos un


nuevo usuario. El usuario root no
tiene contrasea y vamos a ver la Ejecutar instrucciones como usuario
opcin de crear uno que requiera
el uso de una contrasea para El primer paso para poder ejecutar sentencias MySQL ser tener el servidor activo.
acceder. Para ello habr que seguir el proceso descrito anteriormente.
Durante el proceso de creacin le
El paso siguiente sera ejecutar una instruccin como esta (solo en el caso del usuario
daremos los mximos privilegios
root o de un usuario sin contrasea).
(ALL PRIVILEGES) de modo que
pueda gestionar cualquier base de Ejecutaremos esta instruccin (con idntica sintaxis) para ejecutar una sentencia
datos, tabla y que adems pueda MySQL.
crearlas, borrarlas o modificarlas
sin restriccin alguna.

Es importante que lo creemos con


la sintaxis exacta ya que, los
ejemplos de los temas Este mensaje de bienvenida y el cambio de directorio (observa que ahora el prompt ha
relacionados con MySQL estn cambiado y apunta hacia mysql nos indican que MySQL est listo para recibir
desarrollados utilizando el usuario instrucciones.
pepe con contrasea pepa
(ambas en minsculas).

Arrancar y parar mediante


WinMySQLadmin

Como opcin alternativa al uso de


comandos de MS-DOS esta versin
de MySQL dispone de una utilidad Lo nico que haremos desde aqu ser crear un usuario. En adelante nos
que permite arrancar y parar el comunicaremos con MySQL a travs de la web y usando como herramienta de
servidor desde el propio Windows. comunicacin el PHP.

En la columna de la derecha tienes Para crear el nuevo usuario utiliza exactamente la sintaxis que ves en la imagen.
descrito e ilustrado el proceso de
puesta en marcha y apagado del
servidor MySQL mediante esta
utilidad.

WinMySQLadmin el programa al
que accedemos desde el icono del
semforo tiene una peculiaridad
que hemos de tener muy en Cuidado!
cuenta.
El pulsar Enter en MySQL no significa como ocurre en DOS que se vaya ejecutar el
Al hacer click sobre el semforo comando. Si observas la imagen, hemos pulsado Enter detrs de la palabra localhost de la
disponemos de dos opciones, tal
primera lnea y lo que ha ocurrido es que el cursor ha saltado hasta la segunda incluyendo
como podemos ver en la ltima
imagen de esta pgina. La opcin automticamente > que significa que continua la instruccin anterior.
Win 9x slo ser accesible para En MySQL las ejecucin de las instrucciones requiere que haya un ; inmediatamente antes
quienes usen Windows98 mientras del pulsar la tecla Enter.
que la opcin Win NT podr ser
utilizada por los usuarios de
Windows2000, NT o XP. Salir del interface de usuario
Show me es independiente del
sistema operativo que estemos Para abandonar la interface de usuario basta con escribir exit tal como ves en la
usando. imagen. El sistema escribir su mensaje de despedida de forma automtica y el prompt
regresar a c:\mysql\bin.
Cuando elegimos la opcin Show
me aparece una ventana en la que
mediante diferentes pestaas se
nos va mostrando toda la
informacin relativa a la
configuracin actual de MySQL.

Hemos de advertirte que para salir


de la opcin Show me y restaurar
el semforo es imprescindible
pulsar sobre el botn Hide me que
Cuidado!
aparece en la parte inferior
izquierda de esa ventana cuando la
Independientemente de que puedas crear otros usuarios con otras contraseas es
pestaa seleccionada es imprescindible crear el usuario pepe con contrasea pepa. Todos los ejemplos que
Environment. incluimos requieren este usuario.

Minimizando cerrando esa


ventana no se restaura el icono del Acceso al interface de usuario con contrasea
semforo.

Tenlo en cuenta. Puede que te Cuando un usuario registrado con contrasea (tal como ocurrira al usuario pepe
evite algunos sobresaltos. creado en los prrafos anteriores) trate de acceder al interface de usuario deber usar
siempre una sintaxis como esta:
Desactivacin
del autorranque

Hemos podido comprobar que en


algunas ocasiones no basta con La nica diferencia con la que hemos usado anteriormente estriba en la inclusin del
quitar el acceso directo del modificador p que indica que ese usuario requiere contrasea. Al hacerlo, nos pedir que
directorio Inicio para evitar el introduzcamos la clave (Enter password) y solo entonces nos permitir el acceso.
autorranque.

Si eso te ocurriera, tendrs que ir Puesta en servicio mediante WinMySQLAdmin


a la opcin Ejecutar (desde el
Inicio de Windows) escribir
msconfig y aceptar. Vayamos ahora al subdirectorio c:\mysql\bin y pulsemos sobre este icono

En la ventana que aparecer,


debers seleccionar la pestaa
Inicio y buscar una lnea en la que
diga WinMySQLadmin Tool.

Si la casilla de verificacin que hay


a la izquierda de ella est marcada
debes desmarcarla y despus de Veremos que arranca el servidor MySQL porque irn apareciendo una serie de
pulsar Aplicar y Aceptar dejar que ventanas que se irn cerrando automticamente y al final aparecer una como esta
se reinicie Windows con esa (slo la primera vez que arranquemos MySQL):
configuracin.
Dnde se almacena la
informacin?

Al instalar el programa se crea


dentro del directorio mysql un
subdirectorio llamado data
destinado a contener todas las
bases de datos que vayan a ser
gestionadas por MySQL.

Cada base de datos estar


contenida en un subdirectorio
diferente que tendr el mismo
nombre que de la base que
contiene.

El instalador de MySQL crea de


forma automtica dos bases de
datos con los nombres: mysql y
test.

No debes borrarlas!
en la que vamos a escribir como nombre de usuario y contrasea los mismos del usuario
La base de datos mysql contiene que acabamos de crear, es decir: pepe y pepa, y luego pulsaremos OK.
los datos relativos a usuarios y si
no est presente, MySQL no La ventana se cerrar y en la barra de herramientas de Windows aparecer este
funcionar.

La denominada test es una base semforo en verde


de datos que permite chequear la
instalacin y la configuracin de Durante el proceso de instalacin, en la carpeta Inicio del sistema se crea un acceso
MySQL. directo a winmysqladmin.exe y, por lo tanto, cada vez que conectemos el ordenador
MySQL se arrancar automticamente con el consiguiente consumo de recursos del
sistema.
Desinstalacin de MySQL
Podemos impedir este arranque automtico moviendo el acceso directo de Inicio a
MySQL se desinstala desde la nuestro escritorio o a cualquier otro sitio al que nos resulte cmodo acceder. De esa
opcin Agregar o quitar programas forma podremos arrancar MySQL slo cuando sea necesario.
como cualquier otro programa de
Windows. El proceso de Para la desconexin basta con hacer click sobre el semforo y elegir la opcin que
desinstalacin no elimina mi los vemos en la imagen.
ficheros ini ni tampoco el
subdirectorio data. Este ltimo se
conserva como medida de
seguridad ya que contiene todas
las bases de datos y de eliminarlo
se perdera la informacin. Si en
algn momento tratas de
desinstalar para hacer una nueva
instalacin, lo aconsejable sera
mantener el directorio data y
buscar y eliminar todos ficheros
my.* (los ini de la instalacin
anterior) antes de realizar la nueva
instalacin. Cuidado!

Posibles problemas de La imagen que tienes en la parte superior corresponde a una instalacin bajo Windows98.
instalacin En otras versiones de Windows (2000, NT XP) aparecer activado Win NT, el submen
contendr opciones aadidas y ser preciso como paso previo activar el servicio antes de
poner en marcha el servidor.
Si trataras de instalar MySQL en
Tambin es probable que bajo WindowsXP no aparezca la ventana en la que se recoge
un directorio distinto al
especificado por defecto en el nombre de usuario y contrasea. No tiene ninguna importancia. No altera la forma de
instalador C:\mysql (podra ser funcionar de MySQL.
una unidad distinta, un directorio
diferente o ambos) el servidor no
arrancara a travs del interface de Ejemplo de my.ini para usar un directorio distinto
MS-DOS descrito anteriormente.
Este sera el formato ms simple del fichero my.ini que habras de crear (y guardar en
Eso ocurrira porque MySQL no el directorio windows) si trataras de instalar MySQL en el directorio basededatos de la
encontrara la ruta adecuada. La unidad F:. Mediante la inclusin de este fichero (inmediatamente despus de la
forma de solventar este problema
instalacin de MySQL) y antes de hacer la puesta en marcha bajo MS-DOS solventaras la
sera crear un fichero con nombre
my.ini (en el que se especificaran
incidencia que te comentamos al margen.
esas rutas) y guardarlo en el
directorio windows. La sintaxis y [mysqld]
contenido de es fichero la tienes al basedir=F:/basededatos/
margen. datadir=F:/basededatos/data/

Si realizaras el arranque directamente a travs de winMysqlAdmin (sin seguir el


proceso de efectuar el primer arranque desde MS-DOS) no sera necesario crear este
fichero ya que winMysqlAdmin lo creara automticamente. Esta opcin, mucho ms
prctica, en apariencia, es altamente desaconsejable ya que, adems de que podra
plantear problemas con el registro de usuarios, las versiones posteriores de MySQL ya no
incluyen la herramienta winMyAdmin.

Anterior Indice Siguiente


Instalando phpMyAdmin

Qu es PHPMyAdmin?
Proceso de instalacin

PHPmyAdmin es, simplemente, un En el directorio Software del CD-ROM hay un fichero llamado phpMyAdmin-2.8.1.zip
conjunto de utilidades y scripts que tenemos que descomprimir obligatoriamente (contiene scripts de PHP) en el
escritos en lenguaje PHP que directorio c:\Apache\htdocs.
permiten gestionar bases de datos
MySQL a travs de una pgina Al hacerlo se crear un directorio llamado phpMyAdmin-2.8.1 al que vamos a
web. cambiar el nombre por otro ms cmodo y fcil, dado que al utilizar phpMyAdmin
tendremos que escribir el nombre de ese directorio con bastante frecuencia.
Mediante esta herramienta, sin
conocer el lenguaje MySQL, Vamos a renombrarlo como MyAdmin.
podremos modificar, consultar,
crear y borrar tanto bases de Dentro de ese directorio que acabamos de renombrar hay un subdirectorio con nombre
datos como tablas y registros libraries y, en l, un fichero llamado config.default.php. Abrmoslo con nuestro editor
contenidos en ellas. DEV-PHP, guardmoslo (sin hacer ninguna modificacin) con el nombre config.inc.php,
Tambin permite la gestin de
y ya, en este ltimo fichero busquemos la lnea n 31 y donde dice:
usuarios recuerda que MySQL
requiere claves y contraseas y
$cfg['PmaAbsoluteUri'] = ' ';
modificar sus privilegios de acceso. y, pongamos
$cfg['PmaAbsoluteUri'] = 'http://localhost/MyAdmin/';

Cul es su utilidad? Guardemos los cambios. Ser necesario editar y modificar, tambin, el fichero Config.
class.php (contenido igualmente en el directorio libraries) y modificar la lnea n 10.
La versin de MySQL para Dnde dice:
Windows no dispone de una
interface propia que permita var $default_source = './libraries/config.default.php';
gestionar sus bases de datos a deberemos poner
travs de Windows. var $default_source = './libraries/config.inc.php';
La nica posibilidad de gestin es Hechas las modificaciones en ambos ficheros ya estaremos en condiciones de probar su
a travs de MS-DOS y eso requiere funcionamiento.
que el usuario sepa utilizar los
comandos propios de las funciones
MySQL. Prueba de funcionamiento de PHPMyAdmin
Sin esos conocimientos de SQL,
tendramos como recurso la Ya estamos en condiciones de hacer una prueba de phpMyAdmin.
posibilidad de gestionar las bases
de datos a travs de nuestros Arranquemos Apache dejando minimizada su ventana MS-DOS y arranquemos
propios scripts PHP, pero eso nos tambin MySQL -el semforo debe quedar en verde. Con ambos servidores activos
exigira conocer con una cierta escribamos ahora en la barra de direcciones de nuestro navegador:
profundidad a medida que
avancemos en el curso lo iremos http://localhost/MyAdmin/
logrando las funciones que PHP
posee para la gestin de este tipo y se nos abrir una pgina como esta:
de bases de datos.

Es por eso que este conjunto de


herramientas resulta muy cmodo
y fcil de utilizar y est
convirtindose de hecho ya lo es
en el soporte estndar que la
mayora de los hosting facilitan a
sus usuarios para gestionar las
bases de datos alojadas en sus
servidores.

La advertencia

Al visualizar la pgina que tienes


en la imagen de la derecha habrs
visto un aviso sobre temas de
seguridad.

No te preocupes!.

La razn de tal advertencia radica


en la existencia del usuario root
(el usuario por defecto) sin
contrasea. Podramos eliminarlo
Si ocurre esto seguro que s ocurrir ya podemos felicitarnos, la terna Apache+PHP
ya tenemos al usuario pepe con
todos los privilegios y +MySQL estar instalada, bien configurada y funcionando. Ahora ya podremos
desaparecera el mensaje. Cuando dedicarnos de lleno a la programacin en PHP. Ya disponemos de todos los recursos
estudiemos lo relativo a MySQL ya necesarios para poder hacerlo.
lo haremos, pero por el momento,
dejmoslo as.
Comprobacin de usuarios
Los usuarios
Desde phpMyAdmin podemos comprobar los usuarios registrados actualmente en la
base de datos. El procedimiento para hacerlo es el que se describe en esta primera
En las imgenes de la derecha imagen.
tienes la lista de usuarios actuales.
All ves el archi mencionado
usuario root y tambin al nuevo
usuario pepe con su contrasea
encriptada.

Las columnas marcadas con Y/N


contienen las tablas de privilegios
de cada usuario. Observa que
tanto root como pepe tienen
todos los privilegios, mientras que,
el tercer usuario (con nombre en
blanco y creado durante la
instalacin de MySQL) no tiene
ninguno.

Un detalle importante (a recordar)


es que la contrasea del usuario
pepe no tiene ningn asterisco
delante. Eso ser as cuando
utilicemos MySQL 4.0 (con MySQL
4.1 ah aparecera ese asterisco).
Ya veremos ms adelante su
incidencia.

y el resultado (si hemos hecho correctamente el proceso descrito al instalar MySQL)


deber ser este:

Anterior Indice Siguiente


Trabajar desde el servidor

Por qu transferir
Proceso de transferencia
los documentos?
Ahora es el momento de transferir todos los materiales del curso al servidor que
hemos instalado y configurado.
Dado que estamos en un curso de
PHP y teniendo en cuenta que PHP
Vamos a buscar en el CD-ROM una carpeta llamada cursoPHP y vamos a copiarla
es un lenguaje del lado del
servidor, resulta imprescindible ntegra dentro del directorio C:\Apache\htdocs.
que, a partir de ahora, trabajemos
desde el servidor. Una vez transferida esta carpeta arrancaremos nuestro servidor Apache y abriremos el
navegador poniendo como direccin http://localhost/cursoPHP/ y ya tendremos acceso al
Tanto los ejemplos como los ndice principal de este Curso.
ejercicios que tendrs que ir
realizando van a requerir, de Ahora podemos prescindir del CD-ROM. De aqu en adelante con la excepcin del
forma ineludible, que utilicemos software para seguir el curso slo ser necesario que arranquemos el servidor
continuamente el servidor. Apache y accedamos a la direccin:
Por esta razn es necesario que http://localhost/cursoPHP/
toda la documentacin est
accesible a travs de nuestro Ha llegado el momento de empezar con PHP. Adelante!
propio servidor.

Anterior Indice Siguiente


Instalacin de un servidor FTP

Qu es un servidor FTP?
Instalacin de un servidor FTP
Conceptualmente un servidor FTP
no difiere en nada de un servidor Se trata del instalador de un servidor FTP, que tal como te indicamos en el apartado
HTTP. Software del Curso puedes descargar desde FileZilla_Server_0_9_18.

Las diferencias entre los diversos Podemos instalarlo con las opciones por defecto, salvo en el caso de las dos ventanas
tipos de servidores estriban en los que ves en la imagen:
programas que usan software de
servidor en el tipo de peticin que
aceptan y en el protocolo que
requieren las peticiones que
atiende.

En el caso de Apache, se trata de


un servidor HTTP porque slo
acepta peticiones a travs de ese
protocolo.

Al hablar de servidores FTP nos


referimos a aquellos que
nicamente aceptan peticiones
realizadas por medio del proto-
colo conocido como FTP (File
Transfer Protocol).

Arrancar y apagar el
servidor

Despus de instalar el servidor


aparecern en Programas un grupo
con unos iconos como estos.

en las que elegiremos Start manually en ambas opciones. De esta forma evitaremos que
servidor arranque al conectar el ordenador -consumiendo menos recursos- y tendremos
Como resulta obvio, el sealado la opcin de activarlo slo en el momento en que necesitemos usarlo.
con Start permite la puesta en
marcha del servidor y el sealado
con Stop para detener su Server Interface
funcionamiento.

La opcin Server Interface


permite configurar del servidor y
controlar su funcionamiento.

Para activar esta opcin es


necesario que hayamos puesto en
marcha previamente el servidor.

Al activar el Server Interface por


primera vez aparece una ventana
como la que tienes a la derecha. Si
marcamos la casilla de verificacin
y pulsamos OK ya no aparecer en
posteriores arranques.

La ventana de Server Interface nos


mostrar el estado del servidor e
ir registrando todas las acciones
que se realicen en l.

Los iconos del Server


Interface

El primero de los iconos permite


arrancar y detener el servidor
desde esta consola.

El segundo (en forma de candado)


permite bloquear y desbloquear el
servidor sin necesidad de
detenerlo.
Creacin de cuentas de usuario
Desde el tercero podremos hacer
modificaciones generales en la
configuracin. Optaremos por Vamos a crear dos cuentas de usuario: admin con admin como contrasea; secre
dejarlas con las opciones por utilizando secre como contrasea.
defecto.
La forma de hacerlo es la que ves en la imagen inferior. Se pulsa en el icono user de la
Desde el cuarto, uno de los ms ventana Server interface (el cuarto de los iconos de la imagen que tienes aqu arriba) y
interesantes para nuestros aparece la ventana que ves en la parte inferior.
propsitos podremos crear cuentas
de usuarios as como realizar su La secuencia de creacin de un usuario es la siguiente:
configuracin.

El quinto de los iconos -muy Se selecciona general (1).


similar al anterior- permite acceder
y se pulsa en el botn Add de la ventana de usuarios (2). Se abrir una nueva
a la configuracin de grupos de ventana.
usuarios.
Se escribe -en la nueva ventana-el nombre de usuario(3).

Definicin de los servicios Se deja la opcin None (por defecto) en el men de opciones User should.. (4) y
se pulsa el botn OK
El directorio raz (o root) de un Se escribe -en la nueva ventana-el nombre de usuario(5).
servidor FTP igual que ocurra en
el caso de Apache puede ser uno
cualquiera de los existentes en el
ordenador en el que tengamos
instalado el software de servidor.

Imaginemos que hemos hecho la


instalacin de Apache y de FTP
en un equipo que acta como
servidor de la red local de nuestro
Centro.

Supongamos que es nuestra


intencin ofrecer tres servicios:

Gestion al que slo tendr


acceso el secretario del centro.

Documentacion en el que slo


podr insertar documentos el
secretario y al que tendrn acceso
todos los profesores.

Alumnos que va a contener tres


reas distintas: Materiales, Al pulsar ok se cierra y se la ventana Add user account.
Examenes y Trabajos. Podrn
acceder a ellas -con los privilegios
que comentamos al margen- Se marca las opcin Enable account (6).
profesores y alumnos. Se marca la casilla de verificacin Password (7) y se escribe la contrasea de
usuario (8).
Para lograr estos fines ser
necesario que el ordenador en el
que tenemos instalado el servidor
Repetiremos el proceso hasta crear las cuentas de los dos usuarios indicados al
ha de contener -entre otros- los comienzo de este prrafo y acabaremos pulsando el botn OK que est situado en la
directorios que ves en la imagen. parte inferior izquierda de la ventana de usuarios.

Deberemos crear el directorio


ServidorFTP y todos los que Eleccin de los roots de cada usuario
contiene con excepcin de juan
(sombreado en rojo) que se Dado que el usuario admin va a tener acceso a c:\Apache y a c:\ServidorFTP
generar de forma automtica.
hemos de definir como root el directorio que los contenga a ambos. En este caso sera c:
\.

En el caso del usuario secre va a permitrsele el acceso a c:\ServidorFTP\Gestion y


a c:\ServidorFTP\Gestion por lo que hemos de establecer como root el directorio c:
\ServidorFTP que los contiene a ambos.

Directorios accesibles y privilegios

Es bastante frecuente el hecho de que un usuario no deba acceder a los contenidos


de todos los subdirectorios de su root.

Cada uno de los directorios accesibles para un usuario (Shared folders) puede gozar de
privilegios distintos. Al seleccionar un directorio se activan las casillas de verificacin que
ves en la imagen y desde ellas se pueden conceder privilegios a dos niveles: ficheros y
directorios.

A nivel de ficheros cuenta con las opciones Read (descargar), Write (escribir, subir),
Delete (borrar) y Append (aadir a un fichero preexistente cuando la transferencia ha
sido interrumpida). Cada una de ellas puede configurarse como opcin permitida no
permitida.

Cuando se trata de directorios las opciones (tambin puede configurarse cada una de
ellas como permitida/no permitida) son: Create (Crear), Delete (borrar), List (ver una
lista de los contenidos) y +SubDirs (Cuando est activado asigna automaticamente a
todos los subidrectorios que contenga los mismos privilegios que al directorio actual).

El proceso de establecimiento de la accesibilidad de un directorio (y la concesin de


privilegios) es la que se detalla en la imagen.

Se accede desde el icono users de la ventana Server Interface siguiendo la siguiente


Configuraremos los usuarios de secuencia:
forma que admin (usuario que
administra el sistema) pueda Se elige Shared Folder en la ventana de la izquierda (1).
acceder tanto al directorio Apache Se elige un usuario User en la ventana de la derecha (2).
y a todo su contenido, como al Se pulsa en el botn Add en la parte central de la ventana (debajo de Shared
directorio ServidorFTP. Folders) (3) con lo que se abre automticamente la ventana Buscar carpeta.
El usuario secre podr acceder los Se elige un directorio (4) y se pulsa sobre el botn Aceptar (5).
directorios Documentacin y
gestion.

Dado que los restantes usuarios -


tanto los profesores como los
alumnos- van a ser varios, y van a
tener acceso a los mismos
espacios del servidor, crearemos
grupos con cada uno de ellos.

Lo primero de todo, sera crear las


cuentas de usuario tal como se
describe al margen.

Roots de usuarios

Cada usuario ha de disponer de un


directorio raz (su root) que ha de
contener todos los directorios a los
que va a tener acceso.

A la derecha tienes descritos los


criterios de eleccin de esos root
para los usuarios admin y secre.

El hecho de un directorio sea el


root de un usuario no implica que
pueda acceder a sus contenidos ya
que para hacerlo es necesario que
tenga -adems- permisos de
acceso.

Privilegios de los usuarios

Esta sera la manera en la que


podramos asignar privilegios a
cada uno de los usuarios.

admin

Sus privilegios en los diferentes


directorios podran ser:

En C:
List. Al concederle este privilegio
podran visualizarse (al acceder al
root de este usuario mediante un
cliente FTP) la lista de directorios y
documentos que contiene.

Si no incluyramos esta opcin el


cliente FTP nos dara un mensaje
Se establecen los privilegios -marcando o desmarcando las casillas de verificacin
de error al acceder al root (no

tendra permiso alguno) y obligara correspondientes- para el directorio elegido (6).


al usuario admin a establecer Se pulsa OK para guardar los cambios de configuracin (7).
como direccin del servidor bien
localhost/Apache (uno de los El proceso puede repetirse cuantas veces sea necesario.
directorios a que tiene acceso), o
el otro: localhost/ServidorFTP
Directorios accesibles por del usuario admin
Mediante esta opcin se
visualizara una lista de todos los
ficheros contenidos en el directorio
Esta es la configuracin del usuario admin.
c:\ y nicamente de los
directorios a los que tuviera algn
tipo de privilegio de acceso.

En C:\Apache
Todos. Al ser el usuario admin
parece razonable concederte el
mayor grado de libertad.

Al tener tambin activado el


privilegio +Subdirs todos los
directorios (de cualquier nivel)
contenidos en c:\Apache gozaran
de estos mismos privilegios. Por
esa razn, ya no sera necesario
especificar ninguno de ellos.

En C:\ServidorFTP
Todos. Por idnticas razones al
caso anterior.

secre

Sus privilegios en los diferentes


directorios podran ser:

En c:\ServidorFTP
List. Las razones son idnticas al
caso de admin

En Documentacin
Todos>. Se entiende que este
usuario es quien realiza la gestin Directorios accesibles por del usuario secre
completa de este directorio.

En Gestin
Todos. Las razones son idnticas
a las del caso anterior.

Clientes FTP

Para hacer una peticin FTP, igual


que en cualquier otro caso de
peticin, necesitamos disponer del
software adecuado para realizarla.
Recuerda que, en realidad, un
cliente no es otra cosa que el
programa que se utiliza para
realizar un determinado tipo
peticin a un servidor.

Existen varios clientes FTP en el


mercado. El ms popular de todos
ellos es el WS_FTP, que
probablemente habrs usado si
has publicado alguna pgina web
para subir tus pginas al servidor.

Puedes descargar un cliente


gratuito con prestaciones muy
similares a WS_FTP desde el sitio
de FileZilla.

Las versiones ms modernas de


los navegadores tambin permiten
realizar peticiones mediante este
protocolo.

Si escribimos en la barra de
direcciones del navegador se
requiere la versin 5 superior de
IE:

ftp://admin:admin@localhost

y un servidor FTP con nombre La razn de estas asignaciones las justificamos al margen.
localhost est activo, veremos
que aparecen en la ventana del Observars que el directorio raz est marcado con la letra H. Para cambiarlo bastar con
navegador los iconos de los seleccionar otro cualquiera y pulsar sobre el botn que ves en esta imagen.
ficheros contenidos en el directorio
root del servidor y que, a la vez,
se nos ofrece la posibilidad de:
borrar archivos; crear
subdirectorios; copiar ficheros
(desde el servidor a cualquier otro Acceso de usuarios
directorio de nuestro ordenador o
viceversa) sin ms que seguir
mtodos idnticos a los que se La direccin localhost apunta siempre hacia el directorio root de usuario. Eso quiere
utilizan habitualmente en Windows. decir que si escribimos en el cliente FTP esa direccin y nos identificamos como admin
(indicando la contrasea de usuario) veramos algo como esto:
El acceso a un servidor FTP
utilizando un navegador como
cliente requiere tres datos:
nombre de usuario, nombre del
servidor y contrasea, que son los
que aparecen en azul un poco ms
arriba.

En esa misma direccin aparecen


marcados en rojo: (ftp://) que
indica el tipo de protocolo que se
utiliza en la peticin; (:) cuya
finalidad es la de actuar como
separador entre el nombre de donde como puedes observar accedemos directamente al directorio C:\ (el root de este
usuario y la contrasea; y, (@), usuario) y visualizamos sus contenidos.
que hace tambin funcin de
separador, en este caso entre la Accediendo (tambin a localhost) como usuario secre llegara tambin al root de este
contrasea y el nombre del usuario (distinto del anterior) que sera C:\ServidorFTP .
servidor.

Pero, a riesgo de parecer


reiterativos, queremos insistir en
que para que una peticin, como la
que comentamos, pueda ser
atendida se re- quiere, de forma
imprescin- dible, que exista un
servidor FTP activo.

Hay una posibilidad aadida.


Mediante funciones de PHP
tambin es posible gestionar
servidores FTP sin necesidad de
recurrir a ningn cliente especfico.
Lo trataremos en los contenidos de
programacin relativos a las
funciones FTP.

Grupos de usuarios

La configuracin de grupos de
usuarios es una opcin que ofrece
bastante inters. Mediante esta Utilizacin de alias
opcin se pueden establecer
privilegios comunes a una serie de
usuarios. Ello facilita la Este servidor tambin permite ser configurado para la utilizacin de Alias. Pulsando
configuracin cuando se trata de con el botn derecho del ratn sobre el nombre de uno de los directorios aparece un
grupos numerosos que van a men como este:
compartir directorios y privilegios.

Los procesos de creacin de


grupos y de asignacin de usuarios
a cada uno de ellos los tienes
descritos al margen.

La opcin autocreate
Supongamos que pretendemos
que cada uno de los alumnos de
nuestro supuesto disponga de un
subdirectorio propio para poder
subir y gestionar sus propios
trabajos de cada materia.

Aparte de la ventaja de tener


separadas sus actividades con la
posibilidad de borrar, aadir, al elegir la opcin Edit Aliases se abre una ventana como la que ves aqu debajo. Si
modificar, etctera dentro de su
introducimos en ella la ruta absoluta completa reemplazando el nombre del ltimo
propio espacio y a la vez impedir
directorio por una palabra distinta (en el ejemplo hemos incluido web) estaremos
que pueda efectuar esos procesos
en materiales ajenos. creando un alias. Podremos crear tanto como deseemos, es cuestin de incluirlos
(completos) uno a continuacin de otro separados por el carcter |.
Eso requerira ir creando esos
directorios para cada uno de los
usuarios y esa podra ser una tarea
lenta y pesada.

Mediante la opcin Autocreate se


puede configurar un directorio de
forma que durante el primer
acceso del usuario se cree de
forma automtica un
subdirectorio con el mismo
nombre que el del usuario.

El uso de esta opcin requiere:

Incluir en Shared folders la ruta Una vez creados los alias podremos utilizarlos para acceder a los espacios
del directorio base (en el que (sustituyendo el nombre del directorio por el alias). Aqu tienes imgenes del ejemplo.
pretenden crearse los Observars que localhost/Apache, localhost/servidor y localhost/indio nos conducen al
subdirectorios de cada uno de los mismo sitio.
usuarios pertenecientes al grupo)
acabada con /:u

Privilegios de los
diferentes grupos de
usuarios

En este enlace tienes el detalle y la


justificacin de los diferentes
privilegios que hemos establecido
para cada uno de los grupos de
usuarios.

Fichero de configuracin
de Filezilla Server

Dado que, por el nmero de


usuarios y por la complejidad de la
estructura, la labor de
configuracin y creacin de los
diferentes usuarios aqu
propuestos puede resultarte lenta Creacin de grupos de usuarios
y tediosa hemos incluido un fichero
que puedes descargar desde aqu. La creacin de grupos de usuarios sigue un proceso muy similar al que hemos descrito
para el caso de usuarios. Las diferencias ms sustanciales son:
Si descomprimes su contenido -
FileZilla Server.xml- en el
Se accede a travs del icono groups (el quinto de la ventana Server Interface).
directorio de instalacin de Filezilla
Server (por defecto sera un
No requiere insertar contraseas. Estas sern privilegio exclusivo de los usuarios del
directorio con ese mismo nombre
dentro de Archivos de programa) grupo.
sobrescribiendo el existente ya
dispondrs de todos los usuarios y Requiere activar la casilla de verificacin Enable access for users inside froup.
grupos aqu descritos junto con
sus configuraciones respectivas. En nuestro ejemplo, crearemos cuatro grupos: ingles (grupo de los profesores de
Ingls), infor (profesores de Informtica), ciclo1 (alumnos de primer ciclo) y ciclo2
Cuidado! alumnos de segundo ciclo.
Esta opcin requiere tener creada
una estructura de directorios
idntica a la descrita en la imagen
que tienes insertada en esta
misma columna.

FTP y hosting

A la hora de la eleccin del


hosting, otro de los factores que
debemos tener en cuenta o al
menos conocer son las opciones
de FTP que ofrece cada uno de los
proveedores de servicios.

Existen en la red situaciones de


todo tipo. Hay casos en los que
est activado el servicio y adems
es la nica va posible para poder
publicar nuestras pginas.

Hay otros casos en los que est Directorios accesibles y privilegios del grupo
desactivado, como ocurre con el
popular geocities, que no permite
FTP y donde el mantenimiento de La configuracin de los directorios accesibles y de los privilegios en cada uno de ellos
los espacios de alojamiento de
es idntica a la descrita para el caso de usuarios no pertenecientes a un grupo.
pginas web de sus servidores
requiere de forma ineludible La nica diferencia estriba en que aade una nueva e interesante posibilidad a travs
acceder por medio de una pgina de la opcin Autocreate.
WEB especfica que permite
realizar las transferencias de
ficheros por un mtodo alternativo
al FTP tradicional.

Asignacin de usuarios a un grupo

Una vez creado un grupo (o grupos) es necesario asignar los usuarios a ese grupo. El
proceso es muy similar al de creacin de usuarios no adscritos a ningn grupo. La nica
diferencia est en el punto (4) del proceso, ya que ahora hemos de elegir el grupo al que
va a pertenecer el usuario (antes elegamos none).

En el ejemplo hemos incluido dos usuarios por cada uno de los grupos:

profe_ingles1 y profe_ingles2 en el grupo ingles.

profe_infor1 y profe_infor2 en el grupo infor.

ciclo1_alumno1 y ciclo1_alumno2 en el grupo ciclo1.

ciclo2_alumno1 y ciclo2_alumno2 en el grupo ciclo2.

En todos los casos hemos incluido una contrasea idntica al nombre de usuario.

Los miembros de un grupo recogen automticamente todos los privilegios del Shared
Folder del grupo al que pertenecen. No obstante, es posible aadir nuevos directorios y
privilegios (aadidos a los especficos del grupo al que pertenecen) incluyndolos en el
Shared Folder del usuario.

Cuidado!

En el directorio Extras del CD-ROM hay una carpeta llamada ServidorFTP que contiene
toda esta estructura de directorios. Puedes copiarla al directorio raz de tu ordenador y ya
tendrs la configuracin descrita en la imagen de la columna de la izquierda.

Anterior Indice Siguiente


Instalacin de un servidor de correo

Un servidor de correo
Proceso de instalacin
Se trata de una aplicacin que
puede descargarse del sitio http:// Si no has descargado el programa de instalacin desde el apartado Software del curso
www.pmail.com/ que permite puedes hacerlo de este enlace de http://www.pmail.com eligiendo el fichero Mercury mail
instalar un servidor local de correo transport system for win32 and NetWare systems v.40.1a o hacerlo directamente desde aqu.
tal como se indica en el apartado
Software del Curso de este CD. Una vez descargado el programa, el proceso de instalacin es el que describen las
imgenes siguientes:
Finalidad de esta
instalacin

La instalacin de este servidor de


correo tiene un carcter
puramente experimental.

Algunas funciones de PHP


relacionadas con el envo de correo
electrnico a travs de una pgina
web requieren disponer de un
servidor de este tipo. Es la nica
forma en la que podremos ejecutar
y comprobar el funcionamiento de
los scripts que utilicen ese tipo de
funciones.

Modificacin del fichero


php.ini

Esta es una de las muchas


modificaciones que tendremos que
ir haciendo en el fichero php.ini a
lo largo del curso. Recuerda que
este fichero est en el directorio
Windows.

Habremos de buscar las lneas que


dicen:

[mail function]
; For Win32 only.
SMTP =

y cambiarlas por:

[mail function]
; For Win32 only.
SMTP = 127.0.0.1

y tambin
; For Win32 only.
;sendmail_from=me@example

descomentando la ltima lnea


(quitando el punto y coma) y
dejndola as:

; For Win32 only.


sendmail_from=me@example

y sustituyendo me@example por


admin@mispruebas.com.

Cuidado!
Si has hecho la copia de
seguridad -que te hemos
recomendado al configurar PHP-
del fichero php.ini en c:\Apache
\php4\ deberas sustituirla por
esta nueva versin modificada.

La finalidad no es otra que


mantener la identidad de ambas
copias.

El proceso de instalacin

La instalacin, paso a paso la


tienes descrita en las imgenes de
la derecha. Los aspectos ms
significativos de este proceso son
los siguientes:

Elegir la opcin No NetWare


Support

Elegir No Pegasus Mail


Integration. De no hacerlo as
nos obligara a tener instalado -
previamente- el cliente de correo
de Pegasus Mail.

Elegir las opciones SMPT server


Module,POP server module, que
seran las que nos permitieran
enviar y recibir mensajes e modo
local, y tambin POP3 Client
Module que tiene relacin con la
recepcin de mensajes de cuentas
externas.

La opcin siguiente no tiene


demasiada importancia para
nuestros fines. Podemos elegir
cualquiera de las dos sin que
afecte sensiblemente al
funcionamiento.

Poner 127.0.0.1 donde dice:


this machine's Internet domain
name y dejar la opcin por defecto
-admin- donde dice: user name
for postmaster.

Dnde dice: Address of host via


which to send mail debes incluir la
direccin del servidor SMTP a
travs del cual quieres que se
enven los mensajes a direcciones
de correo externas.

En las pruebas hemos utilizado


varias (los SMTP de nuestras
cuentas de correo) aunque, como
ves en la imagen, la prueba
definitiva la hemos hecho
utilizando la direccin hermes.
cnice.mecd.es, que es el servidor
SMTP para los usuarios de cuentas
del CNICE.

Hemos optado por esa opcin para


desarrollar el proceso de
configuracin en su opcin ms
compleja ya que, como sabes, ese
servidor requiere autentificacin
del usuario.

El resto del proceso puede hacerse


con las opciones por defecto hasta
concluir el proceso de instalacin.

Configuracin para una


red de rea local

Aunque hemos puesto la IP


127.0.0.1 pensando en servidor
para pruebas, es posible que
quieras utilizarlo como servidor de
correo en una red local. En ese
caso habras de sustituir la IP por
la correspondiente al ordenador en
el que est instalado el servidor.

Para conocer esa IP, en el caso de


que uses Windows98, bastara con
pulsar: Inicio -> Ejecutar y
escribir en esa ventanita
winipcfg. Si utilizas W2000, NT
XP el proceso sera: Inicio ->
Programas -> Accesorios ->
Smbolo del sistema y una vez
en esa ventana escribir ipconfig.

Arrancar y parar el
servidor

Para arrancar el servidor hay que


ejecutar el programa Mercury
Loader.
Lo encontrars en el directorio en
que hayas instalado el servidor de
correo (por defecto, c:\Mercury).

Sabremos que est en marcha


porque aparecer una ventana
nueva. Si la minimizamos
aparecer en la barra de tareas un
icono como este.

Este icono solo aparece al


Crear cuentas de usuarios
minimizar la ventana. Si la
cerramos se parar el servidor y
desaparecer el icono.

Aparte de la opcin anterior, desde


el men del servidor tienes acceso
a esta opcin que ve en la imagen.

Cuando est funcionando el


servidor -para pararlo- aparece un
texto como este. Si estuviera
parado, se podra activar desde la
misma opcin. Ahora aparecera
con el texto: Leave offline mode

Aadir usuarios

Despus de arrancar debemos


acceder -en el men principal- a
opcin Configuration y una vez all
elegir Manager local users. Al
abrirse esa ventana encontraremos
el usuario Admin creado de forma
automtica durante el proceso de
instalacin.

Bastar con asignar un nombre de


cuenta, un nombre personal (no es
imprescindible) y una contrasea.

Nosotros vamos a crear tres


cuentas ms. Aadiremos los
usuarios juan, perico y andres y
les pondremos contraseas
idnticas a los nombres
respectivos.

Crear un dominio local

Desde el men del servidor,


pulsando en Configuration y
eligiendo Mercury Core Module nos
aparece una ventana con varias
pestaas tales como las que ests
viendo.

En esta primera -donde dice


General- no es preciso tocar nada.
Est la direccin IP que habamos Configuracin bsica
introducido al instalar -127.0.0.1-
y lo dems son los diferentes
directorios de la instalacin.

Al pulsar sobre la pestaa Local


domaines aparecen dos lneas que
comienzan por 127. Podemos
quitarlas desde el botn Remove
entry.

Mediante el botn Add New


Domaine podemos insertar un
nombre de dominio de nuestra
eleccin.

Dado que al cambiar la


configuracin de php.ini hemos
puesto como direccin de correo
admin@mispruebas.com vamos a
usar como nombre del dominio
mispruebas.com tal como puedes
ver en la imagen.

Configuracin del cliente


de correo

La configuracin del cliente de


correo no plantea problemas. Los
nicos detalles a tener en cuenta
son los relativos a la configuracin
de los servidores SMTP y POP3.
En ambos casos se escribe la IP
con la que hemos configurado el
servidor, es decir: 127.0.0.1

Como nombre de cuenta


pondremos el mismo con el que las
hemos creado (juan, perico,
andres) sin aadir la @ ni el
nombre del dominio.

Si la instalacin se realiza para


trabajar en una red de rea local,
tendrs que cambiar el 127.0.0.1
por la IP del ordenador en el que
est instalado el servidor.

Prueba del servidor

Una vez configuradas las cuentas


en el cliente de correo bastar con
enviar mensajes a las direcciones
de usuarios locales (con el servidor
Mercury activo) y comprobar que
son recibidos en las cuentas
destinatarias.

Prueba desde PHP

Si ejecutar el script de prueba que


tienes a la derecha (debes tener
activos los servidores Apache y
Mercury) deber aparecerte una
pgina con el texto: Mensajes
enviados con xito.

Ser la prueba inequvoca de tanto


el servidor con la configuracin de
PHP son las correctas. Si despus
abres el cliente de correo podrs
comprobar que los usuarios juan,
perico y andres han recibido ese
mensaje.

Leer correo externo

Aunque no forma parte de los


contenidos de este curso, puede
resultarte interesante configurar el
servidor de correo de forma que
puedan recibirse en una cuenta
local los mensajes enviados a una - Un script de prueba
o varias- cuenta externa.

Tal como ves en las imgenes slo Este es el cdigo fuente de un script que nos permitir comprobar si hemos configurado
debes acceder opcin correctamente el servidor de correo. El contenido que aparezca en la pgina nos dir lo que
Configuration y seleccionar ha ocurrido. No te preocupes si an no entiendes el cdigo! Ya hablaremos de l ms
MercuryD POP3 client. Aparecer adelante.
una ventana como la que ves al
margen.
<?
Los pasos a seguir estn if( mail("juan@mispruebas.com", "Una prueba definitiva","Bienvenid@ a
numerados en la imagen. PHP",
"From: Administrador de mispruebas.com <admin@mispruebas.com>
El primero ser establecer el Check Reply-To: juan@mispruebas.com
Every (frecuencia con la que se Cc: perico@mispruebas.com
comprueba la existencia de nuevos
Bcc: andres@mispruebas.com
mensajes en la cuenta externa).
X-Mailer:PHP/" . phpversion())){
Por defecto se autoconfigura en 30
segundos. Ah podrs indicar el print "Mensajes enviados con exito";
periodo de tiempo (en segundos) }else{
que estimes oportuno. print "Se ha producido un error";
}
El segundo paso es pulsar el botn ?>
Add que abrir la ventana que ves
superpuesta en la imagen.
Probar servidor de
Debemos escribir el nombre de
correo
una cuenta externa, el nombre de
su servidor POP3 y la contrasea
de esa cuenta de correo, y
asociarlas con una cuenta local. Leer mensajes de cuentas externas
Despus de pulsar el OK se cierra
la ventana superior y deberemos
pulsar el botn Save para guardar
los cambios

A partir de ese momento siempre


que el servidor de correo est
activo y tengamos abierta una
conexin a internet se
comprobar la cuenta externa con
la frecuencia indicada y si
existieran mensajes seran
transferidos a la cuenta local
especificada en la configuracin.

Enviar mensajes a
direcciones externas

Mercury permite enviar mensajes


(a travs del servidor configurado
como Address of host via which to
send mail ) a direcciones de
correos correspondientes a
dominios externos.

La configuracin de esa opcin


requiere el proceso que ves a la
derecha.

Eligiendo la opcin MercuryS SMTP


Server se abre una ventana como
la que ves en la imagen.
Activaremos la pestaa
Connection control y
desactivaremos la casilla de
verificacin que dice: Do not
permit SMTP relaying of non-local
mail y con ello daremos al servidor
la opcin de enviar a travs del
servidor SMTP externo los
mensajes cuyo nombre de dominio
no coincida con el configurado
para el servidor local.

An hemos de solventar un
pequeo problema en esta
configuracin. Al enviar mensajes
desde una cuenta local hacia una
cuenta externa se incluira en el
mensaje la direccin local como
direccin de respuesta. Eso,
obviamente, planteara problemas
al destinatario ya que sus
respuestas no encontraran ese
dominio en la red.

El problema se resuelve
modificando la configuracin del
cliente de correo e incluyendo
como direccin de respuesta una
cuenta externa. De esta forma,
combinando esta configuracin con
la de lectura de cuentas externas
podramos gestionar desde nuestra
cuenta local el envo y recepcin
de mensajes externos.

Servidores SMTP que


requieren autentificacin

Cada da son ms habituales los


servidores de correo SMTP que
requieren autentificacin. Este es
el caso, tal como comentamos ms
arriba, de las cuentas del CNICE.

En esas circunstancias es
necesario acceder a la opcin
Mercury SMTP Client que nos
abrir una ventana como que la
ves al margen. Bastar con
rellenar los campos
correspondientes a Credentials for
SMTP Authentication, if required Enviar mensajes a cuentas externas
poniendo en Username y password
los mismos valores que usamos en
la configuracin de esa cuenta en
el cliente de correo.

Una vez hecho esto, slo queda


guardar los cambios y el servidor
estar listo para efectuar este tipo
de envos.

Desinstalacin del
servidor de correo

La instalacin de Mercury no
escribe nada en el registro de
Windows. Por ello, el proceso de
desinstalacin no existe. Basta con
borrar del directorio de instalacin
y habremos desinstalado el
servidor.
Anterior Indice Siguiente
PHP y HTML

Pginas PHP
La primera pgina en PHP

Las pginas PHP pueden ser Observemos este cdigo fuente. Como vers, se trata de una pgina web muy simple
pginas web normales a las que se que no contiene ningn script PHP.
cambia la extensin, poniendo .
php en vez de .htm .html. Hemos guardado esa pgina con el nombre ejemplo4.html y luego la hemos vuelto a
guardar sin modificar nada en sus contenidos como ejemplo4.php.
En una pgina cuyo nombre tenga
por extensin .php se pueden
<html>
insertar instrucciones escritas en
lenguaje PHP anteponiendo <? a
<head>
la primera instruccin y <title>Aprendiendo PHP</title></head>
escribiendo des- pus de la <body>
ltima ?>. Esta es una pgina supersimple
</body>
A cada uno de estos bloques de </html>
instrucciones le llamaremos un
script.
Ver ejemplo4.html Ver ejemplo4.php
No existe lmite en cuanto al
nmero de scripts distintos que
pueden insertarse dentro de una Si visualizamos ambos ejemplos veremos que los resultados son idnticos.
pgina.

Un poco de sintaxis
Los primeros script PHP
La primera instruccin PHP que Editemos la pgina anterior (ejemplo4.php) y aadmosle nuestra primera etiqueta
conoceremos ser esta: PHP guardndola como ejemplo5.php. Este sera el cdigo fuente:
echo "un texto..";
<html>
La instruccin echo seguida de un <head>
texto entrecomillado har que el <title>Aprendiendo PHP</title></head>
PHP escriba en la pgina web
<body>
resultante lo contenido en esa
Esta es una pgina supersimple
cadena de texto.
<?
Al final de cada instruccin echo "Aparecer esta linea?";
debemos insertar siempre un ?>
punto y coma (;) </body>
</html>
El (;) indicar a PHP que lo que
viene a continuacin es una nueva
instruccin. Ver ejemplo5.php
Para facilitar la depuracin los
scripts no suelen escribirse dos Veamos ahora un ejemplo con las diferentes opciones de uso de las comillas
instrucciones en una misma
lnea. <html>
print "un texto..";
<head>
<title>Aprendiendo PHP</title></head>
La instruccin print tiene una <body>
funcin similar no es exacta- <?
mente la misma a la descrita /* Las instrucciones PHP son las que aparecen en rojo.
para echo. Las etiquetas en azul intenso son el cdigo HTML.
Todo lo que aparece en este color son lneas de comentario
print ("un texto..");
de las que hablaremos ms adelante
Esta es otra posibilidad la ms Cuando rescribas estos primeros scripts
habitual de utilizar print. Aqu bastar que incluyas las instrucciones escritas en rojo */
encerramos entre parntesis la
cadena que pretendemos que /* ponemos <br> al final del texto para que cuando se
aparezca impresa en la pgina web. ejecute cada una de las instrucciones echo
se escriba -adems del texto- un salto de linea HTML.
El hecho de que utilicemos
De este modo, el resultado de cada ECHO
parntesis no nos evita tener que
encerrar la cadena (texto) a aparecer en una lnea diferente */
imprimir entre comillas.
# aqu utilizamos solo unas comillas
Comillas echo "Este texto solo lleva las comillas de la instruccin<br>";
dentro de comillas
# aqu anidaremos comillas de distinto tipo
Existen dos tipos de comillas:
echo "La palabra 'comillas' aparecer entrecomillada<br>";
dobles " (SHIFT+2) y sencillas
' (tecla ? en minsculas).
# esta es otra posibilidad invirtiendo el orden de las comillas
Cuando es preciso anidar comillas echo 'La palabra "comillas" aparecer entrecomillada<br>';
deben utilizarse tipos distintos
para las exteriores y para las # una tercera posibilidad en la que utilizamos un mismo
interiores. # tipo de comillas. Para diferenciar unas de otras anteponemos
# la barra invertida, pero esta opcin no podramos utilizarla
Para que una etiqueta echo
# al revs.
interprete unas comillas como
texto y no como el final de la # No podramos poner \" en las comillas exteriores.
cadena es necesario antepo- echo "La palabra \"comillas\" usando la barra invertida<br>";
nerles un signo de barra invertida ?>
(\). </body>
</html>
En ningn caso ni con echo ni
con print est permitido sustituir
las comillas exteriores (las que Ver ejemplo6.php
encierran la cadena) por \". Esta
sintaxis solo es vlida para indicar
a PHP que debe interpretar las
comillas como un carcter ms. Ejercicio n 2
En la pgina siguiente veremos las Crea un subdirectorio en htdocs y ponle como nombre practicas.
diferentes opciones de las lneas Escribe con tu editor un script similar al ejemplo6.php utilizando print y print()en vez de
de comentarios.
echo. Guarda el documento en la carpeta practicas con el nombre ejercicio2.php y
Al realizar el ejercicio que te comprueba su funcionamiento.
proponemos no es necesario que Recuerda que para visualizarlo debers escribir en tu navegador:
pongas los comentarios del http://localhost/practicas/ejercicio2.php
ejemplo.

Anterior Indice Siguiente


Lneas de comentario

Por qu usar
Ensayando lneas de comentario
lneas de comentario? En este ejemplo hemos incluido marcados en rojo algunos ejemplos de insercin de
lneas de comentario.
A primera vista pueden parecer
intiles. Para qu recargar las
pginas con contenidos que no se <HTML>
van a ver ni ejecutar? <HEAD>
<TITLE>Ejemplo 7</TITLE></HEAD>
Las lneas de comentario sirven <BODY>
para poder recordar en un futuro
<?
qu es lo que hemos hecho al
// Este comentario no se ver en la pgina
escribir un script y por qu razn
lo hemos hecho as.
echo "Esto se leer <BR> "; // Esto no se leer
A medida que vayamos avanzando
vers que en muchos casos /* Este es un comentario de
tendremos que aplicar estrategias mltiples lneas y no se acabar
individuales para resolver cada hasta que no cerremos as.... */
problema concreto.

Cuando necesites hacer una


echo "Este es el segundo comentario que se leer<BR>";
correccin o una modificacin al
cabo de un tiempo vers que # Este es un comentario tipo shell que tampoco se leer
confiar en la memoria no es una # Este, tampoco
buena opcin. Es mucho mejor
utilizar una lnea de comentario echo ("Aqu el tercer texto visible"); #comentario invisible
que confiar en la memoria.
Palabra! /* Cuidado con anidar
/* comentarios
Comentarios multilinea con estos*/
al PHP no le gustan */
?>
Para insertar comentarios en los
scripts de PHP podemos optar
entre varios mtodos y varias </body>
posibilidades: </html>

Una sola linea


ejemplo7.php ejemplo7a.php
Basta colocar los smbolos // al
comienzo de la lnea o detrs del Ejecutemos los dos ejemplos. En el ejemplo7a hemos quitado el /* que va delante de
punto y coma que seala el final
comentarios y el */ que va despus de multilnea con estos (marcado en magenta
de una instruccin.
Tambin se puede usar el smbolo
en el cdigo fuente) y funciona perfectamente.
# en cualquiera de las dos
posiciones.
En el caso del ejemplo7 hemos mantenido el cdigo exactamente como se muestra
aqu arriba. Al ejecutarlo nos dar un error. Esto es una muestra, de la importancia que
Varias lneas tiene el evitar anidar los comentarios

Si un comentario va a ocupar ms
de una lnea podremos escribir /*
Ejercicio n 3
al comienzo de la primera de ellas
y */ al final de la ltima. Las
Escribe un script en el que se utilicen las funciones print, print() y echo aadiendo con los
lneas intermedias no requieren de
ningn tipo de marca. diferentes formatos lneas de comentario que expliquen la sintaxis de cada una de las
funciones. Gurdalo como ejercicio3.php en el directorio practicas y comprueba su
Los comentarios para los que funcionamiento.
usemos la forma /* ... */ no
pueden anidarse. Si, por error, lo
hiciramos, PHP nos dar un Anterior Indice Siguiente
mensaje de error.
Constantes

Qu es una constante?
Un ejemplo con constantes

Una constante es un valor un <HTML><HEAD><TITLE>Constantes</TITLE></HEAD>


nmero o una cadena que no va <BODY>
a ser modificado a lo largo del <?
proceso de ejecucin de los scripts /* Definiremos la constante EurPta y le asignaremos el valor 166.386 */
que contiene un documento. define("EurPta",166.386);
/* Definiremos la constante PtaEur asignndole el valor 1/166.386
Para mayor comodidad, a cada uno En este caso el valor de la constante es el resultado
de esos valores se le asigna un de la operacin aritmtica dividir 1 entre 166.386*/
nombre, de modo que cuando
define("PtaEur",1/166.386);
vaya a ser utilizado baste con
escribir su nombre. /* Definimos la constante Cadenas y le asignamos el valor:
12Esta constante es una cadena*/
Cuando ponemos nombre a una define("Cadena","12Esta constante es una cadena");
constante se dice que definimos /* Definimos la constante Cadena2 y le asignamos el valor:
esa constante. 12.54Constante con punto decimal*/
define("Cadena2","12.54Constante con punto decimal");
Cmo definir constantes?
/* Comprobemos los valores.
Observa la nueva forma en la que utilizamos echo
En PHP las constantes se definen
Lo hacemos enlazando varias cadenas separadas con
mediante la siguiente instruccin:
punto y/o coma, segn se trate de echo o de print */
define("Nombre","Valor")
echo "Valor de la constante EurPta: ", EurPta, "<BR>";
Los valores asignados a las echo "Valor de la constante PtaEur: ". PtaEur . "<BR>";
constantes se mantienen en todo print "Valor de la constante Cadena: " . Cadena . "<BR>";
el documento, incluso cuando son print "Valor de la constante Cadena x EurPta: " . Cadena*EurPta ."<br>";
invocadas desde una funcin.
print "Valor de la constante Cadena2 x EurPta: " . Cadena2*EurPta ."<br>";
No es necesario escribir entre
comillas los valores de las
constantes cuando se trata de echo "Con echo los nmeros no necesitan ir entre comillas: " ,3,"<br>";
constantes numricas. print "En el caso de print si son necesarias: " . "7" . "<br>";
print ("incluso entre parntesis necesitan las comillas: "."45"."<br>");
Si se realizan operaciones print "Solo hay una excepcin en el caso de print. ";
aritmticas con constantes tipo
print "Si los nmeros van en un print independiente no necesitan comillas
cadena, y su valor comienza por
";
una letra, PHP les asigna valor
cero. print 23;

Si una cadena empieza por uno o # Pondremos la etiqueta de cierre del script y escribiremos
varios caracteres numricos, al # una lnea de cdigo HTMAL
tratar de operarla aritmticamente ?>
PHP considerar nicamente el
valor de los dgitos anteriores a la <br>Ahora veremos los mismos resultados usando la function prueba<br><br>
primera letra o carcter no
numrico.
<?
El punto entre caracteres
numricos es considerado como # Estamos dentro de un nuevo script abierto por el <? anterior
separador de parte decimal.
/* Aunque an no la hemos estudiado, escribiremos una funcin
Tal como puedes ver en el cdigo a la que (tenemos que ponerle siempre un nombre)
fuente del ejemplo que tienes al vamos a llamar prueba()
margen, es posible definir
Lo sealado en rojo es la forma de indicar el comienzo
constantes a las que se asigne
como valor el resultado de una
y el final de la funcion
operacin aritmtica. Lo marcado en azul son las instrucciones
que deben ejecutarse cuando la funcin prueba()
sea invocada */
Ampliando echo
function prueba(){
Mediante una sola instruccin echo "Valor de la constante EurPta: ". EurPta . "<BR>";
echo se pueden presentar (en la print "Valor de la constante PtaEur: ". PtaEur. "<BR>";
ventana del navegador del cliente) echo "Valor de la constante Cadena: ", Cadena , "<BR>";
de forma simultnea varias print ("Valor de la constante Cadena x EurPta: " .
cadenas de caracteres y/o
Cadena*EurPta . "<br>");
constantes y variables. Basta con
print ("Valor de la constante Cadena2 x EurPta: " .
ponerlas una a continuacin de
otra utilizando una coma como Cadena2*EurPta . "<br>");
separador entre cada una de ellas. }

La forma anterior no es la nica # Las funciones solo se ejecutan cuando son invocadas
ni la ms habitual de enlazar
elementos mediante la instruccin /* La funcin anterior no se ejecutar hasta que escribamos
echo. Si en vez de utilizar la una lnea como esta de abajo en la que ponemos
coma usramos un punto (el nicamente el nombre de la funcin: prueba()
concatenador de cadenas)
*/
conseguiramos el mismo resultado.
?>
Cuando enlacemos elementos
distintos cadenas, constantes y/o <?
nmeros hemos de tener muy en prueba();
cuenta lo siguiente: ?>
</body>
Cada una de las sucesivas
</HTML>
cadenas debe ir encerrada entre
sus propias comillas.
ejemplo8.php
Los nombres de constantes
nunca van entre comillas.

Ampliando print
Ejercicio n 4
Las instrucciones print tambin
permiten concatenar cadenas en
Escribe un script (gurdalo como ejercicio4.php) en el que se definan dos constantes, una
una misma instruccin. numrica y otra de cadena y en el que mediante la las opciones print y echo aparezca en la
pgina web resultante un comentario sobre el tipo de cada una de ellas seguido de su valor.
En este caso solo es posible usar Intenta conseguir que los elementos concatenados aparezcan en la presentacin separados
el punto como elemento de unin. por un espacio. Observa el cdigo fuente!
Si pusiramos comas como
hacamos con echo PHP nos dara
un error.
Cuidado!

Presta mucha atencin a la sintaxis. Olvidar los ; o no poner unas comillas suelen ser la
causa de muchos mensajes de error.

Anterior Indice Siguiente


Variables

Qu es una variable?
Practicando con variables y sus mbitos
Podramos decir que es un espacio
de la memoria RAM del ordenador Podemos comparar la memoria de un ordenador con el saln de un restaurante y la
que se reserva a lo largo del ejecucin de un programa con los servicios que van a darse en la celebracin del final
tiempo de ejecucin de un script de ao. La forma habitual de hacer una reserva de mesa espacio de memoria para
para almacenar un determinado ese evento sera facilitar un nombre nombre de la variable y especificar adems
tipo de datos cuyos valores son cuantos comensales tipo de variable prevemos que van a asistir.
susceptibles de ser modificados
por medio de las instrucciones Cuando acudamos a la cena de San Silvestre podremos sentarnos en esa mesa un
contenidas en el propio programa. nmero determinado de comensales daremos un valor a la variable y a lo largo de
ella podremos levantarnos o incorporar un nuevo invitado modificacin del valor de
Nombres de variables la variable siempre que sea alguien de nuestro mbito quien realice la invitacin.
En PHP todos los nombres de
variable tienen que empezar por el Probablemente no permitiramos que el cocinero decidiera quien debe sentarse o
smbolo $. levantarse, pero si lo permitiramos a cualquiera de nuestros invitados. La diferencia
estara mbito de la variable en que el cocinero no pertenece a nuestro mbito
Las nombres de las variables han mientras que los invitados a nuestra mesa s.
de llevar una letra inme-
diatamente despus del sm- bolo Quiz si celebrramos el evento otro da cualquiera no necesitaramos hacer una
$ $pepe1 es un nombre vlido, reserva previa y bastara con acudir a la hora deseada y hacer la reserva justo en el
pero $1pepe no es un nombre momento de sentarse.
vlido.
El restaurante de PHP no necesita que hagamos ninguna reserva previa. Otros
Para PHP las letras maysculas y
muchos lenguajes de programacin, por el contrario, si la necesitan.
las minsculas son distintas. La
variable $pepe es distinta de
Siguiendo con lo que nos ocupa, aqu tienes un ejemplo del uso de las variables y la
$Pepe.
forma de utilizarlas en los diferentes mbitos.
Tipos de variables
<HTML>
En PHP no es necesario definir el <HEAD>
tipo de variable, por lo tanto,
</HEAD>
una misma variable puede
<BODY>
contener una cadena de caracteres
en un momento del proceso y, <?
posteriormente, un valor # Definimos la variable $pepe como vaca
numrico, susceptible de ser $pepe="";
operado matemticamente.
# Definimos las variables $Pepe y $Pepa (ojo con maysculas y minsculas)
Definicin de variables $Pepe="Me llamo Pepe y soy serio y formal";
$Pepa="Me llamo Pepa y tambin soy seria y formal";
PHP no requiere una definicin
previa de las variables. Se definen
?>
en el momento en que son
necesarias y para ello basta que se
les asigne un valor. <!-- esto es HTML, hemos cerrado el script -->

La sintaxis es esta: <center><b>Vamos a ver el contenido de las variables</b></center>


$variable=valor; <!-- un nuevo script PHP -->
El valor puede ser una cadena
(texto o texto y nmeros que no <?
requieren ser operados echo "<br> El valor de la variable pepe es: ",$pepe;
matemticamente) o slo un echo "<br> No ha puesto nada porque $pepe esta vaca";
nmero. En el primero de los casos echo "<br> El valor de la variable Pepe es: ",$Pepe;
habra que escribir el valor entre ?>
comillas.
<center><b><br>Invocando la variable desde una funcin</b></center>
mbito de las variables
Los valores de una variable <?
definida en cualquier parte de un /* Escribiremos una function llamada vervariable
script siempre que no sea dentro Observa la sintaxis. La palabra function delante
de una funcin pueden ser y el () al final seguidos de la llave.
utilizados desde cualquier otra Hasta que no cerremos la llave todas las lneas
parte de ese script, excepto sern consideradas parte de la funcin */
desde dentro de las funciones
que contuviera el propio script o function vervariable(){
desde las que pudieran estar echo "<br> Si invoco la variable Pepe desde una funcin";
contenidas en un fichero externo.
echo "<br>me aparecer en blanco";
Si una variable es definida dentro echo "<br>El valor de la variable Pepe es: ",$Pepe;
de una funcin slo podr ser }
utilizada dentro esa funcin. /* esta llave de arriba seala el final de la funcin.
Los contenidos que hay en adelante ya no pertenecen a ella */
Si en una funcin aludimos a una
variable externa a ella PHP /* Haremos una llamada a la funcion vervariable.
considerar esa llamada como si la Las funciones no se ejecutan hasta que no se les ordena
variable tuviera valor cero (en
y se hace de esta forma que ves aqu debajo:
caso de ser tratada como nmero)
o una cadena vaca ("" es una
nombre de la funcion seguido de los famosos parntesis */
cadena vaca).
vervariable();
Igual ocurrira si desde fuera de ?>
una funcin hiciramos alusin a
una variable definida en ella. <!-- mas HTML puro -->
<center><b><br>Ver la variable desde la funcin
Si definimos dos variables con el
poniendo <i>global</i></b></center>
mismo nombre, una dentro de una
funcin y otra fuera, PHP las
considerar distintas. La funcin <?
utilizar cuando sea ejecutada # una nueva funcion
sus propios valores sin que sus
resultados modifiquen la variable function ahorasi(){
externa. # aqui definiremos a $Pepe como global
# la funcin leer su valor externo
Variables globales
global $Pepe;
Lo comentado anteriormente,
admite algunas excepciones. echo "<br><br> Hemos asignado mbito global a la variable";
echo "<br>ahora Pepe aparecer";
Las funciones pueden utilizar echo "<br>El valor de la variable Pepe es: ", $Pepe;
valores de variables externas a
ellas pero ello requiere incluir }
dentro de la propia funcin la
# hemos cerrado ya la funcion con la llave.
siguiente instruccin:
# Tendremos que invocarla para que se ejecute ahora
global nombre de la variable; ahorasi();
?>
Por ejemplo: global $a1;
<center><b><br>Un solo nombre y dos <i>variables distintas</i></b><br>
En una instruccin global
Dentro de la funcin el valor de la variable es <br></center>
pueden definirse como tales, de
forma simultnea, varias variables.
Basta con escribir los nombres de <?
cada una de ellas separados por function cambiaPepa(){
comas.
$Pepa="Ahora voy a llamarme Luisa por un ratito";
P. ej.: global $a1, $a2, $a3;
echo "<br>",$Pepa;
Variables superglobales }
A partir de la versin 4.1.0 de
PHP se ha creado un nuevo tipo cambiaPepa();
de variables capaces de ?>
comportarse como globales sin <center>... pero despus de salir de la funcin
necesidad de que se definan como vuelvo al valor original...</center>
tales. <?
echo "<br>",$Pepa;
Estas variables que no pueden ser ?>
creadas por usuario, recogen de
forma automtica informacin muy
especfica y tienen nombres
preasignados que no pueden </BODY>
modificarse. </HTML>

Las estudiaremos un poco ms


adelante. Por ahora, slo citar los ejemplo9.php
nombres de algunas de ellas:

$_SERVER, $_POST, $_GET o


$_ENV son los de las ms Ejercicio n 5
importantes.
Escribe un script (gurdalo como ejercicio5.php) en el que una misma variable tome dos
valores distintos sin utilizar ninguna funcin. Luego aade al script una funcin que presente
ese mismo nombre de variable con un valor distinto de los anteriores, comprobando que
esta ltima opcin no modific el ltimo valor de aquellos.

Anterior Indice Siguiente


Constantes predefinidas

Constantes predefinidas
Un ejemplo con constantes predefinidas

PHP dispone de algunas constantes <HTML>


predefinidas que no requieren la <HEAD>
instruccin: </HEAD>
<BODY>
define("Nombre","Valor") <?
# La constante del sistema __FILE__ nos devolver
Algunas de ellas son estas:

__FILE__ echo "La ruta completa de este fichero es: ";


echo __FILE__;
Recoge el nombre del fichero que
se est ejecutando y la ruta # La constante del sistema __LINE__ nos devolver
completa de su ubicacin en el # el nmero de lnea que se est interpretando
servidor. # tambin cuenta las lneas en blanco
__LINE__ # cuenta las lneas y vers que devuelve ... 16

Recoge el nmero de lnea echo "<br>Esta es la lnea: ",__LINE__, "del fichero";


(incluidas lneas en blanco) del echo "<br>Estamos utilizando la versin: ",PHP_VERSION, " de PHP";
fichero PHP cuyos scripts est echo "<br>El PHP se est ejecutando desde el sistema operativo: ",PHP_OS;
interpretando.
Puede resultar muy til para ?>
depurar programas escritos en PHP.

PHP_OS </BODY>
</HTML>
Recoge informacin sobre el
Sistema Operativo que utiliza el
servidor en el que se est ejemplo10.php
interpretando el fichero.

PHP_VERSION
Ejercicio n 6
Recoge la versin de PHP que est
siendo utilizada por el servidor. Escribe un script (gurdalo como ejercicio6.php) que construya una pequea pgina web
en la que aparezca el texto "Ests utilizando la versin: 4.4.2 de PHP" (incluidas las
Cuidado!
comillas y extrayendo el nmero de versin de la constante predefinida correspondiente).
Por si existieran dudas por Trata de que todas las etiquetas HTML que utilices estn recogidas en variables PHP, de
problemas de visualizacin tanto manera que no exista ninguna lnea en el cdigo fuente de la pgina que est fuera de las
FILE como LINE tienen que llevar etiquetas <? ... ?>
dos guiones bajos delante y
otras dos detrs.

Anterior Indice Siguiente


Variables predefinidas

Las tablas de valores


Variables de servidor
$_SERVER['COMSPEC'] $HTTP_SERVER_VARS['COMSPEC']
En las tablas que tenemos aqu a
la derecha estamos viendo C:\\WINDOWS\\COMMAND.COM
clasificadas por tipos algunas $_SERVER['DOCUMENT_ROOT'] $HTTP_SERVER_VARS['DOCUMENT_ROOT']
variables predefinidas de PHP con
sus valores actuales. c:/apache/htdocs
$_SERVER['HTTP_ACCEPT'] $HTTP_SERVER_VARS['HTTP_ACCEPT']
Esta informacin (variables y
valores) est siendo extraida de la image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, applica
configuracin de tu servidor y de tion/x-shockwave-flash, application/vnd.ms-powerpoint, appli
este documento. cation/vnd.ms-excel, application/msword, application/x-icq,
*/*
Es muy probable que est
llamando tu atencin el hecho de $_SERVER['HTTP_ACCEPT_ENCODING'] $HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING']
que dos nombres de variable gzip, deflate
distintos compartan el mismo
$_SERVER['HTTP_ACCEPT_LANGUAGE'] $HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE']
valor.
es
Intentaremos ver el por qu de
$_SERVER['HTTP_CONNECTION'] $HTTP_SERVER_VARS['HTTP_CONNECTION']
esa duplicidad.
Keep-Alive
Las variables de las columnas de la
izquierda comienzan todas por $_, $_SERVER['HTTP_HOST'] $HTTP_SERVER_VARS['HTTP_HOST']
mientras que las de la derecha lo localhost
hacen por $HTTP y eso es algo
$_SERVER['HTTP_REFERER'] $HTTP_SERVER_VARS['HTTP_REFERER']
muy importante.
http://localhost/version2006/cursoPHP/php15.php
En el primer caso se alude a las
variables superglobales que $_SERVER['HTTP_USER_AGENT'] $HTTP_SERVER_VARS['HTTP_USER_AGENT']
hemos comentado en la pgina Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; brip1)
anterior, mientras que en el otro
$_SERVER['PATH'] $HTTP_SERVER_VARS['PATH']
las variables no tienen ese
carcter. C:\\WINDOWS;C:\\WINDOWS\\COMMAND;C:\\ARCHIV~1\\ARCHIV~1\\GTK
\\2.0\\BIN;C:\\APACHE;C:\\APACHE\\PHP4;C:\\APACHE\\PHP5
Razones de la duplicidad $_SERVER['PHPRC'] $HTTP_SERVER_VARS['PHPRC']
c:/Apache/php5/
La duplicidad de variables se
$_SERVER['REMOTE_ADDR'] $HTTP_SERVER_VARS['REMOTE_ADDR']
justifica por lo siguiente: Las
variables superglobales se 127.0.0.1
introdujeron en PHP a partir de la $_SERVER['REMOTE_PORT'] $HTTP_SERVER_VARS['REMOTE_PORT']
versin 4.1.0 y no existan con
anterioridad. 1256
$_SERVER['SCRIPT_FILENAME'] $HTTP_SERVER_VARS['SCRIPT_FILENAME']
Con muy buen criterio, los
desarrolladores PHP optaron por c:/apache/htdocs/version2006/cursophp/php16.php
mantener las variables $_SERVER['SERVER_ADDR'] $HTTP_SERVER_VARS['SERVER_ADDR']
predefinidas de las versiones
anteriores para evitar que los 127.0.0.1
programadores que migraran sus $_SERVER['SERVER_ADMIN'] $HTTP_SERVER_VARS['SERVER_ADMIN']
aplicaciones a estas nuevas
versiones de PHP se vieran pruebas@localhost
obligados a reescribir el cdigo de $_SERVER['SERVER_NAME'] $HTTP_SERVER_VARS['SERVER_NAME']
sus scripts.
localhost
Es por esta razn, por la que se $_SERVER['SERVER_PORT'] $HTTP_SERVER_VARS['SERVER_PORT']
mantienen dos variables distintas
para recoger el mismo valor. 80
$_SERVER['SERVER_SIGNATURE'] $HTTP_SERVER_VARS['SERVER_SIGNATURE']
Observa la sintaxis de los nombres
de las variables y comprobars la Apache/1.3.33 Server at localhost Port 80
similitud que existe entre ambas.
Los corchetes y sus contenidos son
exactamente iguales en ambos $_SERVER['SERVER_SOFTWARE'] $HTTP_SERVER_VARS['SERVER_SOFTWARE']
casos.
Apache/1.3.33 (Win32) PHP/4.4.0
Tal es el caso de estas dos, que, $_SERVER['WINDIR'] $HTTP_SERVER_VARS['WINDIR']
por cierto, devuelven en nmero
de la IP a travs de la que est C:\\WINDOWS
accediendo el usuario a nuestro $_SERVER['GATEWAY_INTERFACE'] $HTTP_SERVER_VARS['GATEWAY_INTERFACE']
servidor:
CGI/1.1
$_SERVER['REMOTE_ADDR'] $_SERVER['SERVER_PROTOCOL'] $HTTP_SERVER_VARS['SERVER_PROTOCOL']
y
$HTTP_SERVER_VARS
HTTP/1.1
['REMOTE_ADDR'] $_SERVER['REQUEST_METHOD'] $HTTP_SERVER_VARS['REQUEST_METHOD']

cuya similitud resulta evidente. GET


$_SERVER['QUERY_STRING'] $HTTP_SERVER_VARS['QUERY_STRING']
Aunque los valores de ambas
variables van a ser siempre
idnticos, no ocurre lo mismo con $_SERVER['REQUEST_URI'] $HTTP_SERVER_VARS['REQUEST_URI']
su mbito.
/version2006/cursoPHP/php16.php
Las primeras son de mbito $_SERVER['SCRIPT_NAME'] $HTTP_SERVER_VARS['SCRIPT_NAME']
superglobal y no necesitan ser
declaradas expresamente con /version2006/cursoPHP/php16.php
globales cuando se trata de utilizar $_SERVER['PATH_TRANSLATED'] $HTTP_SERVER_VARS['PATH_TRANSLATED']
sus valores dentro de cualquier
funcin. c:/apache/htdocs/version2006/cursophp/php16.php
$_SERVER['PHP_SELF'] $HTTP_SERVER_VARS['PHP_SELF']
En el segundo caso va a ser
imprescindible que sean /version2006/cursoPHP/php16.php
declaradas como globales antes $_SERVER['argv'] $HTTP_SERVER_VARS['argv']
de que sus valores puedan ser
utilizados dentro de una funcin.
$_SERVER['argc'] $HTTP_SERVER_VARS['argc']

Nombres algo raros?

Probablemente te extraar Variables de entorno


justificadamente la longitud y la
estructura un tanto rara de estos
$_ENV['TMP'] $HTTP_ENV_VARS['TMP']
nombres de variables. Cuando
tratemos el tema de los arrays C:\\WINDOWS\\TEMP
asociativos veremos que esa es la
$_ENV['TEMP'] $HTTP_ENV_VARS['TEMP']
sintaxis habitual de ese tipo de
variables. C:\\WINDOWS\\TEMP
$_ENV['PROMPT'] $HTTP_ENV_VARS['PROMPT']
Las nombres de las variables de
cada uno de los tipos, slo se $p$g
diferencian en lo contenido entre
$_ENV['winbootdir'] $HTTP_ENV_VARS['winbootdir']
los corchetes porque se trata de
distintos elementos del mismo C:\\WINDOWS
array asociativo y tal como $_ENV['COMSPEC'] $HTTP_ENV_VARS['COMSPEC']
veremos esa es la sintaxis tpica
de los array. C:\\WINDOWS\\COMMAND.COM
$_ENV['PATH'] $HTTP_ENV_VARS['PATH']
Para qu sirven? C:\\WINDOWS;C:\\WINDOWS\\COMMAND;C:\\ARCHIV~1\\ARCHIV~1\\GTK
\\2.0\\BIN;C:\\APACHE;C:\\APACHE\\PHP4;C:\\APACHE\\PHP5
No vamos a agobiarte con una $_ENV['LANG'] $HTTP_ENV_VARS['LANG']
enumeracin de variables y
contenidos, pero a poco que Default
observes las tablas de valores te $_ENV['TVDUMPFLAGS'] $HTTP_ENV_VARS['TVDUMPFLAGS']
dars cuenta de que es muy
abundante y muy importante la 8
informacin que recogen. $_ENV['windir'] $HTTP_ENV_VARS['windir']

Si analizas las variables de C:\\WINDOWS


servidor te dars cuenta de que $_ENV['CMDLINE'] $HTTP_ENV_VARS['CMDLINE']
aparece un montn de informacin
relativa a su configuracin: START C:\\Apache\\Apache.exe -w -f \"C:\\Apache\\conf\\httpd
nombre, rutas, nombres de _modulo4.conf\" -d \"C:\\Apache\\\"
pginas, IP del servidor, etctera.

Con los dems tipos ocurre algo Variables GLOBALES


similar.
$GLOBALS['TMP']

Los distintos tipos C:\\WINDOWS\\TEMP


$GLOBALS['TEMP']
Veamos los diferentes tipos de C:\\WINDOWS\\TEMP
variables predefinidas que existen
en PHP. Por ahora, no te $GLOBALS['PROMPT']
preocupes demasiado sobre la $p$g
forma de utilizarlas. Las incluimos
aqu como una simple $GLOBALS['winbootdir']
enumeracin y con una breve C:\\WINDOWS
descripcin de su utilidad.
$GLOBALS['COMSPEC']
En temas posteriores haremos C:\\WINDOWS\\COMMAND.COM
referencia a ellas. Por el momento
nos bastar con conocer su $GLOBALS['PATH']
existencia. C:\\WINDOWS;C:\\WINDOWS\\COMMAND;C:\\ARCHIV~1\\ARCHIV~1\\GTK
\\2.0\\BIN;C:\\APACHE;C:\\APACHE\\PHP4;C:\\APACHE\\PHP5
Estamos viendo los valores de las
variables de de entorno (ENV) y $GLOBALS['LANG']
las de servidor (SERVER), pero, Default
adems de ellas, existen algunas
otras cuyos nombres y utilidades $GLOBALS['TVDUMPFLAGS']
vamos a comentarte. 8
Variables de sesin $GLOBALS['windir']
C:\\WINDOWS
Las identificaremos por los
nombres $_SESSION o por $GLOBALS['CMDLINE']
$HTTP_SESSION_VARS. START C:\\Apache\\Apache.exe -w -f \"C:\\Apache\\conf\\httpd
Este tipo de variables las _modulo4.conf\" -d \"C:\\Apache\\\"
utilizaremos cuando hagamos $GLOBALS['DOCUMENT_ROOT']
mencin al uso de sesiones.
c:/apache/htdocs
La utilizacin de sesiones ya $GLOBALS['HTTP_ACCEPT']
abundaremos en ello es una
forma de recoger, de forma image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, applica
temporal en un documento del tion/x-shockwave-flash, application/vnd.ms-powerpoint, appli
mismo carcter, informacin cation/vnd.ms-excel, application/msword, application/x-icq,
especfica generada a travs de los */*
accesos de cada uno de los $GLOBALS['HTTP_ACCEPT_ENCODING']
usuarios.
gzip, deflate
Por ejemplo, cuando accedes al $GLOBALS['HTTP_ACCEPT_LANGUAGE']
Aula Virtual de este curso y
escribes tu clave y contrasea se es
crea un documento temporal en el $GLOBALS['HTTP_CONNECTION']
servidor del CNICE con un nmero
nico y exclusivo para ese acceso Keep-Alive
identificador de sesin que te $GLOBALS['HTTP_HOST']
permite acceder a diferentes
apartados de ese espacio sin localhost
necesidad de que reescribas, en $GLOBALS['HTTP_REFERER']
cada una de las pginas, esos
mismos valores. http://localhost/version2006/cursoPHP/php15.php
$GLOBALS['HTTP_USER_AGENT']
El carcter efmero de las sesiones
seguramente lo has comprobado Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; brip1)
ms de una vez cuando al $GLOBALS['PHPRC']
actualizar una pgina te ha
aparecido un mensaje diciendo que
c:/Apache/php5/
la sesion ha caducado. $GLOBALS['REMOTE_ADDR']

Variables del mtodo POST 127.0.0.1


$GLOBALS['REMOTE_PORT']
Las identificaremos por los
nombres $HTTP_POST_VARS o 1256
por $_POST. $GLOBALS['SCRIPT_FILENAME']

Este tipo de variables que c:/apache/htdocs/version2006/cursophp/php16.php


utilizaremos con frecuencia $GLOBALS['SERVER_ADDR']
recogen la informacin que se
envia desde el cliente para ser 127.0.0.1
utilizada por el servidor. $GLOBALS['SERVER_ADMIN']

Recuerda el carcter dinmico de pruebas@localhost


PHP y que ese dinamismo $GLOBALS['SERVER_NAME']
(interaccin cliente servidor)
requiere que el servidor guarde los localhost
datos remitidos por el cliente. $GLOBALS['SERVER_PORT']

Variables del mtodo GET 80


$GLOBALS['SERVER_SIGNATURE']
Las identificaremos por los
nombres $HTTP_GET_VARS o Apache/1.3.33 Server at localhost Port 80
por $_GET

Son muy similares a las anteriores. $GLOBALS['SERVER_SOFTWARE']


La existencia de los dos tipos se
justifica porque tambin existen Apache/1.3.33 (Win32) PHP/4.4.0
dos tipos de mtodos (maneras) $GLOBALS['WINDIR']
de enviar datos desde el cliente
hasta el servidor. C:\\WINDOWS
$GLOBALS['GATEWAY_INTERFACE']
Cuando el mtodo de envo es el
llamado GET los datos se recogen CGI/1.1
en variables de este tipo, y, por el $GLOBALS['SERVER_PROTOCOL']
contrario, si ese mtodo envo
fuera POST se recogeran en HTTP/1.1
aquellas. $GLOBALS['REQUEST_METHOD']

Variables de transferencia de GET


ficheros $GLOBALS['QUERY_STRING']

Las identificaremos por el nombre


$HTTP_FILES_VARS o por $GLOBALS['REQUEST_URI']
$_FILES.
/version2006/cursoPHP/php16.php
Para el caso de transferencia de $GLOBALS['SCRIPT_NAME']
ficheros desde el cliente al servidor
subir ficheros es necesario un
/version2006/cursoPHP/php16.php
procedimiento distinto de los $GLOBALS['PATH_TRANSLATED']
anteriores.
c:/apache/htdocs/version2006/cursophp/php16.php
Ser en este caso cuando se $GLOBALS['PHP_SELF']
utilicen variables de este tipo.
/version2006/cursoPHP/php16.php
El tipo GLOBALS $GLOBALS['argc']

A diferencia de las anteriores, las 0


variables de este tipo disponen de
una sintaxis nica $GLOBALS
sin que quepa ninguna otra opcin.
$GLOBALS['opcion']
Su finalidad es recoger en una I
tabla los nombres de todas la
$GLOBALS['anterior']
variables establecidas como
globales en cada momento as php15.php
como sus valores. Si observas la
$GLOBALS['siguiente']
tabla que tienes aqu a la derecha,
quiz te sorprenda leer nombre o php17.php
pgina. De donde han salido esos $GLOBALS['nombre']
valores?. Bueno... en esta pgina
utilizamos scripts PHP y esos son nombre
los nombres de unas variables que $GLOBALS['clave']
hemos incluido en esos script.
siguiente
Conocida la existencia de los
diferentes tipos de variables
predefinidas y vista esta tabla a
modo de ejemplo de su utilidad
Anterior Indice Siguiente
no ser preciso que profundicemos
ms en el asunto.

Lo trataremos en el momento en el
que tengamos que hacer uso de
cada una de ellas.
Otras variables

Valores de las variables


Variables estticas

Cuando hablbamos de las <?


variables, nos referamos a su
mbito y comentbamos que las # Observa que hemos prescindido de los encabezados HTML.
variables definidas dentro de una # No son imprescindibles para la ejecucin de los scripts
funcin pierden sus valores en el
momento en el que abandonemos /* Escribamos una funcin y llammosla sinEstaticas
el mbito de esa funcin, es decir, Definamos en ella dos variables sin ninguna otra especificacin
cuando finaliza su ejecucin. e insertemos las instrucciones para que al ejecutarse
se escriban los valores de esas variables */
Decamos tambin que si el
mbito en el que hubiera sido
definida fuera externo a una function sinEstaticas(){
funcin los valores slo se
perderan temporalmente # Pongamos aqu sus valores iniciales
mientras durara la eventual $a=0;
ejecucin de las instrucciones de $b=0;
aquella y que, una vez acabado
ese proceso, volvan a recuperar # Imprimamos estos valores iniciales
sus valores.

Bajo estas condiciones, si


echo "Valor inicial de $a: ",$a,"<br>";
invocramos repetidamente la echo "Valor inicial de $b: ",$b,"<br>";
misma funcin obtendramos cada
vez el mismo resultado. /* Modifiquemos esos valores sumando 5 al valor de $a
y restando 7 al valor de $b.
Las posibles modificaciones que $a +=5 y $b -=7 sern quienes haga esas
pudieran haberse efectuado (a nuevas asignaciones de valor
travs de las instrucciones ya lo iremos viendo, no te preocupes */
contenidas en la funcin) en el
valor inicial de las variables, se
perderan cada vez que
$a +=5;
abandonramos la funcin con lo $b -=7;
cual, si hiciramos llamadas
sucesivas, se repetiran tanto el # Visualicemos los nuevos valores de las variables
valor inicial como el resultado. echo "Nuevo valor de $a: ",$a,"<br>";
echo "Nuevo valor de $b: ",$b,"<br>";
Variables estticas
}

Para poder conservar el ltimo # Escribamos ahora la misma funcin con una modificacin que ser
valor de una variable definida # asignar la condicin de esttica a la variable $b
dentro de una funcin basta con
# Llamemos a esa funcin: conEstaticas
definirla como esttica.

La instruccin que permite function conEstaticas(){


establecer una variable como
esttica es la siguiente: # Definimos $b como esttica
$a=0;
static nombre = valor; static $b=0;
P. ej: si la variable fuera $a y el
valor inicial asignado fuera 3 echo "Valor inicial de $a: ",$a,"<br>";
escribiramos: echo "Valor inicial de $b: ",$b,"<br>";

static $a=3; $a +=5;


$b -=7;
La variable conservar el ltimo de
los valores que pudo habrsele
asignado durante la ejecucin de echo "Nuevo valor de $a: ",$a,"<br>";
la funcin que la contiene. No echo "Nuevo valor de $b: ",$b,"<br>";
retomar el valor inicial hasta
que se actualice la pgina. }

# Insertemos un texto que nos ayude en el momento de la ejecucin


Variables de variables
print ("Esta es la primera llamada a sinEstaticas()<br>");
Adems del mtodo habitual de
asignacin de nombres a las # Invoquemos la funcin sinEstaticas;
variables -poner el signo $ delante
de una palabra-, existe la
sinEstaticas();
posibilidad de que tomen como
nombre el valor de otra variable # Aadamos un nuevo comentario a la salida
previamente definida. print ("Esta es la segunda llamada sinEstaticas()<br>");
print ("Debe dar el mismo resultado que la llamada anterior<br>");
La forma de hacerlo sera esta: # Invoquemos por segunda vez sinEstaticas;
sinEstaticas();
$$nombre_variable_previa;

Veamos un ejemplo. # Hagamos ahora lo mismo con la funcin conEstaticas

Supongamos que tenemos una print ("Esta es la primera llamada a conEstaticas()<br>");


variable como esta:
conEstaticas();
$color="verde";

Si ahora queremos definir una print ("Esta es la segunda llamada a conEstaticas()<br>");


nueva variable que utilice como print ("El resultado es distinto a la llamada anterior<br>");
nombre el valor (verde) que est
contenido en la variable previa conEstaticas();
($color), habramos de poner algo
como esto: ?>
$$color="es horrible";
Cmo podramos visualizar el
ejemplo11.php
valor de esta nueva variable?

Habra tres formas de escribir la Variables de variables


instruccin:

print $$color; <?


o # Definamos una variable y asignmosle un valor
print ${$color}; $color="rojo";
o tambin # Definamos ahora una nueva variable de nombre variable
print $verde; # usando para ello la variable anterior
$$color=" es mi color preferido";
Cualquiera de las instrucciones
anteriores nos producira la misma
# Veamos impresos los contenidos de esas variables
salida: es horrible.
print ( "El color ".$color. $$color ."<br>");
Podemos preguntarnos cmo se #o tambin
justifica que existan dos sintaxis print ( "El color ".$color. ${$color}."<br>");
tan similares como $$color y # o tambin
${$color}? Qu pintan las llaves?. print ( "El color ".$color. $rojo."<br>");
La utilizacin de las llaves es una
# advirtamos lo que va a ocurrir al visualizar la pgina
forma de evitar situaciones de
interpretacin confusa.
print ("Las tres lneas anteriores deben decir lo mismo<br>");
Supongamos que las variables print ("Hemos invocado la misma variable de tres formas diferentes<BR>");
tienen un nombre un poco ms
raro.
# cambiemos ahora el nombre del color
Por ejemplo que $color no se llama
$color="magenta";
as sino $color[3] (podra ser que
$color fuera un array una lista de
colores y que esta variable /* La variable $rojo seguir existiendo.
contuviera el tercero de ellos). El hecho de cambiar el valor a $color
no significa que vayan a modificarse
En este supuesto, al escribir: print las variables creadas con su color anterior
$$color[3] cabra la duda de si el ni que se creen automticamente variables
nmero 3 pertenece (es un ndice) que tengan por nombre el nuevo valor de $color */
a la variable $color o si ese
nmero corresponde a $$color.
# Pongamos un mensaje de advertencia para que sea visualizado en la
Con print ${$color[3]} no habra salida
lugar para esas dudas. Estaramos
aludiendo de forma inequvoca a 3 print ("Ahora la variable $color ha cambiado a magenta<br>");
como ndice de la variable $color. print ("pero como no hemos creado ninguna variable con ese color<br>");
print ("en las lineas siguientes no aparecer nada <br>");
Qu ocurre cuando print ("detrs de la palabra magenta <br>");
la variable previa
cambia de valor?
# Escribimos los print advertidos
Cuando la variable utilizada para print (" El color ".$color.$$color."<br>");
definir una variable de variable print (" El color ".$color.${$color}."<br>");
cambia de valor no se modifica ni
el nombre de esta ltima ni # Comprobemos que la variable $rojo creada como variable de variable
tampoco su valor. # cuando $color="rojo" an existe y mantiene aquel valor
Puedes ver este concepto, con un
print ("Pese a que $color vale ahora ".$color."<br>");
poco ms de detalle, en el cdigo
fuente del ejemplo.
print ("la vieja variable $rojo sigue existiendo <br>");
print ("y conserva su valor. Es este: ".$rojo);
La solucin del ejercicio
?>
Las diferencias que habrs podido
observar al realizar el ejercicio n7
estn originadas por la
interpretacin que hacen PHP y el ejemplo12.php
navegador de algunos caracteres
especiales, tales como $, ", o <,
que al ser interpretados como
smbolos del lenguaje no se Ejercicio n 7
imprimen en pantalla.
Abre tu editor creando un documento nuevo. Copia el cdigo fuente del ejemplo anterior y
Cuando pretendamos que pgalo en ese documento. Ahora gurdalo como ejercicio7.php. Abre en tu navegador
aparezcan escritos tendremos que ejercicio7.php y compralo con el que visualizas al pulsar sobre ejemplo12.php.
indicarlo de una forma especial. Comprueba que existen algunas diferencias entre ambos.
En este enlace podrs ver la forma
de hacerlo.
Cuidado!

Aunque en los enunciados no se advierta, como norma general, los ejercicios debers
guardarlos siempre en el directorio practicas que has creado al realizar el ejercicio n 2

Anterior Indice Siguiente


Tipos de variables

Tipos de variables
Tipos de variables
En el cuadro siguiente podemos ver los tres tipos de variables que utiliza PHP.
En PHP no es necesaria una
definicin previa del tipo de
Las variables en PHP
variables.
Tipo Ejemplo Valor mximo Valor mnimo Observaciones
Segn los valores que se les vayan Cualquier valor numrico entero
asignando, las variables podrn (dentro de este intervalo) que se
cambiar de tipo de modo Integer $a=1234 2147483647 -2147483647 asigne a una variable ser convertido
automtico y se irn adaptando a a este tipo
los valores que contengan en cada
Cualquier valor numrico decimal, o entero fuera del intervalo anterior,
momento. Double $a=1.23 que se asigne a una variable la convertir a este tipo

Las variables en PHP pueden ser Cualquier valor entrecomillado (sean nmeros o letras) que se asigne a
String $a="123" una variable la convertir a este tipo
de tres tipos:

Enteras (tipo Integer)

De coma flotante (tipo


Double)
Determinacin del tipo de variable utilizada
Cadenas (tipo String) Dado que PHP gestiona las variables de forma automtica y modifica los tipos de
acuerdo con los valores que va tomando durante la ejecucin del script, se pude recurrir
Cualquier nmero entero cuyo
valor est comprendido entre a la funcin gettype(nombre de la variable) para determinar el tipo de la variable
231 ser interpretado por PHP actual.
como de tipo Integer.
En la tabla siguiente tienes algunos ejemplos de aplicacin de esa funcin.
Si el valor de una variable es un
nmero decimal o siendo entero Podemos observar en la columna Sintaxis que para visualizar el resultado
desborda el intervalo anterior, bien anteponemos echo a gettype. Es decir, le indicamos a PHP que muestre el resultado
por asignacin directa o como obtenido al determinar el tipo de variable.
resultado de una operacin
aritmtica, PHP la convierte a tipo
Double. Ejemplos de determinacin del tipo de una variable
Cualquier variable a la que se le Variable Sintaxis Devuelve
asigne como valor el contenido de $a1=347 echo gettype($a1) integer
una cadena de caracteres (letras y/
o nmeros delimitados por $a2=2147483647 echo gettype($a2) integer
comillas) es interpretada por PHP
$a3=-2147483647 echo gettype($a3) integer
como tipo String.
$a4=23.7678 echo gettype($a4) double
Determinacin de tipos de $a5=3.1416 echo gettype($a5) double
variables $a6="347" echo gettype($a6) string
$a7="3.1416" echo gettype($a7) string
PHP dispone de la funcin:
$a8="Solo literal" echo gettype($a8) string
gettype(variable)
$a9="12.3 Literal con nmero" echo gettype($a9) string
que devuelve una cadena de $a10="" echo gettype($a10) string
caracteres indicando el tipo de la
variable que contiene.

La cadena devuelta por esta


funcin puede ser: Integer, Forzado de tipos
double o string.
Aqu tienes algunos ejemplos de forzado de tipos. Te sugerimos que eches un vistazo a
Forzado de tipos las advertencias que hemos puesto despus de esta tabla.

PHP permite forzar los tipos de las Forzado de tipos


variables. Eso quiere decir que se Variable Sintaxis Devuelve
puede obligar a PHP a asignar un
tipo determinado a una variable $a1=347 echo gettype((real)$a1) double
determinada, siempre que los $a2=2147483647 echo gettype((double)$a2) double
valores que contenga estn
dentro del rango del nuevo tipo $a3=-2147483647 echo gettype((float)$a3) double
de variable.
$a4=23.7678 echo gettype((int)$a4) integer
Los tipos se pueden forzar tanto $a5=3.1416 echo gettype((integer)$a5) integer
en el momento de definir la
variable como despus de haber $a6="347" echo gettype((double)$a6) double
sido definida. $a7="3.1416" echo gettype((int)$a7) integer
Forzado y asignacin $a7="3.1416" echo gettype((string)$a7) string
simultnea de valores
$a8="Solo literal" echo gettype((double)$a8) double
Al asignar un valor a una variable, $a9="12.3 Literal con nmero" echo gettype((int)$a9) integer
se puede forzar su tipo de la
siguiente forma. Si deseamos que
la variable pase a ser tipo de Cuidado!
double basta con anteponer a su
valor entre parntesis tal como Al modificar los tipos de variables pueden modificarse sus valores.
se indica una de las expresiones: Si forzamos a entera una variable que contenga un nmero decimal se perdera la parte
(double), (real) o (float). decimal y la variable modificada solo contendra el valor de la parte entera.
Si tratamos de convertir a numrica una variable alfanumrica el nuevo valor sera cero.
Por ejemplo:

$a=((double)45); o Aqu tienes algunos ejemplos relacionados con la advertencia anterior


$a=((float)45); o
$a=((real)45); Nuevos valores de la variable
cualquiera de ellas producira el
Valor inicial Sintaxis Nuevo valor
mismo efecto: convertir la variable
$a a tipo Double. $a1=347 echo ((real)$a1) 347

Para forzar una variable a tipo $a2=2147483647 echo ((double)$a2) 2147483647


Integer podemos anteponer a su $a3=-2147483647 echo ((float)$a3) -2147483647
valor una de estas expresiones:
$a4=23.7678 echo ((integer)$a5) 23
(integer), o (int).
$a5="3.1416" echo ((double)$a6) 3.1416
Por ejemplo: $a6="347" echo ((int)$a7) 347
$b=((integer)4.5); o $a7="3.1416" echo ((string)$a7) 3.1416
$b=((int)45);
$a8="Solo literal" echo ((int)$a8) 0
produciran el mismo efecto: $a9="12.3 Literal con nmero" echo ((double)$a9) 12.3
convertir la variable $b a tipo
Integer. $a10="" echo ((int)$a9) 0

Para forzar una variable a tipo


String basta con anteponer a su
valor (entre parntesis): (string). Forzado de tipos usando settype()
Por ejemplo:
Aqu tienes algunos ejemplos del uso de esa funcin. La tabla est organizada en
$c=((string)4.5); bloques de tres filas que corresponden a la ejecucin de tres instrucciones y a la
convertira la variable $c a tipo visualizacin del resultado de cada una de ellas.
String.
El resultado de settype primera fila solo podr ser 1 0 segn la instruccin se
Forzado de tipos en haya ejecutado con xito o no haya podido realizarse.
variables ya definidas
En la segunda fila comprobamos el nuevo tipo de variable obtenida mediante la
La forma ms aconsejable de ejecucin de la instruccin anterior y en la tercera visualizamos los nuevos valores de la
forzado de tipos en variables que variable, que pueden haber cambiado como consecuencia del cambio de tipo.
ya estuvieran definidas
previamente, es el uso de la
siguiente instruccin:
Forzado de tipos con settype()
Variable Sintaxis Devuelve
settype(var,tipo)
$a1=347 echo (settype($a1,'double') 1
donde var es el nombre de la echo gettype($a1) double
variable cuyo tipo pretendemos
modificar y tipo una expresin que echo $a1 347
puede contener (entre comillas)
$a2=2147483647 echo (settype($a2,'double') 1
uno de estos valores: 'double',
'integer', o 'string' segn se trate echo gettype($a2) double
de forzar a: coma flotante, entero,
o cadena.
echo $a2 2147483647
$a3=-2147483647 echo settype($a3,'double') 1
Un ejemplo podra ser este:
echo gettype($a3) double
settype($a,'integer')
echo $a3 -2147483647
que convertira a tipo entero la $a4=23.7678 echo settype($a4,'integer') 1
variable $a.
echo gettype($a4) integer
La ejecucin de la instruccin
echo $a4 23
settype devuelve (da como
resultado) un valor que puede ser: $a5=3.1416 echo settype($a5,'integer') 1
true o false (1 0) segn la
conversin se haya realizado con
echo gettype($a5) integer
xito o no haya podido realizarse. echo $a5 3
$a6="347" echo settype($a6,'double') 1
Operaciones con distintos
echo gettype($a6) double
tipos de variables
echo $a6 347
PHP permite la realizacin de $a7="3.1416" echo settype($a7,'integer') 1
operaciones aritmticas con
cualquiera de los tres tipos de
echo gettype($a7) integer
variables y adeca el resultado al echo $a1 3
tipo ms apropiado.
$a8="Solo literal" echo settype($a8,'double') 1
En la tabla de la derecha puedes echo gettype($a8) double
ver algunos ejemplos, pero, en
resumen, ocurre lo siguiente: echo $a8 0

Al operar con dos enteros, si el $a9="12.3 Literal con nmero" echo settype($a9,'integer') 1
resultado est dentro del rango de echo gettype($a9) integer
los enteros, devuelve un entero.
echo $a9 12
Si al operar con dos enteros el
resultado desborda el rango
entero, convierte su valor, de
forma automtica, al tipo coma Tipos de variable de los operadores y de los resultados
flotante

Al operar un entero con una La tabla siguiente contiene en cada fila los valores asignados a dos variables (A y B)
variable tipo coma flotante el y el resultado de la suma de ambas. A continuacin se recogen los tipos de variable de
resultado es de coma flotante. cada una de ellas y el del resultado. El tipo de este ltimo generado por PHP estar
Al operar con una cadena lo hace
condicionado por el valor del resultado de cada una de las operaciones.
como si se tratara de un entero. Si
hay caracteres numricos al
comienzo, los extrae (hasta que Resultados de operaciones y tipos de variables resultantes
aparezca un punto o un carcter Valores Tipos de variables
no numrico) y los opera como
A B A+B A B A+B
un nmero entero.
12 16 28 integer integer integer
Si una cadena no comienza por
un carcter numrico PHP la 12 2147483647 2147483659 integer integer double
operar tomando su valor -12 -2147483640 -2147483652 integer integer double
numrico como CERO.
12 1.2456 13.2456 integer double double
1.2456 12 13.2456 double integer double
1.2456 123.4567 124.7023 double double double
12 abc 12 integer string integer
1.2456 abc 1.2456 double string double
12 12abc 24 integer string integer
12 12.34567abc 24.34567 integer string double
1.2456 12.34567abc 13.59127 double string double
1.2456 12.3e2abc 1231.2456 double string double
abc 12abc 12 string string integer
abc 12.34567abc 12.34567 string string double
12abc 12.34567abc 24.34567 string string double

Anterior Indice Siguiente


Utilizando formularios

PHP dinmico
Que valor tiene register_globals en tu php.ini?
Cuando hablbamos de la configuracin de PHP, hacamos alusin a la directiva
Lo que hemos visto hasta el register_globals y decamos que tena dos opciones de configuracin: ON y OFF. Decamos
momento, solo nos ha servido para tambin que segn el valor que tuviera esa configuracin cambiara el modo de afrontar
escribir una serie de scripts PHP y diversos asuntos.
ver los resultados de su ejecucin,
pero an no hemos visto de qu Habamos optado por ponerla como: register_globals=ON, pero no est de ms el
forma se puede lograr que
comprobarlo.
interacten el cliente y el
servidor.
Busquemos el fichero php.ini que estar en el directorio Windows salvo que el
Veamos cmo hacerlo. directorio en que tienes instalado Windows se llame de otra manera abrmoslo y
comprobemos que es cierto que register_globals=ON. Si no fuera as, modificaramos
esa directiva y guardaramos los cambios.
Envo a travs del
navegador
Cuidado!
La forma ms simple de que un Antes de hacer una modificacin en php.ini en httpd.conf desactiva el servidor Apache.
cliente pueda enviar valores a un Cuando hayas acabado con los cambios vuelve a ponerlo en marcha (de lo contrario te
servidor es incluir esos valores en
aparecer el mensaje: no se puede encontrar el servidor) y ya arrancar atendiendo a la
la propia peticin, insertndolos
directamente en la barra de nueva configuracin. No te olvides nunca de hacerlo as! Te evitars un montn de
direcciones del navegador. sobresaltos.

Forma de envo
Tabla de multiplicar
Deber insertarse en la barra de
direcciones del navegador lo
siguiente: <?
/* Escribamos una instruccin, que imprima en pantalla
pagina.php?n1=v1&n2=v2 el valor de una variable ($a), una "x" que har funciones de aspa
en la presentacin, otra variable ($b), el signo igual
donde
y $a*$b que es el producto de ambas variables
pagina.php ser la direccin de la El simbolo de multiplicar es (*) */
pgina que contiene el script que print ($a." x ".$b." = ".$a*$b);
ha de procesar los valores # Aadamos una bobadilla, para animar... ;-)
transferidos. print ("<br> Ya eres mayorcit@.. Deberas saberte la tabla");
?>
? es un carcter obligatorio que
indica que detrs de l van a ser
insertados nombres de variables y ejemplo13.php
sus valores.

n1, n2, etctera representan los


nombres de las variables.
Ejecuta este ejemplo y observa lo que aparece. Slo x =0? y la otra lnea?

= es el separador de los nombres El resultado es lgico. No hemos asignado valores a las variables $a y $b y por eso no
de las variables y sus valores escribi su valor. Sin embargo, a la hora de multiplicar -recuerda que una variable vaca
respectivos. es interpretada como cero a la hora de hacer operaciones la interpret como cero y con
muy buen criterio nos respondi que cero por cero es cero.
v1, v2,... simbolizan el valor
asignado a cada una de las Escribamos ahora en la barra de direcciones del navegador la siguiente direccin:
variables. http://localhost/cursoPHP/ejemplo13.php?a=21&b=456, (tambin puedes pulsar en este
& es el smbolo que separa los enlace) y podremos comprobar que 21 x 456 = 9576 .
distintos bloques variable = valor.
Hagamos un nuevo experimento. Vayamos a php.ini y cambiemos la configuracin.
Los nombres de las variables Pongamos register_globals= OFF. No te olvides de apagar el servidor antes de hacer
nunca llevan el signo $. estos cambios!
Los valores de las variables sean Una vez hecho el cambio, pulsemos de nuevo en el enlace, y veremos que esta vez no
nmeros o cadenas nunca se ha recibido los valores de a y b y nos ha dado cero como resultado.
escriben entre comillas.
Lo intentaremos con este nuevo script manteniendo register_globals=OFF.
Se pueden incluir tantos nombre =
valor como se desee. La nica
restriccin es la longitud mxima <?
permitida por el mtodo GET (el
utilizado en este caso) que se sita /* Modifiquemos la instruccin anterior
en torno a los 2.000 caracteres. y utilicemos las variables predefinidas
$HTTP_GET_VARS['a'], $HTTP_GET_VARS['b']
Recepcin de datos en vez de $a y $b que utilizabamos en el ejemplo anterior */

Cuando es recibida por el servidor


# Pongamos un comentario de advertencia. Recuerda que <br>
la peticin de un documento con # sirve para insertar un salto de lnea en la salida
extensin .php en la que tras el print ("Este resultado es el que utiliza $HTTP_GET_VAR<br>");
signo ? se incluyen una o varias
parejas nombre = valor, los print ($HTTP_GET_VARS['a']." x ".$HTTP_GET_VARS['b']." = ".
nombres de las variables y sus $HTTP_GET_VARS['a']*$HTTP_GET_VARS
valores respectivos se incluyen, de ['b']);
forma automtica, en variables
predefinidas del tipo: /* Ahora trataremos de comprobar que tambin podemos
$HTTP_GET_VARS['n1']
utilizar la superglobal $_GET como $_GET['a'] y $_GET['b']
con iguales resultados que las anteriores */
$HTTP_GET_VARS['n2']

en las que n1, n2, ... coinciden # Un comentario para identificar el origen del resultado
exactamente con nombres
asignados a cada una de las
print("<br>El resultado siguiente ha sido generado usando $_GET <br>");
variables en esa transferencia.

Cada una de esas variables print ($_GET['a']." x ".$_GET['b']." = ".$_GET['a']*$_GET['b']);


contendr como valor aquel que
hubiera recibido a travs de la ?>
peticin.

Si la versin de PHP es superior a ejemplo14.php


la 4.1.0, esos mismos valores se
incluirn en variables
superglobales del tipo $_GET de
modo que en el supuesto de que Escribamos ahora en la barra de direcciones del navegador la siguiente direccin:
la versin lo soporte los valores http://localhost/cursoPHP/ejemplo14.php?a=21&b=456, (o pulsemos directamente en
de la peticin tambin (esta este enlace) y podremos comprobar que 21 x 456 an es igual 9576.
opcin no excluye la anterior)
estaran disponibles en:
Cuidado!
$_GET['n1']
Aqu, ms que nunca, conviene reiterar, una vez ms, los errores de sintaxis ms frecuentes:
$_GET['n2']

Segn el modo en que est Los nombres de variables son distintos si se cambian maysculas y minsculas. Pon
configurado el php.ini podra mucho cuidado en escribirlos correctamente.
caber una tercera posibilidad de Los nombres de las variables predefinidas, tales como $HTTP_GET_VARS, $_GET,
registro de esos valores. etctera van en maysculas.
No olvides poner punto y coma al final de cada lnea de instrucciones.
Si la directiva register_globals en
Presta atencin a la apertura/cierre de comillas y mucha ms atencin an si se trata
el fichero php.ini est
configurada con la opcin ON, los de comillas anidadas. En este caso procura usar (") para las exteriores y (') para las
valores transferidos desde el interiores.
navegador adems de ser
recogidos en las variables
anteriores son asignados a otras
variables del tipo: $n1, $n2, ... Cuidado!
cuyos nombres son el resultado de
anteponer el smbolo $ a los En modo local puedes establecer las configuraciones de php.ini a tu antojo y, adems, ests
nombres de las variables
utilizando una versin 4.3.11 de PHP que permite superglobales. Esta versin junto con
contenidas en la peticin.
la posibilidad de modificar php.ini te permite utilizar cualquiera de las opciones de
La eleccin a la hora de escribir los transferencia de variables.
scripts de uno u otro tipo de Pero, si pretendes publicar tus pginas utilizando un hosting ajeno debes cerciorarte de cual
variable debe hacerse teniendo en es su versin de PHP no todos tienen instaladas versiones superiores a 4.1.0 y conocer la
cuenta que: configuracin de sus php.ini.
Esta ltima sin duda la ms Ten en cuenta que all no vas a poder modificar las configuraciones y de no tener en cuenta
cmoda tiene el problema de que estos aspectos, puedes verte obligad@ a modificar tu cdigo fuente para adecuarlo a la
slo es vlida cuando configuracin de tu hosting.
register_globals=on y, adems, es
la ms insegura de todas.
Un formulario
La superglobal $_GET tiene una
sintaxis ms corta que su
alternativa y, adems, aade como <HTML>
ventaja su condicin de <HEAD>
superglobal, que permite </HEAD>
utilizarla en cualquier mbito sin <BODY>
necesidad de declararla
expresamente como global. Es la
opcin del futuro. Su nico <!-- Un formulario debe empezar siempre con una etiqueta de este tipo <form ...>
inconveniente es que puede no en la que ser obligatorio indicar con esta sintaxis action='nombre.extension'
estar disponible en hostings que nombre.extension debe contener el nombre (o la ruta completa en el caso de que
an mantienen versiones antiguas estuviera en un directorio o hosting distinto del que alberga el documento que
de PHP. contiene el formulario desde el que se realiza la peticin) Es opcional incluir method
que puede tener dos valores method='GET' method='POST', por defecto (cuando
Envo a travs de no se indica) el envio se realizar usando method='GET' Tambin es opcional -a los
formularios efectos de PHP- incluir name. Ese valor es til cuando se incluyen scripts del lado del
cliente del tipo JavaScript //--> <form name='mi_formulario' action='formu1.php'
method='post'> <!-- Pueden incluirse textos dentro del formulario --> Escribe tu
La interaccin clienteservidor que
nombre: <!-- Uno de los tipos de campos posibles es el tipo texto su sintaxis
acabamos de ver, resulta
incmoda en su uso y no
(hablamos de HTML) requiere la etiqueta <input type='text'> que indica el
demasiado esttica. contenido del texto esa etiqueta debe incluir obligatoriamente un name='nombre' el
nombre a usar sern caracteres alfabticos, sin tildes ni ees y sin espacios. Salvo
Hay una segunda opcin la de excepciones que comentaremos no puede usarse el mismo nombre para dos campos
uso ms frecuente que es la distintos el value='' puede no contener nada entre las comillas tal como ocurre aqu o
utilizacin de formularios. contener el texto que por defecto queremos que aparezca en ese campo al cargar el
formulario. el size=xx es opcional. Su utilidad es la de ajustar el tamao de la
Los formularios no son ele- mentos
ventana al nmero de caracteres que se indiquen //--> <input type='text'
propios de PHP actan del lado
del cliente y su estudio es ms name='nombre' value='' size=15><br> Escribe tu clave: <!-- <input
propio del mbito de HTML que de type='password'> solo se diferencia del anterior en que en el momento de
PHP. rellenarlo se sustituyen los carecteres visualizados (no el contenido) por asteriscos //--
> <input type='password' name='clave' value=''><br> Elige tu color de coche
En cualquier caso por si te fuera favorito:<br> <!-- Los <input type='radio'> permite optar entre varios valores
necesario aqu a la derecha tienes posibles. Habr que repetirlos tantas veces como opciones queramos habilitar. Todos
un formulario, en el que se los input correspondientes a la misma opcin deben tener el mismo nombre
comenta la sintaxis de sus
(name) value='loquesea' deber tener un valor distinto en cada uno de ellos. Ese
elementos ms comunes.
valor (loquesea) ser transferido a travs del formulario Si queremos que una opcin
aparezca marcada (por defecto) al cargar el formulario, deberemos incluir en su
Interpretacin de los etiqueta la palabra checked los contenidos de value no se visualizan en el navegador
datos recibidos a travs por lo que conviene incluir una descripcin de los valores despus de cerrar la etiqueta
de formularios de cada input Al enviar el formulario solo se transmite el value correspondiente a la
opcin seleccionada //--> <input type='radio' name='color' value='Rojo'>Rojo</br>
Igual que ocurra en el caso <input type='radio' checked name='color' value='Verde'>Verde</br> <input
anterior, los datos enviados a type='radio' name='color' value='Azul'>Azul</br> Elige los extras:<br> <!-- Cada
travs de un formulario son uno de los <input type='checkbox'> requiere un nombre distinto (name) y un
recogidos en diferentes tipos de valor (value) permite optar entre varios Esos valor (loquesea) serm transferido a
variables predefinidas, pero ahora travs del formulario cuando la casilla de verificacin est marcada Si queremos que
se aade una nueva particularidad. una casilla aparezca marcada (por defecto) al cargar el formulario, deberemos incluir
en su etiqueta la palabra checked los contenidos de value tampoco aqu se visualizan
Existe la posibilidad de dos
en el navegador por lo que conviene incluir una descripcin de los valores despus de
mtodos (method) de envo:
cerrar la etiqueta de cada input Al enviar el formulario solo se transmite los value
'GET' y 'POST'. En el caso anterior
decamos que se utilizaba el
correspondiente a la opcion marcadas //--> <input type='checkbox'
mtodo GET, pero en el caso de name="acondicionado" value="Aire"> Aire acondicionado<br> <input
los formularios son posibles ambos
type='checkbox' checked name="tapiceria" value="Tapicieria"> Tapiceria en
mtodos. Conviene tenerlo en
cuenta. piel<br> <input type='checkbox' name="llantas" value="aluminio"> Llantas de
aluminio<br> Cual es el precio mximo<br> que estaras dispuesto a pagar? <!-- La
Mtodo GET etiqueta <input type='select'> requiere un nombre y requiere tambin una
etiqueta de cierre </select> Entre ambas -apertura y cierre- deben incluirse las
No se diferencia en nada del diferentes opciones entre las de etiquetas <option>valor<option> Al enviar el
descrito para el supuesto anterior. formulario se transmite lo contenido despus de opcin en la opcin seleccionada si
Utiliza las mismas variables
dentro de una etiqueta option escribimos selected ser esa la que aparezca por
predefinidas, las utiliza con
idntica sintaxis y se comporta de
defecto al cargarse el formulario//--> <select name="precio"> <Option>Menos de
igual forma en lo relativo a las 6.000 euros</option> <Option>6.001 - 8.000 euros</option> <Option selected
opciones de register_globals. >8.001 - 10.000 euros</option> <Option>10.001 - 12.000 euros</option>
<Option>12.001 - 14.000 euros</option> <Option>Ms de 14.000 euros</option>
Los nombres de las variables son </select>
en este caso, los incluidos como <!-- Las reas de texto deben tener una etiqueta de apertura <textarea
name en cada una de las name='checkbox'> seguida de una etiqueta de cierre </textarea> Dentro de la
etiquetas del formulario. etiqueta de apertura puede incluirse rows=xx (indicar el nmero de filas) cols=yy
Respecto a los valores de cada (indicar el ancho expresado en nmero de caracteres) y opcionalmente un value='lo
variable, stos seran los recogidos que sea...' que puede contener el texto que -por defecto- pretendemos que aparezca
del formulario. En los casos de en ese espacio en el momento de cargar rl formulario //--> <br> Escribe aqu
campos tipo: text, password y cualquier otro comentario:<br> <textarea rows=5 cols=50 name='texto'></
textarea seran los valores textarea><br> <!-- El <input type='hidden'> permite insertar en un formulario
introducidos por el usuario en cada una valor oculto que no requiere ser cumplimentado por el usuario y que no aparece
uno de esos campos. visible en el documento requiere un name y un value //--> <input type="hidden"
name='oculto' value='Esto ira oculto'><br> <!-- El <input type='submit'> es el
En el caso de los campos tipo radio
encargado de ejecutar la action incluida en la etiqueta de apertura del formulario que
en el que varias opciones pueden
tener el mismo nombre recogera en este caso sera la llamada a la pgina que se indica en la action El texto que
el valor indicado en la casilla incluyamos en value='enviar...' ser el que se visualice en el propio botn de envio //--
marcada; mientras que si se trata > <input type="submit" value="enviar"> <!-- El <input type='reset'> permite
de campos tipo checkbox se borrar todos los contenidos del formulario y reestablecer los valores por defecto de
transferiran nicamente las cada campo //--> <input type="reset" value="borrar"> <!-- La etiqueta </form> es
variables y los valores que la etiqueta de cierre del formulario //--> </FORM> </BODY> </HTML>
corresponden a las casillas
marcadas.

Si se tratara de un campo tipo No incluiremos la opcin Ver ejemplo hasta que hayamos elaborado los documentos
hidden se transferira el valor formuxx.php incluidos en la action de este formulario.
contenido en su etiqueta y, por
ltimo, en el caso del select sera Scripts para recoger los datos del formulario anterior
transferido como valor de la
variable la parte del formulario Insertaremos ahora los diferentes tipos scripts utilizables, especificando las condiciones
contenida entre las etiquetas de utilizacin de cada uno de ellos.
<option></option> de la opcin
seleccionada. Los hemos llamado formu1.php, formu2.php, etctera.
Mtodo POST Debajo del cdigo fuente de cada uno de ellos, hemos incluido dos enlaces. En el
En el caso de que el mtodo de
primero de ellos se utiliza el formulario que vemos aqu arriba modificando nicamente el
envo sea POST hay una diferencia valor de action para adecuarlo al nombre de cada script.
a tener en cuenta en cuanto a las
variables que recogen la En el segundo de los enlaces utilizaremos un formulario en el que, adems de las
informacin. Ahora ser: modificaciones anteriores, se utilice GET como mtodo.

$HTTP_POST_VARS['n1'] De esta forma, tendrs la oportunidad de comprobar el funcionamiento o no


funcionamiento anunciado en cada uno de los supuestos.
quien haga la funcin atribuida en
el mtodo anterior a: Sera buena idea que experimentaras con ellos tanto bajo register_globals=ON como
cuando est en modo OFF.
$HTTP_GET_VARS['n1']

y ocurrir algo similar con las Este primero funcionar tanto cuando el mtodo sea POST como cuando sea GET.
superglobales, que pasaran a ser Requiere que el php.ini contenga la opcin register_globals=ON
del tipo:
<?
$_POST['n1']
echo "El method que ha usado fu: ",$REQUEST_METHOD,"<br>";
en sustitucin del $_GET['n1'] echo $nombre,"<br>";
usado en el caso del mtodo GET echo $clave,"<br>";
echo $color,"<br>";
Si register_globals est en On el echo $acondicionado,"<br>";
comportamiento de las variables echo $tapiceria,"<br>";
directas es idntico con ambos echo $llantas,"<br>";
mtodos.
echo $precio,"<br>";
echo $texto,"<br>";
Identificacin del mtodo echo $oculto,"<br>";
de envo ?>

PHP recoge en una variable el Con action = POST Con action = GET
mtodo utilizado para enviar los
datos desde un formulario. Se
trata de la variable
REQUEST_METHOD. Este otro requiere que el mtodo especificado en el formulario de envo sea POST.
El valor de register_globals no afectara a su funcionalidad.
Puede ser invocada como una
variable directa (en caso de que
<?
register globals est en on) o a
travs de una de las variables de
echo "El method usado fu: ",$HTTP_SERVER_VARS[REQUEST_METHOD],"<br>";
servidor. echo $HTTP_POST_VARS['nombre'],"<br>";
echo $HTTP_POST_VARS['clave'],"<br>";
En el primer caso la variable se echo $HTTP_POST_VARS['color'],"<br>";
llamara: echo $HTTP_POST_VARS['acondicionado'],"<br>";
echo $HTTP_POST_VARS['tapiceria'],"<br>";
$REQUEST_METHOD
echo $HTTP_POST_VARS['llantas'],"<br>";
y en el segundo: echo $HTTP_POST_VARS['precio'],"<br>";
echo $HTTP_POST_VARS['texto'],"<br>";
$HTTP_SERVER_VARS echo $HTTP_POST_VARS['oculto'],"<br>";
[REQUEST_METHOD] ?>
Cuando PHP permita el uso de
variables superglobales se puede Con action = POST Con action = GET
utilizar:

$_SERVER[REQUEST_METHOD]
Para utilizar eficazmente este script es necesario que el mtodo especificado en el
Una advertencia importante. formulario de envo sea GET.
El valor de register_globals no afectara a su funcionalidad.
Observa que en este caso no se
incluyen comillas dentro del
corchete como ocurra con todos <?
los nombres de variable echo "El method usado fu: ",$HTTP_SERVER_VARS[REQUEST_METHOD],"<br>";
anteriores. echo $HTTP_GET_VARS['nombre'],"<br>";
echo $HTTP_GET_VARS['clave'],"<br>";
echo $HTTP_GET_VARS['color'],"<br>";
Diferencias ente los
echo $HTTP_GET_VARS['acondicionado'],"<br>";
mtodos GET y POST
echo $HTTP_GET_VARS['tapiceria'],"<br>";
echo $HTTP_GET_VARS['llantas'],"<br>";
Las diferencias entre uno y otro echo $HTTP_GET_VARS['precio'],"<br>";
mtodo son las siguientes: echo $HTTP_GET_VARS['texto'],"<br>";
Mtodo GET
echo $HTTP_GET_VARS['oculto'],"<br>";
?>
Las particularidades de este
mtodo son las siguientes:
Con action = POST Con action = GET
Al ser enviado el formulario se
carga en el navegador la direccin
especificada como action, se le Este otro requiere que el mtodo especificado en el formulario de envo sea POST y
aade un ? y a continuacin se que la versin de PHP soporte variables superglobales.
incluyen los datos del formulario. El valor de register_globals no afectara a su funcionalidad.
Todos los datos de la peticin van
a ser visibles desde la barra de
direcciones del navegador. <?
echo "El method usado fu: ",$_SERVER[REQUEST_METHOD],"<br>";
nicamente son aceptados los echo $_POST['nombre'],"<br>";
caracteres ASCII. echo $_POST['clave'],"<br>";
Tiene una limitacin en el echo $_POST['color'],"<br>";
tamao mximo de la cadena que echo $_POST['acondicionado'],"<br>";
contiene los datos a transferir. En echo $_POST['tapiceria'],"<br>";
IE esa limitacin es de 2.083 echo $_POST['llantas'],"<br>";
caracteres. echo $_POST['precio'],"<br>";
echo $_POST['texto'],"<br>";
Mtodo POST echo $_POST['oculto'],"<br>";
No tiene las limitaciones indicadas
?>
para el caso de GET en lo relativo
a visibilidad ni en cuanto a
Con action = POST Con action = GET
aceptacin de caracteres no ASCII.

Este mtodo de transferencia de


datos es el ms habitual cuando se En este supuesto sera necesario que el mtodo especificado en el formulario de envo
utilizan formularios. sea GET y que la versin de PHP instalada en el servidor que lo aloja soporte variables
superglobales.
Tipos de contenidos de los El valor de register_globals no afectara a su funcionalidad.
formularios
<?
Respecto a los formularios, vamos echo "El method que ha usado fu: ",$_SERVER[REQUEST_METHOD],"<br>";
a contemplar un ltimo aspecto: la echo $_GET['nombre'],"<br>";
forma de encriptar de los datos en echo $_GET['clave'],"<br>";
el momento de la transmisin echo $_GET['color'],"<br>";
(ENCTYPE). echo $_GET['acondicionado'],"<br>";
echo $_GET['tapiceria'],"<br>";
Puede especificarse dentro de la echo $_GET['llantas'],"<br>";
etiqueta<form> utilizando la echo $_GET['precio'],"<br>";
sintaxis: enctype='valor'.
echo $_GET['texto'],"<br>";
En el caso de que no se echo $_GET['oculto'],"<br>";
especifique, tomar el valor ?>
application / x-www-form-
urlencoded, sea GET o POST el
mtodo que se utilice. Con action = POST Con action = GET

El mtodo POST admite


multipart/form-data como una La variable $_REQUEST
opcin alternativa a la anterior.
Suele utilizarse cuando se trata de
enviar grandes cantidades de PHP tambin dispone a partir de su versin 4.1.0 de la variable $_REQUEST (de
datos, formularios en los que se tipo superglobal) que ana las funcionalidades de $_GET y $_POST y que recoge en
adjuntan ficheros, datos no ASCII variables del tipo $_REQUEST['nombre'] tanto los valores transferidos mediante el
o contenidos binarios. mtodo GET como mediante POST

Las diferencias bsicas entre $_REQUEST, a diferencia de $_GET y $_POST, no dispone de equivalentes en
ambos modos de encriptacin son versiones anteriores. Ello quiere decir, no existe una variable (no superglobal) del tipo
las siguientes: $HTTP_REQUEST_VARS con $HTTP_GET_VARS o con $HTTP_POST_VARS.
En el tipo application/x-www-
En este ejemplo hemos incluido dos scripts que solo solo se diferencian en el method
form-urlencoded los nombres de
control y los valores se
especificado en el formulario.
transforman en secuencias de
escape, es decir, convirtiendo cada
Al ejecutarlos podremos comprobar que, independientemente del mtodo usado,
byte en una cadena %HH, donde $_REQUEST recoge los valores transferidos desde el formulario.
HH es la notacin hexadecimal del
valor del byte. <?
/* Al ejecutar por primera vez el script la variable pepe ser nula
Adems, los espacios son
convertidos en signos +, los
ya que no se ha transferido an el formulario. Al pulsar sucesivamente
saltos de lnea se representan en el botn Enviar iremos visualizando los valores que se vayan
como %0D%0A, el nombre y el
transfiriendo */
valor se separan con el signo = y print "He recibido la variable pepe con valor: ".$_REQUEST['pepe'];
los diferentes bloques nombre/
/* al enviar el formulario se recargar este mismo documento
valor, se separan con el carcter &.
ya que hemos puesto action="" */
En cuanto a la encriptacin tipo ?>
multipart/form-data, sigue las <form name="prueba" method="post" action="">
reglas de las transferencias MIME, <input type="text" name="pepe" value=''>
que comentaremos ms adelante <input type="submit" value="enviar">
cuando tratemos el tema del
correo electrnico.

Cuidado!
Con action = POST Con action = GET
Cuando se incluye una
cadena vaca ("") como valor
de action en un formulario
se recargar el mismo Ejercicio n 9
documento como respuesta
Crea dos documentos llamados respectivamente formulario1.php y visor1.php. En el
al envo del formulario.
primero de ellos incluye un formulario que permita recoger datos personales y acadmicos
de tus alumnos, utilizando todos los tipos de campos de formulario que conozcas. Los datos
La seguridad en los envos insertados en ese formulario debern ser visualizados despus de su envo con cualquier
de datos configuracin de register_globals y con cualquier versin PHP a travs del documento
visor1.php. Utiliza los recursos estticos fondos, colores, tipografa, etctera que estimes
El tema de la seguridad es una
oportunos para una correcta presentacin
preocupacin constante entre los
usuarios de Internet.

Cuando utilizamos las tcnicas que


venimos comentando en esta Ejercicio n 10
pgina nos referimos siempre al
caso de servidores remotos Con criterios similares en cuanto a esttica y funcionalidad a los del ejercicio anterior, te
corremos dos tipos de riesgo de proponemos que crees dos nuevos documentos con nombres formulario2.php y visor2.
seguridad que no estara de ms php. En este caso el formulario deber poder recoger el nombre y apellidos de un alumno
tener en cuenta. hipottico al que debemos formularle dos preguntas. La primera de ellas con cuatro posibles
El riesgo de que la informacin sea respuestas entre las que deba elegir como vlida una de ellas. La segunda, tambin con
interceptada durante el proceso de cuatro respuestas, deber permitir marcar las respuestas correctas que pueden ser: todas,
transmisin desde el cliente hasta ninguna, o algunas de ellas.
el servidor lo compartimos con El alumno debera poder insertar sus datos personales en el formulario y elegir las
todos los dems usuarios de la respuestas a las preguntas formuladas. Al pulsar en el botn de envo, los datos del alumno
Red, pero hay otro el riesgo de y las respuestas elegidas deben visualizarse a travs del documento visor2.php.
daos en los contenidos de nuestro
espacio de servidor que es
exclusivamente nuestro.

La transparencia del mtodo GET Anterior Indice Siguiente


es tal, que incluso muestra en el
momento del envio todos los
datos en la barra de direcciones
del navegador. Eso permite que
cualquier usuario pueda conocer a
simple vista la ruta completa hasta
el script, as como los nombres y
valores de las variables.

Cuando se usa el mtodo POST los


formularios son un poco ms
discretos, pero igual de
transparentes. El cdigo de
cualquier formulario estar
accesible slo con ir a la opcin
Ver cdigo fuente y all estarn de
nuevo todos los datos: nombre del
script, nombres de las variables,
etctera, con lo que, cualquier
usuario y desde cualquier sitio,
puede acceder a ese script.

No hara falta ni usar nuestro


formulario. Bastara guardar una
copia del mismo en el ordenador
del visitante y despus haciendo
ligersimos retoques se podra
acceder a nuestro script sin
necesidad de utilizar el formulario
alojado en nuestro servidor.

Si pensamos que uno de nuestros


scripts puede estar diseado con el
fin de modificar algunos de los
contenidos de nuestro espacio
borrar datos, por ejemplo
seguramente sera cuestin de
empezar a preocuparnos, y mucho
ms si en nuestro servidor
tenemos datos importantes.

Existen formas de evitar, o al


menos reducir, este tipo de
riesgos. Restringir a usuarios
autorizados el uso de algunos
subdirectorios es una de ellas,
almacenar datos importantes fuera
del directorio root del servidor es
otra y el uso de algunas de las
variables predefinidas como
elementos de proteccin puede ser
una tercera.

Hacemos este comentario a ttulo


meramente informativo. Por el
momento nos basta con manejar
los formularios, pero queremos
que tengas presente la existencia
de ese tipo de riesgos. Ms
adelante, ve- remos la manera de
tratar de evitarlos.

Ejercicio n 8

Crea dos documentos


llamados respectivamente
color1.php y color2.php.
En el primero de ellos incluye
un formulario en el que -
mediante un men de
opciones se pueda elegir
uno de entre cinco colores
(especifica como value el
cdigo hexadecimal de cada
uno de ellos).
Al enviar los datos, deber
cargarse la pgina color2.
php con el color de fondo
correspondiente a la opcin
seleccionada en el
formulario.
Operaciones aritmticas

Operaciones aritmticas
Operaciones aritmticas

En pginas anteriores hemos <?


podido ver que PHP permite utilizar # definamos dos variables numricas asignandoles valores
un tipo de variables las $a=23; $b=34;
numricas cuyos valores puedan /* hagamos una suma y escribamos directamente los resultados
ser operados de la misma forma utilizando las instrucciones print y echo
que se hace con los nmeros en la con todas sus posibles opciones de sintaxis */
vida cotidiana. print("La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b)."<br>");
print "La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b) ."<BR>";
Los resultados de las operaciones
print ("La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b) ."<BR>");
pueden utilizarse de forma directa
o ser recogidos en una nueva echo "La suma de $a + $b es: " . $a . "+" . $b . "=" . ($a+$b) ."<BR>";
variable. Aqu a la derecha tienes echo "La suma de $a + $b es: " , $a , "+" , $b . "=" , ($a+$b) ."<BR>";
un ejemplo de ambas opciones. echo "La suma de $a + $b es: " , $a , "+" , $b , "=" , $a+$b ,"<BR>";
# guardemos ahora el resultado de esa operacin en una nueva variable
Si asignamos a una nueva variable $c=$a+$b;
el resultado de una operacin el /*ahora presentemos el resultado utilizando esa nueva variable
valor contenido en ella no se adviertiendo el la salida */
modifica, aunque cambien los de print ("Resultados recogidos en una nueva variable<br>");
las variables que intervinieron su
print "La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>";
creacin.
print ("La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>");
Sintaxis de print y echo echo "La suma de $a + $b es: " . $a . "+" . $b . "=" . $c ."<BR>";
echo "La suma de $a + $b es: " , $a , "+" , $b . "=" , $c ."<BR>";
Si queremos encadenar en una echo "La suma de $a + $b es: " , $a , "+" , $b , "=" , $c ,"<BR>";
sola instruccin echo print el /* modifiquemos ahora los valores de $a y $b comprobando que el cambio
resultado de una operacin junto no modifica lo contenido en la variable $c */
con otras variables (o cadenas) es
$a=513; $b=648;
imprescindible poner entre
print ("<br> C sigue valiendo: " . $c ."<br>");
parntesis las instrucciones de la
operacin. # experimentemos con los parntesis en un supuesto de operaciones
combinada
Esta norma, solo tiene dos # tratemos de sumar la variable $a con la variable $b
excepciones: en caso de que el # y multiplicar el resultado por $c.
print solo contenga la propia # Si escribimos print($a+$b*$c) nos har la multiplicacin antes que la
operacin o cuando utilicemos suma
echo y el separador sea una print "<br>No he puesto parntesis y el resultado es: ".($a+$b*$c);
coma.
# Si escribimos print(($a+$b)*$c) nos har la suma y luego multiplicar
print "<br>He puesto parntesis y el resultado es: ".(($a+$b)*$c);
Operadores aritmticos ?>

Suma
ejemplo16.php
$a + $b
Operaciones aritmticas
Diferencia
Operacin Sintaxis A B Resultado
$a - $b
Suma $a+$b 12 -7.3 4.7
Producto Diferencia $a-$b 12 -7.3 19.3
$a * $b Producto $a*$b 12 -7.3 -87.6
Cociente Cociente $a/$b 12 -7.3 -1.64383561644
Cociente entero (int)($a/$b) 12 -7.3 -1
$a / $b
Resto de la divisin $a%$b 12 5 2
Cociente entero
Potencias ab pow($a,$b) 12 5 248832
(int)($a / $b)
Potencias ab pow($a,$b) -7.3 -3 -0.00257058174836
Resto de la divisin Raz cuadrada Sqrt($a) 12 3.46410161514
$a % $b Raz cuadrada Sqrt($a) -7.3 -1.#IND
Raz cuadrada Raz ensima pow($a,(1/$b) 12 3; 2.28942848511

Sqrt($a)
Redondeos
Potencia ab tipo Sintaxis A Resultado

pow($a,$b) Parte entera (int)$a 12 12


Parte entera (int)$a -7.3 -7
Raz (de ndice b) de a
Parte entera (int)$a -13.8546 -13
pow($a,1/$b)
Parte entera (int)$a -24.5 -24
Redondeo de resultados Parte entera (int)$a 13.8546 13
Parte entera (int)$a 24.5 24
PHP tiene tres opciones de Redondeo por defecto floor($a) 12 12
redondeo:
Redondeo por defecto floor($a) -7.3 -8
Redondeo por defecto
Redondeo por defecto floor($a) -13.8546 -14
floor($z) Redondeo por defecto floor($a) -24.5 -25
Redondeo por exceso Redondeo por defecto floor($a) 13.8546 13
ceil($z) Redondeo por defecto floor($a) 24.5 24
Redondeo por exceso ceil($a) 12 12
Redondeo tradicional
Redondeo por exceso ceil($a) -7.3 -7
round($z)
Redondeo por exceso ceil($a) -13.8546 -13
Al realizar una operacin cuyo
resultado no es un nmero real Redondeo por exceso ceil($a) -24.5 -24
PHP devuelve la cadena -1.#IND. Redondeo por exceso ceil($a) 13.8546 14
Redondeo por exceso ceil($a) 24.5 25
Orden de operacin Redondeo round($a) 12 12
Redondeo round($a) -7.3 -7
Cuando una misma instruccin
contiene una secuencia con varias Redondeo round($a) -13.8546 -14
operaciones el orden de ejecucin
de las mismas sigue los mismos Redondeo round($a) -24.5 -25
criterios que las matemticas. No Redondeo round($a) 13.8546 14
se realiza una ejecucin secuencial
sino que se respeta el orden de Redondeo round($a) 24.5 25
prioridad matemtico. Es decir, las
potencias y races tienen prioridad
frente a los productos y los Cuidado!
cocientes, y estos, son prioritarios
respecto a la suma y las Cuando realices operaciones combinadas, no olvides establecer mediante parntesis las
diferencias. prioridades que sean necesarias. No temas abusar de ellos! Te evitarn muchos problemas.

Igual que en matemticas se


pueden utilizar los parntesis para
modificar el orden de ejecucin de
las operaciones, e igual que all Ejercicio n 11
PHP tambin permite encerrar
parntesis dentro de parntesis. Crea un documento con el nombre ejercicio11.php e incluye en l un formulario que permita
introducir valores numricos en dos campos de texto. Al enviarlo (puedes usar el mismo
documento para el formulario y para la visualizacin de resultados) debern aparecer los
resultados de: sumar, restar, multiplicar y dividir ambos nmeros. Deber aparecer tambin el
resultado (redondeado por exceso) de elevar la suma de ambos nmeros a la cuarta potencia
y la raz quinta del cubo de la suma de ambos nmeros.

Anterior Indice Siguiente


Logaritmos y trigonometra

Logartmos y
trigonometra
Logaritmos y trigonometra

La sintaxis para el uso de las En en cuadro siguiente se resumen las operaciones aritmticas en PHP y su sintaxis
funciones logartmicas y
trigonomtricas es esta: Operaciones con logaritmos
Operacin Sintaxis A B Resultado
Logaritmo neperiano
Logaritmo neperiano log($a) 12 2.48490664979
log($a)
Logaritmo neperiano log($a) -7.3 -1.#IND
Logaritmo decimal
Logaritmo decimal Log10($a) 12 1.07918124605
Log10($a) Logaritmo decimal Log10($a) -7.3 -1.#IND
ea exponencial ea Exp($a) 12 162754.791419

Exp($a) exponencial ea Exp($a) -7.3 0.000675538775194


exponencial 10a pow(10,$a) 12 1E+012
En cuanto a las funciones
trigonomtricas debe tenerse en exponencial 10a pow(10,$a) -7.3 5.01187233627E-008
cuenta que tanto en las directas
como en las inversas los valores
de los angulos se expresan en Funciones trigonomtricas
radianes. Operacin Sintaxis A B Resultado

El nmero Seno de A (radianes) Sin($a) 12 -0.536572918

La funcion pi() devuelve el valor Seno de PI (radianes) Sin(pi()) pi() 1.22460635382E-016


del nmero Coseno de A (radianes) Cos($a) 12 0.843853958732
Seno de a Coseno de PI (radianes) Cos(pi()) pi() -1
Sin($a)
Tangente de A (radianes) Tan($a) 12 0.843853958732
Coseno de a
Cos($a) Tangente de PI (radianes) Tan(pi()) pi() -1.22460635382E-016
Tangente de a
Tangente de PI/2 (radianes) Tan(pi()) pi()/2 1.63317787284E+016
Tan($a)
Convierte grados en radianes Pasa grados a radianes deg2rad($a) 45 0.785398163397
deg2rad($a)

Arco cuyo Seno es a Funciones trigonomtricas inversas


Asin($a) Operacin Sintaxis A B Resultado
Arco cuyo Coseno es a
Acos($a) Arco seno de A (en radianes) Asin($a) 0.8 0.927295218002
Arco cuya Tangente es a
Arco seno de A (en radianes) Asin($a) 12 -1.#IND
Atan($a)
Convierte radianes en grados Arco coseno de A (en radianes) Acos($a) 0.8 0.643501108793
sexagesimales
rad2deg($a)
Arco coseno de A (en radianes) Acos($a) 12 -1.#IND
Arco tangente de A (en radianes) Atan($a) 0.8 0.674740942224
Arco tangente de A (en radianes) Atan($a) 12 1.48765509491
Pasa radianes a grados rad2deg($a) pi()/4 45

Anterior Indice Siguiente


Cambios de base y formatos

Formatos de las variables


numricas
Formas de asignar valores a la variables

Para asignar valores numricos a Cuando se asignan valores numricos a una variable PHP cabe la posibilidad de hacerlo
una variable, en PHP, puede en distintas bases. Estos son algunos ejemplos.
utilizarse uno de los siguientes
sistemas de numeracin: Asignacin de valores en distintas bases
Los nmeros enteros pueden Base Sintaxis Valor decimal Aplicable a
escribirse en una cualquiera de Base Decimal $a=17 17 Nmeros enteros
estas bases:
Base Octal $a=017 15 Nmeros enteros
Base decimal
Base Hexadecimal $a=0x17 23 Nmeros enteros
$a=nmero Base Hexadecimal $a=0x1A3B 6715 Nmeros enteros
No se pueden insertar ceros a la
izquierda cuando se escriben Notacin decimal $a=123000; 123000 Coma flotante
nmeros en base decimal. Base Decimal $a=0.174 0.174 Coma flotante
Base octal Notacin cientfica $a=1.23e5; 123000 Coma flotante

$a=0nmero octal Notacin cientfica $a=23.4e-2; 0.234 Coma flotante


Basta poner un CERO delante del
nmero para que sea interpretado
como escrito en base OCTAL.
Obviamente, slo admite los Cambios de base
dgitos de 0 a 7.

Base hexadecimal PHP dispone de funciones que permiten obtener una cadena de caracteres con la
expresin, en una nueva base, de un nmero escrito en otra base cualquiera.
$a=0xnmero hexadecimal
Si se escribe CERO EQUIS (0x)
Asignacin de valores en distintas bases
delante del nmero, PHP lo
interpretar como expresado en Valor de la variable Base Nueva base Sintaxis Expresin
hexadecimal. En este caso, $a=1234 10 8 decoct($a) 2322
admitir como dgitos de 0 a 9 y
de A a F. $a=1234 10 16 dechex($a) 4d2

Un nmero de coma flotante $a=1234 10 2 decbin($a) 10011010010


puede escribirse de cualquiera de $a=1234 8 10 octdec($a) 668
estas formas:
$a=1234 16 10 hexdec($a) 4660
Notacin decimal.
$a=1010011 2 10 bindec($a) 83
$a=nmero $a=1234 7 14 base_convert($a,7,14) 254
Se pueden utilizar un cero a la
izquierda del punto decimal. $a=1234 5 18 base_convert($a,5,18) ae
$a=1234 18 5 base_convert($a,18,5) 202123
Notacin cientfica

$a=nmero e exponente
Se puede utilizar un cero a la
izquierda del punto decimal Formato de presentacin de nmeros
Ejemplo: $a=1.2e5 asigna a $a el
valor: 1.2 x 105 En PHP es posible establecer el formato de la presentacin de los valores numricos
utilizando alguna de estas funciones.
Otro ej: $a=1.2e-5 asigna a $a el number_format (nmero)
valor: 1.2 x 10-5 Presenta la parte entera del nmero (sin decimales) y utiliza como separador de miles
una coma (,).
Cambios de base number_format (nmero , nmero de cifras decimales)
Presenta el nmero de cifras decimales que se indiquen y utiliza como separador
decimal un punto (.) y el separador de miles es una coma (,).
PHP permite hacer todo tipo de
number_format (nmero , nm decimales , "sep. decimal" , "sep. miles")
cambios de base. Para evitar ser
Permite establecer el nmero de cifras decimales de la presentacin as como el
reiterativos, observa los ejemplos.
All tienes las diferentes funciones carcter que se establezca como separador de decimales y como separadores de miles.
mediante las que se puede realizar Cuidado!. No te olvides de escribir los caracteres de separacin entre comillas.
ese proceso. Aqu tienes algunos ejemplos.

Presentaciones numricas Formatos de presentacin de nmero


Valor N de Sep. Sep.
Sintaxis Resultado
inicial decimales dec. miles
La presentacin de los valores
numricos permite una gran $a=1234567.234 0 , number_format($a) 1,234,567
variedad de formatos.
$a=1234567.234 2 . , number_format($a,2) 1,234,567.23
El nmero de cifras decimales, los $a=1234567.234 1 , . number_format($a ,2 , "," ,".") 1.234.567,2
separadores de decimales y los
separadores de mil pueden $a=1234567.234 1 ' esp number_format($a ,2 , " ' " ," ") 1 234 567'2
configurarse a voluntad.

Los ejemplos de aplicacin y la


sintaxis son los que tienes en la Ejercicio n 12
parte derecha de esta pgina.
Modifica el ejercicio11.php de forma que los resultados obtenidos al realizar los clculos
aparezcan con un espacio como separador de miles, un punto como separador de
decimales y cuatro cifras decimales.

Anterior Indice Siguiente


Nmeros aleatorios

El origen de la semilla
Nmeros aleatorios

El valor Unix Epoch PHP dispone de dos funciones capaces de generar nmeros aleatorios. Se trata de la
funcin rand() y de la funcin mejorada mt_rand().
El conocido como tiempo UNIX o
tambin Unix Epoch- es un sistema El valor mnimo del intervalo que contiene los nmeros aleatorios que pueden ser
referencia de tiempo cuya unidad generados es CERO en ambos casos y los valores mximos de cada opcin pueden
son los segundos y que tiene su determinarse mediante las funciones getrandmax(), para el primer generador, y
valor cero a las 0:00:00 horas mt_getrandmax(), para el segundo.
(GMT) del da uno de enero de
1970. Veamos cuales son esos valores en cada uno de los casos.
La funcion time()
Valores mximos de los generadores de nmeros aleatorios
La funcin time() devuelve una Generador rand() Generador mt_rand()
cadena con el nmero de
segundos transcurridos desde el Sintaxis Valor mximo Sintaxis Valor mximo
comienzo de la Unix Epoch. echo getrandmax() 32767 echo mt_getrandmax() 2147483647
Que cuantos son? Pues mira,
hasta este mismo instante han Segn las libreras que est usando PHP, puede ocurrir que los valores mximos con
transcurrido: ambos generadores sean iguales. No es ese nuestro caso, como puedes comprobar.

1 150 916 528 segundos

desde el comienzo del tiempo La forma ms simple


UNIX.

La funcion microtime() La forma ms simple -y ms desaconsejable- de generacin de un nmero aleatorio es


esta:
Usando la funcin microtime() se
obtiene una cadena a la que,
adems del nmero de segundos Generacin de un nmero aleatorio
transcurridos desde el comienzo de Generador rand() Generador mt_rand()
la Unix Epoch, se aade al
Sintaxis N aleatorio Sintaxis N aleatorio
comienzo de ella y separado por
un espacio la parte decimal de echo rand() 30287 echo mt_rand() 1846261004
ese tiempo expresada en
microsegundos.

Este es el valor de la cadena


devuelta por microtime() en este Una semilla que mejora la aleatoriedad
instante:
Si antes de escribir la funcin rand() en un caso, o mt_rand() en el otro escribimos:
0.17358200 1150916528

donde, como vers, aparece la srand((double)microtime()*1000000), en el primer caso y/o


fraccin decimal del tiempo Unix
Epoch delante de su valor entero. mt_srand((double)microtime()*1000000), en el segundo

(double)microtime() estaremos introduciendo una semilla (al margen comentamos la forma en que se genera)
que mejora sustancialmente la aleatoriedad del los nmeros obtenidos.
Dado que con microtime()
obtenemos una cadena, es posible Aqu tenemos un ejemplo:
convertirla en nmero de coma
flotante anteponiendo a esa
Generacin de un nmero aleatorio con semilla
funcin (double).
Generador rand()
Una vez cambiado el tipo de Sintaxis N aleatorio
variable el valor devuelto por
microtime se convierte en: srand((double)microtime()*1000000);
335
echo rand()
0.174266 Generador mt_rand()

que como puedes observar es un Sintaxis N aleatorio


nmero con seis decimales (si las mt_srand((double)microtime()*1000000);
2034887334
ltimas cifras son ceros no se echo mt_rand()
visualizarn).

Si se multiplica el valor anterior Manteniendo la sintaxis anterior -no te olvides de las semillitas famosas- se pueden
por 1.000.000 obtenemos un generar nmeros aleatorios comprendidos dentro del intervalo que preestablezcamos.
nmero de seis cifras y valor
entero que puede cambiar de valor Bastara con aadir los valores de los extremos de ese intervalo como parmetros
cada millonsima de segundo. de la funcin. La sintaxis sera esta:
rand(extremo inferior , extremo superior)
174393 y para la funcin mejorada
mt_rand(extremo inferior , extremo superior)
Fjate que ha cambiado! La
diferencia no es otra cosa que el
tiempo transcurrido entre los Generacin de un nmero aleatorio delimitando intervalos
instantes en que se ejecutaron Generador rand()
ambas instrucciones.
Sintaxis N aleatorio
Este nmero entero es utilizado srand((double)microtime()*1000000);
58
por srand y mt_rand como echo rand(1,300)
semilla generadora de nmeros Generador mt_rand()
aleatorios.
Sintaxis N aleatorio
mt_srand((double)microtime()*1000000);
56
echo mt_rand(1,300)

Anterior Indice Siguiente


Concatenacin de cadenas

Las variables de cadena


Escribiendo cadenas

A las variables tipo cadena se les Aqu tienes un ejemplo en el que se utilizan las dos formas de asignacin de valores a
puede asignar los valores de dos una cadena.
formas:
<HTML>
Escribiendo el contenido entre
<HEAD>
comillas:
<TITLE>Ejemplo 17 - PHP</TITLE>
$var="Texto del contenido"; </HEAD>
<BODY>
y por medio de la sintaxis de <?
documento incrustado que es la $cadena1="Esto es una cadena de texto";
siguiente:

$var= <<< EOD $cadena2= <<<Pepe


... contenido de la cadena... Esta es otra cadena escrita
... puede ir .... con la sintaxis de documento incrustado.
.. en varias lneas... Se escribe en varias lneas y tiene la sintaxis
EOD; siguiente. Despus de escribir el nombre de la variable
y el signo igual se ponen los tres <<< y
donde EOD es una palabra un nombre cualquiera. En este caso, Pepe. Luego hay que
cualquiera que debe repetirse
saltar de lnea y escribir el texto con las lneas que
exactamente igual al final de la
se desee, pero cuidado... a la hora de visualizar la cadena
instruccin.
con la instruccin echo todo este texto se ver seguido
Peculiaridades ya que para que se visualizaran saltos de lnea en una pgina
web habra que poner las famosas etiquetas <BR>.
El nombre de la variable, el signo Se indica el final de la cadena escribiendo de nuevo
igual que la precede, los tres el nombre asignado en la primera lnea -Pepe- pero teniendo
smbolos < y el EOD deben la precaucin de escribirlo en una linea nueva al final de
escribirse en la misma lnea, que
todo el texto... As como lo ves en el cdigo fuente.
esta vez no ir acabada en punto
y coma (observa que no acaba all
Pepe;
la instruccin).
$cadena3= <<<Pepa
Puede incluirse el texto (valor de la Esta es otra cadena con el nombre Pepa
variable) en tantas lneas como se puedo escribir Pepa cuantas veces quiera
desee, pero hay que tener en porque el PHP no interpretar el final de
cuenta, que a la hora de visualizar documento incrustado hasta que no la escriba
el documento no se mantiene esa en una sola linea y seguida del punto y coma
estructura ya que HTML slo
Pepa;
entiende la etiqueta <BR> como
indicador de salto de lnea.
echo $cadena1,"<BR>";
El cierre de la instruccin debe echo $cadena2,"<BR>";
hacerse siempre escribiendo el echo $cadena3,"<BR>";
EOD en una nueva lnea ?>
independiente que ahora s tiene </BODY>
que llevar el punto y coma que </HTML>
indica a PHP el final de una
instruccin.
ejemplo17.php

Anterior Indice Siguiente


Operaciones con cadenas

La concatenacin de
Uniendo cadenas
cadenas Aqu tienes un ejemplo de concatenacin de variables tipo string.

Para concatenar (unir), en una


<?
sola, varias porciones de texto
#definamos y asignemos valores a variables tipo cadena
hemos venido utilizando en las
instrucciones print y echo un $cadena1="Esto es una cadena de texto";
punto (.). $cadena2="Esta es una segunda cadena de texto";

El operador . #hagamos lo mismo con variables numricas


$cadena3=127;
Este punto es un elemento muy $cadena4=257.89;
importante que, adems de la
forma que hemos visto en las # unmoslas mezclando tipos
pginas anteriores, tiene los
siguientes usos:
$union1=$cadena1 . $cadena2;
Unir dos cadenas y $union2=$cadena1 . $cadena3;
recogerlas en una variable $union3=$cadena3 . $cadena4;

Con la sintaxis: #veamos que ha ocurrido


$a="cad1" . "cad2";
echo $union1,"<br>";
o mediante echo $union2,"<br>";
echo $union3,"<br>";
$a= $b . $c
# modifiquemos ahora una cadena
podemos obtener una nueva
variable formada por la unin dos
# aadiendole contenidos
trozos. Pero seguramente te
preguntars qu ocurre si $cadena3 .=" Este es el texto que se aadir a la variable cadena3";
juntamos una variable cadena y # imprimamos los resultados
una numrica? o qu ocurre si echo $cadena3,"<br>";
juntamos dos variables numricas? # aadamos ahora un nuevo trozo, esta vez
# a partir de una cadena escrita con la
En cualquiera de los supuestos # sintaxis de documento incrustado
puedes verlo en el ejemplo las
$cadena3 .= <<<Pepito
variables sern tratadas por PHP
con independencia de lo que
Ahora le aado a la cadena
puedan contener como de tipo este trocillo asignado con el "formato"
cadena y la variable que contiene de documento incrustado
el resultado es del tipo string. Pepito;
# visualicemos el resultado
Aadir contenidos echo $cadena3,"<br>";
a una variable tipo string ?>
Si utilizamos una sintaxis como
esta: ejemplo18.php
$a .="cad1"
o de este otro tipo Cuidado!
$a .=$b
Observa en el ejemplo que, excepcionalmente, la sintaxis de documento incrustado permite
(presta mucha atencin al punto introducir comillas (sin ningn mtodo especial), pero recuerda que en cualquier otro caso
que va delante del signo igual) se hay que recurrir al truco del que hablbamos en aqu.
aadira al valor actual de la
variable $a el contenido indicado
despus del signo igual.

Fjate en la importancia del punto.


Si est presente, se aaden Ejercicio n 13
nuevos contenidos a la variable;
pero en el caso de que no lo Utiliza los dos mtodos de creacin de variables de cadena y lo relativo al tratamiento de
estuviera, se sustituiran esos caracteres especiales para crear un script al que llamaremos ejercicio13.php que
contenidos, con lo cual se perdera permita explicar el significado de las etiquetas <BODY>, <HEAD> y <HTML>
la informacin que esa variable Resalta, con comillas, las palabras de tu explicacin que consideres ms importantes.
pudiera contener.

Anterior Indice Siguiente


Array escalar y asociativo

Qu es un array?
Tablas (arrays) unidimensionales

Un array es sencillamente una Mediante el uso de arrays podemos utilizar el mismo nombre para varias variables
tabla de valores. diferencindolas entre s mediante ndices distintos

Cada uno de los elementos de esa Tablas unidimensionales


tabla se identifica por medio de un
nombre (comn para todos) y un Array escalar Array asociativo
ndice (que diferenciara a cada Variable Indice Valor Variable Indice Valor
uno de ellos).
$a[0] 0 Domingo $a['Primero'] Primero Domingo
La sintaxis que permite definir $a[1] 1 Lunes $a['Segundo'] Segundo Lunes
elementos en un array es esta:
$a[2] 2 Martes $a['Tercero'] Tercero Martes
$nombre[indice]
$a[3] 3 Mircoles $a['Cuarto'] Cuarto Mircoles
$nombre utiliza exactamente la $a[4] 4 Jueves $a['Quinto'] Quinto Jueves
misma sintaxis empleada para
definir variables, con la nica $a[5] 5 Viernes $a['Sexto'] Sexto Viernes
particularidad de que ahora deben $a[6] 6 Sbado $a['Septimo'] Septimo Sbado
aadrsele los corchetes y los
ndices.

El ndice puede ser un nmero


Uso de arrays
(habra que escribirlo dentro del
corchete sin comillas), una cadena <?
(que habra que poner en el # Crearemos un array escalar (basta con definir un elemento)
corchete encerrada entre comillas $a[2]="Este elemento es el segundo del array";
sencillas '), o una variable PHP # creemos un nuevo elemento de ese array
en cuyo caso tampoco necesitara # esta vez de forma automtica
ir entre comillas.
# si ponemos corchetes vacos va aadiendo ndices automaticamente
Cuando los ndices de un array son $a[]="Ser este tercero?";
nmeros se dice que es escalar # comprobemos que le ha puesto ndice 3
mientras que si fueran cadenas se echo "El elemento ".$a[3]." tiene indice 3 (siguiente a 2) <br>";
le llamara array asociativo. # ahora insertemos un nuevo elemento con indice 32
$a[32]="Mi indice es 32";
Arrays escalares # insertemos otro elemento de forma automtica
$a[]= "Ir a parar al indice 33 este elemento?";
# la insercin se har con indice 33, comprobmoslo
Los elementos de un array escalar print "Vemos que contiene el elemento de indice 33 ...".$a[33]."<br>";
puede escribirse con una de estas
# qu ocurrir si pido que imprima el elemento 21 que nadie ha definido
sintaxis:
# seguramente estar vacio, comprobmoslo!!
$a[]=valor print ("Aqui--> ". $a[21]. "<--- si es que hay algo<br>");
# ahora crearemos un nuevo array llamado $b
# insertmosle de forma automatica su PRIMER elemento
$b[]="Estoy empezando con el array b y mi indice ser cero";
$a[xx]=valor
# comprobemos que efectivamente ha empezado con indice CERO
En el primero de los casos PHP print ($b[0]."<br>");
asigna los ndices de forma # veamos ahora eso de los arrays asociativos
automtica atribuyendo a cada # creemos uno llamado $c con varios elementos
elemento el valor entero siguiente $c["objeto"]="coche";
al ltimo asignado. $c["color"]="rojo";
$c["tamao"]="ideal";
Si es el primero que se define le
$c["marca"]= "Ferrari";
pondr ndice 0 (CERO).
$c["precio"]="prohibitivo para un humilde docente";
En el segundo de los casos, #encadenemos variables para hacer una salida
seremos nosotros quienes # pondremos cadenas " " para que no aparezcan los textos
pongamos (xx) el nmero # pegados unos a otros..
correspondiente al valor del $salida="<H2> El ". $c["objeto"] ." ".$c["marca"]." ".$c["color"];
ndice. $salida .=" tiene el tamao ideal ".$c["tamao"];
$salida .=" y su precio es ".$c["precio"];
Si ya existiera un elemento con
ese ndice, se cambiara el valor de
$salida .="</H2>";
su contenido, en caso contrario print $salida;
crear un nuevo elemento del # sigamos experimentando ahora
array y se le asignara como valor # qu ocurrira si nos olvidamos de poner nombre al indice
lo especificado detrs del signo # e insertamos un corchete vacio lo creara?que indice pondria?
igual, que de las misma forma # probemos ....
que ocurra con las variables $c[]="crear un array escalar nuevo y le pondr indice cero?";
debera ir entre comillas si fuera # tratemos ahora de visualizar esa variable
una cadena o sin ellas, si se # probemos a escribir $c[0] porque PHP
tratara de nmeros. # habr entendido que queremos un array escalar
# y como no existe ninguno con ese nombre empezar por cero
Arrays asociativos # comprobmoslo
echo $c[0];
Los elementos de un array ?>
asociativo pueden escribirse
usando la siguiente sintaxis:
ejemplo19.php
$a['indice']=valor

En este caso estamos obligados a


escribir el nombre del ndice que Ejercicio n 14
habr de ser una cadena y debe
ponerse entre comillas. Crea un formulario -puedes llamarlo formulario14.php- en el que se permita introducir un
nmero cualquiera en una caja de texto. Al enviar el formulario deber aparecer -un
Tanto en este supuesto como en el mensaje en letra- indicando el resto de dividir entre doce el valor transferido.
anterior, es posible y bastante
frecuente utilizar como ndice el El procedimiento podra ser el siguiente:
contenido de una variable. El modo
Crear un array conteniendo los nombres de todos restos posibles (divisin exacta, uno,
de hacerlo sera:
dos, tres... hasta once).
$a[$ind]=valor Asignar como ndices los valores numricos correspondientes a los literales que contiene
cada elemento.
En este caso, sea cual fuere el Comprobar el resto de la divisin e imprimir el valor del elemento del array cuyo ndice
valor de la variable $ind, el coincide con ese resto.
nombre de la variable nunca se
pone entre comillas.

Anterior Indice Siguiente


Arrays bidimensionales

Arrays bidimensionales
Arrays bidimensionales
Como ejemplo de array bidimensional emplearemos una tabla de resultados de una
Los arrays bidimensionales pueden liga de ftbol en la que intervienen cinco equipos que como en toda liga que se precie
entenderse como algo muy similar se juega a doble partido.
a una tabla de doble entrada.
En este primer supuesto utilizaremos arrays escalares, por lo tanto los equipos sern
Cada uno de los elementos se
identificados con nmeros desde cero hasta cuatro.
identifica sigue siendo vlido el
nombre nico que se usaba en los
unidimensionales por un nombre <?
($nombre) seguido de dos ([]) # rellenamos el array desde [0][0] hasta [0][4]
que contienen los ndices (en este # la insercion automatica haria que este primero fuera [0][0]
caso son dos ndices) del array.

Los ndices pueden ser de tipo


$a[][]=" ";
escalar -equivalen al nmero de # ahora pondremos cero como indice del primer array y dejemos que PHP
fila y columna que la celda ocupa # nos vaya insertando automaticamente el segundo
en la tabla o puede ser
asociativos lo que equivaldra en $a[0][]="3-2";$a[0][]="5-3";$a[0][]="7-1";$a[0][]="0-2";
alguna medida a usar como ndices
los nombres de la fila y de la #ahora desde [1][0] hasta [1][4]
columna. #este primero lo dejamos como automtico en ambos indices
# de esta forma el primero tomar valor uno (siguiente al anterior)
Cuidado!
# de forma automtica
No dejes de tener en cuenta lo que $a[][]="0-11";
hemos advertido al hablar de # repetimos el proceso anterior
arrays unidimensionales. $a[1][]=" ";$a[1][]="2-1";$a[1][]="1-0";$a[1][]="1-2";
# y repetimos de nuevo, ahora crearia 2 como primer indice
En este supuesto, tambin, se $a[][]="0-0";
empiezan a numerar los arrays
#insertariamos los restantes valores de indice 2
escalares a partir de CERO.
$a[2][]="1-3";$a[2][]=" ";$a[2][]="1-4";$a[2][]="2-0";
# nuevo incremento del primer indice
Arrays escalares $a[][]="1-0";
# rellenamos
Los elementos de un array $a[3][]="6-3";$a[3][]="14-3 ";$a[3][]=" ";$a[3][]="1-0";
bidimensional escalar pueden # nuevo y ultimo incremento de primer indice
escribirse usando una de estas $a[][]="1-1";
sintaxis: # rellenamos de nuevo
$a[4][]="2-3";$a[4][]="0-1 ";$a[4][]="1-1";$a[4][]="";
$a[][]=valor
o
# como vers el proceso no tiene complicaciones, pero ... pesadillo si es
$a[xx][]=valor
o # verdad que si tuviramos una base de datos sera ms fcil?
$a[][xx]=valor # estamos en ello, todo se andar...
o tambin
$a[xx][yy]=valor # tendramos que ver esos valores pero.. escribir "a mano"
# una tabla puede ser una tortura, as que mejor introducimos
En el primero de los casos PHP # una bucle, otro recurso que estudiaremos pronto
asigna automticamente como # para esa labor repetitiva de mostrar en una tabla
primer ndice el valor que sigue
# todos los datos del array
al ltimo asignado y, si es el
primero que se define, le pondr
como ndice 0 (CERO). # Sera algo como esto
# creamos la etiqueta de apertura de una tabla
Sea cual fuere el valor de primer
ndice al segundo se le asignar print ("<TABLE BORDER=2>");
cero ya que es en este mismo # ahora dos bucles anidados (rojo uno, magenta el otro)
momento cuando se habr creado # para rellenar las celdas de cada fila (el magenta)
el primero y, por tanto, an # y para insertar las etiquetas <TR> utilizaremos el rojo
carecer de elementos.

En el segundo de los casos, for ($i=0;$i<5;$i++){


asignamos un valor al primer print("<tr>");
ndice (xx) y ser el segundo for($j=0;$j<5;$j++) {
quien se incremente en una print("<td>".$a[$i][$j]."</td>");
unidad respecto al de valor ms }
alto de todos aquellos cuyo }
primer ndice coincide con el
especificado. #ponemos la etiqueta de cierre de la tabla
La tercera opcin es bastante
similar a la anterior. Ahora se print("</table>");
modificara automticamente el ?>
primer ndice y se escribira el
contenido (xx) como valor del
segundo. ejemplo20.php

En la cuarta de las opciones se Utilizando el script anterior, con ligeros retoques estticos, hemos construido esta
asignan libremente cada uno de tabla:
los ndices (xx e yy) ponindoles
valores numricos.
Todos los resultados de la liguilla

Arrays asociativos Indice 0 1 2 3 4


0 3-2 5-3 7-1 0-2
Los elementos de un array 1 0-11 2-1 1-0 1-2
asociativo se pueden escribir
usando la siguiente sintaxis: 2 0-0 1-3 1-4 2-0

$a["indice1"]["indice2"]=valor
3 1-0 6-3 14-3 1-0
4 1-1 2-3 0-1 1-1
En este caso, los ndices sern
cadenas y se escribirn entre
comillas. Con el misma procedimiento en este caso hemos usado resultados diferentes hemos
construido esta otra tabla
Arrays mixtos
Resultados de la liguilla
PHP permite utilizar tambin Indice Juvencia Mosconia Canicas Condal Piloesa
arrays mixtos. Sera este el caso
de que uno de ellos fuera escalar y Juvencia 3-2 5-3 7-1 0-2
el otro asociativo. Mosconia 0-11 2-1 1-0 1-2
Igual que ocurra con los Canicas 0-0 1-3 1-4 2-0
unidimensionales, tambin aqu
podemos utilizar valores de Condal 1-0 6-3 14-3 1-0
variables como ndices. Piloesa 1-1 2-3 0-1 1-1

Por qu no intentas modificar el script y tratas de reproducir estas tablas? Desde


luego, es slo una sugerencia.

Anterior Indice Siguiente


Arrays multidimensionales

Arrays multidimensionales
Arrays multidimensionales
PHP permite el uso de arrays con
dimensin superior a dos. Para Esta es la forma en la que hemos definido el array tridimensional que utilizaremos en
modificar la dimensin del array el ejemplo.
basta con ir aadiendo nuevos
ndices.
<?
$a[x][y][z]=valor;
$b = array(
asignara un valor al elemento de "Juvencia" => array(
ndices x, y y z de un array "Juvencia" => array (
tridimensional y "Resultado" => " ",
"Amarillas" => " ",
$a[x][y][z][w]=valor;
"Rojas" => " ",
hara lo mismo, ahora con un array "Penalty" => " "
de dimensin cuatro. ),
"Mosconia" => array (
Pueden tener cualquier tipo de "Resultado" => "3-2",
ndices: escalares, asociativos y, "Amarillas" => "1",
tambin, mixtos.
"Rojas" => "0",
"Penalty" => "1"
La funcin array(); ),
"Canicas" => array (
Para asignar valores a una matriz "Resultado" => "5-3",
puede usarse la funcin array(), "Amarillas" => "0",
que tiene la siguiente sintaxis: "Rojas" => "1",
"Penalty" => "2"
$a= array ( ),
ndice 0 => valor, "Condal" => array (
..... ,
"Resultado" => "7-1",
ndice n => valor,
);
"Amarillas" => "5",
"Rojas" => "2",
Por ejemplo: "Penalty" => "1"
),
$z=array ( "Piloesa" => array (
0 => 2, "Resultado" => "0-2",
1 => "Pepe",
"Amarillas" => "1",
2 => 34.7,
"Rojas" => "0",
3 => "34Ambrosio",
); "Penalty" => "0"
),
producir igual resultado que: ),
"Mosconia" => array(
$z[0]=2; "Juvencia" => array (
$z[1]="Pepe"; "Resultado" => "0-11 ",
$z[2]=34.7;
"Amarillas" => "4",
$z[3]="34Ambrosio";
"Rojas" => "2",
"Penalty" => "4"
Anidando en array(); ),
"Mosconia" => array (
La funcin array() permite escribir "Resultado" => " ",
arrays de cualquier dimensin "Amarillas" => " ",
utilizando la tcnica de anidado. "Rojas" => " ",
"Penalty" => " "
Si pretendemos escribir los
),
elementos de este array:
"Canicas" => array (
$z[0][0]=34; "Resultado" => "2-1",
$z[0][1]=35; "Amarillas" => "0",
$z[0][2]=36; "Rojas" => "0",
$z[1][0]=134; "Penalty" => "2"
$z[1][1]=135; ),
$z[1][2]=136; "Condal" => array (
"Resultado" => "1-0",
podriamos hacerlo asi:
"Amarillas" => "1",
"Rojas" => "0",
$z=array( "Penalty" => "0"
0 => array (
),
0 => 34,
1 => 35,
"Piloesa" => array (
2 => 36, "Resultado" => "1-2",
), "Amarillas" => "1",
1 => array ( "Rojas" => "0",
0 => 134, "Penalty" => "0"
1 => 135, ),
2 => 136, ),
) "Canicas" => array(
); "Juvencia" => array (
"Resultado" => "0-0",
Como puedes observar, se trata de "Amarillas" => "0",
sustituir los valores asignados a "Rojas" => "1",
los elementos de una primera "Penalty" => "1"
funcin array() por otra nueva ),
funcin array que contiene los "Mosconia" => array (
segundos ndices asi como los "Resultado" => "1-3",
valores asignados a los mismos.
"Amarillas" => "2",
El anidado sucesivo permitira "Rojas" => "0",
generar arrays de cualquier "Penalty" => "1"
dimensin. ),
"Canicas" => array (
Aunque en el ejemplo anterior nos
hemos referido a un array escalar, "Resultado" => " ",
idntico procedimiento sera vlido "Amarillas" => " ",
para arrays asociativos con slo "Rojas" => " ",
cambiar los nmeros por cadenas "Penalty" => " "
escritas entre comillas. ),
"Condal" => array (
Este podra ser un ejemplo de "Resultado" => "1-4",
array asociativo: "Amarillas" => "2",
$z["a"]["A"]=34; "Rojas" => "1",
$z["a"]["B"]=35; "Penalty" => "1"
$z["a"]["C"]=36; ),
$z["b"]["A"]=134; "Piloesa" => array (
$z["b"]["B"]=135; "Resultado" => "2-0",
$z["b"]["C"]=136; "Amarillas" => "1",
"Rojas" => "0",
que podra definirse tambin de
"Penalty" => "0"
esta forma:
),
),
$z=array( "Condal" => array(
"a" => array (
"Juvencia" => array (
"A" => 34,
"Resultado" => "1-0 ",
"B" => 35,
"C" => 36, "Amarillas" => "4",
), "Rojas" => "1",
"b" => array ( "Penalty" => "2"
"A" => 134, ),
"B" => 135, "Mosconia" => array (
"C" => 136, "Resultado" => "6-3",
) "Amarillas" => "1",
); "Rojas" => "2",
"Penalty" => "3"
A medida que la dimensin se hace ),
mayor la sintaxis requiere "Canicas" => array (
muchsima ms atencin y los "Resultado" => "14-3",
errores son poco menos que "Amarillas" => "1",
inevitables. Refresquemos un poco "Rojas" => "0",
la memoria. "Penalty" => "0"
),
No olvides los punto y coma "Condal" => array (
del final de las "Resultado" => " ",
instrucciones. "Amarillas" => " ",
Cuidado con las formas
"Rojas" => " ",
anidadas y tambin con los
"Penalty" => " "
parntesis.
Cierra cada uno de los ),
parntesis que abras y no "Piloesa" => array (
olvides que los parntesis "Resultado" => "1-0",
se anidan, ya sabes... el "Amarillas" => "3",
primero que se abre "Rojas" => "1",
siempre con el ltimo que "Penalty" => "0"
se cierra, el segundo con el ),
penltimo, etctera. ),
No dejes de prestar "Piloesa" => array(
atencin a las comillas.
"Juvencia" => array (
Recuerda que hay que
"Resultado" => "1-1",
cerrarlas siempre y que hay
que diferenciarlas en los "Amarillas" => "0",
casos en que van comillas "Rojas" => "0",
dentro de otras comillas. "Penalty" => "1"
),
"Mosconia" => array (
Una ltima advertencia. No te
desesperes con los errores de "Resultado" => "2-3",
sintaxis! Son inevitables. "Amarillas" => "1",
"Rojas" => "0",
"Penalty" => "0"
Enmendando un olvido ),
"Canicas" => array (
Cuando hemos hablado de las "Resultado" => "0-1",
funciones matemticas hemos "Amarillas" => "0",
olvidado mencionar una de ellas. "Rojas" => "0",
"Penalty" => "0"
Se trata de la funcin valor
absoluto. ),
"Condal" => array (
La sintaxis es la siguiente: "Resultado" => "1-1",
"Amarillas" => "1",
Abs($a); "Rojas" => "2",
Un ejemplo: "Penalty" => "0"
),
<? "Piloesa" => array (
$MiSaldo=" -347.513 "; "Resultado" => " ",
$MisDeseos=Abs($MiSaldo); "Amarillas" => " ",
$MisDeseos .= " "; "Rojas" => " ",
echo $MisDeseos; "Penalty" => " "
?> ),
resultara : )
);
347.513 ?>

Utilizando este array hemos construido la tabla que hemos puesto como ejemplo.
ejemplo21.php

Anterior Indice Siguiente


Presentacin de nmeros

Funciones de salida
Funciones de salida
Aqu tienes un resumen de las diversas opciones de la funcin printf():
Ya conocemos algunas de las
funciones que PHP utiliza para Sintaxis
mostrar informacin salidas en
la ventana del navegador del printf(cadena de formato,variable1,variable2,..)
cliente. Cadena de formato
Recordmoslas:
"%[relleno][alineacin][ancho][precisin][tipo]"
Carcter Valor Sintaxis Resultado
echo 0 0 printf("%020d",32) 00000000000000000032
* '* printf("%'*20d",32) ******************32
La funcin echo, aunque admite
tambin la forma echo(), no espacio1) ' printf("%' 20d",32) 32
requiere de forma obligatoria el - '- printf("%'-20d",32) ------------------32
uso de los parntesis.
Observaciones
Detrs de la instruccin echo En este apartado prestaremos atencin nicamente a los caracteres marcados en
rojo, que son los que corresponden a las diferentes formas de relleno. Los dems
pueden insertarse: variables,
parmetros los iremos tratando uno en los apartados siguientes.
cadenas (stas entre comillas) y
nmeros (stos sin comillas) Cuando se pretende rellenar con ceros a la izquierda basta escribir el 0
separadas por comas. inmediatamente detrs del signo %

Este es un ejemplo de cdigo: Relleno Si se trata de rellenar con un carcter distinto de cero debe escribirse
inmediatamente despus de% una comilla simple ' seguida del carcter de
$a=24; $b="Pepe"; relleno.
$c="<br>";
Si se pretende rellenar con espacios forzados se puede escribir la comilla simple 'e
echo $a,$b,25,
inmediatamente despus teclear la combinacin ALT+0160 (carcter ASCII 160)
"Luis",$c; usando el teclado numrico. Aunque obviamente no se visualiza el espacio si se
conserva tal como puede verse en el ejemplo 1)
que producira esta salida:
Obsrvese que como la tipografa es de ancho variable y que segn el carcter que se
24Pepe25Luis use como relleno se modifica el ancho de la presentacin.

Observa los valores que hay detrs Quiz convenga recordar que 32 es en este caso la variable a la que pretendemos
de echo. Como vers, no es dar formato y que ese valor podra ser sustituido por el nombre de una variable que
necesario insertar todos los valores contenga valores numricos.
en la misma lnea.
Carcter Valor Sintaxis Resultado
print() Ninguno Dcha printf("%020d",32) 00000000000000000032
- Izda printf("%020d",32) 32
La funcin print() slo puede Ninguno Dcha printf("%'*20d",32) ******************32
contener dentro del parntesis una - Izda printf("%'*20d",32) 32******************
sola variable, o el conjunto de Ninguno Dcha printf("%020s",32) 00000000000000000032
varias de ellas enlazadas por un
- Izda printf("%020s",32) 32000000000000000000
punto.
Ninguno Dcha printf("%'*20s",32) ******************32
Aqu tienes algunos ejemplos: - Izda printf("%'*20s",32) 32******************

print(25.3) Observaciones
Alineacin En los casos en que figura Ninguno en la columna Caracter tratamos de indicar que
producira esta salida
no es necesario escribir nada en la cadena de formato. Cuando aparece un signo ()
25.3 estamos indicando que debe insertarse un signo menos.
print("Gonzalo") Fjate que en los cuatro primeros supuestos el identificador de tipo es d, lo cual hace
escribira que considere la variable como numrica, mientras que en los cuatro ltimos ese
Gonzalo valor es s, con lo cual considera la variable como tipo cadena.

$z=3.1416; Cuando tratamos de rellenar una variable numrica con ceros por la derecha PHP
print($z); los omite para no alterar el valor numrico en la presentacin
escribira
Con cualquier otro carcter de relleno (incluidos los caracteres numricos con '
3.1416 delante) s efecta el relleno.
Recuerda tambin que es posible Carcter Valor Sintaxis Resultado
utilizar dentro del parntesis el Entero 14 printf("%'*14d",32) ************32
concatenador de cadenas. Entero 17 printf("%'*-17d",32) 32***************
Decimal 14.5 printf("%'*14.5d",32) ************32
$h=3;
Decimal 17.8 printf("%'*-17.8d",32) 32***************
$f=" hermanos"
Decimal 14.5 printf("%'*14.5f",32) ******32.00000
print("Heladeria ".$h.$f)
Decimal 11.8 printf("%'*-11.8f",32) 32.00000000
que escribira Ancho
Observaciones
El ancho (n de caracteres totales) puede especificarse mediante un nmero entero
Heladeria 3 hermanos para todo tipo de variables

Si se expresa mediante un nmero decimal y la variable es tipo coma flotante la


Salidas con formato parte decimal indica la precisin (n de cifras decimales) y la parte entera el ancho
como nmero de caracteres de la parte entera o de la parte decimal, segn se
Ni la funcin echo, ni tampoco rellene a la derecha o a la izquierda.
print permiten establecer una Tipo Valor Sintaxis Resultado
presentacin (formato) en sus Presentacin
salidas, excepto que alguna de las b printf("%'*14b",17) *********10001
en forma binaria
variables que se use contenga el Caracter
resultado de una funcin correspondiente c printf("%'*14c",97) a
number_format. al cdigo ASCII
Nmero
La funcin printf() ofrece un gran presentado d printf("%'*14d",17.83) ************17
nmero de posibilidades en este como entero
sentido. Tanto la sintaxis como los Nmero
valores de los diferentes Tipo presentado f printf("%'*14f",17.45) *****17.450000
parmetros cuando se trate de con decimales
presentar nmeros las tienes Presentacin
o printf("%'*14o",17) ************21
resumidas aqu a la derecha. en forma octal
Presentacin
x printf("%'*14x",170) ************aa
En la pgina siguiente veremos el en hexadecimal
uso de printf() para el tratamiento Presentacin
X printf("%'*14X",170) ************AA
de variables tipo cadena. en hexadecimal
Presentacin
s printf("%'*14s",170) ***********170
como >cadena

Anterior Indice Siguiente


Cadenas alfanumricas (I)

Funciones de cadenas
Formatos en cadenas
Algunas de las funciones que
permiten manejar los formatos de
las cadenas de caracteres son
printf(cadena de formato,variable1,variable2,..)
estas:
Cadena de formato
chr(n)
Dentro de la cadena de formatos deben repetirse tantos formatos como variables se pretenda manejar
Devuelve el carcter cuyo
cdigo ASCII es n. "%[rell1][alin1][anc1][prec1][tipo1][sepa1]%[rell1][alin1][anc1][prec1][tipo1][sepa1]"

ord(cadena)
Hemos de mencionar aqu los separadores ya que no fueron mencionados en la
Devuelve el cdigo ASCII del pgina anterior
primero de los caracteres de la
cadena. Se puede introducir una cadena de separacin al final de una cadena de formato
que puede hacer, entre otras, funcin de separacin entre dos cadenas.
strlen(cadena)
Por ejemplo, printf("%'*15.2f Euros",1475.875) nos devolvera:
Devuelve la longitud (nmero de
caracteres) de la cadena. Los ********1475.88 Euros
espacios son considerados como
un caracter ms. La funcin printf() permite presentar varios valores o variables con distintos
formatos utilizando la sintaxis que se indica ms arriba.
strtolower(cadena)
Este ejemplo :
Cambia todos los caracteres de la
cadena a minsculas. printf("%'*15.2f Euros=%'*18.0f Pesetas",1475.875,1475.875*166.386)
strtoupper(cadena) devuelve como resultado:
Convierte en maysculas todos los
********1475.88 Euros=************245565 Pesetas
caracteres de la cadena.

ucwords(cadena) Existe otra funcin PHP con caractersticas muy similares a la anterior. Se trata de
Convierte a maysculas la primera sprintf().
letra de cada palabra.
La sintaxis es idntica sprintf (cadena de formato, variable1,variable2, ...) y su nica
ucfirst(cadena) diferencia con printf es que, mientras que printf() imprime las variables utilizando el
formato indicado, sprintf() puede guardar en una nueva variable la cadena resultante
Convierte a maysculas la primera de la aplicacin del formato.
letra de la cadena y pone en
minsculas todas las dems.

ltrim(cadena) Otras funciones con cadenas


Elimina todos los espacios que
pudiera haber al principio de la Estos son algunos ejemplos de aplicacin de las funciones de manejo de cadenas
cadena.

rtrim(cadena) Cdigo ASCII y viceversa


Funcin Ejemplo Resultado
Elimina todos los espacios que
existieran al final de la cadena. chr(cdigo ASCII) chr(97) a
ord("cadena") ord("abadesa") 97
trim(cadena)
Longitudes y conversiones maysculas/minsculas
Elimina los espacios tanto al Funcin Ejemplo Resultado
principio como al final de la cadena
strlen("Mide la longitud de esta
strlen("cadena") 31
chop(cadena) cadena")
strtolower("CONVIERTE A
Elimina los espacios al final de la strtolower("cadena") convierte a minsculas
MINSCULAS")
cadena. Es idntica a rtrim.
strtoupper("cadena") strtoupper("pasa a maysculas") PASA A MAYSCULAS
Advertencia ucwords("todas empiezan por
ucwords("cadena") Todas Empiezan Por Mayscula
mayscula")
Tanto trim, como ltrim y rtrim
ucfirst("cadena") ucfirst("mayscula al principio") Mayscula al principio
eliminan, adems de los espacios,
las secuencias: \n, \r, \t, \v y \0; Eliminar espacios
llamadas tambin caracteres
Funcin Ejemplo Resultado
protegidos.
ltrim("cadena") ltrim("\n \nEliminar espacios") Eliminar espacios
substr(cadena,n) rtrim("cadena") rtrim("Eliminar espacios\n \n") Eliminar espacios
Si el valor de n es positivo extrae trim("cadena") trim("\n \nEliminar espacios\n \n") Eliminar espacios
todos los caracteres de la chop("cadena") chop("\n \nEliminar espacios\n \n") Eliminar espacios
cadena a partir del que ocupa la
posicin ensima a contar desde la Extraer porciones de una cadena
izquierda. Funcin Ejemplo Resultado

Si el valor de n es negativo sern substr("cadena",n) substr("Extrae caracteres",3) rae caracteres


extrados los n ltimos substr("cadena",n) substr("Extrae caracteres",0) Extrae caracteres
caracteres contenidos en la
substr("cadena",n) substr("Extrae caracteres",-5) teres
cadena.
substr("cadena",n) substr("Extrae caracteres",-2) es
substr(cadena,n,m) substr("cadena",n,m) substr("Extrae caracteres",2,6) trae c

Si n y m son positivos extrae m substr("cadena",n,m) substr("Extrae caracteres",0,8) Extrae c


caracteres a partir del que ocupa substr("cadena",n,m) substr("Extrae caracteres",2,-3) trae caracte
la posicin ensima, de izquierda
substr("cadena",n,m) substr("Extrae caracteres",-7,5) acter
a derecha.
substr("cadena",n,m) substr("Extrae caracteres",-7,-5) ac
Si n es negativo y m es positivo
substr("cadena",n,m) substr("Extrae caracteres",-5,-7)
extrae m (contados de izquierda a
derecha) a partir del que ocupa la
posicin ensima contada de Modificaciones de cadenas
derecha a izquierda. Funcin Ejemplo Resultado
strrev("cadena") strrev("Invierte la cadena") anedac al etreivnI
Si n es positivo y m es negativo
extrae la cadena comprendida str_repeat("cadena",n) str_repeat("Rep",5) RepRepRepRepRep
entre el ensimo carcter str_pad("cadena", str_pad("Pepe",10,"*",
(contados de izquierda a derecha) ***Pepe***
n,"Relleno",Tipo) STR_PAD_BOTH)
hasta el emsimo, contando en
str_pad("cadena", str_pad("Pepe",10,"*",
este caso de derecha a izquierda ******Pepe
n,"Relleno",Tipo) STR_PAD_LEFT)
Si n es negativo y m tambin es str_pad("cadena", str_pad("Pepe",10,"*",
Pepe******
negativo extrae la porcin de n,"Relleno",Tipo) STR_PAD_RIGHT)
cadena comprendida entre el str_pad("cadena",
emsimo y el ensimo str_pad("Pepe",10,"*") Pepe******
n,"Relleno",Tipo)
caracteres contando, en ambos
str_replace ("lo que
casos, de derecha a izquierda. Si
dice",lo que str_replace("e","a","Pepe") Papa
el valor absoluto de n es menor dira,"Cadena")
que el de m devuelve una cadena
vaca. str_replace ("lo que
dice",lo que str_replace("pe","pa","Pepepe") Pepapa
strrev(cadena) dira,"Cadena")
str_replace ("lo que
Devuelve la cadena invertida dice",lo que str_replace("Pepe","Luis","Pepe") Luis
dira,"Cadena")
str_repeat(cadena, n)
substr_replace
Devuelve la cadena repetida ("Cadena",lo que dira,n, substr_replace("Pepe","Luis",2,-1) PeLuise
m)
tantas veces como indica n.

str_pad(cad, n, rell, tipo)


Cuidado!
Aade a la cadena cad los
caracteres especificados en rell Como tu buen criterio ya habr podido advertir, no se trata aqu de aprender todas estas
(uno o varios, escritos entre opciones de formato ni las que veremos en las pginas siguientes sino de que dispongas
comillas) hasta que alcance la de una referencia de consulta a la que recurrir en el momento en el que necesites utilizar
longitud que indica n (un nmero) estas funciones.
El parmetro tipo puede tomar
uno de estos tres valores (sin
Pensamos que s es importante que sepas que PHP dispone de todos estos recursos y
comillas): conozcas su potencialidad para hacer presentaciones de las formas ms variadas.
STR_PAD_BOTH (rellena por
ambos lados)
STR_PAD_RIGHT (rellena por la
derecha)
STR_PAD_LEFT (rellena por la Ejercicio n 15
izquierda).
Crea un formulario -formulario15.php- mediante el que puedas transferir un valor numrico
Si se omite la cadena de Relleno y un texto (un input tipo text y otro textarea).
utilizar espacios y si se omite el
tipo rellenar por la derecha Trata de que el script que los reciba -visor15.php-, permita visualizar sus valores de forma
que el valor numrico tenga 2 decimales y acabe con la palabra euros, y que la parte entera
se complete (por la izquierda) con asteriscos hasta tener una longitud de 12 caracteres.

El contenido del textarea debera visualizarse integramente en minsculas, excepto los diez
primeros caracteres que deberan verse en maysculas.

Anterior Indice Siguiente


Cadenas alfanumricas (II)

Funciones de cadenas
Formatos de salida
Como complemento a las descritas
en la pgina anterior, aadimos Estos son algunos ejemplos en los que continuamos con las aplicaciones de las
aqu algunas otras funciones PHP funciones PHP al manejo de cadenas:
que tambin permiten manejar
cadenas de caracteres. Marcas, divisiones y uniones de cadenas
AddSlashes(cadena) Variable cadena Sintaxis Resultado
$a="Esta ' y \ y
Inserta el carcter \ delante los AddSlashes($a) $a="Esta \' y \\ y tambin NUL"
tambin NUL"
siguientes: ", ', \ y NUL (el bit
nulo). $a="Esta \' y \\ y
stripslashes($a) Esta ' y y tambin el nulo
tambin NUL"
stripslashes(cadena) $a="Esta es una
cadena larga que chunk_split Esta es una cadena larga que presuntamen
Quita las marcas aadidas a una presuntamente ser ($a,5,"") te ser troceada
cadena con la funcin AddSlashes troceada"
(). $a="Esta es una
cadena larga que Esta es un a cad ena l arga que p resun tamen te se
chunk_split(cad, n, sep ) presuntamente ser
chunk_split($a,5)
r tr ocead a
troceada"
Devuelve la cadena (cad) despus
de haberle insertado, cada n $a="Esta es una
caracteres, la cadena indicada en cadena larga que chunk_split Esta es una cadena larga que presuntamente ser
el parmetro sep. presuntamente ser ($a,76,"-") troceada-
troceada"
Si no se indica sep PHP pondr un
espacio. $todo="v1=Esto+sera+una+variable&v2=esto+otra&p[]=incluso+un+array"
Si no se establece el parmetro n parse_str($todo);
insertar el separador cada 76 Divide la cadena Esto sera una variable
echo $v1;
caracteres. $todo en sus esto otra
echo $v2;
componentes incluso un array
Esta funcin coloca siempre un echo $p[0];
separador al final de la cadena. $a="Esta cadena sera devuelta en trozos"
parse_str(cadena) $trozo1=explode("
",$a); Esta
Recoger en un
Devuelve las variables con su echo $trozo1[0]; cadena
array cada uno de
valor indicadas dentro de la echo $trozo1[1]; sera
los trozos
cadena (observa la sintaxis del echo $trozo1[2]; devuelta
delimitados por los
echo $trozo1[3]; en
ejemplo). separadores
echo $trozo1[4]; trozos
Dentro de la cadena cada variable
echo $trozo1[5];
se denomina con un nombre que
va seguido de un signo igual. Los $trozo2=explode
espacios se sealan con el signo + ("a",$a); Est
Recoger en un
echo $trozo2[0]; c
y los separadores de variables son array cada uno de
echo $trozo2[1]; den
signos & los trozos
echo $trozo2[2]; ser
delimitados por los
echo $trozo2[3]; devuelt
explode(sep, cad,n) separadores
echo $trozo2[4]; en trozos
echo $trozo2[5];
Devuelve un array cuyos
elementos contienen cada una de $trozo3=explode("
las porciones de la cadena (cad) Recoger en un ",$a,3);
array cada uno de echo $trozo3[0]; Esta
comprendidas entre dos de los cadena
los trozos echo $trozo3[1];
caracteres sealados como (sep) sera devuelta en trozos
delimitados por los echo $trozo3[2];
hasta el mximo de porciones separadores hasta echo $trozo3[3];
sealadas (n). un mximo de 3 echo $trozo3[4];
Los caracteres separadores no son echo $trozo3[5];
includos en las cadenas
$trozo4=explode
resultantes. Si no se indica la
Recoger en un ("a",$a,3);
cantidad de porciones, ser array cada uno de echo $trozo4[0]; Est
fraccionada toda la cadena. los trozos echo $trozo4[1]; c
Si se indica nmero, el ltimo delimitados por los echo $trozo4[2]; dena sera devuelta en trozos
trozo contendr toda la cadena separadores hasta echo $trozo4[3];
restante. un mximo de 3 echo $trozo4[4];
echo $trozo4[5];
implode(sep, array)
implode(" ",$trozo1) Esta cadena sera devuelta en trozos
Devuelve una cadena formada por implode("*",
Est* c*den* ser* devuelt* en trozos
todos los elementos del array $trozo2)
separados mediante los caracteres implode("-",
indicados en sep. Esta-cadena-sera devuelta en trozos
$trozo3)

join(sep, array) implode(":",


Est: c:dena sera devuelta en trozos
$trozo4)
Es idntica a implode. join(" ",$trozo1) Esta cadena sera devuelta en trozos

strtok(cad , sep) join("*",$trozo2) Est* c*den* ser* devuelt* en trozos


join("-",$trozo3) Esta-cadena-sera devuelta en trozos
Esta funcin divide la cadena cad
join(":",$trozo4) Est: c:dena sera devuelta en trozos
en trozos delimitados por el
separador que se indica en sep. $cadena="Esta cadena ser dividida con la funcin strtok"
Cuando se invoca la primera vez Esta
extrae el primer trozo debe llevar $trocin = strtok ($cadena," "); cadena
las sintaxis strtok(cadena,sep). ser
Al invocarla sucesivamente, se while ($trocin) { dividida
escribe solo strtok (" ") e ir echo "$trocin<br>"; con
recogiendo de forma secuencial los $trocin = strtok (" "); la
trozos sucesivos. } funcin
strtok
$trocin = strtok ($cadena," ");
Encriptacin de cadenas echo $trocin,"<br>";
Esta
$trocin1 = strtok (" ");
cadena
PHP dispone de funciones que echo $trocin1,"<br>";
Esta
$trocin2 = strtok (" ");
permiten codificar o encriptar
echo $trocin2,"<br>";
cadenas de caracteres.
Est
bin2hex(cadena) $trocin = strtok ($cadena,"a");
c
while ($trocin) {
den
Devuelve una cadena ASCII que echo "$trocin<br>";
ser dividid
contiene la representacin $trocin = strtok ("a");
con l
hexadecimal de la cadena. La }
funcin strtok
conversin se realiza byte a byte,
con los 4 bits superiores primero. Encriptaciones y codificaciones
Variable cadena Sintaxis Resultado
crypt(cadena)
$a="Esta es la
bin2hex($a) 45737461206573206c6120636164656e610a
Devuelve la cadena encriptada cadena"
utilizando una semilla aleatoria de $a="Encriptame" crypt($a) $1$5x4.oB1.$VwrU6e.IoDsICs8uEcXMB0
dos caracteres.
$a="Encriptame" crypt($a) $1$R05.GY5.$t755l53QY6awOmlsrwkVI1
Por su caracter aleatorio, si se $a="Encriptame" crypt($a,"zq") zqQ4qOeELzPFg
ejecuta dos veces seguidas tal $a="Encriptame" crypt($a,"zq") zqQ4qOeELzPFg
como puedes observar en el
ejemplo dar dos resultados $a="Encriptame" crypt($a,"@$") @$t3m36xiW556
diferentes. $a="Encriptame" md5($a) 67c3ca0aefda2595138168a85e7b33a0
$a="Encriptame" md5($a) 67c3ca0aefda2595138168a85e7b33a0
crypt(cadena,"xx")
$a="Encriptame" crc32($a) -1128189886
Devuelve la cadena encriptada
utilizando como semilla los dos Bsquedas y recuentos de caracteres
caracteres (entre comillas) que se Variable cadena Sintaxis Resultado
escriben como segundo parmetro $a="Contando
de la funcin. count_chars($a,0) Array
caracteres"
Tanto en este supuesto como en el
anterior, los dos primeros $b=count_chars
$a="Contando
($a,0); 3
caracteres de la cadena encrip- caracteres"
echo $b[97];
tada coinciden con los que han
sido utilizados como semilla. $b=count_chars
$a="Contando
($a,0); 2
caracteres"
md5(cadena,"xx") echo $b[ord("o")]
$a="Pepe Perez el
Aplica el algoritmo md5 lo substr_count
perverso pecador en 2
comentamos a la derecha y ($a,"Pe");
penitencia"
devuelve la huella digital generada
$a="Pepe Perez el
por l. substr_count
perverso pecador en 4
($a,"pe");
penitencia"
crc32(cadena)

Aplica el algoritmo crc32 de La funcin count_char($a,0) devuelve un array cuyos ndices son los cdigos ASCII
comprobacin de integridad y de los caracteres y cuyos valores son el nmero de veces que se repite cada uno de ellos.
devuelve el valor del mismo.
La funcin substr_count($a,"cadena") determina el nmero de veces que aparece
Se utiliza muchsimo en los
la cadena dentro de $a. Diferencia entre maysculas y minsculas.
programas de compresin y
descompresin de ficheros. Se
aplica en el momento de El algoritmo md5
comprimir y se incluye el valor
obtenido dentro del fichero
comprimido. Despus de la Este algoritmo presenta como peculiaridades que tenga la dimensin que tenga la
descompresin se vuelve a aplicar cadena a la que se aplique genera siempre una huella digital que no es otra cosa que
el mismo algoritmo y se comparan una cadena formada por 32 caracteres y que no dispone de ningn mecanismo inverso.
ambos valores. La coincidencia
ser la garanta de que el fichero Seguramente habrs vivido esta experiencia. En muchos espacios de Internet grupos
obtenido es idntico al original. de noticias, cuentas de correo web, etctera que requieren un login y una contrasea
cuando utilizas la opcin de recuperar contraseas no te envan tu contrasea anterior,
sino que te generan y envan una nueva.

Esto ocurre porque, por razones evidentes de seguridad, las contraseas se almacenan
usando estas huellas digitales y resulta imposible recuperar los valores originales.

La nica solucin en estos casos es crear una nueva contrasea (suelen hacerlo con
las funciones de nmeros aleatorios), enviarla de forma automtica por correo electrnico
y sustituir el valor anterior del registro de usuarios por el resultado de la codificacin
md5 de la nueva contrasea.

Anterior Indice Siguiente


Etiquetas HTML

Dos interpretaciones
Un ejemplo

Recordemos que cuando un <?


documento tiene extensin php es /* definamos algunas variables de cadena
objeto de dos interpreta- ciones tal como se describe en sus contenidos
antes de ser visualizado en el e incluyamos caracteres especiales \n */
navegador. En primer lugar es PHP
quien ejecuta sus scripts y $cadena1="Este texto est escrito
devuelve al cliente el documento en varias lneas
resultante y, ms tarde, ser el y hemos saltado de una a otra
propio navegador quien realice una pulsando enter";
segunda interpretacin del
documento recibido cuyo
$cadena2="Aqu\nseparamos\nlas\nlneas\ncon\nsin\npulsar\nenter";
resultado ser la visualizacin de
la pgina.
$cadena3=<<<Prueba
Los saltos de lnea Nuevamente texto en varias lineas
ahora usando sintaxis de documento incrustado.
Cualquier salto de lnea que se Seguiremos probando
inserte en un documento ser Prueba;
respetado por PHP y enviado al
navegador, pero, como ste solo $cadena4=<<<OtraPrueba
entiende como tales sus propias
Ahora\ninsertar\nalgo\ncomo\nesto
etiquetas <br>, no sern
visualizados, aunque s estarn en
OtraPrueba;
el cdigo fuente de la pgina # definamos una variable conteniendo saltos de linea HTML
visualizada. # y vayamos construyendo una variable de salida
# en la que uniremos las variables anteriores insertando
Hemos de considerar un nuevo # entre ellas saltos de linea para facilitar la visualizacin
concepto. PHP permite utilizar # en el navegador
algunos caracteres especiales que $saltador="<br><br><br>";
son transformados durante la
ejecucin del script.
$salida=$cadena1.$saltador;
Uno de ellos no es el nico es $salida .=$cadena2.$saltador;
\n que es interpretado y $salida .=$cadena3.$saltador;
convertido por el intrprete de PHP $salida .=$cadena4.$saltador;
en un salto de lnea cuyo efecto # visualicemos el resultado
ser visible en el cdigo fuente del print $salida;
documento enviado al navegador, #apliquemos ahora a la variable salida
pero que por no ser una etiqueta # la funcion nl2br y veamos el resultado
<br> no producir efecto alguno print $saltador.nl2br($salida);
en la visualizacin de la pgina.

nl2br($A) ?>

Esta funcin inserta de forma


automtica etiquetas HTML de
salto de lnea (<br>). ejemplo22.php
Por cada salto de lnea que exista
en el texto de la cadena inserta Si ejecutas el ejemplo y visualizas el cdigo fuente a travs del navegador podrs
una etiqueta <br> en la salida observar como los resultados del primer print generan saltos de lnea en ste. Y en el
HTML. caso del cdigo correspondiente al segundo print, podrs visualizar etiquetas <BR />
strtr($a,$dicc) que son el resultado de la aplicacin de la funcin nl2br

Busca en la cadena $a las palabras Las cadenas y las etiquetas HTML


coincidentes con los ndices del
array asociativo ($dicc) y las Cadenas Sintaxis Resultado
sustituye por los valores Esto es
asociados a esos ndices. $a="Esto es\nun texto escrito\n en un texto escrito
nl2br($a)
varias lineas\nsin etiquetas<BR>"; en varias lineas
get_meta_tags($a) sin etiquetas<BR>
$dicc=array (
Devuelve un array asociativo "Lundi"=>"Lunes",
cuyos ndices son los valores de la Lunes es un dia bueno si
"good"=>"bueno", strtr($a,$dicc)
propiedad name de las etiquetas hace sol
"sun" =>"sol");
<meta> (escritas siempre en $a="Lundi es un dia good si hace sun"
minsculas, sin comillas, y
$b=get_meta_tags($a); Programacin, PHP, Apache,
reemplazando, en el caso de que $a=index.php"
echo $b[keywords] MySQL
fuera necesario, los caracteres
especiales por un guin bajo _) de $b=get_meta_tags($a); Materiales para un curso a
$a="index.php"
la pgina web cuya direccin echo $b[description] distancia
(absoluta o relativa) se indica en la
cadena $a.
$a="<H1>A</H1>" echo $a
A
Los valores de los elementos del
array son los contenidos de esas
etiquetas. echo htmlspecialchars
$a="<H1>A</H1>" <H1>A</H1>
($a)
htmlspecialchars($a)
La tabla de sustituciones de htmlspecialchars es esta:
Convierte en entidades de HTML
algunos caracteres (los que se Sustitye & por &amp;
indican a la derecha). Con ello se
consigue su visualizacin y se " por &quot;
impide que sean interpretados
como signos del lenguaje HTML. < por &lt;

htmlentities($a) > por &gt;


Es una funcin similar a la
anterior, pero en este caso afecta
a todos los caracteres que tienen Ejercicio n 16
equivalentes como entidad HTML
utilizando el juego de carcteres Modifica el script del ejercicio n 15 de forma que los saltos de lnea introducidos en el
ISO-8859-1. Recuerda que son textarea del formulario sean sustituidos por etiquetas <BR> de HTML.
stos.

Anterior Indice Siguiente


Operadores bit a bit

Comentario previo
Manejando operadores bit a bit
Incluimos la sintaxis de este tipo
de operadores a ttulo meramente Desarrollamos aqu algunos ejemplos de manejo de los operadores bit a bit.
informativo. Rara vez ser
necesario utilizarlos en nuestras El operador &
aplicaciones PHP.
Nmeros Nmeros como cadenas Cadenas alfanumricas
Su utilidad suele limitarse a la Valores
gestin de perifricos y algunas Variables Variables Valores binarios Variables Valores binarios
binarios
operaciones de clculo de carcter
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
muy reiterativo en la que se puede
conseguir un rendimiento muy $b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010
superior a los operadores $a&$b=4 100 $A&$B=02 110000110010 $A1&$B1=@R 10000001010010
tradicionales.
En los casos de cadenas hemos diferenciado en rojo el valor binario correspondiente al primer carcter.
En el mbito propio del PHP Esos valores binarios corresponden a la forma binaria del cdigo ASCII de cada uno de los caracteres
pueden tener algn inters a la
hora de elaborar rutinas para
encriptar el cdigo fuente de Puedes observar que el tratamiento es distinto cuando los mismos valores numricos
algunos scripts que por su se asignan como entero y como cadena.
importancia pueden requerir ese
tipo de proteccin. Al asignarlos como cadena opera los valores binarios de los cdigos ASCII de los
caracteres, mientras que cuando se trata de nmeros compara los valores de las
Los que s han de resultarnos de expresiones binarias de los valores de cada uno de ellos
gran inters sern el resto de los
operadores. Los iremos viendo en
pginas sucesivas. El operador |
Nmeros Nmeros como cadenas Cadenas alfanumricas
Operadores bit a bit Variables Valores binarios Variables Valores binarios Variables Valores binarios
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
$A & $B $b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010

El operador & compara los valores $a|$b=31 11111 $A|$B=33 110011110011 $A1|$B1=s{ 11100111111011
binarios de cada uno de los bits de
las cadenas $A y $B y devuelve 1 Se comporta de forma idntica al anterior en lo relativo a nmeros y cadenas.
en el caso que ambos sean 1, y 0
en cualquier otro caso.
El operador ^
Cuando las variables $A y $B son Nmeros Nmeros como cadenas Cadenas alfanumricas
cadenas compara los valores
binarios de los cdigos ASCII de Variables Valores binarios Variables Valores binarios Variables Valores binarios
sus caracteres y devuelve los $a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
caracteres ASCII correspondientes
$b=23 10111 $B="23" 110010110011 $B1="aZ" 11000011011010
al resultado de esa comparacin.
$a^$b=27 11011 $A^$B= 000011000001 $A1^$B1=3) 01100110101001
$A | $B

Funciona de forma idntica al Los criterios de tratamiento de nmeros y cadenas coinciden con los operadores
anterior y devuelve 1 cuando al anteriores.
menos el valor de uno de los bits
comparados es 1, y devolver 0 El operador <<
cuando ambos sean 0.
Nmeros Nmeros como cadenas Cadenas alfanumricas
$A ^ $B Variables Valores binarios Variables Valores binarios Variables Valores binarios

Devuelve 1 cuando los bits $a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
comparados son distintos, y 0 $b=2 10 $B=2 10 $B1=2 10
cuando son iguales.
$a<<b=48 110000 $A<<$B=48 110000 $A1<<$B1=0
$A << $B
El operador << multiplica el valor de la primera cadena por 2 elevado al valor de la
Realiza la operacin $A * 2$B. segunda.
Hace el clculo aadiendo $B
CEROS (binarios) a la derecha de
Al ser un operador matemtico solo tiene sentido cuando ambas variables son
la cadena binaria $A. nmeros naturales. En las cadenas alfanumricas extrae los nmeros que pudiera
haber al comienzo y, en caso de no haberlos, toma valor cero.
$A >> $B
El operador >>
Divide el valor $A entre 2$B.
Hace la operacin en la cadena Nmeros Nmeros como cadenas Cadenas alfanumricas
binaria quitando $B CEROS (por la Variables Valores binarios Variables Valores binarios Variables Valores binarios
derecha) de la cadena $A.
$a=12 1100 $A="12" 110001110010 $A1="Rs" 10100101110011
~ $A $b=2 10 $B=2 10 $B1=2 10

Invierte los valores de los bits de $a>>b=3 11 $A>>$B=3 11 $A1>>$B1=0


la cadena $A convirtiendo los
CEROS en UNO y los UNO en CERO. Para este operador (>>) son aplicables los mismos comentarios hechos en el prrafo
anterior.

El operador ~
$a=12 1100
~$a=-13 11111111111111111111111111110011

Anterior Indice Siguiente


Operadores de Comparacin

Antes de empezar
Manejando operadores de comparacin
Si es este tu primer contacto con
el mundo de la progra- macin es Desarrollamos aqu algunos ejemplos de manejo de los operadores de comparacin.
probable que ests pensando que
todo esto est muy bien pero que El operador ==
a t lo que te interesa es hacer
cosas. En una palabra, que quieres A B Operador Sintaxis Resultado
usar PHP como herramienta para $A=123 $B=123 == $A==$B 1
el desarrollo de tus proyectos. $A=123.0 $B=123 == $A==$B 1
Esta pgina y las siguientes van a $A=123 $B="123" == $A==$B 1
ser bsicas para el xito en ese $A=123 $B="123ABC" == $A==$B 1
lgico y razonable afn utilitarista.
$A=123 $B=124 == $A==$B
Pensemos en nuestro da a da. En $A=123 $B=124 == ord($A==$B) 0
cada momento de nuestra vida
$A="abc" $B="ABC" == $A==$B
hacemos algo. Cada cosa que
hacemos suele requerir casi $A="abc" $B="abc" == $A==$B 1
siempre esta secuencia de $A="abc" $B="abcd" == $A==$B
acciones: comparar, evaluar, optar
y hacer. Los valores de la columna sealada como Resultados se obtienen mediante la funcin echo($A==$B);
Podemos ver que, en los casos que es cierta la igualdad, imprime un 1, mientras que cuando es falsa
Supongamos que queremos no imprime nada.
cambiar de coche. Lo ms Se justifica este extremo porque en caso de no coincidencia el valor devuelto es NUL (cdigo ASCII 0)
prudente ser empezar por y ese carcter carece de smbolo grfico.
comparar las caractersticas Hemos marcado en rojo una excepcin.
(potencia, diseo, precio, etc.) de En ese caso, la instruccin es echo ord($A==$B); y como recordars dado que ord, que devuelve
el cdigo ASCII del caracter contenido en el parntesis que le acompaa, podemos comprobar a travs
los diferentes modelos.
del cero de este resultado, que, efectivamente, la no coincidencia devuelve NUL.
Salvo en casos excepcionales, no
tomaramos una decisin de
compra a travs de un solo El operador ===
parmetro sino que haramos una A B Operador Sintaxis Resultado
evaluacin conjunta de todos esos
factores (menos potencia pero $A=123 $B=123 === $A===$B 1
mejor precio y diseo muy similar, $A=123.0 $B=123 === $A===$B
por citar un ejemplo) y sera a
$A=123 $B="123" === $A===$B
travs de esa evaluacin como
optara- mos por una marca o $A=123 $B="123ABC" === $A===$B
modelo. $A=123 $B=124 === $A===$B

Una vez ejercida la opcin y no $A=123 $B=124 === ord($A===$B) 0


antes sera el momento de $A="abc" $B="ABC" === $A===$B
realizar la compra del nuevo coche.
$A="abc" $B="abc" === $A===$B 1
PHP, y en general todos los $A="abc" $B="abcd" === $A===$B
lenguajes de programacin,
disponen de herramientas que Observa que los valores sealados en rojo a diferencia de lo que ocurre con el operador anterior
permiten emular cada uno de esos devuelven NUL como resultado.
procesos de la conducta humana. En este caso no slo compara valores sino que tambin compara tipos de variables. Al ser una de ellas
tipo numrico y la otra cadena alfanumrica el resultado no puede ser otro que NUL.
Los iremos viendo en esta pgina y
en las siguientes.

El operador !=
Operadores de
A B Operador Sintaxis Resultado
comparacin
$A=123 $B=123 != $A!=$B

PHP dispone de los siguientes $A=123.0 $B=123 != $A!=$B


operadores de comparacin: $A=123 $B="123" != $A!=$B

$A == $B $A=123 $B="123ABC" != $A!=$B


$A=123 $B=124 != $A!=$B 1
El operador == compara los
$A=123 $B=124 != ord($A!=$B) 49
valores de dos variables y
devuelve 1 (CIERTO) en el caso de $A="abc" $B="ABC" != $A!=$B 1
que sean iguales y el valor NUL $A="abc" $B="abc" != $A!=$B
carcter ASCII 0 (FALSO) cuando
son distintas. $A="abc" $B="abcd" != $A!=$B 1

Mediante este operador se pueden En los ejemplos sealados en rojo Puedes comprobar el carcter no estricto de este operador.
Devuelve NUL porque considera que no son distintos, lo que equivale a interpretar que los considera
comparar variables de distinto tipo.
iguales pese a que las variables sean de distinto tipo.
Para comparar una cadena con un
nmero se extrae el valor entero
de la cadena (si lleva dgitos al El operador <
comienzo los extrae y en caso A B Operador Sintaxis Resultado
contrario le asigna el valor cero) y
utiliza ese valor para hacer la $A=123 $B=123 < $A<$B
comparacin. $A=123 $B="123" < $A<$B
$A=123.0 $B="123" < $A<$B
Cuando se comparan cadenas
discrimina entre maysculas y $A=123 $B="123ABC" < $A<$B
minsculas ya que utiliza los $A=123 $B=124 < $A<$B 1
cdigos ASCII de cada uno de los
caracteres para hacer la $A=123 $B=124 < ord($A<$B) 49
comparacin. $A="abc" $B="ABC" < $A<$B
$A="abc" $B="abc" < $A<$B
La comparacin se hace de
izquierda a derecha y devuelve 1 $A=" bcd" $B="abcd" < $A<$B 1
(CIERTO) slo en el caso que $A="aacd" $B="abcd" < $A<$B 1
coincidan exactamente los
contenidos de ambas cadenas. $A="abc" $B="abcd" < $A<$B 1
$A="abcd" $B="abc" < $A<$B
$A === $B
$A="A" $B="a" < $A<$B 1
El operador === es similar al $A="a" $B="A" < $A<$B
anterior, pero realiza la compa- $A="aBC" $B="A" < $A<$B
racin en sentido estricto.
$A="123" $B=124 < $A<$B 1
Para que devuelva 1 es necesario $A=123 $B="124" < $A<$B 1
que sean iguales los valores de las
variables y tambin su tipo. Observa los ejemplos sealados en rojo. Cuando las cadenas tienen distinta longitud este operador
considera que los caracteres que faltan en la cadena ms corta son NUL. Esa es la razn por la que en
$A != $B el primer caso devuelve CIERTO (NUL es menor que d) y el segundo FALSO (d no es menor que NUL).

El operador != devuelve 1 cuando


los valores de las variables son
distintos (en general ! indica
El operador <=
negacin, en este caso podramos A B Operador Sintaxis Resultado
leer no igual) y devuelve NUL $A=123 $B=123 <= $A<=$B 1
cuando son iguales.
$A=123.0 $B=123 <= $A<=$B 1
Este operador no compara en $A=123 $B="123" <= $A<=$B 1
sentido estricto, por lo que puede
$A=123 $B="123ABC" <= $A<=$B 1
considerar iguales los valores de
dos variables de distinto tipo. $A=123 $B=124 <= $A<=$B 1
$A=123 $B=124 <= ord($A<=$B) 49
$A < $B
$A="abc" $B="ABC" <= $A<=$B
El operador < devuelve 1 cuando $A="abc" $B="abc" <= $A<=$B 1
los valores de $A son menores
que los de $B . $A="abc" $B="abcd" <= $A<=$B 1
$A="A" $B="a" <= $A<=$B 1
Los criterios de comparacin son
los siguientes: $A="a" $B="A" <= $A<=$B
$A="aBC" $B="A" <= $A<=$B
Los valores numricos siguen el
$A="123" $B=124 <= $A<=$B 1
criterio matemtico.
$A=123 $B="124" <= $A<=$B 1
Cuando se trata de un nmero y
una cadena extrae el valor Hemos modificado la instrucciones marcadas en rojo para comprobar el cdigo ASCII de caracter que
numrico de sta (es cero si no devuelve, en el caso de ser cierto, el resultado de la comparacin. El valor que aparece (49) como
hay ningn dgito al principio de la resultado es el cdigo ASCII del carcter 1.
misma) y hace una comparacin
matemtica.
El operador >
En el supuesto de dos cadenas,
A B Operador Sintaxis Resultado
compara uno a uno de izquierda
a derecha los cdigos ASCII de $A=123 $B=123 > $A>$B
cada uno de los carcteres $A=123 $B="123" > $A>$B
(primero con primero, segundo
con segundo, etctera). $A=123 $B="123ABC" > $A>$B
$A=123 $B=124 > $A>$B
Si al hacer esta comprobacin
$A=123 $B=124 > ord($A>$B) 0
encuentra en la primera cadena
un caracter cuyo cdigo ASCII es $A="abc" $B="ABC" > $A>$B 1
mayor que el correspondiente de $A="abc" $B="abc" > $A>$B
la segunda cadena, o encuentra
que todos son iguales en ambas $A="abc" $B="abcd" > $A>$B
cadenas devuelve NUL. Solo en el $A="A" $B="a" > $A>$B
caso de no exitir ninguno mayor y $A="a" $B="A" > $A>$B 1
s haber al menos uno menor
devolver UNO. $A="aBC" $B="A" > $A>$B 1
$A="123" $B=124 > $A>$B
Cuando las cadenas tengan
distinta longitud, consider (a $A=123 $B="124" > $A>$B
efectos de la comparacin) que los
caracteres que faltan en la cadena
ms corta son NUL (ASCII 0). El operador >=
A B Operador Sintaxis Resultado
$A <= $B
$A=123 $B=123 >= $A>=$B 1
Se comporta de forma idntica al $A=123 $B="123" >= $A>=$B 1
anterior. La nica diferencia es que
$A=123 $B="123ABC" >= $A>=$B 1
ahora aceptar como ciertos los
casos de igualdad tanto en el caso $A=123 $B=124 >= $A>=$B
de nmeros como en el de cdigos $A=123 $B=124 >= ord($A>=$B) 0
ASCII.
$A="abc" $B="ABC" >= $A>=$B 1
$A > $B $A="abc" $B="abc" >= $A>=$B 1

Es idntico en el modo de $A="abc" $B="abcd" >= $A>=$B


funcionamiento a $A < $B. Solo $A="A" $B="a" >= $A>=$B
difiere de ste en el criterio de $A="a" $B="A" >= $A>=$B 1
comparacin que ahora requerir
que los valores de $A sean $A="aBC" $B="A" >= $A>=$B 1
mayores que los de la variable $B. $A="123" $B=124 >= $A>=$B

$A >= $B $A=123 $B="124" >= $A>=$B

Aade al anterior la posibilidad de


certeza en caso de igualdad.
Ejercicio n 17

Escribe un script en el que uses cada uno de los operadores de comparacin que hemos
descrito en esta pgina.
Eligiendo las variables adecuadas, debes escribir dos ejemplos para cada uno de los
operadores de modo que uno de ellos devuelva CIERTO y el otro FALSO.
Guarda el documento como ejercicio17.php y comprueba que su funcionamiento es
correcto y que los resultados de las comparaciones coinciden con lo que habas previsto.
Anterior Indice Siguiente
Operadores lgicos

Operadores lgicos
Operadores lgicos
Mediante operadores lgicos es
posible evaluar un conjunto de Aqu tienes las tablas de verdad de los distintos operadores lgicos.
variables lgicas, es decir, aquellas
cuyos valores sean nicamente: El operador AND
VERDADERO o FALSO (1 NUL).
Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
El resultado de esa evaluacin ser $x=$a>$b;$y=$a>$c;$z=$a>$f;
siempre 1 NUL. Ejemplo de sintaxis
echo ($x AND $y AND $z);

$A AND $B Otra sintaxis echo ($a>$b AND $a>$c AND $a>$f);


Condicin A Condicin B Condicin C A B C Resultado
El operador AND devuelve
$a>$b $a>$c $a>$f 1 1 1 1
VERDADERO (1) en el caso de que
todas las variables lgicas $a>$b $a>$c $a<$f 1 1
comparadas sean verdaderas, y $a>$b $a<$c $a>$f 1 1
FALSO (NUL) cuando alguna de
$a<$b $a>$c $a>$f 1 1
ellas sea falsa.
$a<$b $a<$c $a>$f 1
$A && $B
$a<$b $a>$c $a<$f 1
El operador && se comporta de $a>$b $a<$c $a<$f 1
forma idntica al operador AND. $a<$b $a<$c $a<$f
La nica diferencia entre ambos es
que operan con distinta
precedencia. El operador &&
Ms abajo veremos el orden de Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
precedencia de los distintos Condicin A Condicin B Condicin C A B C Resultado
operadores.
$a>$b $a>$c $a>$f 1 1 1 1
$A OR $B $a>$b $a>$c $a<$f 1 1

Para que el operador OR devuelva $a>$b $a<$c $a>$f 1 1


VERDADERO (1) es suficiente que $a<$b $a>$c $a>$f 1 1
una sola de las variables lgicas $a<$b $a<$c $a>$f 1
comparadas sea verdadera.
nicamente devolver FALSO $a<$b $a>$c $a<$f 1
(NUL) cuando todas ellas sean $a>$b $a<$c $a<$f 1
FALSAS.
$a<$b $a<$c $a<$f
$A || $B

El operador || se comporta de El operador OR


forma idntica al operador OR. Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
Su nica diferencia es el orden de Condicin A Condicin B Condicin C A B C Resultado
precedencia con el que opera.
$a>$b $a>$c $a>$f 1 1 1 1
$A XOR $B $a>$b $a>$c $a<$f 1 1 1

El operador XOR devuelve $a>$b $a<$c $a>$f 1 1 1


VERDADERO (1) slo en el caso de $a<$b $a>$c $a>$f 1 1 1
que sea cierta una sola de las
$a<$b $a<$c $a>$f 1 1
variables, y FALSO (NUL) cuando
ambas sean ciertas o ambas sean $a<$b $a>$c $a<$f 1 1
falsas. $a>$b $a<$c $a<$f 1 1

! $A $a<$b $a<$c $a<$f

Este operador NOT (negacin)


devuelve VERDADERO (1) si la El operador ||
variable lgica $A es FALSA y Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
devuelve FALSO (NUL) si el valor
Condicin A Condicin B Condicin C A B C Resultado
de esa variable $A es VERDADERO.
$a>$b $a>$c $a>$f 1 1 1 1
Sintaxis alternativa $a>$b $a>$c $a<$f 1 1 1
Tal como hemos descrito los $a>$b $a<$c $a>$f 1 1 1
distintos operadores lgicos sera $a<$b $a>$c $a>$f 1 1 1
necesario que $A y $B contuvieran
$a<$b $a<$c $a>$f 1 1
valores lgicos, y eso requerira un
paso previo para asignarles valores $a<$b $a>$c $a<$f 1 1
de ese tipo. $a>$b $a<$c $a<$f 1 1

Habra que recurrir a procesos de $a<$b $a<$c $a<$f


este tipo:

$A = $x>$y; El operador XOR


$B= $x >=$z; Variables $a=32; $b=0; $c=-7; $d=4.32; $f="23 Ptas"
$A && $B;
Condicin A Condicin B A B Resultado
pero se obtendra el mismo $a>$b $a>$c 1 1
resultado escribiendo:
$a>$b $a<$c 1 1
$x>$y && $x >=$z; $a<$b $a>$c 1 1
$a<$b $a<$c
que, aparte de ser la forma
habitual de hacerlo, nos evita dos
lneas de instrucciones. Ejemplo de uso de los operadores lgicos
Aunque el propio ejemplo se auto
comenta, digamos que al utilizar <?
operadores lgicos se pueden # asignemos valores a cuatro variables
sustituir las variables lgicas por $a=3;
expresiones que den como $b=6;
resultado ese tipo de valores.
$c=9;
$d=17;
Orden de precedencia # utilicemos operadores de comparacin
Cuando se usan los operadores # y recojamos sus resultados en nuevas variables
lgicos se plantean situaciones $x= $a<$b;
similares a lo que ocurre con las $y= $a<$b;
operaciones aritmticas. $z=$c>$b;
# apliquemos un operador lgico (por ejemplo &&)
Dado que permiten trabajar con # e imprimamos el resultado
secuencias de operaciones sera
posible, por ejemplo, una
print("Resultado FALSO si no sale nada: ".($y && $z)."<br>");
operacin de este tipo:
# hagamos la misma comparacin sin utilizar la variables $y y $z
$a<$b OR $c<$b && $a<3 # que deber darnos el mismo resultado
print("<br>Resultado FALSO si no sale nada: ".($a<$b && $c>$b)."<br>");
Surgiran preguntas con estas: /* veamos ahora que ocurre al ampliar la estructura
qu comparacin se hara qu ocurrira si escriberamos
primero OR &&? $a<$b OR $c>$b && $d<$a ?
se haran las comparaciones en
El operador && tiene preferencia ante OR,
el orden natural?
luego haria primero la comparacin $c>$b && $d<$a
alguno de los operadores tiene
prioridad sobre el otro? 9 > 6 es cierto, 17 < 3 es falso, luego como &&
solo devuelve cierto cuando ambos sean ciertos
Igual que en las matemticas, el resultado de esa opcin es FALSO.
tambin aqu, hay un orden de Veamos que ocurre al comparar $a<$b OR falso (resultado anterior)
prioridad que es el siguiente: como 3 < 6 es cierto OR operar con cierto y falso
que dar como resultado CIERTO, ya que basta que se
NOT, &&, ||, AND, XOR y, por
cumpla una de las condiciones */
ltimo, OR.
/* vamos a comprobarlo mediante este operador condicional
De esta forma la operacin && se no conocemos aun su sintaxis pero adelntemosla un poco...
realizara antes que ||, mientras si el el contenido del parntesis que va detrs del if es cierto
que si pusiramos AND en vez de imprimir cierto y en caso contrario imprimir falso
&& sera la operacin || la que se Aqui debera imprimirnos cierto */
hara antes y, por lo tanto, los if($a<$b OR $c>$b && $d<$a) {
resultados podran variar de un print "cierto<br>";
caso a otro. }else{
Aqu tambin es posible, de la print "falso<br>";
misma manera que en la }
aritmtica, utilizar parntesis para # Cambiemos la estructura anterior por $a<$b || $c>$b AND $d<$a
priorizar una operacin frente a # ahora se operar primero || que como antes dar cierto
otra. # pero ese resultado operado mediante AND con falso dar FALSO
# AL CAMBIAR LOS OPERADORES POR SUS SIMILARES el resultado el DISTINTO
Es muy importante prestar
atencin a la construccin correcta
if($a<$b || $c>$b AND $d<$a) {
de estas estructuras. Un descuido
en la atencin a las prioridades
print "cierto<br>";
puede ser origen lo es }else{
frecuentemente de resultados print "falso<br>";
incoherentes que suelen ser }
detectados bajo una apariencia # un parntesis nos devolver a la situacin anterior
aleatoria. # escribamos $a<$b || ($c>$b AND $d<$a)
# veremos que el resultado es CIERTO como ocurra en el primer caso
Ten muy en cuenta que al depurar
programas no siempre se ven
if($a<$b || ($c>$b AND $d<$a)) {
fcilmente este tipo de errores de
print "cierto<br>";
programacin.
}else{
Puede que para determinados print "falso<br>";
valores los resultados sean los }
esperados y que, sin embargo, al ?>
utilizar otros distintos pueda
manifestarse la incoherencia.
ejemplo23.php
Si te ocurriera esto no pienses que
es el ordenador el que est
haciendo cosas raras, procura
revisar los parntesis y los criterios Ejercicio n 18
de prioridad de los distintos
operadores contenidos en la Define tres variables: langosta, angula y caviar; y asgnales valores numricos.
estructura lgica. Luego, escribe una estructura lgica que devuelva cierto en el caso de que dos de ellas
superen los precios respectivos de: 50, 70 y 500, y falso en cualquier otro caso.
Comprubalo modificando los valores de las variables y viendo los resultados y gurdalo
como ejercicio18.php.

Anterior Indice Siguiente


Operadores de incremento

Operadores de incremento
Operadores de preincremento
Los caracteres ++ y -- escritos al
lado del nombre de una variable El operador ++$A
producen incrementos o
decrementos de una unidad en el Variables numricas Variables alfanumricas
valor de la misma. Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
inicial
De igual forma, los operadores
$a=23 echo ++$a 24 $b="pepe" echo ++$b pepf
+=n y -=n escritos a la derecha
del nombre de una variable $a=23 echo ++$a*2 48 $b="pepe" echo ++$b*2 0
producen incrementos o
decrementos de n unidades en el
valor de la variable. El operador $A
Variables numricas Variables alfanumricas
Como veremos a continuacin, los
operadores ++ y -- se comportan Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
de distinta forma segn estn inicial
situados a la izquierda o a la $a=23 echo $a 22 $b="pepe" echo --$b pepe
derecha de la variable. $a=23 echo --$a*2 44 $b="pepe" echo $b*2 0

Tipos vlidos
El operador $A +=n
Estas operaciones slo tienen Variables numricas Variables alfanumricas
sentido en variables numricas Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
enteras o no, pero, si se aplican a inicial
variables de cadena les asignan echo $a+=5; 28 echo $b+=5; 5
previamente valor cero, salvo en $a=23 $b="pepe"
echo $a 28 echo $b 5
una curiosa excepcin que puedes
ver en la primera de las tablas que echo 2*$a+=5; 56 echo 2*$b+=5; 10
$a=23 $b="pepe"
echo 2*$a 56 echo 2*$b 10
tienes aqu a la derecha.

Operadores de El operador $A =n
preincremento Variables numricas Variables alfanumricas
Valor
Sintaxis Resultado Valor inicial Sintaxis Resultado
++$A y --$A inicial
echo $a-=5; 18 echo $b-=5; -5
Este operador incrementa el valor $a=23 $b="pepe"
echo $a 18 echo $b -5
de la variable en una unidad (+1 o
-1) antes de ejecutar el contenido echo 2*$a-=5; 36 echo 2*$b-=5; -10
$a=23 $b="pepe"
echo 2*$a 36 echo 2*$b -10
de la instruccin.

$A+=n y $A-=n

Este operador incrementa el valor Operadores de post-incremento


de la variable en n unidades (+n o
-n) y luego ejecuta el contenido de
la instruccin.
El operador $A++
Valor inicial de la variable Sintaxis Resultado
Operadores de
echo $a++; 23
post-incremento $a=23
echo $a 24
echo 2*$a++; 46
$A++ y $A-- $a=23
echo 2*$a 48

Cuando los operadores ++ o --


estn situados a la derecha de la El operador $A--
variable los incrementos no se
producen hasta que se ejecute la Valor inicial de la variable Sintaxis Resultado
instruccin siguiente. echo $a--; 23
$a=23
echo $a 22
echo 2*$a--; 46
$a=23
echo 2*$a 44

Anterior Indice Siguiente


Operadores condicionales

Operadores condicionales
El operador if

Este tipo de operadores son el <?


autntico cerebro de cualquier # Definamos dos variables y lasignmosles valores.
aplicacin que desarrollemos en # Hubieran podido obteners por cualquier otro procedimiento:
PHP o en cualquier otro lenguaje # desde un array,
de programacin. # a travs de un formulario cuya action ejecute este script, etc.

Los operadores condicionales son $A=3; $B="3";


la herramienta que permite tomar if ($A==$B)
decisiones tales como: hacer o no
print ("A es igual B");
hacer, y tambin: hacer algo bajo
determinadas condiciones y otra
cosa distinta en caso de que no se # cualquier otra instruccin que incluyeramos de aqui
cumplan. # en adelante se ejecutara independientemente de que la condicin
# se cumpla no ya que esta forma de if (sin llaves)
# unicamente considera la primera instruccin
Condiciones # comprobmoslo en este otro supuesto

Aunque para simplificar los if ($A<$B)


ejemplos vamos a utilizar en ellos print ("A es menor que B");
una sola condicin, este operador print("<br>A no es menor que b, pero esto saldr<br>");
permite incluir como tal cualquier
print("Esta es la segunda instruccin. No la condicionar el if");
estructura lgica, del tipo que
?>
hemos visto en la pgina anterior,
por compleja que esta sea.
ejemplo24.php
Alternativas de sintaxis

Como iremos viendo a lo largo de <?


estas lneas, este operador permite $A=3; $B="3";
diferentes formas de sintaxis que # en este caso cerraremos entre llaves las lineas
podemos utilizar segn nuestra # que deben ejecutarse si se cumple la condicin
conveniencia.
if ($A==$B){
La forma ms simple es: print ("A es igual B");
if(condicin) echo "<br>";
..instruccin... ; echo "Este if tiene varias instrucciones contenidas entre
llaves";
Si se cumple la condicin }
establecida en el parntesis se # una sintaxis alternativa a las llaves
ejecutar la primera instruccin # sustituyamos la { por : y la } por endif
que se incluya a continuacin de if ($A==$B):
ella.
print ("A es igual B");
Cualquier otra instruccin que echo "<br>";
hubiera a continuacin de esa echo "Hemos cambiado {} por : endif";
primera no estara afectada por el endif;
condicional y se ejecutara en ?>
cualquier circunstancia.

Observa que, aunque hemos ejemplo25.php


puesto if(condicin) en una lnea
independiente, no lleva punto y
coma detrs. <?
if(condicin){ $a=5;
..instruccin 1... ; # observa que ponemos la etiqueta de fin de script
..instruccin 2... ; # despus de la llave de apertura
.... ; if ($a==5){ ?>
} <!-- Aqu estamos poniendo HTML puro
no estamos dentro del script PHP //-->
Es una ampliacin del caso <H1>Esto no ha sido interpretado por PHP</H1>
anterior. Cuando es necesario que
en caso de que se cumpla la
<!-- en la linea siguiente a este comentario
condicin o condiciones se
ejecute ms de una instruccin, se
volveremos a PHP para insertar la llave que indica el fin del if //-->
aade una { para indicar que <? } ?>
habr varias instrucciones, se
escriben estas y mediante } se <?
seala el final. # hagamos lo mismo cambiando {} por : endif
if ($a==5): ?>
if(condicin) : <!-- Aqu estamos poniendo HTML puro
..instruccin 1... ; no estamos dentro del script PHP //-->
..instruccin 2... ;
<H2>Esto tampoco sido interpretado por PHP</H2>
.... ;
endif;
<!-- en la linea siguiente a este comentario
Esta otra forma del condicional se volveremos a PHP para insertar la llave que indica el fin del if //-->
comporta como la anterior pero <? endif; ?>
con otra sintaxis. Se sustituye la
{ de apertura por : y la } de cierre
por endif
ejemplo26.php
if(condicion){ ?>
..Etiquetas HTML... ;
..HTML... ; La estructura if ... else
.... ;
<? } ?>
<?
PHP permite la utilizacin del $A=3; $B="4";
operador condicional if con esta if ($A==$B){
sintaxis. Una primer script PHP
#estas instrucciones se ejecutarian si se cumple la condicin
establece la condicin. Todo lo print ("A es igual B");
contenido entre ese primer script y
echo "<br>";
el de cierre: <?}?> ser cdigo
echo "Este if tiene varias intrucciones";
HTML (est fuera del script), que
se insertar en el documento slo }else{
en el caso de que se cumpla la # estas se ejecutarian en el caso de no cumplirse
condicin. # las condiciones epecificadas en el fi
print("A no es igual que B");
if(condicion) : ?> echo "<br>";
..Etiquetas HTML... ; echo ("La estructura de control se ha desviado al else");
..HTML... ; }
.... ;
<? endif; ?>
?>
Idntica a la anterior, con la
sintaxis : , endif.
ejemplo27.php

If ... else
<?
El operador condicional tiene una $a=3;
interesante ampliacin. En # observa que ponemos la etiqueta de fin de script
conjuncin con else permite # despus de los dos puntos
aadir instrucciones que slo if ($a==5): ?>
seran ejecutadas en caso de no <!-- Aqu estamos poniendo HTML puro
cumplirse la condicin. no estamos dentro del script PHP //-->
Esta nueva opcin se habilita <H1>Esto no es PHP. A es igual 5</H1>
mediante la siguiente sintaxis:
<!-- en la linea siguiente a este comentario
if(condicion){ volveremos a PHP para insertar el else seguido de dos puntos
... instrucciones... y cerramos de nuevo el script con ?>//-->
... a ejecutar cuando <? else: ?>
se cumple la condicin
} else {
<!-- Aqu ms HTML para el (else)
... instrucciones...
caso de que no se cumpla la condicin //-->
... a ejecutar cuando NO
se cumple la condicin <H2>Esto no es PHP. Es el resultado del ELSE</H2>
}
<!--
permitiendo tambin la sintaxis volveremos a PHP para insertar en endif que indica el fin del if //-->
alternativa :, endif, aunque en <? endif; ?>
este caso hay que hacer una
precisin -puedes verla aqu
debajo la llave de cierre que iba
delante de else se elimina y no es ejemplo28.php
sustituida por ningn caracter ni
smbolo especial.
El operador condicional ternario
<?if(condicion): ?>

... cdigo HTML <? $a=5;


... a ejecutar cuando ($a==8) ? ($B="El valor de a es 8"): ($B="El valor de a no es 8");
se cumple la condicin echo $B;
?>
<? else: ?>

... codigo HTML... Ejemplo con a=8 Ejemplo con a=5


... a ejecutar cuando NO
se cumple la condicin
La estructura if ... elseif... else
<? endif; ?>

En algunos casos resulta til y <? $a=1;


cmodo el uso de esta otra if ($a==1){
posibilidad de sintaxis: echo "El valor de la variable A es 1";
}elseif ($a==2){
(condicin) ? (opc1) : (opc2) echo "El valor de la variable A es 2";
Si se cumple la condicin se }elseif ($a==3){
ejecuta la opc1, pero en el caso echo "El valor de la variable A es 3";
de que no se cumpla se ejecutar }else{
la opc2. echo "La variable A no es 1, ni 2, ni 3";
}
?>
If ... elseif .. else

Otra posibilidad dentro de la Ejemplo con a=3 Ejemplo con a=-7


estructura de los operadores
condicionales es la inclusin de
elseif. <? $a=1;
if ($a==1): ?>
Esta es la sintaxis. (Dentro de ella
tienes los comentarios
<H1>A es igual a 1</H1>
explicativos). <? elseif($a==2): ?>
<H1>A es igual a 2</H1>
if(condicion1){ <? elseif($a==3): ?>
<H1>A es igual a 3</H1>
... instrucciones... <? else: ?>
... a ejecutar cuando
<H1>A no es igual ni a 1, ni a 2, ni a 3</H1>
se cumple la condicin1
<? endif;
}elseif(condicion2){ ?>

... instrucciones...
... a ejecutar cuando Ejemplo con a=2 Ejemplo con a=8
se cumple la condicin2
sin cumplirse condicin1

} else { Ejercicio n 19

... instrucciones... Disea un formulario ejercicio19a.php- con un input tipo texto en el que puedas escribir
... a ejecutar cuando NO nmeros. Al pulsar el botn de enviar debe llamar a un script ejercicio19b.php- que debe
se cumple ni la condicin1
decirnos si el nmero enviado fue: positivo, cero o negativo.
ni la condicion2
A la pgina ejercicio19b.php adele un enlace HTML que permita volver a la pgina
} anterior.

Condicionales anidados

El anidado no es otra cosa que el Ejercicio n 20


equivalente a los parntesis dentro
de parntesis en las matemticas. En el ejercicio n 10 puedes verlo pulsando aqu diseaste un cuestionario en el que
Y este operador lo permite, con formulabas dos preguntas. Utilizando un formulario similar, pero nicamente con la primera
una nica condicin, que vers en
esta muestra de sintaxis.
pregunta puedes modificarlo y guardarlo como ejercicio20a.php debes crear un script de
modo que al recibir el formulario muestre en pantalla Respuesta correcta Respuesta
if(condicin1){ incorrecta.
... instrucciones... Como es lgico, en ese script puedes llamarlo ejercicio20b.php debes incluir en una
if(condicin2){ variable el valor de la respuesta correcta y compararla con la recibida a travs del
... instrucciones...
formulario.
} else {

...instrucciones
}

}else{ Ejercicio n 21
... instrucciones...
...instrucciones... Ampla el ejercicio anterior a las dos preguntas que se formulaban en el n10. Ahora
} deberamos saber si ha sido correcta o no la respuesta a cada una de las preguntas.
Puedes llamar ejercicio21a.php y ejercicio21b.php a los documentos que crees para este
Observa que todo el bloque if..
else... marcado en azul se cierra ejercicio.
antes de abrir la opcin else
marcada en marrn. Es
obligatorio que as sea. De igual
forma, podramos insertar bloques Restringir accesos
sucesivos hasta llegar a crear una
estructura tan amplia como fuera Las variables predefinidas $_SERVER['HTTP_REFERER'] (en el caso de PHP 4.1.0 o
necesaria. superior) y $HTTP_SERVER_VARS['HTTP_REFERER'] (en todos los casos) recogen la
ruta completa de la pgina desde la que hemos accedido a la actual.
Como ves, todo un mundo de
posibilidades.
<?
Una aplicacin # el condicional if estable como condicin
a la seguridad # que el acceso a este script proceda de la direccion indicada
# en este caso hemos puesto como condicin que ese valor
En pginas anteriores hemos # sea la direccin de esta pgina
hecho algunas alusiones a la if($_SERVER['HTTP_REFERER']=="http://localhost/cursoPHP/php37.php"){
seguridad. # si accedemos desde esta pgina, el enlace que tienes aqui debajo
# veremos que aparece este print, es decir se visualizara todo
Decamos que los envos de
# lo contenido antes del else
informacin por medio de los
formularios no eran seguros print "ejecuto sin problemas el script";
porque, dada la transparencia de }else{
su cdigo, pueden ser # si accedes desde un sitio diferente te aparecer este mensaje
reproducidos y utilizados desde # puedes probar escribiendo en tu navegador
cualquier otro sitio distinto a # http://localhost/cursoPHP/ejemplo35.php
nuestro servidor. # y comprobars que aparece este mensaje
"No puedes ver esta pagina";
Una sencillo condicional puede
exit;
resolver ese problema. Lo puedes
}
ver en el ejemplo que tienes aqu a
la derecha. ?>

La funcin exit()
PHP dispone de una funcin exit()
ejemplo35.php
muy til a los efectos del
comentario anterior. Anterior Indice Siguiente

Cuando se ejecuta exit() se


interrumpe la ejecucin del script
con lo que la respuesta del
servidor a la peticin del cliente
incluir nicamente los contenidos
generados antes de su ejecucin.
La funcin switch

La funcin switch
La estructura switch

Una alternativa al uso de <?


condicionales del tipo if es la # esta es la variable que controlar la funcin switch
funcin switch. $i=1;

Se trata de un condicional que switch ($i) {


evala una variable y, segn su
valor, ejecuta unas instrucciones u #insertamos la etiqueta case 0 y a continuacin
otras. # las instrucciones correspondientes
Su sintaxis es la siguiente:
case 0:
switch ( variable ) { print "i es igual a 0 - No he puesto el break<br>";

case n1: # insertamos la etiqueta case 1 y a continuacin


instrucciones caso n1...
# las instrucciones correspondientes
.....................
# como no hemos puesto break y en este ejemplo $i=1
# se ejecutarn todas las instrucciones escritas
case n2: # de aqu en adelante
instrucciones caso n2...
..................... case 1:
print "i es igual a 1 - No he puesto el break<br>";
}
case 2:
Cuando se usa esta sintaxis slo se print "i es igual a 2 - No he puesto el break<br>";
ejecutan aquellas instrucciones
que han sido incluidas a partir de };
la etiqueta en la que el nmero # ahora incluiremos break al final de las intrucciones de cada case
que sigue a case coincide con el # con ello lograremos que solo se ejecuten las intrucciones
valor de la variable. correspondientes
La forma ms habitual de uso de
# a cada uno de ellos
esta funcin es esta: switch ($i) {
case 0:
switch ( variable ) { print "i es igual a 0 - Ahora lleva break<br>";
break;
case n1: case 1:
instrucciones caso n1...
print "i es igual a 1 - Ahora lleva break<br>";
.....................
break;
break;
case 2:
case n2: print "i es igual a 2 - Ahora lleva break<br>";
instrucciones caso n2... break;
..................... }
break; ?>
}

Esta opcin incluye antes de cada ejemplo36.php


nuevo case la funcin de ruptura
break. Cuando PHP encuentra el
break interrumpe la ejecucin y
<? $i=3;
no la reanuda hasta la instruccin
siguiente a la } que cierra la switch ($i) {
funcin switch. case 0:
print "La variable i es 0<br>";
Insertando break en cada una de break;
las opciones case, slo se case 1:
ejecutaran las instrucciones print "La variable i es 1<br>";
contenidas entre case num y ese break;
break. case 2:
default: print "La variable i es 2<br>";
break;
Bajo este nombre (default:) se # al intoducir default y dado que $i=3 se ejecutarn
pueden incluir dentro de la # las instrucciones contenidas aqu ya que la variable
funcin switch un conjunto de # no coincide con ninguno de los case establecidos
instrucciones que solo sern default:
ejecutadas en el caso que el valor print "La variable i es mayor que dos o menor que cero";
de la variable no coincida con
break;
ninguno de los case. Su
comportamiento es equivalente a
}
else en el condicional if. ?>

ejemplo37.php

Anterior Indice Siguiente


Bucles while

Los bucles
La instruccin while

La necesidad de repetir la <?


ejecucin de instrucciones es algo # asignemos un valor a la variable $A
habitual en el mundo de la $A=0;
programacin. /* establezcamos la condicin menor que cinco
e insertemos dentro de la instruccin algo que modifique
Frente a la alternativa poco el valor de esa variable de modo que en algun momento
prctica de rescribir esas deje de cumplirse la condicin;
instrucciones todos los lenguajes de no ocurrir esto, el bucle se repetira indefinidamente
de programacin disponen de
en este ejemplo el autoincremento ++ de la variable
funciones que pueden ejecutar un
bloque de instrucciones de forma har que vaya modificandose su valor*/
repetitiva.
while ($A<5) echo "El valor de A es: ",$A++,"<br>";
# comprobemos que este while solo ejecuta una instruccin
La instruccin while # la delimitada por el punto y coma anterior
print("Esto solo aparecer una vez. While no lo incluye en su bucle");
Como ocurra en el caso de if, el ?>
parmetro condicin permite
cualquier estructura lgica, y
tambin dispone de distintas ejemplo38.php
opciones de sintaxis.

while(condicin)
<?
...instruccin
$A=0;
Con esta sintaxis estaremos /* utilicemos ahora el bucle para crear un tabla HTML
indicando que la instruccin empecemos escribiendo la etiqueta de apertura de esa tabla
siguiente (slo una instruccin) ha fuera del bucle (ya que esa se repite una sola vez)
de ejecutarse continua y y utilicemos el bucle para escribir las celdas y sus contenidos */
repetidamente hasta que deje de
cumplirse la condicin establecida. print ("<table width=300 border=2>");
while(condicin){
...instruccin while ($A<=5){
..... echo "<tr><td align=center>";
} print $A;
# esta instruccin es importantisima
De forma similar a la utilizada en # si no modificamos el valor de $A el bucle sera infinito
el caso de if, tambin en este $A++;
caso, las llaves hacen la funcin de print("</td></tr>");
contenedores de las instrucciones }
cuya ejecucin debe repetirse
# cerremos la etiqueta table
mientras se cumpla la condicin.
print "</table>";
while(condicin): ?>
...instruccin
.....
endwhile; ejemplo39.php

Tambin aqu se mantiene la


similitud con la sintaxis del <?
condicional if. # utilicemos whiles anidados para construir una tabla de
La llave ({) pueden sustituirse por $filas=5; $columnas=3;
(:) y en este caso en vez de (})
# insertemos la etiqueta de apertura de la tabla
habra que escribir endwhile.
print ("<table border=2 width=400 align=center>");
while(condicin) : ?> # un primer while rojo que utiliza la condicin filas mayor que cero
...etiquetas HTML # en este caso, la variable tendr que ir disminuyendo su valor con
..... $filas--
<? endwhile; ?> # para escribir las etiquetas y
# y el modificador de la variable filas
Tambin while permite cerrar el
# y un segundo while (magenta) para insertar las etiquetas correspondientes
script PHP despus de (:) o de la
# a las celdas de cada fila
sintaxis alternativa ({) e insertar
etiquetas HTML, indicando ms
tarde el final del bucle con <? } ? while ($filas>0):
> o <? endwhile; ?>, segn echo "<tr>";
proceda. $filas--;
while ($columnas>0):
echo "<td>";
Whiles anidados
print "fila: ".$filas." columna: ".$columnas;
print ("</td>");
Una nueva similitud sintctica con $columnas--;
if. En el caso de while tambin es endwhile;
posible insertar un while dentro de
/* muy importante!. Tendremos que reasignar a la variable columnas
otro while utilizando una sintaxis
de este tipo:
su valor inicial para que pueda ser utilizado en la proxima fila
ya que el bucle (magenta) va reduciendo ese valor a cero
while(condicin1): y en caso de no restaurar el viejo valor no volvera a ejecutarse
...instruccin ya que no cumple la condicin de ser mayor que cero */
while(condicin2) { $columnas=3;
...instruccin echo "</TR>";
..... endwhile;
} # por ultimo la etiqueta de cierre de la tabla
.....
print "</table>";
endwhile;
?>
En esta descripcin hemos
utilizado dos sintaxis distintas. Por
si acaso dudaras de si es necesario ejemplo40.php
o no hacerlo de esa forma, te
diremos que no es necesario Insertando condicionales en un bucle while
nunca. El hecho de la anidacin no
limita un pice las posibilidades de En este nuevo ejemplo hemos modificado ligeramente el anterior, incluyendo un
la sintaxis. condicional if. No incluimos aqu el cdigo fuente para evitarte la monotona de repetir
ntegramente y con ligeras modificaciones el supuesto anterior.
Ver cdigo fuente
PHP dispone de la funcin
Para visualizar ese cdigo bastar que pulses en el enlace Ver cdigo fuente. Las
modificaciones que hemos introducido aparecen marcadas y podrs localizarlas rpidamente.
show_source('pag');
Utilizaremos a menudo esta forma de visualizacin del cdigo fuente de los scripts. Es
que permite visualizar el cdigo una opcin de uso muy simple, utilizando la funcin show_source(), la que aprovechamos
fuente del documento que se para comentar al margen.
indica en el parmetro pag.
Es muy til para los propsitos de Ver nuevo ejemplo Ver cdigo fuente
este curso, pero presenta un
problema de seguridad.

Si escribes en el parmetro pag Ejercicio n 22


la direccin completa de una web
cualquiera (que tenga extensin Escribe un script ejercicio22.php en el que, mediante un bucle while, construya una tabla
php) se visualizar su contenido,
cuyas celdas tengan como colores de fondo una escala de grises que comience en RGB(0,0,0)
salvo que el PHP instalado en el
servidor que la aloja la tenga y acabe en RGB(255,255,255) a intervalos de 5 unidades.
expresamente desactivada.
Recuerda que los diferentes tonos de grises se forman combinado valores iguales de los tres
Recuerda... colores primarios.
En HTML se puede asignar el color
fondo a una celda incluyendo
bgcolor=RGB(x,y,z) dentro de la
etiqueta <TD>.
Anterior Indice Siguiente
x, y ,z son los valores de las
componentes de cada color
primario.
Bucles do ... while

El bucle do... while


El bucle do ... while
Estamos ante una variante del
bucle while que hemos visto en la <?
pgina anterior. $A=0;
do {
La sintaxis es la siguiente: ++$A;
echo "Valores de A usando el do: ",$A,"<br>";
do {
...intruccin 1... } while($A<5);
.... instruccion2... $B=7;
} while(condicin) ; do {
echo "Pese a que B es mayor que 5 se ejecuta una vez. B= ",$B,"<br>";
Se diferencia de while en que en } while($B<5);
este caso se comprueba la ?>
condicin despus de haber
ejecutado las instrucciones
contenidas en el bucle, con lo cual,
en el caso de que desde el ejemplo42.php
comienzo no se cumplieran las
condiciones establecidas en while,
las instrucciones del bucle se
<?
ejecutaran una vez.
$A=500;
Respecto a la sintaxis, como do {
puedes observar, detrs de do se if ($A>=500) {
inserta una llave ({) que seala el echo "No puede ejecutarse el bucle, porque no se cumple la condicion";
comienzo de las instrucciones break;
pertenecientes al bucle. El final de }
esas instrucciones lo seala la otra ++$A;
llave (}) que precede a while echo "Valores de A usando el do: ",$A,"<br>";
(condicin).

break } while($A<500);
echo "<BR>He salido del bucle porque A es: ",$A;
La funcin break de forma ?>
similar a lo que ocurra en switch
permite interrumpir la ejecucin de
bucle. ejemplo43.php

Tal como puede verse en el


ejemplo, podra entre otras
El ejemplo que tienes aqu debajo es similar al ejemplo n 40 de la pgina anterior.
posibilidades utilizarse para evitar
Slo hemos sustituido los bucles while que all habamos utilizado por otros del tipo do ...
la primera ejecucin de las
instrucciones contenidas en el while.
bucle, en el caso de que, desde un ejemplo44.php Ver cdigo fuente
primer momento, no se cumplieran
las condiciones establecidas en
while. No lo hemos comentado en la pgina anterior pero break se comporta en el caso de
while de forma idntica a la descrita aqu.

Anterior Indice Siguiente


Bucles for

El bucle for
La estructura for

Se trata de una nueva forma de Aqu tienes algunos ejemplos de las diferentes variantes del bucle for.
uso bastante habitual que
permite establecer un bucle que se <?
repetir mientras una variable for ($i = 1; $i <= 10; $i++) {
numrica se mantenga dentro de print $i."<br>";
intervalo -establecido en la sintaxis }
del propio bucle indicndose,
?>
tambin en la propia instruccin, el
criterio de modificacin de esa
variable en cada ejecucin del ejemplo45.php
bucle.

La sintaxis es la siguiente:
<?
for ( desde ; hasta ; incre ){ for ($i = 1;;$i++) {
......... if ($i > 10) {
...instrucciones.... break;
......... }
}
print $i."<br>";
El parmetro desde permite }
asignar un valor inicial a una ?>
variable ($var=num) que har
funciones de controladora de
iteraciones. ejemplo46.php

El parmetro hasta establece la


condicin que limita el valor <?
mximo que puede alcanzar la $i = 1;
variable de control. for (;;) {
El parmetro incre (con una if ($i > 10) {
sintaxis del tipo $variable++; break;
$variable--; ++$variable -- }
$variable; $variable +=n o print $i."<br>";
$variable -=n establece los $i++;
incrementos o decrementos de la }
variable controladora en cada ?>
iteracin del bucle.

Las intrucciones contenidas entre ejemplo47.php


{ } sern ejecutadas cada vez que
se reitere el bucle.
<?
Variantes del bucle for for ($i = 1; $i <= 10; print $i."<br>", $i++) ;
?>
El bucle for permite algunas
variantes respecto a su forma ms
general. Son estas:
ejemplo48.php

for ( desde ; ; incre ){


......... <?
...instrucciones.... for($i = 1; $i <=10;$i++):
......... echo $i,"<br>";
} endfor;
En este caso se omite el valor del
?>
parmetro hasta (observa que no
se omite el separador de
ejemplo49.php
parmetros (;) con lo que en
realidad se est asignando a hasta
el valor NUL.
<? for ($i = 1; $i <= 10;$i++):?>
Cuando se utiliza esta sintaxis, el <H1>Esto se repetir 10 veces</H1>
bucle se repetira de forma <? endfor; ?>
indefinida (la variable podra
tomar cero como valor, pero, cero
es distinto de NUL) salvo que -tal ejemplo50.php
como puedes ver en el ejemplo- se
escriba en las instrucciones un Como puedes observar en este ltimo ejemplo tambin es aplicable aqu la sintaxis de
operador condicional con una
los dos sripts PHP. El primero contiene las instrucciones del bucle y el segundo seala el
opcin de ruptura del bucle -el
famoso break que ya hemos visto
final del mismo.
al estudiar la instruccin while y Entre ambos scripts se escribe el cdigo HTML
otras anteriores.
Cuidado!
for ( ; ; ){
......... A la hora de programar bucles hay que evitar el riesgo de convertirlo en un bucle indefinido.
...instrucciones....
Cuando esto ocurre el error es humano al abrir la pgina que lo contiene parecer que
.........
} nuestro navegador se ha quedado colgado aunque en realidad estar esperando a que sea
En este caso no se inserta ningn atendida la peticin.
parmetro pero si se escriben los ; Si llega a plantersete ese problema, tendrs que recurrir a la socorrida solucin de pulsar
delimitadores de los mismos. ALT+CTRL+DEL para abortar la peticin del navegador.
Si observas el ejemplo vers que
el control se realiza fuera del for.
El valor de la variable contador se
asigna fuera del bucle, los Ejercicio n 23
incrementos de esa variable estn
escritos en las lneas de
Siguiendo criterios similares a los del ejemplo n 40 elabora un script que permita construir
instrucciones y llevan un
una tabla de 5 filas y 7 columnas que contengan los sucesivos nmeros naturales desde 1
operador condicional con la
hasta 35. Utiliza bucles del tipo for, que igual que while y do while permiten ser anidados.
funcin break para permitir la
salida.
Gurdalo como ejercicio23.php

for( desd ; hast ; inst, incr )

Esta nueva variante de for permite Ejercicio n 24


insertar instrucciones a travs del
tercer parmetro de la funcin. En este ejercicio ejercicio24.php trataremos de crear una tabla como la anterior, esta vez
Si insertamos como tercer de una sola fila y seis columnas, conteniendo cada celda un nmero aleatorio comprendido
parmetro una conjunto de entre 1 y 49 en la que habremos de evitar la posibilidad de que un nmero se repita dos
instrucciones, separadas por veces (podra ser una forma de rellenar la primitiva).
comas, se ejecutarn de igual
forma que si estuvieran contenidas Para ello te sugerimos que guardes en un array los valores de los nmeros aleatorios que
entre { y } se van generando y que, antes de guardar cada uno de ellos, se ejecute un bucle que
compruebe si entre los registrados ya existe un valor igual al obtenido. Si no existiera ese
En este caso, el modificador de la
variable de control (incr) se
valor se guardara el dato, en caso contrario se repetira la extraccin.
incluye como una instruccin ms
separada por una coma de las
contenidas en ese tercer Anterior Indice Siguiente
parmetro de la funcin.

for ( desde ; hasta ; incre ):


.........
...instrucciones....
.........
endfor;

Esta sintaxis es alternativa a la


primera de las descritas. Sustituye
la { por dos puntos (:) y la } por
endfor.
Bucles foreach

El bucle foreach
El bucle foreach

El bucle foreach es especfico de <?


los array y aplicable a ellos tanto /* definimos un array escalar utilizando la sintaxis
si son escalares como si son de nombre del array=array (valores de los elemento separados por comas)
tipo asociativo. si los valores son nmeros no es necesario encerrarlos entre comillas */
$a=array("a","b","c","d","e");
Tiene dos posibles opciones. En /* definamos ahora un nuevo array, esta vez asociativo
una de ellas lee nicamente los utilizando la sintaxis clave => valor tal como puedes ver */
valores contenidos en cada $b=array(
elemento del array. En el otro caso
"uno" =>"Primer valor",
lee adems los ndices del array.
"dos" =>"Segundo valor",
"tres" =>"Tecer valor",
Lectura de valores );
# establecemos el bucle que leer el array $a
Utiliza la sintaxis: # recogiendo en la variable $pepe los valores extraidos
# y escribimos lo valores
foreach( array as var ){ foreach($a as $pepe) {
...instrucciones... echo $pepe,"<br>";
}
};
donde array es el nombre del # repetimos el mismo proceso, ahora con $b que es un array asociativo
array (sin incluir ndices ni foreach($b as $pepe) {
corchetes), as es una palabra echo $pepe,"<br>";
obligatoria y var el nombre de una };
variable (puede ser creada al ?>
escribir la instruccin ya que no
requiere estar previamente
definida). ejemplo51.php
Las instrucciones escritas entre las
{ } permiten el tratamiento o
visualizacin de los valores <?
obtenidos. $a=array("a","b","c","d","e");
La variable var no podr ser $b=array(
utilizada para guardar valores.
"uno" =>"Primer valor",
Hemos de tener en cuenta que su
valor se rescribe en cada iteracin "dos" =>"Segundo valor",
del bucle y que al acabar este slo "tres" =>"Tecer valor",
contendr el ltimo de los valores );
ledos.
# en este caso extraeremos ndices y valores de ambos arrays
# usaremos $pepe para recoger los ndices y $pepe para recoger los
Lectura de ndices y
valores
valores # y separaremos ambas variables por => que es el separador obligatorio
# para estos casos
Con una sintaxis como la que sigue
se pueden leer no slo los valores foreach($a as $pepe=>$pepa) {
de un array sino tambin sus echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
ndices.
};
foreach( array as v1 => v2 ) { foreach($b as $pepe=>$pepa) {
...instrucciones... echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
} };
?>
donde array es el nombre de la
matriz, as es una palabra
obligatoria, v1 es el nombre de la ejemplo52.php
variable que recogern los ndices,
los caracteres => (son
obligatorios) son el separador El bucle foreach en arrays bidimensionales
entre ambas variables y, por
ltimo, v2 es el nombre de la <?
variable que recoge el valor de # definamos un array bidimensional
cada uno de los elementos del
$z=array(
array.
0 => array (
Tanto esta funcin como la 0 => 34,
anterior realizan una lectura 1 => 35,
secuencial que comienza en el 2 => 36,
primer valor del array. ),
1 => array (
Arrays bidimensionales 0 => 134,
1 => 135,
2 => 136,
Cuando se trata de arrays
)
bidimensionales la lectura de los
valores que contienen sus );
elementos requiere el uso de dos # intentemos leer indices y valores mediante un bucle foreach
bucles anidados. # y veamos como los valores que extraemos son Arrays (unidimensionales)
# consecuencia del caracter bidimensional del array original
Cuando un array de este tipo es
sometido al bucle foreach se foreach($z as $pepe=>$pepa) {
extrae como ndice el primero de echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
ellos y como valor un array };
unidimensional que tiene como
/* anidemos dos bucles foreach de la siguiente forma
ndice el segundo del array
original y como valor el de aqul. en el primero extraemos un array que es tratado por
el segundo foreach para extraer el segundo indice
La lectura de los valores de cada y el valor realmente contenido en ese elemento bidimensional */
elemento requiere utilizar un foreach($z as $ind1=>$valor1) {
segundo bucle que los vaya foreach($valor1 as $ind2=>$valorReal) {
extrayendo a partir del array echo "Ind. 1: ",$ind1,"Ind. 2: ",$ind2," Valor: ",$valorReal,"<br>";
unidimensional obtenido por medio
};
del bucle previo. };
La sintaxis sera de este tipo:
?>
foreach($a as $i1=>$na){

foreach($na as $i2=>$val){ ejemplo52a.php

..$i1 es el primer ndice...


..$i2 es el segundo ndice...
..$na nuevo array Ejercicio n 25
..$valor es el valor
.... Crea un array bidimensional que contenga los nombres de cinco alumnos y las
} calificaciones de tres materias (biologa, fsica y latn por ejemplo). El primer ndice puede
} ser el nmero de lista y los segundos pueden ser de tipo asociativo ('nombre', 'biologia',
'fisica', 'latin', por ejemplo). Asgnales valores a los elementos del array y completa el script
En el caso de arrays con
dimensiones superiores sera de forma que se visualice un listado con los nombres de los alumnos y las calificaciones de
necesario proceder del mismo cada una de las materias.
modo, y habra que utilizar tantos
bucles foreach como ndices
contuviera el array. Anterior Indice Siguiente
La instruccin continue

La instruccin continue
Ejemplos de continue

Si la instruccin break permite


interrumpir el desarrollo de un
<?
bucle, mediante continue se puede
for ($i=0;$i<=10;$i++){
impedir que, bajo unas condiciones
determinadas, se ejecuten algunas
o todas las instrucciones de un #condicion de multiplo de 2
bucle sin que por ello se if ($i % 2 ==0 ) {
interrumpa la ejecucin de las continue ;
iteraciones siguientes. }

Esta instruccin es aplicable tanto echo "La variable I vale ",$i,"<br>";


a bucles for como a los de tipo }
while o do while.
?>
Seguramente los ejemplos nos
ayudarn a aclarar un poquito ms
la idea. En todos ellos hay un
ejemplo53.php
condicional que contiene la
funcin continue.
<?
El primero de ellos (un bucle for) $i = 0;
tiene como condicin: $i % 2 == while ($i++ < 14) {
0, que, como recordars, significa
que el resto de la divisin de $i #condicion de no multiplo de 3 usando para distinto la sintaxis !=
entre dos($i % 2) sea igual (==) a
cero.
if ($i % 3 !=0){
En este supuesto (condicin de continue ;
mltiplo de dos) se activar la }
opcin continue y por lo tanto en
esa iteracin no se ejecuta la echo "El valor de i es: ",$i,"<br>";
instruccin echo o, lo que es lo }
mismo, no se imprimirn en
pantalla los mltiplos de 2. ?>
En el segundo ejemplo (caso de
bucle while) la condicin
establecida para que se ejecute
ejemplo54.php
continue es que el valor de la
variable no sea mltiplo de tres,
en cuyo caso echo slo imprimir
los mltiplos de 3. <?
$i = 0;
El tercer ejemplo utiliza un bucle do {
do ... while para presentar en
pantalla los mltiplos de 11. # condicion de no multiplo de 11. fijate en la sintaxis alternativa
# observa que aqu distinto lo hemos escrito <>
La instruccin
continue n if ($i % 11 <>0 ){
continue ;
La instruccin continue puede
}
utilizar un parmetro n con valor
entero positivo que cuando no se echo "El valor de i es: ",$i,"<br>";
indica toma por defecto el valor 1.
}while ($i++ < 100)
La idea es la siguiente. Cuando ?>
tenemos bucles anidados el
intrprete de PHP los considera
numerados correlativamente de
dentro hacia fuera a partir de ejemplo55.php
UNO.

Cuando es ejecutada continue n


se redirecciona la iteracin al
Ejemplos de continue n
bucle, cuyo nmero coincide
con el valor de n.

Obviamente, el valor de n no <?


puede ser nunca mayor que el $j=0;
nmero de bucles anidados en el while (++$j <5) {
script. for($i=1;$i<5;$i++){
Analicemos los ejemplos que
tenemos a la derecha. if ($i==3){
continue 2;
En el primer caso el bucle for sera }
el UNO y el while sera el DOS. echo "El valor de j es: ",$j, " y el de i es: ",$i,"<br>";
Cuando se cumpla la condicin que
activa continue 2, se redirecciona
la iteracin al paso siguiente }
del bucle DOS, en el caso del }
ejemplo al paso siguiente de while. ?>

En el segundo ejemplo, como


puedes ver, hemos anidado a tres
niveles y hemos escrito continue 3, Caso continue 1 Caso continue 2
aunque a la hora de ejecutar los
ejemplos podrs ver las tres
variantes posibles de ese script <?
modificando los valores del n de $j=0;$k=0;
continue.
do {
while (++$j <=5) {
Fjate en un matiz importante.
Cuando el intrprete lee la for($i=1;$i<=5;$i++){
instruccin for por primera vez lo
hace a partir del valor inicial de la if ($i==2){
variable que controla las continue 3;
iteraciones, pero ni do... while ni }
while tienen esa opcin dado que echo "El valor de k es: ",$k,
por s mismos no modifican las " y el valor de j es: ",$j, " y el de i es: ",$i,"<br>";
variables de control.
Estos trabajan con condiciones
mientras que for lo hacen con su
}
variable de control.
}
Esa es la razn por la que en los }while ($k++ <=5);
ejemplos de los casos continue 1 ?>
y continue 2 la variable k no pasa
del valor 0, ya que al sobrepasar j
el valor 5, el bucle while no se
ejecuta. Caso continue 1 Caso continue 2 Caso continue 3

Si quieres que esas variables se


reinicien al modo de for tendrs
que aadir dentro del if que
Anterior Indice Siguiente
contiene el continue
correspondiente y antes de
continue una lnea donde asignes
a esas variables su valor inicial.
Informacin sobre variables

Obtener informacin
sobre variables
Tamaos de arrays

Veremos aqu algunas de las


mltiples funciones que nos
<?
permiten obtener informacin
$a=array("Lunes","Martes","Miercoloes","Jueves",
sobre arrays y variables.
"Viernes","Sbado","Domingo");
sizeof(variable) $b=array(
"Precio" => "17340 euros",
La funcin sizeof devuelve el "Color" => "Rojo",
nmero de elementos de un array. "Llantas" => "Aluminio");
Si se aplica sobre una variable (no $c=47; $d=""; $e=array();
array) devolver uno y tanto si se
aplica sobre un array vaco, una echo "<h3>Valores usando sizeof()</h3>";
variable con valor nulo o sobre una
variable no definida, devolver echo " a tiene: ",sizeof($a)," elementos<br>";
cero. echo " b tiene: ",sizeof($b)," elementos<br>";
echo " c tiene: ",sizeof($c)," elementos<br>";
count(variable) echo " d tiene: ",sizeof($d)," elementos<br>";
Tiene idntica funcionalidad a la de echo " e tiene: ",sizeof($e)," elementos<br>";
sizeof. echo " f tiene: ",sizeof($f)," elementos<br>";

isset(variable) echo "<h3>Valores usando count()</h3>";


echo " a tiene: ",count($a)," elementos<br>";
La funcin isset comprueba si una
echo " b tiene: ",count($b)," elementos<br>";
variable est definida o no lo est.
echo " c tiene: ",count($c)," elementos<br>";
Si lo est incluso con valor nulo o
como array vaco isset devolver echo " d tiene: ",count($d)," elementos<br>";
UNO, en caso contrario devolver echo " e tiene: ",count($e)," elementos<br>";
NUL. echo " f tiene: ",count($f)," elementos<br>";

Esta funcin puede ser un ?>


complemento de sizeof o de
count dado que permitira
comprobar si estn definidas las ejemplo58.php
variables en las que aquellas
funciones devuelven dimensin
cero. Informacin sobre variables
is_array(variable)

Devuelve UNO (verdadero) en el


caso de que la variable sea tipo <?
array y NUL en el caso contrario. $a=array("Lunes","Martes","Miercoloes","Jueves",
"Viernes","Sbado","Domingo");
is_long(variable)
$b=array(

"Precio"=>"17340 euros",
is_int(variable)
"Color" =>"Rojo",
is_integer(variable) "Llantas" =>"Aluminio");
$c=47; $d=""; $e=array();
Estas tres funciones que son
idnticas devuelven UNO en el echo "<h3>Variables definidas</h3>";
caso de que la variable sea de tipo
entero y NUL en el caso contrario. echo " Esta definida la variable a ? ",isset($a),"<br>";
is_float(variable) echo " Esta definida la variable b ? ",isset($b),"<br>";
echo " Esta definida la variable c ? ",isset($c),"<br>";
is_double(variable) echo " Esta definida la variable d ? ",isset($d),"<br>";
echo " Esta definida la variable e ? ",isset($e),"<br>";
Estas dos funciones tambin echo " Esta definida la variable f ? ",isset($f),"<br>";
idnticas devuelven UNO en el
caso de que la variable sea de tipo echo "<h3>Identificacin de tipos de variables</h3>";
coma flotante y NUL en el caso
contrario.
echo " La variable a es un array ? ",is_array($a),"<br>";
is_string(variable) echo " La variable a es tipo double ? ",is_double($a),"<br>";
echo " La variable a es un entero ? ",is_int($a),"<br>";
Devuelve UNO en el caso de que la echo " La variable a es un entero ? ",is_long($a),"<br>";
variable sea tipo string y NUL en
caso contrario. echo "<h3>Eliminando variables</h3>";
unset(variable)
echo "La dimensin de a es: ",count($a),"<br>";
Destruye la variable indicada. Si unset($a[0]);
despus de aplicar unset sobre echo "Nueva dimensin de a: ",count($a),"<br>";
una variable aplicamos de nuevo la echo "La dimensin de b es: ",count($b),"<br>";
funcin isset, nos devolver NUL unset($b);
indicando que ya no est echo "Nueva dimensin de b: ",count($b),"<br>";
definida. echo " Sigue definida la variable b ? ",isset($b),"<br>";
La funcin unset se puede aplicar ?>
tanto sobre variables como sobre
un array y tambin sobre un
ejemplo59.php
elemento de un array.

Anterior Indice Siguiente


Recuentos en arrays

Recuento de valores
Recuento de los valores
<?
contenidos en una matriz
$a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
Algunas de las posibilidades de $c=array(
obtener informacin sobre los "a"=>"rojo",
contenidos de un array son las
"b" =>"verde",
siguientes:
"c" =>"rojo",
$n=array_count_values(ar) "d" =>"rojo",
"e" =>"verde",
Con array_count_values la "f" =>"Rojo",
variable $n ser un array que "g" =>"Verde");
tendr como ndices cada uno de echo "<h3>Cuenta valores del array()</h3>";
los valores distintos que contenga $contador=array_count_values($a);
el array ar, y como valores el
foreach($contador as $valor=>$veces){
resultado de contar el nmero de
veces que se repite cada uno de echo "El valor ",$valor," se repite ",
los valores contenidos en el array $veces," en la matriz a<br>";
inicial. }
echo $contador[0],"<br>";
Distingue entre maysculas y echo $contador[1],"<br>";
minsculas. echo $contador[2],"<br>";
echo $contador[3],"<br>";
Cuando el array inicial (ar)
contiene nmeros enteros (sea ar
echo $contador[4],"<br>";
escalar o asociativo) $n ser un $contador1=array_count_values($b);
array escalar. En caso contrario, foreach($contador1 as $valor=>$veces){
ser asociativo. echo "El valor ",$valor," se repite ",
$veces," en la matriz a<br>";
}
Bsqueda de elementos
echo $contador1["blanco"],"<br>";
en un array echo $contador1["azul"],"<br>";
echo $contador1["Azul"],"<br>";
clav=array_keys(arr) echo $contador1["Blanco"],"<br>";
$contador2=array_count_values($c);
Devuelve un array escalar (clav)
foreach($contador2 as $valor=>$veces){
que contiene como valores los
ndices del array inicial (arr).
echo "El valor ",$valor," se repite ",$veces," en la matriz a<br>";
}
clav=array_keys(arr, valor) echo $contador2["rojo"],"<br>";
echo $contador2["Verde"],"<br>";
Devuelve un array escalar (clav) echo $contador2["verde"],"<br>";
que contiene como valores los echo $contador2["Rojo"],"<br>";
ndices de los elementos del array
echo "$lt;h3>Devuelve las claves de un array$lt;/h3>";
inicial cuyo valor coincide con el
$claves=array_keys($a);
indicado mediante el parmetro
valor. foreach($claves as $v){
echo "El valor ",$v," es una de las claves$lt;br>";
valores=array_values(arr) }
$claves1=array_keys($a,1);
Esta funcin recoge en una nueva foreach($claves1 as $v){
matriz (valores) todos los echo "El valor ",$v," es una de las claves de elementos
valores contenidos en otro array.
de la matriz cuyo valor es <b>1</b><br>";
Es una forma de conversin de un }
array asociativo en otro escalar. echo "<h3>Devuelve los valores de un array</h3>";
$valores=array_values($c);
foreach($valores as $v){
echo ,$v," Este es un de los valores de
de la matriz c<br>";
}
?>

ejemplo60.php

Anterior Indice Siguiente


Ordenacin de arrays (I)

Localizacin de valores en
una matriz
Moviendo el puntero interno

in_array(valor,array)

La funcin in_array busca en la <?


matriz (array) el valor (numrico o $a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
cadena) contenido en el parmetro $b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
valor. Si lo encuentra devuelve 1, $c=array(
y, si no existiera devolvera NUL. "a"=>"rojo",
"b" =>"verde",
Posicionamientos "c" =>"rojo",
"d" =>"rojo",
en una matriz
"e" =>"verde",
"f" =>"Rojo",
Mediante estas funciones se puede "g" =>"Verde");
modificar la posicin del puntero
interno de una matriz y determinar
echo "<h3>Busca un valor en una matriz</h3>";
los ndices de los elementos a los
que apunta en cada momento.
echo " Busca el valor en la matriz: <b>#",in_array(3,$a),
key(array) "#</b> Si no ha puesto nada no estaba, si 1 lo encontr <BR>";
echo " Busca el valor en la matriz: <b>#",in_array(7,$a),
Devuelve el ndice del elemento "#</b> Si no ha puesto nada no estaba, si 1 lo encontr <BR>";
de la matriz al que apunta en ese echo " Busca el valor en la matriz: <b>#",in_array("gris",$b),
momento el puntero interno de la
"#</b> Si no ha puesto nada no estaba, si 1 lo encontr <BR>";
matriz.
echo " Busca el valor en la matriz: <b>#",in_array("blanco",$b),
Cuidado! "#</b> Si no ha puesto nada no estaba, si 1 lo encontr <BR><br>";

Fjate en el ejemplo. Pese a que echo "<h3>Posicionandose y determinando indices actuales</h3>";


hemos pedido a PHP que nos
muestre, mediante la instruccin echo "Este el valor asoaciado al indice 3 de la matriz a: ",$a[3],"<br>";
echo $a[3], esa lectura no mueve echo "El puntero interno apunta a la clave: ",key($a),"<br>";
el puntero interno, que sigue
echo "Este es el valor siguiente al anterior: ",next($a),"<br>";
sealando a la primera posicin
(devuelve CERO). echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el primer valor de la matriz a: ",reset($a),"<br>";
reset(array) echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el ultimo valor de la matriz a: ",end($a),"<br>";
Desplaza el puntero interno a la echo "El puntero interno apunta a la clave: ",key($a),"<br>";
posicin del primer ndice del echo "Este es el penltimo valor de la matriz a: ",prev($a),"<br>";
array.
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
end(array) echo "Este es el mismo valor anterior: ",pos($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
Desplaza el puntero interno a la
posicin del ltimo ndice del echo "Este el valor asoaciado al indice 4 de la matriz b: ",$b[4],"<br>";
array. echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el valor siguiente al anterior: ",next($b),"<br>";
pos(array)
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
Mantiene el puntero interno en la echo "Este es el primer valor de la matriz a: ",reset($b),"<br>";
posicin del actual. echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el ultimo valor de la matriz a: ",end($b),"<br>";
next(array) echo "El puntero interno apunta a la clave: ",key($b),"<br>";
Avanza el puntero interno en una
echo "Este es el penltimo valor de la matriz a: ",prev($b),"<br>";
posicin respecto a la actual. echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el mismo valor anterior: ",pos($b),"<br>";
prev(array) echo "El puntero interno apunta a la clave: ",key($b),"<br>";

Retrocede el puntero interno en ?>


una posicin respecto a la actual.

ejemplo61.php

Anterior Indice Siguiente


Ordenacin de arrays (II)

Ordenaciones de arrays
Ordenaciones de arrays
Los elementos de un array se van
ordenando segn se van
definiendo. Por tanto, su orden no
es el mismo que el de los valores <?
de sus ndices. $a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
Las funciones PHP que ordenan los $c=array(
elementos de un array permiten "b" =>"verde",
dos opciones. "c" =>"rojo",
"e" =>"verde",
Con una de ellas es posible la
ordenacin de los elementos sin "f" =>"Rojo",
modificar los valores de los "g" =>"Verde",
ndices, mientras que la otra s "a"=>"rojo",
modifica los ndices. "d" =>"rojo",);

En el segundo de los casos la sort ($a);


modificacin puede afectar incluso
al tipo de ndices dado que los echo "<h3>Ordenacin por valores usando sort</h3>";
resultados de las ordenaciones
foreach ($a as $clave=>$valor){
tanto si hemos partido de un array
escalar como si lo hemos hecho echo "Clave: ",$clave," Valor: ",$valor, "<br>";
desde uno asociativo es siempre }
un array escalar.
sort ($c);
Ordenacin por valores echo "<h3>Ordenacin por valores usando sort</h3>";
sin mantener ndices foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
sort(array) }
Ordena los valores del array en rsort($a);
sentido creciente y lo reindexa
asignando ndice CERO al menor
de los valores. echo "<h3>Ordenacin inversa por valores usando rsort</h3>";
foreach ($a as $clave=>$valor){
rsort(array) echo "Clave: ",$clave," Valor: ",$valor, "<br>";
}
Ordena la matriz en sentido
decreciente de sus valores y la ksort($b);
reindexa asignando ndice CERO al
mayor de estos.
echo "<h3>Ordenacin por claves usando ksort</h3>";
foreach ($b as $clave=>$valor){
Ordenacin por ndices echo "Clave: ",$clave," Valor: ",$valor, "<br>";

ksort(array) }

Ordena la matriz segn sus ndices krsort($b);


y en sentido creciente de estos.

krsort(array)
echo "<h3>Ordenacin inversa por claves usando krsort</h3>";
foreach ($b as $clave=>$valor){
Ordena la matriz por ndices en echo "Clave: ",$clave," Valor: ",$valor, "<br>";
sentido decreciente de los mismos.
}
Ordenacin por valores
asort($c);
manteniendo ndices
echo "<h3>Ordenacin por valores manteniendo indices </h3>";
asort(array) foreach ($c as $clave=>$valor){
Ordena la matriz segn sus valores
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
en sentido creciente y mantiene
los ndices del array original. }

arsort(array) arsort($c);
Ordena la matriz por valores en
echo "<h3>Ordenacin inversa por valores manteniendo indices arsort</
sentido decreciente y sigue
h3>";
manteniendo los ndices
originales. foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

Ordenacin mediante }
funcin definida por echo "<h3>Ordenacin por valores mediante
usuario funcin de usuario manteniendo indices</h3>";

PHP permite que el usuario pueda /* esta funcion recoge el valor de la variable $a
defina funciones en las que y aplicar el operador de comparacin ternario
establezca sus criterios de forma que si el valor de la variable es impar
particulares de ordenacin. Las devuelve como valor -2 y si es par devuelve 2
funciones PHP que permiten usar el 2 y el menos 2 unicamente establecen criterios de
esta caracterstica son las comparacion de modo que los valores -2 sern considerados
siguientes: anteriores a los valores +2 */
uasort(array, funcion)

Ordena la matriz utilizando los function micomparar (&$a) {


criterios establecidos por la return ($a%2!=0) ? -2 : 2;
funcin definida por el usuario y }
mantiene los ndices del array.
uasort ($a, micomparar);
usort(array, funcion)

Ordena la matriz por valores foreach ($a as $clave=>$valor){


utilizando los criterios definidos en echo "Clave: ",$clave," Valor: ",$valor, "<br>";
la funcin de usuario y modifica
los ndices. }
echo "<h3>Ordenacin por clave mediante funcin de usuario </h3>";
uksort(array, funcion)
uksort ($a, micomparar);
Ordena la matriz por claves
utilizando los criterios definidos en
la funcin. foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
En el ejemplo hemos definido una
funcin de comparacin siguiendo }
el criterio de ser o no ser mltiplo
de 2. echo "<h3>Ordenacin por valores mediante funcin de usuario </h3>";
Trataremos las funciones en un
tema aparte. La utilidad de la que usort ($a, micomparar);
hemos incluido en el ejemplo es la
siguiente: Si el valor de la variable foreach ($a as $clave=>$valor){
es par le asignamos un nmero echo "Clave: ",$clave," Valor: ",$valor, "<br>";
negativo como respuesta y en caso
contrario uno positivo. }
De esta forma los valores del array
?>
que devuelven negativos se
consideran anteriores en la
ordenacin a los que dan como
resultado un nmero positivo. ejemplo62.php

Anterior Indice Siguiente


Modificacin de arrays

Modificaciones en arrays
Modificacin de arrays
var= range(inf,sup)

Crea una nueva matriz (var)


escalar en la que los valores de <?
los elementos sern los nmeros $a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
enteros (ordenados) $b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
pertenecientes al intervalo $c=array(
comprendido entre los valores inf "b" =>"verde",
y sup, incluidos estos. "c" =>"rojo",
"e" =>"verde",
Los valores inf y sup deben ser
nmeros enteros. "f" =>"Rojo",
"g" =>"Verde",
shuffle(array) "a"=>"rojo",
"d" =>"rojo");
Intercambia de modo aleatorio los $C=array(
valores de un array y los reindexa. "b" =>"verde",
Igual que ocurra en caso de los "c" =>"rojo",
nmeros aleatorios, la funcin "e" =>"verde",
shuffle deber ir precedida de una "f" =>"Rojo",
semilla del tipo srand. "g" =>"Verde",
"a"=>"rojo",
En el ejemplo hemos usado como "d" =>"rojo");
semilla la funcin: srand(time
()).
echo "<h3>Crea una matriz de nmeros enteros</h3>";
var= array_flip(array)
$r=range(7,11);
Devuelve un array (var) que
contiene como valores los ndices foreach($r as $clave=>$valor){
de la matriz array y como ndices echo "Clave: ",$clave," Valor: ",$valor,"<br>";
los valores de aquella. }
Como quiera que los valores
pueden estar repetidos y no es echo "<h3>Intercambia aleatoriamente elementos en una matriz</h3>";
posible que lo estn los ndices,
esta funcin, en caso de valores srand (time());
repetidos, toma cada uno de esos shuffle ($r);
valores una sola vez, lo utiliza
como ndice del nuevo array y
asigna como valor del nuevo foreach($r as $clave=>$valor){
elemento el mayor de los ndices echo "Clave: ",$clave," Valor: ",$valor,"<br>";
del array original de los }
elementos que contuvieran ese
valor.
echo "<h3>Intercambia valores e indices</h3>";

Insertando elementos en $p=array_flip($a);


un arrays
foreach($p as $clave=>$valor){
array_unshift(arr, v1,v2,..) echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
Inserta al principio de la matriz echo "<br>";
arr los valores v1, v2, etctera
que pueden ser tantos como se $q=array_flip($c);
deseen y deben estar separados
por comas.
foreach($q as $clave=>$valor){
array_push(array, v1,v2,..) echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
Inserta al final de la matriz array
los valores v1, v2, etctera, que echo "<h3>Inserta elementos al principio de una matriz</h3>" ;
igual que en el caso anterior,
pueden ser tantos como se deseen array_unshift($a,97,"Pepe",128);
y deben estar separados por
comas.
Tanto array_unshift como
foreach($a as $clave=>$valor){
array_push asignan a los nuevos echo "Clave: ",$clave," Valor: ",$valor,"<br>";
elementos ndices numricos. }
echo "<br>";
array_pad(array, n, var)
array_unshift($c,97,"Pepe",128);
Inserta nuevos elementos en array
y les asigna el valor contenido en
foreach($c as $clave=>$valor){
var. Insertar tantos nuevos
elementos como sea necesario echo "Clave: ",$clave," Valor: ",$valor,"<br>";
para que el array alcance una }
longitud de n elementos.
Si el valor de n es positivo inserta echo "<h3>Inserta elementos al final de una matriz</h3>";
los elementos al final del array,
si fuera negativo los insertara al array_push($a,3.4,"Luis",69);
comienzo del mismo.
foreach($a as $clave=>$valor){
A los nuevos elementos del array
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
se les asignan ndices numricos.
}
array_merge($a, $b) echo "<br>";

Crea un nuevo array escalar en el array_push($c,3.4,"Luis",69);


que se incluyen todos los
elementos contenidos en los foreach($c as $clave=>$valor){
arrays $a y $b.
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
Quitar elementos
de un array echo "<h3>Inserta elementos iguales
al principio o al final de una matriz</h3>";
array_shift($a)
$wz1=array_pad($a,25,"relleno");
La funcin array_shift extrae el
primer elemento del array $a. foreach($wz1 as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
array_pop($a)
}
La funcin array_pop extrae el
ltimo elemento del array $a. echo "<br>";

array_slice($a,n) $wz2=array_pad($c,-17,"relleno");
La funcin array_slice extrae n
foreach($wz2 as $clave=>$valor){
elementos del array $a.
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
Si el valor de n es positivo }
extraer todos los elementos a
partir del que ocupa la posicin n echo "<h3>Fusiona dos matrices</h3>";
contando desde primero hasta el
ltimo segn el orden de creacin $wz3=array_merge($a,$b);
de los elementos.

Si el valor de n es negativo foreach($wz3 as $clave=>$valor){


extraer todos los elementos a echo "Clave: ",$clave," Valor: ",$valor,"<br>";
partir del ensimo, esta vez, }
contando desde el ltimo hasta el echo "<h3>Extrae el primer elemento de una matriz</h3>";
primero.
array_shift ($a);
array_slice($a,n, m)

La funcin array_slice con dos


foreach($a as $clave=>$valor){
parmetros permite extraer una echo "Clave: ",$clave," Valor: ",$valor,"<br>";
parte de los valores de una matriz }
siguiendo estos criterios: echo "<br>";

Si n y m son positivos, extraer array_shift ($c);


m elementos a partir del que
ocupa la posicin ensima de foreach($c as $clave=>$valor){
primero a ltimo.
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
Cuando n es negativo y m es }
positivo se extraern m echo "<h3>Extrae el ultimo elemento de una matriz</h3>";
elementos contados a partir del
ensimo, esta vez recorriendo el array_pop($a);
array de ltimo a primero.
foreach($a as $clave=>$valor){
En el caso en que n tenga valor echo "Clave: ",$clave," Valor: ",$valor,"<br>";
positivo y m sea negativo
}
extraer los comprendidos entre el
ensimo contado de primero a echo "<br>";
ltimo y el emsi- mo contado
desde el ltimo hasta el primero. array_pop ($c);

Si n es negativo y m es tambin foreach($c as $clave=>$valor){


negativo extraer los caracteres echo "Clave: ",$clave," Valor: ",$valor,"<br>";
comprendidos entre el ensimo }
contado de ltimo a primero y el echo "<h3>Extrae elementos de una matriz</h3>";
emsimo contado en el mismo
sentido.
$zz1=array_slice($a,3);
En este caso se requiere que el
valor absoluto de n sea mayor que foreach($zz1 as $clave=>$valor){
el de m. echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
En caso de no cumplirse esta echo "<br>";
condicin devolver un array vaco.
$zz2=array_slice($a,-3);
Invertir
el orden de un array foreach($zz2 as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
array_reverse(array) }

Devuelve un nuevo array cuyos echo "<br>";


elementos estn en orden inverso
al del array original. $zz3=array_slice($b,3,4);
De esta forma el elemento que
foreach($zz3 as $clave=>$valor){
ocupaba la ltima posicin pasa a
ocupar la primera y as echo "Clave: ",$clave," Valor: ",$valor,"<br>";
sucesivamente. }

Cuidado! echo "<br>";


Recuerda que las posiciones
$zz4=array_slice($b,3,-2);
iniciales de los elementos de un
array no tienen relacin con sus
ndices sino con la secuencia en foreach($zz4 as $clave=>$valor){
la que fueron creados. echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
Y otra cosa, mucho cuidado con la
aplicacin de todas estas funciones echo "<br>";
y con los ndices de los arrays
resultantes. $zz5=array_slice($b,-5,-2);
Fjate en los ejemplos y vers que
algunas estas funciones foreach($zz5 as $clave=>$valor){
reindexan los resultados y los echo "Clave: ",$clave," Valor: ",$valor,"<br>";
convierten en escalares an en el }
caso de que originalmente fueran
asociativos.
echo "<h3>Invierte los elementos de la matriz</h3>";

$inv=array_reverse($C);

foreach($inv as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
?>

ejemplo63.php

Anterior Indice Siguiente


Funciones de usuario

Qu son las
Funciones de usuario
funciones de usuario? Imaginmonos, all por el mes de junio, sentados ante una mesa tratando de hacer la
declaracin de la renta. Para ese menester seguramente nos pertrecharamos adems del
De igual forma que ocurre con el impreso oficial de la declaracin con: calculadora, lpiz, goma de borrar e incluso con las
navegador en el caso del HTML, disposiciones legales relativas al impuesto.
PHP lee e interpreta las
instrucciones contenidas en los Seguramente iramos leyendo y cumplimentando el impreso oficial script PHP
scripts de forma secuencial. partiendo de la primera pgina orden secuencial y continuando de forma ordenada
hasta el final.
Es decir, las instrucciones se van
ejecutando en el mismo orden en
La calculadora, la goma, etctera funciones estaran disponibles para ser utilizadas
el que aparecen en el documento
original, con la excepcin de las invocadas tantas veces como fuera preciso y, adems, no seran elementos exclusivos
funciones. de ese documento, sino que seguiran disponibles para otros usos scripts distintos, tales
como la planificacin financiera de nuestras vacaciones, por citar un ejemplo.
En este caso, los bloques de
instrucciones son puestos a Las funciones de usuario son, como la calculadora o la goma, herramientas
disposicin de PHP, pero no se diseadas para facilitar las tareas y susceptibles de ser usadas en una o varias situaciones
ejecutarn hasta el momento en scripts diferentes.
que sean requeridas de forma
expresa. Ejemplos de funciones de usuario
Dnde Con este primer ejemplo obtendremos una pgina en blanco. El script contiene una
deben insertarse? funcin pero no hay ninguna instruccin que la invoque y por lo tanto no se ejecutara.

Aunque en versiones antiguas de <?


PHP era necesario definir la function a1(){
funcin antes de invocarla, a partir
de la versin 4 no es necesaria for($i=1;$i<=10;$i++){
esa organizacin secuencial. echo $i,"<br>";
}
La funcin pueden estar escrita
dentro de cualquier script y en }
cualquier parte del documento, sin ?>
que tenga importancia alguna el
lugar en el que se incluya la
llamada a la misma.
ejemplo64.php

Tambin es posible y bastante


habitual incluir funciones de uso <?
frecuente en documentos externos a1();
de modo que pueden ser ?>
compartidas. <!-- Hemos escrito un script con una llamada
En este caso, adems de invocarla
a la funcin a1 que an no est definida.
es necesario indicar a PHP el lugar Tendremos que hacerlo, pero no importa
donde debe buscarla. Hablaremos la parte del documento en la que lo hagamos
de ello cuando estudiemos lo La pondremos en este nuevo script PHP //-->
relativo a include.
<?
function a1(){
Definicin de la funcin
for($i=1;$i<=10;$i++){
echo $i,"<br>";
Las funciones de usuario requieren }
la siguiente sintaxis:
}
function nombre(){ ?>
.....
... instrucciones ...
.....
ejemplo65.php
}

Es imprescindible respetar En este otro ejemplo veremos las diversas situaciones que pueden plantearse respecto
estrictamente la sintaxis que al mbito de las variables.
requiere de forma obligatoria los
siguientes elementos:
<?
La palabra function debe estar # definamos dos variables y asignmosles un valor
escrita en minsculas. $a=5; $b=47;
# escribamos una funcion a1 y pidmosle que imprima sus valores
El nombre de la funcin, que
debe seguir criterios similares a los
function a1(){
de los nombres de variables,
echo "Este es el valor de $a en la funcin a1: ",$a,"<br>";
aunque en este caso no se
antepone el smbolo $ ni ningn echo "Este es el valor de $b en la funcin a1: ",$b,"<br>";
otro. }
# hagamos una llamada a la funcion anterior
Los parntesis (), incluso cuando # no nos escribir ningn valor porque esas variables no pertenecen
no contengan nada. # al mbito de la funcin y sern consideradas como vacias
# en el ambito de la funcion
Las llaves de apertura ({) y
a1();
cierre (}) dentro de las cuales se
escribirn las instrucciones # escribamos una nueva funcin, definamos como global $a
correspondientes a ella. # y comprobemos que ahora si la hemos incluido en el ambito
# de la funcion
function a2(){
Ejecucin de la funcin global $a;
echo "Este es el valor de $a en la funcin a2: ",$a,"<br>";
Las funciones PHP no se ejecutan echo "Este es el valor de $b en la funcin a2: ",$b,"<br>";
en tanto no sean invocadas. }
# invoquemos esta nueva funcion y veamos que ahora
Para invocar una funcin la
# si se visualiza el valor de $a pero no el de $b
sintaxis es la siguiente:
a2();
nombre() # creemos una nueva funcion y ahora modifiquemos dentro de ella
Al ser llamada con esta sintaxis # ambas variables
desde cualquier script se function a3(){
ejecutarn las instrucciones global $a;
contenidas en ella. $a +=45;
$b -=348;
mbito de las variables echo "Este es nuevo valor de $a en la funcin a3: ",$a,"<br>";
echo "Este es el valor de $b en la funcin a3: ",$b,"<br>";
Resumamos lo ya comentado }
cuando tratamos el tema de las
# invoquemos la funcion a3
variables.
a3();
Las funciones no leen valores de # comprobemos -desde fuera del mbito de la funcin
variables definidas fuera de su # que ocurri con los valores de las variables
mbito salvo que dentro de la echo "El valor de $a HA CAMBIADO despues de ejecutar a3 es: ",$a,"<br>";
propia funcin se definan de forma echo "El valor de $b NO HA CAMBIADO despues de ejecutar a3 es: ",
expresa como globales. $b,"<br>";
# probemos que ocurre con una variable superglobal
Si una funcin modifica el valor
# veremos que sin ser definida expresamente en a4
de una variable global, el nuevo
valor persiste despus de # si pertenece a su ambito y por lo tanto visualizamos su contenido
abandonar la funcin. function a4(){
print "La superglobales si estn: ".$_SERVER['SERVER_NAME']."<br>";
Si dentro de una funcin se }
utiliza un nombre de variable # invoquemos esta nueva funcion
idntico al de otra externa a ella a4();
(sin definirla global) la nueva ?>
variable se inicia con valor nulo y
los eventuales valores que pudiera
ir conteniendo se pierden en el ejemplo66.php
momento en que se acaba su
ejecucin.

Asignacin de valores a <?


$a=-13; $b=7482; $c="Ambrosio";
variables
# esta es una forma alternativa de asignar valores a una variable
A las variables no globales se les # del ambito de la funcin
pueden asignar sus valores function a1($a=56, $b=25){
iniciales de dos formas: echo "El valor de $$a en la funcin a1: ", $a,"<br>";
echo "El valor de $$b en la funcin a1: ", $b,"<br>";
Incluyndolas en una lnea de }
instrucciones contenida en la a1();
propia funcin.
echo "El valor de $a despues de ejecutar la funcin es: ",$a,"<br><br>";
Insertando los nombres de
variable y sus valores dentro del
parntesis que de forma
obligatoria debe seguir al nombre # Pasando valores desde la llamada a la funcin #
de la funcin. En este caso la /* Definamos una funcin fun1 e incluyamos dentro de su parntesis
sintaxis sera: nombres de variables, separados por comas pero ahora sin asignarles
ningn valor */
function nom ($a=v1,$b=v2)
function fun1($x,$y,$z){
donde $a y $b son nombres de print "Valor de la variable x: ".$x."<br>";
variables a utilizar en el mbito de print "Valor de la variable y: ".$y."<br>";
la funcin y v1 y v2 los valores print "Valor de la variable z: ".$z."<br>";
asignados a cada una de ellas. }
En este parntesis pueden incluirse
separndolas con comas
cuantas parejas var = val sean
necesarias. # debemos hacer la llamada a la funcin pero ahora
# lo haremos de forma distinta.
Una forma alternativa a la # Vamos a incluir en la llamada
anterior sera la siguiente: # los valores que queremos asignar a las variables de la funcin
# Escribiremos dentro del parntesis de la llamada
function nom ($a,$b) # los valores de cada una de las tres variables
donde habra que asignar los # separados por comas
valores de cada una de la variables # (si se trata de una cadena, pongmosla entre comillas)
desde la llamada a la funcin, que # y veremos con la funcin recoge esos valores asignados
ahora tendra esta sintaxis: #en la llamada

nombre (valor1, valor2,...); fun1(14,"Robustiano",23.4);


/* si esta llamada contuviera ms de tres valores
en la que se escriben los valores
separados por comas, y los ultimos serian ignorados */
encerrados entre comillas cuando fun1(49.3,"Eustaquio",78,"Lupicio",456);
se trata de variables alfanumricas. # si contuviera menos de tres valores
# PHP nos dara un mensaje de error
Si el nmero de valores contenidos # advirtiendo que falta un valor
en la llamada fuera mayor que el # pero nos devolvera los valores
nmero de variables definidas en fun1("Desiderio","Bailador");
la funcin, los excedentes seran
ignorados y, si fuera inferior, se
# esos mensajes de error podramos evitarlos
asignara valor nulo a las variables
a las que no se transfiriera ningn # poniendo una arroba delante de la llamada a la funcin
valor. @fun1("Nuevo Desiderio","Nuevo Bailador");

Tambin es posible incluir en la


llamada a la funcin los nombres # tambien podra utilizarse una sintaxis como esta
de algunas variables definidas en # en la que dejamos en blanco (entre comillas)
el mbito externo a la funcin. Se # el espacio correspondiente al segundo valor
hara de la siguiente forma: # aunque si incluimos las comas.
nombre ($var1, var2,...); # La variable que ocupa esa posicin
# sera considerada como nula
fun1("La luna",'',"verde");
Pasar por referencia
# tambin podramos incluir en la llamada nombres de variables
Tal como hemos visto, las # definidas en el mbito general del sript
# un este caso la funcin usaria esos valores
funciones PHP pueden recibir
valores de variables externas y
utilizar esos valores sin que el fun1($a,$b,$c);
valor original de las mismas salvo
que se les asigne la condicin de ?>
globales dentro de la funcin
sufra modificacin.
ejemplo67.php
Una manera de lograr que los
valores una variable externa
puedan ser modificados por una <? $a=3; $b=2;
funcin, es lo que se llama en function a1(&$a,$b){
argot informtico pasar variables $a=pow($a,2);
por referencia.
$b=pow($b,3);
La forma de hacerlo es esta: echo "El cuadrado de a dentro de la funcin es: ",$a, "<br>";
echo "El cubo de b dentro de la funcin es: ",$b, "<br><br>";
Hay que anteponer al nombre de }
la variable el smbolo & y PHP
interpretar que la estamos a1($a,$b);
pasando por referencia.

El & puede anteponerse tanto en


echo "Al salir de la funcin a conserva la modificacin: ",$a, "<br>";
la definicin de la funcin como en echo "Por el contrario, b no la conserva: ",$b, "<br><br>";
la llamada a la funcin, tal como
puedes ver en el ejemplo. $c=8; $d=12;
function b1($a,$b){
La segunda de las opciones nos $a=pow($a,2);
concede mayor libertad dado que $b=pow($b,3);
permite usar una sola funcin y echo "El cuadrado de a dentro de la funcin es: ",$a, "<br>";
decidir en cada llamada la forma
echo "El cubo de b dentro de la funcin es: ",$b, "<br><br>";
de pasar los parmetros.
}
Cuidado!
b1(&$c,$d);
Si tratas de ejecutar una funcin
en la que colocas el & en la echo "Al salir de la funcin c conserva la modificacin: ",$c, "<br>";
llamada a la funcin y te aparece echo "Por el contrario, d no la conserva: ",$d, "<br><br>";
un mensaje como este:
?>
Warning: Call-time pass-by-
reference has been deprecated -
argument passed by value; If you
would like to pass it by reference,
modify the declaration of function
(). If you would like to enable call- ejemplo68.php
time pass-by-reference, you can
set
allow_call_time_pass_reference to
Ejercicio n 26
true in your INI file.

lo que estar ocurriendo es que el En este ejercicio ejercicio26.php utilizaremos una funcin para construir tablas similares
php.ini del servidor tiene a las que hemos construido en el ejercicio n 23. Pero incorporaremos una innovacin
configurada en Off la directiva: respecto a aquel. Ahora la funcin debe permitir construir tablas de cualquier dimensin n
de filas y/o columnas y el nmero de estas habremos de incluirlo en la llamada a esa
allow_call_time_pass_reference
funcin.
y eso suele ocurrir con algunos
hostings y tambin con la
configuracin por defecto de Otras funciones de usuario
algunas versiones de PHP
anteriores a la que estamos
<? function Encabezado() { ?>
utilizando.
<!-- Hemos abierto la funcin y cerrado la etiqueta PHP
todo esto es cdigo HTML //-->
Otra forma de definir <HTML>
funciones de usuario <HEAD>
<TITLE>Titulo de mi pgina</TITLE></HEAD>
Existe otra opcin de definicin de <BODY BGCOLOR="#FF0000">
funciones de usuario que puede <!-- Esta nueva llamada a PHP
resultar de mucho inters. En este insertando la llave de cierre de la funcin
caso la funcin se define en tres indicar a PHP que debe escribir todo lo
bloques: contenido entre la { y esta } //-->
<? } ?>
Definicin de la funcin, llave
de apertura y cierre del script PHP.
<? function Pie() { ?>
Contenido de la funcin <HR>
formado exclusivamente por </BODY>
cdigo HTML, que se escribira </HTML>
cuando fuera invocada la funcin <? } ?>
que lo contiene. <!-- Utilizaremos esas dos funciones para
crear una pgina web. Llamamos a la funcin Encabezado
Cierre de la funcin (llave de
luego escribimos un texto y por ultimo insertamos
cierre) contenido en un script PHP,
es decir, entre las etiquetas de el Pie de pgina con la funcin Pie //-->
apertura <? y cierre ?> de PHP. <? Encabezado(); ?>
Este es texto que aparecer en el cuerpo de la pgina.
Cuando es invocada una funcin Est fuera de los scripts de php y ser considerado
definida de esta forma puedes como un texto HTML. Debajo aparecer la lnea horizontal
verlo en el ejemplo PHP se limita que insertaremos mediante una nueva llamada a la funcin Pie
a escribir en el documento final los
textos contenidos entre la etiqueta <? Pie(); ?>
de apertura y cierre de la funcin.

Las funciones de esta forma son


ejemplo68a.php
particularmente tiles para la
construccin de espacios web que
contienen una serie de pginas en Anterior Indice Siguiente
las que se repiten las mismas
estructuras.
Funciones que devuelven valores

Funciones que devuelven


Ejemplos de funciones que devuelven valores
valores
<?
# asignamos valores a dos variables
Las funciones PHP pueden ser
llamadas a partir de un script y $a=3; $b=5;
posteriormente recoger en ese # escribimos una funcin que eleva la variable a
mismo script los resultados de su # a la potencia indicada en b
ejecucin. # insertando return delante de la operacin
function a1($a,$b){
Para conseguir este resultado return pow($a,$b);
debemos escribir dentro de la }
funcin la instruccin return #incluimos en la instruccion echo una llamada
seguida de la variable o la
# a la funcin y en ella pasamos los valores
instruccin cuyo resultado
queremos que sea devuelto al # recogidos en las variables a y b
script desde el que ha sido # return conseguir que se ejecute esa funcin
llamada la funcin. # y que echo recoja e imprima el resultado
echo "El valor de a elevado a b es: ",a1($a,$b),"<br>";
Tal como podemos ver en el # esta otra funcin generar y devolver un array
ejemplo, los valores devueltos por # con los resultados de la ejecucion del bucle for
return pueden ser presentados function a2($a,$b){
directamente en la pgina o for ($i=0;$i<=$b;$i++){
recogidos por una variable.
$z[]=pow($a,$i);
Tambin es posible que la funcin }
genere un array y que este sea return $z;
devuelto a una variable que se }
convertira a ese tipo de forma # hacemos una llamada a la funcin
automtica. $p=a2($a,$b);
# leemos el array devuelto desde fuera de la funcin
Otra opcin de recoger los valores
foreach($p as $clave=>$valor){
devueltos por return es invocar la
echo "El valor de a (3) elevado a: ",$clave," es: ",$valor,"<br>";
funcin mediante una llamada del
tipo: }
echo "<br>";
list(v1, v2,..)=llamada # otra forma de leer el array con los resultados de la funcion
list($r,$s,$t)=a2($a,$b);
Las variables v1, v2, etc. echo "Este es el valor recogido en la variable r :",$r,"<br>";
recogern los valores de los echo "Este es el valor recogido en la variable s :",$s,"<br>";
elementos del array devuelto por
echo "Este es el valor recogido en la variable t :",$t,"<br>";
la funcin.
?>

ejemplo69.php

Anterior Indice Siguiente


Funciones de fecha

Funciones de fecha
Parmetros de la funcin date()
PHP es prdigo en cuanto a
posibilidades de manejo de fechas Parmetros de formato de date()
y horas. Para ello, cuenta, entre
otras, con las siguientes funciones: Valor Funcionalidad Sintaxis Resultado
A AM-PM date("A") PM
date (cadena de formato)
a am-pm date("a") pm
Devuelve valores de fecha y hora
actuales utilizando los parmetros d Da del mes en formato de 2 dgitos date("d") 21
que se sealan en la tabla para j da del mes sin ceros a la izquierda date("j") 21
establecer el formato de salida de
los datos. Dentro de la misma F Nombre del mes (texto completo) date("F") June
cadena de formato puede M Nombre del mes (3 letras) date("M") Jun
contener tantos parmetros como
se deseen. m N del mes (de 01 a 12) con dos dgitos date("m") 06

n N del mes (de 1 a 12) sin dos dgitos date("n") 6


Como puedes ver en el ejemplo
que hay al final de la tabla respeta Y Ao con cuatro dgitos date("Y") 2006
los caracteres separadores
(espacios, dos puntos, guiones,
y Ao con dos dgitos date("y") 06
etctera) que se hubieran incluido G Hora 0-23 sin ceros a la izquierda date("G") 21
en la cadena de formato siempre
que no coincidan con ninguno de H Hora 0-23 con dos dgitos date("H") 21
los parmetros PHP para esta g Hora 1-12 sin ceros a la izquierda date("g") 9
cadena.
h Hora 01-12 con dos dgitos date("h") 09
Cuidado!
i Minutos de 00 a 59 con dos dgitos date("i") 15
No olvides que PHP se ejecuta en s Segundos de 00 a 59 con dos dgitos date("s") 11
el servidor que suele estar en un
ordenador remoto. Por lo tanto, l da semana en texto completo date("l") Wednesday
fecha y hora locales se refieren D Da de la semana (tres letras) date("D") Wed
al lugar donde est instalado el
servidor y que en nuestro caso w da semana de 0 (domingo) a 6 (sabado) date("w") 3
servidor y cliente coinciden en un z das transcurridos del ao actual date("z") 171
mismo equipo y coincidirn la hora
del sistema con la del servidor. t Nmero de das mes actual date("t") 30

Pero si alojaras esta pgina en un L Ao actual bisiesto (1), no bisiesto (0) date("L") 0
hosting australiano, PHP nos Z Diferencia (seg.) horaria local con GMT date("Z") 7200
devolvera los valores con hora y
fecha de las antpodas. U Segundos Unix Epoch date("U") 1150917311

S Sufijo ordinal ingls date("S") st


date (formato, nmero)

Esta funcin nos devuelve la fecha Un ejemplo de fecha actual:


y hora del tiempo Unix
(recuerdas aquello tan fino de <? echo "Son las ", date("h : i : s")," y hoy es ", date("j-n-Y")?>
Unix Epoch?) indicado en el
parmetro nmero. devolvera: Son las 09 : 15 : 11 y hoy es 21-6-2006
Recuerda tambin que ese nmero Este otro script devolver la fecha y hora en la que el tiempo Unix era de 456.573.426
indica segundos contados a partir segundos.
de la 0:00:00 (GMT) del da 1 de
Enero de 1970. <?"Fu a las ", date("h:i:s",456573426)," del ", date("j-n-Y",456573426) ?>
gmdate(cadena formato)
devolvera: Fu a las 11 : 57 : 06 del 20-6-1984
Se comporta de forma idntica a
date() con la nica diferencia de
que devuelve la hora y fecha GMT.
Si te fijas en el ejemplo habr una Ejemplos de la funcin gmdate()
o dos horas de diferencia segn
accedas a esta pgina en verano o Un ejemplo de fecha actual en hora GMT (observa la diferencia horaria):
invierno.
<? echo "Son las ", gmdate("h : i : s")," y hoy es ", gmdate("j-n-Y")?>
gmdate (formato, nmero)

Los mismos comentarios que con devolvera: Son las 07 : 15 : 11 y hoy es 21-6-2006
el caso anterior. La nica
diferencia es que devuelve hora Este otro ejemplo devolver la fecha y hora GMT coincidente con el tiempo Unix
GMT. 456.573.426.

checkdate(mes,da,ao) <?"Fu a las ", gmdate("h:i:s",456573426)," del ", gmdate("j-n-Y",456573426) ?>

Comprueba si los valores de los devolvera: Fu a las 09 : 57 : 06 del 20-6-1984


parmetros mes estn dentro del
rango permitido (de 1 a 12), si el
parmetro da es un valor vlido
para ese mes (considera aos Checkdate()
bisiestos) y si el valor del ao
pertenece al rango 0 a 32767.
Ejemplos de checkdate()
Devuelve VERDADERO si los
valores corresponden a una fecha Mes Da Ao Sintaxis Devuelve
correcta y FALSO en el caso de 10 32 1987 Checkdate(10,32,1987)
que no ocurra as.
10 31 1987 Checkdate(10,31,1987) 1
gettimeofday()
2 29 2000 Checkdate(2,29,2000) 1
Esta funcin devuelve un array 2 29 2001 Checkdate(2,29,2001)
asociativo con los siguientes
ndices:
sec
El valor asociado a este ndice del
array recoge la hora actual (Unix gettimeofday()
Each) expresada en segundos
usec
El valor asociado a usec recoge la Ejemplos de gettimeofday()
fraccin en microsegundos de Sintaxis Devuelve
hora actual (Unix Each)
minuteswest $z= gettimeofday();
Array
echo $z;
Devuelve los minutos al Oeste de
Greenwich echo $z[sec]; 1150917311
dsttime() echo $z[usec]; 368811
Devuelve el tipo de correccin
horaria segn horarios de verano/ echo $z[minuteswest]; -60
invierno. El valor UNO corresponde echo $z[dsttime]; 1
a horario de verano, el valor CERO
al de invierno y MENOS UNO en el
caso en que sea desconocido.

getdate() getdate()
Devuelve un array asociativo con
parmetros de la fecha actual. Ejemplos de getdate()
Los ndices de este array y sus
valores son los que puedes ver en Funcionalidad Sintaxis Devuelve
el ejemplo. $s=getdate();
Devuelve un array asociativo Array
echo $s;
getdate(nmero)
Este ndice devuelve los segundos de la hora actual echo $s[seconds] 11
Interpreta el nmero como una Este ndice devuelve los minutos de la hora actual echo $s[minutes] 15
fecha Unix Each (segundos
Este ndice devuelve la hora de la hora actual echo $s[hours] 21
transcurridos desde el da 1 de
Enero de 1970) y devuelve un Este ndice devuelve el da del mes actual echo $s[mday] 21
array asociativo con los valores Este ndice devuelve el n del da de la semana echo $s[wday] 3
relativos a esa fecha.
Este ndice devuelve el n del mes echo $s[mon] 6
Los ndices de este array y sus
valores son idnticos a los de Este ndice devuelve el ao echo $s[year] 2006
getdate() y puedes verlos en el Este ndice devuelve n del da en el ao actual echo $s[yday] 171
ejemplo.
Este ndice devuelve el da de la semana echo $s[weekday] Wednesday
microtime() Este ndice devuelve el nombre del mes echo $s[month] June

Esta funcin devuelve la fraccin


de microsegundos de la hora
actual expresada en tiempo Unix.

time()
getdate(nmero)
Esta funcin devuelve la hora
actual en segundos expresada en Ejemplos de getdate(nmero)
tiempo Unix. Funcionalidad Sintaxis Devuelve

mktime (hora, min, seg, mes, $s=getdate


Devuelve un array asociativo (125748); Array
da, ao , horario)
echo $s;
Devuelve el tiempo Unix de la Este ndice devuelve los segundos de la hora actual echo $s[seconds] 48
fecha pasada como parmetro a la Este ndice devuelve los minutos de la hora actual echo $s[minutes] 55
funcin. Es fundamental mantener
la secuencia de los datos. Este ndice devuelve la hora de la hora actual echo $s[hours] 11
Este ndice devuelve el da del mes actual echo $s[mday] 2
Si se omiten argumentos (slo
pueden omitirse por la derecha) Este ndice devuelve el n del da de la semana echo $s[wday] 5
tomar los de la fecha actual. Este ndice devuelve el n del mes echo $s[mon] 1
Este ndice devuelve el ao echo $s[year] 1970
El parmetro horario es opcional
y admite los valores 0 (horario de Este ndice devuelve n del da en el ao actual echo $s[yday] 1
invierno), 1 (horario de verano). Este ndice devuelve el da de la semana echo $s[weekday] Friday

Cuando el parmetro da es cero Este ndice devuelve el nombre del mes echo $s[month] January
devuelve el ltimo da del mes
anterior, pero si pasamos cero
como parmetro de mes nos dar
un error. mktime()

Ejemplos de mktime()
H Min Sec Mes Da Ao Horario Tiempo Unix Fecha
23 12 57 6 16 1973 0 109116777 00:12:57 17-Jun-1973
23 12 57 6 16 1973 1 109116777 23:12:57 16-Jun-1973
25 12 57 6 16 1973 1 109123977 01:12:57 17-Jun-1973
23 97 57 6 16 1973 1 109121877 00:37:57 17-Jun-1973
23 12 57 14 16 1973 1 130284777 22:12:57 16-Feb-1974
23 12 57 14 0 1973 1 128902377 22:12:57 31-Jan-1974

En los ejemplos puede verse como para valores fuera de rango (mes mayor de 12,
minutos mayor de 60, etctera) la funcin realiza la correccin correspondiente.

Anterior Indice Siguiente


Funciones de calendario

Los distintos calendarios


gregoriantojd(mes,da,ao)
Realiza la cuenta de das julianos correspondiente a la fecha gregoriana pasada en
Das julianos los parmetros mes, da y ao. El script <? echo gregoriantojd (9, 27, 1999) ?> nos
devolver: 2451449 que es el da juliano correspondiente a la fecha gregoriana: 27 de
El sistema de das julianos fue
setiembre de 1999.
creado por Joseph Justus Scaliger
en 1582 y fue llamado as en
Este otro script nos devolver el da juliano correspondiente a la fecha actual.
recuerdo de su padre, Julius Cesar
Scaliger. <? echo gregoriantojd (date("n"), date("j"), date("Y")) ?>

Se trata de un sistema de cuenta As que, para tu conocimiento y efectos pertinentes, hoy da 21 -6-2006 estamos
de das que tiene su origen en el 1 celebrando el da juliano nmero 2453908.
de Enero del ao 4713 a.C. y
que acabar el 31 de Diciembre jdtogregorian(n de das julianos)
de 3267.
Esta funcin devuelve en fecha gregoriana con formato: mes, da y ao el da
Este ciclo es producto de
juliano pasado como parmetro.
multiplicar tres ciclos menores:
uno de 28 aos denominado solar,
Por si quieres ir preparando las celebraciones del 2.500.000 da juliano debes saber
otro de 19 aos, que incorpora las que coincidir con la fecha 8/31/2132
fases lunares y uno de 15 aos
denominado de indiccin.
jdtojulian(n de das julianos)
El da juliano es el nmero
resultante de contar los das Con esta funcin puedes obtener la fecha juliana a partir de un valor de la Cuenta
transcurridos desde la fecha de Das Juliana .
definida por Scaliger como
comienzo del ciclo. Este script de PHP
Calendario juliano <? echo jdtojulian(gregoriantojd (date("n"), date("j"), date("Y"))) ?>

El emperador romano Julio Cesar nos devuelve la fecha actual segn el calendario juliano.
orden en el ao 44 a.C. la
reforma del calendario. Sustituy Para que sepas en que da vives, hoy es 6/8/2006 segn el calendario juliano.
el lunar adoptando, con
modificaciones, uno solar de
origen egipcio que data del 4000
juliantojd(mes,da,ao)
a.C.
Convierte a Cuenta de das Julianos la fecha pasada (mes, da y ao) del
Con la asesora de Sosgenes de
calendario juliano.
Alejandra fij la duracin de cada
ao en 365,25 das, insertando
Por ejemplo <? echo juliantojd(7,25,2001) ?> nos devolver 2452129 que
un da suplemen- tario en
corresponde a la cuenta de das correspondiente a la fecha 25/7/2001 expresada segn
febrero cada cuatro aos, -bis
sextus dies ante calendas el calendario juliano.
Martii- (dos sextos das antes de
las calendas de marzo), haciendo
bisiestos a todos los aos cuyo
jdtojewish(n de das julianos)
nmero de orden sea divisible por
cuatro. Esta funcin nos devuelve la fecha (mes, da y ao) segn el calendario judo a
partir de una fecha expresada en das julianos.
Calendario gregoriano
<? echo jdtojewish (gregoriantojd (date("n"), date("j"), date("Y"))) ?>
A lo largo la Edad Media se sigui
manteniendo en gran parte de
Europa el calendario juliano con la nos dar la fecha actual segn el calendario judo que es: 10/25/5766.
nica adaptacin de fijar la fecha
de referencia de la cuenta de aos
en el nacimiento de Cristo. jewishtojd(mes,da,ao)
Pero dado que la duracin real del
ciclo de translacin de la tierra Nos devuelve el da juliano correspondiente a una determinada fecha del calendario
alrededor del sol es de 365,2422 judo.
das solares medios, el calendario
juliano con aos de 365,25 das Por ejemplo:
empezaba a acumular un error
importante. <? echo jdtogregorian(jewishtojd(7,21,5758)) ?>
El Papa Gregorio XIII realiz la
correccin en el ao 1582. Se nos devolver 3/19/1998 que es la fecha gregoriana correspondiente al da 21 del
descontaron diez das y es por eso sptimo mes del ao 5758 segn el calendario judo.
que en 1582, al cuatro de octubre
le sigui el da quince (viernes).
jdtofrench(n de das julianos)
Para evitar sucesivos desfases se
modificaron las condiciones de los
aos bisiestos que, en lo sucesivo, Esta funcin nos devuelve la fecha segn el calendario republicano francs
habran de cumplir la condicin de correspondiente al da juliano especificado como parmetro.
que su ordinal sea divisible por 4 y
que no acabe en 00 con la <? echo jdtofrench (gregoriantojd (5, 7, 1796)) ?>
excepcin de los mltiplos de 400
que tendran condicin bisiestos.
nos dar la fecha del calendario republicano francs que se corresponde con el 7 de
Calendario judo Mayo de 1796 (gregoriano) que segn parece es: 8/18/4.
La era juda comienza a contar Slo convierte fechas comprendidas entre los aos 1 y 14 (fechas Gregorianas del 22
desde un supuesto ao de la de septiembre de 1792 al 22 de septiembre de 1806) que se corresponden con el perodo
creacin del mundo, que se calcula
de vigencia oficial de este calendario.
sumando las edades de las
distintas generaciones men-
cionadas en la Biblia. frenchtojd(mes,da,ao)
El ao judo se corresponde con el
cristiano sumndole a ste 3.760 Convierte una fecha del calendario republicano francs en su equivalente en das
aos. julianos.
El ao judo es solar como el Por ejemplo:
cristiano, pero sus meses son
lunares, por lo que cada dos o tres <? echo jdtogregorian(frenchtojd(6,7,8)) ?>
aos tiene que aadirse un mes
bisiesto para adecuar al ao solar
el cmputo de los meses lunares. nos devolver 2/26/1800, que es la fecha gregoriana correspondiente al da 7 del
sexto mes del ao 8 segn el calendario republicano francs.
Calendario
republicano francs Igual que la funcin anterior slo convierte fechas comprendidas entres los aos 1 y 14
El Calendario Republicano fue del calendario francs.
adoptado por la Convencin
Francesa partiendo de las
propuestas tcnicas formuladas
jdmonthname(da juliano, calendario)
por el matemtico Lagrange.
Devuelve del nombre del mes correspondiente al da juliano en el calendario
Es un intento de adaptar el sealado.
calendario al sistema decimal y
eliminar referencias religiosas.
Ejemplos de jdmonthname()
El comienzo del ao coincida con Fecha Gregoriano Juliano Republicano
el da 22 de Septiembre, Gregoriano Juliano Judo
gregoriana abreviado abreviado francs
equinoccio de otoo, y se fij su
da uno del ao uno el 22 de 3/1/1803 Jan January Dec December Tevet Nivose
Septiembre de 1792, da de la 3/2/1803 Feb February Jan January Shevat Pluviose
proclamacin de la Repblica. 3/3/1803 Mar March Feb February AdarI Ventose
Consta 12 meses de 30 das, a los 3/4/1803 Apr April Mar March Nisan Germinal
que se aaden cinco das 3/5/1803 May May Apr April Iyyar Floreal
complementarios (seis en los aos
3/6/1803 Jun June May May Sivan Prairial
que son divisibles por 4 y no por
100) que son festivos y no se 3/7/1803 Jul July Jun June Tammuz Messidor
asignan a ningn mes. 3/8/1803 Aug August Jul July Av Thermidor
Los meses se dividen en tres 3/9/1803 Sep September Aug August Elul Fructidor
dcadas de 10 das. 3/10/1803 Oct October Sep September Tishri Vendemiaire

El calendario fue de aplicacin civil 3/11/1803 Nov November Oct October Heshvan Brumaire
en Francia y sus colonias 3/12/1803 Dec December Nov November Kislev Frimaire
americanas y africanas hasta
Parmetro
1806. calendario
0 1 2 3 4 5

Da de Pascua
Los parmetros sealados en la fila inferior son los correspondientes a los tipos de
El Da de Pascua fue fijado en el nombres de mes sealados en los encabezados de la tabla.
Concilio de Nicea (ao 325) como
el domingo siguiente a la primera
luna llena posterior al equinoccio easter_date(ao)
de Primavera.

Este equinoccio se supone que Devuelve -en tiempo Unix- la media noche del da de Pascua del ao establecido
siempre coincide con el 21 de como parmetro.
marzo.
Esta funcin slo es vlida cuando los valores del ao estn comprendidos entre 1970 y
El algoritmo que usa PHP para su 2037 (tiempo UNIX).
clculo se basa en el que
desarroll Dionisio Exiguo en el El script echo date( "j-n-Y", easter_date(2006)) nos seala que la Pascua del ao 2006
ao 532.
ha sido el da 16-4-2006.
Para los aos anteriores a 1753,
(calendario Juliano) usa un ciclo easter_days(ao)
simple de 19 aos para calcular las
fases de la luna.
Devuelve el nmero de das del perodo comprendido entre el 21 de marzo y el da
En los aos posteriores a esa fecha de Pascua. Si no se especifica el ao, se asume el actual.
(Calendario Gregoriano) se aaden
dos factores de correccin que No tiene las limitaciones de la funcin anterior y es aplicable a aos fuera del intervalo de
tratan de hacer ese ciclo ms tiempo UNIX.
preciso.
El script easter_days(2006) nos seala que la Pascua del ao 2006 ha sido 26 das
despus del 21 de Marzo.

Cuidado!

Si piensas en la posibilidad de utilizar estas funciones en alguna aplicacin concreta que


pretendas publicar en un hosting de la red cercirate antes de que estn habilitadas.

Anterior Indice Siguiente


Clases y objetos

Clases y objetos
El ejemplo ms simple

Aunque PHP no es un lenguaje En este ejemplo podemos ver como utilizar una clase para definir una plantilla que va a
orientado a objetos, s tiene multiplicar siete por ocho y que nos va a devolver el resultado de esa operacin cada vez que
recursos que permiten definir sea invocada.
clases y construir objetos.

El uso de clases y objetos no <?


aade ninguna funcionalidad class Multiplica{
nueva a las posibilidades de PHP. var $factor1=7;
Su verdadera utilidad es la de var $factor2=8;
hacer la programacin de otra function curratelo(){
manera, con un cdigo ms legible echo $this->factor1*$this->factor2;
y reutilizable. }
}
Las clases $objeto= new Multiplica;
$objeto->curratelo();
Una clase no es otra cosa que una ?>
especie de plantilla en la que se
pueden definir una serie de
variables que pueden contener Ver ejemplo70.php
valores predefinidos y un
conjunto de funciones que
pueden ser invocadas desde Invocando varias veces el mismo objeto
cualquier parte del documento.

La sintaxis es la siguiente:
En este ejemplo puedes observar cmo al invocar dos veces a $objeto el valor que nos devuelve
es el resultado de la ltima llamada y tambin como se pueden crear dos objetos distintos.
class nombre {
....
... definicin de variables.... <?
.... class Multiplica{
.. constructores (opcional)... var $resultado;
.... function curratelo($a,$b){
.. definicin de funciones... $this->resultado=$a*$b;
.... }
} function imprimelo(){
Vayamos por partes.
echo $this->resultado,"<br>";
}
Dentro de una clase podemos }
definir las variables que sern $objeto= new Multiplica;
utilizadas por sus funciones $objeto->curratelo(7,3);
internas y a las que es posible (no $objeto->curratelo(11,4);
es imprescindible hacerlo) asignar $objeto1= new Multiplica;
valores. $objeto1->curratelo(-23,11);
Para definir una variable es $objeto->imprimelo();
obligatorio anteponer var a su $objeto1->imprimelo();
nombre y en el caso de que ?>
tratemos de asignarle un valor,
bastar con poner detrs del
nombre el signo = seguido del Ver ejemplo71.php
valor.

Ni que decir tiene que el nombre Recogiendo resultados en un array


de la variable utiliza la sintaxis
habitual de PHP y que si los
valores asignados son tipo cadena En este ejemplo vemos cmo se puede invocar reiteradamente una funcin utilizando el mismo
tienen que ir entre comillas. objeto y como pueden recogerse esos resultados en un array.

var $pepe="Jose"
<?
es una sintaxis vlida, pero class Multiplica{
var $resultado;
$pepe="Jose" var $indice=0;
no lo es, le falta el var y si lo
function curratelo($a,$b){
escribimos as nos dar un error.
$this->resultado[$this->indice]=$a*$b;
Ms adelante hablaremos de los $this->indice++;
constructores, pero dado su }
carcter opcional veamos antes las
funciones. function imprimelo(){
foreach($this->resultado as $valor){
Las funciones definidas dentro de echo $valor,"<br>";
las clases tienen una sintaxis
}
idntica al resto de las funciones
PHP con una salvedad importante:
}

Siempre que desde una funcin }


contenida en una clase se trate
de invocar una variable definida $objeto= new Multiplica;
en la misma clase ha de hacerse
con la siguiente sintaxis: $objeto->curratelo(7,3);
$objeto->curratelo(11,4);
$this->variable
$objeto->curratelo(-23,11);
Prestemos mucha atencin. El $ va $objeto->imprimelo();
siempre delante de la palabra ?>
this y solo se escribe una vez y
en esa posicin.
El nombre de la variable (que va Ver ejemplo72.php
siempre despus de -> no lleva
pegado el $.
Ejemplos de uso de un constructor
Observa los ejemplos!
Crear y utilizar objetos
<?
Las clases son solo plantillas y sus class Multiplica{
funciones no se ejecutan hasta var $factor1=7;
que se les ordene. var $factor2=8;
function Multiplica(){
Para poder utilizarlas primero print $this->factor1*$this->factor2."<br>";
debemos crear un objeto y luego }
ejecutar sobre ese objeto la }
funcin o funciones que deseemos.

Creacin de objetos $objeto= new Multiplica;

Para crear un objeto en el que se ?>


vaya a utilizar una clase
determinada debemos usar la
siguiente sintaxis: Ver ejemplo73.php

$nombre = new clase

donde nombre es una palabra


<?
cualquiera con la que identificar el
objeto (como si se tratara de una class Multiplica{
variable) y clase es el nombre de
una de las clases definidas. var $producto;

Cuidado! function Multiplica($a=3,$b=7){


$this->producto=$a*$b;
Fjate que detrs del nombre de la
print $this->producto."<br>";
clase no hemos puesto los ()
que suelen utilizarse para invocar }
las funciones. }
$objeto= new Multiplica;
Utilizando objetos
$objeto->Multiplica(90,47);
Una vez definido un objeto ya se
le pueden aplicar las funciones
$objeto->Multiplica(47);
definidas en la clase. La sintaxis
es la siguiente:
$objeto->Multiplica();
$nombre->funcion()

Donde $nombre es la misma ?>


variable utilizada a la hora de
crear el objeto, el -> es
obligatorio, funcion es el nombre Ver ejemplo74.php
de una de las funciones
definidas en la clase invocada y
donde los () s son obligatorios y Un ejemplo ms completo
adems -como ocurra en las
dems funciones PHP- puede
contener valores, variables, En este ejemplo puedes ver como el constructor crea automticamente los valores de la
etctera separadas por comas. primera fila de la tabla resultante.

Reiterando
llamadas a objetos
<?
Si hacemos varias llamadas a una Class Operaciones {
funcin utilizando el mismo objeto var $inicializada=32;
los resultados se van var $num1;
sobrescribiendo sobre los de la var $num2;
llamada anterior. var $suma;
Si queremos conservar varios
var $diferencia;
resultados obtenidos de la var $producto;
aplicacin de la misma funcin var $cociente;
tenemos dos opciones: var $contador=0;
function Operaciones ($val1=45,$val2=55){
Crear varios objetos
$this->contador +=1;
Utilizar arrays $c=$this->contador;
$this->num1[$this->contador]=$val1;
$this->num2[$c]=$val2;
En los ejemplos podemos ver
$this->suma[$c]=$val1+$val2;
ambos supuestos.
$this->diferencia[$c]=$val1-$val2;
$this->producto[$c]=$val1*$val2;
Constructores $this->cociente[$c]=$this->inicializada*$val1/$val2;
}
Cuando se define una funcin cuyo
nombre es idntico al de la clase
que la contiene recibe el nombre function imprime(){
de constructor. print "<table align=center border=1>";
print "<td>Num 1</td><td>num2</td><td>Suma</td>";
Esa funcin -el constructor- se
print "<td>Diferencia</td><td>Producto</td><td>Cociente</td><tr>";
ejecuta de forma automtica en el
momento en que se define un foreach($this->num1 as $clave=>$valor){
nuevo objeto (new) print "<td align=center>".$valor."</td>";
print "<td align=center>".$this->num2[$clave]."</td>";
Segn como est definido, el print "<td align=center>".$this->suma[$clave]."</td>";
constructor puede ejecutarse de print "<td align=center>".$this->diferencia[$clave]."</td>";
distintas formas: print "<td align=center>".$this->producto[$clave]."</td>";
print "<td align=center>".$this->cociente[$clave]."</td><tr>";
Con los valores predefinidos en
las variables de la clase.
}
print "</table>";
Mediante la asignacin de
valores preestablecidos en los }
propios parmetros de la funcin }
constructor. $objeto= new Operaciones;
En el ejemplo puedes ver la
sintaxis de esta forma en la que se
for ($i=1;$i<11;$i++){
for ($j=1;$j<11;$j++){
le asignan los valores 3 y 7 a las
$objeto -> Operaciones($i,$j);
variables $a y $b.
}
En el mismo ejemplo puedes ver }
tambin la utilidad aadida del
constructor. $objeto-> imprime();

Cuando se le pasan valores la ?>


funcin se ejecuta sin tomar en
consideracin los asignados por
defecto en la funcin y cuando se Ver ejemplo75.php
le pasan slo parte de esos
valores utiliza los valores
recibidos y para los no asignados Un ejemplo de clase extendida
en la llamada utiliza los valores del
constructor.
En este ejemplo puedes ver como las clases extendidas utilizan variables de la clase padre,
pueden tener constructores propios pero solo ejecutan su propio constructor pero no el
Clases extendidas
de la clase padre.

PHP tambin tiene la posibilidad de Para que el constructor de la clase padre sea ejecutado desde la clase extendida tiene que ser
crear clases extendidas cuya invocado expresamente.
virtud es poder disponer tanto de
variables y funciones propias como
de todas las variables y funciones <?
de la clase padre. class Multiplica{

Sintaxis de las clases var $factor1=7;


extendidas var $factor2=8;

function Multiplica(){
Para crear clases extendidas se
print $this->factor1*$this->factor2."<br>";
requiere utilizar la siguiente
sintaxis:
print "Esto est en el constructor de la clase padre<br>";
}
class nuev extends base { }
....
... definicin de variables.... class MeSeOlvido extends Multiplica{
....
.. constructores (opcional)... var $divisor=5;
.... function MeSeOlvido(){
.. definicin de funciones...
print $this->factor1*$this->factor2/$this->divisor."<br>";
....
}
}
}
Como habrs podido deducir nuev
es el nombre de la nueva clase (la $objeto= new MeSeOlvido;
extendida), base es el nombre de
la clase padre y extens es la $objeto->Multiplica();
palabra clave que indica a PHP que ?>
se trata de una clase extendida.

PHP no permite las herencias Ver ejemplo76.php


mltiples. No es posible crear una
clase extendida de otra clase
extendida.
Ejemplo de funciones PHP con clases y objetos
Funciones con Clases y
En este ejemplo puedes comprobar que las clases pueden escribirse en ficheros externos y
objetos posteriormente ser incluidas en un script PHP mediante la funcin include.

Existen algunas funciones que


<?
pueden resultarte tiles a la hora
de trabajar con clases y objetos. include("ejemplo75.php");
Son las siguientes:
$busca="imprima";
method_exists(obj, func)
if(method_exists ( $objeto, $busca)){
Comprueba si est definida la echo "Existe la funcin $busca <br>";
funcin func (funcin y mtodo
}else{
son sinnimos) en el objeto obj.
echo "No existe la funcin $busca <br>";
Devuelve un valor booleano. Cierto }
(true) en el caso de que exista esa
funcin y falso en el caso de que $r=get_class_vars ("Operaciones");
no exista. foreach ($r as $pepe=>$pepito){
echo "$pepe -->$pepito<br>";
get_class_vars(clase)
}
Crea un array asociativo cuyos
ndices son los nombres de las $s=get_class_methods("Operaciones");
variables y cuyos valores coinciden foreach($s as $clave){
con los valores preasignados a echo $clave,"<br>";
cada una de esas variables. }
print_r(get_object_vars($objeto));
En este array solo se recogen las ?>
variables que han sido inicializadas
asignndoles un valor.

get_class_methods(clas)
Ver ejemplo77.php
Devuelve un array conteniendo los
valores de todos los mtodos Ejemplo de utilizacin de ::
(funciones) definidas en la clase
clas.
<?
get_object_var(obj) class A {
function ejemplo() {
Devuelve todas las variables (y
sus valores) contenidas en el echo "Este es el resultado de la funcin ejemplo<br>";
objeto obj. }
}
La llamada :: # llamo a la funcion sin crear un nuevo objeto
# usando ::
PHP permite llamar a una funcin A::ejemplo();
definida en una clase sin
necesidad de crear un objeto. #ahora creo el objeto $b y llamo a la funcin
La sintaxis es la siguiente:
$b = new A;
clase :: funcion() $b->ejemplo();
?>
donde clase es el nombre de una
clase y funcion() es una funcin
definida dentro de esa clase. ejemplo78.php
Su funcionalidad es la misma que
si escribiramos:
Mtodos con el mismo nombre
$nombre = new clase

$nombre -> funcion ()


<?
Mtodos con # creamos una clase padre
el mismo nombre class Padre{
function prueba() {
echo "Esto est en la funcin prueba de la clase PADRE<br>";
Los objetos de clases extendidas
}
pueden usar tanto las funciones
contenidas en la propia clase
}
extendida como en la clase padre.
Sin embargo se puede plantear # creamos una clase extendida (Hija) con una funcion de igual nombre
una situacin (tendremos # funcion ejemplo
oportunidad de verla en los temas class Hija extends Padre{
relativos a los ficheros PDF) en la function prueba(){
que existan dos funciones con echo "Esto est en la funcin prueba de la clase HIJA<br>";
idntico nombre, una en la clase }
extendida y otra en la clase padre. # creamos un nuevo objeto de la clase hija que invoque
# ambas pruebas, la de la clase hija y la de la clase padre
En esa situacin, siempre que se
invoque el mtodo, se ejecutar el function ambas(){
incluido de la clase para la que se print "Ejecucin de la funcin ambas<br>";
haya definido el objeto. # mediante $this-> requerimos la ejecucin de metodo prueba
# de la clase actual
En el ejemplo puedes ver las $this->prueba();
diferentes opciones posibles - # al sealar parent:: requerimos la ejecucin de metodo prueba
objetos creados sobre ambas # de la clase padre
clases- y tambin las, ya
parent::prueba();
comentadas, de ejecucin de los
}
mtodos sin creacin previa de
objetos mediante la sintaxis: }
# creamos un objeto de la clase padre y por tanto invocar
nombre_clase :: metodo() # los mtodos contenidos en esa clase sin considerar los de la
# clase extendida.
En este caso, si el mtodo se $objeto1 =new Padre();
invoca desde una funcin de la print "<BR>Ejecutamos el mtodo prueba().
clase extendida en vez de escribir
El \$objeto1 utiliza la clase padre<br>";
el nombre asignado a la clase
padre se especifica la referencia a
$objeto1->prueba();
esta mediante la palabra: parent # creamos un nuevo objeto sobre la clase extendida.
# Podrn invocarse mtodos de la clase padre y de la extendida
# pero si coinciden los nombres de esos mtodos prevalecer
Bibliotecas de clases # el de la clase extendida.
$objeto2 =new Hija();
Una de las ventajas ms print "<BR>Ejecutamos el mtodo prueba().
importantes de las clases es la El \$objeto2 utiliza la clase Hija<br>";
posibilidad de reutilizacin de $objeto2->prueba();
rutinas -propias o desarrolladas
por otros- en nuestros scripts.
print "<BR>Ejecutamos el mtodo ambas()<br>";
Existen algunos sitios en la red en
# aqu invocamos otro mtodo de la clase extendida
los que pueden obtener una gran
cantidad de materiales de este $objeto2->ambas();
tipo. Uno de los sitios ms # tambin podemos invocar el mtodo de la clase que deseemos sin crear el
populares puedes encontrarlo en la objeto
direccin: phpclasses.org. Print "<br>Ahora vamos a usar Padre::Prueba()<br>";
Padre::Prueba();
Trataremos con una cierta Print "<br>Ahora vamos a usar Hija::Prueba()<br>";
profundidad la forma de utilizacin Hija::Prueba();
de estas clases de terceros en los ?>
apartados relativos a la creacin
de ficheros en formato PDF.
Ejecutar ejemplo

Anterior Indice Siguiente


La opcin INCLUDE

Utilizacin de
ficheros externos
Los ficheros a incluir

PHP dispone de funciones que Este primer ejemplo de fichero a incluir contiene nicamente texto y etiquetas HTML
permiten insertar en un docu- pero no contiene ninguna llamada a ninguna funcin PHP, ni tampoco ningn script de
mento una parte o la totalidad de este lenguaje. Le hemos guardado con dos extensiones: ejemplo1.inc.php y ejemplo1.
los contenidos de otro. Esta opcin inc.
resulta muy interesante, tanto
desde el punto de vista operativo Si pulsas sobre las opciones Ver ejemplo podrs comprobar que los resultados de
como en lo relativo a la seguridad. visualizacin son distintos dependiendo de la extensin de cada fichero.

Estas son algunos de los recursos


que permiten ese tipo de <h3><font color="#ff0000">Este sera un texto
inclusiones: que se incluira dentro de la pgina
mediante las funciones
include("nom. del fichero") include o require</font></h3><br>
El parmetro nom. del fichero es
una cadena que contiene el path y Ver ejemplo1.inc Ver ejemplo1.inc.php
el nombre del fichero cuyos
contenidos pretendemos incluir.

Pueden incluirse ficheros con Este otro fichero que tambin hemos incluido con dos extensiones contiene
cualquier extensin aunque es funciones PHP que pueden ser invocadas desde cualquier otro documento PHP.
muy habitual utilizar archivos con
extensin .inc.php. Dado que las funciones contienen etiquetas HTML al abrir -mediante el navegador- el
documento con extensin .inc sern interpretadas y se visualizarn parte de los
La primera parte (inc) nos contenidos. Cuando lleva extensin .php se visualizar una pgina en blanco ya que esas
permitir identificar este tipo de etiquetas estn contenidas en funciones que no son invocadas desde el propio script.
ficheros mientras que la extensin
php obligara a que (si un usuario
malicioso pretende visualizar el <?
contenido del fichero) fuera function Encabezado() { ?>
interpretado por PHP y, como <HTML>
consecuencia de ello, solo <head>
devolvera el resultado sin permitir <title>
la visualizacin de informaciones Pruebas con la funcin include
privadas (contraseas por </title>
ejemplo) que pudiera contener. </head>
Este tipo de ficheros pueden <BODY>
contener: texto, etiquetas HTML y <center><img src="./images/cabina.jpg"><br>
funciones. <font size=6 face="Times" color="#0000ff">Pruebas PHP</font><br>
<hr width=75%>
Si no contiene funciones se podr <? } ?>
insertar tantas veces como se
invoque y se insertar, adems, <? function Pie() { ?>
todo su contenido tal como puedes
<center><hr width=50%>
ver en el ejemplo.
<font size=2 face="Arial" color="#ff0000">Luchando con PHP</font>
Si el fichero contiene funciones <hr width=50%></center>
solo podr ser invocado una vez </body>
ya que si se hiciera una segunda </html>
llamada se producira un error por <? } ?>
duplicidad en los nombres de las
funciones. <? function Calcula($a,$b) {
return $a*$b;
Como vers en el ejemplo, es
posible incluir cualquier tipo de
} ?>
funciones.
Tanto las de la forma:

<? function nombre { ?> Ver ejemplo2.inc Ver ejemplo2.inc.php

.....
... cdigo HTML ... Incluyendo ficheros
......

<? } ?> Aqu tienes el cdigo de un documento en el que se invocan mediante la funcin include
los dos documentos anteriores y se ejecutan sus funciones.
con las que se pueden incluir
porciones de cdigo HTML en
cualquier script, como las del tipo: <!-- empezaramos incluyendo el fichero que contiene
las funciones. No escribira nada hasta que las
function nombre { funciones que contiene no fueran invocadas //-->
<? include("ejemplo2.inc.php") ?>
..... <!-- Insertaremos un script PHP que invoque
... instrucciones PHP ...
la funcin encabezado. Debe llevar las etiquetas
......
de apertura y cierre <? y ?> de PHP //-->
} <? Encabezado() ?>
<!-- Insertaremos cdigo HTML
que permiten invocar funciones segn nuestra conveniencia //-->
repetitivas a partir de cualquier Aqu ira el contenido de la pgina<br>
documento PHP. .... esto es texto HTML................<br>
Definidas las funciones en el ...........................<br><br><br>
fichero a incluir y colocado al <!-- Incluimos el fichero ejemplo1.inc.php y dado que no contiene
comienzo de la pgina un script ninguna funcin, insertar aqu todo su contenidos //-->
que contenga el include y la ruta <? include("ejemplo1.inc.php") ?>
de ese fichero, bastar con invocar <!-- Insertaremos ms codigo HTML -->
cualquiera de las funciones, en ....................<br>
cualquier punto del documento, ...........................<br><br><br>
para que esa llamada sea <!-- Incluimos nuevamente el fichero ejemplo1.inc.php Puede repetirme
sustituida por el resultado de la la inclusin porque no contiene funciones
ejecucin de la funcin.
si las contuviera habra un conflicto de duplicidad
porque una funcion no puede estar definida dos veces
Como es lgico, solo sern
visualizados en el navegador del con el mismo nombre. La instruccin include
cliente los resultados de la como en todos los casos deber ir dentro de un script PHP
ejecucin de las funciones que y por tanto entre <? y ?> //-->
hayan sido invocadas. <? include("ejemplo1.inc.php") ?>
<!-- Ahora ejecutaremos la funcion PHP Calcula() pasando como
parmetros 7 y 9. El return de la funcin nos devolver
La funcin require()
el resultado que imprimiremos aqu //-->

Tiene la misma sintaxis que <? print "Aqu va el resultado de la multiplicacin: ".Calcula(7,9); ?>
include y una funcionalidad <!-- Por ultimo invocaremos la funcin Pie() -->
similar, aunque con algunas
<? Pie() ?>
diferencias.

Igual que ocurra con aqul,


Ver ejemplo79.php
cuando un fichero es invocado por
require esa llamada lo que hace
es sustituirse a s misma por el
contenido del fichero especificado.
La funcin include_once
A diferencia de include, la <!-- Repetimos la inclusin de ambos ficheros
etiqueta require lee y escribe en pero veremos que no aparece mensaje de error
el documento a partir del que es
por duplicidad de funciones y adems
invocada el archivo referenciado
pese a hacer una doble insercin de ejemplo1
completo y no acepta
condicionales que s son solo se visualiza una vez por efecto del filtro
aceptados por include. establecido por include_onde //-->
<? include_once("ejemplo2.inc.php") ?>
<? Encabezado() ?>
Evitar errores por Aqu ira el contenido de la pgina<br>
duplicidad de llamadas ....................<br>
...........................<br><br><br>
Tanto en el caso de usar la <? include_once("ejemplo1.inc.php") ?>
instruccin include como con ....................<br>
require, si se intenta incluir dos o no aparecer nada aqu debajo<br><br><br>
ms veces un fichero que <? include_once("ejemplo1.inc.php") ?>
contenga funciones, se producir <? include_once("ejemplo2.inc.php") ?>
un error (PHP no permite que dos
funciones tengan el mismo
nombre) y se interrumpir la Ver ejemplo80.php
ejecucin del script.

Los errores de ese tipo puede El resultado de este otro ejemplo es idntico al anterior. Slo hemos sustituido
evitarse usando las funciones: include_once por require_once, que tiene una funcionalidad similar a la anterior.

include_once("fichero")
y <? require_once("ejemplo2.inc.php") ?>
require_once("fichero") <? Encabezado() ?>
Aqu ira el contenido de la pgina<br>
que a diferencia de include y ....................<br>
requiere van a impedir que un ...........................<br><br><br>
mismo fichero pueda incluirse dos <? require_once("ejemplo1.inc.php") ?>
veces. ....................<br>
En los ejemplos vas a poder ....nada de aqui en adelante ...<br><br><br>
comprobar que no aparece el <? require_once("ejemplo2.inc.php") ?>
mensaje de error cuando se utiliza <? require_once("ejemplo1.inc.php") ?>
esta funcin y que el texto que
anteriormente era incluido dos
veces ahora solo aparece una vez.
Ver ejemplo81.php

Comprobando los ficheros


incluidos La funcin get_included_files()

PHP dispone de dos funciones que <? include_once("ejemplo2.inc.php") ?>


permiten recoger en un array la <? Encabezado() ?>
lista de ficheros que se han <? include_once("ejemplo1.inc.php") ?>
insertado en el documento por <? Pie() ?>
medio de las instrucciones
require, require_once y con Lista de fichero utilizados por include
include_once e include.

Tales funciones son estas: <?


$z= get_included_files();
$v=get_included_files() foreach($z as $clave=>$valor) {
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
Recoge en un array escalar };
(contenido en la variable $v) los ?>
nombres de los ficheros incluidos
en el archivo en uso por
include_once.
Ver ejemplo82.php
$v=get_required_files()

Igual que la funcin anterior Cuidado!


recoge en un array escalar
(contenido en la variable $v) los La manera de escribir los path difiere de un sistema operativo a otro. Bajo Windows
nombres de los ficheros incluidos debemos usar \ como separador, mientras que otros S.O. (Unix, Linux, etctera) requieren
en el archivo en uso mediante utilizar /.
require_once.
Para publicar tus pginas en un hosting no Windows tendras que modificar tus scripts.
Tenlo en cuenta
Mejorando la seguridad

Hemos hablado de la funcin


show_source, que permita
visualizar el cdigo fuente de los Ejercicio n 27
scripts no solo locales sino de
cualquier URL- si esta funcin no
Crea un subdirectorio con nombre seguridad en C:\Apache. Despus crea un documento
estaba desactivada en el php.ini.
similar a ejemplo2.inc.php y gurdalo all.
Esa posibilidad de ver no slo Crea otro documento ejercicio27.php en que incluyas algunas de aquellas funciones.
permite el espionaje industrial (ver Presta atencin de incluir el path correcto y comprueba su funcionamiento.
la tcnica de construccin de los
scripts, etctera) sino que permite
ver tambin las claves y Utilizando include para gestin de fechas
contraseas de acceso a las bases
de datos que pudieran contener los Las funciones que incluye PHP para el manejo de fechas solo contemplan periodos
scripts. posteriores a 1970. Para el caso de fechas anteriores a esta, existen un funciones que
pueden descargarse desde: http://phplens.com/lens/dl/adodb-time.zip.
Aparte de simplificar el trabajo la
opcin de incluir ficheros externos
permite guardar la informacin El archivo comprimido contiene un fichero -adodb-time.inc.php- con funciones PHP
confidencial fuera del root del de que se comportan de forma idntica a las nativas de PHP y que, adems, permiten
servidor y usarla mediante estas utilizar fechas anteriores a 1970 y valores negativos del tiempo Unix.
llamadas.
De ese modo show_source Para utilizar estas funciones bastara con poner en el script:
permitira visualizar el nombre de include("adodb_time.inc.php"); y sustituir las funciones de fecha de acuerdo con lo que
ese fichero externo pero no su se indica en esta tabla:
contenido.
Funcin PHP Funcin Adodb-time
Si creramos un directorio por
ejemplo como subdirectorio de c: getdate
\Apache (fuera del root del adodb_getdate()
()
servidor) y le ponemos como
nombre sg, podramos guardar all date() adodb_date()
los ficheros ejemplo2 y ejemplo1,
con lo cual sus contenidos no gmdate
adodb_gmdate()
seran visibles con show_source. ()

En este caso la instruccin include mktime


adodb_mktime()
ha de contener el path y sera la ()
siguiente:

include("C:\Apache\sg\fichero") En este enlace puedes comprobar los resultados de la aplicacin de estas funciones que,
como vers, son idnticos a los que hemos visto en el tema Funciones de fecha con la
salvedad de que en este caso se admiten fechas anteriores a 1970 y tiempos Unix
negativos.

Anterior Indice Siguiente


Manejo de ficheros externos

Utilizacin de ficheros
Funcin fopen()
externos En esta tabla tienes los parmetros modo de la funcin fopen de apertura de ficheros.

PHP dispone de funciones Valores del parmetro modo de la funcin fopen


mediante las cuales se pueden
crear, modificar, borrar y leer Valor Funcionalidad
ficheros de cualquier tipo as como r Abre el fichero en modo lectura y coloca el puntero al comienzo del fichero
extraer informacin sobre ellos y
sus contenidos. r+ Abre el fichero en modo lectura y escritura y coloca el puntero al comienzo del fichero
Abre el fichero en modo escritura y coloca el puntero al comienzo del fichero, reduce su tamao a
Abrir o crear ficheros w cero y si el fichero no existe intenta crearlo

Para crear o modificar ficheros se Abre el fichero en modo lectura y escritura y coloca el puntero al comienzo del fichero, reduce
w+ su tamao a cero y si el fichero no existe intenta crearlo
utiliza la instruccin:
Abre el fichero en modo escritura y coloca el puntero al final del fichero y si no existe intenta
$f1=fopen(fichero,modo) a crearlo

$f1 es una variable que recoge el Abre el fichero en modo lectura y escritura y coloca el puntero al final del fichero y si no existe
a+ intenta crearlo
identificador del recurso, un valor
importante (ser utilizado para
referirnos a este fichero en Un fichero de pruebas
instrucciones posteriores), fichero
es el nombre (con extensin) del Hemos creado un fichero llamado domingo.txt para poder utilizarlo en los ejemplos.
fichero a abrir o crear y deber
Su contenido es exactamente el siguiente (incluidos los saltos de lnea):
escribirse entre comillas, y modo,
que es una cadena que debemos
poner entre comillas, el indicador Esto es un ejemplo para comprobar
del modo de apertura elegido. si funcionan o no los saltos de linea
en un documento de texto
En la tabla de la derecha hemos
que ser leido desde php
enumerado las opciones de ese
parmetro.

Si el fichero que pretendemos abrir


est en un directorio distinto al del
Un ejemplo de algunas funciones sobre ficheros
script, debe incluirse el path
completo delante del nombre del <?
fichero y la cadena resultante debe /* abrimos con w+ con lo cual borramos el contenido
ir entre comillas. y creamos el fichero en el caso de que no existiera */
$f1=fopen("sabado.txt","w+");
Cuidado!
# escribimos en el fichero vacio
Si incluimos, junto con el nombre fwrite($f1,"Esta es la primera linea que escribimos en el fichero<br>");
del fichero, un path hay que tener #cerramos el fichero
muy presente que bajo Windows fclose($f1);
hemos de utilizar siempre el echo "<H2>Este es el resultado despus del primer fwrite</H2><br>";
separador anti-slash (\). include("sabado.txt");
# abrimos con r+ con lo cual sobreescribiremos
Cerrar ficheros
# en el fichero preexistente
Una vez finalizado el uso de un $f1=fopen("sabado.txt","r+");
fichero es necesario cerrarlo. Para # escribimos en al principio del fichero preexistente
ello PHP dispone de la siguiente # ya que al abrir un fichero en este modo el puntero
intruccin: # se situa al comienzo del fichero
fputs($f1,"Esto se sobreescribe");
fclose($f1)
#cerramos el fichero
Esta funcin - que devuelve un fclose($f1);
valor booleano- permite cerrar el echo "<H2>Este es el resultado despus del segundo fwrite</H2><br>";
fichero especificado en $f1 que, include("sabado.txt");
como recordars, es el valor del # abrimos con a+ con lo cual AADIREMOS
identificador de recurso que le # al fichero preexistente ya que el modo de apertura
fue asignado automaticamente por # situa el puntero al final del fichero
PHP en el momento de la apertura. $f1=fopen("sabado.txt","a+");
# escribimos al final del fichero preexistente
Punteros internos fputs($f1," Esto se aadir al final<br>");
#cerramos el fichero
PHP dispone de funciones para
fclose($f1);
situar sus punteros internos y echo "<H2>Este es el resultado despus del tercer fwrite</H2><br>";
tambin para determinar la include("sabado.txt");
posicin a la que apuntan en un echo "<h2>Leyendo con fgetc</h2><br>";
momento determinado. # abrimos con r+ con lo cual podemos LEER y AADIR
# al fichero preexistente
Se trata de las siguientes: $f1=fopen("sabado.txt","r+");
# leemos el primer caracter del fichero
feof($f1)
# ya que el apuntador esta el principio
Es un operador booleano que $z=fgetc($f1);
devuelve CIERTO (1) si el puntero # imprimimos el primer carcter
seala el final del fichero y FALSO echo "He leido el primer carcter: ",$z,"<br>";
si no lo hace. /* leemos el segundo caracter del fichero
ya que el apuntador se ha movido a esa posicin al leer
rewind($f1)
anteriormente el primer carcter.
Coloca el puntero interno al OBSERVA que NO HEMOS CERRADO AUN EL FICHERO */
comienzo del fichero indicado por $z=fgetc($f1);
el identificador del recurso $f1. # este es el nuevo valor de la variable $z
echo "He leido el segundo carcter: ",$z,"<br>";
fseek($f1, posicin) /* leemos el siguiente caracter del fichero
Sita el apuntador del fichero
ya que el apuntador se ha movido a una nueva posicin
sealado por el identificador del Recuerda que NO HEMOS CERRADO AUN EL FICHERO */
recurso $f1 en la posicin $z=fgetc($f1);
(expresada en bytes) sealada por # este es ahora el valor de la variable $z
posicin. echo "He leido el tercer carcter: ",$z,"<br>"
echo "<h2>Ahora el puntero est en el tercer caracter<br>";
ftell($f1) echo "fgets empezar a leer a partir de el</H2>";;
$z=fgets($f1,200);
Devuelve (expresada en bytes) la echo "Con fgets he leido esto: ",$z,"<br>";
posicin actual del puntero #Ahora cerramos el fichero
interno del fichero. fclose($f1);
echo "<br><H2>Al abrir el fichero de nuevo fgets
Cuidado!
comienza desde el principio</h2><br>";
Antes de utilizar funciones es #Abrimos de nuevo el fichero
necesario que el fichero que seala $f1=fopen("sabado.txt","r");
el identificador de recursos haya #Leemos su contenido
sido abierto. $za=fgets($f1,5000);
#Presentamos el contenido
Lectura de ficheros echo $za;
#Ahora cerramos el fichero
La lectura de los contenidos de un
fclose($f1);
fichero puede hacerse de dos
maneras: sin apertura previa o con echo "--------------------------------------------------------------
apertura previa del mismo. <br>";
?>
Lectura de ficheros <h2>Aqui veremos el contenido (sin etiquetas HTML)de una pagina web</H2>
sin apertura previa <?
# Escribimos la direccin completa de la pgina y
Las funciones que permiten la
# la abrimos en modo solo lectura
lectura de ficheros sin haber sido
abiertos previamente son las
$f1=fopen("http://localhost/cursoPHP/php55.php","r");
siguientes: # Escribimos un bucle para que vaya leyendo
# cada una de las lneas hasta llegar al final del fichero
readfile(fichero) while (!feof($f1)) {
$z = fgetss($f1, 1024);
Escribe directamente en el punto echo $z,"<br>";
de insercin del script el contenido
}
completo del fichero.
#Cerramos el fichero
Atencin! fclose($f1);
#Borramos el fichero antes de salir
La funcin readfile escribe el unlink("sabado.txt");
contenido del fichero sin necesidad ?>
de ir precedido por echo ni print.

Si se pone echo o se recoge en Ver ejemplo83.php


una variable, adems de su
contenido aadir un nmero que
indica el tamao del fichero Otro ejemplo completando el anterior
expresado en bytes.

$var=file(fichero) <?
# Abrimos el fichero en modo lectura
Crea $var un array escalar $f1=fopen("domingo.txt","r");
cuyos elementos tienen como # Al anteponer echo a fpassthru
valores los contenidos de cada una # NOS APARECERA AL FINAL EL TAMAO DEL FICHERO
de las lneas del fichero. echo fpassthru($f1),"<br>";
Una lnea termina all donde se /* Abrimos de nuevo el fichero
haya insertado un salto de lnea RECUERDA QUE FPASSHRU LO CIERRA AUTOMATICAMENTE
en el fichero original. DESPUES DE EJECUTAR LA INSTRUCCIN */
$f1=fopen("domingo.txt","r");
Lectura de ficheros # Este bucle nos escribir cada una de las
con apertura previa #lineas del fichero
while(!feof($f1)){
Para la utilizacin de estas
funciones los ficheros han de ser $z=fgets($f1,4000);
abiertos en un modo que permita echo $z,"<br>";
la lectura. }
# Situamos el puntero
La funcin que permite la lectura #al comienzo del fichero
completa del fichero es: rewind($f1);
# Reescribimos el fichero
fpassthru($f1)
while(!feof($f1)){
Esta funcin presenta algunas $z=fgets($f1,4000);
peculiaridades importantes: echo $z,"<br>";
}
Cierra el fichero de forma # Situamos de nuevo el puntero
automtica despus de la lectura. #al comienzo del fichero
Por esa razn, si se escribe la
rewind($f1);
funcin fclose a continuacin de
# Situamos el puntero
fpassthru, se produce un error.
#sealando el byte nmero 15 del fichero
Si el resultado se recoge en una fseek($f1,15);
variable, o si va precedido de # Releemos el fichero
echo, adems de escribir el #ahora la primera linea estar incompleta
contenido del mismo, aadir el #LE FALTARAN LOS 15 PRIMEROS CARACTERES
nmero de bytes que indican su while(!feof($f1)){
tamao. $z=fgets($f1,4000);
fgets($f1,long) echo $z,"<br>";
}
Extrae del fichero sealado por el # volvemos el puntero al comienzo del fichero
$f1 una cadena que comienza rewind($f1);
en la posicin actual del puntero #leemos la primera linea
y cuya longitud est limitada por $z=fgets($f1,4000);
el menor de estos tres valores: echo $z,"<br>";
El valor (en bytes) indicado en
# Determinamos LA POSICION ACTUAL DEL PUNTERO
long. echo ftell($f1),"<br>";
# Cerramos el fichero
La distancia (tambin en bytes) fclose($f1);
desde la posicin actual del echo "_________________________________________<br>";
puntero hasta el final del fichero. # leemos el fichero y lo presentamos
# en diferentes modalidades
La distancia que hay entre la
$pepe=readfile("domingo.txt");
posicin actual del puntero y el
readfile("domingo.txt");
primer salto de lnea. echo $pepe, "<br>";
fgetc($f1) #leemos el fichero y lo recogemos
#en un array
Extrae el caracter siguiente al $z=file("domingo.txt");
sealado por la posicin actual del #Al presentar la variable solo
puntero. #nos aparecer la palabra array
echo $z,"<br>";
Escribir en un fichero # presentamos el contenido del array
foreach($z as $linea=>$texto) {
echo "Linea: ",$linea," Texto: ",$texto,"<br>";
Una vez abierto un fichero -en
modo que permita escritura- la };
funcin PHP que nos permite # copiamos el fichero con mensaje de resultado
escribir en el es la siguiente: if (!copy("domingo.txt", "otrodomingo.txt")) {
print("Error en el proceso de copia<br>\n");
fwrite($f1,"texto",long) }else{
print "<br>Fichero copiado con exito";
donde: $f1 sigue siendo el
}
identificador de recurso, texto la
cadena de texto a insertar en el
# renombramos un fichero con mensaje de resultado
fichero y long el nmero mximo if (!rename("otrodomingo.txt", "otrolunes.txt")) {
de caracteres que han de print("Error en el proceso de renombrado<br>");
insertarse. }else{
print "<br>Fichero renombrado con exito";
Si la cadena de texto tiene menor }
o igual longitud que el parmetro unlink("otrolunes.txt");
long la escribir en su totalidad, echo "Ultima modificacin a las: ",date("h:i:s A",
en caso contrario slo escribir el
filemtime ("domingo.txt"))," del da ",
nmero de caracteres indicados.
date("j-n-Y", filemtime ("domingo.txt"));
Tambin es posible utilizar: echo "<br>El tamao del fichero es: ", filesize("domingo.txt"),"
bytes<br>";
fputs($f1,"texto",long) echo "<br>El fichero es tipo: ", filetype("domingo.txt")," <br>";
echo "<br>Saldr un 1 si el fichero existe: ",file_exists("domingo.txt");
que en realidad es un alias de la
?>
funcin anterior.

Atencin!
Ver ejemplo84.php
Estas funciones realizan la
insercin de la cadena a partir
de la posicin a la que apunte el
puntero en el momento de ser Los valores del array devuelto por la funcin stat
invocadas.
Indice Significado Sintaxis Resultado
Si el fichero ya existiera y
contuviera datos los nuevos datos 0 Dispositivo <? echo $d[0] ?> 2
se sobrescribiran sobre el 1 I node <? echo $d[1] ?> 0
contenido anterior.
2 Modo de proteccin de I node <? echo $d[2] ?> 33206
Para poder aadir contenidos a un
3 Nmero de enlaces <? echo $d[3] ?> 1
fichero el puntero deber apuntar
el final del fichero preexistente y 4 Id de usuario del propietario <? echo $d[4] ?> 0
estar abierto en un modo que
permita aadir contenidos.
5 Id de grupo del propietario <? echo $d[5] ?> 0
6 tipo de dispositivo si es un inode device * <? echo $d[6] ?> 2
Borrado de ficheros 7 Tamao en bytes <? echo $d[7] ?> 126
8 Fecha del ltimo acceso <? echo $d[8] ?> 1150840800
Para borrar ficheros se utiliza la
siguiente instruccin: 9 Fecha de la ltima modificacin <? echo $d[9] ?> 1119364802
10 Fecha del ltimo cambio <? echo $d[10] ?> 1150914775
unlink(fichero)
11 Tamao del bloque para el sistema I/O * <? echo $d[11] ?> -1
fichero ha de ser una cadena que
contenga el nombre y la extensin 12 Nmero de bloques ocupados * <? echo $d[12] ?> -1
del fichero y, en su caso, tambin Los valores sealados con * devuelven -1 en algunos sistemas operativos, entre ellos Windows
el path.

Duplicado de ficheros Ejemplo de un contador de visitas

La funcin: <?
/* comprobamos si existe el fichero contador. Si existe
copy(fich1, fich2) leemos las visitas registradas e incrementamos su valor en una unidad
Copia el fichero fich1 (debe Si no existe, registramos 1 como valor de nmero de visitas*/
indicarse nombre y extensin) en if(file_exists("contador.txt")){
otro fichero cuyo nombre y /* abrimos el fichero en modo lectura y escritura (r+) con lo que
extensin se establecen en la el puntero se colocar al comienzo del fichero */
cadena fich2. $f1=fopen("contador.txt","r+");
# leemos el contenido del fichero
Esta funcin devuelve un valor $visitas=(int)(fgets($f1,10));
booleano indicando si la copia se
# lo aumentamos en una unidad
ha realizado con xito TRUE (1) o
FALSE (nul) si por alguna razn no
$visitas++;
ha podido realizarse la copia. # colocamos el puntero al comienzo del fichero para que
# al guardar en nuevo valor sobreescriba el anterior
rewind($f1);
Renombrar ficheros }else{
/*abrimos el fichero en modo lectura y escritura con (w+)
La funcin: de modo que se cree automaticamente al no existir*/
$f1=fopen("contador.txt","w+");
rename(fich1, fich2) #asignamos uno como valor a nmero de visitas
cambia el nombre del fichero fich1 $visitas=1;
(hay que poner nombre y }
extensin) por el indicado en la /* escribimos el nmero de visitas en el fichero. En cualquiera
cadena fich2. de los casos el puntero estar al comienzo del fichero, por tanto
cuando existan valores sern sobreescritos */
Tambin devuelve TRUE o FALSE.
fwrite($f1,$visitas,10);
Si tratamos de cambiar el nombre print("Esta pgina ha sido visitada ".$visitas." veces");
a un fichero inexistente nos dar
fclose($f1);
error.
?>

Funciones informativas
Ver contador
PHP dispone de funciones que nos
facilitan informacin sobre Guardar y leer datos transferidos mediante un formulario
ficheros. Algunas de ellas son las
siguientes: Aunque el modo ms habitual de guardar informacin suele ser los servidores de bases
file_exists(fichero) de datos (MySQL, por ejemplo) la utilizacin de ficheros ofrece interesantes posibilidades
de almacenamiento de informacin.
Esta funcin devuelve TRUE si el
fichero existe, en caso contrario Este es un ejemplo muy sencillo, en el que mediante un formulario tal como el que
devuelve FALSE. aparece en el recuadro puede transferirse y almacenarse la informacin en un fichero.

filesize(fichero)
<form name="fichero" method="post" action="escribe.php">
Devuelve el tamao del fichero <input type="text" name="nombre">
expresndolo en bytes. En caso de <input type="text" name="apellido">
que el fichero no existiera nos dar <input type="edad" name="edad">
un error. <input type="submit" value="enviar">
</form>
filetype(fichero)

Devuelve una cadena en la que se Los datos transferidos mediante un formulario como el anterior podran ser registrados
indica el tipo del fichero. En caso
y visualizados mediante un script como este:
de que el fichero no existiera nos
dar un error.
<?
filemtime(fichero) /*abrimos el fichero en modo a+ para permitir que
se cree en caso de no existir, que permita los modos lectura
Devuelve en tiempo Unix la
fecha de la ltima modificacin del y escritura y que escriba al final del fichero */
fichero. $f1=fopen("escribiente.txt","a+");
# hacemos un bucle para leer los valores transferidos
stat(fichero) # desde el formulario y recogidos en el array $_POST
foreach($_POST as $v){
Devuelve un array que contiene /* aadimos "\r\n" a cada valor para que se inserte
informacin sobre el fichero.
un salto de lnea y que cada valor sea recogido en
En la tabla de la derecha puedes una lnea distinta en el fichero
ver los contenidos asociados a Limitamos las entradas a 150 caracteres*/
cada uno de sus ndices. fwrite($f1,$v."\r\n",150);
}
Recogeremos en un array, que /* para comprobar que los nuevos datos han sido agregados
llamaremos $d, el resultado de la y visualizar el contenido integro del fichero situamos el
funcin stat aplicada sobre el
puntero interno al comienzo del mismo */
fichero domingo.txt.
rewind($f1);
Para ello vamos a utilizar la /* creamos un bucle que vaya leyendo todas las lneas
siguiente sintaxis: hasta encontrar el final del fichero */
while (!feof($f1)) {
$d=stat("domingo.txt") /* vamos leyendo el contenido de cada lnea del fichero
y aunque establecemos en 250 el nmero de carcteres
El contenido y significado de los
valores asociados a los ndices de
dado que los saltos del lnea aparecern antes
array $d son los que tenemos en sern ellos los puntos de interrupcin de cada lectura*/
la tabla de la derecha. $z = fgets($f1,250);
#presentamos el resultado de las lecturas
echo $z,"<br>";
Otras funciones }
# cerramos el fichero
Existen otras muchas funciones fclose($f1);
relacionadas con el manejo de ?>
ficheros y directorios, as como con
los permisos de acceso, etctera.

Hemos resumido nicamente las


de mayor inters. Ejercicio n 28
Si quieres profundizar en este
tema a travs de este enlace
Crea un script -puedes llamarlo ejercicio28.php- de modo que al ejecutarlo escriba en un
podrs acceder al captulo del
fichero la fecha y hora en que se produjo el acceso.
Manual de Referencia oficial de
PHP, en el que se describen las Ese mismo script deber presentar en la pgina la fecha y hora de la visita anterior y si es la
funciones relacionadas con el primera vez que se accede deber aparecer un mensaje diciendo: Esta es la primera vez
manejo de ficheros. que accedes a esta pgina.

Para obtener los valores de fecha y hora, debers utilizar las funciones adodb a las que se
alude en la pgina en la que se trata la opcin Include.

Anterior Indice Siguiente


Transferencia de ficheros

Comprobacin de la
Requisitos de configuracin
configuracin Cuando publicamos en un hosting no tenemos acceso al fichero de configuracin php.
ini pero s podemos conocer su configuracin mediante el script info.php.
Antes de empezar con este tema
debemos comprobar cul es la Recordemos que ese fue nuestro primer script lo hemos creado y utilizado para
configuracin de nuestro php.ini. comprobar nuestra instalacin y lo hemos guardado con ese nombre en el root de
nuestro servidor C:\Apache\htdocs as que podremos acceder a l escribiendo como
Si por alguna circunstancia los direccin http://localhost/info.php.
valores no coincidieran con los que
tenemos aqu a la derecha,
tendramos que abrir php.ini y
La abundante lista que nos muestra info.php contiene las siguientes lneas (las
modificar aquellas directivas. podemos localizar fcilmente porque estn ordenadas alfabticamente), que en nuestro
caso configuracin por defecto tendrn los valores que vemos en la imagen.
Si te apetece, y como simple
experimento, podemos cambiar el
lmite del tamao mximo de
transferencia poniendo:

upload_max_filesize=500K

un valor ms reducido, que nos


servir para hacer una prueba muy
sencilla.
Es imprescindible que file_uploads=On (tal como aparece en la imagen) y resulta
Transferencia de ficheros muy til tambin conocer el valor de upload_max_filesize que por defecto tal como
ves en la imagen es de 2Mb. La primera directiva nos dice que PHP s permite subir
La transferencia de un fichero ficheros al servidor y la segunda nos indica el tamao mximo (en Mbytes) de los
requiere dos documentos: un ficheros que pueden ser objeto de esa transferencia.
formulario que la inicie y un script
que la recoja. Formulario para transferencia de archivos
El formulario Observa que en el formulario hemos insertado una variable oculta (hidden) con el fin
de limitar el tamao mximo e impedir la transferencia de ficheros que excedan ese
Se diferencia del que hemos visto
en pginas anteriores en tres tamao.
aspectos. Dos de ellos se refieren
a cambios dentro de la etiqueta <HTML>
<form> y el tercero es un nuevo <BODY>
tipo de input del que an no <FORM ENCTYPE="multipart/form-data" ACTION="ejemplo86.php"
hemos hablado. METHOD="post">
En la etiqueta <form> hemos de # con este input "oculto" establecemos el limite mximo
incluir obligatoriamente el # del tamao del fichero a transferir. En este ejemplo 1.000.000 bytes
method='POST' y ENCTYPE = <INPUT type="hidden" name="lim_tamano" value="1000000">
"multipart/form-data" ya que <p><b>Archivo a transferir<b><br>
no soporta ni otro mtodo ni otra <INPUT type="file" name="archivo"></p>
forma de encriptacin. <p><INPUT type="submit" name="enviar" value="Aceptar"></p>
</FORM>
El cuerpo del formulario ha de
</BODY>
contener un nuevo tipo de input
que utiliza la siguiente sintaxis:
</HTML>

<input type='file' name='nm'>


ejemplo85.php
La tranferencia
Puedes utilizar el script invocado por la action de formulario anterior (es este que
Una vez enviado el formulario, el
tienes aqu debajo) para hacer algunas comprobaciones.
fichero transferido se guarda en un
directorio temporal del servidor
Enva un fichero cualquiera de menos de 500K y vers que el error es 0. Repite el
salvo que php.ini especifique una
envo, ahora con un fichero que sobrepase ese tamao, y comprobars que el error toma
cosa distinta con un nombre que
le es asignado de forma valor 1 dado que la directiva upload_max_filesize=500K del fichero php.ini habr
automtica, y, adems, en las bloqueado la transferencia.
variables predefinidas $_FILES (si
la versin admite superglobales) y <?
en $HTTP_POST_FILES se /* Mediante el bucle foreach leemos el array $_FILES.
recogern datos relativos al
Observa la sintaxis. Escribimos como nombre del array
contenido del fichero y a los
$_['archivo'] con lo cual foreach leer los elementos
resultados de la transferencia.
del array que tienen 'archivo" como primer indice
El formato de $_FILES y de (coincide con el name que hemos puesto
$HTTP_POST_FILES es el de en la etiqueta input=file del formulario) */
array bidimensional.
foreach ($_FILES['archivo'] as $indice=>$valor){
El primero de sus ndices es el print $indice."--->".$valor."<br>";
nombre de variable usado para la
transferencia (el especificado como
name='nm' en el input type='file').
}
/*Dependiendo del navegador que ests utilizando puede ocurrir
Los segundos ndices se trata de que varan los valores del ndice type sean distintos.
un array asociativo son estos: Cuando se trata de un fichero jpg, con IE devolver image/pjpeg,
name, type, tmp_name, error y mientras que con Mozilla, Firefox, Opera y Netscape
size. devolver image/jpeg.*/
En ellos se recogen: el nombre
/* repetimos el proceso anterior ahora usando la otra
original de fichero transferido, su
formato, el nombre con el que ha variable predefinida (recuerda que esta no es superglobal)
sido guardado en el directorio $HTTP_POST_FILES y podremos visualizar los indices
temporal, el tipo de error de y los valores del fichero transferido */
transferencia y el tamao del
archivo. foreach ($HTTP_POST_FILES['archivo'] as $indice=>$valor){
print $indice."--->".$valor."<br>";
El error puede ser CERO o UNO. Si }
es CERO indica que la
?>
transferencia se ha realizado con
xito. En caso contrario, el valor
de ese error es UNO. Cuando est habilitada la opcin de transferencias de ficheros es conveniente en
previsin de sorpresas desagradables tomar algunas cautelas. Una de ellas sera limitar
la posibilidad de transferencia a determinados tipos de archivos imgenes, por ejemplo
Copia del fichero
impidiendo con ello que pudieran transferirse al servidor ficheros de riesgo, tales como:
ejecutables, virus, etctera.
Tal como hemos visto, el fichero
transferido an no est en el Cuando se establece este tipo de limitaciones, PHP comprueba los contenidos de los
servidor. Por el momento se ficheros sin tomar en consideracin la extensin de los mismos. Con ello se evita el riesgo
encuentra en un directorio de que puedan esconderse cambiando la extensin ficheros distintos de los permitidos.
temporal y ser preciso hacer una
copia en nuestro espacio de Aqu tienes un ejemplo de script que impide la transferencia de ficheros con extensin
servidor. Para este proceso puede
distinta a .jpg o .gif.
utilizarse una funcin que ya
hemos visto en pginas anteriores:
<?
copy(fich1, fich2) /* filtramos el tipo de archivos recibidos
donde fich1 sera el fichero
de forma que solo se permitan imagenes en formato
temporal y fich2 el del nuevo jpg gif. Si el fichero transferido tuviera formato
fichero. distinto, la funcin exit() acabara la ejecucin del script */

El primero de los nombres es el if(!($_FILES['archivo']['type']=="image/pjpeg" OR


valor contenido en: $_FILES['archivo']['type']=="image/jpeg" OR
$_FILES['archivo']['type']=="image/gif")){
$_FILES['nm']['tmp_name']
print "El formato ".$FILES['archivo']['type'].
donde nm es el valor incluido " no est permitido";
como name en el formulario usado exit();
para la transferencia y tmp_name }else{
es una palabra reservada que debe # anidamos este segundo condicional
escribirse exactamente con esa # para guardar en una variable
sintaxis. # la extensin real del fichero
# mas adelante la utilizaremos
Si la versin de PHP fuera anterior
a 4.1.0 habra que utilizar if ($_FILES['archivo']['type']=="image/pjpeg" OR
$HTTP_POST_FILES en vez de $_FILES['archivo']['type']=="image/jpeg" ){
$_FILES. En otros casos podran $extension=".jpg";
usarse indistintamente ambos }else{
tipos de variable. $extension=".gif";
}
El valor fich2 podra ser un nombre }
cualquiera asignado en el propio /* filtremos ahora el tamao de modo que no supere
script podemos verlo en el
el mximo establecido en el hidden del formulario
ejemplo o el nombre original del
fichero transferido. En este caso
(logicamente ese valor no puede superar el valor mximo
habra que recogerlo del elemento de la configuracin de php, pero si puede ser menor)
del array anterior cuyo segundo y tambin evitaremos archivos sin contenido,
ndice es name. es decir con tamao CERO */
if($_FILES['archivo']['size']>$_POST['lim_tamano']
En la cadena fich2 podra incluirse OR $_FILES['archivo']['size']==0){
recuerda que debes ponerlo entre print "El tamao ".$FILES['archivo']['size']." excede el lmite";
comillas un path sealando el exit();
directorio o subdirectorio donde
}
queremos que guarde la copia. De
no incluirlo, el fichero se copiara
en el directorio desde el que se # asignemos un nombre a la imagen transferida
est ejecutando el script. # de modo que se guarde en el servidor
# con un nombre distinto, asignado por nosotros
Sintaxis alternativa # con ello, podemos evitar duplicidades de nombres
# ya que si existiera un fichero con el mismo nombre
La opcin anterior tiene una
# que el enviado por el cliente, se sobreescribira
alternativa, igual de eficiente y
mucho ms segura. Se trata de:
$nuevo_nombre="foto_abuelita";
move_uploaded_file(fich1, fich2) # aadmosle la extensin real de fichero que tenamos
# recogida en la variable nuevo_nombre
que tiene la misma utilidad que
copy y aade algunas ventajas $nuevo_nombre .=$extension;
tales como: # aceptemos la transferencia siempre que el archivo tenga nombre
Comprobar que el fichero ha sido if ($_FILES['archivo']['tmp_name'] != "none" ){
transferido mediante el mtodo /* con la funcin copy
POST e impedir que se copie en el pasaremos el archivo que est en el directorio temporal
servidor en caso de no cumplirse al subdirectorio que contiene el script que estamos
esa condicin. ejecutando. Podramos incluir un path y copiarlo
a otro directorio */
Si la opcin safe mode=on if (copy($_FILES['archivo']['tmp_name'], $nuevo_nombre)) {
(configuracin de php.ini en modo
echo "<h2>Se ha transferido el archivo</h2>";
seguro) por defecto est Off
comprueba, adems, que la
}
transferencia del fichero ha sido }else{
realizada por el mismo usuario que echo "<h2>No ha podido transferirse el fichero</h2>";
hace la peticin de ejecucin del }
script, evitando que alguien,
maliciosamente, pueda mover ?>
ficheros desde el directorio
temporal hasta el espacio de
servidor. Usando
Usando copy
move_uploaded_file
Cuidado..!
Al usar esta funcin bajo Windows
conviene indicar en el parmetro
fich2 la ruta absoluta completa Ejemplo de script para el caso register_globals=ON
junto con el nombre del fichero ya
que de no hacerlo as en Aqu debajo incluimos el cdigo del script que -de forma alternativa a los anteriores
algunas ocasiones la imagen no podra utilizarse con esta opcin de configuracin.
ser transferida al directorio desde
el que se ejecuta el script. Pese a su simplicidad te sugerimos no usarlo. Los anteriores compensan con creces su
mayor complejidad sintctica con la versatilidad funcionan con cualquier opcin de
register_globals = ON register global y con la seguridad que aaden a las transacciones.
Con esta opcin habilitada (ON) <?
existe una posibilidad aadida.
if ($archivo != "none" AND $archivo_size != 0
En ese caso, la sintaxis podra ser AND $archivo_size<=$lim_tamano){
ms simple ya que, en el script
indicado en la action del
formulario, se creara una variable if (copy ($archivo, $archivo_name)) {
cuyo nombre coincide con el valor echo "<h2>Se ha transferido el archivo $archivo_name</h2>";
de name en el <INPUT echo "<br>Su tamao es: $archivo_size bytes<br>";
type="FILE"> del formulario. echo "<br>El fichero es tipo: $archivo_type <br>";
}
Esta variable (supongamos que su }else{
nombre es $archivo) tiene una echo "<h2>No ha podido transferirse el fichero</h2>";
importante peculiaridad, ya que, echo "<h3>su tamao no puede exceder de $lim_tamano bytes</h2>";
adems de guardar el fichero
}
transferido, contiene (con el
formato que tenemos a
continuacin) tres valores muy ?>
importantes:

$archivo_name (se aade


_name al nombre de la variable) y
recoger el nombre del fichero Ejercicio n 29
transferido.
Modifica el formulario que has creado en el ejercicio n 9 aadindole la opcin para que tus
$archivo_size que contiene el alumnos puedan enviarte junto con los datos una fotografa.
tamao del fichero. Modifica tambin el script asociado a aquel formulario de forma que puedas asignar un
$archivo_type que recoge el
nombre a la fotografa, visualizarla previamente copiada al directorio de trabajo junto con
tipo de fichero. los datos personales y guardar los datos personales y el nombre de la imagen en un fichero.

Anterior Indice Siguiente


Funciones FTP

Dos tipos de transferencias


Requisitos del sistema
En la pgina anterior hemos
hablado de la manera de transferir El uso de estas funciones requiere que PHP tenga activada la opcin FTP (enabled), que
informacin entre el ordenador de en nuestro caso est activada en la configuracin por defecto, tal como puedes ver a travs
un usuario y un servidor web. de tu info.php, que tendr un apartado idntico al que observamos en la siguiente imagen.

Aqu trataremos algo similar a


primera vista un poco distinto. Es
el caso las transferencias en los
dos sentidos entre servidores
(un servidor HTTP y un servidor
FTP). Esto en cuanto a PHP. Pero adems de esta configuracin ser imprescindible disponer
de un servidor FTP accesible y activo. En este tipo de transferencias intervienen dos
En la configuracin descrita en la servidores: el servidor HTTP (nuestro Apache) y el servidor FTP, cuyo procedimiento de
instalacin del servidor FTP hemos instalacin y configuracin hemos descrito en el apartado Servidor de FTP. Antes de poder
establecido que ambos servidores utilizar las funciones que aqu describimos debers tener instalado y activo el servidor FTP
tengan por root el mismo que all se describe.
directorio, pero no es la nica
opcin posible. Nos conviene recordar que en la configuracin all descrita el servidor se llama:
Es totalmente factible que uno de localhost; y que hemos creado diferentes usuarios (con privilegios distintos) entre ellos
los servidores est alojado en un admin.
hosting de Londres y el otro en
Sydney, por poner un ejemplo de Comprobacin de login y conexin
lugares distantes.

Imaginemos que todo esto es <?


cierto. # conexin con el servidor FTP
if($x=@ftp_connect ("localhost",21)){
echo "Conexin FTP activada<br>";
Transferencias FTP
}else{
echo "No se activo lo conexin FTP<br>";
Los dos primeros pasos para poder }
utilizar las funciones FTP han de # registro de usuario
ser: abrir la conexin y pasar el
if(@ftp_login($x,"admin","admin")){
login. El ltimo sera cerrar la
conexin.
echo "El login y la password han sido aceptados";
}else{
echo "Error en login o password";
Abrir la conexin }
#desconexin
$x=ftp_connect (host,pt) ftp_quit($x);
?>
Esta funcin en la que host es
una cadena con el nombre del
servidor FTP (no te olvides de
ponerlo entre comillas) y pt es el ejemplo91.php
nmero del puerto a travs del
cual se efecta la conexin FTP
abre una conexin con el servidor Lista de contenidos del subdirectorio Apache
FTP.

Si se omite pt se asigna por <?


defecto el valor 21 que es el if($x=@ftp_connect ("localhost",21)){
puerto que se usa habitual- mente echo "Conexin FTP activada<br>";
para acceder a este tipo de }else{
servidores. echo "No se activo lo conexin FTP";
}
La variable $x recoger el
identificador de conexin que
if(@ftp_login($x,"admin","admin")){
ser utilizado por las dems echo "El login y la password han sido aceptados<BR><BR>";
funciones. }else{
echo "Error en login o password";
}
Loguearse $lista=ftp_nlist($x,"/Apache");
foreach($lista as $c=>$v){
Utilizaremos este trmino del argot print "Indice: ".$c." Valor: ".$v."<br>";
informtico horrible, verdad? }
para referirnos al hecho de que el print "<H1>Lista completa</H1>";
usuario se acredite como $listacompleta=ftp_rawlist($x,"/");
autorizado en el servidor FTP.
foreach($listacompleta as $c=>$v){
ftp_login($x,user,pass) print "Indice: ".$c." Valor: <H1>".$v."</H1>";
}
Una vez abierta la conexin es ftp_quit($x);
preciso comenzar la sesin ?>
utilizando la funcin ftp_login con
los siguientes parmetros:
ejemplo92.php
$x, que es la variable en la que
se recoga el resultado de
ftp_connect. El resultado de la ejecucin del script anterior podra producir una salida similar a esta:
user, que es el nombre de
usuario.
pass, que es la password del
usuario.

Esta funcin devuelve un valor


booleano que ser 1 en el caso en
que se inicie la sesin
correctamente o NUL si no lo
hace.
Cerrar la conexin

Mediante la funcin:

ftp_quit($x)

se cierra la conexin abierta con


el identificador indicado en la
variable $x.

Gestin de directorios en
el servidor FTP

Una vez logueados y con la


conexin activa ya podremos
utilizar funciones FTP tales como:

ftp_cdup($x) Tal como puedes ver en la imagen, la cadena devuelta por la funcin ftp_rawlist tiene dos
resultados distintos. La primera de las cadenas comienza por lo cual indica que se trata de
Nos situa en el directorio raz del
un archivo y documento. En el segundo de los casos ese primer carcter es d e indica que
servidor FTP.
se trata de un directorio.
ftp_pwd($x) Los nueve caracteres siguientes especifican los permisos de acceso a los ficheros y/o
directorios. Se subdividen en tres bloques de igual tamao que corresponden a los tres
Nos devuelve una cadena con el niveles de usuarios habituales en sistemas Unix/Linux (propietario, grupo y resto de
nombre del directorio actual. usuarios). Para nuestros propsitos bastar con que consideremos los privilegios del primer
bloque, es decir los del propietario.
ftp_chdir($x, nuevodir)
El primero carcter de cada bloque slo puede ser r . Si se trata de un fichero y est
Cambia el acceso actual al marcado con r indica que se permite el acceso a l en modo lectura y si se trata de un
directorio especificado por la directorio indica que est permitida la visualizacin de su contenido.
cadena nuevodir, en caso de que El segundo de los caracteres (puede ser w ) indica, si se trata de un fichero, que est
exista. permitida la modificacin del fichero. Cuando se trata de un directorio significa que se
pueden aadir o suprimir ficheros.
ftp_pwd($x)
El tercero de los caracteres indicara (x ) que el fichero -si se trata de un ejecutable-
Indica el nombre del directorio al tiene permisos para ser ejecutado. Cuando se trata de un directorio, indica que pueden
que estamos accediendo en este conocerse los atributos de los ficheros que contiene y que est permitido el acceso a l y a
momento. sus subdirectorios.
El signo significa la negacin del atributo en todas las opciones.
ftp_mkdir($x, nomdir) El siguiente carcter, el nmero 1, est asociado con sistemas Linux/Unix e indicara el
nmero de vnculos duros contra el archivo, que es otra cosa que una forma de asignar
Crea un subdirectorio en el
directorio actual cuyo nombre es nombres distintos a un mismo fichero.
el nombre indicado en la cadena Los dos grupos siguientes -parece que no demasiado relevantes para nuestros
nomdir. propsitos- ser los nombres del usuario y grupo al que pertenece.
A continuacin aparece el tamao del archivo (cero si se trata de un directorio), la fecha
ftp_rmdir($x, nomdir) y hora de su creacin y el nombre del archivo o directorio.
Borra el directorio especificado en
la cadena nomdir. Una miscelnea de las funciones FTP
Para que un directorio pueda ser
borrado se requiere que est <?
vaco y que est incluido dentro # Conexin con el el servidor ftp
del directorio actual. if(!$x=@ftp_connect ("localhost",21)){
echo "No se activo lo conexin FTP";
exit();
Informacin sobre los
}
contenidos de los
# Identificacin de usuario
directorios if(!@ftp_login($x,"admin","admin")){
del servidor FTP echo "Error en login o password";
exit();
ftp_nlist($x, nomdir) }
/* comprobamos el nombre del directorio actual del servidor FTP
Devuelve una array escalar con los que ser el root correspondiente al usuario registrado */
nombres de los ficheros y
echo "El directorio actual es: ",ftp_pwd($x),"<br>";
subdirectorios contenidos en el
directorio que se indica en nomdir. /* intentamos cambiar a un subdirectorio indicando la ruta absoluta
partiendo del directorio root del usuario actual.
Si se trata del directorio actual, el En caso de error (ruta incorrecta o falta de permisos de accesos
parmetro nomdir puede nos dara un mensaje de error. Si el cambio tiene xito nos indicara
especificarse como una cadena el nombre del nuevo directorio */
vacia (""). if(!@ftp_chdir($x,"/Apache/htdocs")){
print "No tienes permisos de acceso a este directorio<br>";
Si la informacin se refiere a un
subdirectorio del actual bastar
print "o la ruta es incorrecta.Comprueba los datos!<br>";
poner su nombre como valor del }else{
parmetro nomdir. echo "Hemos cambiado al directorio: ",ftp_pwd($x),"<br>";
}
En cualquier otro caso nomdir # comprobamos el nombre del sistema operativo del servidor de FTP
contendr la ruta completa. echo "El S.O: del servidor FTP es: ",ftp_systype ($x),"<br>";
/* obtenemos una matriz conteniendo la lista de ficheros y directorios
ftp_rawlist($x, nomdir)
del subdirectorio "cursoPHP/images" del del directorio actual*/
Igual que la funcin anterior, $lista=ftp_nlist($x,"cursoPHP/images");
ftp_rawlist tambin devuelve un # escribimos la lista de ficheros contenidos en ese directorio
array escalar, pero en este caso echo "Lista de ficheros contenidos en el subdirectorio cursoPHP/
con informacin ampliada. images<br>";
foreach ($lista as $valor){
Este array detalla, adems del echo $valor,"<br>";
nombre del fichero, el tamao, el
}
tipo, la fecha de la ltima
modificacin y los permisos de # obtenemos una lista completa de los contenidos de ese subdirectorio
lectura y/o escritura. $lista=ftp_rawlist($x,"cursoPHP/images");
# ordenamos el array que contiene la lista anterior
sort($lista);
Transferencia de ficheros echo "Contenidos del subdirectorio cursoPHP/images<br>";
/* extrae los elementos del array eliminando los espacios repetidos
Las transferencias de ficheros
mediante la funcion preg_replace en la que \s+ indica uno o ms espacios
pueden realizarse en ambos que sern sustituidos por uno solo (' ') */
sentidos.
foreach($lista as $v){
Desde el servidor FTP $v=preg_replace('/\s+/', ' ', $v);
hasta el servidor HTTP # imprimimos la cadena completa
print "<br><BR><BR>".$v."<br>";
Mediante la funcin: # convertimos la cadena en un array
# utilizando los espacios como separadores
ftp_get($x,nloc,nrem,modo)
$extrae=explode(" ",$v);
se transfiere un fichero desde un # leemos los elementos del array y comentamos sus valores
servidor FTP hasta un directorio foreach($extrae as $indice=>$cont){
del servidor HTTP en el que se est switch($indice){
ejecutando PHP. case 0:
print "El elemento de indice".$indice." es: ".$cont."<br>";
La cadena nloc contiene el nombre if (substr($cont,0,1)=="d"){
con el que el fichero ser copiado
print "Es un directorio<br>";
en el directorio actual del servidor
}elseif(substr($cont,0,1)=="-"){
web y la cadena nrem contiene el
nombre (incluyendo el path) del print "Es un fichero<br>";
fichero que debe ser trasferido. }
if (substr($cont,1,1)=="r"){
El parmetro modo puede print "Tiene permisos de LECTURA<br>";
contener uno de estos valores: }elseif(substr($cont,1,1)=="-"){
FTP_ASCII o FTP_BINARY print "No tiene permisos de LECTURA<br>";
}
Desde el servidor HTTP
hasta el servidor FTP if (substr($cont,2,1)=="w"){
print "Tiene permisos de ESCRITURA<br>";
Para realizar transferencias en }elseif(substr($cont,2,1)=="-"){
sentido contrario al anterior se print "No tiene permisos de ESCRITURA<br>";
utiliza la siguiente sintaxis: }
break;
ftp_put($x,nrem,nloc,modo)
case 4:
Se comporta de forma idntica a la print "El tamao de este fichero es: ".$cont." bytes<br>";
funcin anterior. La cadena nrem break;
sigue siendo el nombre y el path case 8:
del servidor FTP (donde vamos a print "El nombre del fichero o directorio es: ".$cont."<br>";
copiar el fichero) y nloc contiene break;
el nombre del fichero en el }
servidor web (origen de la }
transferencia). }
/* creamos un subdirectorio (del directorio actual)
Modificacin de ficheros con nombre experimento anteponiendo @# para evitar mensajes de error
en el servidor FTP en caso de que ya existiera */
@ftp_mkdir($x,"experimento");
ftp_rename($x,nant,nnuevo)
/* copiamos el fichero enol.jpg desde el directorio que se indica
en el tercer parmetro (dentro servidor Apache)
Cambia el nombre del fichero nant al directorio del servidor FTP que se indica
por el indicado en la cadena en el segundo parmetro. Le ponemos por nombre lago_enol.jpg */
nnuevo. ftp_put($x, "/Apache/htdocs/experimento/lago_enol.jpg",
"../cursoPHP/enol.jpg",FTP_BINARY);
ftp_delete($x,fichero)
# obtenemos el tamao del fichero transferido
Elimina -en el servidor FTP- el echo "El tamao de fichero tranferidos es: ",
fichero indicado en la cadena ftp_size($x,"/Apache/htdocs/experimento/lago_enol.jpg")," bytes<br>";
fichero. /* escribimos la fecha de la ltima modificacin del fichero transferido
que coincidir con la fecha y hora en la que se realiz la transferencia.
Convertimos a formato de fecha convencional el tiempo UNIX que devuelve
Informacin sobre
la funcin ftp_mdtm */
ficheros del en el servidor
print "La fecha de modificacion del fichero es:";
FTP print date("d-m-Y H:i:s",
ftp_mdtm($x,"/Apache/htdocs/experimento/lago_enol.jpg"));
ftp_size($x,nomfile) # cambiamos el nombre del fichero lago_enol.jpg por lago_covadonga.jpg
# en el servidor FTP
Devuelve el tamao (en bytes) del
@ftp_rename($x,"/Apache/htdocs/experimento/lago_enol.jpg",
fichero que se indica en la cadena
nomfile.
"/Apache/htdocs/experimento/lago_covadonga.jpg");
/* creamos un enlace de descarga directa del fichero haciendo una llamada
ftp_mdtm($x,nomfile) mediante el protocolo ftp:// utilizando la sintaxis:
ftp://usuario:contrasea@nombre del servidor
Esta funcin devuelve la fecha de seguidos de la ruta (en el servidor FTP) y el nombre del fichero */
la ltima modificacin del fichero print "<BR><A href='ftp://admin:admin@localhost";
indicado en la cadena nomfile. Esta
print "/Apache/htdocs/experimento/lago_covadonga.jpg'> Descargar</a>";
fecha se indica en tiempo Unix.
/* transferimos al directorio del servidor Apache
indicado en el segundo parmetro (con el nombre que se indica
Ejercicio n 31 en el mismo) un fichero procedente del servidor FTP
cuyo nombre y ruta se indican en el tercer parmetro*/
Crea un formulario y un script ftp_get($x,"../cursoPHP/liborio.jpg",
mediante los cuales puedas "/Apache/htdocs/experimento/lago_covadonga.jpg",FTP_ASCII);
subir al directorio /* comprimimos un fichero alojado en el servidor Apache
Documentacion del servidor para transferirlo comprimido al servidor FTP */
FTP un fichero cualquiera. #empezamos leyendo el fichero y guardndolo en una cadena
$f1=fopen("../cursoPHP/cabina.jpg","r");
Utiliza el nombre de usuario while (!feof($f1)) {
y contrasea adecuados $cadena .= fgets($f1,1024);
para poder acceder al }
directorio indicado y evita fclose($f1);
que quede copia del fichero # comprimimos la cadena obtenida del fichero anterior
en el servidor Apache. $c1=gzencode($cadena,3,FORCE_GZIP);
# guardamos la cadena comprimida en un fichero
Intenta mejorar el script para $f=fopen("cabina.jpg.gz","w");
limitar el tamao del archivo fwrite($f,$c1);
y restringir la transferencia a fclose($f);
formatos *.jpg *.gif. /* al servidor el fichero comprimido. No es necesario indicar
la ruta actual ya que ha sido creado en el mismo directorio
en el que se est ejecutando el script */
ftp_put($x, "/Apache/htdocs/experimento/cabina.jpg.gz",
"cabina.jpg.gz",FTP_BINARY);
#eliminamos el fichero comprimido del servidor Apache
unlink("cabina.jpg.gz");
# cerramos la conexin con el servidor ftp
ftp_quit($x);
# establecemos un enlace de descarga para el fichero comprimido
print "<BR><A href='ftp://admin:admin@localhost";
print "/Apache/htdocs/experimento/cabina.jpg.gz'>Descarga comprimido</a>";
?>

ejemplo93.php

Anterior Indice Siguiente


Funciones de compresin

Funciones de compresin
Herramientas de compresin
zlib
Existen varias herramientas para compresin de ficheros. Las ms populares son las
funciones de la biblioteca bzip2 de Julian Seward que generan ficheros comprimidos que se
Algunas de esas funciones son
estas: reconocen por su extensin (bz2) y la funcin de zlib de Jean-loup Gailly y Mark Adler para
leer y grabar archivos comprimidos con extensin gz.
$f=gzopen(fich,mod, path)
En esta pgina veremos el uso de la segunda de las opciones. Empezaremos omprobando
Abre el fichero identificado por el en info.php que la opcin est activada. Deberemos ver algo como esto:
parmetro fich y lo hace en modo
especificado en el parmetro modo
r o w segn se trate de modo
lectura o escritura.

Cuando se trata del modo de


escritura el parmetro w debe ir
seguido de un nmero
comprendido entre cero y nueve
que especifica el grado de
compresin pretendido.

El parmetro path es opcional y En la versin de PHP que estamos utilizando esta opcin se activa por defecto y no es
puede contener un valor lgico necesario modificar ningn parmetro en php.ini.
(cero uno). Cuando el valor de
este parmetro es 1 permite Slo en el caso de utilizar versiones anteriores a PHP 4.2.3 sera necesario modificar el
incluir en el parmetro fich la ruta fichero php.ini descomentando la lnea que dice: extension=php_zlib.dll.
del directorio o subdirectorio
que alberga el fichero que
tratamos de abrir Ejemplo de compresin y lectura de un fichero
Si se incluye una ruta sin
En este ejemplo trataremos de utilizar las funciones de compresin comentadas al
especificar el valor 1 en el
parmetro path aparecer un error. margen. Si observas las formas de apertura de los ficheros vers que son similares a las
utilizadas para la gestin de ficheros. Los modos de apertura para escritura son: "w0" a
gzclose($f) "w9" siendo los valores de cero a nueve los indicadores de los niveles de compresin. Para
lectura debe usarse el modo "r" sin indicar ningn nivel de compresin.
Cierra el fichero asociado al
identificador de recurso $f. Esta
funcin devuelve TRUE en caso de <?
xito o FALSE si se produjera un # asignamos un nombre al fichero con extensin "gz"
error. $fichero ='prueba.gz';
# abrimos el fichero en modo escritura (w)
gzeof($f) # con el nivel mximo de compresin (9)
$f=gzopen($fichero,"w9",0);
Esta funcin devuelve 1 (TRUE) en
el caso de que el puntero apunte al $cadena="Este es el primer bloque de texto que hemos
final del fichero abierto e introducido en el fichero comprimido. ";
identificado mediante $f. $cadena .="Aadimos este segundo bloque";
Tambin devuelve TRUE en caso echo "<i>Esta es la cadena inicial:</i> ".$cadena."<br>";
de error. # escribimos (comprimida) la cadena en el fichero
Si el fichero estuviera abierto y el
puntero apunta a una posicin
distinta del final del fichero gzwrite($f,$cadena); # cerramos el fichero gzclose($f); #abrimos el fichero en modo
devolver FALSE. lectura $f=gzopen($fichero,"r"); echo "<i>Estos son los tres primeros caracteres de la
cadena:</i> "; # escribimos los tres primeros caracteres, el puntero (por defecto) #
gzseek($f,desplaza) apunta al comienzo de la cadena echo gzread($f, 3)."<br>"; # desplazamos el puntero
hasta el carcter n 8 gzseek($f,8); echo "<i>Estos son los seis caracteres siguientes al
Desplaza -dentro del fichero octavo:</i> "; # escribimos seis caracteres a partir del octavo echo gzread($f,
identificado por $f- el puntero -a
6)."<br>"; echo "<i>Ahora el puntero est en:</i> "; # buscamos la posicin actual de
partir de su posicin actual- la
cantidad de bytes indicados en el
puntero echo gztell($f)."<br>"; # movemos el puntero hasta el comienzo del fichero
parmetro desplaza gzrewind($f); echo "<i>Estos son los diez primeros caracteres de la cadena:</i> "; #
escribimos los diez primeros caracteres del fichero echo gzread($f, 10)."<br>"; #
gztell($f) volvemos el puntero al comienzo del fichero gzrewind($f); echo "<i>Escribimos el fichero
completo:</i> "; # con gzpasthru escribimos el fichero completo # el puntero est al
Devuelve la posicin actual del principio porque alli lo ha situado gzrewind # no necesitamos utilizar "echo" ni "print" ya
puntero.
que gzpassthru # escribe directamente el contenido del fichero gzpassthru($f); #
gzrewind($f) tenemos que volver a abrir el fichero ya que gzpassthru # se encarg de cerrarlo despus
de leerlo $f=gzopen($fichero,"r"); echo "<br><i>Aqu estar todo el fichero:</i> ";
Coloca el puntero al comienzo del gzpassthru ($f); # la funcin readgzfile abre el fichero, imprime su contenido y lo cierra
fichero echo "<br><i>Aqui se imprime la cadena completa usando readgzfile</i>: <br>";
readgzfile($fichero); /* con gzfile tambin se abre el fichero, pero ahora el contenido no
gzread($f, longitud)
se presenta directamente. Es recogido en un array. Para visualizarlo debemos imprimir el
Devuelve una cadena -despus de primer elemento del array. */ $z=gzfile($fichero); echo "<br><i>Este es el primer
descomprimida- de longitud igual a elemento (0) del array generado por gzfile</i>: ".$z[0]; # gzfile cierra el fichero. # No
la indicada en el parmetro podemos poner gzclose porque nos dara error ?>
longitud. La lectura comienza en
la posicin actual del puntero y comprime1.php
acaba cuando la longitud de la
cadena leida y descomprimida sea
igual al valor del parmetro Utilizando un directorio distinto
longitud o cuando se haya
alcanzado el final del fichero.
El ejemplo anterior est desarrollado para el supuesto que el script y el fichero comprimido
gzpassthru ($f) estn en el mismo directorio.

Esta funcin escribe en la salida Si quieres utilizar estas funciones utilizando ficheros alojados en un directorio distinto, solo
(no necesita la funcin echo) el tendrs que recordar que algunas funciones deben incluir el parmetro complementario 1.
contenido del fichero desde la Estos son las modificaciones que deberas efectuar:
posicin actual del puntero hasta
el final del fichero. Como es lgico,
si estuviera precedida de La variable que recoge el nombre del fichero debe incluir el path, por ejemplo:
gzrewind escribira el fichero $fichero ='/subdirectorio/prueba.gz'
completo.
La funcin gzopen debe incluir el tercer parmetro (path) con valor 1, por ejemplo:
$f=gzopen($fichero,"r",1);
Cuidado!
Tambin las funciones gzfile y readgzfile -que abren automticamente el fichero-
La funcin gzpassthru cierra debern incluir ese valor 1 como parmetro aadido. Por ejemplo: readgzfile
automticamente el fichero ($fichero,1) $z=gzfile($fichero,1)
despus de escribir su
contenido. Si pones gzclose
despus de esta funcin te Eleccin del grado ptimo de compresin
dar error y si quieres seguir
utilizando el fichero tendrs
Puede parecer -a primera vista- que la condicin ptima de compresin sera elegir el
que volver a abrirlo con la
nivel 9 y eso es cierto si tomamos nicamente en consideracin el tamao final del fichero
funcin gzopen.
comprimido. Sin embargo no existe una relacin lineal entre reduccin de tamao/nivel de
compresin. Sin que pueda considerarse ninguna referencia exacta -la compresin alcanzable
gzwrite($f, cadena, long) depende del contenido del fichero y en consecuencia no puede establecerse una relacin
funcional puede comprobarse experimentalmente que -aparentemente- a partir del grado 2 la
Esta funcin escribe en el fichero reduccin de tamao del fichero es mnima y que cuando se aumenta el grado de compresin
comprimido que se identifica por a niveles mximos (tratndose de ficheros de un cierto tamao) el tiempo de ejecucin
$f la cadena contenida en el
aumenta sustancialmente como consecuencia de la reiteracin de la ejecucin de los
parmetro cadena.
algoritmos de compresin.
Opcionalmente puede llevar el
tercer parmetro (longitud) en
cuyo caso solo escribir los
Compresin de cadenas
primeros longitud bytes de la
cadena. Si el parmetro longitud En este ejemplo utilizamos las tres funciones de compresin de cadenas as como las
existe y es mayor que la longitud opciones de descompresin y lectura de cada una de ellas.
de la cadena, insertar la cadena
completa.
<?
gzputs($f, cadena, long) # creamos una cadena de ejemplo
$cadena="Esta es la cadena a comprimir. Intentaremos que sea larga
Esta funcin es idntica a gzwrite. porque parece que si la hacemos muy corta en vez de reducirse
readgzfile($fichero,path) su tamao parece que aumenta. Y como sigue siendo enormemente
grande la cadena comprimida intentaremos hacerla aun mayor
Esta funcin abre de forma a ver que pasa ";
automtica el fichero indicado # comprimimos con la funcin gzcompress
como parmetro fichero, adems $c=gzcompress($cadena,9);
lo lee y lo escribe de forma echo "<br>".$c;
automtica sin necesidad de usar # descomprimimos con la funcin gzcompress
echo ni ninguna otra funcin de $dc=gzuncompress($c);
salida.
echo "<br>".$dc."<br>";
Si el fichero no est en el mismo # ahora utilizamos la funcin gzencode
directorio que el script -adems de $c1=gzencode($cadena,9,FORCE_GZIP);
incluir la ruta en la cadena fichero- echo "<br>".$c1."<br>";
es necesario aadir el segundo /* el resultado lo guardamos en un fichero con extensin gz
parmetro -path- con valor 1. pero abierto en modo "normal", es decir escribiendo
dentro del fichero la cadena "tal cual" fue devuelta
Comprimiendo cadenas por gzencode*/
$f=fopen("pepe.gz","w");
fwrite($f,$c1);
Las funciones anteriores permiten
fclose($f);
la creacin, lectura y modificacin
de ficheros comprimidos # abrimos el fichero anterior utilizando las funciones
# de lectura de fichero comprimidos
Sin embargo, existen otras $f=gzopen("pepe.gz","r");
funciones PHP que permiten readgzfile("pepe.gz");
comprimir cadenas. Aqu tienes gzclose($f);
algunas de ellas. # borramos el fichero una vez leido
unlink("pepe.gz");
gzcompress(cadena, nivel)
# otra opcin de compresin de cadenas utilizando la funcin
Esta funcin devuelve una cadena # gzdeflate
comprimida a partir de una $c2= gzdeflate($cadena,9);
original especificada en el parmet echo "<br><BR>".$c2;
ro cadena. El nivel de # con la funcin gzinflate podemos descomprimir la cadena
compresin (valores entre 0 y 9) # comprimida generada por gzdeflate
se especifica en el parmetro nivel. $dc2=gzinflate($c2);
echo "<br>".$dc2;
Las cadenas resultantes de esta
funcin pueden descomprimirse ?>
aplicando la funcin
gzuncompress que te comento
comprime2.php
ms abajo.

gzdeflate(cadena, nivel)
Economizando espacio en el servidor
Se comporta de forma idntica a la
funcin anterior. La nica salvedad
parece ser que utiliza un algoritmo Las opciones de compresin pueden permitirnos un cierto ahorro de espacio de servidor.
de compresin distinto. Las pginas HTML podran almacenarse comprimidas y ser llamadas a travs de un script de
descompresin que permita visualizarlas. En este ejemplo se efecta la compresin de una
Las cadenas resultantes de esta pgina web (una de las pginas de estos materiales guardada en formato HTML) cuyo
funcin tambin pueden tamao original es de 29.015 bytes. El fichero comprimido resultante ocupa 9.886 bytes.
descomprimirse aplicando la Como vers, el fichero se reduce a poco ms del 30% del original.
funcin gzdeflate.

gzencode(cad, niv, opc) <?


# Creamos una variable "vacia"
Esta funcin devuelve la cadena $cadena="";
cad comprimida con el nivel
# Abrimos el fichero en modo lectura (r)
especificado en niv y permite dos
$f1=fopen("prueba.html","r");
opciones de compresin:
FORCE_GZIP /* hacemos un bucle para leer el fichero
FORCE_DEFLATE que se pueden hasta encontrar el final (feof) y vamos recogiendo
especificarse como tercer el contenido en la variable */
parmetro (opc) sin encerrar while (!feof($f1)) {
entre comillas. $cadena .= fgets($f1, 1024);
}
El valor por defecto (cuando no se /*comprimimos la cadena con gzencode
especifica el parmetro opcin) es
con lo cual la propia funcin aade los "encabezados"
FORCE_GZIP
de formato gzip*/
$c1=gzencode($cadena,3,FORCE_GZIP);
Descomprimiendo cadenas /* abrimos un nuevo fichero modo escritura (w)
con "fopen", es decir como un fichero normal con extensin GZ */
gzuncompress(cadena) $f=fopen("prueba.html.gz","w");
/* escribimos la cadena "tal cual"
Con esta funcin se obtiene una en este fichero */
cadena -descomprimida- a partir fwrite($f,$c1);
de la cadena comprimida indicada # cerramos el fichero comprimido
en el parmetro cadena- siempre
fclose($f);
que esta hubiera sido comprimida
echo "La compresin ha terminado";
usando la funcin gzcompress
?>
gzinflate(cadena)

Funciona igual que la anterior. La comprime3.php


nica diferencia es que esta
descomprime las cadenas que han El fichero comprimido mediante el script anterior no puede ser visualizado directamente.
sido comprimidas con gzdeflate Requiere ser descomprimido antes de ser enviado al navegador. Y eso podra hacerse
mediante un script como este:
Funciones para
buferizacin de salidas <?
#abrimos el fichero comprimido con "gzopen"
ob_start() $f=gzopen("prueba.html.gz","r");
/* leemos el contenido completo
Esta funcin activa la buferizacin en forma transparente ya que readgzfile descomprime
de las salidas generadas por el la salida*/
script de PHP a partir de su
readgzfile("prueba.html.gz");
activacin.
# cerramos el fichero
Dicho de otra forma, impide que gzclose($f);
las salidas generadas por el script ?>
se enven al cliente y por tanto no
sern visualizadas en el
navegador. A partir del momento Visualizar fichero
de activar esa buferizacin, todas comprimido
las salidas generadas se
almacenan en una variable
especfica llamada: Economizando tiempo de transferencia
ob_get_contents()

ob_end_clean() No solo se puede economizar espacio en el servidor. Tambin es posible enviar


comprimidas -desde el servidor hasta el cliente- las pginas web.
Esta funcin desactiva la
buferizacin iniciada por ob_start En ese caso, ser el propio navegador el que interprete la informacin comprimida y la
y borra los contenidos de la presente de una manera transparente. Lo que habremos ahorrado habr sido tiempo de
variable ob_get_contents() transferencia pero, igual que ocurra en el comentario anterior, esa reduccin del volumen de
ob_clean() informacin a transferir afecta nicamente al contenido de la pgina y no a otros elementos
que puede incluir, tales como imgenes, etctera.
Esta funcin vaca el buffer de
salida pero sin desactivar la Este es un ejemplo de un script que comprime una pgina web y la enva comprimida al
bufferizacin. Las salidas cliente.
posteriores a esta funcin
seguiran siendo recogidas en el
buffer.
<?
/* activamos la bufferizacin de la salida
para que no se presenten los resultados del script
Cabeceras para transferir directamente en la pgina
informacin comprimida Cuidado con no dejar lineas en blanco delante del script
ya que vamos a insertar luego Headers!! */
Cuando un servidor recibe una ob_start();
peticin de una pgina web el # abrimos y leemos el fichero html
navegador del cliente siempre $f1=fopen("prueba.html","r");
enva informacin sobre su fpassthru($f1);
disposicin a aceptar diferentes # recogemos el contenido del buffer en la variable $cadena
tipos de contenidos. $cadena = ob_get_contents();
Una de las informaciones que # comprimimos la cadea con gzencode
suelen recibirse con la peticin del # para que incluya los encabezados "gzip"
navegador se refiere a su $cd=gzencode($cadena,3,FORCE_GZIP);
capacidad para aceptar contenidos # desactivamos la "buferizacin"
codificados y esto suelen hacerlo # y borramos el contenido del buffer
mediante el envio de una cabecera ob_end_clean();
que dira algo similar a esto: # insertamos la cabeceras
Accept-Encoding:gzip,deflate o # indicando el tipo de contenido y el tamao
Accept-Encoding: gzip. Header('Content-Encoding: gzip');
Esta posibilidad es una
Header('Content-Length: ' . strlen($cd));;
caracterstica comn a todas las # presentamos el contenido (cadena comprimida) que ser
versiones modernas de los # "traducido" automticamente por el navegador
navegadores (es posible que echo $cd;
algunas versiones antiguas no ?>
acepten esta codificacin) y
bastar con se incluya en la
respuesta (el documento Ejecutar script
transferido por el servidor al
cliente) la cabecera: El ejemplo anterior comprima el contenido del fichero antes de enviarlo. En este que
Header('Content-Encoding: gzip') incluimos a continuacin partimos del supuesto de que la pgina ya est comprimida en el
para que el navegador sepa que la servidor. Por tanto, tendremos que leer el fichero comprimido y enviarlo, de igual forma, al
informacin llegar codificada y
cliente.
que debe activar -de forma
automtica- sus mecanismos de
traduccin de ese tipo de <?
contenidos. ob_start();
/* En este caso abrimos el fichero con "gzopen"
ya que se trata de un fichero comprimido
Algunas limitaciones # todo lo dems es idntico al ejemplo anterior*/
$f1=gzopen("prueba.html.gz","r");
En todos estos ejemplos hemos gzpassthru($f1);
dado por supuesto que los $cadena = ob_get_contents();
navegadores de los clientes $cd=gzencode($cadena,3,FORCE_GZIP);
aceptan la codificacin gzip, ob_end_clean();
pero es evidente que si eso no Header('Content-Encoding: gzip');
ocurriera la pgina se visualizara Header('Content-Length: ' . strlen($cd));
errneamente.
echo $cd;
?>

Ejercicio n 30 Ejecutar script


Escribe un script que guarde
en un fichero comprimido la Anterior Indice Siguiente
imagen aviones4.jpg que
tienes en el directorio images.

Crea un segundo script que


permita visualizarla en el
navegador y evala la
economa de espacio que
aporta la compresin de este
tipo de archivos.
Mensajes de correo

Correo electrnico
Requisitos del sistema

PHP dispone de una funcin que La utilizacin de las funciones de correo electrnico requiere disponer de un servidor de
permite el envo de todo tipo de correo electrnico instalado y activo y la modificacin de la configuracin inicial del fichero
mensajes de correo electrnico php.ini.
desde una pgina web.
Si no tienes instalado este servidor puedes hacerlo ahora. En la pgina Servidor de
Son escasos los hosting que correo tienes detallados ambos procesos (instalacin y modificacin de php.ini).
tienen activada esta funcin.

El motivo aducido, por muchos de El mensaje ms simple


ellos, para esta restriccin no es
otra que el riesgo de abusos
mediante los mensajes conocidos Aqu tienes un ejemplo, el ms simple, del uso de esta funcin:
como spam.

Como siempre, si tu inters es <?


publicar y tienes necesidad de este # insertamos la funcin mail (rojo) dentro de un condicional
servicio procura consultar sobre su # para tener una confirmacin de envio y/o aviso de error
disponibilidad en el hosting que # es algo muy habitual para conocer el exito de la ejecucin
elijas. # de funciones
if(mail("juan@mispruebas.com", "Mi primer mensaje","Este es el texto"))
Sintaxis {
print "mensaje enviado";
}else{
La forma ms simple de la funcin print "el mensaje no ha podido enviarse";
de correo es esta:
}
mail(dest,asunto,mensaje) ?>

Donde dest es la direccin del


destinatario, asunto es el texto ejemplo94.php
que aparecer como Asunto en el
encabezado que recibir el
destinatario y mensaje el texto Un ejemplo ms completo
que aparecer en el cuerpo del
mensaje.
En el ejemplo siguiente insertaremos algunos nuevos elementos comentados al
No te olvides de escribir entre margen. Observa con mucha atencin la estructura del cdigo. Fjate que hemos
comillas esos tres parmetros de insertado en lneas diferentes cada uno de los conceptos: From, Reply-To, etctera y
la funcin. que no hemos dejado ningn espacio al comienzo de esas lneas.

No es por capricho ni por afn esttico. Si insertramos algn carcter delante de esas
Mensaje con
lneas se plantearan problemas en la estructura del mensaje y si no incluyramos un
cabeceras MIME salto de lnea para cada uno de los conceptos tambin tendramos ese mismo problema.

Una forma ms completa es la La sintaxis MIME es muy estricta en este sentido. Tengamos mucho cuidado en esto!
siguiente:
Hay otra posibilidad sintctica como alternativa a los saltos de lnea ya conocida.
mail(dest,asunto,mens,cabez) Podramos escribir todo en una sola lnea sustituyendo los saltos de lnea que ves aqu por
\n, de forma que el script tuviera un aspecto similar al siguiente:
Como puedes ver, en este caso
aadimos un nuevo parmetro a la
mail("juan@localhost","Asunto","Contenido","\nReply-To: ...\nCc:.....\nBcc: ...")
funcin (cabez) que debe estar
entre comillas y que puede
donde, como ves, los \n sustituyen a los saltos de lnea.
contener, separando con comas, lo
siguiente:
<?
From: Nombre <e-mail> mail("juan@mispruebas.com","Varios destinatarios","Cuerpo del mensaje",
El texto que escribas en el
"From: CursoPHP <juan@mispruebas.com>
parmetro Nombre (cuidado, no Reply-To: andres@mispruebas.com
lleva comillas!) ser el nombre del Cc: perico@mispruebas.com,andres@mispruebas.com
remitente, que aparecer en el Bcc:andres@mispruebas.com,perico@mispruebas.com
campo De: cuando el destinatario X-Mailer: PHP/" . phpversion());
reciba el mensaje. ?>

Donde dice e-mail es obligado


escribir una direccin de correo Usando cdigo de Utilizando separador \
que debe ir contenida entre < y ejemplo \n
>, tal como puedes ver en el
ejemplo.

Reply-To: correo El mismo ejemplo, utilizando variables


En una nueva lnea, y sin cerrar
Aqu tenemos un ejemplo donde los parmetros de envo proceden de variables PHP.
las comillas de la cadena iniciada
en el encabezado anterior,
Recordemos que esas variables pueden transferirse mediante un formulario a un
podemos indicar la direccin de
script que se encargue de su envo.
respuesta del mensaje.

La direccin que escribamos donde Como puedes observar, hemos puesto las direcciones de los destinatarios de las copias
dice correo (fjate que no va -visibles y ocultas- en sendos arrays y hemos aadido una funcin que: lee los array, los
entre comillas) ser la direccin a une en una cadena separndolos con comas y, por ltimo, quita la ltima coma aadida
la que se enviar la respuesta si el utilizando la funcin substr.
destinatario una vez recibido tu
correo desea responder mediante
<?
la opcin Responder de su
programa de correo electrnico. #variables destinatario, asunto, texto, etc.
$destino="andres@mispruebas.com";
Cc: correo1,correo2,... $envia="Andrs Curso PHP";
$remite="andres@mispruebas.com";
De igual forma que en el caso $asunto="Mensaje experimental";
anterior en una nueva lnea y sin $texto="Esto es una prueba. No es spam";
cerrar comillas podemos incluir
en correo1, correo2, etctera,
las direcciones de correo de las #array de destinatarios de copias visibles
personas a las que deseamos
enviar copia del mensaje.
$c[0]="perico@mispruebas.com";
No te olvides de separar con $c[1]="juan@mispruebas.com";
comas cada una de las direcciones
que, como puedes ver en los #crear la cadena con las direcciones
ejemplos, no van entre comillas. # y aadir las comas de separacin
Bcc: correo1,correo2,... foreach($c as $pegar) {
Esta opcin es idntica en cuanto a $cco .=$pegar;
su funcionamiento a la anterior, $cco.=",";
con la nica diferencia que esas };
direcciones no sern visibles por
los destinatarios de los mensajes. #quitamos la coma del final de la cadena
X-Mailer:PHP/".phpversion() $l=strlen($cco);
Es una frivolidad que se puede
incluir en el encabezado del $cco=substr($cco,0,$l-1);
mensaje y que indica que versin
de PHP con que ha sido creado. #array de destinatarios de copias OCULTAS

Mucho cuidado! $b[0]="perico@mispruebas.com";


$b[1]="andres@mispruebas.com";
Debemos insistir en sugerirte una
especial atencin a la sintaxis de
este tipo de scripts. #crear la cadena con las direcciones
# y aadir las comas de separacin
Los contenidos generados por la
funcin mail deben ser foreach($b as $pegar) {
interpretados por el servidor de $bco .=$pegar;
correo y tanto en este caso como $bco.=",";
en los que veremos a };
continuacin los requisitos de
formato de stos servidores son
muy estrictos. #quitamos la coma del final de la cadena

De no adaptarse exactamente a $l=strlen($bco);


sus especificaciones pueden
producirse efectos extraos tales $cco=substr($bco,0,$l-1);
como: envos incorrectos y/o
apariencias indeseadas en los mail($destino, $asunto, $texto,
mensajes. "From: $envia <$remite>
Reply-To: $remite
Cc: $cco
Bcc:$bco
X-Mailer: PHP/" . phpversion());
?>

ejemplo96.php

Anterior Indice Siguiente


Formatos MIME

Formato de los mensajes


de correo electrnico
Las cabeceras MIME de un mensaje

En la pgina anterior hemos Aqu tienes un ejemplo con los diferentes elementos del encabezado de un mensaje.
hablado acerca de la manera de Como ves, he incluido todos los elementos dentro de la funcin mail.
enviar un e-mail y veamos la
forma de insertar el cuarto <?
parmetro de la funcin mail para mail("juan@mispruebas.com", "Cabeceras", "Prueba de cabeceras",
incluir algunos elementos de los
"Date: 24 de Junio de 2001
encabezados MIME.
MIME-Version: 1.0
El formato de los mensajes est From: Estudiante Perico<perico@mispruebas.com>
especificado en una serie de Cc:perico@mispruebas.com
normas conocidas como el MIME Bcc:andres@mispruebas.com
(Multipurpose Internet Mail Reply-To: perico@mispruebas.com
Extensions) en las que se X-Mailer: PHP/".phpversion());
establecen los contenidos y la ?>
sintaxis de las diferentes partes de
un mensaje.
ejemplo98.php
Recordemos que la funcin

mail(dest, asunt, men, cab) Una forma un poco ms depurada del script anterior podra ser esta que incluimos aqu
debajo.
tiene cuatro parmetros y que las
especificaciones del MIME aluden a Sus particularidades son las siguientes:
los dos ltimos, es decir a men (el
cuerpo del mensaje) y cab que es
el encabezado del mismo. Recogemos los datos en variables e insertamos en la funcin mail esas variables
La variable $cabecera tiene algunas singularidades:
Respecto a dest (destinatario) y La vamos construyendo aadiendo subcadenas: date, from, etc. etc.
asunt no se requieren ms En cada subcadena dejamos pegado el contenido a las comillas iniciales
comentarios que reiterar la Al final de cada subcadena (cada una contiene un elemento del encabezado)
necesidad de incluir esos valores insertamos \n para el carcter especial que indica a PHP un salto de lnea
(e-mail del destinatario y asunto) imprescindible
bien directamente, como
parmetro en la funcin, o a travs
de una variable tal como hemos
comentado en la pgina anterior.
<?
# datos del mensaje
Cabeceras de los mensajes $destinatario="juan@mispruebas.com";
$titulo="Cabeceras en variables";
Los diferentes elementos de la $mensaje="Nueva prueba de cabeceras";
cabecera de un mensaje deben $responder="andres@mispruebas.com";
insertarse siempre separados por $remite="andres@mispruebas.com";
saltos de lnea bien pulsando $remitente="Otra vez Andrs";
Enter o incluyendo la secuencia \n # cabeceras
dentro de la misma de lnea.
$cabecera ="Date: ".date("l j F Y, G:i")."\n";
No pueden incluirse espacios, ni al $cabecera .="MIME-Version: 1.0\n";
comiezo de las nuevas lneas ni $cabecera .="From: ".$remitente."<".$remite.">\n";
despus de \n, y las comillas que $cabecera .="Return-path: ". $remite."\n";
han de contener todo el $cabecera .="X-Mailer: PHP/". phpversion()."\n";
encabezado se abren delante del
primero de ellos y no se cierran if( mail($destinatario, $titulo, $mensaje,$cabecera)){
hasta despus de haber escrito el echo "mensaje enviado";
ltimo. }
Pueden contener lo siguiente: ?>

Date: xxxxx
ejemplo99.php
Date: debe escribirse con esta
sintaxis exactamente.

El parmetro xxxxx es una cadena Algunas funciones PHP que incorporamos en estos ejemplos
que contendr la fecha de envo
del mensaje y que puede
obtenerse a travs de una de las Podrs ver en estos ejemplos algunas funciones raras que vamos a comentar
funciones de fecha de PHP tal seguidamente:
como puedes ver en el ejemplo.
uniqid(pre,bol)
MIME-Version: 1.0
Genera un identificador nico basado en la hora actual del sistema expresada en
Este elemento de la cabecera
microsegundos y con una longitud de 13 caracteres.
especificar la versin MIME que
ha de utilizar el cliente de correo
El parmetro pre permite establecer una cadena o nmero (puede ser una cadena vaca)
para poder interpretar
adecuadamente el contenido de los que se antepone al identificador generado por la funcin.
mensajes.
Opcionalmente permite el segundo parmetro bol que debe ser un valor booleano (TRUE
From: remitente<e-mail> FALSE) o tambin 0 1.

Este elemento de la cabecera Cuando este parmetro es TRUE aade al final de la cadena generada anteriormente otra
permite indicar el nombre del subcadena numrica -generada aleatoriamente- de nueve dgitos, que refuerza la unicidad
remitente (remitente) y su del identificador.
direccin e-mail siguiendo la
sintaxis que se especifica. El eregi_replace(busca, reemplaza, cadena)
nombre, como un elemento
independiente y la direccin e-mail Busca en la cadena especificada en el parmetro cadena (que puede ser una cadena o
dentro de < >. una variable que contenga una cadena) las subcadenas especificadas en busca (pueden ser
Cuidado! expresiones regulares) y sustituye esas subcadenas por el contenido del parmetro
reemplaza.
No debemos poner comillas ni en
el nombre del remitente, ni en la Esta funcin devuelve la cadena modificada.
direccin e-mail, ni en la fecha,
etctera. strip_tags(cadena, excepciones)
Respecto a Cc: y Bcc: ; Reply-To: Suprime todas las etiquetas HTML contenidas en cadena salvo las que se indiquen en
y X-Mailer: son vlidos los
excepciones.
comentarios que hemos hecho en
la pgina anterior.
Por ejemplo: strip_tags($cadena, '<i><u><b>') eliminara todas las etiquetas HTML,
Si no se especifica lo contrario, los salvo las indicadas aqu y sus correspondientes cierres.
mensajes se envan como texto
sin formato, pero existen Si no se especifican excepciones elimina todas las etiquetas.
opciones que permiten especificar
el formato que ha de tener un base64_encode(cadena)
mensaje.
Devuelve una cadena codificada en base64. Esta codificacin se hace para permitir que
La especificacin de un formato las informaciones binarias puedan ser correctamente manipuladas por sistemas que no
obliga a incluir otro elemento en generan correctamente los 8 bits, tal como ocurre frecuentemente en los cuerpos de los
cabecera del mensaje: mensajes de correo electrnico.
Content-Type: base64_decode(cadena)
Este elemento debe ir seguido de
Realiza el proceso inverso a la anterior. Decodifica una cadena previamente codificada
la especificacin en la que se
indique el tipo de contenido. Tiene en base64.
la sintaxis: tipo/subtipo
chunk_split(cadena, longitud, separador)
El MIME establece un gran
variedad de opciones para este Devuelve una cadena obtenida al insertar en la cadena especificada -a intervalos del
propsito. Hablaremos de dos de nmero de caracteres especificados en el parmetro numrico longitud- el contenido de
ellas: una subcadena indicada en el parmetro separador.

text/plain Por defecto -cuando no se especifican los parmetros- longitud es igual a 76 caracteres
y el separador es la cadena \r\n (retorno y salto de lnea).
El text/plain es la opcin por
defecto y seala que el contenido Esta funcin se utiliza para convertir al formato especificado en la RFC 2045
del mensaje es de tipo texto
(especificacin para MIME) las cadenas obtenidas por base64_encode.
(text) y del subtipo sin formato
(plain)
Es el formato habitual de los ficheros adjuntos de los e-mail.
text/html

Como la opcin anterior, es tipo Mensaje con contenido alternativo


texto, pero en este caso, el
subtipo es html con lo cual el
mensaje se visualizar en formato
html siempre que el cliente de <?
correo permite esa posibilidad. # creamos la variables "salto" para "mayor comodidad
# un salto es la secuencia retorno de carro-nueva lnea
Mensajes multiparte # dos saltos es algo similar pero duplicado

$UN_SALTO="\r\n";
Los tipos anteriores permiten
enviar mensajes simples (sin
$DOS_SALTOS="\r\n\r\n";
ficheros adjuntos) en uno u otro
formato, pero el MIME nos da # creamos el remitente, etc. y tambin la que parte que
opciones para insertar dentro de # contiene el cdigo HTML del mensaje
un mismo mensaje elementos de
diferentes tipos y subtipos. $destinatario="juan@mispruebas.com";
$titulo="Mensaje alternativo Texto Plano - HTML ";
Las opciones de mayor inters son $mensaje="<html><head></head><body bgcolor='#ff0000'>";
las siguientes:
$mensaje .="<font face='Arial' size=6>Prueba HTML</font>";
multipart/alternative $mensaje .="</body></html>";
$responder="andres@mispruebas.com";
Es la forma de especificar que el $remite="andres@mispruebas.com";
mensaje tiene varias partes $remitente="Andrs Prez y Prez";
(multipart) de las que el
destinatario ha de ver una sola # creamos el separador de bloques del mensaje
(alternative). # anteponiento "_separador" aunque podramos haber puesto "tiburcio"
Se podra utilizar en casos en los # generamos un identificador unico utilizando un numero aleatorio
que sea necesario prever la # como "semilla" y luego lo codificamos con la funcin md5
posibilidad de que un mensaje con
formato HTML pueda ser $separador ="_separador".md5 (uniqid (rand()));
visualizado como texto plano
cuando el cliente de correo no # creamos la variable cabecera con los elementos
soporte HTML. # ya utilizados en los ejemplos anteriores y ponemos al final
# de cada elemento UN SALTO DE LINEA
Podemos hacer un mensaje a
medida que se presentar de una
forma u otra segn el cliente $cabecera = "Date: ".date("l j F Y, G:i").$UN_SALTO;
utilizado para leerlo. $cabecera .="MIME-Version: 1.0\n";
$cabecera .="From: ".$remitente."<".$remite.">".$UN_SALTO;
multipart/mixed $cabecera .= "Return-path: ". $remite.$UN_SALTO;
$cabecera .="Cc:perico@mispruebas.com".$UN_SALTO;
Cuando en el Content-Type se
$cabecera .="Reply-To: ".$remite.$UN_SALTO;
establece el tipo multiparte y el
$cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO;
subtipo mezclado (mixed) ser
cuando tengamos la posibilidad de
adjuntar ficheros al mensaje. # AQU DEFINIMOS EL CONTENIDO MULTIPART, fjate que lo acabamos con ";"

Las diferentes partes de un $cabecera .="Content-Type: multipart/alternative;".$UN_SALTO;


mensaje deben ir separadas
tanto en modo alternativo como # insertamos BOUNDARY (fjate que dejo un espacio
mezclado y para ello hay que # en BLANCO DELANTE y ponemos al FINAL los DOS SALTOS DE LINEA
incluir un nuevo elemento en el
encabezado. Se trata de un
$cabecera .=" boundary=$separador".$DOS_SALTOS;
separador al que se llama
boundary.
# colocamos el primer separador(con los dos guiones delante)
boundary=cadena # antes de insertar la primera parte del mensaje
# que es el texto plano para el caso de que el cliente de correo
Dentro del encabezado y siempre # no soporte HTML
en lnea aparte (fjate que en los
ejemplos o est en lnea aparte o
$texto_plano ="--$separador".$UN_SALTO;
aparece el \n) debemos incluir el
elemento boundary= (sin smbolo
de $ delante) y detrs del signo # especificamos el tipo de contenido y la codificacin
igual una cadena (en este caso # e inserto DOS SALTOS AL FINAL ya que ahi acaba la cabecera de esta parte
entre comillas) que en principio $texto_plano .="Content-Type:text/plain; charset=\"ISO-8859-1\"".
puede ser una cadena cualquiera $UN_SALTO;
que no contenga espacios, aunque $texto_plano .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS;
lo habitual es incluirla con el
formato que podemos ver en los # cambiamos las etiquetas "<br>" por saltos de lnea
ejemplos. # y luego quitamos todas las etiquetas HTML del cuerpo del mensaje
# ya que el texto plano no debe llevar ese tipo de etiquetas
El cuerpo del mensaje
$extractor= strip_tags(eregi_replace("<br>", $UN_SALTO, $mensaje));
En su formato ms simple el
cuerpo del mensaje contiene $texto_plano .=$extractor;
nicamente texto, pero cuando se
trata de multipartes deber # insertamos un nuevo separador para sealar el final
contener necesariamente: los # de la primera parte del mensaje y el comienzo de la segunda
separadores de las diferentes # en este caso ponemos UN SALTO delante del separador ya que de lo
partes, los encabezados de cada contrario
una de las partes y sus respectivos # al componer el mensaje se unira con la cadena texto_plano anterior
contenidos. # que no tiene SALTO DE LINEA AL FINAL
La secuencia habra de ser de este
tipo: $texto_html =$UN_SALTO."--$separador".$UN_SALTO;

# especificamos el encabezado HTML para el siguiente bloque


Separador
Content-type
# y ponemos en la ultima lnea los DOS SALTOS DE LINEA
Content-Transfer-Encoding
**Content-Disposition $texto_html .="Content-Type:text/html; charset=\"ISO-8859-1\"".$UN_SALTO;
**Lectura del fichero $texto_html .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS;
**Codificacin #aado la cadena que contiene el mensaje
Insercin en cuerpo $texto_html .= $mensaje;
Separador
..... # insertamos SOLAMENTE un SALTO DE LINEA
otra parte # estamos al funal del mensaje
...
Separador final
$texto_html .=$UN_SALTO;

Los apartados sealados con ** # unimos ambas cadenas para crear el cuerpo del mensaje
slo se incluiran en el caso de que
junto con el mensaje se adjunten $mensaje=$texto_plano.$texto_html;
ficheros.

Content-type # enviamos el mensaje utilizando

Los tipos y subtipos ms


habituales son los siguientes: if( mail($destinatario, $titulo, $mensaje,$cabecera)){
echo "mensaje enviado ";
Para incluir textos:
}
los ya mencionados
text/plain
text/html ?>

Para imgenes:
segn el tipo de imagen ejemplo100.php
image/jpeg
image/gif

Para sonidos: Mensaje con ficheros adjuntos


audio/basic

Para vdeo:
video/mpeg
<?
Para ejecutables, comprimidos y # definimos estas variables igual que en el ejemplo anterior
otros ficheros adjuntos:
application/octet-stream $UN_SALTO="\r\n";
En cualquier caso, si quieres $DOS_SALTOS="\r\n\r\n";
utilizar algn otro tipo de archivo
puedes consultar en la web las #incluimos en varias, asunto, un texto en HTML
especificaciones del MIME. # remitente, etc. etc.

Aparte de tipo/subtipo puede $destinatario="perico@mispruebas.com";


aadirse a Content-type -en el $titulo="Mensaje con dos fichero adjuntos";
caso de texto- separado por punto $mensaje="<html><head></head><body bgcolor=\"#ff0000\">";
y coma, la especificacin del tipo $mensaje .="<font face=\"Arial\" size=6>Prueba HTML </font>";
de alfabeto (charset=) seguida
$mensaje .="</body></html>";
del tipo de codificacin (te
sugerimos el "ISO-8859-1" que
$responder="andres@mispruebas.com";
hace alusin al alfabeto latino). $remite="andres@mispruebas.com";
$remitente="Andrs otra vez";
Cuando se trata de ficheros
adjuntos deberemos poner, # definimos el separador de parte
despus del punto y coma, # con el mismo procedimiento del ejemplo anterior
name= seguido del nombre y
extensin del fichero que se $separador = "_separador_de_trozos_".md5 (uniqid (rand()));
adjunta.

Content-Transfer-Encoding # insertamos los datos de la cabecera del mensaje

Este apartado del encabezado $cabecera = "Date: ".date("l j F Y, G:i").$UN_SALTO;


puede especificar una de los $cabecera .= "MIME-Version: 1.0".$UN_SALTO;
siguientes codificaciones: $cabecera .= "From: ".$remitente."<".$remite.">".$UN_SALTO;
7BIT $cabecera .= "Return-path: ". $remite.$UN_SALTO;
8BIT $cabecera .= "Reply-To: ".$remite.$UN_SALTO;
BASE64
$cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO;
BINARY
QUOTED-PRINTABLE
# especificamos el tipo de contenido mutipart/mixed
La transferencia codificada en 7bit # ya que ahora insertaremos ficheros de distinto tipo
representa la codificacin habitual
en el formato ASCII de 7 bits. $cabecera .= "Content-Type: multipart/mixed;".$UN_SALTO;
No permite caracteres ASCII con
un cdigo mayor que 127. # insertamos el valor de boundary hacindola igual a $separador
# y acabamos con DOS SALTOS porque es el FINAL DE LA CABECERA
Quoted-printable constituye una
de las alternativas al formato
ASCII de 7 bits. $cabecera .= " boundary=$separador".$DOS_SALTOS;

Esta codificacin suele usarse /* Parte primera del envio -Mensaje en formato HTML
cuando la mayora de los ================================================
caracteres del mensaje puede
escribirse con formato US ASCII de Separador inicial
7 bits. ------------------------------- */
Prev que los caracteres con $texto ="--$separador".$UN_SALTO;
cdigos ASCII superiores 127 se
expresen mediante un mecanismo /* Encabezado parcial
especial. ------------------ */
/* especificamos que este primer elemento
Evita, entre otras cosas, que las ser texto y que ir codificado en formato 7 bits */
letras con tilde y algunos otros
caracteres especiales se visualicen
$texto .="Content-Type: text/html; charset=\"ISO-8859-1\"".$UN_SALTO;
incorrectamente. Es la forma de
$texto .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS;
codificacin ms recomendable
para textos.
/* Contenido de esta parte del mensaje
La codificacin en base64 -----------------------------------*/
convierte cadenas binarias en # ya teniamos escrito el texto del mensaje ms arriba
cadenas de texto, con lo cual # simplemente lo aadimos a la cadena de texto
pueden ser enviadas de forma ms
segura. Es la forma de codificacin $texto .= $mensaje;
habitual de las imgenes y los
ficheros exe, zip, etctera.
#la variable $texto recoge esta parte del documento
Content-Disposition # la uniremos al final con las siguientes

Se utiliza nicamente cuando se /* Separador de partes


insertan ficheros adjuntos. -------------------- */
Permite dos opciones: inline o
attachment.
$adj1 = $UN_SALTO."--$separador".$UN_SALTO;

Inline permite que los contenidos /* Parte segunda de mensaje -Fichero adjunto n 1
se visualicen junto con el cuerpo ==================================================== */
del mensaje mientras que con
attachment slo apareceran /* Encabezado parcial
como ficheros adjuntos. ------------------ */
# especificamos el tipo de contenido image/jpeg
Por lo que hemos podido
comprobar Outlook Express no # ya que ese ser el documento que vamos a enviar
suele respetar esa condicin y # ponemos el nombre del fichero (debemos tenerlo en el servidor
presenta siempre las imgenes en # con ese mismo nombre)
el mensaje. Sin embargo, s # establecemos in line como disposicin para que pueda ser visualizado
funciona en los correos web. # directamente en el cuerpo del mensajes
# en filename le asignamos el nombre con el que queremos que sea
Este elemento del encabezado # recibido por el destinatario
lleva -separada por punto y coma-
# por ultimo especificamos la codificacion como base64
una segunda parte.

El filename=, donde se puede $adj1 .="Content-Type: image/jpeg;";


especificar entre comillas un $adj1 .=" name=\"casa08.jpg\"".$UN_SALTO;
nombre y una extensin (igual o $adj1 .="Content-Disposition: inline; ";
distinta de la original) con la que $adj1 .="filename=\"leoncio.jpg\"".$UN_SALTO;
se denominar al fichero en el $adj1 .="Content-Transfer-Encoding: base64".$DOS_SALTOS;
mensaje recibido.
/* Lectura previa del fichero a adjuntar
Lectura del fichero
------------------------------------------ */
Cuando se trata de insertar un # abrimos el fichero en modo lectura (r)
fichero el proceso es el tpico de # y leemos todo su contenido midiendo previamente
lectura de ficheros, es decir: # su longitud con filesize
# recogemos en $buff el contenido del fichero
Hay que crear el # y cerramos despus
identificador de recurso del
fichero en modo lectura. $fp = fopen("casa08.jpg", "r");
Recoger en una variable el $buff = fread($fp, filesize("casa08.jpg"));
buffer de lectura. fclose($fp);
Cerrar el fichero.
/* Codificacin del fichero a adjuntar
Codificacin ------------------------------------------ */
# codificamos en base 64 y troceamos en lineas de 76 caracteres
Una vez recogido en el fichero a # y aadimos el resultado a la variable adj1
transmitir en una variable, el paso
siguiente es codificar esa variable.
$adj1 .=chunk_split(base64_encode($buff));
Utilizaremos la codificacin ms
habitual y flexible base64 que /* Separador de partes
requerir el uso de dos nuevas -------------------- */
funciones PHP:
$adj2 = $UN_SALTO."--$separador".$UN_SALTO;
base64_encode
chunk_split
/* Tercera parte de mensaje -Fichero adjunto n 2
Mediante la primera se realiza la ==================================================== */
codificacin propiamente dicha
mientras que la segunda organiza /* Encabezado parcial
el fichero codificado en trozos, de
------------------ */
76 caracteres cada uno, insertando
# los contenidos del encabezado son similares al caso anterior
detrs de cada uno un salto de
lnea. # con la salvedad de que el contenido es ahora
# application/octet-stream ya que contiene un fichero ejecutable
Si analizas un mensaje de correo # y la disposicion es attachment, no tiene sentido tratar
que contenga un fichero adjunto # de visualizar un fichero zip
propiedades, ver codificacin,
podrs ver esa fragmentacin tan $adj2 .="Content-Type: application/octet-stream;";
cuidada -un montn de lneas de $adj2 .=" name=\"apachito.zip\"".$UN_SALTO;
texto muy raro- perfectamente
$adj2 .="Content-Disposition: attachment;
alineadas por los mrgenes por
filename=\"apachito.zip\"".$UN_SALTO;
efecto de chunk_split.
$adj2 .="Content-Transfer-Encoding: base64".$DOS_SALTOS;
Insercin en el cuerpo
/* Lectura previa del fichero a adjuntar
La fase final del proceso es la de ------------------------------------------ */
agrupar los diferentes trozos en # abrimos el fichero en modo lectura (r)
una sola variable, que ser la que # y leemos todo su contenido midiendo previamente
se insertar como parmetro texto
# su longitud con filesize
en la funcin e-mail.
# recogemos en $buff el contenido del fichero
Cuidado! # y cerramos despus

La insercin de ficheros adjuntos $fp = fopen("apachito.zip", "r");


requiere que stos estn $buff = fread($fp, filesize("apachito.zip"));
disponibles en el servidor por lo fclose($fp);
que, antes de enviarlos, habr que
subirlos al servidor utilizando un
/* Codificacin del fichero a adjuntar
proceso como el que hemos
analizado cuando hablbamos de ------------------------------------------ */
Transferencia de ficheros.
$adj2 .=chunk_split(base64_encode($buff));
Sobre los ejemplos /* Separador final YA NO HAY MAS PARTES
---------------------------------------- */
Hemos incluido dos ejemplos
relativos al envo de ficheros en $adj2 .=$UN_SALTO."--$separador".$UN_SALTO;
formato HTML y con ficheros
adjuntos. /* Unin de todas las PARTES
No entraremos en el estudio ---------------------------------------- */
detallado del MIME. # unimos en la variable mensaje todos los elementos
# y lo hacemos por el orden en el que fueron creados
Quedaremos nicamente en sus
aspectos funcionales en cuanto a $mensaje=$texto.$adj1.$adj2;
los requerimientos de formato,
separadores, etc. /* Envio del mensaje
Quiz te parezca obsesivo el ---------------------------------------- */
hincapi que hacemos en los
ejemplos sobre los detalles de la if(mail($destinatario, $titulo, $mensaje,$cabecera)){
sintaxis. echo "mensaje enviado";
}
Nuestra insistencia se debe al
carcter sumamente estricto de la ?>
especificacin MIME, donde un
simple salto de lnea puede ser la
causa de que script deje de ejemplo101.php
funcionar.

Ejercicio n 32

Disea un script de forma que al cargarse la pgina que lo contiene se enve de forma
automtica un mensaje de correo, indicando la fecha y hora de acceso, al usuario
juan@mispruebas.com

Anterior Indice Siguiente


Imgenes dinmicas

Imgenes dinmicas
Requisitos del sistema

PHP permite la creacin dinmica El manejo de imgenes dinmicas requiere que est instalada la librera de PHP
de imgenes. Quiere esto decir llamada php_gd2.dll.
que una imagen puede ser
presentada en la pgina web sin En la versin de PHP que estamos manejando se instala por defecto, pero requiere que
necesidad de ser almacenada la configuracin de fichero php.ini tenga activada esta extensin.
previamente en el servidor y,
adems, con un contenido que Para activarla debers editar el fichero php.ini, buscar la lnea que dice: ;
puede ser modificado en cada extensions=php_gd2.dll y quitar el punto y coma que lleva delante.
instante.
A esto se le llama en el argot descomentar esa lnea. Las lneas de comentario en el
Esta posibilidad que ofrece PHP fichero php.ini empiezan por ese signo de puntacin.
puede resultar muy til a la hora
de presentar grficos estadsticos
ya que permitira utilizar valores
actuales obtenidos, por ejemplo, Comprobacin
de una base de datos.

Formatos GIF Una vez que hayamos modificado php.ini recuerda que debemos hacerlo con el
servidor Apache apagado activaremos de nuevo Apache y ejecutando info.php
Aunque son abundantes los
encontraremos algo similar a lo que ves en esta imagen:
materiales que aluden a este
formato grfico -incluso en las
pginas oficiales PHP- los formatos
GIF slo funcionan en modo
lectura.

Parece ser que existe un conflicto


sobre los derechos de propiedad
del algoritmo de compresin que
se utiliza en los ficheros .gif y eso
est obligando a los
desarrolladores de PHP a
abandonar este tipo de formato.

Formatos PNG

El formato de imgenes PNG


(Portable Network Graphic) nos
permite seguir disponiendo de un
formato grfico de difusin Cuando esto ocurra nuestra configuracin ser la adecuada para utilizar las funciones
gratuita con una funcionalidad PHP de este mbito y estaremos en disposicin de poder generar imgenes dinmicas.
similar al GIF en lo que se refiere a
transparencias y que junto con la Scripts para grficos estadsticos
posibilidad de usar tambin el
formato JPG va a cubrir las Si en algn momento tienes inters en insertar en tus pginas grficos estadsticos, en
necesidades grficas de esta
esta direccin http://www.aditus.nu/jpgraph/index.php podrs encontrar una interesante
utilidad de PHP.
coleccin de scripts listos para usar, con licencia gratuita para usos no comerciales.

Anterior Indice Siguiente


Formatos soportados

Formatos de imgenes
Formatos soportados

Pese a que info.php nos devuelve <?


informacin sobre los tipos de if (imagetypes() & IMG_GIF) {
imgenes soportados por la echo "El tipo GIF es soportado<br>";
versin en uso de PHP, existe una }else{
funcin que permite determinar echo "El tipo GIF NO ES SOPORTADO<BR>";
cuales de esos tipos son }
soportados por PHP. if (imagetypes() & IMG_PNG) {
echo "El tipo PNG es soportado<br>";
imagetypes()
}else{
Devuelve un campo de bits echo "El tipo PNG NO ES SOPORTADO<BR>";
correspondiente a los formatos }
soportados por la versin de GD if (imagetypes() & IMG_JPG) {
que estamos utilizando. echo "El tipo JPG es soportado<br>";
}else{
Los formatos de imagen que PHP echo "El tipo JPG NO ES SOPORTADO<BR>";
soporta actualmente son: GIF,
}
JPG, PNG y WBMP.
if (imagetypes() & IMG_WBMP) {
En la parte derecha tienes el echo "El tipo WBMP es soportado<br>";
cdigo fuente de un fichero que }else{
permite obtener informacin sobre echo "El tipo WBMP NO ES SOPORTADO<BR>";
los formatos soportados por tu }
versin de PHP.
?>
El conocimiento de estas
posibilidades grficas puede sernos
muy til a la hora de elegir entre ejemplo102.php
los diferentes formatos grficos
disponibles.
Anterior Indice Siguiente
Creando imgenes

Creacin de imgenes
dinmicas
Una primera imagen

Una imagen dinmica es tan slo <?


un script que contiene las Header("Content-type: image/jpeg");
instrucciones para la creacin de
esa imagen. $im = imagecreate(200,200);

Para visualizar una imagen Imagejpeg($im);


dinmica desde una pgina web
basta con invocar el fichero que
Imagedestroy($im);
contiene el script desde la etiqueta
clsica de insercin de imgenes
de HTML ?>

<img src="imgxx.php">
Ver img1.php
donde imgxx.php ser el nombre
del script que genera la imagen.
Cuidado!
Primera etiqueta No dejes NUNCA lneas en blanco entre la etiqueta <? de comienzo del script y la lnea
que contiene Header
Una vez conocidos los formatos Si escribiramos el script anterior sustituyendo image/jpeg por image/png e Imagejpeg
que soporta nuestra versin, ya ($im) por Imagepng($im) no visualizaramos nada.
podemos generar imgenes El formato jpg a falta de especificaciones considera la imagen con negro como color de
utilizando cualquiera de esos
fondo, pero png requiere que ese color sea especificado.
formatos.

Trabajaremos con dos de ellos:


JPG y PNG.

La primera instruccin que ha de Aadir un color de fondo


contener cualquier script que deba
generar imgenes ha de ser la
<?
siguiente:
Header("Content-type: image/jpeg");
Header("Content-type: image/
jpeg") $im = imagecreate(200,200);

si se trata de crear una imagen $fondo=imagecolorallocate ($im, 0, 0, 200);


JPG o:

Header("Content-type: image/ Imagefill ($im, 0, 0, $fondo);


png")
Imagejpeg($im);
si pretendemos que la imagen
tenga formato PNG. Imagedestroy($im);
?>
Cuidado!

Cualquier etiqueta header


Ver img2.php
(cabecera) ha de incluirse
obligatoriamente al comienzo del
script antes que ninguna otra
instruccin y sin ninguna lnea en <?
blanco que la preceda. Header("Content-type: image/png");

Pondremos siempre estas $im = imagecreate(200,200);


instrucciones inmediatamente
debajo de <? sin que las separe $fondo=imagecolorallocate ($im, 0, 0, 200);
ninguna lnea en blanco.
Imagefill ($im, 0, 0, $fondo);
Creacin de imgenes Imagepng($im);
Imagedestroy($im);
Definida la etiqueta anterior ?>
tenemos que: crear la imagen,
dibujarla y luego enviarla al
navegador para que pueda ser Ver img3.php
visualizada y, por ltimo, (no es
imprescindible pero si muy Dibujar un rectngulo sin relleno
conveniente) borrarla, con el fin
de liberar la memoria del servidor
ocupada durante el proceso de <?
generacin de la misma. Header("Content-type: image/jpeg");
$im = imagecreate(200,200);
Estas son las funciones PHP para $fondo=imagecolorallocate ($im, 0, 0, 200);
esos procesos:
$blanco=imagecolorallocate ($im, 255, 255, 255);
$nom = imagecreate(anc,al) Imagefill ($im, 0, 0, $fondo);

Con esta funcin se crea una imagerectangle ($im, 10, 10, 190, 190, $blanco);
imagen del tamao indicado en los
parmetros anc y al (en pixels) Imagejpeg($im);
que ser recogida en la variable
nom.
Imagedestroy($im);
Esta funcin es idntica para
cualquier formato de imagen. ?>

Envo de imgenes al Ver img4.php


navegador
Para enviar imgenes al navegador <?
(visualizacin) se usan funciones Header("Content-type: image/png");
diferentes segn el tipo de
imagen definida en Header. $im = imagecreate(200,200);
Si pretendemos que la imagen
tenga formato JPG habremos $fondo=imagecolorallocate ($im, 0, 0, 200);
puesto en Header la indicacin $blanco=imagecolorallocate ($im, 255, 255, 255);
jpeg (cuidado! observa la
sintaxis... jpeg). En este caso la Imagefill ($im, 0, 0, $fondo);
funcin de visualizacin ser:
imagerectangle ($im, 10, 10, 190, 190, $blanco);
Imagejpeg($nom)

Si se tratara de una imagen en Imagepng($im);


formato PNG (recuerda que debe
estar definido en Header) la Imagedestroy($im);
sintaxis sera:
?>
Imagepng($nom)

Eliminando imgenes de Ver img5.php


la memoria

Para borrar imgenes de la Dibujando un rectngulo con relleno


memoria del servidor (que no del
navegador) se utiliza la siguiente
sintaxis:

Imagedestroy($nom) <?
Header("Content-type: image/jpeg");
Creando colores
$im = imagecreate(200,200);

PHP permite crear una paleta de $fondo=imagecolorallocate ($im, 0, 0, 200);


colores. Para ello se pueden crear $blanco=imagecolorallocate ($im, 255, 255, 255);
variables de color (con
$amarillo=imagecolorallocate ($im, 255, 255,0);
independencia del formato
utilizado) mediante la siguiente
Imagefill ($im, 0, 0, $fondo);
funcin: imagerectangle ($im, 10, 10, 190, 190, $blanco);

$color=imagecolorallocate imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);


($nom,R,G,B)
Imagejpeg($im);
donde la variable recoge el color
resultante de mezclar los colores
Imagedestroy($im);
primarios indicados en R, G y B
que sern nmeros enteros
comprendidos entre 0 y 255 y que ?>
especifican la intensidad de las
luces roja, verde y azul utilizadas
para la obtencin del color. Ver img6.php

Se pueden definir tantos colores


como se deseen tan slo con <?
utilizar nombres de variables Header("Content-type: image/png");
distintos para cada uno de ellos.

Aplicar colores de fondo $im = imagecreate(200,200);

Para aplicar un color de fondo a


$fondo=imagecolorallocate ($im, 0, 0, 200);
una imagen (no importa el tipo del $blanco=imagecolorallocate ($im, 255, 255, 255);
formato) se utiliza la siguiente $amarillo=imagecolorallocate ($im, 255, 255,0);
funcin: Imagefill ($im, 0, 0, $fondo);
imagerectangle ($im, 10, 10, 190, 190, $blanco);
Imagefill($nom,x,y,$col)
imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);
Aqu $nom es la variable que
contiene la imagen, x e y son las
coordenadas del punto de la Imagepng($im);
imagen a partir del cual se aplica
el relleno y $col el color Imagedestroy($im);
(previamente definido) que se
pretende aplicar a la imagen. ?>

Mediante esta funcin todos los


puntos colindantes con el de Ver img7.php
coordenadas x,y que tengan su
mismo color sern rellenados con
el color especificado en la variable
$col.
Dibujando un polgono relleno
Rectngulos sin relleno

Para dibujar un rectngulo sin <?


relleno (solo las lneas) se utiliza la Header("Content-type: image/jpeg");
siguiente funcin:
$esquinas=array(20,100,100,180,180,100,100,20);
imagerectangle(
$nom, x0, y0, x1, y1, $col)
$im = imagecreate(200,200);
Donde $nom es el nombre de la
imagen, x0, y0 son las $fondo=imagecolorallocate ($im, 0, 0, 200);
$blanco=imagecolorallocate ($im, 255, 255, 255);
coordenadas del vrtice superior
izquierdo y x1, y1 las $amarillo=imagecolorallocate ($im, 255, 255,0);
Imagefill ($im, 0, 0, $fondo);
coordenadas del vrtice inferior
derecho y $col el color que imagerectangle ($im, 10, 10, 190, 190, $blanco);
pretendemos asignar a las lneas imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);
del rectngulo.
imagefilledpolygon ($im, $esquinas, 4, $blanco);
El punto (0,0) siempre es la
esquina superior izquierda de la
imagen y recuerda que si no usas
Imagejpeg($im);
en las lneas un color distinto al
del fondo no se visualizar el Imagedestroy($im);
rectngulo.
?>
Rectngulos con relleno
Ver img8.php
Para dibujar un rectngulo con
relleno se utiliza la siguiente
funcin: <?
Header("Content-type: image/png");
imagefilledrectangle( $nom, x0,
y0, x1, y1, $col) $esquinas=array(20,100,100,180,180,100,100,20);
Los parmetros son idnticos a los
$im = imagecreate(200,200);
del caso anterior con la nica
diferencia de que en este caso el
rectngulo aparecer relleno con el $fondo=imagecolorallocate ($im, 0, 0, 200);
color elegido. $blanco=imagecolorallocate ($im, 255, 255, 255);
$amarillo=imagecolorallocate ($im, 255, 255,0);
Imagefill ($im, 0, 0, $fondo);
Polgonos con relleno imagerectangle ($im, 10, 10, 190, 190, $blanco);
imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);
Para colorear el fondo de un
polgono son necesarias dos imagefilledpolygon ($im, $esquinas, 4, $blanco);
operaciones:
Imagepng($im);
Crear un array con las
coordenadas de cada uno Imagedestroy($im);
de sus vrtices.
Aplicar la funcin que ?>
dibuja polgonos de este
tipo.
Ver img9.php
La creacin del array podra
hacerse as:

$v=(x0, y0, x1, y1,... xn, yn ) Dibujando un polgono sin relleno


donde se iran introduciendo las
coordenadas de los sucesivos
vrtices del polgono (x e y de
cada vrtice). <?
Header("Content-type: image/jpeg");
La creacin de un polgono de este
tipo requiere la siguiente funcin: $esquinas=array(20,100,100,180,180,100,100,20);
imagefilledpolygon($nom,
$vert, n vert , $col) $im = imagecreate(200,200);

donde $nom es el nombre de la $fondo=imagecolorallocate ($im, 0, 0, 200);


imagen, $vert es el array que $blanco=imagecolorallocate ($im, 255, 255, 255);
contiene las coordenadas de los $amarillo=imagecolorallocate ($im, 255, 255,0);
vrtices, n vert es el nmero de Imagefill ($im, 0, 0, $fondo);
vrtices y $col es el color de imagerectangle ($im, 10, 10, 190, 190, $blanco);
relleno. imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);

Polgonos sin relleno imagepolygon ($im, $esquinas, 4, $blanco);

Su funcionamiento es idntico al Imagejpeg($im);


anterior en tanto requiere que se
defina el array de coordenadas de Imagedestroy($im);
los vrtices y los parmetros de la
funcin son los mismos indicados ?>
en el caso anterior. Slo se
modifica el nombre de la funcin
que en este caso es: Ver img10.php

imagepolygon(
$nom, $vert, n vert , $col)
<?
Header("Content-type: image/png");
Elipses, circunferencias y
arcos $esquinas=array(20,100,100,180,180,100,100,20);

Una misma funcin nos permite $im = imagecreate(200,200);


dibujar elipses, circunferencias y
arcos. Es la siguiente: $fondo=imagecolorallocate ($im, 0, 0, 200);
$blanco=imagecolorallocate ($im, 255, 255, 255);
imagearc($nom, Xc, Yc , a, b, Gi, $amarillo=imagecolorallocate ($im, 255, 255,0);
Gf, $col) Imagefill ($im, 0, 0, $fondo);
imagerectangle ($im, 10, 10, 190, 190, $blanco);
Los parmetros de esta funcin
son los siguientes: imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);

imagepolygon ($im, $esquinas, 4, $blanco);


$nom es el nombre de la
imagen.
Imagepng($im);
Xc e Yc las coordenadas
del centro de la elipse.
a es la longitud del eje Imagedestroy($im);
horizontal de la elipse.
b es la longitud del eje ?>
vertical de la elipse.
Gi es el punto inicial del
Ver img11.php
arco y se expresa en
grados sexagesimales.
Gf es el punto final del arco
tambin en grados
sexagesimales. Dibujando circunferencias, elipses y arcos
$col es el color con el que
se dibujar la lnea.

Respecto a los ngulos, CERO <?


GRADOS coincide con el cero $esquinas=array(20,100,100,180,180,100,100,20);
trigonomtrico pero el sentido es $im = imagecreate(200,200);
contrario, es decir, el de las agujas $fondo=imagecolorallocate ($im, 0, 0, 200);
del reloj. $blanco=imagecolorallocate ($im, 255, 255, 255);
Obviamente, para dibujar una
$amarillo=imagecolorallocate ($im, 255, 255,0);
circunferencia basta con hacer Imagefill ($im, 0, 0, $fondo);
iguales los valores de a y de b y imagerectangle ($im, 10, 10, 190, 190, $blanco);
fijar los puntos inicial y final en 0 imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);
y 360 respectivamente. imagepolygon ($im, $esquinas, 4, $blanco);

imagearc ($im, 100, 100, 160, 160, 0, 360, $fondo);


Dibujando sobre una
imagearc ($im, 100, 100, 160, 100, 0, 360, $rojo);
imagen de fondo
Imagejpeg($im);
PHP permite crear imgenes
utilizando como fondo una Imagedestroy($im);
preexistente. Para ello basta con
crear una variable indicando el
?>
path y el nombre de la imagen,
por ejemplo:

$b="./images/cruz.jpg"
Ver img12.php

El formato de esta imagen debe


coincidir con el de la que <?
pretendemos construir. Header("Content-type: image/png");
$esquinas=array(20,100,100,180,180,100,100,20);
Una vez definida esta variable
$im = imagecreate(200,200);
bastar sustituir la instruccin de
creacin de imagen
$fondo=imagecolorallocate ($im, 0, 0, 200);
$blanco=imagecolorallocate ($im, 255, 255, 255);
$nom = imagecreate(x,y) $amarillo=imagecolorallocate ($im, 255, 255,0);
Imagefill ($im, 0, 0, $fondo);
por: imagerectangle ($im, 10, 10, 190, 190, $blanco);
imagefilledrectangle ($im, 20, 20, 180, 180, $amarillo);
$nom= imagecreatefrompng
($b) imagepolygon ($im, $esquinas, 4, $blanco);

en el caso de imgenes PNG o por: imagearc ($im, 100, 100, 160, 160, 0, 360, $fondo);
imagearc ($im, 100, 100, 160, 100, 0, 360, $rojo);
$nom= imagecreatefromjpeg
($b) Imagepng($im);
si se tratara de imgenes en
formato JPG. Imagedestroy($im);

El resultado del cambio en el ?>


primero de los casos es este y aqu
tienes tambin la imagen obtenida
utilizando un fondo en formato JPG. Ver img13.php

Una advertencia al respecto. Como


puedes comprobar en los
ejemplos, el tamao de la imagen Utilizando imgenes dinmicas
es el mismo de la utilizada como
fondo.
En todos los ejemplos anteriores hemos podido visualizar las imgenes con slo
llamarlas desde el navegador, de la misma forma que podramos visualizar cualquier otra
imagen.
Guardando imgenes
Pero las imgenes dinmicas pueden ser insertadas en una pgina web de la misma
Las imgenes que son creadas forma que cualquier otra imagen.
mediante la sintaxis anterior no se
guardan en servidor. Aqu tienes un ejemplo donde se recogen en una pgina web todas las imgenes
dinmicas creadas anteriormente.
Si se pretende guardarlas hay que
modificar la sintaxis de las
etiquetas:
ejemplo103.php

Imagepng($nombre) Si observas el cdigo fuente vers que es exactamente el mismo que se utiliza para
insertar una imagen normal, con la nica diferencia de que aqu el nombre de la
o
imagen ser el mismo que el del fichero PHP que la genera.
Imagejpeg($nombre)

aadiendo otro parmetro con el Anterior Indice Siguiente


nombre y la extensin del fichero
que vamos de guardar. As por
ejemplo:

Imagepng(
$nombre, "mi_imagen.png")

Imagejpeg(
$nombre, "mi_imagen.jpg")

guardaran en el servidor las


imgenes creadas con los nombres
mi_imagen.png o mi_imagen.
jpg
Imgenes con lneas y textos

Trazando segmentos
Dibujando segmentos
Aunque presentaremos nicamente el cdigo fuente de una de las imgenes, para
La funcin PHP que permite dibujar hacer la comprobacin de las funciones y las diferencias de visualizacin insertaremos
segmentos rectilneos es la dos ejemplos, uno en formato PGN y otro en JPG.
siguiente:
Recuerda que las nicas diferencias entre ambos radican en utilizar: Header("Content-
imageline(
type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng
$nom,x0, y0,x1,y1,$col)
Imagejpeg.
donde: $nom es el nombre de la
variable definida mediante <?
imagecreate, x0 e y0 son las Header("Content-type: image/png");
coordenadas de uno de los $im = imagecreate(200,200);
extremos; x1 e y1 son las $fondo=ImageColorAllocate ($im,0,0,255);
coordenadas del otro extremo y $linea=ImageColorAllocate ($im,255,255,255);
$col es la variable de color con el
que ser dibujada la lnea. imageline($im,0,0,200,200,$linea);

Colores de fondo Imagepng($im);


Imagedestroy($im);
Tal como puedes observar en los ?>
primeros ejemplos de esta pgina,
PHP utiliza como fondo de la
Ver img_a1.php Ver img_a2.php
imagen el primer color definido por
la funcin: Formato PNG Formato JPG

ImageColorAllocate.
Fondos transparentes
Esta opcin de PHP nos obliga a
definir dos colores distintos
para conseguir la visibilidad de las <?
lneas. Header("Content-type: image/png");
$im = imagecreate(200,200);
$fondo=ImageColorAllocate ($im,0,0,255);
Crear transparencias $linea=ImageColorAllocate ($im,255,0,0);
imagecolortransparent ($im ,$fondo);
Si deseamos que un color imageline($im,0,0,200,200,$linea);
determinado se comporte como si Imagepng($im);
fuera transparente debemos Imagedestroy($im);
utilizar la funcin: ?>
imagecolortransparent ($nom ,
$col).
Ver img_a3.php Ver img_a4.php
donde: $nom es el nombre de la Formato PNG Formato JPG
variable definida mediante
imagecreate, y $color es el color Aqu tienes una pgina -con un color de fondo- en la que puedes visualizar las
que pretendemos hacer diferencias entre los dos formatos.
transparente.

No olvides estos dos pequeos ejemplo104.php


detalles:

Si pretendes lograr un fondo Insertando caracteres


transparente debes hacer
transparente el primero de los
<?
colores definidos.
Esta funcin slo tiene sentido Header("Content-type: image/png");
en imgenes PNG que son las $im = imagecreate(150,150);
nicas que permiten zonas $t1="Tamao 1";
transparentes. Recuerda que JPG $t2="Tamao 2";
no las permite. $t3="Tamao 3";
$t4="Tamao 4";
Insertando textos $t5="Tamao 5";
$fondo=imagecolorallocate ($im, 0, 0, 200);
$amarillo=imagecolorallocate ($im, 255, 255,0);
Para insertar textos dentro de una imagechar ($im, 1, 0, 0, $t1, $amarillo);
imagen hemos de recurrir a una de
imagechar ($im, 2, 20, 20, $t2, $amarillo);
estas funciones:
imagechar ($im, 3, 40, 40, $t2, $amarillo);
imagechar ($im, n, x, y, $txt, imagechar ($im, 4, 60, 60, $t2, $amarillo);
$col) imagechar ($im, 5, 80, 80, $t2, $amarillo);
Imagepng($im);
Requiere que la variable $txt imagedestroy($im);
contenga una cadena definida con ?>
anterioridad. Mediante esta funcin
se inserta el primer carcter de la
cadena con orientacin horizontal. Ver img17.php Ver img18.php
Los parmetros de la funcin son Formato PNG Formato JPG
los siguientes:

$nom el nombre de la variable <?


con la que fue definida por Header("Content-type: image/png");
imagecreate $im = imagecreate(150,150);
$t1="Tamao 1";
n es un nmero comprendido
entre UNO y CINCO que asigna el $t2="Tamao 2";
tamao de la letra de menor a $t3="Tamao 3";
mayor. $t4="Tamao 4";
$t5="Tamao 5";
x e y son las coordenadas del $fondo=imagecolorallocate ($im, 0, 0, 200);
punto donde se colocar la $amarillo=imagecolorallocate ($im, 255, 255,0);
esquina superior izquierda del
imagecharup ($im, 1, 10, 10, $t1, $amarillo);
carcter a representar. imagecharup ($im, 2, 20, 20, $t2, $amarillo);
$txt es la cadena de texto de la imagecharup ($im, 3, 40, 40, $t2, $amarillo);
que se extraer el primer carcter, imagecharup ($im, 4, 60, 60, $t2, $amarillo);
el nico que se ver en la imagen. imagecharup ($im, 5, 80, 80, $t2, $amarillo);
Imagepng($im);
$col es el color del carcter a imagedestroy($im);
representar.
?>
imagecharup ($im, n, x, y, $txt,
$col)
Ver img19.php Ver img20.php
Su funcionamiento es similar al de
la funcin anterior, con la nica Formato PNG Formato JPG
diferencia de que inserta el
carcter con orientacin vertical.
<?
Las coordenadas de insercin Header("Content-type: image/png");
tambin se corresponden con las
$im = imagecreate(150,150);
de la esquina superior izquierda
$t1="Tamao 1";
del carcter pero, recuerda que
ahora estar girado y que, por lo $t2="Tamao 2";
tanto, ese punto coincidir con $t3="Tamao 3";
parte inferior izquierda de la $t4="Tamao 4";
imagen del carcter. $t5="Tamao 5";
$fondo=imagecolorallocate ($im, 0, 0, 200);
imagestring ($im, n, x, y, $txt, $amarillo=imagecolorallocate ($im, 255, 255,0);
$col) imagestring ($im, 1, 10, 20, $t1, $amarillo);
Esta funcin se comporta de forma
imagestring ($im, 2, 10, 40, $t2, $amarillo);
similar a imagechar. La nica imagestring ($im, 3, 10, 60, $t3, $amarillo);
diferencia entre ambas es que imagestring ($im, 4, 10, 80, $t4, $amarillo);
mientras imagechar inserta slo imagestring ($im, 5, 10, 100, $t5, $amarillo);
el primer carcter, en el caso de Imagepng($im);
imagestring se inserta la cadena imagedestroy($im);
completa. ?>
Los parmetros de ambas
funciones son los mismos. Ver img21.php Ver img22.php
Si la cadena desborda los lmites Formato PNG Formato JPG
de la imagen slo se visualizar la
parte de la misma contenida
dentro de stos. <?
Header("Content-type: image/png");
imagestringup ($im, n, x, y, $im = imagecreate(150,150);
$txt, $col) $t1="Tamao 1";
Inserta una cadena completa con $t2="Tamao 2";
orientacin vertical y sus $t3="Tamao 3";
parmetros son idnticos a los $t4="Tamao 4";
comentados cuando nos hemos $t5="Tamao 5";
referido a imagecharup. $fondo=imagecolorallocate ($im, 0, 0, 200);
$amarillo=imagecolorallocate ($im, 255, 255,0);
Tipos de letra imagestringup ($im, 1, 10, 100, $t1, $amarillo);
imagestringup ($im, 2, 20, 100, $t2, $amarillo);
imagestringup ($im, 3, 40, 100, $t3, $amarillo);
Todas las funciones anteriores imagestringup ($im, 4, 60, 100, $t4, $amarillo);
utilizan siempre la fuente
imagestringup ($im, 5, 80, 100, $t5, $amarillo);
predefinida por PHP y slo
Imagepng($im);
permiten los cinco tamaos que
hemos podido ver en los ejemplos. imagedestroy($im);
?>
Afortunadamente lo veremos en
la pgina siguiente PHP tambin
permite usar fuentes TrueType y Ver img23.php Ver img24.php
aplicarlas en la creacin de Formato PNG Formato JPG
imgenes.

Anterior Indice Siguiente


Manejando fuentes

Utilizando fuentes
Dibujando segmentos
TrueType Aunque presentaremos nicamente el cdigo fuente de una de las imgenes, para
hacer la comprobacin de las funciones y las diferencias de visualizacin insertaremos
Si has ledo los comentarios de la dos ejemplos. Uno en formato PGN y otro en JPG.
pgina anterior recordars que
para usar estas funciones es Recuerda que las nicas diferencias entre ambos radican en utilizar: Header("Content-
preciso que estn instaladas las type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng
libreras FreeType y que, adems, Imagejpeg.
conozcamos el path de directorio
que contiene las fuentes TrueType.
Texto TrueType horizontal
Instalacin de fuentes
<?
Header("Content-type: image/png");
Hemos creado un subdirectorio $im = imagecreate(400,300);
llamado fuentes y lo hemos $fondo=imagecolorallocate ($im, 255, 255, 210);
incluido en directorio donde estn
$rojo=imagecolorallocate ($im, 255, 0, 0);
alojadas estas pginas.

En ese subdirectorio hemos $texto="PHP";


incluido dos fuentes TrueType
manteniendo en una de ellas el Imagettftext($im, 40, 0, 100, 270, $rojo,
nombre original (arial.ttf) y "./fuentes/fuente2.ttf", $texto);
renombrado la otra como fuente2.
ttf. Imagepng($im);
imagedestroy($im);
Como podrs comprobar en los
ejemplos, no hay problema alguno
por el hecho de renombrar las ?>
fuentes.
Ver img25.php Ver img26.php
Escribiendo con fuentes Formato PNG Formato JPG
TrueType
Texto TrueType girado
La funcin PHP que nos permite
insertar este tipo de textos en
imgenes dinmicas es la <?
siguiente: Header("Content-type: image/png");
$im = imagecreate(400,300);
Imagettftext($nom, tam, $fondo=imagecolorallocate ($im, 255, 255, 210);
ang, x, y, $col, $fuente, $txt) $rojo=imagecolorallocate ($im, 255, 0, 0);
donde:
$texto="Me gusta PHP";
$nom es, como siempre, el
nombre de la imagen. Imagettftext($im, 40, 30, 100, 270, $rojo,
"./fuentes/fuente2.ttf", $texto);
tam es un nmero entero que
indica el el tamao de la fuente.
Imagepng($im);
ang es el giro expresado en imagedestroy($im);
grados sexagesimales que
pretendemos que tenga la cadena ?>
de texto. Si ang=0 el texto
aparecer escrito en horizontal.
Ver img27.php Ver img28.php
x e y son las coordenadas del Formato PNG Formato JPG
punto de inicio de la insercin del
texto. Ese punto coincide con la
esquina inferior izquierda del Centrando textos
rectngulo imagi- nario que
contiene el texto. Aqu tienes un ejemplo donde utilizando ImageTTFBox e ImageTTFText se puede
centrar un texto -tanto si es horizontal como si est girado- con relacin a un punto.
$col es el color a utilizar en el
texto. En este ejemplo, el punto de referencia para el centrado es (200,150) que es el
centro de la imagen.
$fuente es una cadena de texto
que contiene el path y el nombre
Las coordenadas de ImageTTFText, como puedes ver, estn calculadas usando las
de la fuente. Observa los ejemplos.
coordenadas de ese punto de referencia y los valores del array generado por
$txt es el nombre de la variable ImageTTFBox
que contiene el texto a insertar.
. Si la variable que contiene el array generado por ImageTTFBox se llama $pepa, las
coordenadas del centro del rectngulo imaginario son $pepa[4]/2 y $pepa[5]/2
Colocando textos
Partiendo de esos valores, si queremos centrar el texto sobre un punto de la imagen
PHP dispone de una funcin que cuyas coordenadas son (X,Y) nos basta con escribir como parmetros de la funcin
permite determinar las ImageTTFText los siguientes:
dimensiones de una caja de
texto (el rectngulo imaginario
que rodea el texto). Abscisa= X - $pepa[4]/2

$rec= ImageTTFBBox (tam, Abscisa= Y - $pepa[5]/2


ang, $fuente, $txt)
Este procedimiento es vlido tanto para textos horizontales como para textos girados.
donde: tam es el tamao de la
fuente a utilizar.
Aqu lo tienes:
ang es el ngulo de rotacin del
texto que tendra valor cero en el <?
caso de orientacin horizontal. Header("Content-type: image/png");
$fuente es el path y nombre de
la fuente a a utilizar. $im = imagecreate(400,300);
$fondo=imagecolorallocate ($im, 255, 255, 210);
$gris=imagecolorallocate ($im, 160, 160,160);
$txt es el nombre de la variable
que contiene el texto a incluir. $rojo=imagecolorallocate ($im, 255, 0, 0);

La variable $rec recoge un array $texto="El mundo del PHP";


escalar cuyos valores son las $texto1="lleno de posibilidades";
coordenadas de las cuatro
esquinas de la caja de texto.
$marco= ImageTTFBBox (40, 0, "./fuentes/arial.ttf", $texto);
Los ndices correspondientes a
cada uno de los elementos de ese
array son los siguientes: Imagettftext($im, 40, 0, 200-$marco[4]/2, 150-$marco[5]/2, $gris,
"./fuentes/arial.ttf", $texto);
Inferior izquierdo
Sus coordenadas son:
$rec[0],$rec[1] $marco1= ImageTTFBBox (30, 30, "./fuentes/fuente2.ttf", $texto1);

Inferior derecho Imagettftext($im, 30, 30, 200-$marco1[4]/2, 150-$marco1[5]/2, $rojo,


Sus coordenadas son: "./fuentes/fuente2.ttf", $texto1);
$rec[2],$rec[3]

Superior derecho
Imagepng($im);
Sus coordenadas son:
$rec[4],$rec[5]
imagedestroy($im);

Superior izquierdo ?>


Sus coordenadas son:
$rec[6],$rec[7]
Ver img29.php Ver img30.php
Respecto a estas coordenadas, Formato PNG Formato JPG
habremos de tener en cuenta lo
siguiente: Un ejemplo resumen
Las correspondientes al Aqu tienes un ejemplo bastante completo de generacin de imgenes dinmicas.
vrtice inferior izquierdo
son siempre (0,0). Ver ejemplo105.php Ver cdigo fuente
Los puntos situados por
encima del (0,0) tienen Cuidado!
ordenada negativa.
En servidores UNIX y LINUX la forma en la que indicamos el path del directorio que contiene
Las abscisas de los puntos
situados a la izquierda del
las fuentes vara sustancialmente respecto a la que hemos utilizado en estos ejemplos.
(0,0) son negativas. En aquellos, adems de invertir los separadores, se requiere indicar siempre rutas
absolutas, con lo cual habra que hacer las modificaciones oportunas si se tratara de
publicar en un hosting que utilice alguno de estos sistemas operativos.

Anterior Indice Siguiente


Diagramas de sectores

Diagramas de sectores
Diagramas de sectores

Esta posibilidad grfica de <?


tratamiento de informacin $im = imagecreate (400, 400);
estadstica la proporciona la $fondo = imagecolorallocate($im, 226, 226, 226);
funcin imagefilledarc() que $col1=imagecolorallocate($im,255,255,0);
requiere -por el orden que se $col2=imagecolorallocate($im,255,0,0);
indica- los parmetros: imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_PIE);
imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL);
Xc y Yc que son las coordenadas header('Content-type: image/png');
del centro de la elipse cuyo arco (o imagepng($im);
porcin) tratamos de representar. imagedestroy($im);
A y B que son las longitudes ?>
(expresadas en pixels) de los ejes
horizontal y vertical de la elipse. Si
ambos fueran iguales el resultado
Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
sera circular.

Pi y Pf son las posiciones (en <?


grados sexagesimales) de los $im = imagecreate (400, 400);
radios (inicial y final) que delimitan $fondo = imagecolorallocate($im, 226, 226, 226);
el sector que se trata de $col1=imagecolorallocate($im,255,255,0);
representar. $col2=imagecolorallocate($im,255,0,0);
imagefilledarc($im, 200, 200, 350, 300, 20, 240, $col1, IMG_ARC_EDGED);
Los cero grados coinciden con el
semieje horizontal positivo y el
imagefilledarc($im, 200, 200, 350, 300, 10, 150, $col2, IMG_ARC_NOFILL);
sentido del recorrido angular es el header('Content-type: image/png');
de las agujas del reloj. imagepng($im);
imagedestroy($im);
$color es la variable -ha de ser ?>
definida previamente mediante
imagecolorallocate- que indica el
color que ha de utilizarse en el Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
grfico.

El ltimo parmetro es un
<?
constante PHP que puede tomar
$im = imagecreate (400, 400);
uno de los siguientes valores:
$fondo = imagecolorallocate($im, 226, 226, 226);
IMG_ARC_PIE $color1=imagecolorallocate($im,255,0,0);
IMG_ARC_NOFILL imagefilledarc ($im, 200, 200, 350, 300, 20, 240, $color1,
IMG_ARC_EDGED IMG_ARC_NOFILL|IMG_ARC_EDGED);
IMG_ARC_CHORD header('Content-type: image/gif');
imagegif($im);
Con la primera de las constantes
imagedestroy($im);
dibuja el sector de elipse
delimitado por los radios indicados ?>
relleno con el color especificado.

El segundo (IM_ARC_NOFILL) Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
nicamente dibuja la porcin de
arco, pero no incluye los radios en
el dibujo. <?
$im = imagecreate (400, 400);
La opcion IMG_ARC_EDGED se $fondo = imagecolorallocate($im, 226, 226, 226);
comporta de forma idntica a $color1=imagecolorallocate($im,255,0,0);
IMG_ARC_PIE cuando se utiliza de
imagefilledarc ($im, 200, 200, 350, 300, 50, 200, $color1,
forma aislada aunque tiene una
opcin muy interesante que
IMG_ARC_CHORD);
veremos un poco ms abajo. header('Content-type: image/gif');
imagegif($im);
Con IMG_ARC_CHORD el resultado imagedestroy($im);
es un tringulo -relleno con el ?>
color indicado-formado por los dos
radios y la cuerda correspondiente
al arco que delimitan. Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif

Combinar dos constantes


<?
$im = imagecreate (400, 400);
Cuando utilizamos como ltimo
$fondo = imagecolorallocate($im, 226, 226, 226);
parmetro de la funcin
$color1=imagecolorallocate($im,200,0,0);
imagefilledarc() una expresin del
tipo: $color2=imagecolorallocate($im,255,0,0);
IMG_ARC_NOFILL|IMG_ARC_EDGED $color3=imagecolorallocate($im,255,255,255);
(fjate en el signo | que separa for($i=200;$i<225;$i++){
ambas constantes) lo que imagefilledarc($im, 200, $i, 370, 270, 50, 330, $color1,
obtenemos es la representacin IMG_ARC_NOFILL|IMG_ARC_EDGED);
grfica del contorno del sector }
(incluye los radios que lo imagefilledarc($im, 200, 200, 370, 270, 50, 330, $color2, IMG_ARC_EDGED);
delimitan). Mediante esta opcin - imagefilledarc($im, 200,200, 370, 270, 50, 330, $color3,
con dos llamadas a la funcin- IMG_ARC_NOFILL|IMG_ARC_EDGED);
tenemos la posibilidad de
representar el sector con un color
de relleno (usando IMG_ARC_PIE)
header('Content-type: image/gif');
y, luego, superponerle un contorno imagegif($im);
de distinto color. Puedes verlo en imagedestroy($im);
los ejemplos. ?>

Efecto tridimensional Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif

Tal como puedes ver en los


ejemplos, resulta fcil lograr un
Ejercicio n 33
efecto tridimensional en el dibujo
de los sectores. Basta con crear un Disea un formulario mediante el cual puedas transferir 4 valores numricos aun un script
bucle que dibuje arcos sucesivos
que cree un diagrama de cuatro sectores cuyos ngulos centrales sumen 360 y sean
(separados verticalmente por un
pixel) y posteriormente superponer proporcionales a los valores numricos transferidos.
un sector relleno con un color
distinto.

Anterior Indice Siguiente


Encuadre y redimensionado de imgenes

Lectura de
imgenes externas
Lectura de imgenes externas

La visualizacin de imgenes no Uno de los problemas que puede presentarse es la forma de indicar dnde estn la imagen a
presenta ningn problema lo visualizar. En Windows es necesario utilizar la "\" mientras que para Linux hay que usar "/".
hacemos habitualmente mediante
etiquetas HTML cuando se Al utilizar "\" en Windows puede plantearse el problema de que vaya precedida por algn
encuentran en el espacio del caracter que pueda tener una significacin especial como por ejemplo \n. Una solucin para
servidor, bien sea propio o ajeno. evitar esos eventuales problemas es escribir "\\" como separador de niveles de directorio. De
esta forma el primer "\" indica que lo que le precede ha de interpretarse sin ninguna
El problema puede surgir cuando significacin especial.
tratemos de almacenar esas
imgenes fuera del root del
servidor (una forma de impedir la <?
accesibilidad desde otras webs) y # indicar la ruta de la imagen
eso puede conseguirse mediante $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg";
las funciones que veremos en este
captulo. # extraer el tipo de imagen segn su la extension del fichero
for($i=strlen($original)-1;$i>0;$i--){
El primer paso ser establecer la
if (substr($original,$i,1)=="."){
ruta y el nombre de la imagen. Al
margen tienes comentados $tipo=substr($original,$i+1);
algunos detalles al respecto. break;
}
El paso siguiente ser extraer el }
formato de la imagen. Lo hice # las diferentes opciones dependiendo del formato de la imagen
leyendo la parte de la cadena switch($tipo){
comprendida entre el ltimo punto case "jpg":
(.) y el final de la cadena que Header("Content-type:image/jpeg");
contiene el nombre de la imagen.
$nueva=imagecreatefromjpeg($original);
Mediante el switch elijo las imagejpeg($nueva);
instrucciones para cada tipo de break;
imagen que son similares pero con
matices segn del formato. case "png":
Header("Content-type:image/png");
La visualizacin de la imagen $nueva=imagecreatefrompng($original);
contiene tres instrucciones:
imagepng($nueva);
Header, imagecreatefrom e
break;
imageXXX.

En Header hay que incluir un case "gif":


Content - type acorde con el tipo Header("Content-type:image/gif");
de imagen. Puede ser, entre otros $nueva=imagecreatefromgif($original);
valores: image/jpeg, image/ imagegif($nueva);
png image/gif segn la imagen break;
tenga formato: jpg, png gif. }
Con idntico criterio, la funcin ImageDestroy();
que crea la imagen ha de ser una ?>
de estas:

$f=imagecreatefromjpeg($i) Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif

$f=imagecreatefrompng($i)
Cuidado!
$f=imagecreatefromgif($i)
Observa que en las imgenes en formato png se visualizan con deficiencias en los bordes de las
siendo $i la variable que recoge el reas transparentes.
nombre y el path de la imagen
original y $f la variable que Con el mtodo que vemos a continuacin ese problema se reduce considerablemente.
contiene el resultado de la
ejecucin de esta funcin.

La funcin image (la que permite


visualizar la nueva imagen) Lectura y redimensionado de imgenes externas
tambin puede tener una de las
tres variantes que ya conocemos
de ejemplos anteriores. Pueden
ser: <?
imagejpeg($f), imagepng($f)
# indicar la ruta de la imagen
imagegif($f), donde $f es la
variable que recoge el resultado de $original="C:\\Apache\\htdocs\\cursoPHP\\images\\caballos.jpg";
la funcin anterior. for($i=strlen($original)-1;$i>0;$i--){
if (substr($original,$i,1)=="."){
$tipo=substr($original,$i+1);
Redimensionado de break;
imgenes externas }
}
Tampoco parece ninguna utilidad. # dimesiones del original
Verdad? A fin de cuentas con $tamano=getimagesize($original);
etiquetas HTML podemos asignar $orig_Ancho = $tamano[0];
el ancho y el alto de una imagen. $orig_Alto =$tamano[1];
Pero... ya vers como no es tan # factores de ampliacin, distintos para provocar una distorsin
trivial esta opcin.
# en la imagen resultante
El proceso es el siguiente: $ampliacion_X=2;
$ampliacion_Y=1.5;
1.- Determinamos cuales son las # dimesiones de la imagen resultante. Vamos a dejarla a sangre
dimensiones de la imagen externa # (sin mrgenes en blanco) y vamos a reproducir el original
que vamos a utilizar. Para ello, # sin reencuadrar as que las esquinas superiores izquierdas de
usaremos de la funcin: # ambas imgenes estarn en 0,0.
$dim=getimagesize($r)
$resultado_Ancho=$orig_Ancho*$ampliacion_X;
$resultado_Alto= $orig_Alto*$ampliacion_Y;
donde $r es la variable que #creamos una imagen a partir de la original. Debemos elegir
contiene el path y nombre del #la funcion adecuada al tipo de imagen original
fichero que contiene la imagen y switch($tipo){
$dim es un array escalar que
case "jpg":
contiene las dimensiones de la
$importada=imagecreatefromjpeg($original);
imagen analizada.
break;
El elemento del array $dim[0] case "png":
contiene el ancho y $dim[1] el $importada=imagecreatefrompng($original);
alto, ambos expresados en pixels. break;
case "gif":
Cuidado...! $importada=imagecreatefromgif($original);
Esta funcin solo funciona cuando
break;
se trata de imgenes externas.
Para determinar las dimensiones }
de imgenes generadas por PHP # insertamos la cabecera de la nueva imagen
tendrs que utilizar otra distinta. Header("Content-type:image/jpeg");
De nada ;-) #creamos una imagen nueva en color verdadero
$im_base=imagecreatetruecolor($resultado_Ancho,$resultado_Alto);
2.- Creamos una copia de la #aplicamos un color de fondo a la nueva imagen
imagen original por medio de la #para poder visualizar que incluye la transparencia del png o del
funcin imagecreate adecuada al gif
tipo de imagen que deseamos
if($tipo=="png" OR $tipo=="gif"){
importar. Es exactamente lo que
hemos visto en el prrafo anterior.
$fondo=imagecolorAllocate($im_base,255,255,200);
imagefill($im_base,0,0,$fondo);
3.- Creamos una nueva imagen }
-podemos trabajar con varias #superponemos la imagen importada sobre la que acabamos de crear
imgenes, en eso no hay imagecopyresampled($im_base,$importada,0,0,0,0,
problema mediante la funcin: $resultado_Ancho, $resultado_Alto,
$orig_Ancho,$orig_Alto);
$d=imagecreatetruecolor(x,y)
# visualizamos la imagen resultante
dnde $d es el identificador de la imagejpeg($im_base);
imagen, y x e y son las ImageDestroy();
dimensiones de esta nueva imagen. ?>

Dado que esta imagen va a ser el


soporte una imagen en color Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
verdadero (de ah lo de truecolor)
con fondo negro, algo muy similar
al papel fotogrfico que se usa en Observa que tanto en el ejemplo anterior como en el siguiente solo hemos utilizado la
los laboratorios sobre el que se extensin de la imagen original para elegir la funcin imagecreatefrom.... En el Header hemos
va a impresionar esa especie de
puesto image/jpeg y, como es obvio, hemos utilizado la funcin asociada a este formato
negativo que es la imagen original
es necesario que sus dimensiones (imagejpeg). Si sustituimos ambos valores por los correspondientes a otro formato (gif, png)
sean las deseadas para la imagen obtendramos resultados similares.
resultante.

4.-Ahora toca positivar la nueva


foto. Para hacerlo disponemos de Recortar imgenes externas
la funcin

imagecopyresampled() que
debe incluir dentro del
<?
parntesis un montn de
parmetros que son (por este
# obtener la imagen
orden): $original="C:\\Apache\\htdocs\\cursoPHP\\images\\aviones4.jpg";
for($i=strlen($original)-1;$i>0;$i--){
$d que es el identificador de la if (substr($original,$i,1)=="."){
imagen destino, es decir el papel $tipo=substr($original,$i+1);
fotogrfico que hemos creado en el break;
paso anterior. }
$f que es el identificador de la
}
imagen original (negativo) # tamao del original
obtenido en el punto 2. $tamano=getimagesize($original);
$orig_Ancho = $tamano[0];
Xd e Yd son las coordenadas de un $orig_Alto =$tamano[1];
punto situado en la esquina # estableceremos un margen en blanco alrededor de la imagen de 5 pixels
superior izquierda del papel a # igual por los cuatro lados
partir del que queremos que se $margen=10;
impresione la fotografa. Si # establecemos rocortes para reencuadrar la imagen
queremos una foto a sangre $recorte_izq=50;
pondremos 0,0 y, si quieres dejar
$recorte_sup=80;
mrgenes en blanco, habr que
$recorte_der=40;
poner los anchos de esos
mrgenes (izquierdo y superior) $recorte_inf=60;
respectivamente. # calculamos las dimensiones para utilizar como parmetros
# en la funcion imagecopyresampled
Xf e Yf nos servirn para # ancho y alto original recortado
reencuadrar la foto original $Ancho_recortado=$orig_Ancho-$recorte_izq-$recorte_der;
recortando por la izquierda y por $Alto_recortado=$orig_Alto-$recorte_sup-$recorte_inf;
arriba, respectivamente, los # factores de ampliacin en este caso iguales
anchos que se indiquen aqu en # sin distorsin de imagen
pixels. $ampliacion_X=1;
Dx e Dy indican el ancho y el alto $ampliacion_Y=1;
# dimensiones del soporte
(por este orden) que va a tener la
mancha de imagen en el positivo. $papel_Ancho=$Ancho_recortado*$ampliacion_X+ 2*$margen;
Ten en cuenta que no puedes $papel_Alto=$Alto_recortado*$ampliacion_Y+2*$margen;
salirte del papel as que esos # dimensiones de la mancha de imagen al positivar
valores sumados con los mrgenes # hay que quitar los mrgenes
(izquierdo y superior) no podrn $resultado_Ancho=$papel_Ancho -2*$margen;
ser mayores que las dimensiones $resultado_Alto=$papel_Alto -2*$margen;
que has elegido para el papel switch($tipo){
fotogrfico en el punto 2. case "jpg":
$importada=imagecreatefromjpeg($original);
Fx e Fy indican el ancho y el alto
break;
de la porcin del original que
case "png":
tratamos de reproducir. Sumados
con Xf e Yf no pueden exceder el
$importada=imagecreatefrompng($original);
break;
tamao del negativo.
case "gif":
Con estos parmetros la funcin ya $importada=imagecreatefromgif($original);
se encarga de redimensionar la break;
imagen (incluso distorsionarla si }
no hay proporcionalidad entre los
Header("Content-type:image/jpeg");
anchos y altos del original y del
soporte.
$im_base=imagecreatetruecolor($papel_Ancho,$papel_Alto);
$fondo=imagecolorAllocate($im_base,255,255,200);
imagefill($im_base,0,0,$fondo);
imagecopyresampled($im_base,$importada,$margen,$margen,
$recorte_izq,$recorte_sup,
$resultado_Ancho,$resultado_Alto,
$Ancho_recortado,$Alto_recortado);
imagejpeg($im_base);
ImageDestroy();
?>

Ver imgenes original y


resultante

Anterior Indice Siguiente


Superponer, rotar y dar transparencia a imgenes

Colores transparentes
Superposicin de reas transparentes

PHP permite crear colores con <?


determinado color de /* Creamos una imagen en color verdadero, le aplicamos un color
transparencia. Para ello se utiliza de fondo (para evitar el negro por defecto) y creamos un nuevo
la funcin: color que utilizaremos para los bordes de rectangulos posteriores*/
Header("Content-type:image/jpeg");
ImageColorAllocateAlpha() $im_base=imagecreatetruecolor(610,140);
que debe contener dentro del $fondo=imagecolorAllocate($im_base,255,255,200);
parntesis los siguientes $negro=imagecolorAllocate($im_base,0,0,0);
parmetros (separados por
imagefill($im_base,0,0,$fondo);
comas):
# definimos las componentes de un nuevo color
$im que es el identificador de la $R=255; $G=00; $B=00;
imagen que ha sido creada /* vamos a construir una escala de transparencias
previamente. de 0 a 10 que correspondera con valores de transparencia
de 0% al 100%.
R,G,B que son valores numricos Crearemos un bucle que dibuje rectangulos rellenos
(o variables) que contienen -en
con el color definido en la variable trans que ir aplicando
una escala de 0 a 255- los la
intensidad luminosa de cada uno
al color bsico los diferentes grados de transparencia
de los tres colores primarios (rojo, y le pondremos un contorno negro para encuadrarlos*/
verde y azul).
for($i=0;$i<=10;$i++){
trans es un valor numrico $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,(int)($i*127/10));
(comprendido entre 0 y 127) que imagefilledrectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $trans);
indica el grado de transparencia de imagerectangle($im_base, 10+55*$i, 20, 50+55*$i, 80, $negro);
la tinta. El valor 0 indica opacidad }
total, mientras que 127 establece
#creamos un nuevo color y repetimos el proceso con nuevos rectangulos
la transparencia total de ese color.
#superpuestos a los anteriores y con las transparencias en sentido
En el ejemplo que tienes a la opuesto
derecha hemos incluido dos # es decir, de 100 a 0%
escalas de transparencias $R=0; $G=0; $B=255;
superpuestas a intervalos del 10% for($i=0;$i<=10;$i++){
(desde 0 hasta 100%) $trans=ImageColorAllocateAlpha($im_base,$R,$G,$B,127-(int)($i*127/10));
transformados a la escala 0-127. imagefilledrectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $trans);
imagerectangle($im_base, 10+55*$i, 60, 50+55*$i, 120, $negro);
El orden de superposicin similar
a las capas de otros programas }
grficos se corresponde con el # visualizamos el resultado
orden de las instrucciones de imagejpeg($im_base);
creacin. Los resultados de las ImageDestroy();
ltimas funciones se superponen ?>
siempre a los obtenidos como
consecuencia de la ejecucin de
las anteriores. Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif

Transparencia en Transparencia de imgenes externas


imgenes externas
<?
Mediante la utilizacin de la # obtener la imagen
funcin imagecopymerge es $original="c:\\apache\\htdocs\\cursoPHP\\images\\aviones4.jpg";
posible ajustar el grado de
# buscar el formato de la imagen mediante su extensin
transparencia de una imagen
externa.
for($i=strlen($original)-1;$i>0;$i--){
if (substr($original,$i,1)=="."){
La funcin imagecopymerge() $tipo=substr($original,$i+1);
requiere que se incluyan (dentro break;
del parntesis y separados por }
comas y por el orden en el que los }
incluimos) los siguientes # tamao del original extraido del array devuelto por getimagesize
parmetros: $tamano=getimagesize($original);
$destino que es el identificador de $orig_Ancho = $tamano[0];
la imagen sobre la que se va a $orig_Alto =$tamano[1];
colocar la transparencia. Como es # estableceremos un margen en blanco alrededor de la imagen de 10 pixels
lgico, deber haber sido creada # igual por los cuatro lados
antes de incluir la funcin. $borde=10;
$Ancho=$orig_Ancho+2*$borde;
$origen es el identificador de la $Alto=$orig_Alto+2*$borde;
imagen que pretendemos incluir
# creamos la imagen segun el formato original
con un determinado grado de
switch($tipo){
transparencia.
case "jpg":
Xd e Yd son las coordenadas de un $importada=imagecreatefromjpeg($original);
punto situado en la esquina break;
superior izquierda de la imagen case "png":
destino a partir del que queremos $importada=imagecreatefrompng($original);
que se impresione la nueva break;
imagen. Si queremos una imagen case "gif":
a sangre pondremos 0,0 y, si $importada=imagecreatefromgif($original);
quieres dejar mrgenes, habr break;
que poner los anchos de esos }
mrgenes (izquierdo y superior)
Header("Content-type:image/jpeg");
respectivamente.
# creamos una imagen nueva, un color de fondo y la rellenamos con l
Xf e Yf nos servirn para $im_base=imagecreatetruecolor($Ancho,$Alto);
reencuadrar la foto original $fondo=imagecolorAllocate($im_base,255,255,200);
recortando por la izquiera y por imagefill($im_base,0,0,$fondo);
arriba, respectivamente, los # superponemos la imagen importada posicionandola y aplicandole
anchos que se indiquen aqu en # una trasmparencia de 50
pixels. imagecopymerge( $im_base, $importada, $borde, $borde ,
0, 0, $orig_Ancho, $orig_Alto ,50 );
Dx e Dy indican el ancho y el alto
(por este orden) que va a tener la imagejpeg($im_base);
mancha de imagen en el positivo. ImageDestroy();
Ten en cuenta que no puedes
?>
salirte del papel as que esos
valores sumados con los mrgenes
(izquierdo y superior) no podrn Ver ejemplo .jpg Ver ejemplo .png Ver ejemplo .gif
ser mayores que las dimensiones
que has elegido para la imagen
destino
Si observas los resultados obtenidos en el ejemplo en el que intentamos dar transparencia
opacidad es el ltimo de los a una imagen en formato png podrs observar que deja bastante que desear y produce
parmetros de la funcin al que un efecto indeseado por el recorte de las zonas presuntamente transparentes.
puede asignrsele un valor
comprendido entre 0 y 100. Esta situacin nos obliga a replantear la situacin para prever esta circunstancia y recurrir
a un truco que parece solventar ese problema. La modificacin del cdigo fuente es la
Representa el porcentaje de incluimos aqu debajo.
opacidad de la imagen
superpuesta. Con un valor 100
sera totalmente opaca y con 0 la Header("Content-type:image/jpeg");
transparencia sera total. $im_base=imagecreatetruecolor($Ancho,$Alto);
$fondo=imagecolorAllocate($im_base,255,255,200);
La funcin imagecopy imagefill($im_base,0,0,$fondo);
/* el truco consiste en crear una segunda imagen (im_truco)cuyas
dimensiones coincidan con las de la imagen transparente
Mediante esta funcin se puede que pretendemos colocar. Le asignamos como color el fondo el mismo
copiar sobre una imagen una parte
de la imagen destino y hacemos transparente ese color en esa imagen.
de otra. Permite extraer porciones
Despus hacemos una copia de la imagen original sobre la imagen
de imgenes con su tamao
original sin que permita ampliarlas im_truco y sustituimos en la funcin imagecopymerge la
ni reducirlas. Su sintaxis es la imagen original por la obtenida mediante esta chapucilla */
siguiente: $im_truco=imagecreatetruecolor($orig_Ancho, $orig_Alto);
$fondo1=imagecolorAllocate($im_truco,255,0,200);
imagecopy($d,$o,$x,$y,$X,$Y,$A, imagefill($im_truco,0,0,$fondo1);
$H) donde: imagecolortransparent ($im_truco,$fondo1);
imagecopy($im_truco, $importada, 0, 0, 0, 0, $orig_Ancho, $orig_Alto);
$d el identificador de la imagen
destino, $o el identificador de la
imagecopymerge( $im_base , $im_truco, $borde , $borde ,
imagen original, $x y $y las 0 , 0 ,$orig_Ancho, $orig_Alto ,60 );
coordenadas donde se posicionar imagejpeg($im_base);
en la imagen destino la esquina ImageDestroy();
superior izquierda de la porcin
copiada.
$X y $Y son los anchos de los Ver el nuevo resultado
recortes izquierdo y superior de la
imagen a copiar y $A y $H el
ancho y el alto del rea de imagen La funcin imagecolortransparent ($imagen,$color) permite hacer transparente en la
que pretendemos copiar. imagen indicada mediante la variable $imagen el color sealado en la variable $color.

Rotacin de imgenes La variable $color deber estar definida previamente mediante la funcin
imagecolorAllocate u alguna otra que permita identificar un color determinado.

Mediante la funcion:
imagerotate($im,ang,$fondo) es
posible presentar imgenes Rotacin de imgenes
rotadas.

El parmetro $im es el
identificador de la imagen a rotar,
ang es el ngulo de rotacin <?
(expresado en grados y tomado # obtener la imagen
en sentido trigonomtrico) y $original="c:\\apache\\htdocs\\cursoPHP\\images\\aviones3.jpg";
$fondo es un color de fondo for($i=strlen($original)-1;$i>0;$i--){
asociado a la imagen a rotar que if (substr($original,$i,1)=="."){
puede ser definido mediante la $tipo=substr($original,$i+1);
funcin imagecolorallocate u otra break;
funcin que permita asociar
}
colores a imgenes.
}
switch($tipo){
Transparencia en la case "jpg":
rotacin de imgenes $importada=imagecreatefromjpeg($original);
break;
Hemos intentado explorar la case "png":
posibilidad de lograr imgenes $importada=imagecreatefrompng($original);
rotadas con fondo transparente. Y break;
la cosa resulta, cuando menos case "gif":
complicada. Cuando se trata de $importada=imagecreatefromgif($original);
insertarlas sobre un fondo plano la break;
situacin puede emularse }
fcilmente sin ms que asignar Header("Content-type:image/jpeg");
como color de fondo de la rotacin
$fondo=imagecolorallocatealpha($importada,255,255,0,40);
uno idntico al del fondo plano
sobre el que ha de situarse la
$im_base=imagerotate($importada,30,$fondo);
imagen. imagejpeg($im_base);
ImageDestroy();
Otra de las alternativas probadas ?>
fu tratar de usar
imagecolortransparent en el color
de fondo de rotacin de la imagen. Ver ejemplo
Es evidente que ese grado de
transparencia solo lo lograramos
con un formato png jpg. Pero... Diferencias entre imagecreate e imagecreatetruecolor
no funciona.

La alternativa siguiente fu tratar Este es el cdigo fuente de un script que lee una imagen externa y la copia ntegra sobre
de crear una imagen con fondo otra imagen creada mediante PHP. Si visualizas el ejemplo podrs observar las diferencias
transparente e insertar en ella la entre usar la funcin imagecreate o utilizar imagecreatetruecolor.
imagen rotada asignndole
transparencia a la capa que
<?
contiene la imagen rotada. Ah nos $original="c:\\apache\\htdocs\cursoPHP\\images\\aviones3.jpg";
encontramos con algunas
dificultades.
for($i=strlen($original)-1;$i>0;$i--){
La primera de ellas es que fondo if (substr($original,$i,1)=="."){
transparente slo lo permiten las $tipo=substr($original,$i+1);
imgenes que son creadas break;
mediante la funcin imagecreate. }
Si se crean mediante la funcin }
imagecreatetruecolor esa opcin switch($tipo){
no funciona. case "jpg":
Otra diferencia entre ambas $importada=imagecreatefromjpeg($original);
funciones tiene tambin relacin break;
con los colores de fondo. Mientras case "png":
que en el caso de imagecreate se $importada=imagecreatefrompng($original);
asigna como color de fondo el que break;
se haya definido inmediatamente case "gif":
despus de crear la imagen, $importada=imagecreatefromgif($original);
cuando se trata de break;
imagecreatetruecolor se }
asignar siempre un fondo negro y $dimensiones=getimagesize($original);
para cambiar ese color ser
$Ancho_original=$dimensiones[0];
necesario recurrir a la funcin
imagefill. $Alto_original=$dimensiones[1];
Header("Content-type:image/png");
Pero la felicidad completa parece $im_base=imagecreate($Ancho_original+20,$Alto_original+20);
que no existe. Al intentar explorar $fondo=imagecolorallocate($im_base,255,0,0);
la primera de estas opciones imagecolortransparent($im_base,$fondo);
hemos podido observar que el imagecopy($im_base,$importada,10,10,0,0,$Ancho_original,$Alto_original);
precio a pagar por la dichosa imagepng($im_base);
transparencia es obtener una ImageDestroy();
imagen final de no demasiado
?>
buena calidad.

Mejor lo compruebas tu mism@ en


Ver ejemplo
el ejemplo que tienes a la derecha.
Ejemplo resumen
Transparencia en capas
rotadas Aqu tienes un ejemplo en el que hemos utilizado superposiciones de imgenes, con giros,
recortes y diferentes grados de transparencia.
Cuando trabajamos con una
Ver ejemplo resumen Ver codigo fuente
imagen truecolor en la que
vamos incluyendo en diferentes
capas (mediante copy
copymerge) otras imgenes Ejercicio n 34
recortadas, rotadas, creadas a
partir de otra imagen, etc. la Disea un script que genere una imagen dinmica a partir de una fotografa. El script debe
transparencia de los colores de los encuadrarla (recortndola por los cuatro bordes) y colocar en la parte inferior derecha un
fondos de rotacin no plantea
texto que diga: Todos los derechos reservados.
ningn problema.
Es suficiente usar la funcin
imagecolortransparent, eso s,
aplicndola a la imagen
correspondiente antes de Anterior Indice Siguiente
insertarla mediante la opcin copy
en la imagen final.
Gestin de directorios

Funciones con directorios


El pseudo-objeto $b=dir("path")
Este es un ejemplo de utilizacin de los mtodos de ste pseudo-objeto. Observa que
PHP dispone de funciones que tanto el mtodo handle como el mtodo path se invocan sin utilizar () mientras que
permiten obtener informacin tando read() como rewind() como close() s utilizan esos parntesis al invocar sus
sobre los contenidos de los mtodos.
directorios del servidor.

Algunas de estas funciones son las <?


siguientes: $directorio = dir("./images");
# en el caso de los objetos la manera de invocar
Pseudo-objeto dir
# uno de sus mtodos y/o funciones requiere una sintaxis
Mediante la expresin: # especifica con la que vera a lo largo de este ejemplo:
# es $objeto->metodo que equivale a la tradicional llamada
$b= dir (path) # a una variable en la forma $variable.
echo "Handle: ".$directorio->handle."<br>\n";
en la que path es la ruta absoluta:
echo "Path: ".$directorio->path."<br>\n";
(../dir/subdir/subsubdir)
while($fichero=$directorio->read()) {
o relativa
(./subdir) echo $fichero."<br>\n";
hasta el directorio del que vamos a }
obtener informacin, recogemos $directorio->rewind();
en la variable $b informacin echo "nuevo listado del directorio despues de rebobinar<br>" ;
sobre el directorio en cuestin de while($fichero=$directorio->read()) {
una forma un tanto peculiar. echo $fichero."<br>";
}
$b se comporta como objeto y,
$directorio->close();
como tal objeto, posee los
?>
mtodos y funciones que
indicamos:

handle
ejemplo106.php

Devuelve una cadena con la Otras funciones de directorios


descripcin del identificador del
recurso.
Existen otras funciones -indicadas al margen- que permiten obtener la misma
path informacin que la que obtuvimos en el ejemplo anterior.

Devuelve la ruta del directorio Antes de efectuar la lectura de un directorio es necesario abrirlo con la funcin
especificado. opendir, y una vez finalizada, es aconsejable cerrarlo utilizando la funcin closedir.

read()
<?
Realiza una lectura secuencial de
los nombres y extensiones de los #abrimos el identificador de directorio
ficheros contenidos en el directorio
especificado. $f = opendir("./images");
rewind()
#leemos el primer fichero que ser "." (recuerda la estructura
Posiciona el puntero en la posicin # de los directorios de MS-DOS)
inicial.
$fichero=readdir($f);
close()
echo $fichero,"<br>";
Cierra el identificador de directorio.

#leemos el fichero siguiente que ser ".." (recuerda la estructura


Otras funciones # de los directorios de MS-DOS)

$f= opendir (path) $fichero=readdir($f);

Recoge en la cadena $f un echo $fichero,"<br>";


identificador que permitir utilizar
las restantes funciones.
#leemos el fichero siguiente (el primer fichero "real")
$z= readdir ($f1)
$fichero=readdir($f);
Hace una lectura secuencial del
directorio indicado por el echo $fichero,"<br>";
identificador $f1.
#rebobinamos, enviando el puntero al primer fichero
A medida que efecta la lectura
secuencial el puntero de lectura va
desplazndose al fichero que sigue rewinddir($f);
al ltimo ledo.
echo "Lista de TODOS los ficheros usando un bucle while<br>";
rewinddir($f1)
#leemos todos los ficheros
Rebobina haciendo que el puntero
apunte al primer fichero del
directorio.
while($fichero=readdir($f)) {
echo $fichero."<br>";
closedir($f1) }
closedir($f);
Cierra el identificador del directorio. ?>

ejemplo107.php

Anterior Indice Siguiente


Proteccin de directorios

Proteccin de directorios
Configuracin del servidor Apache

Una vez que tengamos modificada Para poder proteger de directorios mediante un fichero llamado .htaccess es
la configuracin del servidor necesario realizar algunas modificaciones en la configuracin de Apache.
Apache estaremos en condiciones
de poder proteger directorios Abriremos nuestro fichero httpd.conf y buscaremos este prrafo (lneas 312 a 315):
restringir o limitar el acceso a
ellos y tambin podremos <Directory />
redirigir peticiones a pginas Options FollowSymLinks
predeterminadas en casos AllowOverride None
concretos.
</Directory>
Este control ha de realizarse
mediante ficheros que tienen por donde dice None pondremos All. Luego buscaremos este otro prrafo (lneas 341 a 350)
nombre .htaccess (el primer
y haremos el mismo cambio (marcado en rojo) de None por All.
caracter es el punto) y que no
pueden llevar ningn tipo de
extensin. # "AuthConfig", and "Limit"
#
Loa ficheros .htaccess pueden ser AllowOverride None
incluidos en cualquier directorio o
subdirectorio del espacio del
#
servidor.
# Controls who can get stuff from this server.
#
El fichero .htaccess Order allow,deny
Allow from all
Las misiones ms importantes que </Directory>
puede realizar este fichero son:
redireccionar y restringir accesos.
guardaremos los cambios en httpd.conf y reiniciaremos nuestro servidor Apache.
Veamos cada una de ellas por
separado.
Comprobacin de la configuracin
Errores y
redireccionamiento Empezaremos escribiendo en la barra de direcciones de nuestro navegador (tambin
Los mensajes de error ms
puedes hacerlo desde este enlace) esta direccin:
frecuentes al intentar acceder a http://localhost/cursoPHP/noexisto.html y nos aparecer un mensaje de error diciendo
pginas web y sus causas son que no existe ninguna pgina con ese nombre. Algo lgico, porque realmente no existe.
los siguientes:
Ejercicio n 35
Error 401
El subdirectorio est protegido por
nmero IP o por password y el
Abre tu editor no utilices el block de notas porque te dar muchsimos problemas en este
intento de acceder a l no ha caso y escribe la siguiente lnea:
tenido xito. ErrorDocument 404 http://localhost/cursoPHP/index.php
Error 403 y guarda el documento en el directorio cursoPHP con el nombre (aunque te parezca
El acceso al documento solicitado extrao, no lleva nada delante del punto) .htaccess
est prohibido. Pulsa de nuevo en el enlace que tienes aqu arriba o escribe la direccin en el navegador
Error 404
y observars que ahora no dice pgina no encontrada sino que se abre la pgina principal
El documento solicitado no ha sido
hallado.
del Curso.
Error 500 Edita de nuevo el fichero .htaccess y adele las siguientes lneas:
Error del servidor. Usualmente ErrorDocument 401 http://localhost/cursoPHP/index.php
este error se da cuando se ha ErrorDocument 403 http://localhost/cursoPHP/index.php
intentado ejecutar de forma guardndolo despus de haber hecho los cambios.
incorrecta un CGI, o bien debido a
problemas en el servidor.

Los errores de los tipos 403 y 404


Crear el fichero de claves y contraseas
suelen producirse en la mayora de
las ocasiones por direcciones
Las restricciones de usuarios mediante .htaccess requieren un fichero de claves y
incorrectas y aparte de causar un contraseas.
psimo efecto suelen provocar el
abandono de la visita. Para crearlo basta con abrir el block de notas y escribir la clave seguida de dos
puntos (:) y a continuacin escribir la contrasea.
Un fichero .htaccess con este Podemos poner tantas como deseemos sin ms limitaciones que escribir cada bloque
contenido: clave:contrasea en una lnea distinta. Este puede ser un ejemplo:
ErrorDocument 401 pagX
ErrorDocument 403 pagY pepe:Pepito
ErrorDocument 404 pagZ pepa:Pepita

donde pagX, pagY y pagZ sean


direcciones (completas) de las Podemos guardar este fichero en el sitio que deseemos sin que sea necesario que
pginas a las que deseamos pertenezca al root del servidor.
redireccionar el navegador,
conseguira que esos errores El directorio seguridad que hemos creado cuando tratbamos de INCLUDE puede ser
llevaran al visitante a la pgina un buen sitio. Podemos ponerle cualquier nombre sin que importe que tenga extensin o
que nosotros deseramos. no la tenga.

Herencias

El archivo .htaccess provoca Crear un fichero de contraseas encriptadas


herencia. Eso significa que las
especificaciones incluidas en un
directorio sean restricciones o Apache posee una utilidad que permite la creacin de ficheros de claves con
redirecciones son efectivas en contraseas encriptadas. Se trata de un programa llamado htpasswd.exe que est en el
todos los subdirectorios que subdirectorio bin del servidor.
contiene, incluso en el caso de que
esos subdirectorios tengan su Para crear un nuevo fichero el procedimiento sera el siguiente:
propio .htaccess y que en l se
establezcan condiciones distintas a En la lnea de comandos: Inicio->Ejecutar
las anteriores.
Al crear el fichero del ejercicio n
22 y guardarlo en cursoPHP las
condiciones establecidas afectarn
a todos sus subdirectorios (puedes
probar a abrir una pgina con un
nombre cualquiera en el
subdirectorio images). Por eso, si
pretendemos que desde
subdirectorios distintos se
redireccione a pginas distintas
tendremos que incluir un .htaccess
en cada uno de ellos y omitirlo en
el directorio que los contenga.
debemos escribir:
Proteccin de directorios path htpasswd -c nombre y path del fichero de claves usuario

Son muchas las posibilidades que En nuestra configuracin y para crear un fichero con la palabra clave pepe
ofrece .htaccess a la hora de escribiramos:
restringir el acceso a un directorio c:\apache\bin\htpasswd -c c:/Apache/seguridad/misclaves.txt pepe
determinado.
y aparecera una ventana de MS-DOS en la que deberemos escribir la password para
Entre otras opciones, se puede ese usuario.
denegar el acceso a todos los
usuarios; denegar el acceso con
excepciones, autorizar a todos
(equivale a no restringir), autorizar
con excepciones o requerir clave y
contrasea.

Lo que hemos denominado


excepciones tambin permite una
serie de alternativas tales como:
una IP determinada, un rango de
IP's, nombres de dominio, etctera.

Slo comentaremos la forma de


proteccin de directorios mediante
claves de usuario y contrasea.

Restriccin de acceso a
usuarios no autorizados

Este tipo de proteccin requiere


crear un fichero de claves y
contraseas y configurar de forma
adecuada .htaccess

Lo relativo a la creacin de los


primeros lo tenemos detallado aqu Aadir usuarios a un fichero de contraseas encriptadas
a la derecha en sus dos opciones:
encriptadas o sin encriptar. Porcederamos de la misma forma. Volveramos a ejecutar htpasswd con la nueva
clave pero sin utilizar -c.
Para el caso especfico de nuestro
servidor Apache, el fichero . Cuidado!
htaccess ha de contener:
El modificador -c destruira el fichero anterior, si existiera y creara uno nuevo.
AuthType Basic

No permite modificacin e indica el El proceso ahora sera:


tipo de autentificacin requerida.

AuthName "nuestro texto "

El texto que escribamos aqu


aparecer como mensaje en la
ventana en la que nos pedir la
clave

AuthUserFile "path"

Entre esas comillas debes escribir


el nombre del fichero de
contraseas especificando su path
completo.
c:\apache\bin\htpasswd c:/Apache/seguridad/misclaves.txt luis
require valid-user
Habramos creado as nuestro fichero con claves encriptadas. Si pretendiramos
Este texto indica que para acceder visualizarlo nos aparecera lo siguiente:
se requiere un usuario vlido.

Con nuestra configuracin de pepe:$apr1$EC4.....$7Z3.p2tv2QpzrZbo4bI2j0


Apache no es necesario especificar luis:$apr1$SU4.....$iU8a.YTo.ZvYyRggDAvTC.
en .htaccess la forma de
encriptacin de contraseas. El
propio servidor interpreta el
contenido del fichero y aplica u Un ejemplo de .htaccess
omite los criterios de encriptacin.
Supongamos que tenemos un directorio llamado protegido en cualquier parte del
A riesgo de parecerte pesados servidor (por ejemplo dentro de htdocs) la forma de protegerlo sera crear un fichero con
tenemos que volver a insistir que
nombre .htaccess con un contenido como este:
no todos los hosting tienen
habilitada esta opcin, pero
adems hemos de hacer mencin AuthType Basic
a otro detalle muy importante. AuthName "Pruebas de autentificacin"
AuthUserFile "c:/Apache/seguridad/misclaves.txt"
La configuracin que hemos
require valid-user
comentado no es vlida para
todos los servidores.
y guardarlo en ese directorio.
Segn como est configurado el
servidor, la versin del software Al acceder al directorio protegido aparecer una ventana como esta:
que utilice, etctera no sera
extrao que se necesitara esta
otra sintaxis:

AuthType Basic
AuthName "Texto"
AuthTextUserFile fichero
required valid-user
AuthTextCrypt On/Off

u otras similares que pueden


inducirnos al error. Lo mejor, en
caso de servidores ajenos, es
consultar al administrador del
sistema sobre estos aspectos y
recabarle detalles sobre la sintaxis
especfica de su configuracin.

y si al cabo de tres intentos no escribimos la clave y contrasea adecuadas se producir


un Error 401.

Anterior Indice Siguiente


Las Cookies

Las cookies
Una cookie muy simple
Aqu tienes un ejemplo, el ms simple, del uso de esta funcin.
De igual modo que ocurra con la
funcin mail, no todos los hosting Si ejecutas el ejemplo por primera vez observars que solo aparecer el texto Esto es
tienen habilitada la opcin de la galletita: sin ningn valor. Sin embargo, si actualizas el navegador o ejecutas ms
envo de cookies. tarde el ejemplo siguiente aparecer Mi regalito como valor de la variable.
Como sabes, las cookies son La explicacin es la siguiente: las instrucciones PHP se ejecutan en el servidor antes de
pequeos ficheros que se escriben
enviar la pgina al cliente. Eso significa que, al ejecutar por primera vez, se inserta la
en el ordenador del cliente.
orden de escritura y se comprueba el valor de la variable, que aun no ha sido creada y
Si utilizas Internet Explorer podrs por ello aparece en blanco. Ser en la actualizacin ya se habra producido un envo al
ver que se almacenan como navegador y ya se habra escrito la cookie cuando si se leer el valor anterior.
ficheros de texto en un directorio
llamado Archivos temporales de Siempre que tratemos de visualizar el valor de una cookie estaremos viendo el valor
Internet y que su nombre es de asignado en la peticin anterior
este tipo:

xxx@nombre[z].txt <?
# setcookie escribe el contenido de la cookie
donde xxx suele ser el nombre # en el ordenador del cliente
que figura en el registro de setcookie("cookie1","Mi regalito",time()+3600);
Windows como nombre del equipo # escribe el valor leido en la cookie
(el que se pone al instalar echo "Esta es la galletita:",$_COOKIE['cookie1'];
Windows); nombre suele ser el
?>
nombre del directorio de servidor
desde el que se envi la cookie y
el nmero z suele ser el ordinal del
nmeros de accesos a la pgina ejemplo108.php
que enva la cookie.
Si hemos ejecutado el ejemplo anterior este script ya podr leer el contenido de la
Netscape trata las cookies de cookie escrita a travs de aquel.
distinta forma ya que las almacena
en un nico fichero llamado
<?
cookies.txt que est en el
subdirectorio del usuario que se echo "Esta es la galletita:",$_COOKIE['cookie1'];
crea en la instalacin del programa ?>
y que est dentro de otro llamado
users.
ejemplo109.php
Cmo enviar cookies?
Una cookie con valores asignados mediante una variable
La instruccin para el envo de
cookies debe insertarse al principio
de la pgina y antes de cualquier <?
etiqueta HTML o lnea en blanco. $z="Mi regalito";
Esto es muy importante, no lo setcookie("cookie2",$z,time()+3600);
olvides echo "Esta es la galletita:",$_COOKIE['cookie2'];
?>
La sintaxis es la siguiente:

setcookie(nom, val, exp)


ejemplo110.php
donde:

nom es una cadena que contiene Este segundo ejemplo ya visualizara el valor de esta cookie siempre que hubiramos
el nombre de la variable que ejecutado previamente el script anterior.
recoge el valor de la cookie.

val es el valor que se asignar a la <?


variable anterior. Puede ser tanto echo "Esta es la galletita:",$_COOKIE['cookie2'];
numrico como de tipo cadena. ?>

exp indica cul ha de ser la fecha


de caducidad de la cookie.
ejemplo111.php
Suele escribirse: time() (hora
actual) ms un nmero que
representa los segundos que han Una cookie definida como array
de transcurrir hasta que la cookie
expire. <?
Los valores contenidos en las $valores=Array("Verde","Verano","Rolls-Royce","Millonario");
cookies pueden ser ledos por el # a diferencia de lo que ocurre al definir elementos de array asociativos
servidor a partir de variables # en este caso los indices asociativos (color, estacin, etc.) no van
predefinidas o recogidas a travs # entre comillas
de un formulario. setcookie("cookie3[color]",$valores[0],time()+3600);
setcookie("cookie3[estacion]",$valores[1],time()+3600);
Tal como puedes ver en el ejemplo setcookie("cookie3[coche]",$valores[2],time()+3600);
ejemplo112.php, es posible crear setcookie("cookie3[finanzas]",$valores[3],time()+3600);
cookies en las que la variable
# la variable superglobal $_COOKIE['cookie3'] contiene un array, por ello
contiene un array de tipo escalar o
de tipo asociativo. # la lectura de sus valores debe hacers considerando que se trata de un
# array bidimensional
Como puedes ver en el ejemplo, es if (isset($_COOKIE['cookie3']) ) {
necesario incluir un setcookie por while( list( $indice, $valor) = each($_COOKIE['cookie3']) ) {
cada uno de los valores del array echo "$indice == $valor\n";
aunque a la hora de devolver esa }
variable el navegador del cliente }
enva el array completo. ?>

Cmo leer cookies?


Al invocar la variable mediante la
que fue escrita la cookie desde
ejemplo112.php
cualquier pgina que est alojada
en el subdirectorio del servidor Como en los casos anteriores tambin este script permite leer los contenidos de la
desde el que fu creada tomar - cookie despus de haber accedido a la pgina anterior.
de forma automtica- el valor
contenido en la cookie.
<?
Esto slo sera posible en el caso if (isset( $_COOKIE['cookie3']) ) {
de que la cookie hubiera sido while( list( $indice, $valor) = each($_COOKIE['cookie3']) ) {
creada con anterioridad y que no echo "$indice == $valor\n";
hubiera expirado. }
}
Tal como comentbamos a
?>
estudiar los formularios, las
cookies pueden leerse
directamente (imprimir la variable
PHP con nombre idntico a la ejemplo113.php
cookie, slo en el caso de que la
opcin register_globals=on.
Un contador como aplicacin prctica
Si no fuera as (de forma similar al
caso de los formularios) para
poder leer su contenido <?
tendramos que recurrir al uso de $numero=$_COOKIE['visitante'];
la variable superglobal $_COOKIE $numero+=1;
(caso de que la versin de PHP las setcookie("visitante",$numero,time()+86400);
soporte) o, alternativamente, de
$HTTP_COOKIE_VARS teniendo if($numero==1){print "Es la $numero vez que visitas esta pgina";}
en cuenta que esta ltima no tiene if($numero>1){print "Es la $numero vez que visitas esta pgina";}
carcter superglobal. ?>
Puedes comprobar que en los
ejemplos se visualizan los
contenidos de las cookies usando
la instruccin echo (o print) y ejemplo114.php
utilizando el array superglobal
$_COOKIE para garantizar el
funcionamiento con cualquier Anterior Indice Siguiente
configuracin de register globals.
Sesiones (I)

Qu son las sesiones?


Requisitos de configuracin
Antes de poder utilizar este tipo de funciones es preciso modificar el fichero de
Suponemos que habrs estado configuracin de php. Editemos el fichero php.ini y busquemos esta lnea:
alguna vez en un hotel y que session.save_path = /tmp
recuerdas que al inscribirnos como vamos a modificarla. La dejaremos as:
huspedes nos facilitan una
session.save_path="C:\Apache\htdocs\temp"
tarjetita identificativa que
tericamente habramos de
Al modificar esta configuracin hemos asignado una ruta y un directorio (temp) en el
presentar a la hora de solicitar
que se guardarn los ficheros temporales creados durante las sesiones, pero... ese
cualquier servicio del hotel
(cafetera, restaurante, etc.). directorio an no existe.

Al registrarnos en ese hotel Antes de reiniciar el servidor Apache despus de efectuar los cambios anteriores
estaremos iniciando una sesin tendremos que crear un directorio con nombre temp dentro de htdocs y a partir de
(nuestro perodo de estancia) y al ese momento ya estaremos en condiciones de reiniciar Apache con PHP habilitado para el
recibir la tarjeta identificativa se uso de sesiones.
nos estar facilitando un
identificador de sesin, que
tiene validez temporal, ya que Iniciando y propagando sesiones
expirar en la fecha de salida
indicada en ella.
Aqu tenemos un ejemplo de como iniciar una sesin y tambin podremos comprobar
Imaginemos ahora que vamos al como se propaga al llamar a la misma pgina si est activada la opcin aceptar
restaurante. cookies.

Pueden ocurrir dos cosas: que Si ejecutamos reiteradamente el script pulsando en volver a llamar esta pgina
decidamos efectuar el pago podremos ver que no se modifica el valor del identificador de sesin.
directamente, o que pidamos que
el importe de la factura se incluya Si bloqueamos las cookies (en este enlace est descrito el procedimiento para
en nuestra cuenta. En el segundo hacerlo) podremos comprobar que ahora la sesin no se propaga y que cada vez que
de los casos, se reiniciar la
sesin y se registrar una nueva
volvemos a llamar a la pgina nos aparece un nuevo valor en el identificador de
variable de sesin el importe sesin, es decir, se crea una nueva sesin.
del servicio al firmar la nota de
cargo del mismo. <?
session_start();
El responsable del restaurante
#pedimos que escriba el identificador nico y el nombre de la sesin
guardar esa nota de cargo una
variable de sesin de forma echo session_id(),"<br>";
temporal ya que una vez abonado echo session_name(),"<br>";
su importe, en el momento que ?>
abandonemos el hotel, expirar la <A Href="ejemplo116.php">Volver a llamar estallamar esta pgina</A>
sesin y dejar de tener validez.

Se requiere por tanto un Ejemplo 116.php


directorio temporal en el que
almacenar las variables de En este otro ejemplo solo hemos hecho el aadido (sealado en magenta) para el caso
sesin.
de que PHP no est compilado para --enable-trans-sid (una opcin bastante habitual en
En PHP la sesiones funcionan de los hosting que trabajan bajos sistemas operativos UNIX LINUX).
forma muy similar y de esa
similitud surge la necesidad de Si lo ejecutamos podremos comprobar que ocurre exactamente lo mismo que en el
habilitar un directorio temporal ejemplo anterior, tanto con cookies activadas como desactivadas.
antes de utilizar sesiones. Lo
hacemos cuando modificamos la <?
configuracin tal como
session_start();
comentamos en la columna de la
#pedimos que escriba el identificador nico y el nombre de la sesin
derecha.
echo session_id(),"<br>";
echo session_name(),"<br>";
Funciones de sesin ?>
<A Href="ejemplo117.php?<?=$SID ?>">Volver a llamar esta pgina</A>
Para la gestin de sesiones se
utilizan estas funciones:
Ejemplo 117.php
session_start()
Ahora haremos una modificacin importante en el script. Al incluir en la llamada
Crea una sesin o contina con la
a la pgina el nombre y el identificador de sesin estamos transfiriendo mediante
actual. En el segundo caso el
identificador de sesin debe ser el mtodo GET el valor de esa variable. De esta forma, la propagacin de la sesin
tranferido por medio de una estar asegurada sea cual fuere la configuracin del navegador del cliente.
variable GET o a travs de una
cookie. Podemos comprobar activando/desactivando cookies que en las sucesivas llamadas
a la pgina se mantiene el identificador de sesin.
session_name()

Recoge el nombre de la sesin. <?


session_start();
Si no se asigna uno de forma #pedimos que escriba el identificador nico y el nombre de la sesin
explcita, utiliza como nombre de echo session_id(),"<br>";
sesin el contenido de la directiva echo session_name(),"<br>";
session.name del fichero php.ini. ?>
<A Href="ejemplo118.php?<?echo session_name()."=".session_id()?>">
Por defecto ese nombre suele ser
PHPSESSID, pero no est de ms Volver a llamar esta pgina</A>
comprobarlo mirando el valor
actual de la directiva session.
Ejemplo 118.php
name en info.php.

session_name('nombre') Sesiones con nombre propio


Esta funcin permite asignar un
En los ejemplos siguientes se crean y propagan sesiones con nombre propio sin que
nuevo nombre a la sesin actual.
ello altere las condiciones de respuesta con las opciones aceptar /no aceptar cookies.
Debemos tener en cuenta que si Tambin hemos incluido session_cache_limiter con las restricciones de nocache con lo
cambiamos de pgina y cual el navegador no guardar las pginas de ejemplo en la cach.
queremos mantener el mismo
identificador (conservar la sesin Si cambiramos los parmetros (nocache, private por public) podramos comprobar se
anterior) esta funcin debe ser almacena en la cach del navegador la pgina web devuelta por el servidor.
escrita, con el mismo nombre, en
la nueva pgina, y adems, ha de
ser insertada antes de llamar a la <?
funcin session_start() para que session_cache_limiter('nocache,private');
se inicie la sesin. session_name('leocadia');
session_start();
session_cache_limiter()
#pedimos que escriba el identificador nico
El limitador de cach controla las echo session_id(),"<br>";
cabeceras HTTP enviadas al cliente. echo session_name(),"<br>";
?>
Estas cabeceras determinan las <A Href="ejemplo119.php">Volver a llamar esta pgina</A>
reglas mediante las que se habilita
la opcin de que los contenidos de
las pginas puedan ser guardados Ejemplo 119.php
en la cach local del cliente o se
impida tal almacenamiento.
<?
En este ltimo modo no cach
cada peticin de pgina requerira session_cache_limiter('nocache,private');
una nueva llamada al servidor, lo session_name('leocadia');
cual tiene como todo en la vida session_start();
ventajas e inconvenientes #pedimos que escriba el identificador nico
echo session_id(),"<br>";
Entre las ventajas est la garanta echo session_name(),"<br>";
de que en cada acceso estamos ?>
viendo la versin actualizada de la
<A Href="ejemplo120.php?<?=$SID ?>">Volver a llamar esta pgina</A>
pgina, cosa que podra no ocurrir
de otro modo. El inconveniente es
que requiere una nueva peticin Ejemplo 120.php
que puede significar un tiempo de
espera, mientras el servidor
produce la respuesta.
<?
Esta opcin viene configurada por session_cache_limiter('nocache,private');
defecto en las directivas de session_name('leocadia');
configuracin del php.ini como session_start();
nocache. #pedimos que escriba el identificador nico
echo session_id(),"<br>";
Para evitar sea cual fuera la
echo session_name(),"<br>";
configuracin de php.ini el
almacenamiento de las pginas en ?>
la cach del cliente hemos de <A Href="ejemplo121.php?<?echo session_name()."=".session_id()?>">
utilizar: Volver a llamar esta pgina</A>

session_cache_limiter
('nocache,private'). Ejemplo 121.php

De igual forma que ocurra con


session_name, si utilizamos est Las cookies de sesin y sus parmetros
funcin debemos escribirla antes
que session_name y tambin Para el caso de que el navegador del cliente tenga activada la opcin de aceptar
igual que en aquel caso cookies PHP dispone de una funcin que permite leer los parmetros de esa cookie. Para
deberemos repetirla en cada uno ello dispone de la funcin session_get_cookie_params() que devuelve un array
de los documentos. asociativo con los siguientes ndices:
Advertencia! lifetime: Indica el tiempo de duracin de la duracin de la cookie
path: Indica la ruta -en el ordenador del cliente- en la que se almacenan los datos de la
El orden de escritura de estas
sesin
instrucciones sera el siguiente:
domain :Indica el dominio de procedencia de la cookie
<? secure :Indica si la cookie solo puede ser enviada a travs de conexiones seguras (1) o
session_cache_limiter(); si no considera esa posibilidad (0).
session_name('nombre'); Los valores por defecto para estos parmetros se pueden establecer en la configuracin
session_start(); del fichero php.ini. Si visualizamos info.php podremos ver en las directivas session.
..... cookie_xxx nuestros valor por defecto y observaremos que session.cookie_lifetime
?>
tiene valor 0, razn por la cual si con la opcin aceptar cookies activada ejecutamos
Es muy importante mantener ese cualquiera de los script anteriores y miramos el directorio Temporal Internet Files, no
orden y que este bloque de encontraremos ninguna de estas cookies, dado que su plazo de expiracin es cero.
instrucciones sea el primer
elemento de la pgina -antes de <?
cualquier otra etiqueta- y que no
session_name('mi_sesion');
haya lneas en blanco ni antes de
la etiqueta <? ni entre ella y las
session_start();
llamadas a estas funciones. echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesin
Propagacin de las $a=session_get_cookie_params();
sesiones foreach($a as $c=>$v){
echo $c,"--->",$v,"<br>";
La verdadera utilidad de las }
sesiones es la posibilidad de que ?>
sean propagadas, es decir, que <A Href="ejemplo122.php">Volver a llamar esta pgina</A>
tanto el identificador de sesin
como los valores de las variables
de sesin -luego hablaremos de Ejemplo 122.php
estas variables- puedan ir pasando
de una pgina a otra sin necesidad
de recurrir al uso de formularios. <?
Para entendernos, se trata de dar session_name('mi_sesion');
validez y utilizar la misma tarjeta session_start();
para movernos en las diferentes echo session_id(),"<br>";
secciones del hotel que hemos echo session_name(),"<br>";
utilizado como ejemplo. # recogemos en la variable $a el array con los datos de la sesin
$a=session_get_cookie_params();
La forma habitual de propagar las foreach($a as $c=>$v){
sesiones es a travs de cookies, echo $c,"--->",$v,"<br>";
pero como quiera que el usuario }
tiene la posibilidad de activar la
?>
opcin no aceptar cookies y eso es
algo que no podemos prever, PHP <A Href="ejemplo123.php?<?=$SID ?>">Volver a llamar est pgina</A>
dispone una opcin alternativa que
permite la propagacin a travs de
Ejemplo 123.php
la URL.

Caso de que el cliente


tenga activada <?
la opcin aceptar cookies session_name('mi_sesion');
session_start();
Si queremos que las sesiones se echo session_id(),"<br>";
propaguen nicamente en el caso
echo session_name(),"<br>";
de que est activada la opcin
aceptar cookies en el navegador
# recogemos en la variable $a el array con los datos de la sesin
bastar con hacer la llamada a la $a=session_get_cookie_params();
nueva pgina siguiendo el mtodo foreach($a as $c=>$v){
tradicional, es decir: echo $c,"--->",$v,"<br>";
}
<A href="pagxx.php"> ?>
<A Href="ejemplo124.php?<?echo session_name()."=".session_id()?>">
y que esa nueva pgina contenga
sin que lo preceda ninguna
Volver a llamar esta pgina</A>
lnea en blanco el script siguiente:

<? Ejemplo 124.php


session_cache_limiter();
session_name('nombre'); Las configuraciones por defecto de session.cookie pueden cambiarse sin necesidad de
session_start(); modificar el fichero php.ini.
.....
?> Mediante la funcin session_set_cookie_params(duracin ,'path','dominio',segura)
se pueden configurar esos parmetros de forma temporalunicamente para la pgina
donde session_cache_limiter no es
en la que est insertado y que como en los casos anteriores tiene tres posibilidades
un elemento imprescindible y
de script.
podremos incluirlo o no, de
acuerdo con nuestro inters.
En los ejemplos siguientes, se escribir -siempre que est configurada la opcin
Con session_name ocurre algo aceptar cookies en el navegador del cliente- una cookie que tendr una caducidad de
similar. Si la sesin fue iniciada 10 minutos (el valor 10 de session_set_cookie_params).
con un nombre distinto al que le
asigna por defecto PHP, debemos Esa cookie se guardar en el mismo directorio (/) donde se guardan las pginas web
escribir en el script anterior la visitadas (el famoso C:\WINDOWS\Temporary Internet Files, en la configuracin por
funcin session_name, y defecto de IE), pero..., eso solo ocurrir si -tal como ves en el ejemplo- pones en el
adems, debe contener el mismo parmetro dominio el nombre real del dominio donde est alojada la web.
nombre que le habamos asignado
en la pgina de procedencia. Si el nombre de dominio no coincide con que alberga la pgina razonable criterio de
seguridad no se guardar la cookie.
Si no se asigna ningn nombre
tomar PHPSESSID nombre por
defecto en todas las pginas y no <?
ser necesaria la instruccin session_set_cookie_params (10,"/","localhost", 0);
session_name. session_name('mi_sesion');
session_start();
Caso de cookies echo session_id(),"<br>";
desahabilitadas echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
Para garantizar la propagacin de
echo $c,"--->",$v,"<br>";
las sesiones an cuando est
}
activada la opcin no aceptar
cookies tendremos que pasar el ?>
identificador de sesin junto con <A Href="ejemplo125.php">Volver a llamar esta pgina</A>
las llamadas a las pginas
siguientes. Para ello se requiere la
siguiente sintaxis: Ejemplo 125.php

<A href="pagxx.php?
<? echo session_name(). "=" <?
.session_id()?> session_set_cookie_params (10,"/","localhost", 0);
session_name('mi_sesion');
Con esta sintaxis, despus de
session_start();
escribir el ? (recordemos que es la
forma de indicar que aadimos echo session_id(),"<br>";
variables y valores para que sean echo session_name(),"<br>";
transferidos junto con la peticin $a=session_get_cookie_params();
de la pgina) estaremos pidiendo a foreach($a as $c=>$v){
PHP que escriba como nombre de echo $c,"--->",$v,"<br>";
variable el nombre de la sesin y }
como valor de esa variable, ?>
despus de insertar el signo igual, <A Href="ejemplo126.php?<?=$SID ?>">Volver a llamar esta pgina</A>
el identificador de sesin.

Es evidente que la utilizacin de Ejemplo 126.php


esta opcin nos permite asegurar
que las sesiones y sus variables
podrn ser usadas sin riesgos de
que una configuracin inadecuada <?
por parte del cliente produzca session_set_cookie_params (10,"/","localhost", 0);
resultados imprevisibles. session_name('mi_sesion');
session_start();
Ejercicio n 36 echo session_id(),"<br>";
echo session_name(),"<br>";
Desarrolla un formulario en el $a=session_get_cookie_params();
que el usuario pueda escribir foreach($a as $c=>$v){
su nombre y elegir un color echo $c,"--->",$v,"<br>";
de fondo. Al enviar este }
?>
formulario los valores de
<A Href="ejemplo127.php?<?echo session_name()."=".session_id()?>">
ambos campos se
Volver a llamar esta pgina</A>
registrarn en variables de
sesin y se visualizar una
nueva pgina que tendr el Ejemplo 127.php
color de fondo elegido y que
presentar el nombre de Cuidado!
usuario. Adems, esta
pgina, contendr un enlace Antes de empezar a desarrollar el ejercicio que te proponemos al margen, te sugerimos que
a una segunda pgina a la leas los contenidos que hemos incluido en la pgina siguiente.
que debern propagarse los
valores anteriores
Anterior Indice Siguiente
Sesiones (II)

Variables de sesin
Con cualquier opcin de register_globals
La verdadera utilidad de trabajar
con sesiones estriba en la Aqu tenemos un ejemplo en el que utilizamos las funciones PHP especficas para el
posibilidad de propagar junto con tratamiento de sesiones.
ellas los valores de las variables de
sesin. En el caso de que la versin de PHP no admitiera superglobales habra que sustituir
$_SESSION por $HTTP_SESSION_VARS y tener presente el carcter no global de esta
Se trata de ir aadiendo y ltima variable.
propagando variables con sus
valores, y de la posibilidad de
utilizarlas de la misma forma que <?
se utilizaran las variables externas # iniciamos la sesin
enviadas a travs de un formulario. session_start();
# visualizamos el identificador de sesin
Igual que ocurra en caso de los echo "Este es el identificador de sesion: ",session_id(),"<br>";
formularios, tambin las variables # registramos una variable de sesin asignandole un nombre
de sesin pueden ser tratadas de
$_SESSION['variable1'];
forma distinta segn como estn
configurado PHP (php.ini) y cual #asignamos un valor a esa variable de sesin
sea la versin de PHP que $_SESSION['variable1']="Filiberto Gmez";
utilicemos. # registramos una nueva variable de sesin
#asignandole directamente un valor
$_SESSION['variable2']="Otro filiberto, este Prez";
Register globals #comprobamos la existencia de la variables de sesin
echo "Mi_variable1 esta registrada: ",
Las variables de sesin tienen, isset($_SESSION['variable1']),"<br>";
como ocurra en otros casos, una #leemos el contenido de esa variable
sintaxis comn (que no depende print "Su valor es: ".$_SESSION['variable1']."<br>";
de la configuracin de la directiva
#comprobamos la existencia de la otra variable y la visualizamos
register globals) y una especfica
echo "Mi variable2 esta registrada :",
aadida a la anterior para el caso
en que register globals est isset($_SESSION['variable2']),"<br>";
activado. print $_SESSION['variable2']."<br>";
#destruimos la variable1
A diferencia de los casos que unset($_SESSION['variable1']);
hemos visto anteriormente, echo "La variable1 ha sido destruida:",
cuando se trata de sesiones no isset($_SESSION['variable1']),"<br>";
existe la similitud sintctica que print $_SESSION['variable1']."<br>";
exista en aquellos casos.
#destruimos todas las variables restantes
Esa es la razn por la que no unset($_SESSION);
vamos a incluirla. Su utilidad #comprobamos que han sido destruidas
prctica es nula y podra crearnos
cierta confusin. echo "La variable1 ya estaba vacia:",
isset($_SESSION['variable1']),"<br>";
El hecho de que PHP mantenga print $_SESSION['variable1']."<br>";
activas las funciones de esa opcin
obedece nicamente a razones de
echo "Tambin ha sido destruida la variable2: ",
tipo prctico. La decisin de
eliminarlas de las nuevas versiones
$_SESSION['variable2'],"<br>";
podra ocasionar serios perjuicios a print $_SESSION['variable2']."<br>";
programadores que tienen
desarrolladas sus aplicaciones con ?>
la antigua sintaxis y que se veran
obligados a modificar el cdigo
fuente de todos sus scripts Ejemplo 128.php
anteriores.

Propagacin de sesiones
Manejo de variables
Los tres scripts siguientes son un ejemplo del uso de sesiones para la propagacin de
Las funciones ms importantes
para el manejo de variables de
sesiones.
sesin son las siguientes:
Funcionan bajo cualquier forma de register_globals y tambin en el caso en que las
$_SESSION['var'] cookies estuvieran desactivadas en el navegador del cliente

es una de las formas de definir una


<?
variable de sesin.
/* recuerda que entre <? y la primera lnea no puede haber
El ndice var debe contener entre lneas en blanco ni tampoco puede haberla encima de <?
comillas el nombre que aunque como en este caso, si admite lneas de comentario
pretendamos asignarle a esa pero no lneas en blanco */
variable de sesin. # deactivamos la opcion de que las pginas puedan guardarse
# en la cache del navegador del cliente
Si la variable ya existiera le
session_cache_limiter('nocache,private');
reasignara un valor nulo.
# le asignamos un nombre a la sesin
$HTTP_SESSION_VARS['v'] # aunque lo habitual sera dejar el nombre por defecto
# que le asigna la configuracin de php.ini
Es complementaria de la anterior session_name('pruebas');
en el caso de que PHP acepte # iniciamos la sesion
variables superglabales. session_start();
En en caso de que no fueran
# creamos variables de sesion y les asignamos valores
aceptadas sera la opcin
alternativa a aquella.
$_SESSION['valor1']=25;
$_SESSION['valor2']="Ambrosio de Morales";
Ambas se comportan igual que $_SESSION['variable3']="Una prueba ms";
cualquier otra variable. Tanto si /* cerramos el script e insertamos un enlace a otra pgina
existieran previamente como si no y propagamos la sesin incluyendo en la llamada
hubieran sido creadas el nombre de la session y su identificador
anteriormente le asignara el valor En esta pgina no se visualizara nada. Solo el enlace */
indicado. ?>
<A Href="ejemplo130.php?<?echo session_name()."=".session_id()?>">
unset($_SESSION); Propagar la sesion</A>
La funcin unset destruye las
variables contenidas en el
parntesis. En este caso, al
Ejemplo 129.php
contener el array $_SESSION
destruira todas las variables
contenidas en l.
<?
unset($_SESSION['var']); /* pese a que la sesion viene de la pgina anterior
tenemos que poner nuevamente session_cache_limiter
Es similar a la anterior. En este ya que esta instruccion no se conserva
caso solo sera destruida la
solo es vlida para la pgina en la que esta definida
variable de sesin indicada en var.
Tambin tenemos que poner en session_name el mismo
isset($_SESSION['var']); nombre de la pgina anterior, de no hacerlo
PHP entendera que se trata de iniciar una sesion distinta
La funcin isset no es especfica Por ultimo tambin debemos iniciar la sesin
del tratamiento de sesiones es obligatorio iniciarla */
devuelve un valor booleano (UNO session_cache_limiter('nocache,private');
NUL) segn que exista o no
session_name('pruebas');
exista la variable contenida en el
parntesis. De hecho, se comporta
session_start();
con las variables de sesin de /* comprobaremos que la sesion se ha propagados
forma idntica a como lo hara con visualizando el array asociativo $_SESSION
cualquier otro tipo de variable. que contiene todas la variables de Sesion */

foreach($_SESSION as $indice=>$valor){
Propagacin de las
print("Variable: ".$indice." Valor: ".$valor."<br>");
variables }
# modificamos los valores de las variables de sesion
Las variables $_SESSION['var'] # de igual forma que si fueran variables de cualquier otro tipo
creadas en cualquier pgina, se
propagan a todas las dems $_SESSION['valor1']+=87;
pginas a las que se propague la $_SESSION['valor2'] .=" bonito nombre";
sesin, sin que para ello sea
# destruimos la tercera variable
necesaria ninguna actuacin
especfica. unset($_SESSION['variable3']);

Bastar con propagar la sesin # propagamos la sesion a la pgina siguiente


siguiendo los procedimientos # con identico proceso al del script anterior
descritos en la pgina anterior ?>
para que las variables sean <A Href="ejemplo131.php?<?echo session_name()."=".session_id()?>">
transferidas automticamente. Propagar la sesion</A>
Esa es la verdadera utilidad de
este tipo de variables.

Recuerda que para transferir otros


tipos de variables tenamos que <?
recurrir a formularios o a incluir # identicos comentarios a los anteriores
todas las parejas nombre=valor en session_cache_limiter('nocache,private');
la direccin de la pgina que
session_name('pruebas');
habra de recibirlas. No cabe duda
que este mtodo aade un gran session_start();
factor de comodidad y utilidad a la # este bucle nos confirmar que se han propagado
transferencia de informacin entre # los nuevos valores y que la tercera variable ha sido destruida
pginas del mismo espacio de foreach($_SESSION as $indice=>$valor){
servidor. print("Variable: ".$indice." Valor: ".$valor."<br>");
}
Aunque resulta obvio, quiz no ?>
est de ms comentar que las
variables de sesin no se
transmiten ms que entre pginas
alojadas en el mismo espacio de
servidor. Anterior Indice Siguiente
Crear ficheros PDF

Algunas posibilidades
Usando las libreras PDFLib
Antes de utilizar esta opcin es preciso hacer una pequea modificacin en php.ini.
Existen diferentes posibilidades de
creacin de ficheros PDF mediante Hemos de descomentar la lnea que dice:
el uso de funciones de PHP. La
distribucin de PHP incluye ;extension=php_pdf.dll
funciones para la creacin de
ficheros usando las bibliotecas y como descomentar no es otra cosa que quitar el punto y coma que va delante de una
PDFlib de Thomas Merz que estn lnea, habremos de dejarla as:
disponibles en http://www.pdflib.
com/. extension=php_pdf.dll

La distribuciones de PHP para Una vez guardados los cambios habr que como siempre en estos casos volver a iniciar
Windows incluyen estas libreras el servidor Apache.
restringiendo su uso a actividades
no comerciales. Cuando se trata de Para comprobar si est activa la modificacin del php.ini que comentamos a la
Linux/Unix la compilacin y izquierda- bastara con visualizar el famossimo info.php y comprobar que aparece lo
utilizacin de esta biblioteca
siguiente:
requiere su compra. Por esa razn
son muchos los hostings que no
incluyen entre sus servicios la
posibilidad de uso de esta librera.

Una solucin alternativa y


gratuita es el uso de la clase
FPDF que permite generar
documentos PDF directamente
desde PHP sin necesidad de
utilizacin de ninguna librera
externa.
Si es as, ya estamos en disposicin de empezar a trabajar con este nuevo tipo de
En http://www.fpdf.org podrs funciones PHP.
encontrar las ltimas versiones de
esta clase as como informacin y La visualizacin de ficheros con extensin PDF requiere tener instalado el programa
documentacin relacionada con su Adobe Acrobat Reader. En caso de que nos dispusieras de l puedes descargar desde el
utilizacin.
enlace incluido en este prrafo.
Dado el carcter freeware de esta
clase y las posibilidades que ofrece Desde enlace, http://www.pdflib.com/products/pdflib/download/index.html tienes acceso
para ser modificada y a la descarga de estas libreras y tambin a la documentacin relativa a la forma de
complementada, ser la que utilizacin de las mismas.
utilizaremos para desarrollar los
contenidos de este tema.
Cuidado!

Creacin Para el desarrollo de los contenidos de este curso no utilizaremos la librera PDFLib. Por
de ficheros PDF esa razn no es necesario que efectuemos los cambios de configuracin descritos en el
prrafo anterior.
La creacin de ficheros PDF La clase FPDF -que ser la que utilizaremos- no requiere ninguna modificacin en la
requiere que el script incluya la configuracin de php.ini.
clase fpdf.php. Para ello bastar
con que contenga la siguiente
instruccin: La clase FPDF
include("fpdf.php")
Al realizar la descarga del fichero fpdf153.zip desde http://www.fpdf.org podremos
Si el fichero fpdf.php estuviera en observar que el zip incluye tres directorios: doc, font y tutorial y una serie de ficheros
un directorio distinto del actual
entre los que podremos encontrar fpdf.php que es el que realmente contiene la clase.
habra de escribirse la ruta
completa del mismo en la
Hemos incluido, en el directorio cursoPHP de estos materiales, el fichero fpdf.php de
instruccin anterior.
esa distribucin y tambin el directorio font que hemos renombrado como fontsPDF al
Adems de esto, para poder usar efecto de facilitar la identificacin.
la tipografa propia de la clase ser
necesario asignar a una El resto de los ficheros, son meramente informativos, no los hemos incluido ya que no
constante, con nombre van a resultarnos necesarios para el uso de esta clase. Si tratramos de utilizar esta clase
FPDF_FONTPATH (el nombre ha en un servidor remoto deberamos transferir al mismo, con estos o diferentes nombres,
de mantenerse ya que es que usa los mismos ficheros y directorios que hemos incluido junto con estos materiales.
en la clase fpdf), la ruta absoluta
hasta el directorio que contiene las
fuentes y que en nuestro caso ser Los tipos de letra
el direcotorio fontsPDF tal como
comentamos a la derecha.
Por defecto el directorio font que se incluye en la distribucin de http://www.fpdf.org -
La asignacin de valores a la que nosotros hemos renombrado como fontsPDF- incluye las tipografas: Courier,
constante la haremos mediante la Helvetica y Times, (permitiendo utilizar el nombre Arial como sinnimo de Helvetica) y las
sintaxis: fuentes de smbolos: Symbol y Zapfdingbats.
define('FPDF_FONTPATH','ruta') Sin embargo, es posible usar cualquier otra tipografa. En pginas siguientes veremos
la forma en que pueden generarse e incluirse nuevos tipos de letra mediante la utilidad
El constructor FPDF makefont incluida en el propio directorio fontsPDF.

La clase incluida en el fichero fpdf. El primer PDF


php tiene por nombre FPDF. Por
tanto su uso requerir la creacin Como primer ejemplo crearemos un fichero con dos pginas en blanco.
de un nuevo objeto mediante la
sintaxis: Una vez creado el objeto se aaden las pginas mediante la funcin (incluida en la
clase FPDF) AddPage() que debe ser invocada mediante la sintaxis:
$objeto= new FPDF()
$objeto->AddPage();
Al crear el nuevo objeto se ejecuta
siempre el constructor (recuerda
que un constructor es una funcin <?
# incluimos la clase fpdf que est en este mismo directorio
con idntico nombre que la clase include("fpdf.php");
que lo contiene -en este caso
# y definimos la constante FPDF_FONTPATH como la ruta absoluta
FPDF- que se ejecuta de forma
# hasta el directorio que contiene las fuentes tipogrficas
automtica el momento en que es
creado un nuevo objeto) que define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
utiliza tres parmetros: # creamos un nuevo objeto (MiPDF) utilizando la clase FPDF
orientacion, unidad de medida y $MiPDF=new FPDF();
formato. # creamos una pgina en blanco
$MiPDF->Addpage();
# creamos una segunda pgina en blanco
Orientacin, medidas y
$MiPDF->Addpage();
formato
# visualizamos el documento
$MiPDF->Output();
Al crear un nuevo objeto pueden ?>
incluirse los valores de todos o
parte de estos parmetros. En ese
caso la sintaxis sera: ejemplo132.php
$obj=new FPDF(ort,unds,tam)

La orientacion(ort) permite dos


valores: P (normal Portrait) y L Dimensionado y orientacin de documentos PDF
(apaisado Landscape en
denominacin inglesa). El valor por En este ejemplo establecemos dimensiones, unidades de medida y orientacin del
defecto es P (normal). documento. Comprobaremos que podemos cambiar la orientacin (de normal a apaisada
o viceversa) de cada una las pginas del documento.
El unds (unidad de medida a
utilizar) permite dos valores: in Las modificaciones de orientacin de las pginas pueden realizarse incluyendo el tipo
(pulgadas),pt (puntos), mm de orientacin (L P) de esa pgina concreta en la llamada al mtodo AddPage(). La
(milmetros) y tambin cm
sintaxis sera: $objeto->AddPage('L') para el caso de apaisado $objeto->AddPage('P')
(centmetros). El valor por
si se tratara de orientacin normal.
defecto es mm (milmetros).

Recuerda que una pulgada Cuando se aade una pgina sin especificar la orientacin en AddPage() la nueva
equivale a 25,4 milmetros y que pgina tendr la orientacin indicada en la llamada al constructor del nuevo objeto
un punto equivale a 1/72 ($objeto= new FPDF('orientacion','unidades','tamao')).
pulgadas (0,35277 mm.).

Respecto a los formatos, los


<?
valores preestablecidos son los # incluimos la clase fpdf que est en este mismo directorio
siguientes: include("fpdf.php");
# y definimos la constante FPDF_FONTPATH como la ruta absoluta
Valor Dimensiones (mm.) # hasta el directorio que contiene las fuentes tipogrficas
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
A4 210x297 /* vamos a configurar el documento como apaisado (P), utilizando
A5 148,5x210 las pulgadas como unidad de medida y unas dimensiones "no estandar"
de 10 x 20 pulgadas */
A3 297x420
# creamos un array con las dimensiones (ancho y alto);
Legal 215,9x355,6
$dimensiones=array (10,20);
Letter 215,9x279,4 # creamos un nuevo objeto (MiPDF) utilizando la clase FPDF
# incluyendo en este caso los valores a utilizar por el constructor
$MiPDF=new FPDF('P','in',$dimensiones);
Pueden crearse documentos PDF # creamos una pgina en blanco. Incluimos, para esta primera pgina
con dimensiones distintas a las # un cambio de orientacin respecto a la inicial
anteriores. Para ello sera $MiPDF->Addpage('L');
necesario crear un array con las # creamos una segunda pgina en blanco
dimensiones pretendidas # en la que, al no incluir el parmetro de orientacin
$medidas=array(ancho,alto) # utilizar el valor utilizado por el constructor.
$MiPDF->Addpage();
e incluir esa variable como # visualizamos el documento
parmetro -puedes verlo en el $MiPDF->Output();
ejemplo de la derecha- en la ?>
creacin del nuevo objeto.

Ejemplo133.php
El mtodo Output()

La clase FPDF incluye la funcin


Output para poder visualizar o
Un ejemplo un poco ms completo
guardar el documento creado.
Utiliza dos parmetros: nombre del Aunque no tienen excesiva utilidad prctica, vamos a comentar someramente aqu -
fichero PDF y destino del tambin los incluimos en el ejemplo- algunos de los mtodos, de carcter bsicamente
documento. La sintaxis podra ser informativo, que incluye la clase FPDF.
la siguiente:
SetAuthor("nombre del autor") Permite incluir una cadena con el nombre del
$obj->Output(nomb,dest)
autor.
Puede asignarse cualquier nombre,
con o sin extensin, tal como SetCreator("nombre de la aplicacin") Permite incluir una cadena con el nombre
puede verse en el ejemplo. del programa utilizado para crear el documento.
Cuando no se indica el nombre, la
funcin asigna por defecto el de SetTitle("ttulo del documento") Permite incluir una cadena con el ttulo del
doc.pdf. documento.

El parmetro destino puede tomar SetKeywords("palabras clave") Permite incluir una cadena con una lista de
uno de los siguientes valores: palabras clave separadas por espacios.
I
permite visualizar el fichero Los datos incluidos en el documento mediante los mtodos anteriores no son
directamente en el navegador si el presentados diractamente en el documento. Slo son visualizables cuando se exploran los
plugin si est disponible. La opcin metadatos del documento.
Guardar como... asignara, por
defecto, el nombre especificado en
el parmetro nomb.
<?
D # incluimos la clase fpdf que est en este mismo directorio
enva el fichero al navegador y include("fpdf.php");
muestra ventana de opcin que # y definimos la constante FPDF_FONTPATH como la ruta absoluta
permite elegir entre Abrir o # hasta el directorio que contiene las fuentes tipogrficas
Descargar. Si se elige esta ltima define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
guardar el fichero con el nombre
/* vamos a configurar el documento como apaisado (P), utilizando
especificado en el parmetro nomb.
los milmetros como unidad de medida y unas dimensiones "no estandar"
F de 140 x 200 milimetros */
guarda el fichero en el directorio # creamos un array con las dimensiones (ancho y alto);
actual del servidor con el nombre $dimensiones=array (140,200);
asignado en la opcin nomb. # creamos un nuevo objeto (MiPDF) utilizando la clase FPDF
# incluyendo en este caso los valores a utilizar por el constructor
$MiPDF=new FPDF('P','mm',$dimensiones);
El mtodo SetDisplayMode
# el mtodo SetAuthor nos permite incluir el nombre del autor
() $MiPDF->SetAuthor('Pepe Prez');
# el mtodo SetCreator nos permite incluir el nombre de la
Este mtodo -slo afecta a la # aplicacion que genera el pdf
forma en la se visualiza el $MiPDF->SetCreator('clase FPDF');
documento en la pantalla del # el mtodo SetTitle nos permite incluir un ttulo
cliente- permite configurar dos
$MiPDF->SetTitle('Pruebas del pdf');
parmetros: tamao y forma de
# el mtodo SetKeywords nos permite incluir palabras claves
visualizacin.
# separadas por espacios y dentro de una misma cadena
El primero puede usar una de $MiPDF->SetKeywords('palabra1 palabra2');
estas opciones: fullpage (el zoom # el mtodo SetDisplayMode nos permite incluir palabras claves
del visor se adapta de modo que # separadas por espacios y dentro de una misma cadena
encaje la pgina completa en la $MiPDF->SetDisplayMode('fullpage','two');
pantalla); fullwidth (ajusta el zoom # creamos una pgina en blanco. Incluimos, para esta primera pgina
de forma que se visualize el # un cambio de orientacin respecto a la inicial
documento ajustando el ancho al
$MiPDF->Addpage('L');
de la pantalla); real (ajusta el
# creamos una segunda pgina en blanco
zoom de visor al 100%) default
que usa el modo por defecto del # en la que, al no incluir el parmetro de orientacin
visor. # utilizar el valor utilizado por el constructor.
$MiPDF->Addpage();
Mediante el segundo parmetro se # visualizamos el documento
puede establecer la forma de $MiPDF->Output('donpepito.pdf','I');
visualizacin. La opcin single ?>
muestras las pginas separadas de
una en una; continuous va
mostrndolas una detrs de otra Los ejemplos siguientes son similares. La nica modificacin que contienen respecto al
de forma continua; two muestras cdigo fuente anterior es la correspondiente al segundo parmetro (destino) del mtodo
dos columnas (con dos pginas) Output.
simultaneamente, y default que,
como en el caso anterior, usa el Destino="I" Destino="D" Destino="F"
modo por defecto del visor.

Anterior Indice Siguiente


Textos en PDF

Fijacin de mrgenes
Insercin de textos
La forma ms simple de insercin de textos poco utilizada por el nmero de incovenientes que
Algunas funciones de insercin de conlleva es la que utiliza la funcin:
textos permiten colocar los
mismos dentro de lo podra $obj->Text(x,y,texto)
llamarse caja de texto que no es
otra cosa que la superficie de la donde x e y son los valores numricos que representan las coordenadas del punto de la pgina en el
pgina delimitada por los que pretende realizarse la insercin y texto es una cadena (o una variable conteniendo una cadena)
mrgenes de la misma. con el texto que se pretende insertar.
Por defecto, estos mrgenes miden
Esta funcin no considera ni los eventuales saltos de lnea que pudiera haber en la cadena (inserta
un centmetro, por la izquierda,
la parte superior y la derecha del todo el texto en una sola lnea) ni tampoco los mrgenes del documento. Por ello puede ocurrir, tal
documento. El tratamiento del como puedes comprobar en el ejemplo, que, por desbordar los mrgenes del documento, no
margen inferior requiere una aparezcan los textos completos.
funcin especfica que veremos en
otro de los epgrafes de esta Una funcin mucho ms til es la siguiente:
pgina.
$obj->Write(interlinea,texto)
$obj->SetMargins(iz,su,de)
en la que interlinea es el interlineado (expresado en la misma unidad utilizada por el constructor) y
Los parmetros iz, su y de son los texto la cadena o variable que ocntiene el texto a insertar.
valores numricos que permiten
establecer, -en la unidad de Se comporta de la siguiente forma:
medida que se indique en el
constructor- los mrgenes
izquierdo, superior y derecho, por Comienza a escribir el texto en la posicin actual de punto de insercin.
este orden, del documento.
La posicin actual del punto de insercin. puede ser una de la siguientes:
Si se omite el tercer parmetro La esquina superior izquierda del rea de impresin de la pgina (en el caso en que se
(margen derecho) se le asignar el ha producido un salto de pgina y no se hubieran insertado elementos anteriormente.
valor que se haya indicado para el La posicin resultante del final de la insercin del el elemento anterior.
izquierdo. La posicin establecida como posicin actual mediante las funciones SetX, SetY
SetXY
Margen inferior y salto de
pgina La insercin de textos mediante la funcin Text() no modifica la localizacin del punto de
insercin ya que utiliza sus propias coordenadas de posicionamiento.
La funcin: Una vez que la lnea alcanza el margen derecho -establecido de forma explcita o por defecto-
de la caja de texto produce un salto de lnea automtico.
$obj->SetAutoPageBreak(a,b)

permite activar o desactivar el Incluye los saltos de lnea que encuentra en el propio texto (caso, por ejemplo, de inclusin de
salto de pgina automtico y ficheros de texto) y tambin aquellos incluidos en la propia cadena medienta la secuencia de
establecer el margen inferior escape \n.
(mnimo) de las pginas. El
parmetro a puede tomar dos Si la opcin AutoPageBreak (comentada al margen) est activada produce un salto de pgina
valores: 1 0 (cierto falso), que automtico al alcanzar el margen inferior de la pgina.
se corresponden con la condicin
activo/inactivo. Alinea los textos a la izquierda sin permitir modificar la configuracin de esta opcin

Cuando est activo se van


aadiendo nuevas pginas, de
forma automtica, hasta que se
<?
incluya la totalidad del texto
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
especificado. En el caso de estar
inactivo, los textos que # con el mismo criterio comentado en el ejemplo anterior
excedieran los lmites de la pgina include("fpdf.php");
no se visualizaran ya que no se define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
aadira una nueva pgina. /* establecemos las dimensiones del documento
creamos un nuevo objeto y aadimos una pgina*/
Por defecto est opcin est $dimensiones=array (140,200);
activada. $MiPDF=new FPDF('P','mm',$dimensiones);
El segundo parmetro, el valor b,
# ajustamos al 100% la visualizacin
permite indicar el margen inferior $MiPDF->SetDisplayMode('real');
mnimo de la pgina. Su valor -
numrico- deber indicarse en las
unidades establecidas por el #insertamos una pgina en blanco
constructor. Si no se indica $MiPDF->Addpage();
asumir, por defecto, un valor # establecemos el color de la letra
igual a dos centmetros. $MiPDF->SetTextColor(255,0,0);
# establecemos la fuente a utilizar, estilo
Color del texto # y tamao en puntos. Al no incluir estilo
# considerar el estilo normal
$MiPDF->SetFont('Arial','',11);
El color del texto se establece
utilizando la siguiente funcin: # creamos una variable en la que incluimos un texto
$texto="Este es el texto que tendremos que escribir aqu dentro.\n";
$obj->SetTextColor(R,G,B) $texto.="Esto habra de ir detrs de un salto de lnea. Veremos si funciona o no.
";
donde R, G, B son valores $texto.="Estamos alargando la lnea para comprobar el funcionamiento de ";
numricos comprendidos entre 0 y $texto.="las diferentes funciones";
255 y que representan las
# usamos el mtodo Text para presentar el contenido de la variable
respectivas componentes de los
colores primarios: rojo, verde y
# situamos las coordenadas de insercin en el punto (30,40) mm.
azul. Si se utiliza con un slo # podremos observar que la funcin Text inserta todo el texto en
parmetro: # una linea sin tener en cuenta si sobrepasa o no el borde del papel
# ni tampoco los caracteres de salto de lnea
$obj->SetTextColor(K) $MiPDF->Text(30,40,$texto);
# cambiamos el color de la letra. Al pasar un solo parmetro
el valor numrico, tambin
# ser interpretado como escala de grises 0 -255 (0 negro, 255 blanco)
comprendido entre 0 y 255,
$MiPDF->SetTextColor(200);
establece colores de la escala de
grises desde el negro (cero) hasta # cambiamos el tipo de letra (Helvetica y Arial son alias de la misma fuente)
el blanco (255). $MiPDF->SetFont('Helvetica','B',11);
# utilizaremos la funcin Write para escribir el texto. Lo har con
Si no se especifica color los textos # alineacin a la izquierda, interpretando los saltos de lnea
aparecern en negro. # y efectuando uno automtico cuando alcanza el margen.
Una vez establecido un color su # El valor de la interlinea se expresa en milmetros.
valor se mantiente hasta que no
sea invocada nuevamente la # Dado que la nica insercin ha sido mediante Text() que no modifica el
funcin SetTextColor para su
# punto de insercin el resultado de este Write se incluir al comienzo
modificacin.
# de la pgina, respetando los mrgenes por defecto.
$MiPDF->Write(4,$texto);
Tipo de letra, estilo y
tamao # Comprobaremos los tipos de letra existentes en el directorio fonts.
$MiPDF->SetFont('Symbol','',11);
Podemos asignar estos tres valores /* insertamos un salto de lnea de 8 unidades que producir
mediante la funcin: un desplazamiento del punto de insercin hasta el margen izquierdo
de una lnea situada 8 unidades por debajo de la posicin del final
$obj->SetFont(nom,est,tam) de la cadena insertada anteriormente */
$MiPDF->Ln(8);
donde nom es una cadena que
# escribimos el texto anterior con la letra Symbol
debe indicar el nombre del tipo de
letra elegido (Helvetica, Arial, $MiPDF->Write(4,$texto);
Times, Zapfdingbats, Courier # cambiamos nuevamente el tipo de letra
Symbol son las fuentes por $MiPDF->SetFont('zapfdingbats','',11);
defecto). # insertamos un nuevo salto de prrafo de 8 unidades
# y repetimos la impresin del texto con la nueva tipografa
El estilo (est) puede indicarse $MiPDF->Ln(8);
mediante la cadena vaca ("") para $MiPDF->Write(4,$texto);
el tipo normal o mediante B, I, U
# establecemos mrgenes (izquierda, superior, derecha)
(negrita, cursiva, subrayada) o
# expresados en la unidad usada por el constructor (mm).
sus combinaciones, por ejemplo
BU para negrita subrayada. # Sern utilizados en las pginas siguientes
$MiPDF->SetMargins(30,40,25);
Las fuentes de smbolos slo # establecemos el modo de insercin automtica de pgina
permiten el estilo normal. El # indicando el margen inferior mnimo. El salto automtico
parmetro tam especifica el # no sera necesario ya que, si no se especifica, se configura
tamao de la letra expresado en # por defecto como tal
puntos. Si no se especifica, el $MiPDF->SetAutoPageBreak(1,8);
valor por defecto es 12 puntos.

Ms adelante, dedicamos un
apartado a la creacin y utilizacin # Insertamos una nueva pgina. En adelante
de nuevas fuentes tipogrficas. # los contenidos aprecern en esa nueva pgina
$MiPDF->Addpage();
# cambiamos el color y tipo de letra
Posicin actual
$MiPDF->SetTextColor(0,0,200);
$MiPDF->SetFont('Times','I',12);
La clase FPDF dispone de funciones # insertamos texto mediante Write y observaremos
que determinan el valor actual de # que ahora respeta los nuevos margenes
las coordenadas del punto de
$MiPDF->Write(4,$texto);
insercin (lugar donde se va a
# posicionamos el punto de insercin en las coordenadas
posicionar el texto, imagen o
elemento grfico que se incluya) y # (2,2) y escribimos de nuevo el texto.
otras que permiten modificar esos
puntos de insercin. $MiPDF->SetXY(2,2);
# al visualizar el documento podremos observar que solo
Son las siguientes: # respeta estas coordenadas la primera lnea, ya que las siguientes
# se ajustan a los mrgenes establecidos para la pgina
$obj->GetX()
$MiPDF->Write(4,$texto);
y
$obj->GetY()
# redimensionamos nuevamente los mrgenes
$MiPDF->SetMargins(20,5,15);
que devuelven los valores la
posiciones actuales, horizontal (X)
y vertical (Y). El resultado estar # cambiamos a una nueva pgina
expresado en las unidades $MiPDF->Addpage();
establecidas por el constructor # cambiamos el estilo de fuente a "normal"
considerando como origen de $MiPDF->SetFont('Times','',12);
coordenadas la esquina superior
# leemos el fichero de texto y lo recogemos en una variables
izquierda del documento y valores
positivos -horizontal y vertical- los
$f1=fopen('regenta.txt','r');
colocados a la derecha (X) y $regenta1=fread($f1,filesize('regenta.txt'));
debajo (Y) del origen. fclose($f1);
# insertamos el fichero mediante write
Para definir una nuevo punto de # podremos observar como se realiza el salto de pgina
insercin se pueden usar # de forma automtica respetando los mrgenes inferiores
cualquiera de estas funciones: $MiPDF->Write(4,$regenta1);
$obj->SetX(valor X)
$obj->SetY(valor Y)
$obj->SetXY(valor X, valor Y) # inseramos una nueva pgina
$MiPDF->Addpage();
que permiten establecer el punto # desactivamos el salto de pgina automatico
de insercin mediante sus # con lo cual no ser respetado el margen inferior
coordenadas: horizontal, vertical o # y el texto rebasar ahora los lmites del papal
ambas. $MiPDF->SetAutoPageBreak(0);
Cuando el valor X (en el caso #ponemos el texto en negro y cursiva para poder
SetX) es negativo se considera con #diferenciar los resultados al visualizar el documento
referencia al margen derecho de la $MiPDF->SetTextColor(0);
pgina. De igual modo, cuando se # reescribimos el texto anterior
asigna un valor negativo en SetY $MiPDF->Write(4,$regenta1);
se considera respecto a la parte # visualizamos el documento
inferior de la pgina. $MiPDF->Output();
?>
Saltos de lnea

Mediante $obj->Ln (valor) se


ejecuta un salto de lnea. La
posicin actual regresa al margen Ejemplo137.php
izquierdo y la vertical se desplaza
en el nmero de unidades indicado
en el parmetro valor.
Anterior Indice Siguiente
Textos recuadrados, tablas y enlaces

Textos recuadrados
Enlaces internos
En el ejemplo que tienes a continuacin hemos insertado algunas de las opciones de las
La funcion Cell ofrece un montn funciones comentadas al margen. En los prrafos siguientes incluimos algunos comentarios
de posibilidades a la hora de sobre la manera de utilizar las funciones de inclusin enlaces internos en el documento. Esta
insertar celdas conteniendo textos. opcin requiere tres pasos:
Su sintaxis es la siguiente:

$obj->Cell(a,h,text,b,q,p,r,e) Crear una referencia interna y recogerla en una variable identificadora.


dnde los parmetros son los La sintaxis sera la siguiente: $enlace=$obj->AddLink()
siguientes: a es el ancho de la
celda; h su altura; text la variable Definir la zona del documento (rea, imagen o texto) en la que, al pulsar sobre ella, se
o cadena que contiene el texto a activar el redireccionamiento. Podra hacerse de varias formas, entre otras:
insertar; b un parmetro que que
establece los bordes de la celda y $obj->Cell(a,h,text,b,q,p,r,$enlace)
que puede tomar los siguientes Mediante esta opcin se aade como ltimo parmetro de la funcin Cell la variable
valores:
creada mediante AddLink(). Si se tratara de un enlace a una URL no sera necesario
AddLink y bastara con incluir -entre comillas- la direccin de la URL. Convertira la
Valor Opcin cadena de texto en un hiperenlace.
0 Sin bordes
$obj->Link(X,Y,ancho,alto,$enlace)
1 Con bordes Permite definir como hiperenlace un rea de la pgina actual definida por un
rectngulo cuya esquina superior izquierda est definida por los parmetros X e Y y cuyo
L Borde por la izquierda
ancho y alto se establecen a travs de los parmetros del mismo nombre. La variable
T Borde superior $enlace se comporta de forma idntica a la indicada en el caso anterior.
R Borde por la derecha $obj->Write(interlinea,'texto',$enlace)
B Borde inferior En este caso, aadimos un tercer parmetro a la funcin Write (es opcional) que
contiene la variable indicadora del enlace. El comportamiento sera idntico a los
supuestos anteriores.
El valor por defecto es cero. Las
especificaciones de bordes Establecer la posicin a la que redigira el enlace. Ser necesario indicar a dnde habr
laterales pueden agruparse (LR, de redirigirse el cliente en el momento que se pulse sobre uno de los enlaces anteriores.
TL, etctera sin que importe el Eso se indica mediante:
orden en que se haga la
agrupacin). $obj->SetLink($enlace, pos_vertical, pagina)
La variable $enlace ser el indicador mencionado en los prrafos anteriores,
El parmetro q permite establecer pos_vertical la distancia del margen superior de la pgina de destino en la que se inicia
en qu posicin se habr de la visualizacin y pagina el nmero de la pgina a la que se redirige mediante el
insertar el elemento posterior a la enlace. Si se omiten estos parmetros se entender que la posicin vertical es 0 y que la
celda actual (otra celda, un texto
pgina es la pgina actual.
mediante Write, un grfico,
etctera). Permite los siguientes
valores:

<?
Valor Opcin
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
A la derecha de la celda
0 actual
# con el mismo criterio comentado en el ejemplo anterior
include("fpdf.php");
En el margen izquierdo de la define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
1 lnea siguiente /* establecemos las dimensiones del documento
Debajo de la celda actual creamos un nuevo objeto y aadimos una pgina*/
2 alineado a su borde izquierdo $dimensiones=array (210,297);
$MiPDF=new FPDF('P','mm',$dimensiones);
# ajustamos al 100% la visualizacin
Por medio del parmetro p se $MiPDF->SetDisplayMode('real');
puede establecer la alineacin del
texto (contenido en la celda) #insertamos una pgina en blanco
respecto a sus bordes. Permite $MiPDF->Addpage();
usar L, C y R como indicadores de # estableceremos los colores para bordes, fondos y textos
alineaciones del texto a la
# color de borde
izquierda, centro derecha.
$MiPDF->SetDrawColor(255,0,0);
El parmetro r es un valor # color del relleno (gris)
booleano (1 0) que especifica si $MiPDF->SetFillColor(200);
la celda ha de rellenarse con un # color del texto
color de fondo (1) o ha de ser $MiPDF->SetTextColor(0,0,255);
transparente (0). # establecemos espesores de lineas y tipo y tamao de letra
# espesor de linea 1 milimetro
El parmetro e -es opcional-
$MiPDF->SetLineWidth(1);
permite establecer la celda como
un hiperenlace.
# fuente y tamao: Arial, negrita de 12 puntos
Si se especifica una URL se $MiPDF->SetFont("Arial","B",12);
establecer un enlace a la misma # establecemos el texto para la primera celda
y, adems, es posible establecer $celda1="Esto ir en la celda 1";
enlaces internos de la forma que # determinamos el tamao de esta cadena y lo recogemos
puedes ver comentada en el # en la variable ancho
ejemplo. $ancho=$MiPDF->GetStringWidth($celda1);
/* definimos la celda estableciendo:
Tamao de ancho--- igual al de la cadena que va a contener + 6 mm.
una cadena de texto alto --- 6 milimetros
texto--- el contenido de la variable $celda1
borde--- 1 (para que ponga los cuatro bordes
La funcin:
celda siguiente--- 0 (para que la incluya a continuacin de la actual)
$obj->GetStringWidth('cad') alineacin --- C para que centre el texto en la celda horizontalmente
relleno --- 1 para que aplique el fondo a la celda
devuelve un nmero decimal que enlace--- pondremos un enlace al buscador google */
indica la longitud de la cadena
indicada en cad con la fuente y # como aun no hemos insertaod ningn elemento en la pgina
tamao de letra actuales. Es una # la celda aparecer en la parte superior de la pgina y apoyada
funcin muy til para dimensionar # sobre su borde izquierdo
las celdas de modo que los textos
que contienen no sobrepasen sus $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
bordes.
/* pero modificando insertamos una nueva celda con el mismo contenido
Espesor de lneas modificando:
bordes--- ahora los pondremos solo por la parte superior T e inferior B
Puede especificarse el grosor de posicion de la siguiente celda: 2 (inmediatamente debajo)
las lneas -en los elementos relleno --0 */
grficos que las utilizan # la nueva insercin se realizar a la derecha de la anterior
(rectngulos, celdas, etctera)- # ya que as lo especificamos al definir all la celda siguiente
mediante la funcin: $MiPDF->Cell($ancho+6,6,$celda1,TB,2,C,0,"http://www.google.com");
$obj->SetLineWidth('grosor')
# cambiamos el color del borde y el del relleno
dnde grosor es un valor # color de borde
numrico que especifica el espesor $MiPDF->SetDrawColor(255,255,0);
de las lneas en las unidades # color del relleno (gris)
asignadas en el constructor. Por $MiPDF->SetFillColor(0,255,255);
defecto -si no se asigna espesor
mediante esta funcin- el ancho de /* una nueva insercin de una celda similar modificando
lnea sera de 0,2 milmetros. identica a la primera celda salvo el parmetro de posicin
de la celda siguiente que cambiamos a 1 para que la celda
Nmeros de pgina siguiente aparezca en el margen izquierdo del documento.
La actual, aparecer inmediatamente debajo de la anterior
La funcin:
ya que se as se especific en su Cell correspondiente */

$obj->PageNo() $MiPDF->Cell($ancho+6,6,$celda1,1,1,C,1,"http://www.google.com");

devuelve el nmero de la pgina # la misma funcin anterior que ahora debera aparecer en el margen izquierdo
actual. # modificando la especificacin para que inserte la potencial celda siguiente
# inmediatamente a la derecha
Color de las lneas
$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
Tambin es posible establecer el
color de las lneas mediante la # insertamos un salto de lnea de 10 mm.
funcin: $MiPDF->Ln(10);
# una nueva celda que por efecto del salto de linea
$obj->SetDrawColor('R,G,B') # perdera la referencia de situarse a la derecha de la anterior
# se desplazara 10 unidades hacia abajo y se insertara en el margen
dnde R,G,B son valores
izquierdo
nmericos comprendidos entre 0 y
255 que asignan los valores de las $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");
componentes de los colores
primarios rojo, verde y azul # modificaremos ahora el punto de insercin mediante SetXY a las coordenadas
respectivamente. Si se incluye un # -100, -120 mm. valores negativos
nico parmetro ser interpretado # con lo cual las referencias sern al margen derecho y al inferior
como escala de grises. El valor 0
sera el negro y 255 representara $MiPDF->SetXY(-100,-120);
el blanco.
# vamos a crear un enlace interno mediante la funcin AddLink()
Color de relleno # y vamos a recoger el resultado en la variable $salta
$salta=$MiPDF->AddLink();
Algunos elementos grficos (celdas
# estableceremos la referencia del enlace
de texto, rectngulos) permiten $MiPDF->SetLink($salta,0,2);
que se les aplique un color de # crearemos ahora una zona (transparente) de enlace
fondo. Para establecer tal color # ser el rectangulo definido como parmetros en la la funcin Link
basta con ejecutar la funcin: # es decir un rectango de 297mm. de ancho, 30 de alto
# que tendr su esquina superior izquierda en el punto (0,40)
$obj->SetFillColor('R,G,B') # este enlace nos llevar al lugar del documento
# que se especifique mediante SetLink($salta);
El criterio de asignacin de colores
es idntico al del prrafo anterior. # que indi
$MiPDF->Link(0,40,297,30,$salta);
Una vez asignado un color de #comprobemos que all se inserta el texto mediante el cell correspondiente
relleno (lo mismo ocurre con los $MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,$salta);
colores y espesores de lnea) se
mantiene a lo largo del documento # insertemos un salto de pgina y comprobemos la funcin n de pagina
en tanto no sea modificado por la $MiPDF->Addpage();
ejecucin del mtodo con unos #aadimos a la cadena de texto el valor del nmero de pagina actual
parmetros distintos.
$MiPDF->Cell(50,6,"pagina n".$MiPDF->PageNo(),1,0,C,1);
# activamos el valor por defecto del sealados de nmero total de pginas
Nmero de pginas del # al no incluir nada como parmetro de la funcion AliasNbPages();
documento # deberemos recurri al sealador por defecto {nb}
$MiPDF->AliasNbPages();
La clase FPDF incluye la posibilidad # insertamos una nueva celda y aadimos a la cadena de texto
de determinar el nmero total de # anterior "de {nb}". Como puedes ver
pginas del documento. Para ello # el sealador {nb} forma parte de la cadena como un texto ms
es preciso ejecutar (despus de $MiPDF->Cell(50,6,"pagina n ".$MiPDF->PageNo()." de {nb}",1,0,C,1);
crear el objeto) la funcin:
$MiPDF->Output();
$obj ->AliasNbPages('idn')
?>
donde idn es una palabra
cualquiera. Si se omite se
Ejemplo138.php
considerar su valor por defecto
que es: {nb}.

Para imprimir este valor en el Ejemplo de creacin de tablas


documento ser suficiente incluir
el identificador utilizado en una A continuacin incluimos un ejemplo de utilizacin de estas funciones para la creacin de
cadena de texto. Puedes verlo tablas a partir de un fichero de texto.
comentado en el ejemplo.
En este ejemplo, utilizaremos saltos de pgina manuales y -dada la dimensin del fichero de
texto- tendremos la oportunidad de comprobar el tiempo de generacin de un documento de
ms de 200 pginas.

En pginas posteriores veremos como confeccionar la misma tabla utilizando encabezados,


pies de pgina e insercin de pginas automticas.

Ver cdigo fuente Ver fichero de texto Crear el PDF

Anterior Indice Siguiente


Insercin de imgenes y elementos grficos

Lineas y rectangulos
Modificacin de la clase FPDF
El fichero fpdf.php que contiene la clase FPDF tiene una carencia relativa a la gestin de
La clase FPDF incluye mtodos imgenes en formato GIF. En la propia principal http://www.fpdf.org/ se hace una mencin
para el dibujo de segmentos a esa carencia y la forma de subsanarla.
rectilineos y de rectngulos.

Las funciones que utiliza para Fichero inicial fpdf.php


estos menesteres son las
siguientes: Guardado
como
fpdf_con_gif.php
$obj->Line(X1,Y1,X2,Y2) Modificaciones en el fichero inicial

Si no se ha especificado ningn Lnea Cambios


color -usando SetDrawColor- o
Donde dice:
un espesor de lnea - por medio de
SetLineWidth - se usarn los if($type=='jpg' || $type=='jpeg')
valores por defecto (color negro y $info=$this->_parsejpg($file);
0,2 mm. de espesor). elseif($type=='png')
$info=$this->_parsepng($file);
Cuando se trata de dibujar
rectngulos, hemos de utilizar la else
funcin: {
//Allow for additional formats
$obj->Rect(X1,Y1,A,H,'estilo')
aadir las lneas en rojo:
911
donde X1 e Y1 son las if($type=='jpg' || $type=='jpeg')
coordenadas de la esquina
$info=$this->_parsejpg($file);
superior izquierda del mismo, A el
elseif($type=='png')
ancho, H el alto y estilo que puede
ser una de estas tres cadenas: D, $info=$this->_parsepng($file);
F, DF que significan: dibujar elseif($type=='gif')
lneas de borde, rellenar, y $info=$this->_parsegif($file);
dibujar lneas y rellenar. Si no else
se especifica estilo se interpretar {
por defecto la opcin D. //Allow for additional formats
Donde dice:
Las imgenes GIF
//End of class
}
La clase FPDF, en su versin
original, no permite utilizar anteponer:
imgenes en formato GIF. No
function _parsegif($file){
obstante es posible adaptar la
clase y aadirle esa posibilidad.
//Function by Jrme Fenal
Para ello es preciso realizar las require_once 'gif.php';
modificaciones que se indican a la //GIF class in pure PHP from Yamasoft
derecha y que pueden resumires //(formerly at http://www.yamasoft.com)
en tres acciones. $h=0; $w=0;
$gif=new CGIF();
La primera de ellas es efectuar una if (!$gif->loadFile($file, 0))
modificacin de la funcin Image $this->Error("GIF parser: unable to open file $file");
() contenida en la clase FPDF del
if($gif->m_img->m_gih->m_bLocalClr) {
fichero fpdf.php. Se trata de
$nColors = $gif->m_img->m_gih->m_nTableSize;
incluir la condicin para imgenes
gif. $pal = $gif->m_img->m_gih->m_colorTable->toString();
if($bgColor != -1) {
El uso de imgenes GIF requiere $bgColor= $gif->m_img->m_gih->m_colorTable->colorIndex($bgColor);
utilizar una nueva funcin }
llamada _parsegif -la tienes en la $colspace='Indexed';
tabla de la derecha- que habr que } elseif($gif->m_gfh->m_bGlobalClr) {
incluir como un mtodo ms $nColors = $gif->m_gfh->m_nTableSize;
dentro de la clase FPDF.
$pal = $gif->m_gfh->m_colorTable->toString();
La funcin _parsegif requiere el if($bgColor != -1) {
uso de un nuevo fichero -gif.php- $bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor);
desarrollado por Yamasoft y que 1638 }
nosotros hemos encontrado en el $colspace='Indexed';
fichero zip que puede descargarse } else {
desde este enlace. Lo hemos $nColors = 0;
extraido de l y lo hemos incluido $bgColor = -1;
en estos materiales. $colspace='DeviceGray';
$pal='';
Hemos editado el fichero fpdf.php
}
y lo hemos guardado con un nuevo
nombre: fpdf_con_gif.php (se $trns='';
trata de conservar el fichero if($gif->m_img->m_bTrans && ($nColors > 0)) {
original y hacer los cambios sobre $trns=array($gif->m_img->m_nTrans);
uno nuevo) y hemos realizado los }
cambios que se indican al margen $data=$gif->m_img->m_data;
sobre este ltimo fichero. $w=$gif->m_gfh->m_nWidth;
$h=$gif->m_gfh->m_nHeight;
Una vez realizadas las if($colspace=='Indexed' and empty($pal))
modificaciones la opcin GIF ha
$this->Error('Missing palette in '.$file);
quedado totalmente funcional.
if ($this->compress) {
$data=gzcompress($data);
Cuidado! return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8,
'f'=>'FlateDecode', 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data);
Los cambios comentados en
} else {
la tabla anterior ya han sido return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace,
realizados. 'bpc'=>8, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data);
}
Lao ficheros gif.php y
}
fpdf_con_gif.php se han
incluido junto con estos
materiales. Incluir (en el mismo directorio que fpdf_con_gif.php) el fichero:

gif.php

Insercin de imgenes

Se pueden incluir imgenes


Un ejemplo con grficos e imgenes
mediante la funcin:
<?
$obj->Image('nombre',X1,Y1,A,
#incluimos el fichero resultante de las modificaciones anteriores
H,'tipo','enl')
include("fpdf_con_gif.php");
donde X1 e Y1 son las define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
coordenadas dnde se situar la /* establecemos las dimensiones del documento en mm.
esquina superior izquierda de la creamos un nuevo objeto y A-4 apaisado.
imagen, A es el ancho con el que Hemos modificado algunas funciones de la clase pero no le hemos
se visualizar la imagen, H su cambiado
altura, tipo es el formato de la el nombre, por ello el constructor es el mismo */
imagen original que puede ser: $MiPDF=new FPDF('L','mm','A4');
JPG, JPEG, PNG GIF. Por ltimo, # ajustamos la visualizacin para ver la pgina completa en pantalla
el parmetro enl permite -tal
$MiPDF->SetDisplayMode('fullpage');
como ocurra con CELL con
WRITE y con los mismos criterios #aadimos una pgina
all utilizados- establecer un enlace $MiPDF->AddPage();
externo o una referencia interna. # sin haber definido previamente ni un color ni un ancho de linea
# aparecer en negro y con un espesor de 0.2 mm
El parmetro nombre debe $MiPDF->Line(5,5,287,5);
especificar la ruta, el nombre y la #ensayamos las diferentes opciones de rectangulos
extensin de la imagen a incluir. #con los colores y espesores por defecto
La clase no soporta ni entrelazados $MiPDF->Rect(10,10,50,50);
en las imgenes gif ni
$MiPDF->Rect(70,10,50,50,'D');
transparencias (canales alfa) en
las imgenes png.
$MiPDF->Rect(140,10,50,50,'F');
$MiPDF->Rect(200,10,50,50,'DF');
Las dimensiones de la imagen # modificamos los colores y espesores de linea
pueden omitirse (incluyendo en su $MiPDF->SetDrawColor(255,0,0);
lugar una cadena vacia). En ese $MiPDF->SetFillColor(0,0,255);
caso incluira la imagen original $MiPDF->SetLineWidth(3);
con una resolucin de 72 puntos # dibujamos nuevos rectngulos con los nuevos valores
por pulgada. $MiPDF->Rect(10,65,50,50);
Si se especifica una sola de las $MiPDF->Rect(70,65,50,50,'D');
dimensiones la otra se calcula de $MiPDF->Rect(140,65,50,50,'F');
forma automtica y se mantienen $MiPDF->Rect(200,65,50,50,'FD');
las proporciones. Si se insertan # insertamos una imagen (png) sin especificar dimensiones
valores de largo y ancho pueden $MiPDF->Image('./images/cruz.png',10,118,'','','png');
generarse, a voluntad, efectos de # otra imagen(jpg) en la que unicamente especificamos el alto
distorsin. $MiPDF->Image('./images/cabina.jpg',90,118,'',90,'jpg');
# otra imagen(gif) en la que especificamos ancho y alto y provocamos
Insercin de # una distorsin
imgenes dinmicas $MiPDF->Image('./images/peligro.gif',215,118,80,50,'gif');
#aadimos una nueva pgina
$MiPDF->AddPage();
Es posible combinar la potencia
# asignamos un nombre a la imagen dinmica que vamos a generar
grfica de las funciones de PHP
para la creacin de imgenes
# e incluir en el documento PDF
dinmicas con la opcin de crear $imagen="ladinamica.jpg";
ficheros PDF mediente la clase # ejecutamos la funcin que crea la nueva imagen
FPDF. La forma de proceder es imagen1($imagen);
simple y puedes verla en el # insertamos la nueva imagen y generamos la salida
ejemplo que tienes aqu a la $MiPDF->Image($imagen, 45, 35 , 150, '','jpg','http://www.google.es');
derecha. $MiPDF->Output();
# ya podemos borrar la imagen dinmica que hemos creado
Basta incluir una funcin -dentro
unlink($imagen);
del mismo fichero o por inclusin
de un fichero externo que la
# esta es la funcin que crea la imagen dinamica
contenga- que cree la imagen # le asignamos un nombre para que sea guarda temporalmente
dinmica y la guarde con un # en el directorio actual
nombre previamente establecido. function imagen1($imagen){
Header("Content-type: image/jpeg");
Incluimos el nombre de esa $im = imagecreate(200,200);
imagen en la funcin Image y, una $fondo=imagecolorallocate ($im, 0, 0, 200);
vez producida la salida mediante $blanco=imagecolorallocate ($im, 255, 255, 255);
Output, proceder a borrarla del
Imagefill ($im, 0, 0, $fondo);
directorio en el que fue creada.
Imagerectangle ($im, 10, 10, 190, 190, $blanco);
Imagejpeg($im,$imagen);
ImageDestroy($im);
}
?>

Ejemplo140.php

Anterior Indice Siguiente


Celdas mltiples, encabezados y pies de pgina

Celdas con
Encabezados, pies de pgina y saltos automticos
saltos de lnea
<?
# include y define idnticos a los anteriores
La funcin Cell, estudiada en la
pgina anterior, no interpreta los include("fpdf.php");
saltos de lnea y, en el caso de que define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
la cadena de texto sea ms larga # creamos una clase extendida de la clase FPDF
que el ancho de la celda, escribir class GranPDF extends FPDF {
fuera de sus mrgenes. # incluimos la funcion Header (debe ser definida con este nombre)
# que se ejecuta cada vez que se aade una pgina, sea en forma
La clase FPDF dispone de la # manual o en forma automtica.
funcin: # Nos permite insertar los encabezados de todas las pginas del
$obj->MuliCell(a,h,text,b,aln,r) # documento
function Header(){
donde a es el ancho de la celda (si #insertamos un salto de lnea de 2 mm. a partir
se indica cero ocupar hasta el #del margen superior
margen derecho de la pgina), h $this->Ln(2);
es el alto de cada una de las # establecmos color y estilo de letra del encabezado
celdas aunque, en la prctica, se $this->SetTextColor(0,0,0);
comporta de forma idntica al
$this->SetFont("Times","I", 11);
interlineado de un procesador de
textos), text es la cadena de texto
# establecemos una celda cuyo ancho es cero
(o variable que lo contiene) a # de esta forma se extender hasta el margen derecho
insertar. # ocupando toda la caja de texto de la pgina.
# le ponemos unicamente brode inferior, texto centrado
b es un parmetro que puede # sin relleno y le adjudicamos como parmetro de posicin
valer: 0 (sin bordes); 1 (con # de la celda siguiente 1 de forma que comience en el margen
bordes), y tambin: L (borde por # izquierdo de una lnea nueva
el lateral izquierdo de la celda); T $this->Cell(0,8,"La Regenta",'B',1,'C',0);
(borde por la parte superior), R
# colocamos un salto de lnes de 3 milimetros para separar el
(lnea de borde en el margen
# encabezado de los textos de la pgina
derecho), B (lnea de borde en la
parte inferior) agrupaciones de $this->Ln(3);
estos ltimos valores, en cualquier }
orden, tales como: LR TB, # incluimos la funcion Footer (debe ser definida con este nombre)
etctera. # para insertar pies de pgina cada vez que cree una pgina nueva
function Footer(){
El parmetro aln indica la $this->Ln(2);
alineacin horizontal que han de $this->SetTextColor(0,0,0);
tener los textos y permite los
$this->SetFont("Arial","I", 9);
valores: L (izquierda); C (centro);
# en este caso incluimos el nmero de pgina con un borde superior
R (derecha) J (justificado).
# de la celda, texto centrado y tambien activando la celda
Por ltimo, el parmetro r siguiente
(relleno) especifica si a las celdas # de modo que se produzca un saldo de lnea
se les aplicar (valor 1) un color $this->Cell(0,5,"Pgina ".$this->PageNo(),'T',1,'C',0);
de fondo o si se va a tratar (valor }
0) de un fondo transparente. }
# acabada la insercin de la clase extendida continuamos con el cdigo
El comportamiento de esta funcin
tiene las siguientes
# establecemos las dimensiones del documento
particularidades: $dimensiones=array (140,200);
# creamos un nuevo objeto pero cuidado! utilizaremos
Inserta los saltos de lnea # la clase extendida GranPDF
contenidos en el fichero origen y $MiPDF=new GranPDF('P','mm',$dimensiones);
los incluidos en la cadena de texto # ajustamos al 100% la visualizacin
mediante la secuencia de escape $MiPDF->SetDisplayMode('fullpage');
\n. # aadimos la primera pgina del documento. La ejecucin de esta funcin
Inserta saltos de lnea # disparar la ejecucin de las funciones Header() y Footer() de la
automticos en el momento en # clase extendida y, por tanto, incluir en el documento los encabezados
que el texto alcanza el borde # y pies de pgina all establecidos
derecho de la celda. $MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
Si AutoPageBreak est activado $MiPDF->SetFont('Times','',12);
inserta saltos de pgina # leemos un fichero de texto y lo recogemos en una variables
automticos en el momento en
$f1=fopen('regenta.txt','r');
que el texto alcanza el margen
$regenta1=fread($f1,filesize('regenta.txt'));
inferior de la pgina.
fclose($f1);
# insertamos el fichero mediante Multicell
Encabezados # el ancho 0 establece que la celda ocupar desde el margen
y pies de pgina # izquierdo hasta el derecho. La interlinea ser de 4mm.
# el texto que se incluir (con salto de lnea automtico
La clase FPDF contiene dos # e insercin automtica de nuevas pginas) ser el recogido
mtodos (funciones) llamados: # del fichero de texto. La celda no tendr bordes
Header() y Footer(). # el texto estar justificado y no tendr relleno de fondo.
$MiPDF->Multicell(0,4,$regenta1,0,'J',0);
Si editamos el fichero fpdf.php # establecemos la visualizacin del documento
podemos ver que ambas estn
$MiPDF->Output();?>
vacas (no contienen ninguna
instruccin) presentando una
sintaxis como esta: Ejemplo141.php
function Header(){
// comentario
} El ejemplo siguiente es una adaptacin del ejemplo139 al uso de encabezados y pies de
y pgina.
function Footer(){ Ver cdigo fuente ejemplo142.php
// comentario
}
Ambas son invocadas de forma
automtica cada vez que se
<?
ejecuta la funcin AddPage() y,
# incluimos la clase fpdf.php y la constante FPDF_FONTPATH
eso permite crear otras funciones
include("fpdf.php");
a medida, con igual nombre, e
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
incluirlas en una clase extendida.
# creamos la clase GranPDF extendida de fpdf.php
Recuerda que los mtodos de la class GranPDF extends FPDF {
clase extendida prevalecen sobre # definimos dos nuevas variables internas
los que pudieran existir en la clase # el identificador de la columna actual
padre con su mismo nombre. Por # y el valor de la ordenada de inicio de las columnas
esta razn, las nuevas funciones var $columna_actual=0;
de la clase extendida nos var $ordenada_inicio=21;
permitiran incluir encabezados y
# la funcin Header se comporta de forma idntica al ejemplo anterior
pies de pgina en cada una de las
function Header(){
nuevas pginas aadidas mediante
AddPage(). $this->SetTextColor(0,0,0);
$this->SetFont("Times","I", 11);
El procedimiento sera este: $this->Cell(0,8,"La Regenta",'B',1,'C',0);
$this->Ln(3);
Creamos una clase extendida de }
la clase original FPDF. # Footer es similar al caso anterior con la nica diferencia que
Incluimos en esta nueva clase function Footer(){
funciones con nombres Header() $this->SetY(-20);
y Footer() (no podemos modificar $this->Ln(2);
el nombre ya que han de coincidir $this->SetTextColor(0,0,0);
con los nombres de las funciones $this->SetFont("Arial","I", 9);
vacias de la clase padre) en las $this->Cell(0,5,"Pgina ".$this->PageNo(),'T',1,'C',0);
que indicamos los contenidos que }
han de insertarse (y su posicin) function AcceptPageBreak(){
mediante cada una de ellas. Al # al alcanzar el margen inferior se activa esta funcin
crear el nuevo objeto mediante:
# que comprueba si el punto de insercin est en la columna
$obj= new nombre_clase() # primera (0) en la segunda
if($this->$columna_actual==0){
utilizaremos el nombre el de la # cambia el valor del nmero de columna a 1 (pasa a la segunda)
clase extendida que hemos $this->$columna_actual=1;
creado para incluir estas funciones. # cambia el punto de insercin a la coordenada de inicio
# que es la parte superior de la pgina
De esta forma, cada vez que se
ejecuta AddPage() (aadir una $this->SetY($this->ordenada_inicio);
nueva pgina) se ejecutarn # cambia el margen izquierdo de modo que el texto
tambin Header() y Footer() que, # aparezca en la columna derecha (a partir de los 72.5 mm).
al no ser ya funciones vacas, # ms abajo est comentada la razon de estos valores
realizarn una inclusin de $this->SetLeftMargin(72.5);
contenidos en cada una de las # cambia el punto de insercion al nuevo margen izquierdo
pginas del documento. $this->SetX(72.5);
# establecemos que la funcin devuelva false
Gestin de la insercin # con ello no se produce un salto de pgina
automtica de pginas # y el punto de insercin se translada a las
# coordenadas indicadas en las instrucciones anteriores
return false;
La clase FPDF contiene esta
}else{
funcin:
# si la columna es la segunda (no es la cero)
function AcceptPageBreak(){ # cambia a la primera, asigna el valor cero
// comentario $this->$columna_actual=0;
return $this->AutoPageBreak; # cambia el punto de insercin a la coordenada de inicio
} # que es la parte superior de la pgina
$this->SetY($this->ordenada_inicio);
que igual que ocurra con Header()
# cambia el margen izquierdo de modo que el texto
y Footer() es invocada en el
# aparezca en la columna izquierda (a partir de los 10 mm).
momento en que encuentra un
salto de pgina y dependiendo del $this->SetLeftMargin(10);
valor que devuelva (true false) # cambia el punto de insercion al nuevo margen izquierdo
se ejecuta no la funcion AddPage $this->SetX(10);
(). # establecemos que la funcin devuelva true
# con ello genera un salto de pgina
Tal como est diseada esta clase # y la insercion de texto continua en la pagina siguiente
devolver el valor que tenga return true;
asignado AutoPageBreak() (true }
false) pero, igual que ocurra con
}
Header() y Footer() permite incluir
otra funcin con el mismo nombre }
en una clase extendida. La /* establecemos el tamao de la pgina
condicin de la nueva funcin es que tendr 140 mm. de ancho.
que, al igual que ocurre con esta, Si establecemos un margen por la izquierda de 10 mm.
habr de devolver un valor un margen por la derecha de otros 10 mm.
booleano (cierto falso). y un espacio entre columnas de 5 mm. nos restan
140-25=115 mm. que repartidos entre dos columnas
Esta posibilidad aade nuevas e les daran un ancho de 115/2=57,5 mm.
interesantes funcionalidades al uso
Las primera columna comenzar en 10 y acabar en
de la clase FPDF. Una de las
posibilidades podra ser la de crear
10 +57,5=67.5 mm. La segunda deber empezar en
documentos con varias columnas 72.5 (aadiendo 5 mm. de espacio entre columnas */
(estilo periodstico). La forma de $dimensiones=array (140,200);
proceder (una de las posibles) la # creamos el nuevo objeto partiendo de la clase ampliada
tienes descrita en el ejemplo que $MiPDF=new GranPDF('P','mm',$dimensiones);
hemos incluido a la derecha. # ajustamos al 100% la visualizacin
$MiPDF->SetDisplayMode('fullpage');
Otras opciones # insertamos la primera pgina del documento
$MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
Adems de las funciones que
$MiPDF->SetFont('Times','',12);
hemos descrito a lo largo de esta
# establecemos un color de fondo para las celdas de texto
pgina, existen clases extendidas
que incluyen nuevas, y en algunos # y el color de la tipografia
casos muy interesantes, funciones $MiPDF->SetFillColor(240,240,240);
que resuelven problemas $MiPDF->SetTextColor(0,0,0);
especficos concretos a la hora de # leemos un fichero de texto y lo recogemos en una variables
crear ficheros PDF. Algunas de $f1=fopen('regenta.txt','r');
ellas estn disponibles desde el $regenta1=fread($f1,filesize('regenta.txt'));
propio sitio FPDF de Olivier
fclose($f1);
PLATHEY. # insertamos el fichero mediante Multicell
Una de las utilidades ms # el ancho 57.5 estable el ancho de columna igual
interesantes -desde luego que ni # para la derecha que para la izquierda La interlinea ser de 4mm.
mucho menos nicas- de este tipo # el texto que se incluir (con salto de lnea automtico
de formatos podra ser la # e insercin automtica de nuevas pginas cuando se hayan completado
paginacin de los resultados de las # las dos columnas) ser el recogido
consultas en bases de datos. # del fichero de texto. La celda no tendr bordes
# el texto estar justificado y SI tendr relleno de fondo.
Cuando nos encontremos en esa $MiPDF->Multicell(57.5,4,$regenta1,0,'J',1);
situacin podremos utilizar un
# establecemos la visualizacin del documento
procedimiento casi idntico al
usado en el ejemplo sobre las $MiPDF->Output();?>
tablas de alimentos.

No importara el tamao del


fichero de texto (nmero de
Ejemplo143.php
pginas que pudiera ocupar) ni el
nmero de registros obtenidos
como resultado de una consulta a Ejercicio n 37
una base de datos. Sera la propia
clase FPDF quien se encargara de Crea un documento PDF en formato A-5 con orientacin vertical. Debe incluir un encabezado
crear las pginas necesarias de un
(a modo de logotipo) compuesto por un dibujo creado mediante la funciones PDF. Adems,
documento con un formato
preestablecido. habr de incluir un texto enmarcado y una fotografa centrada en el documento.

Anterior Indice Siguiente


Aadir nuevas fuentes para PDF

Programas necesarios
Proceso de generacin de fuentes
Esta primera imagen es la visualizacin del directorio fuentes de estos materiales. Podrs
Para generar las nuevas fuentes es observar que contiene fuentes TrueType y el ejecutable ttf2pt1.
necesario disponer del programa
ttf2pt1.exe. Si accedemos a este Hemos incluido dos fuentes TrueType llamadas bobcayge.ttf y bobcaygr.ttf. Sern las que
enlace podemos ver, en la zona de utilizaremos para aadir nuevas opciones de fuentes a nuestros PDF's.
descargas, una opcin dnde dice
Complete package, except sources
desde el que podemos descargar el
fichero ttf2pt1-3.4.4.exe.

Al ejecutar este instalador, con la


opcin por defecto, nos crear un
directorio llamado GnuWin32 (en
Archivos de Programa) dentro del
cual encontramos un directorio Cuidado!
llamado bin en el que se
encuentra el ejectuable ttf2pt1. No es necesario que realices la instalacin de ttf2pt1-3.4.4.exe comentada al margen. En el
subdirectorio fuentes de estos materiales ya dispones del fichero ttf2pt1.
El resto de las opciones de esta
distribucin no son necesarias para
nuestros fines.
Creacin del fichero .afm
Creacin del fichero .afm
Desde la ventana de MS-DOS y una vez elegido el directorio que contiene el ejecutable
ttf2pt1 podemos crear el fichero .afm usando la siguiente sintaxis:
Este fichero, cuya extensin es el
acrnimo de Adobe Font Metric
ttf2pt1 -anombre_de_la_fuente_TrueType.ttf nombre_del_nuevo_fichero
contiene las informacin sobre
ancho, alto y kerning de cada
carcter de una fuente.

El primer paso ha de ser la


creacin de ese fichero. El
procedimiento para hacerlo es el
que tienes descrito al margen.

Cuidado!

En el directorio fuentes
tienes los ficheros cayge.
afm y caygr.afm generados
segn el proceso descrito al
margen.
Nos generar dos ficheros con el nombre asignado al nuevo fichero y extensiones .afm
y .t1a tal como puedes ver en la imagen.
Definicin de las fuentes

El directorio fontsPDF de estos


materiales (recuerda que es el
fruto de renombrar el directorio
font extraido del fichero de Creacin del fichero de definicin de fuente
instalacin de la clase FPDF)
contiene otro subdirectorio Este es un ejemplo de script que permitira definir nuevas fuentes mediante la utilidad
(makefont) que incluye un script makefont.
llamado makefont.php. La
definicin de fuentes requiere la
ejecuacin de una de las funciones <?
que contiene ese script llamada # incluimos el fichero makefont.php que est
MakeFont() y que utiliza los # en la ruta que se especifica (si lo tuvieramos en otra
siguientes parmetros: # ubicacin bastara cambiar el path del include
include("c:/Apache/htdocs/cursoPHP/fontsPDF/
MakeFont(f1, f2, c, p, tipo)
makefont/makefont.php");
donde f1 es el nombre y path de la # ejecutamos la funcin MakeFont indicando como parametros
fuente TrueType a utilizar (fichero . # la ruta y el fichero ttf a convertir(la fuente trueType)
ttf), f2 es el nombre del fichero . # y como segundo parmetro la ruta y el nombre del fichero afm
afm creado para esta misma # creado en el proceso anterior
fuente mediante ttf2pt1. Estos MakeFont("c:/Apache/htdocs/cursoPHP/fuentes/bobcaygr.ttf",
dos parmetros son obligatorios. "c:/Apache/htdocs/cursoPHP/fuentes/caygr.afm");
?>
Mediante el parmetro c (opcional)
se especifica el tipo de codificacin
(el mapa de fuentes a utilizar). Si
no se indica el valor por defecto Al ejecutar el script anterior puede ocurrir que, dependiendo de la fuente ttf que
sera cp1252. estemos utilizando, aparezcan mensajes de advertencia como los que ves en esta imagen.
El parmetro opcional c permite
cambiar la codificacin de algunos
caracteres, y, mediante tipo
puede indicarse el tipo de fuente
original (por defecto se asigna
TrueType).

La definicin de nuevas fuentes


requiere la ejecucin de la funcin Significara que algunos tipos (generalmente los asociados a los caracteres ASCII
MakeFont. Para ello, una de las ampliados) no estaran disponibles y que, en consecuencia, o no se visualizaran o se
opciones, es utilizar un script como visualizaran de forma incorrecta.
el que ves a la derecha. En una
primera instruccin se incluye el Una vez creados los ficheros como las nuevas fuentes es necesario incluirlos en el
fichero makefont.php y en la
directorio fontsPDF de modo que estn disponibles a la hora de crear los documentos PDF.
segunda se hace una llamada a la
funcin nicamente con los
parmetros obligatorios.

La ejecucin de ese script dara


como resultado la creacin de dos
ficheros con el mismo nombre.
Uno de ellos con extensin .z y el
otro con extensin .php. Ambos,
para que puedan ser usados por la
clase FPDF, debern ser incluidos
en el directorio fontsPDF. Ejemplo de utilizacin

Diferentes tipografas La utilizacin de nuevas fuentes requiere que

Lo habitual es que entre las objeto->AddFont(nombre_a_utilizar, estilo, fichero_fuente.php)


fuentes TrueType de un tipo
determinado existan varios donde el nombre_a_utilizar puede ser cualquiera, el parmetro estilo puede ser la cadena
ficheros. Uno para la fuente vaca y el tercer parmetro es el nombre y extensin del fichero .php que contiene la
normal, otro para la cursiva, definicin de la fuente y que fu creado por medio de makefont.
etctera. Cuando se trabaja con
este tipo de fuentes y se pretende Si se omite el tercer parmetro ser asignado, de forma automtica, la cadena
usar estilos distintos lo aconsejable formada por la unin las cadenas nombre_a_utilizar y estilo, agregndole la extensin .
es definir una fuente para cada php.
tipo y tratarlos, a la hora de
escribir el cdigo de los script
como fuentes independientes. <?
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
De esta forma podramos tener # con el mismo criterio comentado en el ejemplo anterior
parejas de ficheros del estilo: include("fpdf.php");
fxx_normal.z y fxx_normal.php; define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
fxx_cursiva.z y fxx_cursiva.php, /* establecemos las dimensiones del documento
etctera. A la hora de utilizarlas se creamos un nuevo objeto y aadimos una pgina*/
hara como si se tratara de fuentes
$dimensiones=array (140,200);
de distintas familias y habra de
$MiPDF=new FPDF('P','mm',$dimensiones);
evitarse incluir el estilo en SetFont.
# ajustamos al 100% la visualizacin
La sintaxis de la asignacin de $MiPDF->SetDisplayMode('real');
fuentes habra de ser: #insertamos una pgina en blanco
$MiPDF->Addpage();
$obj->SetFont("nombre","", 9); # establecemos el color de la letra
dejando el valor del segundo
$MiPDF->SetTextColor(255,0,0);
parmetro (estilo) como una # aadimos la nueva fuente. Podemos ponerle un nombre cualquiera
cadena vaca. La nica excepcin a # Al no incluir estilo considerar el estilo normal
esta norma sera el caso del $MiPDF->AddFont('fuentenueva1','','cayge.php');
subrayadado que no requiere otra # a indicar SetFont habremos de utilizar el mismo nombre de fuente
cosa que asignar el valor U al # establecido mediante AddFont
parmetro estilo. $MiPDF->SetFont('fuentenueva1','',24);
$MiPDF->Multicell(0,10,"Prueba de la fuente que hemos
Precauciones con las llamado fuente nueva1",1,'L',0);
fuentes $MiPDF->Ln(10);
# incluimos la fuente caygr.php con nombre fuentenueva2
$MiPDF->AddFont('fuentenueva2','','caygr.php');
El uso de fuentes externas puede $MiPDF->SetFont('fuentenueva2','',24);>
producir efectos indeseados si, por
$MiPDF->Multicell(0,10,"Prueba de la fuente que hemos
alguna circunstancia, tal como
ocurre en los ejemplos la fuente llamado fuente nueva2",1,'R',0);
utilizada carece de alguno $MiPDF->Output();
carcteres (ees, letras con tilde, ?>
smbolos). Conviene tenerlo en
cuenta para evitar que la eleccin
de una tipografa pueda afectar a
los contenidos del documento. Ejemplo144.php

En estos dos ejemplos pueden verse los resultados -con algunos problemas grficos- de
la sustitucin de las fuentes en algunos de los ejemplos de pginas anteriores.

ejemplo145.php ejemplo146.php

Anterior Indice Siguiente


Header's y visualizacin

Qu es un header?
Utilizacin de header
En este ejemplo se utilizan algunas header e incluimos como comentarios las
En un documento PHP se pueden utilidades de cada una de ellas
incluir instrucciones que obliguen
al navegador del cliente a
comportarse de una manera <?
determinada. #esta variable recoge el nombre del fichero a visualizar
$fichero="ejemplo132.pdf";
Esas instrucciones que dicen al #esta funcin determina la longitud en bytes del fichero
navegador del cliente cmo tiene $len = filesize($fichero);
que comportarse, van contenidas /* esta cabecera -vlida para HTTP/1.1- ordena al navegador
en la header de la pgina y que no permita guardar la pgina
pueden resultar muy tiles como
que no permita que se almecene en la cach del cliente*/
complemento de otras funciones.
header("Cache-Control: no-store, no-cache, must-revalidate");
Su nombre se debe a que han de /* esta otra cabecera -vlida para HTTP/1.0
ser obligatoriamente lo primero indica al navegador que no guarde la pgina en la cach del cliente
que ha de recibir el navegador en he puesto ambas opciones para cubrir todo el especto probable */
el momento de ser atendida su header("Pragma: no-cache");
peticin. El grado de exigencia de /* esta cabecera especifica al navegador el contenido
esta condicin es tal que ni que va a recibir que en este caso no sera otra cosa
siquiera se permite que les que algo que requiere una aplicacion capaz de interpretar
preceda ni una lnea en blanco.
ficheros pdf */
header("Content-type: application/pdf");
Cmo colocar las /* como la norma de los headers establece que
cabeceras? siempre que se conozca el tamao del contenido enviado
se incluya en la cabecera ese contenido, pues...
Los header han de colocarse de incluimos el tamao ya que "filesize" nos midi el fichero
forma que sus contenidos sean lo y guardo esa medida en la variable $len...
primero que aparezca en la pgina pero... fue posible utilizar esa funcin antes de las header
que llega al cliente y eso significa porque esa medida no fue mandada a la salida...
que: si hubiramos escrito antes de los header... algo as como
Echo $len; ... la habramos fastidiado...
No puede aparecer delante de un ya habramos tenido error en las cabeceras...*/
header ninguna etiqueta HTML ni
header("Content-Length: $len");
ningn contenido de este tipo.
/* con esta otra header indicamos ls forma de presentacin de
Ni siquiera se permite que se les el contenido del documento... permite dos posibilidades
anteponga una lnea en blanco. inline (la que he puesto aqu) o
attachment (que seria como fichero anexo)
Requieren muchsima atencin y fijate que en este "header" he puesto en filename un nombre distinto
cerciorarse siempre de que la del que tena el fichero original... eso no tiene importancia
marca del comienzo del script PHP
solo ser el nombre con el que se guardar en la cach del cliente
(<?) est siempre en la primera
lnea del documento, sin dejar
en el caso de que no hubiramos incluido la cabecera "no cache"
lneas en blanco delante de ella. que dicho sea de paso... la he puesto aqu como ejemplo
pero que seran absolutamente innecesarias para este ejemplo
Puede que te preguntes: ha de ir de visualizacin del documento */
tambin en la primera lnea del header("Content-Disposition: inline; filename=felipe.pdf");
script PHP? /* ya se acabaron las cabeceras del documento
aqu le decimos al servidor que lea el fichero y lo envie
La respuesta es esta: tienen que ir
al navegador del cliente... este ya lo interpretar
antes de la primera funcin que
genere una salida hacie el siguiendo las especificaciones que le hemos incluido
navegador del cliente. las cabeceras....*/
readfile($fichero);
Intentaremos aclarar esta idea. ?>
Los scripts PHP (lo contenido
entre <? y ?>) se ejecutan en el ejemplo148.php
servidor y de ellos slo llegan al
navegador del cliente los
resultados de la ejecucin (las Visualizacin ficheros PDF creados en memoria
salidas echo o print, por citar dos
ejemplos). <?
Las cabeceras han de llegar al # Creamos el PDF con las nuevas funcionesn>
navegador antes que esas posibles $g = PDF_new();
salidas, lo cual no es bice para pdf_open_file($g);
que se puedan efectuar antes de # A partir de aqu todo es igual a los ejemplos anteriores
insertar las headers procesos que pdf_begin_page($g, 595, 842);
no produzcan salidas de tipo print, $imagen1 = pdf_open_jpeg($g, "./images/cruz.jpg");
echo, etctera. $h=0.5;
$v=0.8;
La sintaxis de algunas header vara
en algunos casos lo podemos ver
pdf_save($g);
en el ejemplo segn el protocolo $x1 = pdf_get_value($g, "imagewidth", $imagen1);
que utilice el servidor. Lo habitual $y1 = pdf_get_value($g, "imageheight", $imagen1);
es que lo servidores utilicen uno pdf_scale($g,$h,$v);
de estos: HTTP/1.1 HTTP/1.0. pdf_place_image($g, $imagen1, ((595/$h-$x1)/2), (842/$v-$y1), 1.0);
pdf_close_image ($g,$imagen1);
Para saber cul utiliza nuestro pdf_restore($g);
servidor basta con visualizar el info. pdf_save($g);
php y buscar la directiva $imagen2 = pdf_open_gif($g, "./images/cruz.gif");
SERVER_PROTOCOL. $ancho=150;
$alto=325;
Los diferentes haeder $x1 = pdf_get_value($g, "imagewidth", $imagen2);
$y1 = pdf_get_value($g, "imageheight", $imagen2);
$h=$ancho/$x1;
En los ejemplos que aparecen en
la columna de la derecha estn $v=$alto/$y1;
comentadas algunas de las pdf_scale($g,$h,$v);
cabeceras que es posible insertar pdf_place_image($g, $imagen2, ((595/$h-$x1)/2), 200, 1.0);
en los ficheros PHP. pdf_close_image ($g,$imagen2);
pdf_restore($g);
Cabra aadir la siguiente:
PDF_end_page($g);
header("Location:direccin") pdf_close($g);
# Despus del pdf_close empezamos la lectura del buffer
Mediante este header se $buffer = PDF_get_buffer($g);
redirecciona el navegador a la URL /* Esta porcin de cdigo es idntica a la del ejemplo anterior
(absoluta o relativa) que se con la nica diferencia que ahora medimos la longitud de la cadena
indicada en el parmetro direccin.
buffer en vez de la longitud de un fichero como hacamos all */
Cuando el navegador recibe un $len = strlen($buffer);
header de este tipo realiza de Header("Content-type: application/pdf");
forma automtica la peticin de la Header("Content-Length: $len");
pgina indicada en l. Header("Content-Disposition: inline; filename=loquesea.pdf");
# Escribimos en el documento que se enviar al cliente
Otra funciones PDF # el contenido de la cadena buffer
echo $buffer;
/* liberamos la memoria que contena el fichero
Existe una funcin muy til para con lo cual el documento solo aparecer en el navegador del cliente
un montn de propsitos que PHP
y en la cach de este (con el nombre loquesea.pdf).
empez a incluir a partir de la
versin 4.0.5. Se trata de la Si no queremos que se almacene en la cach sera solo cuestin de
funcin incluir las cabeceras no cach del ejemplo anterior */
pdf_delete($g);
$b=pdf_get_buffer($p) ?>
Esta funcin recoge en una
variable $b el contenido de un ejemplo149.php
documento PDF -identificado por
$p- pudiendo enviarlo al
navegador directamente desde la Una opcin alternativa
memoria del servidor y que, por
tanto, no necesita ser escrito ni En el caso de que no sea posible utilizar las funciones anteriores por incompatibilidad
almacenado en el servidor. de versiones PHP o de las propias libreras PDF, se puede recurrir a un truco. Se trata de
escribir el fichero PDF en servidor, enviarlo al cliente y, posteriormente, borrarlo. Ello
La utilizacin de esa funcin servira, al menos, para economizar espacio de almacenamiento en el servidor.
requiere una modificacin en la
sintaxis -respecto a la de los
ejemplos anteriores- y el uso de <?
dos funciones nuevas, que son: # creo un fichero de la misma forma que
# lo hacamos en ejemplo de pginas anteriores
$p=pdf_new() $filename="leocadio.pdf";
$f = fopen($filename, "w");
que es la funcin que generar un
identificador de recurso, distinto $g = pdf_open($f);
de los que hemos venido utilizando pdf_begin_page($g, 595, 842);
hasta ahora, ($p) para el nuevo /* aqui insertaramos el cdigo
fichero PDF y que debe insertarse para la generacin del pdf.
delante de: En este caso lo cerramos en blanco */

pdf_open_file($p) PDF_end_page($g);
que abrira un fichero pdf en
pdf_close($g);
memoria. # cerramos el fichero leocadio.pdf
fclose($f);
Como observars esta sintaxis /* ahora insertamos exactemente el codigo
difiere de la que hemos venido del primer ejemplo de esta pgina.
utilizando hasta ahora y que era la Fijate que pese a haber escrito un montn de cdigo
siguiente: aun estamos a tiempo de insertar las funciones de cabecera
ya que NO HE ENVIADO AUN NINGUNA SALIDA AL NAVEGADOR
$f = fopen(nombre, "w");
$g = pdf_open($f) eso s, no olvides que delante de <? no puede haber
ninguna linea en blanco...*/
Con esta sintaxis, crebamos $len = filesize($filename);
(mediante la funcin fopen) un header("Content-type: application/pdf");
documento en el servidor y su header("Content-Length: $len");
identificador de recurso ($f); header("Content-Disposition: inline; filename=felipe.pdf");
luego, creabmos un segundo readfile($filename);
identificador de recurso $g por
/* ahora que ya he enviado
medio de pdf_open que
el contenido del fichero pdf al navegador
asocibamos con el anterior para
que los resultados de las funciones ya puedo borrar el fichero del servidor
pdf se fueran escri- biendo en el unlink($filename);
fichero abierto con la primera /* como habrs observado
instruccin. se trata de una chapuza en tres actos
1.- Cramos el fichero en el servidor y lo cerramos
Ahora no necesitamos crear 2.- Leemos el contenido del fichero
ningn documento y bastar con 3.- Borramos el fichero del servidor */
un solo identificador de recurso, ?>
que es, la salida de la funcin
pdf_new.
ejemplo150.php

Anterior Indice Siguiente


Ficheros MySQL

La aplicacin MySql
Organizacin de la informacin

Una de las opciones ms tiles de Hemos instalado MySQL en el directorio c:\mysql y durante el proceso de instalacin
PHP es la posibilidad de gestionar se cre un subdirectorio llamado data que es el destinado a albergar todas las bases de
bases de datos en ordenadores datos que vayamos creando.
remotos.
Como puedes ver en la tabla siguiente, durante la instalacin se crearon dos bases de
Existen multitud de programas de datos llamadas mysql y test.
servidores de bases de datos y
PHP dispone de funciones para el El directorio MySQL
manejo de muchos de ellos tales
como:

FilePro
dBase
DBM
Microsoft SQL
PostgreSQL
mSQL
InterBase
MySQL

Nuestra opcin por MySQL


obedece a que es uno de los
gestores de bases de datos SQL
ms populares, es muy eficiente y,
adems, es gratuito (Open Source).
Las carpetas del subdirectorio data de c:\mysql Cada una de las tablas que contiene una
El sintagma SQL es el acrnimo de corresponden a cada una de las bases de datos que base de datos tiene tres ficheros con
Structured Query Language, es contiene extensiones .frm, MYD y MYI
decir, Lenguaje estructurado de
consultas.
Los ficheros con extensin .frm contienen la estructura de cada tabla, los MYD los
datos y los que tienen extensin .MYI contienen los ndices de esa tabla.
Bases de datos y tablas
En la instalacin tambin se crearon seis tablas en la base de datos mysql. Sus
Como habrs podido ver en la nombres puedes verlos en la imagen son: user, db, func, host, tables_priv y
columna de la derecha, una base columns_priv.
de datos no es otra cosa que un
directorio que contiene tablas. La tabla user la ms importante para nuestros fines contiene informacin sobre los
usuarios, desde qu mquinas pueden acceder a nuestro servidor MySQL, sus claves y
Las tablas son las que contienen contraseas y los permisos de acceso de cada uno de ellos.
los datos y en consecuencia son el
elemento verdaderamente Las restantes contienen informacin sobre las mquinas que pueden acceder al
importante, dado que no es sistema, las bases de datos a las que tendr acceso cada usuario y las limitaciones o
demasiado relevante que esos restricciones que eventualmente pudieran establecerse.
datos estn en uno u otro
directorio, lo verdaderamente
importante es que estn y que Cuidado!
sean accesibles y manejables.
El uso de los tres ficheros anteriores, es condicin de las tablas tipo MyISAM que es el tipo,
Si es este tu primer contacto con por defecto, que utiliza MySQL 4.0. Otros tipos, que veremos en temas posteriores, tales
el mundo de las bases de datos, como InnoDB almacenan la informacin con una estructura diferente.
quiz sea importante conocer su
argot ya que en adelante
tendremos que referirnos a tablas,
campos, registros e ndices y quiz La tabla user
no est de ms explicar un poco
esas ideas. Activemos nuestro servidor MySQl que, como recordars, arrancaba pulsando en el
Pensemos en la base de datos icono winmysqladmin.exe situado en c:\mysql\bin y que, como recordars tambin,
directorio como un armario nos colocaba un semforo verde en la parte derecha de la barra del men de Windows.
archivador de nuestro Centro e
imaginemos que dentro de l hay Una vez activo el servidor MySQL ya podemos utilizar phpMyAdmin. Lo habamos
una serie de cajones tablas en instalado en un subdirectorio de htdocs llamado myadmin. As que accedamos a travs
los que se puede guardar una de la direccin: http://localhost/MyAdmin/ y se nos abrir una pgina como la que sigue:
buena cantidad de documentos
con formato idntico registros
tales como: matrculas, fichas de PHPmyAdmin
alumnos, etctera.

Cada uno de estos tipos de


documento tendra las mismas
casillas campos, con la nica
diferencia de que los datos
contenidos en esos campos de
igual forma, dimensin y tamao
en todos los registros seran los
que diferenciaran un documento
de otro.

En una tabla MySQL el fichero con


extensin .frm contiene
precisamente el documento
original de los registros y, de la
misma forma que ocurre con los Al seleccionar mysql en el men de la izquierda y pulsar sobre
Elegiremos la base de datos
impresos originales, contiene la mysql (en negro en la parte superior de la lista de tablas) aparecer
mysql
forma, dimensin y tamao de la lista que est a la derecha de esta imagen.
cada una de las casillas (campos)
de cada formulario (registro).
All vemos la tabla user y un enlace activo que dice Examinar. Si pulsamos sobre el
El fichero .MYD contiene los podremos ver un contenido similar a este que vemos aqu debajo.
datos, es decir todo lo que hay
escrito en cada una de las casillas
de cada uno de los impresos de
ese cajn (tabla) concreto.

No hemos aludido an a los


ficheros con extensin .MYI y son
un elemento importante.
Contienen los ndices, que como
su propio nombre indica cumplen
una funcin idntica a los ndices
de los libros. A travs de ellos
resulta mucho ms rpido
encontrar una determinada Como ves, hay tres usuarios y dos de ellos como nombre root y ninguna contrasea
informacin y al igual que ocurre han sido creados automticamente durante la instalacin. El tercero de ellos el usuario
con los libros ndice general, pepe es el que hemos creado durante el proceso de instalacin
onomstico, etctera pueden ser
varios y con contenidos distintos. Esta configuracin es insegura ya que con los nombres de usuario por defecto root y
sin contrasea cualquiera podra acceder y manipular las bases de datos.
Cmo empezar con las
bases de datos? Ms adelante podremos borrar esos usuarios pero, por el momento, dejmoslos as y
aadamos un nuevo usuario.
De igual modo que ocurrira en el Regresemos al men anterior y pulsemos en la opcin Insertar correspondiente a la
smil anterior, al instalar MySQL ya tabla user.
creamos el armario archivador el
directorio data y tambin dos
cajoncitos las bases de datos
mysql y test pero por pura
cuestin de orden vamos a
necesitar algn otro armario para
poder guardar nuestras cosas.

Lo razonable ser empezar


creando nuestros armarios (bases
de datos) para que
posteriormente podamos ir
diseando los documentos los
campos y la estructura de cada
uno de los tipos de impreso
(tablas) que vayamos a manejar.

Nuestras bases de datos

Utilizaremos dos bases de datos


distintas. Una de ellas a la que
llamaremos ejemplos contendr
todos los ejemplos que vayamos
desarrollando y la otra
practicas ser donde habrs de
insertar las tablas que irs
elaborando en los ejercicios y en laEscribamos localhost en el campo Host, jose en el campo User, josefa en el campo
Actividad Final del Curso. Password y marquemos todas las opciones una lista bastante larga por cierto como
YES (Y) y muy importante seleccionemos la funcin PASSWORD para el campo del
Los ejemplos an no estn creados mismo nombre.
y sers t quien lo vaya haciendo
medida que avancemos en esta Una vez realizado el proceso anterior deber quedarnos como aparece en la imagen.
parte del curso. Lo haremos de Pulsaremos en el botn Contine que hay al final de la pgina y habremos dado de alta al
forma muy similar a la que hemos
usuario jose con todos los privilegios para gestionar las bases de datos.
visto en pginas anteriores.

Segn vayamos desarrollando los


contenidos, insertaremos ejemplos
de cdigo fuente de forma similar
a la de temas anteriores y cuando
sea necesario crear bases de datos
o tablas pondremos un recuadro
rojo sobre el que debers ir
pulsando para auto generar los
ejemplos.

En tales casos, no olvides hacerlo


pues esa ser la forma en la que
progresivamente vayamos creando
elementos necesarios para ser
utilizados en los ejemplos
posteriores.

Si regresamos de nuevo a Examinar veremos que ya ha sido incluido el nuevo usuario


Servidores activos y que el campo contrasea aparece encriptado como consecuencia de haber aplicado la
funcin PASSWORD para garantizar la privacidad del usuario. MySQL requiere esta
De ahora en adelante, para seguir encriptacin.
el Curso vamos a necesitar tener
siempre activos tanto el servidor Respecto a los YES, la explicacin es sencilla. Esas opciones permiten habilitar
Apache como MySQL. De no permisos para determinadas operaciones dentro de las bases de datos y lo nico que
hacerlo as, nos aparecer un hemos hecho ha sido conceder todas la facultades de gestin al usuario pepe.
mensaje de error diciendo:

Can't connect to MySQL server on Creacin de un fichero INCLUDE


'localhost' (10061)

Si ello te ocurriera, comprueba el En los scripts PHP con los que manejemos las bases de datos vamos a necesitar
semforo. Probablemente esa ser insertar continuamente: nombre del servidor, nombre de usuario y contrasea.
la causa del error.
Tanto la comodidad como la privacidad que hemos mencionado en pginas anteriores
aconsejan guardar los datos de usuario en lugar seguro. As que vamos a crear un fichero
llammosle mysql.inc.php idntico al que tenemos aqu debajo,(podemos copiar y
pegar) y guardmoslo en nuestro directorio de seguridad que como recordars estaba
en c:\apache\seguridad.
<?
$mysql_server="localhost";
$mysql_login="pepe";
$mysql_pass="pepa";
?>

Anterior Indice Siguiente


Campos y conexiones

Conexin con el servidor


Automatizar la conexin
de bases de datos Con nuestros conocimientos sobre PHP ya estamos en condiciones de hacer ms
cmoda la conexin. Creemos una funcin que realice de forma automtica la conexin
Antes de empezar a trabajar con con MySQL y guardmosla en nuestro fichero mysql.inc.php
bases de datos es imprescindible
que ambos servidores Apache y
MySQL estn activos. <?
# estas son las variables anteriores
Como paso inmediato hemos de $mysql_server="localhost";
interconexionar ambos $mysql_login="pepe";
servidores de forma que sea $mysql_pass="pepa";
posible tranferir informacin de
uno a otro. # creemos una nueva variable $c sin asignarle ningn valor
Para ello es necesario utilizar
# para que pueda recoger el identificador de conexin
siempre una funcin PHP con la # una vez que se haya establecido esta
siguiente sintaxis:
$c;
$c=mysql_connect(h, u, p) # escribamos la funcin que hace la conexin
# como pretendemos que el valor del identificador
donde $c es la variable que recoge
# sea usado fuera de la funcin, para recuperar su valor
el identificador del enlace, h es
# pasaremos ese valor por referencia anteponiendo & al
la direccin del servidor de bases
de datos, ("localhost") , u es el # nombre de la variable
nombre de uno de los usuarios function conecta1(&$c){
registrados en la tabla user # para usar las variables anteriores en la funcion
("pepe" o "root") y p la # hemos de definirlas como globales
contrasea (en nuestro caso global $mysql_server, $mysql_login, $mysql_pass;
"pepa" "") . if($c=mysql_connect($mysql_server,$mysql_login,$mysql_pass)){
print "<br>Conexin establecida<br>";
Estos tres valores cadenas de
}else{
texto deben ir escritos entre
print "<br>No ha podido realizarse la conexin<br>";
comillas.
# el exit lo incluimos para que deje de ejecutarse
Para cerrar la conexin, tenemos # el script si no se establece la conexin
que insertar: exit();
}
$c=mysql_close ($c) }
donde $c es el nombre de la
variable en la que se recogi el # esta funcin asignar a $c el valor del identificador
indentificador del enlace en el
momento de la apertura. # repetimos la misma funcin con otro nombre
# ahora quitaremos el mensaje de conexin establecida
Aqu tienes el cdigo de un script # consideraremos que si no hay mensaje se ha establecido
que realiza la apertura de una # asi quedar limpia nuestra pgina
conexin y despus la cierra.
function conecta2(&$c){
Y aqu puedes comprobar el
global $mysql_server, $mysql_login, $mysql_pass;
funcionamiento del script anterior.
if($c=mysql_connect($mysql_server,$mysql_login,$mysql_pass)){
Si realizramos una segunda }else{
conexin (con los mismos print "<br>No ha podido realizarse la conexin<br>";
argumentos) sin haber cerrado la exit();
anterior no se efectuar un }
nuevo enlace sino que nos }
devolver el ya abierto. ?>
Sintaxis alternativa
Si sustituyes el contenido de tu mysql.inc.php por el que tienes aqu arriba puedes
Otra forma de efectuar la conexin eliminar la lneas de comentario al hacerlo estaremos en disposicin de ejecutar scripts
es utilizar los valores registrados como este.
en el fichero mysql.inc.php lo
hemos creado en la pgina En este ejemplo utilizaremos la primera funcin:
anterior y eso requiere que
insertemos un include("c:..."),
Ver cdigo fuente Ejecutar ejemplo
indicando la ruta completa de
seguridad y el nombre del fichero
en el que hemos guardado las y ahora haremos uso de la segunda
claves y que era mysql.inc.php.
Ver cdigo fuente Ejecutar ejemplo
En este supuesto como valores de
los parmetros h, u y p
pondremos los nombres de las
variables: Tipos de campos en MySQL
$mysql_server
$mysql_login y MySQL tiene habilitados diversos tipos de campos que en una primera aproximacin
$mysql_pass podran clasificarse en tres grupos:
sin encerrarlas entre comillas.

Aqu tienes el cdigo de un script Campos numricos


que realiza la apertura de una Campos de fecha
conexin y despus la cierra. Campos de cadenas de caracteres
Desde este enlace puedes
comprobar su funcionamiento.
Campos numricos
La instruccin OR DIE
MySQL soporta los tipos numricos exactos(INTEGER, NUMERIC, DECIMAL, y SMALLINT)
y los tipos numricos aproximados (FLOAT, DOUBLE precision y REAL).
Es esta una buena ocasin para
hablar de una instruccin PHP que
Los campos que contienen nmeros enteros admiten el parmetro UNSIGNED, que
no hemos mencionado hasta el
momento.
implica que no admita signos, por lo que solo aceptara enteros positivos.
Todos los campos numricos admiten el parmetro ZEROFILL cuya funcin es
Es una opcin alternativa a exit() completar el campo con ceros a la izquierda hasta su longitud mxima.
que, como acabamos de ver en un
ejemplo, interrumpe la ejecucin
de un script en el momento de ser Tipos de campos numricos enteros
ejecutada.
Estos son los distintos tipos de campos numricos enteros que admite MySQL. Los
Cuando se produce un error en la
ejecucin de un script no poder
parmetros sealados entre corchetes son opcionales.
establecer conexin con MySQL,
por ejemplo no tiene sentido TINYINT [(M)] [UNSIGNED] [ZEROFILL]
seguir ejecutndolo. Lo razonable
ser interrumpir el proceso y Nmero entero muy pequeo. Con la opcin UNSIGNED puede tomar valores entre 0 y 255. En caso
advertir del error. contrario, puede estar comprendido entre -128 y 127.

Si aadimos a la instruccin El parmetro ZEROFILL slo tiene sentido junto con la opcin UNSIGNED ya que no es habitual
$c=mysql_conect('h','u','p') (sin rellenar los nmeros negativos con ceros a la izquierda del signo.
parntesis, ni comas, ni punto y
El valor por defecto de parmetro M (nmero de cifras) es 4 si no est activada la opcin UNSIGNED.
coma, slo separado por un
Si esta opcin estuviera activada el valor por defecto sera M=3. Para valores de M >valor por
espacio): defecto reajusta el tamao al valor por defecto.
or die ('mensaje') Si se asigna a M un valor menor que cuatro limita el nmero de caracteres al tamao especificado
considerando el signo slo en los nmeros negativos.
y ponemos el punto y coma de fin
de instruccin despus de cerrar Por ejemplo, si M=3 admitira 148, pero si intentamos insertar -148 recortara por la izquierda y solo
este ltimo parntesis, en el caso insertara -14.
de que se produzca un error se
Si intentamos insertar un valor fuera de rango registrara el valor dentro del rango ms prximo
interrumpir la ejecucin del script
a l.
y apare- cer en la ventana del P. ej.: Si tratamos de insertar el valor 437 escribira 127 255, este ltimo en el caso de tener la
navegador el texto incluido en opcin UNSIGNED.
mensaje. Si pretendiramos insertar -837 con la opcin UNSIGNED escribira 0 y sin ella pondra -128.

Este es el cdigo fuente de un El tamao de un campo TINYINT es de 1 byte.


script que produce un error la
contrasea es incorrecta y que
SMALLINT [(M)] [UNSIGNED] [ZEROFILL]
utiliza esta nueva sintaxis. Pero si
lo ejecutas vers que aparece un
mensaje de error generado por Nmero entero pequeo. Con la opcin UNSIGNED puede tomar valores entre 0 y 65 535. En caso
PHP. contrario, puede estar comprendido entre -32 768 y 32 767.

Son vlidos los comentarios hechos para TINYINT, excepto los relativos a los valores por defecto de
Este tipo de mensajes pueden M que en este caso seran 6 5. Su tamao es de 2 bytes.
deshabilitarse haciendo una
modificacin en php.ini. Pero hay
una tcnica mucho ms fcil. MEDIUMINT [(M)] [UNSIGNED] [ZEROFILL]
Bastar con insertar delante de la
funcin una arroba (@) para evitar
Nmero entero mediano. Con la opcin UNSIGNED puede tomar valores entre 0 y 16 777 215. En
que aparezcan. En este otro script caso contrario, puede estar comprendido entre -8 388 608 y 8 388 607.
lo hemos incorporado y puedes
comprobarlo aqui. Tambin son vlidos los comentarios hechos para TINYINT, excepto los relativos al valor por
defecto de M que en este caso seran 8. Su tamao es de 3 bytes.

Lista de bases de datos


INT [(M)] [UNSIGNED] [ZEROFILL]
existentes
Nmero entero. Con la opcin UNSIGNED puede tomar valores entre 0 y 4 294 967 295. En caso
Antes de crear y/o borrar una contrario, puede estar comprendido entre -2 147 483 648 y 2 147 483 647.
base de datos puede ser
conveniente y til comprobar si ya Son vlidos todos los comentarios de los casos anteriores. Su tamao es de 4 bytes.
existe.

PHP dispone de herramientas para INTEGER [(M)] [UNSIGNED] [ZEROFILL]


conocer el nmero de bases de
datos existentes en el servidor, as Es un sinnimo de INT
como sus nombres. Todas ellas
requieren que se haya establecido
una conexin con el servidor. BIGINT [(M)] [UNSIGNED] [ZEROFILL]

$p=mysql_list_dbs($c) Nmero entero grande. Con la opcin UNSIGNED puede tomar valores entre 0 y 18 446 744 073
709 551 615. En caso contrario, puede estar comprendido entre -9 223 372 036 854 775 808 y
La variable $p es un nuevo 21 474 839 223 372 036 854 775 807 647, pero al usarlo desde PHP estar sujeto a las
identificador imprescindible y limitaciones mximas de los valores numricos de este.
previo a la determinacin del
nmero y los nombres de las Son vlidos todos los comentarios de los casos anteriores. Su tamao es de 8 bytes.
bases de datos existentes en el
enlace abierto (identificado por $c).
Nmeros de coma flotante
$n=mysql_num_rows($p)

Esta funcin devuelve el nmero Por la estructura binaria de los microprocesadores y habida cuenta de que algunos
de bases de datos existentes en el nmeros no enteros -sin ir ms lejos, el 0.1- requeriran infinitos caracteres binarios
servidor. para su representacin exacta, se hace necesario introducir un redondeo en su
tratamiento informtico y como consecuencia de ello asumir que se generan errores de
Utiliza como parmetro ($p) el
medida.
resultado obtenido mediante la
funcin anterior.
Esta circunstancia oblig al tratamiento de los nmeros decimales mediante el llamado
Ese nmero puede recogerse en Standar de Aritmtica de Punto Flotante, un algoritmo definido por la IEEE (Institute
una variable (en este caso $n). of Electrical and Electronics Engineers) que unific los procesos de representacin de
nmeros en ordenadores con lo que son uniformemente controlables los errores
mysql_db_name($p, i) introducidos.
Esta nueva funcin devuelve el El Standar de Aritmtica de Punto Flotante estableci dos niveles de precisin:
nombre de una de las bases de
datos, identificada por un nmero i
que debe pertenecer al intervalo Precisin Simple, en la que todo nmero debe ser almacenado en 32 bits
[0,$n). (4 bytes)
Doble precisin, en la que los nmeros se almacenan en 64 bits (8 bytes).
Fjate que i tiene que ser i<$n
porque si, por ejemplo, $n=5 los
cinco valores posibles de i seran: MySQL admite los siguientes tipos de nmeros de coma flotante:
0,1,2,3 y 4.

Una lista completa de todas las


bases de datos existentes en el
FLOAT(x) [ZEROFILL]
servidor podra hacerse mediante
el siguiente proceso: Nmero de coma flotante. Ignora la opcin UNSIGNED, pero s acepta ZEROFILL, por lo que debe
prestarse atencin a estas opciones ya que no sera demasiado habitual una presentacin como esta:
Abrir la conexin. 000-3.47
Invocar a mysql_list_dbs.
Contar el nmero de bases de El valor de x especifica la precisin. Si x<=24 ser de precisin simple. cuando 24 <x <=53 lo
convertir automticamente a doble precisin.
datos con mysql_num_rows
Insertar un bucle: Cuando no se especifica el valor de x considera el campo como de precisin simple. Su tamao es
for ($i=0;$i<$num,$i++) de 4 bytes si x<=24 y de 8 bytes cuando 24 <x <=53
Presentar la lista de nombres
mediante un bucle que lea los
diferentes valores de $i en: FLOAT [(M,D)] [ZEROFILL]
mysql_db_name($p,$i)
Nmero de coma flotante de precisin simple. Son vlidos los comentarios relativos a las opciones
Aqu tienes el cdigo fuente de un UNSIGNED y ZEROFILL del caso anterior.
ejemplo completo y desde aqu
puedes ejecutarlo Toma valores en los intervalos siguientes:

-3.402823466E+38 a -1.175494351E-38
Crear una base de datos

0y
1.175494351E-38 a 3.402823466E+38.
La creacin de una base de datos
tambin requiere una conexin M es la anchura mxima de visualizacin y D es el nmero de decimales. Si M > 24 se convierte
previa y utiliza la siguiente sintaxis: automaticamente a doble precisin
FLOAT sin argumentos representa un nmero de coma flotante y precisin simple.
mysql_query
("CREATE DATABASE nom")

donde nom es el nombre de la


nueva base de datos. DOUBLE [(M,D)] [ZEROFILL]

Esta funcin devuelve TRUE si la Nmero de coma flotante de doble precisin. Siguen siendo vlidos los comentarios relativos a las
base de datos es creada, y FALSE opciones UNSIGNED y ZEROFILL del caso anterior.
si no es posible hacerlo.
Toma valores en los intervalos siguientes:
Si intentamos crear una base de
datos con un nombre ya -1.7976931348623157E+308 a -2.2250738585072014E-308
existente la funcin nos devolver 0y
FALSE. 2.2250738585072014E-308 a 1.7976931348623157E+308

Aqu tienes el cdigo de un


M es la anchura mxima de visualizacin y D es el nmero de decimales.
ejemplo de creacin de una base
de datos. Si lo ejecutas dos veces DOUBLE sin argumentos representa un nmero de coma flotante y precisin doble.
podrs comprobar que en la
segunda oportunidad te aparece el
mensaje diciendo que no ha sido
posible crearla.
REAL [(M,D)] [ZEROFILL]

Borrar una base de datos Es sinnimo de DOUBLE.

Para borrar una base de datos se DECIMAL [(M[,D])] [ZEROFILL]


requiere el uso de la siguiente
funcin PHP:
Es un nmero de coma flotante y doble precisin que se almacena como un campo de tipo CHAR.
mysql_query
("DROP DATABASE nom") El valor es guardado como una cadena donde cada carcter representa una cifra. La coma y el signo
menos de los nmeros negativos no son tenidos en cuenta en el valor de M -anchura mxima de
donde nom es el nombre de la visualizacin- aunque si se reserva -automticamente- espacio para ellos en campo.
Si D vale 0 no tendr parte decimal. Los nmeros toman valores en el mismo intervalo especificado
base de datos y debiendo ponerse
para DOUBLE.
toda la cadena del parntesis entre
comillas. Los valores por defecto de M y D son respectivamente 10 y 0.
Ocupan M+2 bytes si D > 0; M+1 bytes si D = 0 D+2 bytes si M < D
Esta funcin devuelve TRUE
cuando se ejecuta con xito, y
FALSE en el caso contrario. NUMERIC(M,D) [ZEROFILL]

Este es el cdigo de un script que


Se comporta de forma idntica a DECIMAL
puede borrar la base creada
anteriormente.

Igual que ocurra al tratar de


crearla, si intentamos borrar una
base de datos inexistente la Campos de fecha
funcin mysql_drop_db nos
devolver FALSE. MySQL dispone de campos especficos para el almacenamiento de fechas. Son los
siguientes:
Depurando los procesos
de creacin y borrado de DATE
bases de datos
Recoge una fecha dentro del intervalo 01-01-1000 a 31-12-9999. MySQL guarda los valores DATE
Cuando intentamos crear una base con formato AAAA-MM-DD (ao-mes-da) . Su tamao es de 3 bytes.
de datos ya existente o borrar una
inexistente las funciones DATETIME
mysql_query nos devuelven
FALSE pero esa respuesta no nos
dice la causa por la que no ha sido Recoge una combinacin de fecha y hora dentro del intervalo 00:00:00 del da 01-01-1000 y
las23:59:59 del da 31-12-9999. MySQL guarda los valores DATETIME con formato AAAA-MM-DD
posible la ejecucin de la
HH:MM:SS (ao-mes-da hora:minutos:segundos) . Su tamao es de 8 bytes.
instruccin.

Sera mucho ms interesante TIME


comprobar la existencia o
inexistencia de una base de
datos antes de ejecutar esas Recoge una hora dentro del intervalo -838:59:59 a 838:59:59. MySQL guarda los valores TIME con
formato HH:MM:SS (horas:minutos:segundos) . Su tamao es de 3 bytes.
instrucciones y que despus de la
comprobacin se nos presentara
un mensaje informativo. YEAR 0 YEAR(2) o YEAR(4)
MySQL dispone de una sentencia
para este fin, pero aunque la Recoge un ao en formato de cuatro cifras (YEAR o YEAR(4)) o en formato de dos cifras (YEAR(2))
dentro del intervalo 1901 a 2155 en el caso de cuatro cifras o de 1970 a 2069 si se trata de dos
vamos ver ms adelante
cifras. Su tamao es de 1 byte.
olvidmosnos de su existencia e
intentemos crear nuestro propio
script de comprobacin. TIMESTAMP [(M)]
Combinando las instrucciones
anteriores no resulta difcil hacerlo. Recoge un tiempo UNIX. El intervalo vlido va desde 01-01-1970 00:00:00 a cualquier fecha del ao
2037.
Aqu tienes un ejemplo de cdigo
para efectuar esa comprobacin al El parmetro M puede tomar los valores: 14 (valor por defecto), 12, 8, o 6 que se corresponden con
crear una base de datos y este los formatos AAAAMMDDHHMMSS, AAMMDDHHMMSS, AAAAMMDD, o AAMMDD.
otro cdigo es para el caso de Si se le asigna la opcin NUL guardar la hora actual. Cuando se asigna 8 o 14 como parmetros es
considerado como un nmero y para las dems opciones como una cadena.
borrado.
Independientemente del valor del parmetro, un campo TIMESTAMP siempre ocupa 4 bytes.
Experimenta con estos scripts,
sustityelos por otros propios en
los que utilices las funciones que Campos tipo cadena de caracteres
hemos incluido a la derecha
tienes el cdigo fuente dentro del CHAR (M) [BINARY]
fichero mysql.inc.php y
comprueba, listando las bases de
datos existentes, que slo queden: Es una cadena de tamao fijo que se completa a la derecha por espacios si es necesario.
mysql y test.
El parmetro M puede valer de 1 a 255 caracteres.

Los espacios finales son suprimidos cuando la cadena es insertada en el registro.


Tipos de campos MySQL
Los valores de tipo CHAR son elegidos y comparados sin tener en cuenta Maysculas /
Minsculas y utilizan el juego de carcteres por defecto.
Conocidos los procesos de
creacin, listado y borrado de Se puede utilizar el operador BINARY para hacer la cadena sensible a Maysculas / Minsculas.
bases de datos ya estamos en
disposicin en empezar a tratar lo Se puede utilizar un campo tipo CHAR(0) con el atributo NULL para almacenar una valor booleano.
relativo a las tablas. En este caso ocupar un solo byte y podr tener nicamente dos valores: NUL "".

Es muy necesario conocer los Su tamao es de M bytes siendo 1 <= M <= 255 .
diferentes tipos de campos que
pueden contener las tablas de VARCHAR(M) [BINARY]
MySQL. Aqu a la derecha los
tienes.
Es una cadena de caracteres de longitud variable. Su tamao mximo -especificado en el
Conocer las posibilidades de cada parmetro M- puede estar comprendido entre 1 y 255 caracteres. Con la opcin BINARY es capaz de
uno ser fundamental a la hora de discriminar entre Maysculas / minsculas.
disear una tabla. En ese
momento tendremos que decidir TINYBLOB o TINYTEXT
qu campos son necesarios, cul
es tipo requerido, cules han de
ser sus dimensiones y tambin TINYBLOB y TINYTEXT son cadenas de caracteres de longitud variable con un tamao mximo
cules de ellos requerirn ser de 255 (28 - 1) caracteres.
tratados como ndices. La diferencia entre ambas es que TINYBLOB discrimina entre Maysculas / minsculas, mientras
que TINYTEXT no lo hace.
Tipos de campo bien elegidos y un
tamao adecuado a las Ninguno de los campos BLOB y TEXT admite valores por DEFECTO
necesidades reales de nuestro
proyecto son las mejores garantas Las versiones de MySQL anteriores a 3.23.2 permiten utilizar estos campos para indexar.
para optimizar el tamao de la
Si se intenta guardar en un campo de este tipo una cadena de mayor longitud que la especificada
tabla y para hacerla realmente solamente se guardarn los M primeros caracteres de la cadena.
eficaz.

El grado de eficiencia de una base BLOB o TEXT


de datos suele ser directamente
proporcional al tiempo invertido en
BLOB y TEXT son cadenas de caracteres de longitud variable con un tamao mximo de 65535
el anlisis de la estructura de sus
(216 - 1) caracteres.
tablas.
La diferencia entre ambas es que BLOB si discrimina entre Maysculas / minsculas, mientras que
TEXT no lo hace.
CREACIN DE LAS BASES
DE DATOS NECESARIAS Ninguno de los campos: BLOB y TEXT admite valores por DEFECTO
PARA EL CURSO
MEDIUMBLOB o MEDIUMTEXT
Una vez hayas hecho todas las
pruebas necesarias con las MEDIUMBLOB y MEDIUMTEXT son cadenas de caracteres de longitud variable con una longitud
funciones anteriores, llega el mxima de 16.777.215 (224 - 1) caracteres.
momento de utilizarlas para crear Son vlidas las especificaciones hechas en el apartado anterior.
las bases de datos que vamos a
El tamao mximo de los campos de este tipo est sujeto a limitaciones externas tales como la
utilizar en el Curso. memoria disponible y el tamao del buffer de comunicacin servidor/cliente.
Pulsa en este enlace para que cree
automticamente la base de datos
que va a contener los sucesivos LONGBLOB o LONGTEXT
ejemplos que hemos incluido en
estos materiales. Su nica diferencia con la anterior es el tamao mximo de la cadena, que en este caso es
4.294.967.295 (232 - 1) caracteres.
Crear base de datos
EJEMPLOS
ENUM('valor1','valor2',...)

Una vez hecho esto, escribe tu Es una cadena de caracteres que contiene uno solo de los valores de la lista (valor1, valor2, etc.
etc.).
propio script y crea una segunda
base de datos como el nombre A la hora de insertar un nuevo registro en una tabla, el valor a especificar para un campo de este tipo
practicas. Esta ser la que habrs ha de ser una cadena que contenga uno de los valores especificados en la tabla. Si se tratara de
de utilizar en ejercicios que insertar un valor distinto de ellos insertara una cadena vaca.
tendrs que ir haciendo en el resto
del curso.
SET('valor1','valor2','valor3'...)

Cuidado!

Antes de continuar, es
Es una cadena de caracteres formados por la unin de ninguno, uno o varios de los valores de una
conveniente comprobar lista. El mximo de elementos es 64.
desde Windows que el
directorio c:\mysql\data Los valores que deben escribirse en los campos de este tipo han de ser numricos, expresados en
forma binaria o en forma decimal.
contiene las bases de datos
ejemplos y practicas En el supuesto de que contuviera tres valores los posibles valores a insertar en un campo de este
tipo a la hora de aadir un registro seran los siguientes.

Incluir valores Cdigo valor Cadena Equiv.


val1 val2 val3 val1 val2 val3 binaria decimal
Si S S 1 1 1 111 7
Si S No 1 1 0 011 3
Si No S 1 0 1 101 5
No S S 0 1 1 110 6
No No S 0 0 1 100 4
No S NO 0 1 0 010 2
Si No No 1 0 0 001 1
No No No 0 0 0 000 0

Anterior Indice Siguiente


Creacin de tablas

Creacin de tablas
Crear una tabla MySQL
Las tablas son elementos de las La creacin de tablas MySQL requiere una de estas dos sentencias:
base de datos. Por esa razn nos
resultar imposible crear una CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... )
tabla sin tener creada y
seleccionada una base de datos. CREATE TABLE tabla (campo1, campo2,... )
Es por eso que para la creacin de
La nica diferencia entre ambas opciones es que la segunda dara un error si tratramos
una tabla se necesitan los
siguientes requisitos: de crear una tabla preexistente (deberamos recurrir al procedimiento que hemos visto
cuando crebamos bases de datos) mientras que la primera no da ese mensaje de error.
Tener abierta una conexin con
el servidor MySQL. Aunque no lo hemos indicado, CREATE DATABASE tambin permite esta sintaxis
alternativa.
Tener seleccionada una base de
datos.
Definicin de campos en una tabla MySQL
Conexin con el servidor

La hemos comentado en la pgina Cada uno de los campos que vayamos a crear en una tabla requiere una definicin que
anterior, recuerda que requera la debe contener lo siguiente:
funcin:
nombre del campo
$c=mysql_connect(h, u, p) Es una palabra cualquiera distinta para campo de la tabla y que normalmente suele
elegirse aludiendo al contenido. Por ejemplo, fec_nac, nom_perro, etctera.
Esa conexin ha de ser establecida
antes de cualquier otra
intervencin relacionada con No va entre comillas nunca y MySQL diferencia maysculas/minsculas.
accesos a bases de datos y tablas.
Para utilizar como nombres de campo palabras reservadas por ejemplo, create del
Seleccin lenguaje MySQL debemos escribirla entre ` `. Observa que no son comillas sino acentos
de la base de datos graves. Lo ms aconsejable es evitar esta situacin.
Dado que podemos manejar bases
de datos distintas en este curso
tipo y dimensiones
usaremos ejemplos y practicas es Los tipos de campos los hemos visto en la pgina anterior tienen que ajustarse a uno
preciso decir a MySQL con qu de los soportados por MYSQL. Se escriben a continuacin del nombre sin otra separacin
base queremos trabajar. que un espacio y requieren la sintaxis estricta correspondiente a cada tipo.

mysql_select_db("n", $c); flags del campo ( son opcionales) Puede utilizarse cualquiera de los permitidos para
cada tipo de campo puedes verlos encerrados entre corchetes al lado de cada tipo de
donde n es el nombre de la base
de datos (puede ser una cadena campo.
entrecomillada o el nombre de una
variable previa que contenga ese Ejemplo de creacin de una tabla
nombre). En este ltimo caso,
como es habitual, el nombre de la
variable no llevara comillas.
<?
/* nos conectamos con el servidor
El segundo parmetro $c es el recogiendo en $c el identificador de conexin */
identificador de conexin. Es decir, $c=mysql_connect ("localhost","pepe","pepa") or die ("Imposible
la variable creada al establecer la conectar");
conexin con MySQL. # seleccionamos una base de datos existente
# de lo contrario nos dara un error
Este valor debe insertarse
# pondremos como nombre ejemplos nuestra base de datos
siempre. La razn es que MySQL
permite mantener abiertas, de # creada en la pgina anterior y usaremos $c
forma simultnea, varias # importante no olvidarlo
conexiones (podramos manejar mysql_select_db ("ejemplos", $c);
ms de un servidor de bases de /* ahora ya estamos en condiciones de crear la tabla
datos) y en esas condiciones sera podramos escribir ya la instruccin mysql_query y meter
necesaria una conexin distinta detro la sentencia MySQL pero, por razones de comodidad
para cada servidor. crearemos antes una variable que recoja toda la sentencia
y ser luego cuando la ejecutemos.
Creacin de una tabla Definiremos una varable llamada $crear e iremos aadiendo cosas */
En todas las transacciones PHP # la primera parte de la instruccin es esta (espacio final incluido
MySQL habremos de utilizar $crear="CREATE TABLE IF NOT EXISTS ";
instrucciones de ambos lenguajes. # aadiremos el nombre de la tabla que ser ejemplo1
La forma habitual hay algunas # fijate en el punto (concatenador de cadenas) que permite
excepciones en la que PHP se # ir aadiendo a la cadena anterior
comunica con MySQL es la funcin: $crear .="ejemplo1 ";
#ahora pongamos el parntesis (con un espacio delante)
mysql_query("sent", $c); #aunque el espacio tambin podra detrs de ejemplo1
donde la cadena sent contiene las $crear .="( ";
instrucciones propias de MySQL # insertemos el primer campo y llamemoslo num1
las comentamos al margen y $c # hagamoslo de tipo TINYINT sin otras especificamos
sigue siendo la variable que # sabiendo que solo permitira valores numricos
contiene el identificador de # comprendidos entre -128 y 127
conexin. $crear .="num1 TINYINT , ";
# LOS CAMPOS SE SEPARAN CON COMAS por eso
La sintaxis de las sentencias
# la hemos incluido al final de la instruccin anterior
MySQL que crean tablas la
tenemos en la columna de la
derecha. # ahora num2 del mismo tipo con dimensin 3 y el flag UNSIGNED
# Y ZEROFILL que: cambiar los lmites de valores
DIMENSIONES # al intervalo 0 - 255, y rellenar con ceros por la izquierda
# en el caso de que el nmero de cifras significativas
Cuando se establezca una # sea menor de 3.
dimensin como parmetro # Fijate que los flags van separado unicamente por espacios
opcional de un campo deben $crear .="num2 TINYINT (3) UNSIGNED ZEROFILL, ";
tenerse en cuenta algunos detalles. # en num3 identico al anterior aadiremos un valor por defecto
Si en un campo numrico # de manera que cuando se aadan registros a la tabla
# se escriba automaticamente ese valor 13 en el caso
introdujramos valores que
# de que no le asignemos ninguno a ese campo
exceden los lmites su valor no se
# por ser numrico 13 no va entre comillas
registrara en la tabla sino el valor
$crear .="num3 TINYINT (7) UNSIGNED ZEROFILL DEFAULT 13, ";
del lmite ms prximo
correspondiente a ese tipo de # ahora un nmero decimal num4 tipo REAL con 8 digitos en total
campo. # de los cuales tres sern decimales y tambin rellenaremos con ceros
# Pondremos como valor por defecto 3.14
Supongamos un campo tipo $crear .="num4 REAL (8,3) ZEROFILL DEFAULT 3.14, ";
TINYINT que permite valores # aadamos una fecha
comprendidos entre -128 y 127. Si $crear .="fecha DATE, ";
asignramos en uno de sus /* una cadena con un limite de 32 carcter con BINARY
registros un valor igual a 234 se
para que diferencie Pepe de PEPE */
escribira en la tabla 127 (el lmite
$crear .="cadena VARCHAR(32) BINARY, ";
superior) y si ponemos -834
escribira el lmite inferior, es decir, /* un ultimo campo opcion del tipo ENUM que solo admita
-128. como valores SI, NO, QUIZA
fijate en las comillas y en el parentesis
En caso de cadenas, si el valor cuidado...!! aqui no ponemos coma al final
introducido sobrepasara la longitud es el ltimo campo que vamos a insertar y no necesita
mxima permitida, la cadena sera ser separado. Si la pones dar un ERROR */
recortada y nicamente se $crear .="opcion ENUM('Si','No','Quiza') ";
registrara el nmero mximo de
# solo nos falta aadir el parntesis conteniendo toda la instruccin
caracteres permitidos.
$crear .=")";
Consideraciones /* tenemos completa la sentencia MYSQL
solo falta ejecutarla mediante mysql_query
sobre IF NOT EXISTS
ya que la conexin est abierta
Esta variante de CREATE y la base de datos ya est seleccionada */
aplicable tanto en tablas como en
bases de datos tiene la ventaja /* pongamos un condicional de comprobacin */
de no dar mensajes de error en if(mysql_query($crear,$c)){
caso de intentar crear una tabla o print "Se ha creado la base de datos<br>";
base ya existente, pero puede print "La sentencia MySQL podramos haberla escrito asi:<br>";
darnos algn sobresalto porque no print "mysql_query("."\"".$crear."\" , $c);";
advierte que la tabla no ha sido
}else{
creada y puede darnos la
sensacin de que puede haber
print "Se ha producido un error al crear la tabla";
reescrito una tabla anterior. }
?>
Si pulsas reiteradamente en el
enlace Crear tabla ejemplo1
comprobars que no aparece Crear tabla
ningn mensaje de error. ejemplo1

Ejercicio n 38

Como prctica de creacin de tablas, debers crear en tu base de datos practicas una
tabla a la que llamaremos tabla1 que recoja al menos en diferentes campos, los siguientes
datos de tus alumnos: DNI (con letra incluida), nombre, apellidos (en campos diferentes),
fecha de nacimiento, y en un campo tipo ENUM su condicin de repetidor o no.

Anterior Indice Siguiente


Ver y modificar estructuras

Visualizar la estructura de
Ver la estructura de una tabla utilizando MySQL
una tabla La sentencia MySQL que permiten visualizar la estructura de una tabla es la siguiente:

Es posible visualizar la estructura SHOW FIELDS from nombre de la tabla


de una tabla de dos maneras:
utilizando nuevas funciones de
PHP, o aplicando nuevas <?
sentencias MySQL con las # asignamos a una variable el nombre de la base de datos
funciones ya conocidas. $base="ejemplos";
# esta otra recoge el nombre de la tabla
Lectura de resultados de $tabla="ejemplo1";
sentencias MySQL # establecemos la conexin con el servidor
$c=mysql_connect ("localhost","pepe","pepa");
# seleccionamos la base de datos
La sentencia SHOW FIELDS mysql_select_db ($base, $c);
como prcticamente ocurre con
todas las sentencias MySQL no
devuelve los resultados en formato
#ejecutamos mysql_query llamando a la sentencia
legible. # SHOW FIELDS

Los resultados devueltos por estas $resultado=mysql_query( "SHOW FIELDS from $tabla",$c);
sentencias requieren ser
convertidos a un formato que sea # determinamos el nmero campos de la tabla
interpretable por PHP.
$numero=mysql_num_rows($resultado);
Esa traduccin se realiza de la
siguiente forma:
# Presentamos ese valor nmerico
El resultado devuelto por MySQL a
travs de una llamada print "La tabla tiene $numero campos<br>";
mysql_query() es recogido en
una variable, de la forma siguiente: # ejecutamos los bucles que comentamos al margen
while($v=mysql_fetch_row ($resultado)){
$r=mysql_query(sent, $c)
foreach($v as $valor) {
El resultado recogido en la variable echo $valor,"<br>";
$r, est estructurado en lneas y la }
funcin: }
$t =mysql_fetch_row ($r)

recoge en una variable ($t) el #####################################################################


contenido de la primera lnea y # REPETIMOS LA CONSULTA ANTERIOR USANDO AHORA LA #
coloca su puntero interno al # funcin mysql_fecth_array #
comienzo de la lnea siguiente. Por #####################################################################
esta razn la lectura completa del
contenido de la variable $r #tenemos que VOLVER a EJECUTAR LA SENTENCIA MySQL
requiere llamadas sucesivas a # porque el puntero est AL FINAL de la ultima lnea
mysql_fetch_row hasta que # de los resultados
haya sido leda la ltima lnea del
resultado de la llamada a MySQL.
$resultado=mysql_query( "SHOW FIELDS from $tabla",$c);
La variable $t tiene estructura de
array escalar siendo cero el print("<BR> Los resultados con mysql_fech_array<br>");
primero de sus ndices.

Cuando el puntero interno de while($v=mysql_fetch_array($resultado)){


mysql_fetch_row() alcance el foreach($v as $clave=>$valor) {
final de la ltima lnea del print ("El indice es: ".$clave." y el valor es: ".$valor."<br>");
resultado devolver FALSE.
}
Por esa razn, la visualizacin de }
los resultados de una sentencia
MySQL suele requerir dos bucles. ################### la tercera posibilidad comentada
Este es el esquema de la lectura: ####################################################
$r=mysql_query(inst,$c); $resultado=mysql_query( "SHOW FIELDS from $tabla",$c);
while($r=mysql_fech_row($r){
# intentaremos explicar este doble bucle con calma
foreach ($r as $valor){
print $valor;
/* En los procesos anteriores a cada paso del bucle
} foreach leiamos un array, lo imprimiamos y sustituiamos
} ese array por uno nuevo

o tambin Ahora trataremos de recoger todos esos resultados en array


para ello usamos un array bidimensional que renueva
while($r=mysql_fech_row($r){
el primer indice en cada ciclo del bucle while
$g[]=$t;
de ahi que pongamos el $contador para asignarle
}
el primer indice
con lo que estaramos creando un Los segundos indices sern los valores de los indices
array bidimensional con el del array $v que recogemos de la peticin MySQL
contenido de los resultados de pero mysql_fetch_array genera dos indices para
cada lnea. cada uno de los valores, uno numerico y otro asociativo
asi que filtramos y si el indice es numrico
En este caso el primer ndice del
guardamos en el array llamado numerico
array $g seguira las normas de
creacin de arrays y se ira y si no lo es guardamos el llamado asociativo
autoincrementando en cada ciclo Tendremos separados en dos array ambos resultados
del bucle while. Complicado... ? Es cuestin de analizar con calma */

El ejemplo tiene desarrollados # pongamos el contador a cero para asegurar


ambos mtodos. # no hay variables anteriores con el mismo nombre
# y valores distintos
Existe una funcin alternativa que
mejora las prestaciones de la
anterior. Se trata de: $contador=0;
$t =mysql_fetch_array($r)
while($v=mysql_fetch_array($resultado)){
es idntica en cuanto a su foreach ($v as $indice1=>$valor1){
funcionamiento y, adems, aade if(is_int($indice1)){
una nueva posibilidad ya que los $numerica[$contador][$indice1]=$valor1;
arrays que devuelve pueden ser }else{
ledos como escalares y tambin $asociativa[$contador][$indice1]=$valor1;
como asociativos. En este ltimo }
caso incorporan como ndice el }
nombre del campo de la tabla del
$contador++;
que se han extrado cada resultado.
}
Respecto a la forma en la que sea /* vamos a leer los array resultantes
asignan los ndices a los array empecemos por el numerico que al tener
obtenidos mediante consultas a dos indices requiere dos foreach anidados
tablas, puedes verla en este el valor del primero ser un array
enlace. que extraemos en el segundo */

Otras funciones foreach($numerica as $i=>$valor){


informativas foreach ($valor as $j=>$contenido){
print ("numerico[".$i."][".$j."]=".$contenido."<br>");
}
mysql_num_fields ($res) }
Est funcin -en la que $res es el
identificador de resultado - foreach($asociativa as $i=>$valor){
devuelve el nmero de campos foreach ($valor as $j=>$contenido){
de la tabla. print ("asociativo[".$i."][".$j."]=".$contenido."<br>");
}
mysql_num_rows ($res) }
Devuelve el nmero de registros
que contiene la tabla. Si la tabla
no contiene datos devolver CERO. # liberamos memoria borrando de ella el resultado

mysql_field_table($res, 0) mysql_free_result ($resultado);


Devuelve el nombre de la tabla. # cerramos la conexion con el servidor
Observa que se pasa con ndice 0
ya que esta informacin parece ser
la primera que aparece en la tabla.
mysql_close($c);
?>
mysql_field_type($rs, $i)

Nos devuelve el tipo de campo ejemplo164.php


correspondiente a la posicin en la
tabla sealada por el ndice $i.
Dado que la informacin de primer
Borrar una tabla
campo est en el ndice 0, el
ltimo valor vlido de $i ser igual Las sentencias MySQL que permite borrar una tabla son las siguientes:
al nmero de campos menos uno. DROP TABLE IF EXISTS from nombre de la tabla

mysql_field_flags($res, $i) DROP TABLE from nombre de la tabla


la diferencia entre ambas radica en que usando la primera no se generara ningn error
Nos devuelve los flags del en el caso de que tratramos de borrar una tabla inexistente.
campo correspondientes a la
posicin en la tabla sealada por el Aqu tienes el cdigo fuente de un ejemplo:
ndice $i. Se comporta igual que la
anterior en lo relativo a los ndices.
Ver cdigo fuente
mysql_field_len($res, $i)

Nos devuelve la longitud del Borrar uno de los campos de una tabla
campo correspondiente a la
posicin en la tabla sealada por el La sentencia MySQL que permite borrar uno de los campos de una tabla es la
ndice $i. Igual que las anteriores siguiente:
en lo relativo a los ndices.
ALTER TABLE nombre de la tabla DROP nombre deL campo
mysql_field_name($rs, $i)
Es posible modificar la estructura de una tabla -en este caso borrar un campo-
Nos devuelve el nombre del siguiendo un procedimiento similar a los anteriores.
campo correspondiente a la
posicin en la tabla sealada por el La nica diferencia estriba en utilizar la sentencia MySQL adecuada.
ndice $i. En lo relativo a los
ndices su comportamiento es Resulta obvio que el campo debe existir para que pueda ser borrado y si no existiera,
idntico a las anteriores. es obvio tambin que se producira un error.

Liberando memoria Aqu tienes el cdigo fuente de un script que borra uno de los campos de una tabla.

Si queremos liberar la parte de la


Ver cdigo fuente
memoria que contiene un
identificador de resultado bastar Aadir un nuevo campo a una tabla
con que insertemos la siguiente
instruccin: Las sentencia MySQL que permite aadir un nuevo campo a una tabla es la siguiente:
mysql_free_result($res)
ALTER TABLE nombre de la tabla ADD nombre del campo tipo [flags]
Este proceso debe ser posterior a El procedimiento es similar a los casos anteriores utilizando esta nueva sentencia
la visualizacin de los datos. MySQL.

La sintaxis es similar a la de la creacin de tablas: el nombre del campo debe ir


seguido del tipo sin otra separacin que el espacio

Aqu tienes el cdigo fuente de un script que aade uno de los campos de una tabla.

Ver cdigo fuente


Anterior Indice Siguiente
Aadir registros e ndices

Manejando ndices
Aadir registros a una tabla
Las sentencias MySQL que permiten aadir registros a una tabla son las siguientes:
Es muy frecuente la utilizacin de INSERT tabla (campo1,campo2,..) VALUES (valor1,valor2,..)
ndices en las bases de datos.
Pero... qu son los ndices? para Vamos a desarrollar un ejemplo completo de creacin de una tabla e insercin de
qu sirven?. registros utilizando diversos mtodos. Para ello seguiremos el siguiente proceso:
Si nos planteamos cul es la
utilidad del ndice de un libro la 1.- Creacin de la tabla
respuesta sera:
Empezaremos creando una tabla a la que llamaremos demo4 y que contendr los
Facilitar la bsqueda de siguientes campos:
datos
Agilizar esa bsqueda
Contador, que ser de tipo TINYINT(8) (nmero entero con un mximo de 8
dgitos) que contenga solo valores positivos, que se rellene automticamente
La utilidad de los ndices en la
bases de datos es la misma.
con ceros por la izquierda y que se autoincremente cada vez que aadimos un
registro.
DNI, destinado a recoger valores de nmeros de DNI y que debe poder contener
Tipos de ndices un mximo de ocho caracteres.
Lo definiremos de tipo CHAR porque sus valores, pese a ser numricos, nunca van
Si seguimos con el ejemplo del a requerir ningn tratamiento aritmtico.
libro veremos que caben las Nombre, Apellido1 y Apellido2 sern tres campos tipo VHAR de tamaos
posibilidades de que tenga: mximos respectivos de 20, 15 y 15 caracteres.
Su finalidad la evidencian los nombres de campo. Les asignaremos el flag NOT
Un solo ndice NULL aunque no sea totalmente correcto dado que existen pases en los que se
Varios ndices utiliza un solo apellido.
Nacimiento ser un campo tipo DATE al que asignaremos como valor por
Algunos libros slo contienen un defecto el de 1970-12-21. Recuerda que MySQL trata las fechas en ese orden
indice de contenidos. Sin (ao-mes-dia) y que admite como separadores tanto - como / por lo que son
embargo, es frecuente que vlidas entradas con cualquiera de estos formatos: 1970-12-21 1970/12/21,
tambin dispongan de otros, tales aunque esta segunda es convertida automaticamente al primer formato por
como: ndices analticos, ndices MySQL.
onomsticos, etctera. Hora ser un campo tipo TIME al que asignaremos como valor por defecto el de
00:00:00. Recuerda que MySQL trata las horas en ese orden (hh:mm:ss) y que
Cuando existe un solo ndice es
slo admite como separador :.
obvio que puede decirse de l que
es nico y cuando existen varios Este campo est destinado a recoger la hora de nacimiento que aunque no tiene
podemos decir que el ndice de demasiado sentido es una buena excusa para introducir este tipo de campo.
contenidos es el ndice principal Sexo ser un campo tipo ENUM que tendr dos opciones: M (masculino) y F
y los dems son ndices sin ms o (femenino) y al que asignaremos M como valor por defecto.
ndices auxiliares. Fumador ser un campo tipo CHAR(0) que por su estructura -cadena de longitud
cero- tendr dos nicas opciones de valor: NULL "", que, como veremos, son
Coincidirs con nosotros en que en valores distintos para MySQL
el ndice de contenidos de un libro
Idiomas ser un campo tipo SET definido para los valores: Castellano, Francs,
de texto slo existe una referencia
Ingls, Alemn, Blgaro y Chino y que podr contener, como ocurre con los
al Tema XIII en la que puede
decir: Tema XIII pgina 314. campos de este tipo, ninguno, uno o varios de los valores de la lista.
ndice primario ser tratado como tal el campo DNI ya que se trata de un valor
Tambin coincidirs en que si en nico para cada persona y que, como tal, no puede tener duplicados
ese ndice, adems de lo anterior, ndices auxiliares. Para ejemplificar su tratamiento consideraremos el campo
dijera: Tema XIII pgina 714 nos Contador como ndice secundario.
encontraramos en una situacin
confusa que nos obligara a
preguntarnos: donde est el El cdigo fuente del fichero que genera esta tabla puedes verlo aqu debajo
Tema XIII? En la pgina 314? En
la 714? En ambas?. Ver cdigo fuente

Es por eso que las tablas de las


bases de datos no admiten nunca Crear tabla demo4
valores duplicados ni en los ndices
nicos ni tampoco en los ndices
principales. 2.1.- Aadir un registro
Los ndices auxiliares tienen un
comportamiento distinto. El ndice Cuando se aade un registro en una tabla los valores pueden aadirse en la propia
onomstico de un libro puede sentencia MySQL o ser recogidos de los valores de variables PHP previamente definidas.
hacer referencia a varias pginas y
puede tener duplicados. En este ejemplo tienes el cdigo fuente del primero de los casos, en el que se aade a
la tabla anterior un registro cuyos valores son:
Por ejemplo: en un manual de
Word puede existir un ndice
DNI Nombre Apellido1 Apellido2 Nacimiento Sexo Hora Fumador Idiomas
onomstico en el que se asocie la
palabra macros con las pginas 1234 Lupicinio Servidor Servido 1954-11-23 M 16:24:52 NULL 3
37, 234 y 832 siempre que en
esas pginas existan contenidos
que aludan a la palabra macro. Ver cdigo fuente Aadir regitro

Es por eso que las tablas de las Presta atencin a los siguientes aspectos:
bases de datos tambin admiten
duplicados cuando se trata de
ndices auxiliares. En la sentencia no se alude al campo Contador. La razn es que se trata un
campo AUTOINCREMENTAL y en ese tipo de campos los valores de los registros se
escriben automticamente cada vez que se aade uno nuevo.
Sintaxis de la definicin El registro no se aadira si el valor de DNI coincidiera con otra ya existente
de ndices MySQL en la tabla. Recuerda que habamos definido ese campo como ndice primario.
Si no hubiramos incluido el aviso de error no tendramos ninguna referencia
Tanto al crear una tabla como al sobre el xito de la insercin y no detectaramos el problema de duplicidad.
modificarla se pueden aadir Sencillamente ocurrira que el registro no se aadira pero no nos enteraramos de
ndices de la misma forma que tal circunstancia.
tambin se pueden insertar Si en los valores de nombre y apellidos hubiramos insertado textos ms largos
campos.
del tamao establecido para ellos al crear la tabla, las cadenas se recortaran y
slo se aadiran -de izquierda a derecha- los n primeros caracteres de la cadena.
La sintaxis (dentro de la sentencia
MySQL que crea o modifica una
Si en la fecha de nacimiento hubiramos introducido una cadena vaca nos habra
tabla) es la siguiente: puesto el valor por defecto, pero si hubiramos introducido un valor no
vlido nos habra escrito 0000-00-00.
PRIMARY KEY(campo) Seran valores no vlidos en este caso:
Los que tuvieran como valor de mes alguno no perteneciente al intervalo
donde campo es el nombre del [1,12].
campo que se establece como
Los que tuvieran como valor de da un valor no vlido en concordancia con
ndice principal de la tabla.
el mes y el ao. Admitira 29 en un mes de febrero slo en el caso de que
El nombre del campo no va el ao fuera bisiesto.
entrecomillado y PRIMARY KEY Cuando la secuencia no coincidiera con esta AAAA-MM-DD.
(campo) se aade dentro de la Cuando los separadores no fueran (-) o (/)
sentencia CREATE como si se En el campo Sexo si hubiramos introducido una cadena vaca nos habra puesto
tratara de un campo ms, M (valor por defecto) pero si hubiramos intentado introducir un valor que no
delimitado por comas, salvo que fuera M ni F nos habra insertado una cadena vaca.
estuviera al final de la sentencia El campo hora se comportara de idntica forma al de fecha salvo que aqu la
CREATE, en cuyo caso se omitira
secuencia es: hh:mm:ss, que la hora debe pertenecer al intervalo [0,23], los
la coma final.
minutos y los segundos a [0,59] y que el nico separador vlido en este caso es
En el cdigo fuente de la creacin (:).
de la tabla que tienes a la derecha El campo Fumador requiere particular atencin ya que se trata de un campo
puedes ver un ejemplo prctico de CHAR(0) que slo admite dos valores: NULL o cadena vaca, que como
la sintaxis. recordars son distintos para MySQL.
Para introducir el valor NULL -utilizando el procedimiento de insercin de
Solo puede definirse un ndice
este ejemplo- tienes dos posibilidades, o escribir NULL sin ponerlo entre
primario por tabla y el campo
comillas -tal como lo he hecho en el ejemplo o escribir '\n' que como ves,
utilizado ha de ser un campo no
nulo. es el carcter especial \n esta vez colocado entre comillas.
Para introducir una cadena vaca en este campo bastara con que
UNIQUE nombre (campo) pusieramos '' (ojo no es una comilla doble es la comilla sencilla (') repetida
dos veces!
Similar a PRIMARY KEY, en cuanto Date cuenta de que si pusiramos comillas dobles tendramos un error ya
a que no admite valores que hay unas comillas dobles delante del INSERT que se cierran al final de
duplicados, pero con dos
la sentencia MySQL y que no podemos volver a escribirlas entre ambas
diferencias importantes.
UNIQUE permite la creacin de
para evitar un falso cierre de la cadena que contienen.
ms de un ndice de este tipo por
tabla y adems no requiere que los
En este caso el valor del campo Idiomas puede contener valores decimales
campos sobre los que se define comprendidos entre 0 y 64 o entre sus equivalentes binarios que son 0 y 111111.
sean no nulos. El valor 64 lo justifica el hecho de que son seis los elementos que puede
contener el campo (hemos definido: Castellano, Francs, Ingls, Alemn, Blgaro y
INDEX nombre (campo) Chino que son seis y que el caso de insertarlos todos requerira el nmero binario
111111, cuyo valor decimal es precisamente 64.
Con esta sintaxis se crea un ndice
El valor 3 significa lo mismo que su equivalente binario (11) o mejor (000011) lo
secundario que debe tener un
nombre (la posibilidad de que
cual quiere decir que, como el primer carcter de la derecha es uno el campo
existan varios obliga a toma el primer elemento de la lista (Castellano), como el segundo (de derecha
identificarlos de esta forma) y - a izquierda) tambin es uno tomar tambin el segundo elemento de la lista
como en los casos anteriores- el (Francs) y por ser cero todos los dems no tomar ningn otro valor de la lista,
campo que va a ser utilizado como con lo que la cadena resultante sera en este caso Castellano, Francs.
ndice. Fjate tambin en que el valor 3 no lo hemos puesto entre comillas porque se trata
de una expresin decimal. Qu ocurra si hubiera puesto 11? Lo habra
INDEX nombre (campo(n)) interpretado como once (decimal) o como tres (binario)?.
Es un caso particular del anterior La solucin es simple: '11' (entre comillas) sera interpretado como binario, sin
utilizable slo en el caso de que el comillas como decimal.
campo ndice sea tipo CHAR y No es necesario introducir valores en todos los campos, es decir, que la lista
VARCHAR que permite indexar de campos de la sentencia INSERT puede no contenerlos a todos.
por los n primeros caracteres No es necesario escribir el nombre de los campos en el mismo orden en el que
de esas cadenas. fueron creados pero si es imprescindible que campos y valores estn escritos
en la sentencia INSERT exactamente en el mismo orden y tambin que en esa
El valor de n ha de ser:
sentencia el nmero de campos y el nmero de valores sea el mismo.
n <= 256 Recuerda que los values tipo numrico no se incluyen entre comillas, mientras
que los no numricos tienen que estar contenidos entre comillas incluso en el
dado que el tamao mximo de un caso de no se inserten directamente sino a travs de una variable PHP.
ndice est limitado en MySQL a
256 bytes.
2.2- Aadir un registro a partir de datos contenidos en variables
Otra limitacin de MySQL es el
nmero mximo de ndices de una Tambin es posible aadir registros a partir de valores contenidos en variables PHP.
tabla que no puede ser mayor de
Esta opcin es, sin ninguna duda, la ms utilizada ya que lo habitual ser escribir el
diecisis.
contenido a aadir en un form y despus -a travs del method (POST o GET)- pasar al
script de insercin esos valores como variables PHP.
Los errores MySQL
Aqu tienes el cdigo fuente de un ejemplo con la tabla anterior.
PHP dispone de dos funciones que
nos permiten detectar si una Ver cdigo fuente Aadir regitro
sentencia MySQL se ha ejecutado
correctamente o si se ha producido Quiz te resulten de alguna utilidad estos comentarios
algn error.

Son las siguientes: Observa en el cdigo fuente que al insertar las variables en los VALUES de la
sentencia MySQL ponemos cuando se trata de valores tipo cadena
mysql_errno($enl) '$variable' (el nombre de la variable entre comillas) y cuando se trata de valores
nmericos sin comillas.
Indica el nmero de error que se
ha producido en la transaccin
Si quieres introducir el valor NULL en un campo tipo VAR(0) define la variable as:
MySQL realizada a travs del $var="\n" y si quieres introducir una cadena vaca defnela de este otro modo:
identificador de enlace $enl. $var="''" -comillas dobles (") seguidas de dos comillas sencillas (') y para
terminar otras comillas dobles (").
Cuando el nmero de error es
CERO significa que no se ha
producido error. 3.- Variantes de la sentencia INSERT

Otros valores bastante usuales son La sentencia INSERT cuya sintaxis se indica ms arriba como:
los siguientes:
INSERT tabla (campo1,campo2,..) VALUES (valor1,
valor2,..)
Error nmero 1050
permite algunos modificadores opciones tales como:
Indica que hemos tratado de crear INSERT [LOW_PRIORITY | DELAYED] [IGNORE] tabla (campo1,..)
una tabla ya existente. VALUES (valor1,..)
de ellos LOW_PRIORITY y DELAYED son incompatibles por lo que solo cabe uno u
Error nmero 1062 otro pero ambos a la vez.
Indica que hemos tratado de
introducir un valor con clave
Veamos su utilidad. La insercin de registros y la lectura de una tabla son
duplicada. Aparecer cuando procesos incompatibles, pero cabe la posibilidad de que se intenten ejecutar
tratemos de introducir un valor ya simultneamente. No olvides que estamos en Internet y es perfectamente posible que
existente en un campo con ndice desde dos ordenadores distintos, dos personas distintas estn accediendo a la misma
nico o principal. tabla simultneamente y que uno de los accesos sea de escritura, es decir: aadir,
modificar o borrar campos en la tabla
mysql_error($enl)
Quin tiene preferencia de paso? Quien tiene que esperar?. Si la opcin
Devuelve la descripcin del error.
LOW_PRIORITY est activada, el proceso de escritura esperar a que terminen
Cuando el nmero de error es
los procesos de lectura activos pero se si est activa la opcin DELAYED el proceso
CERO devuelve una cadena vaca.
de lectura se interrumpir automticamente para ceder el paso al de escritura.
Resulta de muchsima utilidad para
depurar scripts. Respecto a la opcin IGNORE tiene utilidad cuando se trata de realizar una
secuencia de inserciones. Si no est activa en el momento en el que aparezca una
clave duplicada se interrumpir el proceso de insercin, por el contrario, si
Ejercicio n 39 estuviera activa el proceso de insercin continuar con los siguientes registros de la
secuencia, aunque -como es lgico- seguirn sin insertarse los registros con clave
Como otra prctica de duplicada.
creacin de tablas trata de
crear una tabla con los 4.- Tablas para pruebas
supuestos datos ms
Aqu tienes comentado un script que permite agregar aleatoriamente y de forma
significativos de todos los
automtica registros a la tabla demo4.
compaeros de este Curso.
Dado que en las pginas siguientes trataremos de consultas va a resultarnos muy
cmodo poder rellenarlas de forma automtica.

Ver cdigo fuente

Insertar datos
demo4

Anterior Indice Siguiente


Aadir a travs de formularios

Los valores de
Creacin del formulario
SELECT MULTIPLE El caso ms frecuente -casi el nico- es que los registros de una tabla se aadan
utilizando un formulario y enviando desde l los datos a un script PHP que ejecute la
La opcin SELECT MULTIPLE opcin de aadir. Si no recuerdas el funcionamiento de este mtodo, pulsa aqu
dentro de un form tpico de HTML
permite elegir ninguno, uno o En el ejemplo hemos desarrollado un formulario para aadir registros a la tabla
varios de los elementos de la lista. demo4 con las siguientes peculiaridades:

Basta con pulsar con el ratn sobre


cada uno de los valores elegidos Para los campos DNI, nombre y apellidos hemos utilizado input tipo texto y
manteniendo pulsada la tecla Ctrl, hemos recogido mediante la opcin name cada uno de los campos en una
es decir, puro Windows. variable independiente.
Para los campos Fecha de nacimiento y hora de nacimiento hemos utilizado
Para recoger los valores de esa
tres opciones select en cada una de ellas.
opcin se define -dentro de la
etiqueta SELECT- un name tipo La finalidad de estas opciones no es otra que impedir la introduccin de fechas
array. Bastara con escribir: no vlidas (en realidad no lo impedimos totalmente ya que, tal como est
confeccionado, podra introducirse 31 de febrero, o 31 de abril). Ese aspecto es
<SELECT MULTIPLE mejorable, pero para hacerlo desde el propio formulario tendramos de recurrir a
name=var[] SIZE=6> un lenguaje del lado del cliente (JavaScrpt por ejemplo).
Los valores de esos tres campos (tanto en fecha como en hora) los recogemos en
Como ves, var es el nombre de la
variables que son elementos de dos array escalares.
variable (esta vez sin $ delante,
recuerda que no estamos en PHP El campo sexo la recogemos en input tipo radio y les asignamos valores M F
sino en puro HTML) y va seguido que coinciden con los valores del campo ENUM de la tabla.
de [] precisamente para indicar Con el campo Fumador -opcin Fumador/No fumador - hacemos exactamente lo
que es un array. mismo, pero asignndoles valores 1 o 0 ya que el formulario no permite la opcin
NULL cadena vacia.
Lo de SIZE=6 no es otra cosa que En el script posterior ser cuando modifiquemos los valores de esas variables.
el parmetro que indica cuntos Para el campo Idiomas utilizamos una opcin select de tipo mltiple y para los
elementos de la lista de opciones values un pequeo truco que describimos aqu la izquierda.
queremos que se visualicen
simultneamente en la pgina.
Pues bien, aqu tienes, cdigo fuente del formulario que hemos diseado
El truco est en los values de
cada option dentro de ese select Ver cdigo fuente
Los hemos escrito as:
Aadir nuevo registro con datos del formulario
<option value=1>Castellano
<option value=2>Francs Como recordars, cuando se enva el contenido de un formulario mediante el
<option value=4>Ingls
method=POST y se indica como action un fichero PHP los valores enviados son
<option value=8>Alemn
<option value=16>Blgaro
recogidos en este ltimo fichero en variables de PHP que tienen como nombre $_POST
<option value=32>Chino ['var'] o $HTTP_POST_VARS['var'] donde cada una de los ndices asociativos de los
array (var) coinciden con los name de los diferentes campos del formulario.
Fjate que hemos mantenido
exactamente el mismo orden en el A partir de ah, bastara con depurar los valores recibos, recoger en variables los
que han sido definidos en el campo valores depurados e incluirlos en la sentencia MySQL INSERT -la hemos visto en la
SET de la tabla. pgina anterior- para aadirlos a la tabla correspondiente. Aqu tienes comentado el
script:
Y fjate tambin en los valores: 1,
2, 4, 8, 16 y 32 que son
precisamente las potencias de 2: Cdigo fuente del script Aadir regitros

20, 21, 22, 23, 24, 25, y 26 En realidad, tal como habrs podido ver en el cdigo fuente, la depuracin ha sido la
siguiente:
Al ir seleccionando valores, van
aadindose al array. Por ejemplo.
Si seleccionamos Francs y Hemos creado un valor de fecha y hora en formatos MySQL vlidos de la forma
Blgaro el array sera este: var que describimos un poco ms arriba.
[0]=2, var[1]=16 Hemos sumado todos los valores numricos recibidos en el array obtenido del
SELECT MULTIPLE y hemos asignado el resultado a la variable depurada que
Si sumamos esos valores (2 + 16) recoge el valor a escribir en el campo Idiomas. La justificacin de esa suma la
el resultado sera 18, y al convertir
tienes al margen.
a binario este valor, resultar:
La variable Fumador es la que tiene un poquito ms de complicacin. Vemosla
010010 con calma:
Los valores que recibimos desde formulario son 1 o 0 y hemos de transformarlos
que es como decirle a MySQL en una cadena vaca o en NULL. Hemos insertado un operador condicional (un
(mirando la cadena de derecha a if... else) para convertir eso valores en: $var="'\N'" (comilla doble, comilla
izquierda, lo recuerdas?) que simple, barra invertida, N, comilla simple y comilla doble) $var="''" (comillas
incluya los valores segundo dobles, dos comillas simples y unas comillas dobles)
(Francs) y quinto (Blgaro) del Asignados los nuevos valores tenemos que recurrir a un pequeo truco. Venimos
SELECT MULTIPLE que repitiendo que en la sentencia INSERT los nombres de las variables no
corresponden a las posiciones en numricas que contienen los values hay que escribirlos dentro de comillas
las que la cadena binaria contiene
simples, pero en el caso de un campo tipo CHAR(0) hemos de hacer una
un uno.
excepcin que sera no poner esas comillas al nombre de la variable. Al hacerlo
as, se escribiran como valores en la sentencia de insercin uno de estos: ='\N'
o =' ' (los valores de la variable) que al contener comillas ya son interpretados por
MySQL como una cadena.

Ejercicio n 40

Disea un formulario llmalo altas1.php y un script (ejercicio40.php) que permitan


aadir datos a la tabla1 que has creado en tu base de datos practicas en el ejercicio n
38.
Anterior Indice Siguiente
Consultas en tablas

Sintaxis MySQL de
Consultar los registros de una tabla
seleccin de registros
Las consultas de los datos y registros contenidos en una tabla ofrecen un amplsimo
abanico de posibilidades a partir de las opciones que tienes descritas al margen. Veamos
Las sentencias de seleccin de
registros requieren utilizar -entre algunas de las posibilidades.
otras- palabras clave como las que
enumeramos a continuacin. La consulta ms simple
Observa que hay dos tipos:
obligatorias y opcionales, y que Si utilizamos la sentencia
algunas de las palabras clave son SELECT * FROM tabla
alternativas y por lo tanto,
incompatibles en una misma
sentencia. obtendremos informacin sobre todos los campos (*) y la salida estar en el mismo
orden en el que fueron aadidos los datos. Si visualizas este ejemplo, vers que aparecen
El uso de estas palabras clave
ordenados por el valor autonumrico del campo Contador lo cual, como ves, resulta
requiere que sean insertadas en un
coherente con la afirmacin anterior.
determinado orden tal y como se
enumera aqu debajo.

Si alterramos ese orden (p. Ver cdigo fuente Ejecutar la consulta


ejemplo: colocando GROUP BY
antes de WHERE) nos dara un
error y no se ejecutara la
Consultando slo algunos campos
sentencia.
Ahora utilizaremos la sentencia
SELECT
SELECT campo1,campo2, ... FROM tabla
Es la primera palabra de la
sentencia de bsqueda y tiene
carcter obligatorio. y tendremos como resultado una lista completa, por el mismo orden que la anterior, pero
slo mostrando los campos indicados.
[STRAIGHT_JOIN]

Es una palabra clave de uso Ver cdigo fuente Ejecutar la consulta


opcional (la marcamos con
corchetes para indicar su condicin
de opcional) que fuerza al Cuidado!
optimizador MySQL a organizar las
tablas en el mismo orden en el que En los comentarios contenidos en estos ejemplos puedes ver la forma en la que
han sido especificados los campos mysql_fetch_row y mysql_fetch_array tratan los ndices escalares de los resultados que
en la clusula FORM. producen los SELECT de MySQL.
Los valores de los ndices se asignan a los contenidos de los campos por el mismo orden en
Sirve para mejorar -en casos muy
concretos- la velocidad de gestin el que estos se escriben en la sentencia SELECT. El campo1 (primero que se escribe) ser
de tablas de gran tamao. recogido por el elemento de ndice cero del array, el campo2 ser recogido con ndice uno y
as sucesivamente
[SQL_BIG_RESULT]

Es una clusula opcional que se Consultando slo algunos campos y limitando la salida a n registros
usa para indicar al optimizador que
el resultado va a tener una gran
cantidad de registros. Ahora utilizaremos la sentencia
SELECT campo1,campo2, ... FROM tabla LIMIT (n, m)
En ese caso, MySQL utilizar
tablas temporales cuando sea
necesario para optimizar la y tendremos como resultado una lista que contendr m registros a partir del n+1, por el
velocidad de gestin de la mismo orden que la anterior, y mostrando los campos indicados.
informacin.

Esta clusula tambin puede ser


Ver cdigo fuente Ejecutar la consulta
utilizada dentro de GROUP BY.

[SQL_BUFFER_RESULT]
Consultando slo algunos campos y ordenando la salida
Es opcional y su finalidad es la de
forzar a MySQL a tratar el Utilizaremos la sentencia MySQL de esta forma
resultado en un fichero temporal.
SELECT campo1,campo2, ... FROM tabla ORDER BY campo_n [ASC|DESC],
Ese tratamiento ayuda a MySQL a campo_m [ASC|DESC]
liberar recursos ms rpidamente
y es de gran utilidad (siempre
desde el punto de vista de la y tendremos como resultado una lista ordenada por el primero de los campos indicados
rapidez) cuando es necesario un en ORDER BY, y en caso de coincidencia de valores en ese campo, utilizaramos el
largo proceso de clculo antes de criterio de ordenacin sealado en segundo lugar.
enviar los resultados al cliente.

[HIGH_PRIORITY] Ver cdigo fuente Ejecutar la consulta


Esta clusula, opcional da
prioridad al comando SELECT Consulta seleccionando registros
sobre otros comandos que
simultneamente pudieran estar
intentando acceder a la tabla para Utilizaremos la sentencia MySQL de esta forma
escribir en ella (aadir o modificar SELECT campo1, ... FROM tabla WHERE condicin
registros).

Si esta opcin est activa, los que nos devolver la lista de registros que cumplen la condicin indicada. Aqu
intentos de escritura que pudieran tienes un ejemplo muy sencillo.
producirse de forma simultnea
deberan esperar al final de este
proceso para ejecutarse. Ver cdigo fuente Ejecutar la consulta
campo1, campo2, ...
La clasula WHERE permite un variado abanico de condiciones, que trataremos de
Tienen carcter obligatorio y resumir aqu. Algunos de ellas son los siguientes:
sealan los campos de la tabla
que deben incluirse en la consulta.
Tipo Cdigo Ver
Operador Sintaxis Descripcin
de campo fuente ejemplo
La funcin SELECT slo devolver
informacin de aquellos campos Selecciona los registros
que estn enumerados aqu. que contienen en el
= Numrico WHERE campo=num
campo un valor igual a
Ver Probar

Si se desea que la consulta num


incluya a todos campos bastar Selecciona los registros
con incluir en esta posicin un *, que contienen en el
que es el carcter comodn que
= Cadena WHERE campo="cadena"
campo una cadena
Ver Probar

indica a MySQL que se desea idntica a cadena (*)


incluir todos los campos en la Selecciona los registros
consulta. que contienen en el
< Numrico WHERE campo<num
campo un valor menor
Ver Probar
Los campos numricos tienen la a num
opcin de llevar asociadas
Selecciona los registros
funciones MySQL que devuelven que contienen en el
informacin estadstica. campo una cadena
cuyos n primeros
Algunas de esas funciones son las caracteres son
siguientes: < Cadena WHERE campo<"cadena"
menores que los de la
Ver Probar
cadena, siendo n el
nmero de caracteres
MAX(campo..)
que contiene cadena.
Devuelve el valor mximo (**)
de ese campo en todos los
registros de la tabla, salvo Selecciona los registros
que tenga la opcin GROUP que contienen en el
<= Numrico WHERE campo<=num
campo un valor menor
Ver Probar
BY, en cuyo caso devolver
O igual a num
el mximo de cada grupo, o
cuando tenga activada la Selecciona los registros
opcin WHERE, en cuyo que contienen en el
caso la funcin slo ser campo una cadena
cuyos n primeros
aplicada a los registros que
caracteres son
resulten de tal filtrado. menores que los de la
cadena, siendo n el
MIN(campo..)

<= Cadena WHERE campo<="cadena" nmero de caracteres Ver Probar
Idntica a la anterior en que contiene cadena y
cuanto a criterios de aade respecto al caso
seleccin, esta funcin anterior la opcin de
devuelve el mnimo. que en caso de que
ambos valores fueran
AVG(campo..) iguales tambin los
Devuelve el valor promedio presentara (**)
de todos los registros Selecciona los registros
numricos seleccionados que contienen en el
con los mismos criterios del > Numrico WHERE campo>num
campo un valor mayor
Ver Probar
caso anterior. a num
Selecciona los registros
SUM(campo..)
que contienen en el
Devuelve la suma de los campo una cadena
valores del campo y sigue cuyos n primeros
idnticos criterios de caracteres son
seleccin de campos que en > Cadena WHERE campo>"cadena"
mayores que los de la
Ver Probar
los casos anteriores. cadena, siendo n el
nmero de caracteres
STDDEV(campo..) que contiene cadena.
Devuelve la estimacin de (**)
la desviacin tpica de la Selecciona los registros
poblacin. que contienen en el
>= Numrico WHERE campo>=num
campo un valor mayor
Ver Probar
COUNT(campo..) o igual a num
Cuenta los valores no
Selecciona los registros
nulos del campo indicado. que contienen en el
campo una cadena
En el caso de aplicar estas cuyos n primeros
funciones, el resultado de la caracteres son
mayores que los de la
consulta contiene una sola lnea,
cadena, siendo n el
salvo que active la opcin GROUP
>= Cadena WHERE campo>="cadena" nmero de caracteres Ver Probar
BY, en cuyo caso devolver tantas que contiene cadena y
lneas como grupos resulten. aade respecto al caso
anterior la opcin de
FROM tabla que en caso de que
ambos valores fueran
Esta expresin -que aunque no iguales tambin los
tiene carcter obligatorio podra presentara (**)
tomarse como tal indica a MySQL
Selecciona los registros
el nombre de la tabla en el que que contienen en el
debe efectuarse la consulta. campo valores que
Numrico coinciden con alguno de
WHERE definicion WHERE campoIN (valor1,
IN o
valor2..)
los especificados dentro Ver Probar
Cadena del parntesis. Cuando
Esta instruccin tiene carcter se trata de valores no
opcional y su utilidad es la de numricoz han de ir
filtrar la consulta estableciendo los entre comillas
criterios de seleccin de los
Selecciona los registros
registros que debe devolver. en los que los valores
contenidos en el campo
Si se omite WHERE, la consulta seleccionado estn
devolver todos los registros de la comprendidos en el
tabla. intervalo valor1
(mnimo) valor2
En la parte derecha tienes Numrico (mximo) incluyendo en
WHERE campo BETWEEN
informacin sobre la manera de BETWEEN o la seleccin ambos Ver Probar
valor1 AND valor2
definir los criterios de seleccin Cadena extremos.
de esta opcin. Cuando los contenidos
de los campos son
GROUP BY definicion cadenas sigue los
mismos criterios que se
Tiene carcter opcional y su indican para los dems
finalidad es la de presentar los operadores de
resultados de la consulta comparacin
Selecciona los registros
agrupados segn el criterio en los que los valores
establecido en su definicin. IS NULL Cadena WHERE campo IS NULL
contenidos en el campo
Ver Probar
seleccionado son NULOS
Resulta de gran utilidad cuando se
pretende obtener valores Selecciona los registros
estadsticos de los registros que en los que los valores
cumplen determinadas IS NOT NULL Cadena WHERE campo IS NOT NULL contenidos en el campo Ver Probar
seleccionado son NO
condiciones (las condiciones del NULOS
agrupamiento).
(*) Cuando se trata de cadenas de caracteres, el concepto menor que significa anterior en la
ORDER BY definicion ordenacin de los caracteres segn su cdigo ASCII y mayor que significa posterior en esa misma
ordenacin.
Tambin tiene carcter opcional y (**) La discriminacin de Maysculas/Minsculas depender del tipo de campo.
su utilidad es la de presentar la Recuerda que los tipo BLOB hacen esa discriminacin, mientras que los de tipo TEXT son insensibles a
Maysculas/Minsculas.
informacin de la consulta
ordenada por los contenidos de
uno o varios campos.
Cuando se trata de comparar cadenas MySQL dispone de una potente instruccin
Siempre tiene como opcin (LIKE) que permite establecer los criterios de seleccin a toda o parte de la cadena. Su
complementaria de que en cada sintaxis contempla distintas posibilidades utilizando dos comodines>: % (que se
campo utilizado para la comporta de forma similar al (*) en las bsquedas de Windows) y _ (de comportamiento
ordenacin puede establecerse similar a (?) en Windows). Aqu tienes algunas de sus posibilidades:
uno de estos criterios ASC
(ascendente, es el valor por
defecto) o DESC. Cdigo Ver
Sintaxis Descripcin
fuente ejemplo
Si no se establece ningn orden, Selecciona todos los registros que contengan la
los resultados de la consulta WHERE campo LIKE '%cadena%' cadena en el campo indicado sea cual fuere su Ver Probar
aparecern en el mismo orden en posicin
el que fueron aadidos los Selecciona todos los registros en los que el campo
registros. WHERE campo LIKE 'cadena%' indicado que contengan la cadena exactamente al Ver Probar
principio del campo
LIMIT m, n
Selecciona todos los registros en los que el campo
WHERE campo LIKE '%cadena' indicado que contengan la cadena exactamente al Ver Probar
Esta clusula es opcional y
final del campo
permite establecer cuntos y
cules registros han de Selecciona todos los registros en los que el primer
presentarse en la salida de la caracter del campo puede ser cualquiera pero los
consulta. WHERE campo LIKE '_cadena%' siguientes han de ser exactamente los indicados en Ver Probar
cadena pudiendo ir seguidos de cualesquiera otros
Por ejemplo: LIMIT 4, 8 indicara a caracteres
MySQL que la consulta debera
mostrar OCHO registros contados El comodn (_) puede ir tanto al principio como al final y puede repetirse tantas veces
a partir del quinto (s, el quinto como sea necesario. Seria correcto LIKE '___es%' y tambin LIKE 'a___es%' as
porque LIMIT considera el primer
como: LIKE '%a___es'.
registro como CERO).

El criterio lmite se aplica sobre los Como ves, un montn de posibilidades.


resultados de la salida, es decir,
sobre los resultados Aun tiene ms opciones WHERE ya que acepta mltiples condiciones vinculadas por
seleccionados, ordenados y los operadores lgicos AND, OR, NOT o sus sintaxis equivalentes: &&, || y !.
filtrados siguiendo los criterios
establecidos por las clusulas El comportamiento de estos operadores es idntico al descrito para sus homnimos de
anteriores. PHP. Los recuerdas?... Aqu los tienes... por si acaso.

Si se escribe como un solo Un ejemplo de sintaxis puede ser:


parmetro (LIMIT k), MySQL lo
interpretar como que k es el WHERE (campo1=valor AND campo2 LIKE '_cadena%)
segundo de ellos y que el primero
es CERO, es decir:
LIMIT 0, k Utilizando funciones sobre campos
Recuento de resultados
La sintaxis
PHP dispone de dos funciones que SELECT MAX(campo1), MIN (campo2), ... FROM tabla
permiten conocer el nmero de
registros de la tabla afectados por
una sentencia MySQL. nos devolvera UNA SOLA FILA cuyos valores seran los resultados de la aplicacin de las
funciones a todos los registros del campo indicado.
mysql_num_rows ($c ) Aqu tienes un ejemplo que determina todos los valores de esos estadsticos aplicados al
campo Contador de nuestra famosa tabla demo4.
Esta funcin devuelve un valor
numrico que recoge el nmero de
Aqu est el ejemplo
registros que cumplen las
condiciones establecidas en una
consulta. Slo es vlido para
Ver cdigo fuente Ejecutar la consulta
sentencia tipo SELECT

mysql_affected_rows($c )
Aplicando la opcin GROUP BY
En este caso la funcin devuelve
tambin el nmero de registros Tal como sealamos al margen, las funciones anteriores pueden aplicarse a grupos de
afectados, pero slo en el caso de registros seleccionados mediante un criterio GROUP BY (nombre del campo)
que la sentencia MySQL haya
producido modifi- caciones en los En este ejemplo obtendremos los mismos parmetros estadsticos que en el anterior,
contenidos de la tabla. Es decir,
pero ahora agrupados por sexo, lo que significara que obtendremos dos filas de
slo recoge resultados de
sentencias que: aaden,
resultados. Aqu tienes el ejemplo
modifican o borran registros.
Ver cdigo fuente Ejecutar la consulta
Manejo de fechas en las
Como habrs podido observar, la opcin SELECT tiene un sinfn de posibilidades.
consultas

MySQL dispone de algunas Creacin de tablas a partir de la consulta de otra tabla


clusulas de gestin de fechas que
pueden tener una gran utilidad a la Es frecuente -podra decirse que es lo habitual- relacionar tablas mediante campos
hora de gestionar consultas. Son
con idntico contenido.
las siguientes:

DATE_FORMAT( campo,formato) Supongamos que entre los individuos de nuestra tabla demo4 se pretende
establecer un proceso de seleccin para elegir entre ellos un nmero determinado de
Las diferentes opciones de formato astronautas, pongamos por caso.
las tienes en la tabla de la
derecha. Es importante tener en Supongamos tambin, que la seleccin va a constar de tres pruebas que sern
cuenta que la sintaxis correcta es
juzgadas y calificadas por tres tribunales distintos.
%Y (sin espacio) ya que si hubiera
un espacio % Y interpretara la
Una primera opcin sera crear tres tablas -una para cada tribunal- e incluir en ellas
letra Y como un texto a incluir.
todos los datos de cada uno de los individuos.
CURDATE()
Esa opcin es factible pero no es ni la ms cmoda, ni tampoco es la ms rpida ni la
Dentro de DATE_FORMAT se que menos espacio de almacenamiento necesita. No debemos olvidar que una tabla
puede incluir -en vez del nombre puede tener una enorme cantidad de registros.
del campo- una cadena en la que
se indique una fecha en formato Una opcin alternativa sera crear tres nuevas tablas que slo contuvieran dos
YYYY-MM-DD hh:mm:ss. Puedes campos cada una. Por ejemplo el campo DNI y el campo Calificacin.
verlo en los ejemplos. De igual
modo es posible sustituir el Como quiera que el campo DNI ha de contener los mismos valores en las cuatro
nombre del campo -o la cadena- tablas y adems es un campo nico podran crearse las nuevas tablas y luego copiar en
por la funcin CURDATE() que cada una de ellas todos los DNI de la tabla original.
recoge la fecha actual del
sistema (nicamente da, mes y Nos garantizara que no habra errores en los DNI y adems nos garantizara que se
ao). A efectos de horas, minutos
incluyeran todos los aspirantes en esas nuevas tablas.
y segundos CURDATE() va a
tomar el medioda de la fecha
Aqu tienes el cdigo fuente de un script que crea esas tres tablas (a las que hemos
actual.
llamado demodat1, demodat2 y demodat3.
CURTIME()
Ver cdigo fuente
Se comporta de forma similar a
CURDATE().
Crear las tablas
Devuelve la hora actual del anteriores
sistema que alberga el servidor
MySQL en formato hh:mm:ss

CURRENT_TIMESTAMP() Una consulta conjunta de varias tablas


Se comporta de forma similar a
CURDATE(). MySQL permite realizar consultas simultneas en registros situados en varias tablas.

Devuelve la fecha y hora actual del Para ese menester se usa la siguiente sintaxis:
sistema en formato YYYY-MM-DD
hh:mm:ss SELECT tabla1.campo1, tabla2.campo2, ... FROM tabla1, tabla2
NOW()
en la que, como ves, modificamos ligeramente la sintaxis ya que anteponemos el
Es un alias de nombre de la tabla al del campo correspondiente separando ambos nombres por un
CURRENT_TIMESTAMP().
punto, con lo cual no hay posibilidad de error de identificacin del campo incluso
mysql_result($resultado,num, cuando campos de distinta tabla tengan el mismo nombre.
campo)
Otra innovacin -respecto a los ejemplos anteriores- es que detrs de la clusula
Esta funcin PHP permite obtener FROM escribimos los nombres de todas las tablas que est usando SELECT.
un solo campo de uno solo de los
registros obtenidos como resultado A partir de ah se pueden establecer todo tipo de relaciones para las sentencias
de una consulta MySQL. WHERE, ORDER BY y GROUP BY utilizando para ello campos de cualquiera de las
tablas sin otra particularidad ms que poner cuidado al aludir a los campos utilizando
El parmetro $resultado es la
siempre la sintaxis nombre_tabla.nombre_campo.
variable que recoge en resultado
obtenido de la ejecucin de
A modo de ejemplo -hemos procurado comentarlo lnea a lnea- aqu tienes un script
mysql_query de forma idntica a
PHP que hace una consulta conjunta de las tablas demo4, demodat1, demodat2 y
como lo hacamos en otras
consultas. demodat3 y nos presenta una tabla con los datos personales y las puntuaciones de las
tres pruebas as como las suma de puntos de las tres y, adems, ordena los resultados -
El valor num es un nmero entero de mayor a menor- segn la suma de las tres puntuaciones.
que indica el nmero de fila de la
que queremos extraer el valor
contenido en uno de sus campos. Ver cdigo fuente Ejecutar la consulta

El valor campo indica el nmero


del campo que tratamos de Formatos de fechas en consultas MySQL
extraer. Este nmero (la primera
posicin siempre es cero) indica el
nmero de orden del campo tal Los formatos soportados por la funcin DATE_FORMAT format son los siguientes:
como est especificado en la
sentencia SELECT. Si en esta Formato Descripcin Sintaxis Ver cdigo Ver ejemplo
sentencia se incluyera * (extraer
Da del mes en formato de dos
todos los campos) considerara el %d DATE_FORMAT(Nacimiento,'%d') Ver Probar
dgitos
orden en el que est creada la
estructura de la tabla que los Da del mes en formato de uno
%e DATE_FORMAT(Nacimiento,'%e') Ver Probar
contiene. dos dgitos
Nmero de da seguido del sufijo en
Este es el cdigo fuente de un %D DATE_FORMAT(Nacimiento,'%D') Ver Probar
ingls
ejemplo comentado y este un Nmero del mes en formato de dos
enlace de prueba del script. %m DATE_FORMAT(Nacimiento,'%m') Ver Probar
dgitos
Nmero del mes en formato de uno Ver Probar
%c DATE_FORMAT(Nacimiento,'%c')
o dos dgitos
%M Nombre del mes (en ingls) DATE_FORMAT(Nacimiento,'%M') Ver Probar
Nombre del mes abreviado (en
%b DATE_FORMAT(Nacimiento,'%b') Ver Probar
ingls)
Nmero del ao en formato de dos
%y DATE_FORMAT(Nacimiento,'%y') Ver Probar
dgitos
Nmero del ao en formato de
%Y DATE_FORMAT(Nacimiento,'%Y') Ver Probar
cuatro dgitos
Nmero de da de la semana
%w DATE_FORMAT(Nacimiento,'%w') Ver Probar
0=Domingo ... 6=Sbado
Nombre del da de la semana (en
%W DATE_FORMAT(Nacimiento,'%W') Ver Probar
ingls)
Nombre abreviado del da de la
%W DATE_FORMAT(Nacimiento,'%W') Ver Probar
semana (en ingls)
Nmero de da del ao en formato
%j DATE_FORMAT(Nacimiento,'%j') Ver Probar
de 3 dgitos
Nmero de semana del ao
considerando el DOMINGO como
%U DATE_FORMAT(Nacimiento,'%U') Ver Probar
primer da de la semana (en
formato de dos dgitos)
Nmero de semana del ao
considerando el LUNES como primer
%u DATE_FORMAT(Nacimiento,'%u') Ver Probar
da de la semana (en formato de
dos dgitos)
La fecha para los ejemplos siguientes la extraemos de una variable del tipo:
$fecha="2005-10-12 14:23:42"
ya que la tabla no contiene campos de fecha que incluyan horas, minutos y segundos
Hora con dos dgitos (formato 0 a
%H DATE_FORMAT($fecha,'%H')
24 horas)
Hora con uno dos dgitos (formato
%k DATE_FORMAT($fecha,'%k')
0 a 24 horas)
Hora con dos dgitos (formato 0 a
%h DATE_FORMAT($fecha,'%h')
12 horas)
Hora con uno dos dgitos (formato
%I DATE_FORMAT($fecha,'%I')
0 a 12 horas)
%i Minutos con dos dgitos DATE_FORMAT($fecha,'%i')
%s Segundos con dos dgitos DATE_FORMAT($fecha,'%s')
Hora completa (HH:mm:ss) en
Ver Probar
%r formato de 12 horas indicando AM DATE_FORMAT($fecha,'%r')
PM
Hora completa (HH:mm:ss) en
%T DATE_FORMAT($fecha,'%T')
formato de 24 horas
Incluye el texto que se indica detrs
% texto DATE_FORMAT($fecha,'% texto')
del %
Aade AM PM dependiendo de la
%p DATE_FORMAT($fecha,'%p')
Hora
Se pueden combinar a voluntad varias opciones utilizando una sintaxis de este
tipo:
'% Hoy es: %d - %m - %Y % es %W % estamos en el mes de %M % <br>y
van transcurridos %j % dias de este ao.<br>Son las %r'

Ejercicio n 41

En esta actividad debes elaborar varios scripts puedes llamarlos ejercicio41_1.php,


etctera que permitan realizar consultas en la base de datos que has creado en el ejercicio
n 38.
Previamente, tendras que aadirle datos, bien manualmente o bien modificando el ejemplo
de generacin de registros aleatorios que hemos incluido en la pgina anterior.

Ejercicio n 42

Construye una nueva tabla tabla2 con los mismos campos que tu tabla1 pero aadiendo
el carcter de clave principal al campo que recoge el DNI, con lo cual podrs impedir que
puedan repetirse dos alumnos con el mismo DNI.
A partir de ella, crea tablas auxiliares (transfiriendo los datos de tabla1) de calificaciones
de materias, por ejemplo que contengan dos campos: DNI y calificacin.
Por ltimo, tendras que crear todo lo necesario para que el profesor de cada materia,
pudiera insertar sus calificaciones y, adems, crea un documento final que permita visualizar
simultneamente las calificaciones del alumno en todas la materias.

Anterior Indice Siguiente


Modificar registros

Sintaxis MySQL de
Modificar un campo en todos los registros de una tabla
modificacin de registros La sentencia MySQL, que permite modificar uno o varios campos en todos los
registros de una tabla, es la siguiente:
Las sentencias MySQL que
permiten la modificacin de UPDATE tabla SET campo1=valor1, campo2=valor2
registros en las tablas pueden
incluir algunas de las siguientes
clusulas que, al igual que ocurra Cuidado con esta sentencia!. Hay que tener muy presente que con esta sentencia -en
en casos anteriores, pueden tener la que no aparece WHERE- se modificarn TODOS LOS REGISTROS DE LA TABLA y
categora de obligatorias u por lo tanto los campos modificados tendrn el mismo valor en todos los registros.
opcionales.

El orden en que deben estar Algunas consideraciones sobre la sintaxis


indicadas ha de seguir la misma
secuencia en la que estn
descritas aqu. Siempre que manejes PHP y MySQL debes tener muy presente lo siguiente:

UPDATE
MySQL requiere SIEMPRE que los valores tipo cadena que incluyen campos de
Tiene carcter obligatorio, debe fecha vayan entre comillas. Por el contrario, los numricos no deben llevar
ser la primera palabra de la comillas.
sentencia e indica a MySQL que Presta mucha atencin a esto cuando escribas los valores directamente en la
vamos realizar una modificacin. sentencia MySQL
Cuando pases valores desde una variable PHP debes tener muy en cuenta las
[LOW_PRIORITY] consideraciones anteriores y si el contenido de la variable es una cadena que va a
Es opcional e indica a MySQL ser tratada como tal por MySQL tienes dos opciones para evitar el error:
espere a que se terminen de
hacer las consultas que en ese Definir la variable as: $variable ="'valor'" (comillas dobles, comilla
momento pudiera haber en simple al principio y comilla simple, comilla doble al final) y poner en la
proceso antes realizar la sentencia MySQL el nombre de la variable sin entrecomillar, o
actualizacin. Definir la variable PHP as: $variable ="valor" y al escribir el nombre de
esa variable en la sentencia MySQL escribirlo entre comillas sencillas, es
[IGNORE] decir, as: '$variable'
Es opcional. Cuando se incluye en
No pienses que es caprichoso el orden que hemos puesto en las comillas. Recuerda
una sentencia el proceso de
que al llamar a la sentencia MySQL, el contenido de la sentencia va entre
actualizacin no se interrumpe si
aparece un conflicto de clave comillas (que por costumbre son comillas dobles, por esa razn todo
duplicada en uno de los registros entrecomillado que vaya dentro de esa sentencia ha de usar comillas simples
en proceso. Simplemente ignora para evitar un error seguro).
ese registro y contina con los
siguientes De ah que al definir una variable PHP en la forma $variable ="'valor'" las
comillas dobles exteriores indican a PHP que se trata de una cadena, por lo que, al
Si no se incluye, el proceso de pasar la variable a MySQL ste recibir el contenido de la cadena que es,
modificacin se interrumpe en el logicamente: 'valor' y en este caso las comillas forman parte del valor, razn por
momento en que encuentre un el que no es necesario escribir -en la sentencia MySQL- el nombre de la variable
conflicto de clave duplicada.
entrecomillado.
Tanto con ignore como sin esa
clusula, en el caso de duplicidad En este primer ejemplo, hemos incluido una actualizacin de tablas que pondr
de clave NUNCA se efectan las puntuacin 7 en la primera de las pruebas a todos los aspirantes a astronautas de
modificaciones. nuestro ejemplo.
tabla
Es un caso de actualizacin sin la condicin WHERE y tiene el cdigo comentado.
Es obligatoria y contiene el
nombre de la tabla que
Ver cdigo fuente Ejecutar la modificacin
pretendemos modificar.

SET Seleccin y modificacin de un solo registro


Tiene carcter obligatorio y debe
estar delante de las definiciones de Es una de las opciones ms habituales. Es el caso en el que mediante un formulario
campo y valor. asignamos una condicin a WHERE y simultneamente asignamos los nuevos valor del
campo o campos elegidos. Requiere la siguiente sintaxis:
campo1 = valor1
UPDATE tabla SET campo1=valor1, campo2=valor2 WHERE condicin
Es obligatoria al menos una
definicin. Indica el nombre del La condicin es fundamental en esta opcin y normalmente aludir a un campo ndice
campo a modificar (campo1) y el (clave principal o nica), de modo que sea un solo registro el que cumpla la condicin.
valor que se asignar a ese Podra ser el caso, en nuestro ejemplo, del campo DNI que por su unicidad garantizara
campo.
que la modificacin solamente va a afectar a uno solo de los registros.
Si se pretende modificar ms de
un campo se repetir esta El ejemplo siguiente nos permitir hacer modificaciones de este tipo en la tabla
definicin tantas veces como sea deomodat2. Observa el cdigo fuente y vers que mediante un simple recurso
necesario, separando cada una de JavaScript, el script que realiza la modificacin nos reenva al formulario con un mensaje
ellas por una coma. de confirmacin de la modificacin.

WHERE Ver cdigo formulario Ver cdigo del script Ejecutar la modificacin
Es un campo opcional y su
comportamiento es idntico a Modificacin simltanea de un campo
sealado al mencionar el proceso
de consultas. en cualquiera de los registros
ORDER BY Aqu tienes un ejemplo que permite visualizar el valor actual de todas las
puntuaciones de la prueba 2 de los astronautas as como sus nombres y apellidos y DNI y
Tiene idntica funcionalidad a la en la cual se pueden modificar ninguno, uno, varios o todos los valores y
descrita al referirnos a consultas posteriormente actualizarlos todos con los nuevos valores.

Ver cdigo formulario Ver cdigo del script Ejecutar la modificacin


Ejercicio n 43

Crea los formularios y scripts necesarios para poder elegir un alumno cualquiera mediante
su DNI en la tabla1 y modificar cualquiera de sus datos personales.

Anterior Indice Siguiente


Borrar registros y salvar datos

Sintaxis MySQL para


Borrar todos los registros de una tabla
borrado de registros La sentencia MySQL que permite borrar todos los registros de una tabla es la
siguiente:
La sintaxis MySQL para las DELETE FROM tabla
sentencia de borrado de registros Ten muy presente que con esta sentencia -en la que no aparece WHERE- se
de una tabla puede contener las BORRARN TODOS LOS REGISTROS DE LA TABLA.
siguientes clusulas que, al igual
que ocurra en casos anteriores, Respecto a otras posibles opciones no difiere en nada de lo indicado en la pgina
pueden tener categora de
anterior. Simplemente habra que sustituir en aquellos script UPDATE por DELETE. Borrar
obligatorias u opcionales.
un registro no es otra cosa que un caso particular de modificacin.
La secuencia en la que deben estar
indicadas en la sentencia es Integridad referencial tras el borrado de una tabla
idntica al orden en que estn
descritas aqu.
Recuerdas el ejemplo de las pruebas de seleccin de astronautas? Recuerdas que las
DELETE tres tablas de puntuaciones haban sido creadas a partir de la tabla de datos de los
aspirantes? Qu ocurrira si borrsemos uno o varios registros de una de ellas? Qu
Tiene carcter obligatorio. Debe
ocurrira se despus de crear esas tablas aadisemos nuevos aspirantes a la lista de
ser la primera palabra de la
candidatos?
sentencia e indica a MySQL que
tratamos de borrar uno o ms
Es obvio que si no hacemos algo para evitarlo se perdera la integridad
registros.
referencial - la relacin uno a uno - entre los registros de esas tablas.
LOW_PRIORITY
Ocurrira que no todos los individuos que estn incluidos en una de esas tablas lo
Es opcional e indica a MySQL que estaran en las dems y por tanto, al ejecutar consultas o modificaciones posteriores
espere para realizar la correramos el riesgo de que se produjeran errores.
actualizacin a que terminen las
consultas del fichero (en el caso de Esa situacin es fcilmente evitable modificando ligeramente los scripts con los que
haber alguna en proceso). se realizan los procesos de altas y bajas.
Bastara con aadirles algunas sentencias que cada vez que se efecta un alta o
FROM
baja en el fichero de datos personales efecten el mismo proceso en todos los
Tiene carcter obligatorio y debe dems ficheros relacionados con aquel.
preceder a la definicin de la tabla
en la que se pretende eliminar Aqu tienes comentado el cdigo fuente de la modificacin aadida al script que
registros. registra los nuevos aspirantes en el fichero de altas de la tabla demo4. Con esta
modificacin se actualizaran automticamente los ficheros demodat1, demodat2 y
tabla demodat3 cada vez que se aadiera un nuevo aspirante.
Es obligatoria e indica el nombre
El formulario no requiere ninguna modificacin, los cambios slo es necesario
de la tabla en la que pretendemos
realizarlos en el script que realiza la insercin.
efectuar el borrado o eliminacin
de los registros.
Aadir un nuevo
WHERE
Ver cdigo fuente
aspirante
Es un campo opcional y su
comportamiento es idntico al
sealado en al mencionar el Hecho este pequeo inciso -creemos que importante y necesario - continuaremos con
proceso de consultas. la referencia al borrado de registros.

LIMIT n En este ejemplo, tienes el cdigo fuente de un script que realiza el borrado de un
registo mediante un formulario en el que se inserta el DNI tanto en la tabla demo4
La opcin LIMIT es opcional y como demodat1, demodat2 y demodat3 manteniendo la integridad referencial entre
propia de MySQL. los cuatro ficheros.
Su finalidad es limitar el tiempo
de ejecucin del comando DELETE
Ver script Borrar un registro
ya que cuando est activada
devuelve el control al potencial
cliente despus de borrar n
registros, con lo que en procesos
Borrar registros seleccionndolos de una lista
de borrados muy largos (ficheros
En el ejemplo siguiente tienes el cdigo para utilizar la clusula WHERE en un proceso
de gran tamao) no obliga a
esperar a borrado total para de borrado de registros que presenta un formulario que contiene una lista con todos
proceder a la consulta de la tabla. los registros actuales y una casilla de verificacin por cada uno.

Cuando se utiliza esta opcin, la Al marcar las casillas y enviar el formulario el script que recibe los datos procede al
sentencia DELETE debe repetirse borrado de todos los registros marcados en todas la tablas afectadas.
hasta que el nmero de registros
pendientes de borrado sea inferior Ver formulario Ver script Ejecutar ejemplo
al valor de n.

Optimizacin de tablas
Guardar y recuperar bases de datos y o tablas
Cuando se ejecuta la sentencia
DELETE -pese a que son Aunque es perfectamente factible desarrollar scripts propios que permitan guardar y
eliminados los valores de los recuperar tanto las estructuras como los datos de una tabla de la base de datos
campos- se conservan las completa, mencionaremos aqu una de las posibilidades ms cmodas de hacerlos.
posiciones de los registros
borrados, con lo cual no se PhpMyAdmin es una magnifica herramienta para hacer y recuperar copias de
reduce el tamao de la tabla. seguridad.
Esas posiciones de registro sern
Si abrimos esta utilidad http://localhost/myadmin/ podremos ver los dos enlaces que
utilizadas por MySQL para
escribir los registros que se vayan ves en la imagen SQL y Exportar que permiten importar y exportar tanto estructuras
aadiendo despus del proceso como datos y estructuras.
de borrado.

Para eliminar esos registros vacos


y reducir el tamao de una tabla,
MySQL dispone de una sentencia
que es la siguiente:

OPTIMIZE TABLE tabla

Esta sentencia -que debe usarse


despus de un proceso de borrado
amplio- depura la tabla
eliminando los registros
inutilizados por el proceso DELETE,
con lo que logra una reduccin del
tamao de la tabla a su dimensin
ptima.

Los arrays de la sentencia


SELECT Al pulsar sobre Exportar nos aparecer una pgina como esta:

Aunque estn comentados en los


cdigos fuente de los scripts
queremos reiterar aqu
aprovechando este espacio que la
maquetacin nos concede para
hacer algunas precisiones sobre
los resultados de las consultas de
tablas.

Se trata de los ndices de los


arrays que se obtienen mediante
las funciones:

mysql_fetch_array()
y
mysql_fetch_row()

Los ndices escalares, en ambos


casos, cuanto tratan informacin
obtenida mediante una sentencia
SELECT coinciden con el orden en
el que han sido establecidos los
campos en esa instruccin
concreta. De modo que el primer
de esos nombres de campos sera
asociado con el ndice cero de
estos array, el segundo con el
ndice 1 y as sucesivamente.

En el caso del array asociativo donde podremos elegir una, varias o todas la tablas y que segn la opciones elegidas nos
devuelto por la primera de estas permite exportar estructuras y/o datos, segn las casillas de verificacin que tengamos
funciones, los ndices coinciden marcadas. Adems nos permite elegir el formato en el que queremos guardar la copia
siempre con los nombres de los en nuestro caso elegiramos SQL y tambin segn est o no activada la casilla de
campos de los que han sido
verificacin Enviar visualizar el fichero generado o guardarlo con el nombre que hayamos
extrados los datos.
consignado en la caja de texto Plantilla del nombre del archivo.
En el caso de que la consulta
afecte a varias tablas (recuerda
que los campos se asignan
poniendo tabla.campo (nombre de
la tabla y nombre del campo) el
ndice del array asociativo sera
esa expresin con el punto incluido.

Para restaurar datos y/o estructuras desde un fichero de seguridad creado mediante el
proceso anterior usaramos la opcin SQL de la primera imagen. A travs de ella
accederamos a una pgina cuyo contenido estamos visualizando en esta ltima imagen.

Bastara pulsar en examinar, buscar el fichero de seguridad y pulsar contine. MySQL


se encargara de restaurar en la base de datos a la que pertenezcan todas las tablas
contenidas en esa copia.

Anterior Indice Siguiente


Imgenes en tablas

Peculiaridades de las
tablas
Creacin de una tabla ejemplo

Las tablas que han de contener Lo primero de todo ser disponer de una tabla en la que puedan guardarse imgenes.
imgenes deben tener campos del Aqu tienes un ejemplo.
tipo BLOB, MEDIUMBLOB o
LONGBLOB, pudiendo elegir aquel <?
de ellos que ms se adecue al #el nombre de la tabla
tamao, en bytes, de las imgenes
$base="ejemplos";
que se desean guardar en la tabla.
#definimos otra variable con el NOMBRE QUE QUEREMOS DAR A LA TABLA
Por si te has olvidado de los tipos $tabla="fotos";
de campos, aqu tienes un enlace # establecemos la conexin con el servidor
para recordarlos. $conexion=mysql_connect ("localhost","pepe","pepa");
#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS CREAR LA TABLA
En el ejemplo la hemos creado con mysql_select_db ($base, $conexion);
un campo BLOB insertando
tambin campos para recoger su $crear="CREATE TABLE IF NOT EXISTS $tabla (";
nombre, su tamao (en bytes), su
$crear.="num_ident INT(10) unsigned NOT NULL AUTO_INCREMENT,";
formato (el tipo de fichero
$crear.="imagen BLOB NOT NULL, ";
transferido) as como un campo
autoincremental. $crear.="nombre VARCHAR(255) NOT NULL DEFAULT '',";
$crear.="tamano VARCHAR(15) NOT NULL DEFAULT '',";
Desde este enlace -has de tener $crear.="formato VARCHAR(10) NOT NULL DEFAULT '',";
activo el servidor MySQL- podrs $crear.="PRIMARY KEY (num_ident))";
crear la tabla fotos e insertar
automticamente algunas #Creamos la cadena, comprobamos si esa instruccin devuelve
imgenes de ejemplo. # VERDADERO o FALSO
# y dependiendo de ellos insertamos el mensaje de exito o fracaso
Crear tabla con
imgenes if(mysql_db_query ($base,$crear ,$conexion)) {
echo "<h2> Tabla $tabla creada con EXITO </h2><br>";
}else{
Transferencia de la imagen echo "<h2> La tabla $tabla NO HA PODIDO CREARSE</h2><br>";
};
El formulario para realizar la
transferencia de la imagen no # cerramos la conexin... y listo...
tiene particularidades. Es un
formulario como los de toda la mysql_close($conexion);
vida. Lo nico reseable sera ?>
incluir un campo oculto en el que
pudiera especificarse una
restriccin en cuanto al tamao Formulario para la transferencia de las imgenes
mximo permitido para cada
imagen y que debe estar acorde
con el tipo de campo utilizado en <FORM ENCTYPE="multipart/form-data" ACTION="ejemplo211.php"
la tabla. METHOD="post">
#con este input "oculto" establecemos el limite mximo
Comprobacin # del tamao del fichero a transferir. En este ejemplo 65.000 bytes
<INPUT type="hidden" name="lim_tamano" value="65000">
del tipo de imagen
<p><b>Selecciona la imagen a transferir<b><br>
<INPUT type="file" name="foto"><br>
Al transferir imgenes jpg png <p><b>Ttulo la imagen<b><br>
el type MIME que reciba el <INPUT type="text" name="titulo"><br></p>
servidor es distinto segn el
<p><INPUT type="submit" name="enviar" value="Aceptar"></p>
navegador que se utilice para
hacer la transferencia.
</FORM>

Aqu a la derecha, en el cdigo


fuente del script que actualiza la Ejemplo de
base de datos, tienes los nombres transferencia de
de esos tipos asociados a los imagen
navegadores ms usuales.

Hay otro aspecto a tener en Script para actualizar la base de datos


cuenta. Esa discriminacin de tipos
se plantea nicamente cuando
Apache recibe una transferencia.
<?
Cuando se visualiza un contenido $foto_name= $_FILES['foto']['name'];
las cabeceras tipo de contenido $foto_size= $_FILES['foto']['size'];
(header("content-type: xx")) $foto_type= $_FILES['foto']['type'];
pueden ser las mismas para todos $foto_temporal= $_FILES['foto']['tmp_name'];
los navegadores. Esa es la razn $lim_tamano= $_POST['lim_tamano'];
por la que a la hora de incluir el $foto_titulo= $_POST['titulo'];
formato en la tabla utilizamos /* limitamos los formatos de imagen admitidos a:
image/jpg, image/gif o image/png. png que segun del navegador que ulicemos puede ser:
en IE image/x-png en Firefox y Mozilla image/png
Cmo guardamos la jpg que puede tener como tipo
imagen? en IE image/pjpeg en Firefox y Mozilla image/jpeg
gif que tiene como tipo image/gif en todos los navegadores
Mira los comentarios al margen sobre la variable $extensin */
La informacin recibida a travs
del formulario requiere un ligero if ($foto_type=="image/x-png" OR $foto_type=="image/png"){
retoque antes de incluirla en le $extension="image/png";
campo BLOB de la tabla. Esa }
reconversin requiere abrir la if ($foto_type=="image/pjpeg" OR $foto_type=="image/jpeg"){
imagen en modo binario (rb) - $extension="image/jpeg";
parece que solo en el caso de }
Windows leer el fichero completo if ($foto_type=="image/gif" OR $foto_type=="image/gif"){
y aadirle \ antes de las comillas $extension="image/gif";
mediante addslashes. }
# condicionamos la insercin a que la foto tenga nombre,
Una vez hecho el retoque ya puede # un tamao distinto de cero y menor de lmite establecido
guardarse sin ms problema.
# en el formulario y que la variable extensin sea no nula

PNG con transparencias if ($foto_name != "" AND $foto_size != 0


en Internet Explorer AND $foto_titulo !='' AND
$foto_size<=$lim_tamano AND $extension !=''){
Internet Explorer no permite /*reconversion de la imagen para meter en la tabla
visualizar de forma automtica las abrimos el fichero temporal en modo
transparencias de las imgenes lectura "r" binaria"b"*/
con formato png. Existen en la red $f1= fopen($foto_temporal,"rb");
algunos recursos que permiten #leemos el fichero completo limitando
solventar ese problema. # la lectura al tamao de fichero
$foto_reconvertida = fread($f1, $foto_size);
Hemos elegido uno de ellos
#anteponemos \ a las comillas que pudiera contener el fichero
pngfix.js- que puedes ver en este
# para evitar que sean interpretadas como final de cadena
enlace.
$foto_reconvertida=addslashes($foto_reconvertida);
Se trata de un fichero JavaScript # abrimos la base de datos y escribimos las intrucciones de insercin
que basta incluir en la cabecera # en el campo BLOB insertaremos la foto_reconvertida
HMTL de la pgina de la forma que $base="ejemplos";
ves en el ejemplo de la parte $tabla="fotos";
derecha. Cuando un navegador IE $conexion=mysql_connect ("localhost","pepe","pepa");
es detectado se ejecuta una mysql_select_db ($base, $conexion);
funcin contenida en ese fichero $meter="INSERT INTO ".$tabla;
que analiza la pgina, busca $meter .=" (num_ident, imagen, nombre, tamano, formato) ";
imgenes con extensin png y les $meter .=" VALUES('','$foto_reconvertida','$foto_titulo',";
aplica la transparencia adecuada. $meter .= "$foto_size, '$extension')";
Por esa razn, es probable que if (@mysql_query($meter,$conexion)){
inicialmente (al cargar la pgina) print "Foto guardada en la tabla";
se visualice la imagen opaca y }else{
que, posteriormente, adquiera la print "Ha habido un error al guardar la foto";
transparencia. }
}else{
Ver las imgenes echo "<h2>No ha podido transferirse el fichero</h2>";
}
mysql_close();
La lectura de una imagen utiliza
?>
solo dos instrucciones. Incluir la
cabecera Header en el que se
indica el tipo de contenido (el Script para leer la base de datos
famoso nombre MIME de la
imagen) y luego imprimir el
contenido del campo. <html>
<head>
Pero (por aquello de que header <!-- al margen te comentamos la razn por la que -->
debe ir incluida en el script antes
<!-- se incluyen estas lneas en rojo -->
que cualquier otra salida) si
<!--[if IE ]>
pretendemos incluir en una pgina
algo ms que una imagen <script type="text/javascript" src="pngfix.js"></script>
tendremos que invocar esas dos <![endif]-->
funciones, de forma independiente, </head>
para cada una de ellas. <body>
<?
Por esa razn, en el ejemplo que $base="ejemplos";
tienes al margen, al desarrollar el $tabla="fotos";
ejemplo que permite visualizar
$conexion=mysql_connect ("localhost","pepe","pepa");
todas las imgenes de la tabla
mysql_select_db ($base, $conexion);
hemos tenido que incluir un script
que va leyendo la tabla que con $sacar = "SELECT * FROM ".$tabla;
contiene las imgenes para extraer $resultado = mysql_query($sacar,$conexion);
los campos informativos y a la while ($registro = mysql_fetch_array($resultado)){
hora de ver la imagen hemos de print "<center>Titulo de la imagen: ".$registro['nombre']."<br>";
recurrir a la misma tcnica que se /* la inclusin de este condicional obedece a los problemas que plantea
utilizaba para ver las imgenes la visualizacin de las transparencias
dinmicas. de las imgenes png en Internet Explorer.
Al margen justificamos las razones de su inclusin */
Es decir, poner una etiqueta de
if($registro['formato']=="image/png"){
imagen de las de HTML pero -en
vez de escribir el nombre de la print "<img src='ver_foto.php?n=".$registro
imagen- poniendo incluyendo ['num_ident']."&v=png'><br>";
como nombre el del script que las }else{
visualiza y pasndole el nmero print "<img src='ver_foto.php?n=".$registro['num_ident']."'><br>";
(valor del campo autoincremental) }
de la imagen que pretend print "Tamao de la imagen: ".$registro['tamano']." bytes
visualizar. </center>";

El problema de los PNG en }


IE mysql_close();
?>
</body>
El JavaScript que asigna la
</html>
transparencia a las imgenes en
formato png las identifica
buscando la coincidencia de los
tres ltimos caracteres del nombre Script para leer imgenes de la base datos
de la imagen con la extensin png.

Cuando se trata de imgenes <?


dinmicas el nombre de la imagen $numero=$_REQUEST['n'];
coinciden con el nombre de la $base="ejemplos";
llamada al script que se utiliza $tabla="fotos";
para su visualizacin. Por eso,
$conexion=mysql_connect ("localhost","pepe","pepa");
para advertir a JavaScript de que
mysql_select_db ($base, $conexion);
se trata de una imagen png
hemos incluido el condicional que $sacar = "SELECT * FROM ".$tabla." WHERE (num_ident=$numero)" ;
puedes ver en el ejemplo. De esa $resultado = mysql_query($sacar,$conexion);
forma, cuando se trata de una while ($registro = mysql_fetch_array($resultado)){
imagen en este formato incluimos $tipo_foto=$registro['formato'];
en la peticin una variable con el header("Content-type: $tipo_foto");
valor png de forma que pueda ser
echo $registro['imagen'];
reconocida por pngfix.js y aplicada
}
la transparencia requerida.
mysql_close();
?>

Ver imgenes
guardadas

Anterior Indice Siguiente


Tablas InnoDB

Tipos de tablas
Creacin de una tabla InnoDB
Aunque en los temas anteriores no
hemos hecho alusin a ello, MySQL La creacin de tablas tipo InnoDB requiere una de estas dos sentencias:
permite usar diferentes tipos de
tablas tales como: CREATE TABLE IF NOT EXISTS tabla (campo1, campo2,... ) Type=InnoDB

ISAM
CREATE TABLE tabla (campo1, campo2,... ) Type=InnoDB
MyISAM
Este script crear una tabla InnoDB con idnticos campos a los utilizados en el caso de la

InnoDB
tabla demo4 con la que hemos venido trabajando hasta ahora. La sintaxis, muy similar a
la utilizada all es esta:
Las tablas ISAM son las de
formato ms antiguo. Estn
limitadas a tamaos que no <?
superen los 4 gigas y no permite $base="ejemplos";
copiar tablas entre mquinas con $tabla="demoINNO";
distinto sistema operativo. $c=mysql_connect ("localhost","pepe","pepa");
mysql_select_db ($base, $c);
Las tablas MySAM son el resultado
de la evolucin de las anteriores,
$crear="CREATE TABLE $tabla (";
ya que resuelven el problema que
planteaban las anteriores y son el $crear.="Contador TINYINT(8) UNSIGNED ZEROFILL NOT NULL
formato por defecto de MySQL a AUTO_INCREMENT,";
partir de su versin 3.23. $crear.="DNI CHAR(8) NOT NULL, ";
$crear.="Nombre VARCHAR (20) NOT NULL, ";
Las tablas del tipo InnoDB tienen $crear.="Apellido1 VARCHAR (15) not null, ";
una estructura distinta que $crear.="Apellido2 VARCHAR (15) not null, ";
MyISAM, ya que utilizan un slo $crear.="Nacimiento DATE DEFAULT '1970-12-21', ";
archivo por tabla en ver de los
$crear.="Hora TIME DEFAULT '00:00:00', ";
tres habituales en los tipos
$crear.="Sexo Enum('M','F') DEFAULT 'M' not null, ";
anteriores.
$crear.="Fumador CHAR(0) , ";
Incorporan un par de ventajas $crear.="Idiomas SET(' Castellano',' Francs','Ingls',
importantes, ya que permiten ' Alemn',' Blgaro',' Chino'), ";
realizar transacciones y definir $crear.=" PRIMARY KEY(DNI), ";
reglas de integridad referencial. $crear.=" UNIQUE auto (Contador)";
$crear.=")";
Creacin y uso de # esta es la nica diferencia con el proceso de
tablas InnoDB # creacin de tablas MyISAM
$crear.=" Type=InnoDB";
La creacin de tablas de este tipo
if(mysql_query ($crear ,$c)) {
no presenta ninguna dificultad
echo "<h2> Tabla $tabla creada con EXITO </h2><br>";
aadida. El proceso es idntico a
las tablas habituales sin ms que }else{
aadir Type=InnoDB despus de echo "<h2> La tabla $tabla NO HA PODIDO CREARSE ";
cerrar el parntesis de la sentencia # echo mysql_error ($c)."<br>";
de creacin de la tabla. $numerror=mysql_errno ($c);
if ($numerror==1050){echo "porque YA EXISTE</h2>";}
Una vez creadas, las tablas };
InnoDB se comportan a efectos mysql_close($c);
de uso exactamente igual que las
?>
que hemos venido utilizando en las
pginas anteriores. No es preciso
hacer ningn tipo de modificacin
en la sintaxis. Por tanto, es
Crear tabla
totalmente vlido todo lo ya InnoDB
comentado respecto a: altas,
modificaciones, consultas y bajas.

Cuidado!
Las transacciones
Bajo Windows, al crear una base de datos o tabla InnoDB el nombre de la misma aparecer
Uno de los riesgos que se plantean en minsculas independientemente de la sintaxis que hayamos utilizado en su creacin.
en la gestin de bases de datos es
que pueda producirse una Si observas el ejemplo anterior, hemos puesto demoINNO como nombre de la tabla. Sin
interrupcin del proceso mientras embargo, si miras el directorio c:\mysql vers que aparece el fichero demoinno.frm con
se est actualizando una o varias minsculas.
tablas. Pongamos como ejemplo el
cobro de nuestra nmina. Son
necesarias dos anotaciones
simultneas: ll cargo en la cuenta Las primeras transacciones
del Organismo pagador y el abono
en nuestra cuenta bancaria. Si se
interrumpiera fortuitamente el <?
proceso en el intermedio de las $base="ejemplos";
dos operaciones podra darse la # escribimos el nombre de la tabla en MINUSCULAS
circunstancia de que apareciera # para asegurar la compatibilidad entre plataformas
registrado el pago sin que se $tabla="demoinno";
llegaran a anotar los haberes en $conexion=mysql_connect("localhost","pepe","pepa");
nuestra cuenta. mysql_select_db ($base, $conexion);
# insertamos la sentencia BEGIN para indicar el comienzo
Las transacciones evitan este tipo
de situaciones ya que los registros # de una transaccin
de los datos se registran de mysql_query("BEGIN",$conexion);
manera provisional y no toman /* hasta que no aparezca una sentencia que finalice la transaccin
carcter definitivo hasta que una (ROLLBACK COMMIT) las modificaciones en la tabla sern registradas
instruccin confirme que esas de forma "provisional") */
anotaciones tienen carcter mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2,
definitivo. Para ello, MySQL Nacimiento,Sexo,Hora,Fumador,Idiomas)
dispone de tres sentencias: VALUES
BEGIN, COMMIT y ROLLBACK. ('111111','Alvaro','Alonso','Azcrate','1954-11-23',
'M','16:24:52',NULL,3)",$conexion);
Sintaxis de las if (mysql_errno($conexion)==0){
transacciones echo "Registro AADIDO<br>";
}else{
Existen tres sentencias para if (mysql_errno($conexion)==1062){
gestionar las transacciones. Son echo "No ha podido aadirse el registro <br>";
las siguientes: echo "Ya existe un registro con este DNI<br>";
}else{
mysql_query("BEGIN",$c) $numerror=mysql_errno($conexion);
Su ejecucin requiere que este
$descrerror=mysql_error($conexion);
activa la conexin $c con el echo "Se ha producido un error n $numerror<br>";
servidor de base de datos e indica echo "<br>que corresponde a: $descrerror<br>";
a MySQL que comienza una }
transaccin. }
# indicamos el final de la transaccin, en este caso con ROLLBACK
Todas las sentencias que se # por lo tanto el registro con DNI 111111 no ser insertado en la tabla
ejecuten a partir de ella tendrn mysql_query("ROLLBACK",$conexion);
carcter provisional y no se
# incluyamos una nueva transaccin
ejecutarn de forma efectiva hasta
que encuentre una sentencia de
mysql_query("BEGIN",$conexion);
finalizacin. mysql_query("INSERT $tabla (DNI,Nombre,Apellido1,Apellido2,
Nacimiento,Sexo,Hora,Fumador,Idiomas)
mysql_query("ROLLBACK",$c) VALUES
('222222','Genoveva','Zarabozo','Zitrn','1964-01-14',
Mediante esta sentencia 'F','16:18:20',NULL,2)",$conexion);
advertimos a MySQL que finaliza la
if (mysql_errno($conexion)==0){
transaccin pero que no debe
echo "Registro AADIDO";
hacerse efectiva ninguna de las
modificaciones incluidas en ella. }else{
if (mysql_errno($conexion)==1062){
mysql_query("COMMIT",$c) echo "No ha podido aadirse el registro <br>";
echo "Ya existe un registro con este DNI";
Esta sentencia advierte a MySQL }else{
que ha finalizado la transaccin y $numerror=mysql_errno($conexion);
que debe hacer efectivos todos
$descrerror=mysql_error($conexion);
los cambios incluidos en ella.
echo "Se ha producido un error n $numerror";
echo "<br>que corresponde a: $descrerror";
Precauciones a tener en }
cuenta }
# indicamos el final de la transaccin, en este caso con COMMIT
Cuando se utilizan campos # por lo tanto el registro con DNI 222222 si ser insertado en la tabla
autoincrementales en tablas mysql_query("COMMIT",$conexion);
InnoDB los contadores se van # leamos el contenido de la tabla para ver el resultado
incrementando al aadir registros $resultado= mysql_query("SELECT * FROM $tabla" ,$conexion);
(incluso de forma provisional) con print "<br>Lectura de la tabla depus del commit<br>";
lo cual si se aborta la inclusin con while ($registro = mysql_fetch_row($resultado)){
un ROLLBACK ese contador foreach($registro as $clave){
mantiene el incremento y en
echo $clave,"<br>";
inserciones posteriores partir de
}
ese valor acumulado.
}
Por ejemplo. Si partimos de una mysql_close();
tabla vaca y hacemos una ?>
transaccin de dos registros
(nmero 1 y nmero 2 en el
campo autoincremental) y la
finalizamos con ROLLBACK, no se Ejecutar el ejemplo
insertarn pero en una insercin
posterior el contador Integridad referencial en tablas InnoDB
autoincremental comenzar a
partir del valor 2.
Cuando se trabaja con varias tablas que tienen algn tipo de vnculo resulta interesante
MySQL anuncia que a partir de la disponer de mecanismos que protejan o impidan acciones no deseadas. Supongamos,
versin 5.0.3 se incluir una nueva como veremos en los ejemplos posteriores que pretendemos utilizar una tabla con datos de
sentencia para permitir que se alumnos y otra tabla distinta para las calificaciones de esos alumnos. Si no tomamos
puedan renumerar los campos ninguna precaucin (bien sea mediante los script o mediante el diseo de las tablas) podra
autoincrementales. darse la circunstancia de que incluyramos calificaciones a alumnos inexistentes, en
materias de las que no estn matriculados, etctera. Tambin podra darse la circunstancia
Elementos necesarios de que diramos de baja a un alumno pero que se mantuvieran las calificaciones
para la integridad vinculadas a l. Todas estas circunstancias suelen producir efectos indeseados y las tablas
InnoDB pueden ser diseadas para prever este tipo de situaciones.
referencial
Sintaxis para la vinculacin de tablas
La integridad referencial ha de
establecerse siempre entre dos
Los vnculos entre tablas suelen establecer en el momento de la creacin de la tabla
tablas. Una de ellas ha de
vinculada.
comportarse como tabla principal
(suele llamarse tabla padre y la
otra sera la tabla vinculada CREATE TABLE tabla (campo1, campo2,...
tabla hijo. KEY nombre (campo de vinculacion ),
FOREIGN KEY (campo de vinculacion)
Es imprescindible: REFERENCES nombre_de la tabla principal (Indice primario de la tabla principal)
) Type=InnoDB
Que la tabla principal
tenga un ndice primario donde el campo de vinculacion ha de ser un ndice (no es necesario que sea PRIMARY KEY
(PRIMARY KEY) ni UNIQUE) y donde Indice primario de la tabla principal ha de ser un ndice primario
Que la tabla vinculada (PRIMARY KEY) de la tabla principal. Debe haber plena coincidencia (tanto en tipos como
tenga un ndice (no es contenidos) entre ambos ndices.
necesario que sea ni nico
ni primario) asociado a
campos de tipo idntico a <?
los que se usen para ndice $base="ejemplos";
de la tabla principal. $tabla1="principal";
$tabla2="vinculada";
Si observas el cdigo fuente del $c=mysql_connect ("localhost","pepe","pepa");
ejemplo que tienes a la derecha mysql_select_db ($base, $c);
podrs observar que utilizamos el # creacin de la tabla principal type InnoDB
nmero del DNI (nico para $crear="CREATE TABLE IF NOT EXISTS $tabla1 (";
alumno) como elemento de $crear.="DNI CHAR(8) NOT NULL, ";
vinculacin de la tabla de datos
$crear.="Nombre VARCHAR (20) NOT NULL, ";
personales con la que incluye las
$crear.="Apellido1 VARCHAR (15) not null, ";
direcciones.
$crear.="Apellido2 VARCHAR (15) not null, ";
# el indice primario es imprescindible. Recuerda que debe
Borrado de tablas # estar definido sobre campos NO NULOS
vinculadas $crear.=" PRIMARY KEY(DNI) ";
$crear.=")";
Si pretendemos eliminar una tabla $crear.=" Type=InnoDB";
principal recibiremos un mensaje # creamos la tabla principal comprobando el resultado
de error tal como puedes ver si if(@mysql_query ($crear ,$c)){
ejecutas este ejemplo cuyo cdigo print "La tabla ".$tabla1." ha sido creada<br>";
fuente tienes aqu. cmo es lgico, }else{
antes de ejecutarlo habrs de print "No se ha creado ".$tabla1." ha habido un error<br>";
tener creada la tabla cuyo cdigo }
fuente tienes a la derecha. # crearemos la tabla vinculada
$crear="CREATE TABLE IF NOT EXISTS $tabla2 (";
Las tablas vinculadas si permiten
$crear.="IDENTIDAD CHAR(8) NOT NULL, ";
el borrado y una vez que stas ya
han sido eliminadas (o quitada la $crear.="calle VARCHAR (20), ";
vinculacin) ya podrn borrarse sin $crear.="poblacion VARCHAR (20), ";
problemas las tablas principales. Si $crear.="distrito VARCHAR(5), ";
ejecutas este ejemplo podrs # creamos el ndice (lo llamamos asociador) para la vinculacin
observar que borramos ambas # en este caso no ser ni primario ni nico
tablas siguiendo el orden que # Observa que el campo IDENTIDAD de esta tabla CHAR(8)
permite hacerlo. Primero se borra # es idntico al campo DNI de la tabla principal
la vinculada y luego la principal. $crear.=" KEY asociador(IDENTIDAD), ";
Este es el cdigo fuente del script. #establecemos la vinculacin de ambos ndices
$crear.=" FOREIGN KEY (IDENTIDAD) REFERENCES $tabla1(DNI) ";
Cuidado! $crear.=") TYPE = INNODB";
# creamos (y comprobamos la creacin) la tabla vinculada
Si has borrado las tablas con if(@mysql_query ($crear ,$c)){
los ejemplos anteriores no print "La tabla ".$tabla2." ha sido creada<br>";
olvides crearlas de nuevo }else{
para poder visualizar los print "No se ha creado ".$tabla2." ha habido un error<br>";
ejemplos siguientes. }
mysql_close();
?>
Modificacin o borrado de
campos vinculados
Crear tablas vinculadas
Las sentencias MySQL que deban
modificar o eliminar campos Modificacin de estructuras
utilizados para establecer vnculos
entre tablas requieren de un La modificacin de estructuras en tablas vinculadas puede hacerse de forma idntica a
parmetro especial (CONSTRAINT) la estudiada para los casos generales de MySQL siempre que esas modificaciones no
-puede ser distinto en cada una de afecten a los campos mediante los que se establecen las vinculaciones entre
las tablas- que es necesario
tablas.
conocer previamente.

La forma de visualizarlo es Aqu tienes un ejemplo en se borran y aaden campos en ambas tablas. Como puedes ver
ejecutar la sentencia: SHOW la sintaxis es exactamente la misma que utilizamos en temas anteriores.
CREATE TABLE nombre tabla que
devuelve como resultado un array <?
asociativo con dos ndices. Uno de $base="ejemplos";
ellos -llamado Table- que contiene
$tabla="principal";
el nombre de la tabla y el otro -
Create Table- que contiene la
$tabla1="vinculada";
estructura con la que ha sido $c=mysql_connect ("localhost","pepe","pepa");
creada la tabla pero incluyendo el mysql_select_db ($base, $c);
parmetro CONSTRAINT seguido
de su valor. Ese valor es if(mysql_query("ALTER TABLE $tabla ADD Segundo_Apellido VARCHAR(40)",$c)){
precisamente el que necesitamos print "Sea ha creado el nuevo campo en ".$tabla."<br>";
para hacer modificaciones en los }
campos asociados de las tablas if(mysql_query("ALTER TABLE $tabla DROP Apellido2",$c)){
vinculadas. print "Sea ha borrado el campo Apellido 2 en ".$tabla."<br>";
Pulsando en este enlace cuyo
}
cdigo fuente tienes aqu podrs
if(mysql_query("ALTER TABLE $tabla1 ADD DP VARCHAR(5)",$c)){
visualizar el resultado de la
print "Sea ha creado el nuevo campo en ".$tabla1."<br>";
ejecucin de esa sentencia.
}
Conocido el valor de parmetro if(mysql_query("ALTER TABLE $tabla1 DROP distrito",$c)){
anterior el proceso de borrado del print "Sea ha borrado el campo distrito en ".$tabla1."<br>";
vnculo actual requiere la siguiente }
sintaxis:
mysql_close();
ALTER TABLE nombre de la tabla
?>
DROP FOREIGN KEY parametro

Cuando se trata de aadir un


nuevo vnculo con una tabla
ejecutar el ejemplo
principal habremos de utilizar la
siguiente sentencia: En este otro ejemplo determinaremos el valor de CONSTRAINT y modificaremos campos
asociados de la tabla vinculada.
ALTER TABLE nombre de la tabla
ADD [CONSTRAINT parametro]
FOREIGN KEY parametro <?
REFERENCES tabla principal(clave $base="ejemplos";
primaria) $tabla="vinculada";
$tabla1="principal";
El parmetro CONSTRAIT $c=mysql_connect ("localhost","pepe","pepa");
(encerrado en corchetes en el mysql_select_db ($base, $c);
prrafo anterior) es OPCIONAL y
$resultado=mysql_query( "SHOW CREATE TABLE $tabla",$c);
solo habra de utilzarse en el caso
de que existiera ya una vinculacin
$v=mysql_fetch_array($resultado);
previa de esa tabla. # extreamos de Create Table la cadena que empiza por CONSTRAINT
# y que acaba por FOREING KEY lo guardamos en el array $coin
preg_match ('/CONSTRAINT.*FOREIGN KEY/', $v['Create Table'], $coin);
La funcin preg_match # extraemos el parametro quitando el CONSTRAINT que lleva delante
# y el FOREIGN KEY que lleva al final
En el ejemplo de la derecha
$para=str_replace("FOREIGN KEY",'',str_replace("CONSTRAINT",'',$coin
utilizamos esta funcin cuya [0]));
sintaxis es la siguiente: print "El valor de CONSTRAINT es: ".$para."<br>";
preg_match( pat, cad, coin ) # eliminamos el vinculo con la clave externa incluyendo en la sentancia
# el valor del parametro obtenido el proceso anterior
donde pat es un patrn de if(mysql_query("ALTER TABLE $tabla DROP FOREIGN KEY $para",$c)){
bsqueda, cad es la cadena que la print "Se ha realizado con xito el borrado del vnculo<br>";
han de realizarse las bsquedas y }
coin es un arroay que recoge
# aadimos el nuevo vnculo (en este caso rehacemos el anterior
todas las coincidencias
# pero el proceso es idntico)
encontradas en la cadena.
if(mysql_query("ALTER TABLE $tabla ADD CONSTRAINT $para
El patrn de bsqueda que hemos FOREIGN KEY(IDENTIDAD) REFERENCES $tabla1(DNI)",$c)){
utilizado en el ejemplo print "Se ha reestablecido con xito vnculo<br>";
/CONSTRAINT.*FOREIGN KEY/ }
debe interpretarse de la siguiente
forma. Los caracteres / indican el mysql_close();
comienzo y el final del patrn, el . ?>
indica que entre CONSTRAIT y
FOREING se permite cualquer
carcter para admitir la ejecutar el ejemplo
coincidencia y, adems, * indica
que ese caracter cualquier puede
repetirse cero o ms veces. Aadir registros a la tabla vinculada
Cuidado! Si ejecutas este ejemplo habiendo seguido la secuencia de estos materiales vers que
se produce un error n 1216. Es lgico que as sea porque estamos intentando aadir un
Es posible que el script de la registro a la tabla vinculada y ello requerira que en el campo DNI de la tabla principal
derecha te de un error como existiera un registro con un valor igual al que pretendemos introducir en la tabla vinculada.
consecuencia de que hemos
podido modificar campos en Insertar en tabla
Ver script
los ejemplos anteriores. Si vinculada
eso ocurre, borra aqu las
tablas y genralas de nuevo Aadiremos un registro a la tabla principal con el DNI anterior:
pulsando aqu.
Insertar en tabla
Ver script
principal
Cuidado!
y ahora ya podremos ejecutar -sin errores- el script que inserta datos en la tabla
Los resultados que obtengas vinculada. Podremos ejecutar aquel script tantas veces como queramos ya que -el campo
el ejecutar los ejemplos de IDENTIDAD est definido como KEY y por tanto permite duplicados- no hemos establecido
borrado y modificacin de la condicin de ndice PRIMARIO UNICO.
datos pueden arrojar
resultados distintos segn los Borrar o modificar registros en la tabla principal
contenidos de las tablas que,
a su vez, sern Sin intentamos borrar un registro de la tabla principal mediante un script como el que
consecuencia de los tienes en este ejemplo vers que se produce un error n 1217 advirtindonos de que no
ejemplos que hayas se realiza el borrado porque existen registros en la tabla vinculada con valores asociados al
ejecutado anteriormente y de ndice del campo que pretendemos borrar y, de permitir hacerlo, se rompera la integridad
la secuencia de los mismos. referencial ya que quedaran registros hurfanos en la tabla vinculada.
Siempre puedes volver a las
condiciones iniciales de los Borrar en tabla
Ver script
enlaces de la advertencia principal
anterior.
Sin tratamos de modificar un registro de la tabla principal y la modificacin afecta al
ndice que realiza la asociacin con la tabla (o tablas) vinculadas se producira -por las
Opciones adicionaes de mismas razones y en las mismas circunstancias- un error n 1217 que impedira la
FOREIGN KEY modificacin.
Modificar DNI en tabla
Ver script
La clasula FOREIGN KEY permite principal
aadirte -detrs de la definicin ya
comentada y sin poner coma
Si -al tratar de borrar o modificar un registro de la tabla principal no existieran en la
separndola de ella- los
parmetros ON DELETE y ON tabla (o tablas vinculadas) registros asociados con l, el proceso de modificacin se
UPDATE en las que se permite realizara sin ningn problema y sin dar ningn mensaje de error o advertencia.
especificar una de las siguientes
opciones: Automatizacin de procesos
ON DELETE RESTRICT Creamos dos tablas idnticas a las anteriores incluyendo algunos datos en ellas.
Esta condicin (es la condicin por
defecto de MySQL y no es preciso
escribirla) indica a MySQL que <?
interrumpa el proeceso de $base="ejemplos";
borrado y de un mensaje de error $tabla1="principal1";
cuando se intente borrar un $tabla2="vinculada1";
registro de la tabla principal $c=mysql_connect ("localhost","pepe","pepa");
cuando en la tabla vinculada mysql_select_db ($base, $c);
existan registros asociados al valor # creacin de la tabla principal type InnoDB
que se pretende borrar. $crear="CREATE TABLE IF NOT EXISTS $tabla1 (";
ON DELETE NO ACTION $crear.="DNI CHAR(8) NOT NULL, ";
Es un sinnimo de la anterior. $crear.="Nombre VARCHAR (20) NOT NULL, ";
$crear.="Apellido1 VARCHAR (15) not null, ";
ON DELETE CASCADE $crear.="Apellido2 VARCHAR (15) not null, ";
Cuando se especifica esta opcin, $crear.=" PRIMARY KEY(DNI) ";
al borrar un registro de la tabla $crear.=")";
principal se borrarn de forma $crear.=" Type=InnoDB";
automtica todos los de la tabla
# creamos la tabla principal comprobando el resultado
vinculada que estuvieran asociados
al valor de la clave fornea que se
if(@mysql_query ($crear ,$c)){
trata de borrar. Con ello se print "La tabla ".$tabla1." ha sido creada<br>";
conseguira una actualizacin }else{
automtica de la segunda tabla y print "No se ha creado ".$tabla1." ha habido un error<br>";
se mantendra la identidad
}
referencial.
# crearemos la tabla vinculada
ON DELETE SET NULL $crear="CREATE TABLE IF NOT EXISTS $tabla2 (";
Con esta opcin, al borrar el $crear.="IDENTIDAD CHAR(8) NOT NULL, ";
registro de la tabla principal no se $crear.="calle VARCHAR (20), ";
borraran los que tuviera $crear.="poblacion VARCHAR (20), ";
asociados la tabla secundaria pero $crear.="distrito VARCHAR(5), ";
tomaran valor NULL todos los #creamos la tabla vinculada las opciones de DELETE y UPDATE
ndices de ella coincidentes con la $crear.=" KEY asociador(IDENTIDAD), ";
clave primaria de la tabla principal.
#establecemos la vinculacin de ambos ndices
Para el caso de ON UPDATE las $crear.=" FOREIGN KEY (IDENTIDAD) REFERENCES $tabla1(DNI) ";
opciones son estas: $crear.=" ON DELETE CASCADE ";
$crear.=" ON UPDATE CASCADE ";
ON UPDATE RESTRICT $crear.=") TYPE = INNODB";
ON UPDATE CASCADE # creamos (y comprobamos la creacin) la tabla vinculada
ON UPDATE SET NULL if(@mysql_query ($crear ,$c)){
Su comportamiento es idntico a
print "La tabla ".$tabla2." ha sido creada<br>";
sus homnimas del caso anterior. }else{
print "No se ha creado ".$tabla2." ha habido un error<br>";
Cuidado! }
# aadimos registros a la tabla principa1
El uso de la opcin SET mysql_query("INSERT $tabla1 (DNI,Nombre,Apellido1,Apellido2)
NULL requiere que el campo VALUES ('111111','Robustiano','Iglesias','Prez')",$c);
indicado en FOREIGN KEY mysql_query("INSERT $tabla1 (DNI,Nombre,Apellido1,Apellido2)
est permita valores nulos. Si VALUES ('222222','Ambrosio','Morales','Gmez')",$c);
est definido con flag NOT # aadimos registros a la tabla vinculada1
NULL (como ocurre en los mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito)
ejemplos que tienes al VALUES ('111111','Calle Asturias,3','Oviedo','33001')",
margen) dara un mensaje de $c);
error. mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito)
VALUES ('111111','Calle Palencia,3','Logroo','78541')",$c);
mysql_query("INSERT $tabla2 (IDENTIDAD,calle,poblacion,distrito)
Cuidado! VALUES ('222222','Calle Anunciacin,3','Algeciras','21541')",$c);
mysql_close();
Al incluir ON DELETE y ON ?>
UPTADE (si se incluyen
ambas) han de hacerse por Ver contenidos de
este mismo orden. Crear tablas y datos Ver codigo fuente
tablas
Si se cambiara este orden
dara un mensaje de error y
no se ejecutaran. Modificar registros en cascada

<?
$base="ejemplos";
$tabla="principal1";
$conexion=mysql_connect("localhost","pepe","pepa");
mysql_select_db($base,$conexion);
# modificamos un registro
mysql_query("UPDATE $tabla SET DNI='123456' WHERE DNI='111111'",
$conexion);
# borramos un registro
mysql_query("DELETE FROM $tabla WHERE (DNI='222222')",$conexion);
if (mysql_errno($conexion)==0){echo "<h2>Tablas actualizadas</b></H2>";
}else{
print "Ha habido un error al actualizar";
}
mysql_close();
?>

Ver contenido de la
Actualizar en cascada
tabla

Para que puedas retornar a las condiciones iniciales, desde este enlace podrs borrar las
tablas creadas para actualizacin en cascada. De esta forma podrs volver a crearlas,
cuando desees, en las condiciones iniciales.

Anterior Indice Siguiente


Otras consultas

Definicin de tablas
Estructura de tablas y relaciones
Para desarrollar los ejemplos de este captulo vamos a crear las tablas, cuyas estructuras
En este ejemplo de tablas e interrelaciones que puedes ver en el cdigo fuente siguiente:
vinculadas con integridad
relacional vamos a proponer la
situacin siguiente. <?
$base="ejemplos";
Crearemos una primera tabla $c=mysql_connect ("localhost","pepe","pepa");
(alumnos) que va a contener mysql_select_db ($base, $c);
datos personales de un grupo de ###############################################
personas. # Creacin de la tabla nombres con indice primario DNI
Para evitar duplicar un mismo
# tabla de nombres con ndice primario en DNI
alumno y alumnos sin DNI, vamos ###############################################
a utilizar como ndice primario $crear="CREATE TABLE IF NOT EXISTS alumnos (";
(PRIMARY KEY) el campo DNI (que $crear.="DNI CHAR(8) NOT NULL, ";
es nico para cada persona). $crear.="Nombre VARCHAR (20) NOT NULL, ";
$crear.="Apellido1 VARCHAR (15) not null, ";
La condicin de que el campo DNI $crear.="Apellido2 VARCHAR (15) not null, ";
sea PRIMARY KEY nos obliga a $crear.=" PRIMARY KEY(DNI) ";
definirlo con el flag NOT NULL,
$crear.=")";
dado que esta es una condicin
necesaria para la definicin de
$crear.=" Type=InnoDB";
ndices primarios. if(mysql_query ($crear ,$c)){
print "tabla <b>nombres</b> creada<BR>";
Crearemos una segunda tabla }else{
(domicilios) con los domicilios de print "ha habido un error al crear la tabla <b>alumnos</b><BR>";
cada uno de los alumnos, }
identificndolos tambin por su ###############################################
DNI. Para evitar que un mismo # Creacin de la tabla direcciones
alumno pueda tener dos domicilios
# tabla de nombres con ndice nico en DNI
asignamos a al campo DNI de esta
# para evitar dos direcciones al mismo alumno
tabla la condicin de ndice nico
(UNIQUE). # y clave fornea nombres(DNI)
# para evitar direcciones no asociadas a un alumno
El ndice UNIQUE podramos # concreto. Se activa la opcin de actualizar
haberlo creado tambin como # en cascada y de borrar en cascada
PRIMARY KEY ya que la nica ###############################################
diferencia de comportamiento $crear="CREATE TABLE IF NOT EXISTS domicilios (";
entre ambos es el hecho que aquel $crear.="DNI CHAR(8) NOT NULL, ";
admitira valores NULOS pero,
$crear.="calle VARCHAR (20), ";
dado que debemos evitar
$crear.="poblacion VARCHAR (20), ";
domicilios sin alumnos,
insertaremos el flag NOT NULL en $crear.="distrito VARCHAR(5), ";
este campo. $crear.=" UNIQUE identidad (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
El hecho de utilizar dos tablas no $crear.="ON DELETE CASCADE ";
tiene otro sentido que la $crear.="ON UPDATE CASCADE ";
ejemplificacin ya que lo habitual $crear.=") TYPE = INNODB";
sera que todos los datos if(mysql_query ($crear ,$c)){
estuvieran en una misma tabla.
print "tabla <b>domicilios</b> creada<br>";
Vincularemos ambas tablas de }else{
modo que no puedan crearse print "ha habido un error al crear la tabla <b>domicilios</b><BR>";
direcciones de alumnos }
inexistentes y les pondremos la ###############################################
opcin de actualizacin y borrado # Creacin de la tabla nombres con indice primario EVALUACIONES
en cascada. De esta forma las # tabla de nombres con ndice primario en NUMERO
acciones en la tabla de alumno se ###############################################
reflejaran automticamente en la $crear="CREATE TABLE IF NOT EXISTS evaluaciones (";
tabla de domicilios. $crear.="NUMERO CHAR(1) NOT NULL, ";
La tercera de las tablas $crear.="nombre_evaluacion VARCHAR (20) NOT NULL, ";
(evaluaciones) tiene como $crear.=" PRIMARY KEY(NUMERO)";
finalidad definir las distintas $crear.=")";
evaluaciones que puede realizarse $crear.=" Type=InnoDB";
a cada alumno. Tendr dos if(mysql_query ($crear ,$c)){
campos. Uno descriptivo (el print "tabla <b>evaluaciones</b> creada<BR>";
nombre de la evaluacin) y otro }else{
identificativo (no nulo y nico) que print "ha habido un error al crear la tabla <b>evaluaciones</b><BR>";
ser tratado como PRIMARY KEY }
para evitar duplicidades y porque,
###############################################
adems, va a ser utilizado como
clave fornea en la tabla notas.
# Creacin de la tabla notas
# indice UNICO para los campos DNI y evaluacion
La tabla notas va a tener tres # con ello se impide calificar dos veces al mismo
campos: DNI, n de evaluacin y # alumno en la misma evaluacion
calificacin. # claves forneas (DOS)
# el DNI de nombres para evitar calificar a alumnos inexistentes
Estableceremos restricciones para
# el NUMERO de la tabla evaluaciones para evitar calificar
evitar que:
# DOS VECES en una evaluacin a un alumno
###############################################
Podamos calificar a un $crear="CREATE TABLE IF NOT EXISTS notas (";
alumno inexistente. $crear.="DNI CHAR(8) NOT NULL, ";
Podamos calificar una
$crear.="evaluacion CHAR (1) NOT NULL, ";
evaluacin no incluida entre
las previstas.
$crear.="calificacion TINYINT (2), ";
Podamos poner ms a cada /* observa que este indice primario est formado
alumnos ms de una por dos campos (DNI y evalucion) y que, como siempre
calificacin por evaluacin. en el caso de PRIMARY KEY ambos son de tipo NOT NULL */
$crear.=" PRIMARY KEY vemaos(DNI,evaluacion), ";
Creando una ndice primario
/* Fijate en la secuencia siguiente:
formado por los campos DNI y 1.- Creamos el ndice
evaluacin evitaremos la ltima de 2.- Establecemos la clave fornea
3.- Establecemo las condiciones ON DELETE
las situaciones y aadiendo una 4.- Establecemos las condiciones ON UPDTE
vinculacin con las tablas alumnos
Es muy importe mantener esta secuencia para evitar
y evaluaciones estaremos en
condiciones de evitar las dos
errores MySQL */
primeras. $crear.=" INDEX identico (DNI), ";
$crear.="FOREIGN KEY (DNI) REFERENCES alumnos(DNI) ";
En este grfico puedes ver un $crear.="ON DELETE CASCADE ";
esquema de la definicin de estas $crear.="ON UPDATE CASCADE,";
tablas. /* Esta tabla tiene dos claves forneas asociadas a dos tablas
la anterior definida sobre alumnos como tabla principal
y esta que incluimos a continuacin asociada con evaluaciones
Como ves repetimos la secuencia descrita anteriormente
Es importante establecer estas definiciones de una en una
(tal como ves en este ejemplo) y seguir la secuencia
comentada anteriormente */
$crear.=" INDEX evalua (evaluacion),";
$crear.="FOREIGN KEY (evaluacion) REFERENCES evaluaciones(NUMERO) ";
$crear.="ON DELETE CASCADE ";
$crear.="ON UPDATE CASCADE";
$crear.=") TYPE = INNODB";
if(mysql_query ($crear ,$c)){
print "tabla <b>notas</b> creada <BR>";
}else{
print "ha habido un error al crear la tabla <b>notas</b><BR>";
echo mysql_error ($c)."<br>";
echo mysql_errno ($c);
}

mysql_close();
?>

Crear tablas
ejemplo

Cuidado!

Como puedes observar en la imagen de la izquierda, al definir la estructura de las tablas es


muy importante prestar atencin a que los campos vinculados sean del mismo tipo y
dimensin.

Observa tambin que los campos de referencia de los vnculos que se establecen (en las
tablas primarias) tienen que ser definidos como PRIMARY KEY y que, por tanto, han de
establecerse como no nulos (NOT NULL).

Insercin de datos en tablas


MySQL permite importar ficheros externos utilizando la siguiente sintaxis:

LOAD DATA INFILE "nombre del fichero' [REPLACE | IGNORE]


INTO TABLE nombre de la tabla
Importacin y exportacin FIELDS
de datos TERMINATED BY 'indicador de final de campo'
ENCLOSED BY 'caracteres delimitadores de campos'
Es esta una opcin interesante por LINES
la posibilidad que ofrece de STARTING BY 'caracteres indicadores de comienzo de registro'
intercambiar datos entre diferentes
TERMINATED BY 'caracteres indicadores del final de registro'
fuentes y aplicaciones.
En este ejemplo pueder un caso prctico de insercin de datos en las tablas creadas
Importacin de ficheros anteriormente.

MySQL permite insertar en sus <?


tablas los contenidos de ficheros $base="ejemplos";
de texto. Para ello utiliza la $c=mysql_connect ("localhost","pepe","pepa");
sentencia que tienes al margen y mysql_select_db ($base, $c);
que detallaremos a continuacin.
# hemos creado un fichero de texto (datos_alumnos.txt)
LOAD DATA INFILE # que contiene datos de algunos alumnos. Los diferentes
Es un contenido obligatorio que # campos estn entre comillas y separados unos de otros
defina la opcin de insertar datos # mediante un punto y coma.
desde un fichero externo. # Cada uno de los registros comienza por un asterios
# y los registros estn separados por un salto de lnes (\r\n)
nombre del fichero # Incluimos ests especificaciones en la sentencia de insercin
Se incluye inmediatamente if(mysql_query("LOAD DATA INFILE
despus de la anterior, es
'c:/Apache/htdocs/cursoPHP/datos_alumnos.txt' REPLACE
obligatorio y debe contener (entre
comillas) la ruta, el nombre y la
INTO TABLE alumnos
extensin del fichero que contiene FIELDS ENCLOSED BY '\"' TERMINATED BY ';'
los datos a insertar. LINES STARTING BY '*' TERMINATED BY '\r\n' ",$c)){
print "Datos de alumnos cargados<br>";
[REPLACE|IGNORE] }else{
Es opcional. Si se omite se echo mysql_error ($c)."<br>";
producir un mensaje de error si el echo mysql_errno ($c);
fichero contiene valores iguales a }
los contenidos en los campos de la
# Para esta tabla usaremos el fichero datos_evaluaciones.txt
tabla que no admiten duplicados.
Con la opcin REPLACE sustituira
# Los diferentes
los valores existentes en la tabla y # campos estn entre comillas y separados unos de otros
con la opcin IGNORE # mediante una coma.
# Cada uno de los registros comienza por un espacio
INTO TABLE nombre # y los registros estn separados por un salto de lnes (\r\n)
Tiene carcter obligatorio y debe # Incluimos ests especificaciones en la sentencia de insercin
incluir como nombre el de la tabla if(mysql_query("LOAD DATA INFILE
a la que se pretende agregar los 'c:/Apache/htdocs/cursoPHP/datos_evaluaciones.txt' REPLACE
registros.
INTO TABLE evaluaciones
FIELDS FIELDS ENCLOSED BY '\'' TERMINATED BY ','
Tiene carcter OPCIONAL y LINES STARTING BY ' ' TERMINATED BY '\r\n' ",$c)){
permite incluir especificaciones print "Datos de evaluaciones cargados<br>";
sobre cuales son los caracteres }else{
delimitadores de campos y los que echo mysql_error ($c)."<br>";
indican el final del campo. Si se echo mysql_errno ($c);
omite FIELDS no podrn incluirse }
los ENCLOSED BY ni /* En este caso no incluimos especificacin alguna.
TERMINATED BY de campo.
Bajo este suspuesto MySQL interpreta los valores por defecto
ENCLOSED BY que son: los campos no van encerrados, las lneas no tienen
Permite espeficar (encerrados ningn carcter indicador de comienzo, los campos estn separados
entre comillas) los caracteres mediante tabulaciones (carcter de escape \t) y el final de lnea
delimitadores de los campos. Estos est sealado por un caracter de nueva lnea (\n) */
caracteres debern encontrarse en if(mysql_query("LOAD DATA INFILE
el fichero original al principio y al 'c:/Apache/htdocs/cursoPHP/datos_notas.txt' IGNORE
final de los contenidos de cada INTO TABLE notas",$c)){
uno de los campos (por ejemplo, si print "Datos de notas cargados<br>";
el carcter fueran comillas los }else{
campos deberan aparecer as en
echo mysql_error ($c)."<br>";
el fichero a importar algo como
esto: "32.45"). Si se omite esta echo mysql_errno ($c);
especificacin (o se omite FIELDS) }
se entender que los campos no /* Se comporta como los casos anteriores con distincos caracteres
tienen caracteres para los diferentes eventos, tal como puedes ver en el cdigo */
delimitadores. if(mysql_query("LOAD DATA INFILE
'c:/Apache/htdocs/cursoPHP/datos_domicilios.txt' IGNORE
Cuando se incluyen como INTO TABLE domicilios
delimitadores de campo las FIELDS ENCLOSED BY '|' TERMINATED BY '*'
comillas (dobles o sencillas) es
LINES STARTING BY '#' TERMINATED BY '}' ",$c)){
necesario utilizar una sintaxis
como esta: '\"' '\'' de forma que
print "Datos de domicilios cargados<br>";
no quepa la ambigedad de si se }else{
trata de un carcter o de las echo mysql_error ($c)."<br>";
comillas de cierre de una cadena echo mysql_errno ($c);
previamente abierta. }mysql_close();
?>
TERMINATED BY
Se comporta de forma similar al
anterior. Cargar datos Consultar tablas
Permite qu caracteres son usados
en el fichero original como
separadores de campos (indicador Guardar datos en ficheros
de final de campo). Si se omite, se
interpretar con tal el carcter MySQL permite los contenidos de sus tablas a ficheros de texto. Para ello utiliza la
tabulador (\t). siguiente sintaxis:

El uso de esta opcin no requiere SELECT * INTO OUTFILE "nombre del fichero'
que se especifique previamente FIELDS
ENCLOSED BY pero si necesita
que se haya incluido FIELDS.
TERMINATED BY 'indicador de final de campo'
LINES ENCLOSED BY 'caracteres delimitadores de campos'
Si el fichero de datos contiene LINES
caracteres (distintos de los valores STARTING BY 'caracteres indicadores de comienzo de registro'
por defecto) para sealar el TERMINATED BY 'caracteres indicadores del final de registro'
comienzo de un registro, el final
FROM nombre de la tabla
del mismo o ambos, debe incluirse
este parmetro y, despus de l,
las especificaciones de esos <?
valores correspondientes a: $base="ejemplos";
$c=mysql_connect ("localhost","pepe","pepa");
STARTING BY
mysql_select_db ($base, $c);
Permite especificar una carcter
if(mysql_query ("SELECT * INTO OUTFILE
como indicador de comienzo de un
registro. Si se omite o se 'c:/Apache/htdocs/cursoPHP/alumnos.txt'
especifica como '' se interpretar FIELDS ENCLOSED BY '\"' TERMINATED BY ';'
que no hay ningn carcter que LINES STARTING BY '*' TERMINATED BY '\r\n'
seale en comienzo de lnea. FROM alumnos",$c)){
print "fichero alumnos.txt creado<br>";
TERMINATED BY }else{
Es el indicador del final de un echo mysql_error ($c)."<br>";
registro. Si se omite ser echo mysql_errno ($c);
considerado como un salto de lnea
}
(\n).
if(mysql_query ("SELECT * INTO OUTFILE
'c:/Apache/htdocs/cursoPHP/domicilios.txt'
Exportacin de ficheros FIELDS ENCLOSED BY '|' TERMINATED BY '*'
LINES STARTING BY '#' TERMINATED BY '}'
Se comporta de forma similar al FROM domicilios",$c)){
supuesto anterior. Utiliza la print "fichero domicilios.txt creado<br>";
sintaxis siguiente: }else{
echo mysql_error ($c)."<br>";
SELECT * INTO OUTFILE
echo mysql_errno ($c);
Inicia la consulta de los campos
}
especificados despus de SELECT
(si se indica * realiza la consulta if(mysql_query ("SELECT * INTO OUTFILE
sobre todos los campos y por el 'c:/Apache/htdocs/cursoPHP/notas.txt'
orden en el que fue creada la FROM notas",$c)){
tabla) y redirige la salida a un print "fichero notas.txt creado<br>";
fichero. }else{
echo mysql_error ($c)."<br>";
nombre del fichero echo mysql_errno ($c);
Es la ruta, nombre y extensin del }
fichero en el que sern
if(mysql_query ("SELECT * INTO OUTFILE
almacenados los resultados de la
consulta. 'c:/Apache/htdocs/cursoPHP/evaluaciones.txt'
FIELDS ENCLOSED BY '\'' TERMINATED BY ','
FIELDS
LINES STARTING BY ' ' TERMINATED BY '\r\n'
ENCLOSED BY FROM evaluaciones",$c)){
TERMINATED BY
print "fichero evaluaciones.txt creado<br>";
LINES
}else{
STARTING BY
TERMINATED BY echo mysql_error ($c)."<br>";
Igual que ocurra en el caso de echo mysql_errno ($c);
importacin de datos, estos }
parmetros son opcionales. Si no mysql_close();
se especifican se incluirn los ?>
valores por defecto.

FROM nombre Crear ficheros de datos


Su inclusin tiene carcter
obligatorio. El valor de nombre ha
de ser el de la tabla sobre la que Cuidado!
se realiza la consulta.
Al exportar ficheros en entornos Windows, si se pretende que en el fichero de texto aparezca
Cuidado! un salto de lnea no basta con utilizar la opcin por defecto de LINES TERMINATED BY '\n'
sino LINES TERMINATED BY '\r\n' (salto de lnea y retorno) que son los caracteres que
Al importar ficheros habr de necesita Windows para producir ese efecto.
utilizarse el mismo formato Habr de seguirse este mismo criterio cuando se trata de importar datos desde un fichero de
con el que fueron creados texto.
tanto FIELDS como LINES.

Consultas de unin (JOIN)


Consultas usando JOIN
<?
La clasula JOIN es opcin $base="ejemplos";
aplicable a consultas en tablas que $c=mysql_connect ("localhost","pepe","pepa");
tiene diversas opciones de uso. mysql_select_db ($base, $c);
Iremos vindolas de una en una. # vamos a crear un array con las diferente consultas
Todas ellas han de ir incluidas
# posteriormente lo leeremos y la ejecutaremos secuencialmente
como parmetros de una consulta.
Por tanto han de ir precedidas de: /* Devuelve todos los campos de ambas tablas.
Cada registro de alumnos es asociado con todos los de domicilios*/
SELECT * $query[]="SELECT * FROM alumnos JOIN domicilios";
o de /* Devuelve todos los campos de ambas tablas. Cada registro de domicilios
SELECT nom_tab.nom_cam,.. es asociado con todos los de alumnos */
donde nom_tab es un nombre de $query[]="SELECT * FROM domicilios JOIN alumnos";
tabla y nom_camp es el nombre /* Devuelve todos los campos de los registros de ambas tablas
del campo de esa tabla que en los que coinciden los numeros del DNI*/
pretendemos visualizar para esa
$query[]="SELECT * FROM alumnos JOIN domicilios
consulta. Esta sintaxis es idntica
a la ya comentada en pginas
ON domicilios.DNI=alumnos.DNI";
anteriores cuando tratbamos de /* Idntica a la anterior. Solo se diferencia en que ahora
consultas en varias tablas. se visualizan antes los campos domicilios*/
$query[]="SELECT * FROM domicilios JOIN alumnos
Ahora veremos las diferentes ON domicilios.DNI=alumnos.DNI";
posibilidades de uso de JOIN /* devuelve cada uno de los registro de la tabla alumnos. Si existe
un domicilio con igual DNI lo insertar. Si no existiera
FROM tbl1 JOIN tbl2
insertar valores nulos en esos campos
Suele definirse como el producto
cartesiano de los elementos de la $query[]="SELECT * FROM alumnos LEFT JOIN domicilios
primera tabla (tbl1) por lo de la ON domicilios.DNI=alumnos.DNI";
segunda (tbl2). /* Se comporta de forma idntica al anterior.
Ahora insertar todos los registros de domicilios
Dicho de una forma ms vulgar, y los alumnos coincidentes o en su defecto campos nulos.*/
esta consulta devuelve con $query[]="SELECT * FROM domicilios LEFT JOIN alumnos
resultado una lista de cada uno de ON domicilios.DNI=alumnos.DNI";
los registros de los registros de la
/* Al utilizar RIGHT ser todos los registros de la tabla de la derecha
primera tabla asociados
(domicilios) los que aparezcan junto con las coincidencias o
sucesivamente con todos los
correspondientes a la segunda. Es junto a campos nulos. Aparecern primero los campos de alumnos
decir, aparecer una lnea y detr los de domicilios*/
conteniendo el primer registro de $query[]="SELECT * FROM alumnos RIGHT JOIN domicilios
la primera tabla seguido del ON (domicilios.DNI=alumnos.DNI AND alumnos.Nombre LIKE 'A%')";
primero de la segunda. A /* Consulta de nombre, apellido y localidad de todos los alumnos
continuacin ese mismo registro cuyo nombre empieza por A */
de la primera tabla acompaado $query[]="SELECT alumnos.Nombre, alumnos.Apellido1,alumnos.Apellido2,
del segundo de la segunda tabla, y domicilios.poblacion FROM alumnos JOIN domicilios
as, sucesivamente hasta acabar ON (domicilios.DNI=alumnos.DNI
los registros de esa segunda tabla.
AND alumnos.Nombre LIKE 'A%')";
En ese momento, repite el proceso
# una consulta resumen de nos permitir visualizar una lista con nombre
con el segundo registro de la
primera tabla y, nuevamente, # y apellidos de alumnos su direccin y localidad del domicilio
todos los de la segunda. As, # el nombre de la evaluacin y su calificacin.
sucesivamente, hasta llegar al # Si no hay datos de poblacin insertar ---- en vez del valor nulo
ltimo registro de la primera tabla # y si no hay calificacin en una evaluacin aparecer N.P.
asociado con el ltimo de la # La consulta aparecer agrupada por evaluaciones
segunda. /* iniciamos el select especificando los campos de las diferentes
tablas que prentendemos visualizar
En total, devolver un nmero de
$q="(SELECT alumnos.Nombre,alumnos.Apellido1,";
lneas igual al resultado de
$q.=" alumnos.Apellido2,domicilios.calle,";
multiplicar el nmero de registros
de la primera tabla por los de la # al incluir IFNULL visualizaremos ---- en los campos cuyo resultado
segunda. # sea nulo
$q.=" IFNULL(domicilios.poblacion,''),";
FROM tbl2 JOIN tbl1 $q.=" evaluaciones.nombre_evaluacion,";
Si permutamos la posicin de las # con este IFNULL aparecer N.P. en las evaluaciones no calificadas.
tablas, tal como indicamos aqu, $q.=" IFNULL(notas.calificacion,'N.P.')";
obtendremos el mismo resultado # especificamos el primer JOIN con el que tendremos como resultado una
que en el caso anterior pero, como lista
es lgico pensar, con una
# de todos los alumnos con sus direcciones correspondientes
ordenacin diferente de los
resultados. # por efecto de la clausula ON.
# Al poner LEFT se incluiran los alumnos que no tuvieran
FROM tbl2 JOIN tbl1 ON cond # su direccin registrada en la tabla de direccione
El parmetro ON permite aadir $q.=" FROM (alumnos LEFT JOIN domicilios";
una condicin (cond)a la consulta
$q.=" ON alumnos.DNI=domicilios.DNI)";
de unin. Su comportamiento es # al unir por la izquierda con notas tendramos todos los resultados
idntico al de WHERE en las
# del JOIN anterior asociados con con todas sus calificaciones
consultas ya estudiadas y permite
# por efecto de la clasula ON
el uso de las mismas
procedimientos de establecimiento $q.=" LEFT JOIN notas ON notas.DNI=alumnos.DNI";
de condiciones que aquel operador. # al aadir esta nueva unin por la DERECHA con la tabla evaluaciones
# se asociara cada uno de los resultados de las uniones anteriores
FROM tbl1 LEFT JOIN tbl2 ON # con todos los campos de la tabla evaluaciones con lo que resultara
cond # una lista de todos los alumnos con todas las calificaciones
Cuando se incluye la clusula LEFT # incluyendo un campo en blanco (sera sustituido por N.P:)
delante de JOIN el resultado de la # en aquellas que no tuvieran calificacin registrada
consulta es el siguiente:
$q.=" RIGHT JOIN evaluaciones";
Devolvera cada uno los registros
$q.=" ON evaluaciones.NUMERO=notas.evaluacion";
de la tabla especificada a la
izquierda de LEFT JOIN -sin /* la clausula WHERE nos permite restringir los resultados a los valores
considerar las restricciones que correspondientes nicamente a la evaluacin nmero 1*/
puedan haberse establecido en las $q.=" WHERE evaluaciones.NUMERO=1)";
clasulas ON para los valores de # cerramos la consulta anterior con el parntesis. Observa que lo
esa tabla asocindolos con # hemos abierto delante del SELECT e insertamos UNION ALL
aquellos de la otra tabla que # para que el resultado de la consulta anterior aparezca
cumplan las condiciones # seguido del correspondiente a la incluida despus de UNION ALL
establecidas en la clasula ON. Si $q.=" UNION ALL";
ningn registro de la segunda #iniciamos (tambin con parntesis) la segunda consulta
tabla cumpliera la condicin
# que ser identica a la anterior salvo el WHERE
devolvera valores nulos.
# ser modificado para extraer datos de la evaluacin n2
FROM tbl1 RIGHT JOIN tbl2 ON $q.="(SELECT alumnos.Nombre,alumnos.Apellido1,";
cond $q.=" alumnos.Apellido2,domicilios.calle,";
Se comporta de forma similar al $q.=" IFNULL(domicilios.poblacion,''),";
anterior. Ahora los posibles valores $q.=" evaluaciones.nombre_evaluacion,";
nulos sern asignados a la tabla $q.=" IFNULL(notas.calificacion,'N.P.')";
indicada a la izquierde de RIGHT $q.=" FROM (alumnos LEFT JOIN domicilios";
JOIN y se visualizaran todos los $q.=" ON alumnos.DNI=domicilios.DNI)";
registros de la tabla indicada a la $q.=" LEFT JOIN notas ON notas.DNI=alumnos.DNI";
derecha.
$q.=" RIGHT JOIN evaluaciones";
$q.=" ON evaluaciones.NUMERO=notas.evaluacion";
JOIN mltiples $q.=" WHERE evaluaciones.NUMERO=2)";
# hemos cerrado el parentesis de la consulta anterior
Tal como puedes observar en el # e incluimos un nuevo UNION ALL para consultar los datos
ejemplo, es perfectamente factible # correspondientes a la tercera evaluacin
utilizar conjuntamente varios JOIN, $q.=" UNION ALL";
LEFT JOIN y RIGHT JOIN. Las $q.="(SELECT alumnos.Nombre,alumnos.Apellido1,";
diferentes uniones irn $q.=" alumnos.Apellido2,domicilios.calle,";
ejecutndose de izquierda a $q.=" IFNULL(domicilios.poblacion,''),";
derecha (segn el orden en el que $q.=" evaluaciones.nombre_evaluacion,";
estn incluidos en la sentencia) y
$q.=" IFNULL(notas.calificacion,'N.P.')";
el resultado del primero ser
$q.=" FROM (alumnos LEFT JOIN domicilios";
utilizado para la segunda unin y
as sucesivamente. $q.=" ON alumnos.DNI=domicilios.DNI)";
$q.=" LEFT JOIN notas ON notas.DNI=alumnos.DNI";
En cualquier caso, es posible $q.=" RIGHT JOIN evaluaciones";
alterar ese orden de ejecucin $q.=" ON evaluaciones.NUMERO=notas.evaluacion";
estableciendo otras prioridades $q.=" WHERE evaluaciones.NUMERO=3)";
mediante parntesis. # incluimos la variable $q en el array de consultas
$query[]=$q;
UNION de consultas # leemos el array y visualizamos el resultado
# cada consulta a traves de la llamada a la funcion visualiza
# a la que pasamos el resultado de la consulta
MySQL permite juntar en una sola
salida los resultados de varias # y la cadena que contiene las sentencias de dicha consulta
consultas. La sintaxis es la foreach($query as $v){
siguiente: visualiza(mysql_query($v,$c),$v);
}
(SELECT ...) function visualiza($resultado,$query){
UNION ALL PRINT "<BR><BR><i>Resultado de la sentencia:</i><br>";
(SELECT ...) print "<b><font color=#ff0000>";
UNION ALL
print $query."</font></b><br><br>";
(SELECT ...)
PRINT "<table align=center border=2>";
Cada uno de los SELECT ha de ir while ($registro = mysql_fetch_row($resultado)){
encerrado entre parntesis. echo "<tr>";
foreach($registro as $valor){
echo "<td>",$valor,"</td>";
}
}
echo "</table><br>";
}
?>

Ejecutar script

Anterior Indice Siguiente


Proteger PHPMyAdmin

Borrado
Borrado de usuarios
de usuarios MySQL

Hasta el momento no hemos


modificado ni los usuarios de
MySQL ni la configuracin de
PHPMyAdmin.

An tenemos los usuarios por


defecto (root sin contrasea) y
PHPMyAdmin sigue dndonos el
mensaje de advertencia relativo al
fallo de seguridad de la
configuracin.

El primer paso para corregir esa


vulnerabilidad ser borrar los
usuarios dejando slo el usuario La tabla user debera quedarnos con un nico usuario
pepe que es el que hemos creado
al instalar MySQL.

Para ello, con el servidor MySQL


activo, abriremos PhpMyAdmin
editaremos la tabla user
correspondiente a la base de datos
mysql y borraremos los usuarios,
dejando nicamente al usuario
pepe.

Una vez realizados estos cambios,


deberamos cerrar el servidor
MySQL y reiniciarlo con la nueva
configuracin. A partir de aqu,
cuando tratamos de acceder de
nuevo a PHPMyAdmin nos
aparecer un mensaje de error tal
como el que vemos en la imagen
de la derecha.

Modificacin de la
configuracin de
PHPMyAdmin
PHPMyAdmin nos dar este mensaje de error porque su configuracin por defecto utiliza
Hemos de modificar el fichero el usuario root que ya no existe. Acabamos de borrarlo!
config.inc.php que est en el
sudirectorio libraires de MyAdmin. Modificacin de config.inc.php
Un simple cambio, tal como el que
ves en las imgenes ser
suficiente.

Bastar cambiar (en la lnea 71 del


fichero) la palabra config por
http, guardar los cambios y, como
siempre, reiniciar el servidor
MySQL para que se active la
proteccin de PHPMyAdmin.

Acceso a PHPmyAdmin

A partir del momento que


hayamos hecho los cambios
anteriores, cada vez que tratemos
de acceder a http://localhost/
MyAdmin/ nos aparecer una
ventana como la que vemos en la
imagen. Ser necesario introducir
un nombre de usuario vlido (pepe
en nuestro caso).

Nos desaparecer el mensaje de


advertencia y ya podremos
gestionar nuestras bases de datos
de forma un poco ms segura.

Anterior Indice Siguiente


Instalar PHP 4 como CGI

Dos opciones de
Precauciones previas
instalacin
Para configurar PHP como CGI es necesario que httpd.conf tenga una configuracin
distinta a la que hemos utilizado al instalarlo como mdulo de Apache.
El software del servidor Apache
permite configurar PHP de dos
Antes de realizar y probar esta nueva configuracin ser conveniente tomar algunas
maneras distintas, conocidas
como: mdulo de Apache y modo precauciones:
CGI.
Tenemos un fichero llamado httpd.conf que contiene la configuracin de PHP
La diferencia entre ambas como mdulo y nos interesa conservarlo.
configuraciones estriba en la forma
en la que interactan Apache y Vamos a abrirlo como nuestro editor DEV-PHP y lo guardaremos en el
PHP en cada caso.
mismo directorio c:/Apache/conf y sin hacer ninguna modificacin con el
Cuando se configura como mdulo nombre httpd_modulo.conf.
de Apache se utiliza el denominado
Dynamic Shared Object (Soporte De esta forma tendremos una copia segura de nuestra configuracin actual.
de Objetos Dinmicos
Compartidos), DSO, que permite Tenemos tambin otro fichero llamado httpd.orig, que habamos creado como
que el propio Apache cargue en medida cautelar al comenzar la instalacin de PHP como mdulo de Apache.
tiempo de ejecucin, y con un
formato especial, porciones de Como recordars, este fichero contiene la configuracin que se crea por
cdigo de un programa ejecutable defecto en el momento de instalar el servidor.
que, en nuestro caso, ser el
intrprete de PHP. Abramos httpd.orig y, sin hacer cambios por el momento, guardmoslo con
el nombre httpd_cgi.conf
Cuando Apache trabaja de esta
manera los mdulos no se cargan De esta forma podremos hacer nuestras modificaciones sobre httpd_cgi.conf sin
hasta el momento en que son correr el riesgo de daar la configuracin actual.
necesarios y eso tiene, entre otras,
la ventaja de que permiten
disponer de ms es- pacio de Modificaciones en httpd_cgi.conf
memoria.

Cuando Apache utiliza la Haremos ahora las modificaciones en httpd_cgi.conf como recordars, es una copia
configuracin en modo CGI de la configuracin inicial de Apache para que PHP trabaje en modo CGI.
(Common Gateway Interface) los
programas se ejecutan en tiempo Buscaremos las lnea 386:
real, de forma que cuando se
requiere la actuacin del y sustituiremos
intrprete, el servidor debe DirectoryIndex index.html
transferir toda la informacin por el siguiente bloque de lneas
necesaria a ese programa en este
caso el intrprete de PHP y
esperar a que ste concluya la DirectoryIndex index.html index.php index.htm
ejecucin y le devuelva los ScriptAlias /php/ "C:/Apache/php4/"
resultados de la misma. AddType application/x-httpd-php .php .php4
Action application/x-httpd-php "/php/php.exe"
Hay una
opcin ptima? guardaremos los cambios y ya tendremos lista la configuracin como CGI.

Aunque son muchos quienes Prueba de la nueva configuracin


sostienen que la opcin ideal es la
configuracin como mdulo (el
argumento bsico es su mayor Apache se inicia atendiendo a las especificaciones contenidas en httpd.conf y ese
seguridad) otros hablan de la fichero contiene en este momento la configuracin como mdulo. Tendremos que
mayor eficacia de la opcin CGI. sustituirlo por el que contiene la configuracin como CGI.

Es cierto que la configuracin Bastar abrir httpd_cgi.conf y guardar como... httpd.conf (reemplazando el que
como mdulo permite dotar a exista anteriormente con ese nombre), apagar el servidor si lo tenemos activo y
Apache con algunas opciones que arrancarlo de nuevo.
no permite la configuracin CGI y
esa es la razn por la que hemos En este nuevo arranque podremos observar dos cosas que nos indicarn que ha
optado por utilizar ese modo de cambiado la configuracin. La ventana MS-DOS de Apache, aparecer ahora as:
configuracin.

Seguramente no existe una


configuracin que de forma
general pueda considerarse como
la ptima y la eleccin de la mejor
debera atender, en cada caso
especfico, a razones tales como:
sistema operativo del servidor, las
caractersticas del equipo, los
y aunque, a primera vista, no percibamos ninguna diferencia, si la hay. Ahora no dice
servicios, el nmero de usuarios,
el volumen de las transferencias, PHP 4.3.7 mientras que con la configuracin como mdulo de Apache si apareca como
etctera. puedes comprobar si comparas ambas imgenes.

Configuracin CGI

Las modificaciones que hemos de


realizar en httpd.conf para
configurar Apache en modo CGI
tienen las finalidades siguientes:

Las directivas ScriptAlias se usan Este procedimiento puede resultarnos cmodo cuando utilicemos esta versin del
para indicarle a Apache cul es el servidor. Pero puede ocurrir que los mensajes de estas ventanas sean distintos de
directorio concreto que ha sido hecho, en la versin 2 de Apache lo son y el mtodo de comprobacin no nos sirva.
asignado para contener los
programas que debe ejecutar en Recurramos a info.php. Si abrimos una nueva ventana del navegador y ponemos
modo CGI. Apache asumir que como direccin http://localhost/info.php (recuerda que el fichero info.php lo habamos
cada fichero de este directorio es
guardado en htdocs que es el directorio raiz del servidor) podremos ver en las primeras
un programa CGI y tratar de lneas de la pgina lo siguiente:
ejecutarlo cuando sea preciso.

A travs de las directivas


AddType se especifica qu
extensiones tienen los ficheros que
requieren ser interpretados antes
de enviar la respuesta a la peticin
del cliente y el tipo de aplicacin
que debe ser utilizada en cada
caso.
mientras que cuando la configuracin es como mdulo info.php nos indica que Server
Las directiva Action indica qu API es Apache.
programa ha de ser ejecutado
segn cada uno de los tipos de
aplicacin sealados mediante
AddType.

En nuestro caso, estamos


sealando a Apache que los
programas que habrn de
interpretar los scripts, en modo
CGI, estn en el directorio C:/
Apache/php4/ y que esa ruta ser Cambios entre ambos modos
identificada por medio del alias /
php/.
Si hemos seguido todos los pasos anteriores, cambiar de una forma de ejecucin a
Le indicamos tambin que los otra ser sumamente sencillo. Eso s, antes de hacerlo hemos de cerciorarnos de que
ficheros con extensin .php o . Apache est apagado.
php4 requieren el uso de la
aplicacin x-httpd-php, y, por Bastar con abrir uno de los ficheros httpd_cgi.conf httpd_modulo.conf y
ltimo, le indicamos que la guardarlo como httpd.conf sobreescribiendo el que exista anteriormente. Una vez hecho
aplicacin anterior requiere que se esto, slo queda arrancar Apache con la nueva configuracin.
ejecute php.exe, programa cuyo
path es el contenido en el alias / Otra alternativa, seguramente ms cmoda, sera crear un acceso directo (nuevo) para
php/ establecido en la primera de arrancar Apache con esta configuracin sin necesidad de renombrar httpd_cgi4.conf.
las directivas. Bastara con:

Crear acceso directo


Insertar, donde dice Lnea de comandos, lo siguiente:
C:\Apache\apache.exe -w -f "C:\Apache\conf\httpd_cgi4.conf" -d "C:\Apache\"

Anterior Indice Siguiente


Instalar PHP 5 sobre Apache 1.3.35

Instalacin de PHP5
Antes de empezar la configuracin

En el directorio Extras de este CD Si abrimos nuestro directorio: C:\Apache\php5 encontraremos dentro de l un


podrs encontrar el fichero php- fichero llamado php5ts.dll que deberemos copiar a nuestro sistema en el directorio que
5.1.4-Win32.zip. Si -por alguna se indica en la siguiente tabla:
razn no prevista en el momento
de elaborar estos materiales- no Fichero original c:\Apache\php5\php5ts.dll
estuviera all, en www.php.net
encontrars un enlace a PHP 5.1.4 Copiar en el subdirectorio que se indica (dentro del que contiene el S.O.)
zip package que te permitir S.O. Directorio
descargar ese fichero.
Windows98 \system
Cuidado! W2000
Windows NT \system32
Antes de descomprimir este Windows XP
fichero tendrs que crear un
subdirectorio en c:\Apache
llamndolo php5 para hacer
la descompresin en el. Esta Si ya tuviramos un fichero con ese nombre en el directorio de destino tendremos
versin -a diferencia de la que sobreescribirlo sustituyendo el preexistente por el que tenemos en C:\Apache
versin 4 no crea su propio \php5.
directorio.

Configuracin de php.ini
Descomprime el fichero zip en C:
\Apache\php5 y copia al directorio
del sistema el fichero php5ts.dll En el directorio C:\Apache\php5 tenemos un fichero llamado php.ini-dist. Lo
que encontrars en l. abriremos con un editor de textos por ejemplo el Dev-PHP y haremos estas
modificaciones:
Recuerda usamos Windows98 lo
tenemos que poner en c:
Fichero inicial php.ini-dist
\windows\system.
Guardar como php.ini
Si tenemos Windows NT,
W2000, o XP tendremos que Modificaciones en el fichero inicial
copiarlo a \system32 Lnea Cambios
correspondiente al directorio en el
que tengamos instalado el sistema Donde dice:
operativo.
doc_root =
464
cambiar por:
Libreras no incluidas en
la distribucin doc_root=c:\Apache\htdocs\
Donde dice:
El fichero zip de esta versin de
PHP no incluye todas las libreras ;extension_dir="./"
de extensiones de PHP. Por citar 471
cambiar por:
un ejemplo, no viene la librera
que permite crear ficheros pdf que extension_dir ="c:\Apache\php5\ext\"
hemos tratado en pginas
Donde dice:
anteriores.
register_globals= Off"
En el directorio Extras encontrars 399
el fichero pecl-5.1.4-Win32.zip. cambiar por:

Si no estuviera all, en php.net/ register_globals=On


downloads.php tienes un enlace a Donde dice:
Collection of PECL modules for PHP
5.1.4 que te permitir descargarlo. ;extension=php_mysql.dll
399
descomentar(*) quitar el punto y coma
Descomprmelo en el directorio c:
\Apache\php5\ext y ya tendrs extension=php_mysql.dll
disponibles todas las extensiones
Esta versin de PHP (en general todas las versiones 5) no incluyen por defecto -como ocurre en
de PHP. PHP4- las extensiones para MySQL.

Cuidado!

No olvides instalar estas Cuidado!


libreras antes de utilizar
PHP5. En la configuracin de PHP (php.ini) bajo Windows debemos usar siempre la barra
invertida ( \ ) a la hora de escribir los paths.
Ten en cuenta tambin que, si tienes una instalacin previa de otra versin de PHP, al
Opciones de configuracin copiar el php.ini de esta versin al directorio Windows se sobrescribir el anterior y que son
distintos los de ambas versiones.
Igual que ocurra con la versin 4,
PHP 5 puede configurarse para
trabajar en modo CGI o como Una vez que hayamos modificado los apartados anteriores guardaremos el fichero con
mdulo de Apache. el nombre php.ini en el directorio donde est instalado nuestro sistema operativo. Si
estamos utilizando Windows98 o WindowsXP ser el directorio Windows y si se trata
La configuracin de httpd.conf es de NT 2000 seguramente se llamar winnt.
bastante similar a la comentada
para el caso de PHP4. Sin
embargo, existen algunas Configuracin de PHP 5 como CGI de Apache
diferencias importantes que es
conveniente tener en cuenta.
Los ficheros httpd.conf para esta instalacin de Apache 1.3.35 sern los que se
La configuracin como CGI encuentran en el directorio: C:\Apache\conf
presenta una diferencia muy
importante respecto a la versin 4.
En este caso el programa
Fichero inicial httpd.default.conf
intrprete (puedes verlo en la lnea Guardar como httpd_cgi5.conf
donde dice Action) se llama php-
Modificaciones en el fichero inicial
cgi.exe
Lnea Cambios
En caso del mdulo tambin la
configuracin tambin es similar Donde dice:
pero hay que prestar atencin
Options Indexes FollowSymLinks MultiViews
tanto a los nombres de los 335
mdulos y a las rutas que indican cambiar por:
la direccin de las libreras de esta
versin. Options -Indexes FollowSymLinks MultiViews
Donde dice:
Ubicacin de php.ini DirectoryIndex index.html
cambiar por todas estas lneas:
Cuando se tienen instaladas ambas 386
versiones de PHP es necesario DirectoryIndex index.html index.php index.htm
tener la precaucin de estar ScriptAlias /php5/ "C:/Apache/php5/"
utilizando los ficheros php.ini AddType application/x-httpd-php .php
adecuados a cada versin. Action application/x-httpd-php "/php5/php-cgi.exe"
La forma en la que PHP busca el
fichero php.ini depende del modo
Sintaxis de la lnea de comandos del acceso directo a esta configuracin
en que est configurado.
C:\Apache\apache.exe -w -f "C:\Apache\conf\httpd_cgi5.conf" -d "C:\Apache\"
Como CGI PHP buscar siempre el
fichero php.ini en el mismo
directorio en que est instalado
el intrprete de PHP.
Configuracin de PHP 5 como mdulo de Apache
En modo CGI bastar con tener el
fichero php.ini en su directorio de
instalacin e, independientemente Los ficheros httpd.conf para esta instalacin de Apache 1.3.35 sern los que se
del que hubiera instalado en encuentran en el directorio: C:\Apache\conf
windows funcionara
correctamente. Fichero inicial httpd.default.conf
Cuando se trata del mdulo de Guardar como httpd_modulo5.conf
Apache las cosas son distintas.
PHP utilizar el fichero php.ini que Modificaciones en el fichero inicial
hubiera en el directorio Windows y, Lnea Cambios
si encontrara all el
correspondiente a una versin Donde dice:
anterior, Apache dara un mensaje Options Indexes FollowSymLinks MultiViews
de error. 335
cambiar por:
Una buena opcin es guardar php.
ini en el directorio de instalacin Options -Indexes FollowSymLinks MultiViews
de php y copiarlo al directorio Donde dice:
windows cuando se trate de usar la
configuracin como mdulo. #
176
cambiar por:
Acceso directos para cada
LoadModule php5_module c:/Apache/php5/php5apache.dll
una de las configuraciones
Donde dice:
Para evitar tener que hacer ClearModuleList
modificaciones en httpd.conf cada 205
vez que tratemos de cambiar el aadir inmediatamente despus una nueva lnea con
modo de utilizacin de PHP es AddModule mod_php5.c
suficiente con crear un acceso para
cada una de las opciones. Como Donde dice:
puedes ver en la sintaxis de las
lneas de comando, basta con DirectoryIndex index.html
386
cambiar el nombre del fichero conf cambiar por:
para optar por una u otra opcin.
DirectoryIndex index.html index.htm index.php
Donde dice:

(lnea en blanco)
728
cambiar por:

AddType application/x-httpd-php .php

Sintaxis de la lnea de comandos del acceso directo a esta configuracin

C:\Apache\apache.exe -w -f "C:\Apache\conf\httpd_modulo5.conf" -d "C:


\Apache\"

Anterior Indice Siguiente


Instalacin de Apache 2.0.58

Proceso de instalacin
El programa de instalacin

El proceso de instalacin es En el directorio Extras del CD puedes encontrar el fichero apache_2.0.58-win32-x86-


prcticamente el mismo que no_ssl.msi. Si por alguna circunstancia imprevista no estuviera all, puedes descargarlo
hemos comentado para el caso de desde este enlace directo.
Apache 1.3.35.

Solo hay un par de detalles Las pantallas diferentes


distintos que son estos:

Donde all se elega: Run when


starter manually, only for me
ahora hemos de elegir: Only for
the current user, on Port 8080,
when started Manually

Donde elegamos: Complete


ahora elegiremos: Typical.

El resto del proceso es idntico.


Incluso en el directorio de
instalacin ya que podemos seguir
eligiendo c:\ de forma que el
propio programa de instalacin nos
crear el directorio c:\Apache2

Arrancar
Apache 2.0.58

Tambin aqu hay una pequea


diferencia. Ahora tendremos que
ejecutar apache.exe desde c:
\Apache2\bin

Al ponerse en marcha se abrir la


ventana del MS-DOS pero no
aparecer ningn texto. Puedes
verlo en la imagen.

El puerto 8080

Un detalle importante es que, por


defecto, Apache 2.0.58 (todas las
versiones de la serie 2) se instalan
-cuando se sigue nuestro proceso-
de manera que escuchan el puerto
8080. Por eso, por el momento,
habr que escribir la direccin tan
como ves en esta imagen.

En la parte derecha tienes las


modificaciones de configuracin
para cambiar el puerto y evitar Fichero de configuracin de Apache
tener que escribir el :8080 a
continuacin de la direccin.
Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
A lo largo de todo el proceso de encuentran en el directorio: C:\Apache2\conf
configuracin supondremos que
tienes instalado Apache 1.3.35 y
que tal como hemos dicho en las
Fichero inicial httpd.default.conf
pginas de estos materiales los Guardar como (*) httpd.conf
directorios de instalacin de PHP
estn en los subdirectorios php4 y Guardar como httpd.orig
php5 de c:\Apache\.
Modificaciones en el fichero inicial
De esta forma podremos evitar Lnea Cambios
duplicidades en la instalacin,
usando instalaciones anteriores de Donde dice: (**)
PHP y podremos utilizar de forma Listen 8080
alternativa una u otra versin de 120
Apache. cambiar por:

Por idnticos motivos, en la Listen 80


configuracin que tienes a la Donde dice: (***)
derecha hemos puesto como
Document Root de este servidor la ServerName localhost:8080
ruta c:\Apache (hacemos que 212
cambiar por:
apunte al root de Apache 1.3.35)
de modo que podamos utilizar - ServerName localhost
tanto desde este como desde la
versin 1- los mismos scripts,
Donde dice: (****)
documentos, directorios, etc.
Options Indexes FollowSymLinks
Si utilizas un criterio diferente 267
habrs de tener en cuenta las cambiar por:
ubicaciones de PHP y tambin del
Document Root y modificar tanto Options -Indexes FollowSymLinks
la configuracin de la configuracin
de Apache como tambin la de php.
ini ya que deber indicarse en l el Observaciones sobre la configuracin
nuevo root del servidor. (*) Guardaremos el fichero modificado con dos nombres distintos. Uno de ellos para hacer la
primera prueba del servidor (httpd.conf) y el otro (httpd.orig) para utilizarlo como base de las
modificaciones posteriores.
Quitar el icono de la (**) Mediante esta modificacin evitaremos que el servidor escuche el puerto 8080 y le
barra de tareas obligaremos a utilizar el puerto por defecto (80).

(***) Las razones de esta modificacin son similares a las anteriores. Al quitar el :8080 ya no ser
Al realizar la instalacin de preciso incluir este valor al pedir las pginas desde el navegador
Apache2 nos aparece un icono
como este en la barra de tareas de (****)
Windows. Si quieres quitarlo, basta
con borrar el icono de acceso
directo que est en la carpeta:
C:\WINDOWS\Men Inicio Una vez efectuadas las modificaciones anteriores, al arrancar el servidor y escribir la
\Programas\Inicio. direccin: http://localhost deber aparecer la pgina por defecto de Apache.
Si a pesar de eso se resiste
tambin ir al la opcin Inicio -
>Ejecutar y escribir all msconfig
y desactivar all (pestaa Inicio)la
casilla de verificacin que dice:
Apache Service Taskbar Icon

Anterior Indice Siguiente


Instalacin de PHP 4 sobre Apache 2.0.58

Proceso de instalacin
PHP 4 como CGI
Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
Al establecer este proceso hemos encuentran en el directorio: C:\Apache2\conf
considerado que las condiciones
son las sealadas en la pgina
anterior Fichero inicial httpd.orig
Guardar como h2_cgi4.conf
Es decir, consideraremos que ya
tenemos instalado PHP4 y que el Modificaciones en el fichero inicial
directorio de instalacin es c:
Lnea Cambios
\apache\php4\.
Donde dice:
Consideraremos tambin que el
directorio raz del servidor va a ser DocumentRoot "C:/Apache2/htdocs"
el mismo que el de Apache 1.3.35 228
cambiar por:
(que suponemos tambin
instalado) y que tenemos de los DocumentRoot "C:/Apache/htdocs"
ficheros php.ini creados al hacer
la configuracin de PHP 4 para la Donde dice:
versin 1 de Apache. <Directory "C:/Apache2/htdocs">
253
cambiar por:
Modo CGI
<Directory "C:/Apache/htdocs">
La configuracin es idntica a la Donde dice:
realizada en el caso de Apache
1.3.35. Slo se incluyen dos DirectoryIndex index.html index.html.var
modificaciones adicionales para cambiar e incluir la lneas siguientes:
indicar que el root de este servidor 321
no va a estar en el directorio DirectoryIndex index.html index.php index.htm
Apache2 sino en Apache. ScriptAlias /php4/ "C:/Apache/php4/"
AddType application/x-httpd-php .php
Respecto al acceso directo hay dos Action application/x-httpd-php "/php4/php.exe"
cambios a tener en cuenta. En esta
versin del servidor el fichero
ejecutable apache.exe no est en
Sintaxis de la lnea de comandos del acceso directo a esta configuracin
el directorio raz (como ocurre en
Apache 1.3.35) sino en el C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_cgi4.conf" -d "C:
subdirectorio bin. Esta \Apache2\"
circunstancia no obliga a
considerar esa modificacin a la
hora de escribir la ruta de acceso
en el acceso directo que crearemos PHP4 como mdulo de Apache 2.0.58
para arrancar el servidor en este
modo.
Fichero inicial httpd.orig

Mdulo de Apache Guardar como h2_m4.conf


Modificaciones en el fichero inicial
La configuracin de PHP 4 como Lnea Cambios
mdulo de esta versin de Apache
es muy similar a la comentada Donde dice:
para Apache 1.3.3. Tiene una
DocumentRoot "C:/Apache2/htdocs"
diferencia muy importante que es 228
preciso tener en cuenta. En esta cambiar por:
versin de Apache no debe
incluirse la lnea de configuracin: DocumentRoot "C:/Apache/htdocs"
Donde dice:
AddModule mod_php4.c
<Directory "C:/Apache2/htdocs">
que si es imprescindible en el caso 253
de la versin 1. cambiar por:

Adems de esto, la librera de PHP


<Directory "C:/Apache/htdocs">
que contiene el mdulo es distinta Donde dice:
de la que se usa para la otra
versin del servidor. Observa que #
en este caso se llama 133
cambiar por:
php4apache2.dll.
LoadModule php4_module c:/Apache/php4/sapi/php4apache2.dll
El resto de las modificaciones son
idnticas a las ya comentadas. Los Donde dice:
cambios de la direccin del root del DirectoryIndex index.html index.html.var
servidor y la inclusin de la ruta 321
adecuada hasta la librera que cambiar por:
contiene el mdulo.
DirectoryIndex index.html index.htm index.php
Donde dice:

(lnea en blanco)
756
cambiar por:

AddType application/x-httpd-php .php

Sintaxis de la lnea de comandos del acceso directo a esta configuracin

C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_m4.conf" -d "C:\Apache2


\"

Anterior Indice Siguiente


Instalacin de PHP 5 sobre Apache 2.0.58

Proceso de instalacin
PHP 5 como CGI
Al establecer este proceso hemos
considerado que las condiciones Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
son las sealadas en la pgina encuentran en el directorio: C:\Apache2\conf
anterior

Es decir, consideraremos que ya


Fichero inicial httpd.orig
tenemos instalado PHP5 y que el Guardar como h2_cgi5.conf
directorio de instalacin es c:
\apache\php5\. Modificaciones en el fichero inicial
Lnea Cambios
Consideraremos tambin que el
directorio raz del servidor va a ser Donde dice:
el mismo que el de Apache 1.3.35
(que suponemos tambin DocumentRoot "C:/Apache2/htdocs"
228
instalado) y que tenemos de los cambiar por:
ficheros php.ini creados al hacer
la configuracin de PHP 5 para la DocumentRoot "C:/Apache/htdocs"
versin 1 de Apache.
Donde dice:

<Directory "C:/Apache2/htdocs">
Modo CGI 253
cambiar por:
La configuracin es idntica a la <Directory "C:/Apache/htdocs">
realizada en el caso de Apache
1.3.35. Slo se incluyen dos Donde dice:
modificaciones adicionales para
DirectoryIndex index.html index.html.var
indicar que el root de este servidor
no va a estar en el directorio cambiar e incluir la lneas siguientes:
Apache2 sino en Apache.
321 DirectoryIndex index.html index.php index.htm
Respecto al acceso directo hay dos ScriptAlias /php5/ "C:/Apache/php5/"
cambios a tener en cuenta. En esta AddType application/x-httpd-php .php
versin del servidor el fichero Action application/x-httpd-php "/php5/php-cgi.exe
ejecutable apache.exe no est en
el directorio raz (como ocurre en
Apache 1.3.35) sino en el
subdirectorio bin. Esta Sintaxis de la lnea de comandos del acceso directo a esta configuracin
circunstancia no obliga a
considerar esa modificacin a la C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_cgi5.conf" -d "C:
hora de escribir la ruta de acceso \Apache2\"
en el acceso directo que crearemos
para arrancar el servidor en este
modo.

Tambin hay que tener en cuenta


PHP 5 como mdulo de Apache 2.0.58
que en la versin 5 de PHP -a
diferencia de PHP 4- el intrprete Los ficheros httpd.conf para esta instalacin de Apache 2.0.58 sern los que se
es el archivo php-cgi.exe encuentran en el directorio: C:\Apache2\conf

Mdulo de Apache Fichero inicial httpd.orig


Guardar como h2_m5.conf
La configuracin de PHP 4 como
mdulo de esta versin de Apache Modificaciones en el fichero inicial
es muy similar a la comentada
Lnea Cambios
para Apache 1.3.3. Tiene una
diferencia muy importante que es Donde dice:
preciso tener en cuenta. En esta
versin de Apache no debe DocumentRoot "C:/Apache2/htdocs"
228
incluirse la lnea de configuracin: cambiar por:

AddModule mod_php4.c DocumentRoot "C:/Apache/htdocs"


que si es imprescindible en el caso Donde dice:
de la versin 1.
<Directory "C:/Apache2/htdocs">
253
Adems de esto, la librera de PHP cambiar por:
que contiene el mdulo es distinta
de la que se usa para la otra <Directory "C:/Apache/htdocs">
versin del servidor. Observa que Donde dice:
en este caso se llama
php5apache2.dll. #
133
El resto de las modificaciones son cambiar por:
idnticas a las ya comentadas. Los
LoadModule php5_module c:/Apache/php5/php5apache2.dll
cambios de la direccin del root del
servidor y la inclusin de la ruta Donde dice:
adecuada hasta la librera que
contiene el mdulo. DirectoryIndex index.html index.html.var
321
cambiar por:

DirectoryIndex index.html index.htm index.php


Donde dice:

(lnea en blanco)
756
cambiar por:

AddType application/x-httpd-php .php

Sintaxis de la lnea de comandos del acceso directo a esta configuracin


C:\Apache2\bin\apache.exe -w -f "C:\Apache2\conf\h2_m5.conf" -d "C:\Apache2
\"

Anterior Indice Siguiente


Instalacin de MySQL 4.1 y MySQL 5.0

Proceso de instalacin
Proceso de instalacin

En el directorio Extras del CD-


ROM tienes un fichero llamado
mysql-4.1.20-win32.zip.

Al descomprimir podrs observar


que contiene un nico fichero con
nombre setup sin ninguna otra
identificacin que al ser ejecutado
va mostrando las diferentes
ventanas que ests viendo al
margen, numeradas segn el
orden de aparicin, y que
aparecern sucesivamente a
medida que vayamos pulsando los
sucesivos next.

En la ventana 2 elegiremos la
opcin Custom que nos permitir
elegir el directorio de instalacin
tal como puedes ver en la ventana
3.

Por si tuvieras instalada una


versin anterior te sugerimos
utilizar como directorio de
instalacin c:\mysql41.

Una vez elegido y confirmado el


directorio de instalacin (ventanas
4 y 5) y comenzado el proceso
Install (ventana 5), podemos
encontrarnos en dos situaciones
diferentes.

Si utilizamos Windows XP W2000


aparecer la ventana 6 en la que
elegiremos la opcin Skip Sign-Up
para evitar el proceso de registro
de usuarios sugerido en ella. En el
caso de Windows98 esta ventana
no aparece durante el proceso de
instalacin.

Al acabar el proceso de instalacin


(ventana 7) dejaremos activada la
casilla de verificacin Configure
the MySQL server now antes de
pulsar el botn finalizar.

Al hacerlo, aparecern las


ventanas de configuracin.
Elegiremos la opcin Standart
Configuracion (ventana 9). Al
llegar la ventana 10 habr algunas
diferencias de opciones segn el
sistema operativo que utilicemos.
Bajo Windows98 la opcin Install
as Windows Service no estar
permitida, mientras que tanto en
W2000 como en W XP habremos
de desactivar esa casilla se
verificacin tal como se ve en la
imagen.

Activaremos tambin la casilla de


verificacin Include Bin directory in
Windows Path (en el apartado
siguiente haremos algunos
comentarios sobre este asunto).

En la ventana final (ventana 11)


aparecer la informacin sobre el
proceso de configuracin. Las
casillas de verificacin marcadas
en azul (si el proceso se realiz
correctamente) e informacin muy
importante sobre la ubicacin del
fichero my.ini creado durante el
proceso.

El fichero my.ini

Este punto requiere especial


atencin. Cuando la instalacin se
realiza bajo Windows98 el fichero
My.ini es creado en el directorio
Windows.

Si existiera un my.ini anterior en


el directorio Windows (que podra
ocurrir el caso de que tener
instalada una versin anterior de
MySQL o de no haberlo eliminado
despus de la desinstalacin de tal
versin) la sobrescribira y por lo
tanto inhabilitara el uso de aquella
versin si existiera.

En el caso de Windows XP y de
W2000 las cosas son distintas ya
que el instalador escribe my.ini en
directorio de instalacin (en el
supuesto que describimos sera c:
\mysql41). Si se trata de Windows
XP has que tomar la precaucin de
borrar cualquier otro archivo my.
ini que existiera en el directorio
Windows. De no hacerlo, MySQL
intentara utilizar aquel fichero y
no funcionara correctamente.

Cuando se trata de Windows2000


las cosas vuelven a ser diferentes.
En las pruebas que hemos hecho,
hemos podido comprobar que
parece que el instalador no incluye
correctamente el path (Include Bin Cuidado!
Directory in Windows Path) y que
es necesario mover el fichero my. Para evitar problemas de funcionamiento recuerda las cautelas que requiere cada sistema
ini desde el directorio donde se ha operativo.
hecho la instalacin al directorio
raz de Windows (WINNT en las
instalaciones ms habituales).
Windows98
My.ini debe estar en el directorio Windows

Si existieran versiones anteriores de my.ini en ese directorio se sobrescribiran


Puesta en servicio del
servidor MySQL 4.1 WindowsNT W2000
El fichero my.ini debe estar en WINNT y habremos de copiarlo desde la

Uno de los cambios que han sido ubicacin en la que ha sido creado durante la instalacin.
introducidos en esta versin de La ubicacin donde ha sido creado my.ini se visualiza en la ventana 11 del
MySQL (respecto a las versiones proceso de instalacin.
4.0 y anteriores) es que ya no
incluye la opcin de utilizar Windows XP
winmysqladmin.
Requiere eliminar cualquier my.ini que pudiera existir en el directorio

MySQL ha desarrollado nuevas Windows


herramientas para el control del Utiliza my.ini desde el directorio en el que ha sido creado por el instalador.

servidor a travs de Windows pero


tienen el inconveniente de que no
funcionan bajo Windows 98. Por
esa razn (intentamos que esta Puesta en servicio desde la consola de MS-DOS
instalacin pueda ser usada en
todos los sistemas operativos)
entendemos que el proceso de Arrancar MySQL
puesta en marcha y parada ms
verstil sera utilizando la consola
Para poner en marcha MySQL basta con ejecutar este comando:
de MS-DOS tal como describamos
al instalar MySQL 4.0 y como
volvemos a indicar al margen.

Aunque incluimos las mismas


imgenes de la versin anterior a partir de su ejecucin el servidor MySQL ya estar activo y podramos gestionarlo desde
hemos de hacer notar que el
PHP desde la propia consola MS-DOS.
prompt de MS-DOS debera
apuntar al directorio en el que
tenemos instalada esta versin de Cuidado!
MySQL.
En algunas versiones de Windows es posible que, al arrancar el servidor, se quede el cursor
Tipos de tablas en MySQL intermitente en la ventana de MS-DOS sin que regrese al prompt. Basta con cerrar la
ventana Smbolo del Sistema y reabrirla. El servidor seguir activo y ya ser posible la
4.1
ejecucin de comandos desde esta consola.
Aunque esta versin mantiene la
posibilidad de uso de tablas tipo Apagar el servidor MySQL
InnoDB y MyISAM, a diferencia
de lo que ocurra en versiones
anteriores, las tablas por defecto Para poder apagar el servidor es necesario utilizar un nombre de usuario. En este caso
de MySQL 4.1 son del tipo utilizaremos el nombre de usuario root (el usuario que se crea por defecto.
InnoDB. Si pretendes utilizar el
tipo MyISAM habr de ser La sintaxis sera la siguiente:
especificado en la sentencia de
creacin de la tabla.

Problemas con los


servicios
Ejecutar instrucciones como usuario
Al comentar la instalacin de
MySQL 4.0 habamos dicho que al El primer paso para poder ejecutar sentencias MySQL ser tener el servidor activo.
ejecutar (bajo NT XP) la Para ello habr que seguir el proceso descrito anteriormente.
herramienta winmysqladmin se
creaba un acceso directo en Inicio El paso siguiente sera ejecutar una instruccin como esta (solo en el caso del usuario
y un servicio MySQL que debamos root o de un usuario sin contrasea).
desactivar para evitar que el
servidor se iniciara de forma Ejecutaremos esta instruccin (con idntica sintaxis) para ejecutar una sentencia
autmtica al arrancar el ordenador. MySQL.

Ese servicio se activa de forma


automtica cuando se ejecuta por
primera vez la herramienta
winmysqladmin sobre Windows NT Este mensaje de bienvenida y el cambio de directorio (observa que ahora el prompt ha
y Windows XP. cambiado y apunta hacia mysql nos indican que MySQL est listo para recibir
instrucciones.
Es posible que, si se desactiva y,
posteriormente, se realiza la
desinstalacin de MySQL 4.0 no se
elimine ese servicio de forma
automtica. Es un problema que
se nos ha plateado durante las
pruebas realizadas con esta
instalacin.

Esa situacin parece creear


problemas para la puesta en Lo nico que haremos desde aqu ser crear un usuario. En adelante nos
marcha de MySQL 4.1 y la solucin comunicaremos con MySQL a travs de la web y usando como herramienta de
es eliminar ese servicio. La forma comunicacin el PHP.
de hacerlo es eliminarlo en el
registro de Windows. La forma de Para crear el nuevo usuario utiliza exactamente la sintaxis que ves en la imagen.
hacerlo, es la que tienes en la
imagen de la derecha que ser
visualizada al ejecutar regedit.
Bastar seleccionar la carpeta
indicada en la imagen, pulsar con
el botn derecho del ratn sobre el
icono y elegir la opcin eliminar.
Eliminar servicio MySQL desde el registro de Windows
Cuidado!

No toques el registro de
Windows salvo en caso de
absoluta necesidad.

Desinstala previamente la
aplicacin a la que se accede
a travs del servicio antes de
eliminarlo.

MySQL 4.1 y PHP

La utilizacin de MySQL 4.1 no


plantea problema alguno bajo PHP
5.

Todo lo descrito en pginas


anteriores sobre gestin de bases
de datos a travs de PHP es vlido
para esta versin.

Cuando se utiliza una versin 4


de PHP (tal como ocurre con los
materiales de este curso) es
necesario recurrir a un truco (lo
tienes descrito al margen) para
que pueda ser utilizado.

La razn de esta incidencia es la


modificacin del algoritmo de
encriptacin de contraseas. Las
versiones anteriores de MySQL
utilizaban el algoritmo de md5 Contraseas compatibles con PHP4 y PHP5
(compatible con PHP 4) pero en
esta nueva versin ha sido
modificado y PHP 4 no ha sido Para modificar las contraseas a su formato antiguo deberemos utilizar la sentencia:
adaptado (al menos por el
momento) a ese cambio. SET PASSWORD FOR usuario = OLD_PASSWORD ('contrasea');
Las contraseas creadas con esta desde la consola de MS-DOS, lo que requiere las operaciones previas que puedes ver en
nueva versin (que no son la imagen.
compatibles con PHP4) son
fcilmente reconocibles desde
phpMyAdmin dado que, a
diferencia de la anteriores,
empiezan por un asterisco.

Modificacin de php.ini

Para evitar los potenciales


problemas que advierte el mensaje
que tienes a la derecha, habr que
modificar php.ini descomentando
(quitar el ; que lleva delante) la
lnea donde dice:

extension=php_mbstring.dll

MySQL 5.0

En el directorio Extras de este CD


dispones del fichero mysql-5.0.22-
win32.zip que, una vez
descomprimido, contiene el
instalador de esta versin de
MySQL. Mensaje de advertencia de phpMyAdmin

Al ejecutar PhpMyAdmin utilizando este servidor podremos ver este mensaje de


advertencia:
No se hall la extensin PHP mbstring y al parecer usted est usando tipografa multibyte.
phpMyAdmin no puede cortar correctamente las cadenas de caracteres sin la extensin
mbstring y podra dar resultados inesperados.

Al modificar el fichero php.ini de la forma que comentamos al margen, esa advertencia


desaparecer.

Instalacin de MySQL 5.0

El proceso de instalacin de esta versin es idntico al descrito en los prrafos


anteriores para la versin 4.1. Su comportamiento bajo PHP4 plantea los mismos
problemas y el procedimiento para solventarlos sigue siendo el mismo comentado en
aquella versin.

Anterior Indice Siguiente

También podría gustarte