Sunteți pe pagina 1din 254

Curso de PHP 5 Apndice El lenguaje HTML

Teora: El lenguaje HTML


1 - Introduccin: el lenguaje HTML
El lenguaje HTML (HyperText Markup Language) ha sido diseado para la publicacin de
contenidos en Internet El lenguaje dispone de la sintaxis necesaria para !or"atear textos#
incluir i"$genes y ani"aciones# as% co"o para enla&ar con otros contenidos del "is"o o de
otro ser'idor
Es un lenguaje interpretado por cada 'isuali&ador cliente (na'egador)# de tal !or"a (ue la
apariencia de las p$ginas puede 'ariar entre di!erentes na'egadores# 'ersiones y plata!or"as
)or eje"plo# existen algunos (ue slo "uestran texto# co"o Lynx )or esto# sie"pre debe"os
tener cuidado# cuando disea"os nuestras p$ginas# para (ue otras personas puedan 'erlas
correcta"ente
En este ap*ndice se "uestra la sintaxis co"patible de "ayor utili&acin re!erida al est$ndar
HTML +, -i el alu"no o alu"na desea obtener "ayores conoci"iento del te"a o los
necesita# les reco"enda"os "atricularse en el curso de HTML del proyecto ME.T/0
Ta"bi*n he"os incluido re!erencias interesantes a p$ginas web sobre HTML en el apartado
Ms Informacin de este ap*ndice
Estructura del Lenguaje HTML
El lenguaje HTML est$ estructurado "ediante eti(uetas (tags) Estas eti(uetas nor"al"ente
est$n e"parejadas y encierran un contenido 1e esta "anera# "odi!ican la cualidad o !or"ato
del contenido "ostrado en la pantalla del na'egador 2 continuacin# se o!rece un es(ue"a
ilustrati'o de su estructura3
<XXX> Inicio de la eti(ueta 444
5/.TE.I1/
</XXX> 6inal de la eti(ueta 444
Las eti(uetas pueden ser apiladas ordenada"ente En este caso el es(ue"a (uedar%a as%3
<XXX>
<YYY>
</YYY>
</XXX>
.ota3 2lgunas eti(uetas slo est$n integradas por la eti(ueta inicial y# por lo tanto# no se
cierran )or eje"plo# la eti(ueta <HR># (ue dibuja una l%nea hori&ontal co"pleta# slo tiene esta
eti(ueta inicial
Las letras de las eti(uetas pueden ser "ay7sculas o "in7sculas indistinta"ente8 para "ayor
claridad# en el curso se escriben sie"pre en "ay7sculas 2si"is"o# los propios na'egadores#
1 de 16
Curso de PHP 5 Apndice El lenguaje HTML
ade"$s de soportar las eti(uetas usuales del lenguaje HTML# disponen de eti(uetas extras (ue
aaden nue'as !uncionalidades a las anteriores# si bien nor"al"ente son inco"patibles entre
los di!erentes na'egadores )or esto# a(u% slo se "ostrar$n las eti(uetas est$ndares b$sicas
Todo !ichero HTML e"pie&a con la eti(ueta <HTML> para indicar el inicio del docu"ento y
acaba con la eti(ueta </HTML> para indicar el !inal del "is"o
El docu"ento en s% est$ di'idido en 9 partes3
El encabe&ado# encerrado por las eti(uetas3 <HEAD> </HEAD>
El cuerpo# encerrado por las eti(uetas3 <BODY> </BODY>
En el encabe&ado se encuentra toda la in!or"acin del docu"ento (ue no se 'isuali&a en el
$rea principal del na'egador# co"o el t%tulo de la p$gina# contenido entre las eti(uetas
<TITLE> </TITLE>
1entro del cuerpo se halla todo el contenido (ue se "uestra en el $rea principal del na'egador#
co"o texto# i"$genes# etc
)or lo tanto# la estructura b$sica de una p$gina se escribe de la siguiente "anera3
<HTML>
<HEAD>
<TITLE>T%tulo de la p$gina</TITLE>
</HEAD>
<BODY>
2(u% aparecen todas las eti(uetas y contenidos
(ue se 'isuali&an en el na'egador
</BODY>
</HTML>
2 - Instrucciones bsicas
2 continuacin "ostra"os una serie de instrucciones b$sicas y las "$s co"unes In!or"a"os
al lector de (ue el lenguaje HTML no interpreta los espacios en blanco o los saltos de l%nea del
docu"ento !uente# por lo cual existen caracteres especiales al e!ecto
9: 6or"ateo de caracteres y blo(ues
<B>Te!o</B>
BOLD3 "uestra el contenido ;Texto< en negrita
<I>Texto</I> ITALIC3 "uestra el contenido ;Texto< en cursi'a
2 de 16
Curso de PHP 5 Apndice El lenguaje HTML
<PRE>Texto</PRE>
)re!or"ateado3 ;Texto< aparecer$ co"o si hubiese sido escrito por
una "$(uina de escribir con una !uente de espacio !ijo (tipo
Courier) respetando espacios y saltos de l%nea
<BLOCKQUOTE>
Texto
</BLOCKQUOTE>
5ita Textual3 destaca una cita dentro del texto general aadiendo
"$rgenes i&(uierdo y derecho
<P>
-eparacin entre p$rra!os3 e!ect7a un salto de l%nea y deja una
l%nea en blanco
<BR>
-alto de l%nea3 e!ect7a un salto de l%nea 7nica"ente Este
ele"ento no se cierra (no existe =>?0@)
<HR>
1ibuja una l%nea hori&ontal Este ele"ento no se cierra (no existe
=>H0@)
<ADDRESS>
Nombre autor
</ADDRESS>
2utor3 indica el no"bre del autor del docu"ento !or"ateando el
texto en cursi'a y alineado a la i&(uierda
<H4>
Texto Cabecera
</H4>
6or"ateo de texto "ediante cabeceras3 las eti(uetas =Hx@# con x
desde : hasta A# "uestran di!erentes ta"aos de letras y un salto
de l%nea 'ariable La cabecera tipo : es la "$s grande#
decreciendo el ta"ao de la !uente al au"entar el n7"ero x
9: Listas3
Es interesante "ostrar contenidos en !or"a de lista Existen B tipos de lista# a saber
<UL>
<LI> )alabra :
<LI> )alabra 9
<LI> )alabra B
<LI> Etc*tera
</UL>
Lis!a no numerada (unordered list)3
presenta una lista sin (ue sus ele"entos
est*n precedidos de un n7"ero secuencial
<OL>
<LI> )alabra :
<LI> )alabra 9
<LI> )alabra B
<LI> Etc*tera
</OL>
Lis!a ordenada (ordered list)3 presenta una
lista cuyos ele"entos est$n precedidos de un
n7"ero secuencial
<DL>
<DT> T*r"ino :
<DD> 1e! t*r"ino :
Lis!a de definicin (de!inition list)3 se utili&a
para glosarios o de!iniciones de t*r"inos 2
di!erencia de las 9 anteriores# a(u% cada
3 de 16
Curso de PHP 5 Apndice El lenguaje HTML
<DT> T*r"ino 9
<DD> 1e! t*r"ino 9
</DL>
blo(ue de texto est$ !or"ado por 9 eti(uetas
<DT> (Definition Term)# (ue indica la palabra
(ue desea"os de!inir# y <DD> (Definition
Definition)# (ue es la de!inicin propia"ente
dicha
-e pueden anidar unas listas dentro de otras
.ota3 -i desea"os incluir un co"entario dentro de la p$gina HTML# utili&are"os los dos
s%"bolos3 =CD (para abrir el co"entario) y EE@ (para cerrarlo)
3 - Enlaces y anclas
El uso de enlaces es una de las caracter%sticas principales del lenguaje HTML Fstos han
pro'ocado la r$pida di!usin del lenguaje# ya (ue per"iten conectar contenidos del "is"o o de
di!erentes ser'idores de "anera "uy sencilla e intuiti'a Gsual"ente# los enlaces tienen la
siguiente estructura3
<A HREF="xxx"> yyy </A>
donde HxxxI es el destino del enlace e HyyyI representa el indicador de enlace (un texto y>o una
i"agen)
1istingui"os B usos de los enlaces3
<A NAME="m!""> </A>
<A HREF="#m!""> </A>
Enlaces den!ro de una misma pgina (ta"bi*n lla"ados
JanclasJ) utili&ados para poder saltar dentro de una "is"a
p$gina La pri"era l%nea es la "arca en la p$gina (ta"bi*n
lla"ada ancla) e indica el sitio exacto adonde se desea
saltar8 la segunda l%nea es el enlace# (ue nos lle'ar$ al
ancla
<A HREF="$%&'()*m"> YYY
</A>
<A HREF="$%&'()*m#m!"">
YYY
</A>
<A
HREF=")**$+//,-m&'&-/$%()*m"
>
YYY
</A>
Enlaces a o!ras pginas utili&ados para poder ;enla&ar<
p$ginas del "is"o o de di!erentes ser'idores El pri"er
eje"plo es un enlace a otra p$gina del "is"o ser'idor En
el segundo# enla&a"os una p$gina del "is"o ser'idor
"ostrando una deter"inada posicin de la p$gina (ancla)
En el 7lti"o eje"plo enla&a"os a una p$gina de otro
ser'idor
4 de 16
Curso de PHP 5 Apndice El lenguaje HTML
<A
HREF="m&.*-+/m&.0,-m&'&-">
YYY
</A>
Enlaces a una direccin e"mail usados para !acilitar el
en'%o de correo electrnico
4 - Incluir igenes
La !or"a de incluir i"$genes en nuestros docu"entos HTML es "uy parecida a la utili&ada
para incluir enlaces En lugar de indicar la p$gina a la (ue (uere"os saltar# establece"os el
no"bre del !ichero (ue contiene la i"agen (ue desea"os "ostrar La estructura de la eti(ueta
es la siguiente3
<IM1 SRC="&m%/'(%&2" ALT=",/3"!&$"&4'"
ALI1N=.&'/m&/'*- 5IDTH='")- HEI1HT=.*->
2 continuacin# explica"os la !uncin de los atributos de la eti(ueta IMK3
SRC
Indica el ca"ino y el no"bre de !ichero donde se encuentra la i"agen (ue se
(uiere incluir Fsta puede residir en el "is"o o en otro ser'idor 2de"$s#
este atributo es el 7nico (ue sie"pre debe aparecer en la eti(ueta
ALT
-e utili&a para "ostrar un texto e"ergente cada 'e& (ue se coloca sobre la
i"agen el puntero del ratn
ALI1N
-e e"plea para alinear la i"agen en la p$gina HTML Los 'alores posibles
son3 TOP# MIDDLE# BOTTOM# RI1HT y LEFT
5IDTH
HEI1HT
-e usan para "odi!icar el ta"ao de la i"agen en la p$gina HTML El
ta"ao se expresa en pixels (por eje"plo# 5IDTH = 677) o con un
porcentaje del ta"ao de la i"agen (por eje"plo# 5IDTH = 879) -i no se
incluyen estos atributos# la i"agen aparece con las "is"as di"ensiones con
las (ue ha sido creada
.ota3 Esta eti(ueta no se cierra Es decir# no existe =>IMK@
! - "tras eti#uetas de as$ecto
En este apartado inclui"os una serie de eti(uetas (ue ca"bian la presentacin de la p$gina
HTML
L: 6ondos
)ode"os ca"biar el !ondo de nuestra p$gina de dos "aneras di!erentes3 con un color uni!or"e
o "ediante una i"agen t$pi& Esto se consigue introduciendo un nue'o atributo en la eti(ueta
BODY# (ue ya he"os 'isto anterior"ente# de esta "anera3
5 de 16
Curso de PHP 5 Apndice El lenguaje HTML
<BODY
B1COLOR="#XXYY::"
TEXT="#XXYY::"
LINK="#XXYY::"
;LINK="#XXYY::"
ALINK="#XXYY::">
Mediante el "odi!icador B1COLOR de la eti(ueta BODY
elegi"os el color de !ondo de la p$gina #XXYY:: se re!iere
al color en !or"ato hexadeci"al Es posible (ue# al ca"biar
el color por de!ecto del !ondo de la p$gina# sea necesario
"odi!icar los colores de texto y de los enlaces para una
correcta 'isuali&acin de los contenidos Los "odi!icadores
son los siguientes3
TEXT E color del texto
LINK E color de los enlaces
;LINK E color de los enlaces 'isitados
ALINK E color de los enlaces acti'os (el (ue ad(uieren en el
"o"ento de ser pulsados)
<BODY
BACK1ROUND="A!")&<-">
El "odi!icador BACK1ROUND de la eti(ueta BODY se usa
para incluir una i"agen de !ondo en la p$gina J2rchi'oJ
hace re!erencia a una i"agen en !or"ato gi! o jpg (ue haya
en el propio o en otro ser'idor 2de"$s# se pueden aadir
todos los "odi!icadores 'istos en el "odo anterior para
establecer los colores del texto y de los enlaces
L9 5aracter%sticas de la !uente de un texto
)ara establecer las caracter%sticas de la !uente de un texto# usa"os la siguiente eti(ueta3
<FONT FACE="2=/'*/" SI:E="*m>-" COLOR="#XXYY::">T/x*-</FONT>
donde los atributos son3
FACE
Mediante el "odi!icador FACE de la eti(ueta FONT elegi"os el
tipo o tipos de !uente para el JTextoJ contenido entre la eti(ueta
de inicio y de cierre
SI:E
Gsando este "odi!icador ca"bia"os el ta"ao de la !uente
-e puede asignar un ta"ao de !uente absoluto de : a M (: es
la "$s pe(uea)
El ta"ao nor"al o base de la p$gina es el B 2de"$s# se
puede ca"biar relati'a"ente respecto a este ta"ao nor"al
escribiendo# por eje"plo# <FONT SI:E=?@> para au"entar un
punto el ta"ao respecto al ta"ao base de la p$gina
Incluso se puede ca"biar el tipo de !uente nor"al de todo el
6 de 16
Curso de PHP 5 Apndice El lenguaje HTML
docu"ento incluyendo al principio de la p$gina HTML (justo a
continuacin de la eti(ueta BODY) la eti(ueta3 <BASEFONT
SI:E=A> 2s% ca"biar%a"os la !uente por de!ecto de toda la
p$gina a ta"ao L
COLOR
Mediante el "odi!icador COLOR selecciona"os el color de la
!uente #XXYY:: se re!iere al color en !or"ato hexadeci"al
LB 2lineacin de texto e i"$genes
0esulta "uy sencillo alinear cual(uier texto o i"agen incluidos en la p$gina HTML utili&ando
las eti(uetas CENTER# LEFT# RI1HT El siguiente eje"plo alinea el contenido en el centro de la
p$gina3
<CENTER>Texto o I"agen</CENTER>
2de"$s# para alinear i"$genes puede usarse el "odi!icador ALI1N de la eti(ueta IM1# co"o
he"os indicado en el apartado anterior
% - &reacin de tablas
Es "uy 7til usar tablas para la distribucin y presentacin de contenidos dentro de una p$gina
HTML El es(ue"a b$sico de una tabla es el siguiente3
<TABLE> Inicio de la tabla
<TR> )ri"era !ila
<TD> C-'*/'&,- </TD> )ri"era colu"na de la pri"era !ila
<TD> C-'*/'&,- </TD> -egunda colu"na de la pri"era !ila
</TR> 6inal de la pri"era !ila
<TR> -egunda !ila
<TD> C-'*/'&,- </TD> )ri"era colu"na de la segunda !ila
<TD> C-'*/'&,- </TD> -egunda colu"na de la segunda !ila
</TR> 6inal de la segunda !ila
</TABLE> 6inal de la tabla
Las eti(uetas necesarias para de!inir una tabla son las siguientes3
<TABLE BORDER=B-!,/
5IDTH=.!%-
HEI1HT='")-
B1COLOR=#XXYY::
CELLSPACIN1=3/$C"/.,3
CELLPADDIN1=3/$C"-'*>
Indican el co"ien&o y !inal de una tabla
Los atributos (ue se utili&an para "odi!icar la
apariencia de la tabla son3
BORDER establece la anchura del borde de la tabla
(BORDER=7 indica (ue la tabla no tiene bordes)
7 de 16
Curso de PHP 5 Apndice El lenguaje HTML
F&.3
</TABLE>
5IDTH# HEI1HT !ijan el largo y ancho de la tabla
respecti'a"ente -e expresan en pixels o "ediante
un porcentaje de la di"ensin de la pantalla
B1COLOR establece el color de !ondo de la tabla
-e expresa en !or"ato hexadeci"al
CELLSPACIN1 !ija la separacin entre las celdas
de la tabla -e expresa en pixels )or de!ecto# dicha
separacin es de 9 pixels
CELLPADDIN1 deter"ina la separacin entre el
borde y el contenido dentro de cada celda -e
expresa en pixels )or de!ecto# dicha separacin es
de : pixel
<TR>C/.,3</TR>
-ealan el inicio y el !inal de una !ila (table row) Hay
(ue repetirlas tantas 'eces co"o !ilas desee"os
obtener
<TD ALI1N=".&'/mC)-!&D"
;ALI1N=".&'/mC</!*"
COLSPAN=/x*/',/!C)-!&D
RO5SPAN=/x*/',/!C</!*
B1COLOR=#XXYY::>
C-'*/'&,-
</TD>
Establecen el inicio y el !inal de una celda (ue
contiene texto# i"$genes# enlaces# otra tabla# etc
Hay (ue repetirlas tantas 'eces co"o colu"nas
desee"os obtener
Los atributos (ue se usan son3
ALI1N establece el alinea"iento hori&ontal del
contenido en la celda Los 'alores posibles son3
CENTER# RI1HT y LEFT
;ALI1N establece el alinea"iento 'ertical del
contenido en la celda Los 'alores posibles son3 TOP#
BOTTOM y MIDDLE
COLSPAN indica la extensin de la celda en nN de
colu"nas 2s%# una celda puede ocupar 'arias
colu"nas
RO5SPAN indica la extensin de la celda en nN de
!ilas 2s%# una celda puede ocupar 'arias !ilas
B1COLOR establece el color de !ondo de la celda
-e expresa en !or"ato hexadeci"al -i he"os
incluido este atributo en <TABLE># ca"biar$ el color
por de!ecto de la celda
<TH> C-'*/'&,- </TH> Establece el inicio y el !inal de una celda de tipo
cabecera (header) -e distingue de <TD> en (ue
8 de 16
Curso de PHP 5 Apndice El lenguaje HTML
"uestra el texto en negrita y centrado -e pueden
aplicar los "is"os atributos (ue en la eti(ueta <TD>
-e pueden anidar unas tablas dentro de otras
' - (orularios
Los !or"ularios per"iten al usuario introducir in!or"acin y en'iarla al ser'idor Existen
di!erentes tecnolog%as para i"ple"entar esta !uncionalidad3 CGI# Servlets# )$ginas din$"icas
(en PP ! ASP)# )E0L# etc*tera
La estructura t%pica de un !or"ulario es la siguiente3
<FORM ACTION="""&4'CURL" METHOD="mE*-,-" ENCTYPE="*&$-C"-,&2&",-">
Cuerpo del formulario con los diferentes
elementos para la introduccin de datos
y los botones de envo o de borrado.
</FORM>
Los atributos de la eti(ueta FORM tienen las !unciones siguientes3
ACTION
Indica la accin (ue se debe reali&ar .or"al"ente suele ser una "#L (ue
apunta a un CGI# Servlet o p$gina din$"ica
METHOD
Establece el "*todo utili&ado para el en'%o de la in!or"acin Los 'alores
posibles son ;1ET< (por de!ecto) o ;POST< 5on el "*todo es ;1ET< el
contenido introducido por el usuario se aade a la "#L co"o si !uera parte
de *sta8 en ca"bio# con ;POST< la in!or"acin 'a en el cuerpo de datos
separada"ente
ENCTYPE
1enota el tipo de codi!icacin utili&ada para en'iar los datos )or eje"plo#
;TEXT/PLAIN< consigue (ue las respuestas sean recibidas co"o un !ichero
de texto# per!ecta"ente legible y sin codi!icar
Ele"entos del cuerpo de un !or"ulario
)ode"os di'idirlos en cinco tipos3
: Introduccin por "edio de texto (cajas de texto)
9 Introduccin por "edio de "en7s
B Introduccin por "edio de botones
9 de 16
Curso de PHP 5 Apndice El lenguaje HTML
+ ?otones de en'%o y de borrado
L Ele"ento in'isible
: Introduccin por "edio de texto
En este procedi"iento el usuario debe co"pletar la in!or"acin (ue desea en'iar al ser'idor
Tiene la estructura siguiente3
<INPUT TYPE="xxx" NAME="yyy" ;ALUE="DDD" SI:E="" MAXLEN1TH="BBB">
donde los atributos de la eti(ueta INPUT se usan para establecer lo siguiente3
TYPE
Indica el tipo de ele"ento (ue utili&a"os para la introduccin
de in!or"acin Los 'alores posibles son3
*/x* para establecer el ele"ento co"o un HeditI de
texto
$33F-!, es igual (ue el anterior# pero al escribir slo
se "uestran asteriscos )or esto se usa "ucho para
introducir cla'es
NAME
Establece el no"bre del ele"ento para poder relacionarlo con
su contenido
;ALUE
6ija el contenido inicial del ele"ento
SI:E
Establece la longitud del ele"ento en la pantalla
MAXLEN1TH
Establece el n7"ero "$xi"o de caracteres (ue se pueden
introducir
.ota3 INPUT no tiene eti(ueta de cierre
5uando es necesario introducir un texto (ue pueda alcan&ar una gran longitud u ocupar 'arias
l%neas# co"o un co"entario# es con'eniente utili&ar un ele"ento de texto de "7ltiples l%neas
Esto se consigue con la eti(ueta3
<TEXTAREA NAME="yyy" RO5S="'Gm/!-" COLS="'Gm/!-">
"-'*/'&,- &'&"&.
</TEXTAREA>
donde los atributos de la eti(ueta se usan para lo siguiente3
NAME
Establece el no"bre del ele"ento para poder relacionarlo con
10 de 16
Curso de PHP 5 Apndice El lenguaje HTML
su contenido
RO5S
0epresenta el n7"ero de !ilas
COLS
0epresenta el n7"ero de colu"nas
9 Introduccin por "edio de "en7s
-i desea"os (ue el usuario escoja entre 'arias opciones en lugar de escribir el texto# hare"os
uso de los ele"entos de tipo "en7 La estructura "$s usual es la siguiente3
<SELECT NAME="yyy" MULTIPLE SI:E="">
<OPTION ;ALUE="BBB" 3/./"*/,>
.&*/!.C-$"&4' @
</OPTION>
<OPTION ;ALUE=""""">
.&*/!.C-$"&4' 6
</OPTION>
<OPTION ;ALUE=",,," 3/./"*/,>
.&*/!.C-$"&4' H
</OPTION>
</SELECT>
La eti(ueta SELECT se usa para sealar el inicio y el !inal del ele"ento "en7 Entre la eti(ueta
de inicio y de !inal se encuentran las di!erentes opciones (ue seleccionar$ el usuario -us
atributos son *stos3
NAME
Establece el no"bre del ele"ento para poder relacionarlo con su
contenido
MULTIPLE
)er"ite (ue se puedan seleccionar "7ltiples opciones
SI:E
6ija el n7"ero de opciones 'isibles en la pantalla sin necesidad de
despla&arse -lo !unciona conjunta"ente con MULTIPLE -i es "ayor
(ue :# aparecer$ una lista8 en caso contrario# se 'er$ una lista
desplegable
La eti(ueta OPTION se usa para establecer una opcin del ele"ento "en7 El literal (ue
'isuali&ar$ el usuario se encierra entre la eti(ueta de inicio y de !inal -us atributos son *stos3
11 de 16
Curso de PHP 5 Apndice El lenguaje HTML
;ALUE
Establece el 'alor (ue se asigna a la 'ariable
SELECTED
-i se incluye en alguna de la opciones# esta opcin ser$ seleccionada por
de!ecto
B Introduccin por "edio de botones
-i desea"os (ue el usuario con!ir"e una opcin deter"inada con -% o .o# utili&a"os el
ele"ento checkbox Tiene el es(ue"a siguiente3
<INPUT TYPE="")/"IB-x" NAME="yyy" CHECKED>
-us atributos son *stos3
NAME
Establece el no"bre del ele"ento para poder relacionarlo con el
contenido
CHECKED
Especi!ica el ele"ento (ue aparece seleccionado por de!ecto
2de"$s# si (uere"os (ue el usuario pueda decidir entre 'arias posibilidades# utili&are"os el
ele"ento radiobutton3
<INPUT TYPE="!,&-" NAME="yyy" ;ALUE="DDD" CHECKED>
-us atributos son *stos3
NAME
Establece el no"bre del ele"ento para poder relacionarlo con el
contenido )ara asociar 'arios botones de radio a una 7nica 'ariable les
pondre"os a todos el "is"o NAME
;ALUE
Especi!ica el 'alor (ue se asignar$ a la 'ariable
CHECKED
6ija la 7nica opcin seleccionada por de!ecto
+ ?otones de en'%o y de borrado
-on ele"entos esenciales (ue sir'en para (ue el usuario pulse en ellos y en'%e la in!or"acin
al ser'idor o borre los datos introducidos en la p$gina
<INPUT TYPE="*&$-" ;ALUE="DDD">
-us atributos son *stos3
TYPE
Establece el tipo de botn )ara el en'%o de datos escribire"os JSUBMITJ
12 de 16
Curso de PHP 5 Apndice El lenguaje HTML
y para borrar los datos de la p$gina JRESETJ
;ALUE
Especi!ica el texto (ue (uere"os (ue apare&ca en el botn
L Ele"ento in'isible
2 'eces# es necesario guardar alguna 'ariable oculta en el !or"ulario para al"acenarla en la
p$gina acti'a )ara esto# se utili&a el siguiente ele"ento in'isible3
<INPUT TYPE=HIDDEN NAME="yyy" ;ALUE="DDD">
-us atributos son *stos3
NAME
Establece el no"bre del ele"ento para poder relacionarlo con su
contenido
;ALUE
Especi!ica el 'alor (ue se asignar$ a la 'ariable
) - Marcos
Gn "arco (frame# en ingl*s) es una 'entana independiente dentro de la 'entana general del
na'egador 5ada "arco tiene sus propiedades di!erenciadas3 bordes y barras de
despla&a"iento propias Gsando "arcos cada p$gina se di'idir$# en la pr$ctica# en 'arias
p$ginas independientes
)ara crear "arcos necesita"os un docu"ento HTML espec%!ico# (ue lla"a"os docu"ento de
de!inicin de "arcos En *l especi!ica"os el ta"ao y la posicin de cada "arco y el
docu"ento HTML (ue contendr$ La estructura b$sica de la p$gina principal es la siguiente3
<HTML>
<HEAD>
<TITLE>M& $!&m/! $J%&' "-' m!"-3</TITLE>
</HEAD>
<FRAMESET COLS="679KL79">
<FRAME NAME="&',&"/" SRC="&',&"/()*m.">
<FRAME NAME="$!&'"&$." SRC="&'&"&-()*m.">
<NOFRAMES>
<P>MT= '</%,-! '- $/!m&*/ m!"-3N</P>
</NOFRAMES>
</FRAMESET>
</HTML>
13 de 16
Curso de PHP 5 Apndice El lenguaje HTML
5o"o se puede obser'ar# en este caso no existe la eti(ueta BODY
2 continuacin# explica"os las eti(uetas anteriores con detalle3
<FRAMESET RO5S="xxxK yyy" COLS="<<<K DDD"> M!"-3 </FRAMESET>
-e usa para de!inir la distribucin de los "arcos en la p$gina principal "ediante colu"nas
(COLS) y !ilas (RO5S) Estas eti(uetas son anidables# por lo (ue pode"os incluir unos "arcos
dentro de otros Los !or"atos ad"itidos para estos atributos son los siguientes3
)orcentual3 co"o en las tablas# pode"os !ijar el ta"ao de un "arco indicando el
porcentaje (ue ocupar$ del espacio total disponible
2bsoluto3 el "arco correspondiente tendr$ el ta"ao especi!icado en pixels
-obre el espacio sobrante3 escribiendo un asterisco (O) indica"os (ue el "arco debe
ocupar todo el espacio sobrante )ode"os poner este s%"bolo en 'arios "arcos# (ue se
repartir$n el espacio e(uitati'a"ente )ero si (uere"os (ue uno tenga "$s espacio#
debe"os ponerle un n7"ero delante del asterisco 2s%# un "arco con un espacio de BO
ser$ tres 'eces "$s grande (ue su co"paero con slo :O
En el eje"plo de arriba se crean dos "arcos en la 'entana principal3 una colu"na# (ue ocupa
el 9,P de la p$gina# y otra# (ue ocupa el Q,P
<FRAME>
Esta eti(ueta de!ine las caracter%sticas de un "arco Los atributos ad"itidos son los siguientes3
NAME
2signa el no"bre al "arco para (ue poda"os re!erirnos a *l
SRC
Indica la "#L del docu"ento HTML (ue ocupar$ el "arco
SCROLLIN1
Establece la aparicin de barras de despla&a"iento en el "arco -u
'alor por de!ecto es AUTO (el na'egador decide si se 'en o no) Las
otras opciones son YES y NO
NORESI:E
-i lo escribi"os# el usuario no podr$ ca"biar el ta"ao del "arco
FRAMEBORDER
Establece el borde del "arco )ara eli"inar el borde su 'alor debe ser
,
MAR1IN5IDTH
6ija los "$rgenes hori&ontales dentro de un "arco -u !or"ato se
expresa en pixels
MAR1INHEI1HT
6ija los "$rgenes 'erticales dentro de un "arco -u !or"ato se
expresa en pixels
14 de 16
Curso de PHP 5 Apndice El lenguaje HTML
<NOFRAMES> M/'3O/ </NOFRAMES>
Estas eti(uetas se utili&an para "ostrar un "ensaje o una p$gina alternati'a cuando el
na'egador del usuario no soporta "arcos
* - &aracteres es$eciales
1ebido a (ue el lenguaje HTML no ad"ite directa"ente deter"inados caracteres por
co"patibilidad internacional# hay (ue sustituirlos utili&ando la siguiente tabla3
Cdigo Resultado
, , , , etctera... , , , , , , , , y
&tilde
!

"

&

'
(espacio en blanco, )ue no puede
ser usado para saltar de lnea*
1+ - Ms in,oracin
2 continuacin# indica"os algunas direcciones de Internet donde se puede encontrar "$s
in!or"acin sobre el lenguaje HTML
tt!"##$$$%$3%or&#
)$gina o!icial del Rorld Ride Reb 5onsortiu" (RB5) donde pueden encontrarse
especi!icaciones# gu%as# so!tSare y aplicaciones relacionadas con las tecnolog%as de Internet
Incluye los "anuales de re!erencia de HTML La p$gina est$ en ingl*s
tt!"##t'(%!ro&ra'ac)o*%*et#
)$gina en castellano con cursos y tutoriales sobre HTML (ue pueden ayudar "ucho a los
alu"nos y alu"nas a aprender este lenguaje
tt!"##$$$%$ebe+t)(o%co'#t'(
En este sitio se puede aprender el lenguaje HTML de una "anera a"ena y e!iciente Est$ en
castellano
15 de 16
Curso de PHP 5 Apndice El lenguaje HTML
+,-./0 1 C-2C, +,C 3445
16 de 16


Teora: Introduccin al lenguaje
1 - Objetivos
Objetivos
Adquirir unos conceptos generales y bsicos sobre el lenguaje
de programacin PHP.
Aprender a escribir con PHP programas sencillos en los que el
alumno distinga e interrelacione los elementos que integran el
cdigo PHP y los que pertenecen al lenguaje HTML.
Conocer inicialmente los materiales del curso y saber utilizar
las herramientas necesarias (Editor dev-PHP, Servidor Apache,
direccin de Internet) para realizar los ejercicios y actividades
propuestos en las Actividades.


2 - Caractersticas del lenguaje PHP
Qu es PHP
PHP es un lenguaje de programacin que se ejecuta en servidores web y permite crear
pginas HTML de forma dinmica. Las siglas PHP provienen de Personal Home Page, que
podemos traducir como Procesador personal de pginas web o de Hipertexto.
Su historia
El lenguaje PHP fue creado a finales de 1994 por Rasmus Lerdorf, que inicialmente utiliz
las pginas web elaboradas con este lenguaje para comprobar quin consultaba su
currculum. Por entonces no puso a disposicin de los usuarios esta sencilla herramienta.
A principios de 1995 public la primera versin disponible para el pblico, que fue conocida
como "Herramientas para paginas web personales" (Personal Home Page Tools). Esta
primera versin estaba integrada por un analizador sintctico, muy sencillo, que slo
comprobaba algunas macros, as como por una serie de utilidades comunes de las pginas
web de aquella poca, un libro de visitas, un contador y otras rutinas elementales.
A mediados de 1995 el analizador sintctico de la primera versin fue reelaborado dando
origen a la versin 2, que se denomin PHP/FI debido a que en ella se combinaron el
analizador sintctico inicial (PHP) con otro programa, escrito tambin por el mismo autor,
que procesaba datos de formularios (FI). A esta combinacin de herramientas para pginas
web personales e intrprete de formularios le aadi soporte para mSQL. A partir de
entonces PHP/FI creci rpidamente y bastantes usuarios empezaron a contribuir en la
elaboracin del cdigo.
Segn datos estadsticos aproximados, se calcula que a finales de 1996 el lenguaje PHP/FI
era utilizado al menos en 15.000 pginas web de todo el mundo y a mediados de 1997 este
nmero haba aumentado a unas 50.000.
A mediados de 1997 el lenguaje PHP, a partir de las aportaciones hechas por muchos
usuarios, sufri un cambio importante al dejar de ser un proyecto personal de Rasmus y
convertirse en el proyecto de un grupo mucho ms organizado. El analizador sintctico se
reelabor por completo por Zeev Suraski y Andi Gutmans. Se pusieron as las bases de la
versin 3 de PHP aprovechando la mayora del cdigo de PHP/FI e incorporando nuevo
cdigo, que convirti la versin 3 en un paquete slido y potente como herramienta para
crear pginas web dinmicamente.
A finales de 1999 se distribuyeron tanto PHP/FI como PHP3 en muchos productos
comerciales, como el servidor web "C2's StrongHold" y Redhat Linux, hasta el punto de que
puede estimarse que ya entonces el lenguaje PHP era usado por ms de 1.000.000 de
servidores en todo mundo.
En mayo de 2000 se puso a disposicin del pblico la versin 4 de PHP. Esta versin utiliza
el potente motor de scripts Zend, que aporta al intrprete PHP mayor rapidez y le
proporciona altas prestaciones. Adems, soporta otros servidores web, no slo Apache, que
permiten funcionar a PHP como mdulo nativo.
En julio de 2004 se puso a disposicin del pblico la versin 5 de PHP, que es la que vamos
a utilizar en este curso. Esta versin han mejorado significativamente el rendimiento y las
capacidades de PHP utilizando el nuevo motor de scripts Zend 2.0, que aporta cambios en
la Programacin orientada a objetos y aumenta las posibilidades del lenguaje en muchos
otros aspectos (ver nota de abajo).
A continuacin y a lo largo de todo el curso veremos terica y prcticamente las ventajas y
caractersticas de esta ltima versin de PHP, que es la que vamos a utilizar en el presente
curso.
Sus principales cualidades
1. PHP es un lenguaje sencillo. Es decir, si ya se sabe programar en lenguaje C, Perl,
Java o en el Shell de Unix, su sintaxis resulta cmoda y bastante intuitiva, como se ver en
los programas que elaboremos. Ya hemos indicado en la presentacin del curso que para
hacer este curso es necesario saber programar en algn lenguaje, ya que en el desarrollo
del mismo se suponen conocimientos suficientes de programacin, pues no se van a
explicar ms que los contenidos especficos de PHP. En este contexto hay que entender el
trmino sencillo, que hemos usado al referirnos al lenguaje PHP. Su cdigo se lee muy
bien, no hay cabeceras ni secciones previas y, por tanto, los programas elaborados con este
lenguaje se mantienen fcilmente. Cualquier alumno que sepa algn lenguaje de
programacin puede aprender lo fundamental de PHP en poco tiempo. Si, adems, quiere
llegar a realizar operaciones ms complejas, como consultar bases de datos, comunicar
procesos mediante sockets, utilizar FTP o correo electrnico, habr de tener los
conocimientos necesarios sobre estos temas para poder hacerlo con PHP.
Por otra parte, en el uso de aplicaciones elaboradas con PHP el usuario utiliza un interfaz ya
familiar como el navegador web, el mismo que viene empleando para acceder a cualquier
otra pgina, sin que necesite aprender ninguna combinacin especial de teclas, ni instalar
otro software adicional diferente de su navegador habitual, ni disponer de un sistema
operativo concreto, Unix o Windows.
2. PHP es un lenguaje rpido, es decir, a pesar de ser interpretado, la consulta de un
usuario a travs de Internet al servidor donde est el programa PHP se ejecuta con bastante
velocidad, de forma que el resultado de una solicitud aparece de forma casi instantnea en
la pantalla de su ordenador, convertido en HTML, a no ser que las condiciones del trfico o
de configuracin de la red lo impidan.
3. PHP es un lenguaje multiplataforma, es decir, su cdigo fuente es interpretado por un
servidor, est instalado ste en un ordenador que tenga el sistema operativo Unix, Mac o
que tenga Windows. El mismo cdigo es compatible tanto para uno como para otro sistema.
Esta caracterstica le da a PHP unas posibilidades muy amplias y le permite ofrecer
prestaciones muy variadas.
No obstante, debemos advertir que PHP naci y se ha desarrollado casi siempre para Linux,
por lo cual su utilizacin en servidores reales en Internet tiene ms sentido y alcanza su
eficiencia ptima en este sistema operativo.
La versin del Curso de PHP archivada en el CD est pensada para funcionar en la
plataforma Windows, ya que la mayora de las Aulas Mentor y de los alumnos que se
matriculan en las mismas dispone exclusivamente de este sistema operativo. No obstante, el
cdigo fuente PHP de los ejercicios del curso y el escrito por el alumno en sus actividades
es totalmente compatible en todas las plataformas. De ah su inmediata portabilidad.
Por otra parte, tal como hemos diseado el curso, el servidor Apache est instalado en el
mismo ordenador local donde trabaja el alumno. Por ello, solamente el usuario que est en
cada momento realizando las actividades del curso har peticiones de pginas web al
servidor Apache. En consecuencia, ste nunca se ver saturado por la concurrencia de
muchos usuarios. Adems, para hacer el curso, el alumno no necesitar estar conectado a
Internet para tener que acceder a un servidor remoto, con el consiguiente ahorro econmico
y de tiempo.
4. PHP es un lenguaje libre de licencia, gratuito. No hay que pagar para poder utilizarlo,
nos deja libres para distribuir sin cargo alguno las aplicaciones que hagamos con l e incluso
podemos mejorar y ampliar sin limitacin alguna su cdigo y el de las herramientas que
utiliza. Gracias a la colaboracin y a la generosa donacin de muchos usuarios
programadores, PHP mejora y se ampla cada da. Adems, gracias a esta colaboracin
desinteresada est ampliamente probado como herramienta.
5. PHP es un lenguaje que dispone de numerosas libreras que facilitan en gran medida
la ardua tarea de confeccionar aplicaciones. Debido a esto, es un lenguaje muy apto para
ser utilizado tanto por programadores noveles como por desarrolladores profesionales, pues
hay libreras adecuadas a desarrolladores de todos los niveles. Adems, existen en la red
mltiples recursos que hacen ms fcil el desarrollo de cualquier aplicacin.
6. PHP es un lenguaje que permite programar utilizando objetos. sta es una importante
potencialidad de PHP, dado que la Programacin Orientada a Objetos es una tendencia
presente prcticamente en todos los lenguajes, por lo cual PHP puede usar directamente
estos objetos e incorporarlos dentro de su cdigo. Cualquier programador acostumbrado a
utilizar o crear objetos en sus programas podr servirse de estos componentes en PHP con
la misma facilidad que si lo hiciera con otro lenguaje.
7. PHP es un lenguaje que puede acceder a muchas bases de datos de casi todos los
formatos: Adabas D, dbm, dBase, filePro, Hyperware, Informix, InterBase, LDAP, Microsoft
SQL Server, mSQL, MySQL, Oracle, PostgreSQL, Solid, Sybase, etctera. Esta
potencialidad hace de PHP un poderoso lenguaje de Internet, ideal para el acceso,
tratamiento y consulta de datos archivados en estos gestores de informacin.
8. PHP es un lenguaje que ofrece soporte para poder realizar otras mltiples
operaciones, como acceder a servidores IMAP, envo de correo con SMTP, acceso a
servidores de FTP, acceso a SNMP para gestin de redes y equipos, generacin dinmica
de grficos y documentos PDF, anlisis de documentos XML, corrector ortogrfico,
generacin de datos en WDDX, etctera.
9. PHP es un lenguaje que lleva incorporado en su propio diseo el acceso en red
desde cualquier puesto de trabajo. Su cdigo permite controlar perfectamente el acceso,
tanto positiva como negativamente, de los usuarios al servidor forzando, si es preciso, su
identificacin a las opciones que lo requieran.
10. PHP es un lenguaje que permite proteger de forma eficaz el cdigo fuente de las
aplicaciones informticas creadas con l, siempre que se tomen las medidas de seguridad
adecuadas en el servidor donde se hayan instalado. Como veremos, el cdigo de los
programas est slo en el servidor, que recibe la solicitud de usuario, interpreta el cdigo y
devuelve la respuesta en forma de pgina HTML en el ordenador del cliente.
Resumiendo, podemos decir que PHP es un lenguaje similar a las ASP (Active Server
Pages) de Microsoft, pero ms potente, rpido, gratuito, multiplataforma y abierto a
mejoras y ampliaciones permanentemente. Debido a esto, PHP se est imponiendo a
otros lenguajes de programacin como alternativa para el desarrollo de aplicaciones
informticas en Internet.
Mejoras aadidas a la versin 5 de PHP
Como ya hemos comentado, la versin 5 de PHP ha supuesto una mejora muy importante
respecto a las anteriores versiones. Conserva las caractersticas mencionadas en el
apartado anterior y, adems, aade stas nuevas:
1. La novedad ms importante en PHP5 es la mejora de la programacin orientada a
objetos mediante un nuevo Modelo de Objetos. El manejo de objetos en PHP 5 se ha re-
escrito completamente, permitiendo una mejora en rendimiento y muchas caractersticas
nuevas. En versiones previas de PHP, los objetos eran manejados como tipos primitivos (por
ejemplo enteros y cadenas). En el nuevo enfoque, los objetos son referenciados por gestor,
y no por valor (puede pensarse en el gestor como un identificador de objeto).
2. PHP5 incluye un depurador de errores mejorado de errores que ayuda a seguir los
problemas que se van planteando al escribir programas, interpretarlos y compilarlos con un
lenguaje tan poco tipificado como PHP. De esta manera se pueden ver sugerencias en
tiempo de ejecucin sobre la inter-operabilidad del cdigo escrito y compatibilidad hacia
adelante, que te ayudarn a mejorar tus scripts poco a poco.
3. El nuevo intrprete de PHP5 ha incluido nuevas funciones de usuario. As, el
programador dispone de nuevas funciones de tratamiento de cadenas, matrices, fecha y
hora, bases de datos y muchas otras. Algunas de las cuales se vern en la teora y
ejercicios prcticos.

3 - Funcionamiento de un programa codificado con PHP
Es importante tener una concepcin general de cmo funciona PHP antes de iniciar el curso.
Veamos esquemticamente los pasos que se dan desde que se inicia un programa en PHP
hasta que se ven los resultados de su ejecucin en la pantalla del cliente.
El funcionamiento es bastante sencillo:
Se escribe el cdigo fuente de la pgina web en lenguaje PHP.
Se guarda este cdigo en el servidor web.
El navegador de un usuario solicita al servidor la pgina codificada y guardada
en los dos pasos anteriores.
El servidor interpreta el cdigo PHP.
El servidor enva el resultado del cdigo PHP al navegador del usuario, que ve
en su pantalla la pgina en formato HTML.
Observa en el esquema siguiente el proceso explicado en las lneas
anteriores:
Servidor web
Intrprete PHP Ejecuta
Programa escrito
en lenguaje PHP



Devuelve al
usuario la pgina
web en formato
HTML

Solicita al
servidor una
pgina web


Usuario
cliente

Como puede verse en este sencillo esquema, el usuario desde su ordenador y usando su
navegador habitual solicita una pgina web del servidor al que est accediendo. El servidor
web, que contiene el cdigo fuente de la aplicacin que crea esa pgina, lo ejecuta haciendo
que el intrprete PHP genere la pgina. Seguidamente, enva al usuario cliente la pgina
solicitada en formato HTML.
En ningn momento se enva cdigo PHP al navegador del usuario cliente, por lo que todas
las operaciones realizadas son transparentes para ste, al que le parecer que est
visitando una pginas HTML que cualquier navegador puede interpretar. PHP se diferencia
de JavaScript precisamente en que el programa PHP se ejecuta en el servidor, no en la
mquina del cliente, como ocurre en JavaScript.
A la vista del esquema anterior, conviene recordar que el curso est diseado de forma que
el servidor Apache est instalado en el mismo ordenador local donde trabaja el alumno. Por
ello, al hacer el curso, el alumno no necesita conectarse a Internet para hacer peticiones de
pginas web a un servidor remoto. No obstante, el efecto real es el mismo que si estuviera
accediendo a un servidor ubicado en el otro extremo del mundo.
A continuacin, mostramos un ejemplo en el que distinguen el cdigo fuente de una pgina
web escrita con PHP, lo que recibe el navegador y lo que el usuario visualiza en la
pantalla.
Cdigo de un programa escrito en lenguaje PHP

<HTML>
<HEAD>
<TITLE>
Curso PHP 5 - Unidad 1 - Ejemplo 1
</TITLE>
</HEAD>
<BODY>

<!Las lneas anteriores contienen slo cdigo HTML.
Si lo necesitas, mira el Apndice 2. >

<? // Aqu se inicia el cdigo PHP.
$navegador = $_SERVER['HTTP_USER_AGENT'];
?> <! Aqu se cierra el cdigo PHP.>

<P>Ests usando el navegador<B>

<? // Aqu se inicia de nuevo el cdigo PHP.
echo($navegador);
?> <!// Aqu se cierra el cdigo PHP.>

<!A partir de esta lnea sigue el cdigo HTML.>
</B>.</P>

</BODY>
</HTML>



Cdigo recibido por el navegador
<HTML>
<HEAD>
<TITLE>
Programa PHP 5 - Unidad 1 - Ejemplo 1
</TITLE>
</HEAD>
<BODY>
<P>Ests usando el navegador
<B>Mozilla/4.71 [en] (Win95; I)</B>.
</P>
</BODY>
</HTML>
Visualizacin de la pgina web en el navegador
Ests usando el navegador Mozilla/4.71 [en] (Win95;I).
Si se prefiere ver la pgina que genera este sencillo programa, desde el Programa gestor
del curso puede abrirse el Ejemplo 1 de la Unidad 1 y con el botn Ejecutar mostrar en
nuestra pantalla el resultado de su interpretacin.
Aunque ahora no se comprenda del todo el contenido del programa en PHP y en HTML
puro, conviene observar lo siguiente:
El cdigo PHP empieza con los smbolos <? y termina con ?>.
Todas las instrucciones finalizan con punto y coma (";").
Puede insertarse cdigo PHP donde se quiera y siempre que haga falta.
En uno de los apartados siguientes nos referiremos con detalle a estos asuntos y en los
ejercicios de esta misma Unidad se comprender perfectamente el cdigo de este sencillo
programa.
Qu necesitamos para utilizar PHP
En las explicaciones anteriores ya se han mencionado prcticamente todos los elementos
que son necesarios para utilizar PHP como lenguaje generador de pginas web. En este
apartado resumimos los ms importantes y describimos cmo los hemos integrado en el
curso.
1. Un servidor web. A partir de la versin 4 de PHP puede utilizarse cualquiera de los ms
comunes citados. En el curso vamos a utilizar un servidor Apache 2, por ser gratuito, fcil de
instalar y ofrecer todas las prestaciones que necesitamos para realizar el curso. Al instalar
los materiales del curso, de forma automtica se instala tambin en nuestro ordenador el
servidor Apache 2, con todos los mdulos necesarios compilados y la configuracin
adecuada al curso. Dentro de la carpeta Curso de PHP 5 en el escritorio aparece un icono
para que podamos arrancar el servidor Apache antes de iniciar cada sesin de trabajo.
2. Una plataforma que soporte PHP. Ya hemos comentado que en este curso utilizamos
el sistema operativo Windows. En este entorno se instalarn los materiales del curso, as
como los mdulos compilados de PHP y Apache.
3. Un sistema gestor de bases de datos. La facilidad con que pueden consultarse bases
de datos de mltiples formatos otorga a PHP una potencia extraordinaria en la generacin
de pginas dinmicas web. PHP puede realizar consultas y procesar datos con eficacia y
rapidez. En el curso utilizaremos el gestor de bases de datos MySQL, que es uno de los ms
empleados en el desarrollo de aplicaciones con PHP, gratuito, muy eficiente y en continuo
desarrollo. Al instalarse el curso tambin se instala automticamente MySQL en el
ordenador y se establece la configuracin adecuada para el buen funcionamiento del curso.
Tambin en la carpeta Curso de PHP 5 del escritorio aparece un icono para que podamos
arrancar el servidor MySQL antes de iniciar la sesin de trabajo a partir de la Unidad 6.

4 - Cdigo PHP y cdigo HTML
A continuacin, abordamos algunos aspectos generales relativos a la forma del cdigo
escrito en PHP y a su insercin en el cdigo HTML, poniendo algunos ejemplos que nos
ayuden a comprender mejor su estructura y funcionamiento. Se trata slo de aspectos
genricos que el alumno ha de tener en cuenta siempre al analizar el cdigo de los ejercicios
resueltos y al escribir los propios.
Ya hemos visto que al ejecutar una aplicacin elaborada con PHP no hay que pensar en un
programa compilado binario de tipo exe que funciona en el ordenador del cliente, sino en un
programa cuyo cdigo est slo en el servidor web y es interpretado en el mismo a
requerimiento del usuario cliente, que en respuesta a su solicitud recibe en la pantalla el
resultado de esa interpretacin en forma de pgina web, en formato HTML, generada por
PHP.
Tambin hemos indicado que para participar en este curso es imprescindible tener algunos
conocimientos del formato HTML (HyperText Markup Language, Lenguaje de marcas de
Hipertexto). Si el alumno advierte que necesita adquirir ms conocimientos sobre este
lenguaje, en el proyecto Mentor hay un curso a distancia que puede ayudarle mucho.
Tambin puede consultar el Apndice 2 del curso donde se incluye un sencillo Manual con
una breve explicacin de las principales rdenes del lenguaje HTML. En el apartado Ms
informacin se citan algunas direcciones de Internet sobre este lenguaje.
En todo caso, damos por supuesto que quien hace el curso conoce lo ms rudimentario de
HTML y centramos las explicaciones ms detalladas en la parte del cdigo que corresponde
a PHP.
Suele decirse que PHP es un lenguaje embebido en el cdigo HTML. Y es cierto, ya que
generalmente el cdigo PHP va envuelto externamente por cdigo HTML. Aunque tambin
puede ocurrir lo contrario, es decir, que el cdigo PHP est enmarcando al cdigo HTML. En
todo caso, ambos cdigos estn ntimamente relacionados y de hecho sus instrucciones se
mezclan hasta cierto punto. Por eso, es imprescindible, en primer lugar, conocer los
separadores de uno y de otro.
Veamos en un ejemplo esta separacin usando el mismo ejemplo que ya hemos utilizado
anteriormente:

<HTML>
<HEAD>
<TITLE>
Curso PHP 5 - Unidad 1 - Ejemplo 1
</TITLE>
</HEAD>
<BODY>

<!Las lneas anteriores contienen slo cdigo HTML.
Si lo necesitas, mira el Apndice 2. >

<? // Aqu se inicia el cdigo PHP.
$navegador = $_SERVER['HTTP_USER_AGENT'];
?> <! Aqu se cierra el cdigo PHP.>

<P>Ests usando el navegador<B>

<? // Aqu se inicia de nuevo el cdigo PHP.
echo($navegador);
?> <!// Aqu se cierra el cdigo PHP.>

<!A partir de esta lnea sigue el cdigo HTML.>
</B>.</P>

</BODY>
</HTML>
Como el objetivo de PHP es generar pginas HTML, hay una estrecha relacin entre el
cdigo de PHP y de HTML. Ambos conviven dentro del mismo script. En este caso, el cdigo
PHP est envuelto por el cdigo HTML, es decir, en la parte externa inicial y final del cdigo
se usa lenguaje HTML y en su interior se insertan dos fragmentos del lenguaje PHP.
Si se desea ver la pgina que genera este sencillo programa desde el Programa gestor del
curso puede abrirse el Ejemplo 1 de la Unidad 1 y con el botn Ejecutar mostrar en nuestra
pantalla el resultado de su interpretacin.
El servidor Apache, que alberga este cdigo, distingue entre las lneas que pertenecen a
cada lenguaje para enviar al intrprete PHP las que pertenecen a PHP e interpreta l mismo
el cdigo HTML puro, generando la pgina web que remite al cliente en formato HTML.
Habitualmente no vamos a comentar ni explicar el cdigo HTML, ya que suponemos que el
alumno lo conoce. No obstante, si lo necesita para recordar o aclarar alguna etiqueta, puede
consultar el Apndice 2 del curso, donde se incluye un resumen de las principales de este
lenguaje.
Cmo saber dnde comienza y dnde acaba el cdigo PHP? Ya conocemos que los
controles HTML de apertura y cierre son, respectivamente, <control> y </control>. De forma
similar, el cdigo fuente de PHP siempre debe aparecer entre cualquiera de estos controles,
de apertura y cierre, respectivamente:
<? cdigo PHP ?>
El lenguaje PHP se configura automticamente al instalarse el curso, pero si el alumno tiene
que instalar PHP por s mismo, debe tener en cuenta que esta primera forma slo est
disponible si se han habilitado las etiquetas cortas. Esto se puede hacer a travs de la
funcin short_tags(), activando la opcin de configuracin short_open_tag en el archivo de
configuracin de PHP, o bien compilando PHP con la opcin --enable-short-tags en
configure.
<?php cdigo PHP ?>
<?script language=php>cdigo PHP </script>
<% cdigo PHP %>
Esta cuarta manera slo est disponible si se han habilitado las etiquetas tipo ASP usando
la opcin de configuracin asp_tags. El soporte para las etiquetas tipo ASP se aadi en la
versin 3.0.4.
Como regla general, en los programas del curso usaremos el primero de los cuatro
controles, ya que nos parece ms sencillo y suficientemente claro.
El servidor Apache, cuando ejecuta un programa PHP, pasa al intrprete PHP todos los
fragmentos comprendidos entre <? y ?> y devuelve al cliente los no comprendidos entre
estos smbolos.
Conviene observar que los fragmentos del cdigo PHP se pueden incluir dentro del cdigo
HTML en cualquier posicin. Pero no se pueden anidar, es decir, dentro de un trozo de PHP
no se puede incluir otro fragmento PHP. En el ejemplo anterior se ve que hemos incluido dos
trozos PHP independientes en dos posiciones diferentes del cdigo envolvente HTML.
Hay otra filosofa en la organizacin y distribucin de los fragmentos de cdigo HTML y PHP.
Consiste en insertar el cdigo HTML dentro del cdigo PHP. En este caso los separadores
de PHP incluyen en su interior cdigo HTML. Pero el resultado es el mismo.
As estara organizado el cdigo del ejemplo anterior siguiendo esta filosofa:

<? // Aqu se inicia el cdigo PHP.

echo "<HTML>
<HEAD>
<TITLE>
Curso PHP 5 - Unidad 1 - Ejemplo 2
</TITLE>
</HEAD>
<BODY>

<P>Ests usando el navegador
<B>";

$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);

echo "</B>.</P>
</BODY>
</HTML>";
?><! Aqu se cierra el cdigo PHP.>
Si se prefiere ver la pgina que genera este sencillo programa con esta nueva filosofa,
desde el Programa gestor del curso puede abrirse el Ejemplo 2 de la Unidad 1 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.


5 - Editor del cdigo fuente
Ya hemos dicho que necesitamos utilizar un editor de texto ASCII o de texto plano para
escribir el cdigo fuente de un programa PHP. Como el Bloc de notas de Windows es
demasiado elemental, dentro de la carpeta editorPHP de C:\cursoPHP5\bin hemos incluido
un procesador de textos ASCII para PHP, denominado dev-PHP (en el fichero devphp.exe).
En cuanto el alumno lo use, ver que dispone de todas las opciones propias de un editor de
texto eficaz y rpido, a la vez que sencillo, por lo cual su eficiencia es suficiente para escribir
con facilidad los ejercicios y actividades del curso.
Una ventaja de este editor consiste en que se numeran las lneas y se utiliza colores
diferentes para resaltar diferentes partes del cdigo, con las siguientes especificaciones:
Color verde oscuro:
Color verde: cadenas.
Color azul claro : nmeros.
Color azul: identificadores de PHP.
Color rojo: variables.
Color gris: comentarios.
Color negro: palabras reservadas del lenguaje PHP.
Este editor gratuito es muy utilizado por los programadores profesionales de PHP y presenta
muchas otras opciones de mucha utilidad y sencillez. Una vez que el usuario se acostumbre
a este editor, puede resultarle familiar y suficiente para escribir el cdigo fuente. No
obstante, si el alumno dispone de otro procesador de texto plano ms eficiente y que utiliza
con mayor facilidad por estar habituado a l, como UltraEdit 32, puede servirse del mismo
sin ningn problema.
Con el editor de texto escribimos el cdigo fuente del programa PHP y lo guardamos con un
nombre y la extensin php, para que el servidor Apache pueda identificar el fichero que
contiene el programa escrito en PHP y lo remita al intrprete PHP.
El nombre del fichero debe ser claro, correcto y significar algo, lo suficientemente extenso
para que sepamos qu se hace en el programa, pero no demasiado largo. Para evitar
problemas, es preciso que en el nombre del fichero no se incluyan espacios en blanco ni se
ponga tildes sobre ninguna de sus vocales, aunque gramaticalmente le corresponda. Por
ejemplo, el nombre obtener_informacion_PHP.php sera adecuado, pero no est permitido el
nombre obtener informacin PHP.php.
Dnde debemos archivar el fichero para que el intrprete PHP pueda ejecutar el cdigo
PHP y devolver el resultado a nuestro navegador? Es imprescindible que lo guardemos en el
servidor Apache. En concreto hay que archivarlo en nuestra carpeta personal, dentro de la
carpeta Alumnos, que est en C:\cursoPHP5\curso.
Por lo tanto, si el alumno est trabajando en el Aula Mentor, antes de escribir su primer
programa debe saber el nombre de su carpeta de trabajo. La crea el Administrador y su
nombre puede coincidir con al login de acceso al correo electrnico.
Por ejemplo, si el alumno se llama Jos Garca Prez y tiene la direccin de correo
jgap001@olivo.pntic.mec.es, el camino o ruta puede ser:
C:\cursoPHP5\curso\alumnos\jgap001.
Si el alumno est siguiendo el curso en su domicilio o en otro lugar, puede crear l mismo la
carpeta, teniendo en cuenta que ha de hacerlo debajo de la carpeta Alumnos del servidor
Apache que se instala y configura automticamente al instalarse el curso de PHP en
C:\cursoPHP5\curso.
Hay que respetar siempre los ficheros que haya en las carpetas de otros alumnos o alumnas
que estn realizando el curso en el mismo ordenador a diferente hora. Igualmente, hay que
respetar todas las carpetas propias del curso y en las que estn archivados los materiales,
servidor Apache, gestor de datos MySQL, etctera.


6 - Procedimiento para ejecutar un programa PHP
Una vez que hemos creado ya un programa en lenguaje PHP y lo hemos guardado en
nuestra carpeta con la extensin php, cmo podemos comprobar que funciona y ver la
pgina web que genera?
Para poder usar el servidor Apache, en primer lugar es necesario tenerlo funcionando. El
servidor no se ejecuta de forma automtica al arrancar el ordenador. Debemos arrancarlo
cada vez que iniciemos una sesin de trabajo y cerrarlo al acabar, para que no ocupe
memoria restando recursos al ordenador innecesariamente.
Si el curso se instala en Windows 98/Me, en la carpeta Curso de PHP 5 del escritorio
aparece el icono Servidor Apache 2 - Arrancar. Con doble click lo arrancamos. Se abrir
una ventana de comandos (MS-DOS) que no debemos cerrarla ya que esto indica que el
servidor Apache est activado. Cuando queramos parar el servidor basta con cerrar esta
ventana.
Si el curso se instala en Windows NT/2000/XP, en la carpeta Curso de PHP 5 del escritorio
aparece el icono Servidor Apache 2. Con doble click lo arrancamos. En la parte derecha de
la barra de herramientas del escritorio aparece un nuevo icono. Si hacemos doble clic sobre
el mismo, aparecer una Ventana emergente donde deberemos seleccionar Curso PHP -
Apache 2 y luego pulsar el botn "Arrancar". A continuacin se mostrar un mensaje en
esta ventana indicando que el servidor Apache est activado.
Si ponemos el cursor sobre este icono de la barra y hacemos clic sobre l, se ofrece un
men con varias opciones para gestionar el servidor, que nos permiten realizar, entre otras,
operaciones como cerrarlo (Parar), reiniciar el servidor (Reiniciar) y arrancar el servidor
de nuevo (Arrancar), etctera.
IMPORTANTE: si utilizas Windows Vista, para arrancar el "Servidor Apache 2" debes
pulsar el botn derecho del ratn sobre este icono y hacer clic en la opcin del men
"Ejecutar como Administrador". Lo mismo ocurre con el Servidor MySQL, hay que arrancarlo
de la misma manera.
Al acabar nuestra sesin de trabajo en el Aula o lugar donde estemos debemos parar el
servidor, para liberar la memoria del ordenador.
Una vez que se ha iniciado el servidor Apache, ejecutamos el navegador de Internet y en
la barra de direcciones introducimos "http://localhost/". As, accedemos a los contenidos
del curso y a travs del Programa gestor podemos proseguir nuestro trabajo.
Cuando el alumno est haciendo el curso y deba escribir un programa propio, segn se le
indique en las Actividades, debe apuntar el navegador a su carpeta de trabajo. Por ejemplo,
si su carpeta se denomina jgap001 y el fichero donde ha guardado el cdigo
primer_programa.php, creado con el procesador, para probar si funciona correctamente,
deber escribir en la direccin del navegador.
http://localhost/alumnos/jmap001/primer_programa.php.
Si el cdigo est bien escrito, en nuestro navegador aparecer la pgina web que hemos
diseado. Si no lo est, se mostrar el error encontrado y slo aparecer parte de la pgina
o nada. Para arreglar el problema, nos pasamos al editor, arreglamos el cdigo donde
proceda y guardamos otra vez el fichero. Cuando lo hayamos hecho, nos pasamos de nuevo
al navegador y con la tecla F5 (en Internet Explorer) o la combinacin de teclas Ctrl+R (en
Netscape) actualizamos la pgina. As, veremos el resultado con las modificaciones hechas
en el cdigo fuente.
Y de esta forma podemos ir escribiendo, probando, mejorando y arreglando el cdigo fuente
a medida que hacemos los ejercicios y actividades que se indiquen en las Actividades.

7 - Instrucciones o sentencias de PHP
Su formato
A lo largo del curso iremos estudiando la sintaxis de cada instruccin en concreto. En esta
primera unidad slo vamos a abordar dos aspectos generales sobre las sentencias que
conviene conocer desde el primer momento:
1. Una sentencia puede estar integrada por una asignacin, una llamada a una funcin o
una estructura de control de flujo, como una condicin o un bucle. Todas las sentencias
acaban necesariamente en punto y coma (;). Por ejemplo, es una sentencia o instruccin de
asignacin la siguiente:
$navegador = $_SERVER['HTTP_USER_AGENT'];
En ella se asigna a una variable ($navegador) el contenido de otra variable de entorno de
PHP que contiene informacin sobre la cabecera de la transaccin de informacin entre el
usuario y el servidor.
La sentencia echo($navegador); muestra en el navegador del usuario el valor asignado a la
variable $navegador.
La etiqueta de cierre (?>) tambin implica el fin de una sentencia, por lo que equivale al
punto y coma (;). Igualmente sera correcto escribir as las sentencias anteriores:
<?
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);
?>
2. Segn la forma de organizar las sentencias podemos distinguir entre sentencias simples
y sentencias compuestas. Las primeras contienen una sola instruccin que acaba en punto
y coma (;). Son sentencias simples las dos que aparecen en el apartado anterior.
Las sentencias compuestas estn integradas por varias instrucciones incluidas dentro del
par de signos {}. Las sentencias compuestas se utilizan principalmente en las estructuras de
control condicionales y de bucle, y tambin en el cuerpo de las funciones. Por ejemplo, es
una sentencia compuesta la siguiente:
$x=0;
while ($x<15)
{
$z=0;
while ($z<10)
{
$d=$x*$z;
echo "$x x &z = $d";
$z++;
}
$x++;
}
Observando este ejemplo podemos comprender que en realidad las sentencias compuestas
son sentencias simples que deben ejecutarse como bloque conjunto. Con los ejercicios
prcticos a lo largo del curso se irn utilizando sin problema unas y otras cuando convenga.
Nombre de los identificadores
En el lenguaje PHP todas las variables deben iniciarse con el signo dlar ($). Adems, el
intrprete distingue entre letras maysculas y minsculas, por lo cual $CAsa y $casa son
dos nombres de variable diferentes.
La persona que escribe el cdigo pone los nombre de los elementos que se utilizan en los
programas, como variables, tipos de datos, constantes, funciones, clases, etctera. Este
nombre se denomina identificador.
El nombre del identificador debe estar integrado por una sola palabra (no una frase con
espacios en su interior) y, como hemos dicho, si es una variable, debe iniciarse por el signo
$. Ningn identificador puede comenzar con un nmero, incluso aunque pongamos delante
el signo $. En el nombre de los identificadores pueden utilizarse el signo de subrayado, otras
letras y nmeros (excepto en la primera posicin). No se pueden usar determinados signos,
como los dos puntos (:), ni el punto y coma (;), ni las barras inclinadas / y \, ni los operadores
aritmticos (+, -, *, /, %), etcetera. Con la prctica se ir sabiendo qu nombres no acepta
PHP por ser incorrectos, pues se indica con un error al interpretar el cdigo. Por ejemplo,
son nombres de identificador vlidos $casa, $suma_todo y $forma_1_2_adaptador. En
cambio, no lo son function 10Casos, $unidad/B, $ma:ana, $jam\s y $suma-todo, $uno*dos,
$mio+tuyo.
Su longitud mxima significativa es de 63 caracteres. Aconsejamos emplear los que sean
necesarios para saber qu contiene cada identificador o la operacin que se realiza, pero
no es cmodo usar nombres demasiado largos.
Recomendamos que los nombres de estos identificadores tengan algn significado que nos
informe de su contenido o de las operaciones que se llevan a cabo dentro de los mismos.
Por ejemplo $suma_todo puede ser acertado como identificador de una variable que
contenga el valor resultante de sumar otras variables o como nombre de una funcin cuya
finalidad consista en llevar a cabo una suma de diversos valores.
PHP utiliza un conjunto de identificadores predefinidos que debemos respetar tambin.
Por ejemplo, son identificadores predefinidos los distintos tipos de datos, como Int, double,
string, array, o las palabras reservadas, como while, function, for, etctera.
En PHP no hay que declarar previamente el tipo de variable, sino que el hecho de asignar
un tipo de dato a una variable ya es suficiente para que esa variable sea del tipo de datos
que contienen. Adems, si a una misma variable primero se le asigna un tipo de datos, como
una cadena de caracteres, ser de ese tipo, pero si despus se le asigna otro tipo de datos
diferente, como un nmero entero, desde ese momento ser de este tipo. Esto facilita
mucho las cosas, pero exige tener un mayor control sobre los valores que va teniendo una
variable a lo largo de su vida dentro de un script.
Indentar las instrucciones
Aconsejamos que, desde el comienzo del curso, el alumno se acostumbre a indentar las
instrucciones que formen parte de una estructura dentro de la cual se insertan. Por ejemplo,
dentro de la estructura de control condicional if...else..., as como dentro de las estructuras
de bucle for o while conviene adentrar unos espacios las instrucciones. De esta forma, ser
ms fcil e intuitivo localizar un bloque de lneas al depurar o estudiar un script.
Aunque hay varias formas de indentar, en los ejercicios del curso hemos seleccionado la
forma ms comn. El alumno puede observar en los mismos cmo lo hemos hecho y
aprender a indentar l tambin sus scripts.
Comentarios al cdigo fuente
El lenguaje PHP permite incorporar comentarios dentro del propio cdigo fuente. Los
comentarios facilitan la comprensin posterior de un programa y aclaran las instrucciones
que lo exijan.
Si el texto del comentario no excede de una lnea, haya o no una instruccin a su izquierda,
lo mejor es usar el signo // (doble barra inclinada a la derecha). Por ejemplo, podemos
comentar as una instruccin:
<?
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);//Muestra contenido de $navegador.
?>
Si el comentario es ms largo y ocupa varias lneas, hay que incluir su texto entre la
combinacin de signos /*...*/.
<?
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);
/* En estas dos instrucciones se asigna a la variable $navegador
la cabecera de la comunicacin y se muestra en la pantalla. */
?>
El alumno debe poner comentarios en los scripts que elabore, tanto para acostumbrarse a
hacerlo, como para aclarar las instrucciones que lo precisen.

8 - Los operadores y su jerarqua
Operadores ms comunes
Como ya desde el comienzo vamos a utilizar constantemente los operadores al escribir el
cdigo fuente, a continuacin aparecen los ms comunes, para que pueda consultarlos el
alumno cuando lo necesite. Slo explicamos con detalle los operadores o aspectos que
suponen alguna novedad en PHP respecto a otros lenguajes. Suponemos, pues, que los
alumnos y alumnas han utilizado ya los operadores y, por tanto, saben manejarlos con
suficiente fluidez.
Aritmticos
Operador Operacin
+
Adicin
Suma los dos nmeros entre los que est.
Ejemplo: $num = 4+3; a $num se le asigna el valor 7.
-
Substraccin
Resta del nmero anterior el valor del posterior.
Ejemplo: $num = 4-3; a $num se le asigna el valor 1.
*
Multiplicacin
Multiplica los dos nmeros entre los que est.
Ejemplo: $num = 4*3; a $num se le asigna el valor 12.
/
Divisin
Halla el cociente del primer nmero entre el segundo.
Ejemplo: $num = 12/3; a $num se le asigna el valor 4.
%
Mdulo
Halla el resto de la divisin del primer nmero entre el
segundo.
Ejemplo: $num = 5%3; a $num se le asigna el valor 2.
Asignacin
Operador Operacin
=
Asignacin
simple
Asigna a la variable de su izquierda el valor que haya o resulte de
la operacin que aparece a la derecha.
Ejemplo: $texto = casa; a $texto se le asigna la cadena casa.
Ojo! No confundirlo con el operador de comparacin == (igual que).
Op=
Asignacin
combinada
Igual que el anterior ejecutando el operador que haya a la
izquierda del signo = sobre el valor o cadena que haya a su derecha
y asignndolo a la variable de la izquierda.
Ejemplos: $num += 4; al valor de $num se suman 4.
$texto .= adems; a la cadena de $texto se concatena la cadena
adems.
Es conveniente saber que PHP 5 soporta dos tipos de asignaciones:
1. Por valor. Esta asignacin realiza una nueva copia de la variable original, es decir, el
valor de una variable se pasa a otra haciendo una copia del valor de la primera. Por ejemplo,
si a la variable $a le asignamos el valor 5 ($a=5;) y a la variable $b le pasamos el valor de
$a ($b=$a;), en esta ltima tendremos una copia de la primera, sin que el valor de $b se vea
despus afectado por los cambios de $a. Es el tipo de asignacin usado ms
frecuentemente en los programas.
2. Por referencia. En este tipo de asignacin, menos utilizado, ambas variables acabarn
apuntando al mismo dato sin que el valor de una se copie a otra. A modo de ejemplo,
asignamos a la variable $a el valor 4 y a la variable $b el contenido de la variable $a. Es
decir, el valor de la variable $a lo pasamos a la variable $b de forma directa as: $b=$a;,
haciendo una copia de $a en $b. Pero podemos hacerlo por referencia de esta forma:
$b=&$a;. Aqu apuntamos la variable $b a la direccin de memoria de la variable $a; es
decir, las dos variables almacenan su contenido en el mismo espacio fsico en la memoria y
por lo tanto, el valor de $a y $b es siempre idntico (cualquier cambio en el valor de $a
implica el mismo cambio en $b y viceversa).
A continuacin, mostramos un ejemplo,
<?
// La variable $a toma el valor 4
$a = 4;
/* La variable $b toma el contenido de la
cadena $a ($b contiene el valor 4)*/
$b = $a;
/* La cadena $b apunta al mismo contenido que
$a (la misma direccin de memoria para ambas
variables)*/
$b = &$a;
// Ambas variables $a y $b contienen el valor
10.
$a=10;
?>
Es importante observar la sintaxis, en la que interviene el signo &. Adems, hay que tener
en cuenta que slo las variables con nombre pueden ser asignadas por referencia, no las
expresiones anteponindoles el signo &.
En la Unidad 3, en el apartado Funciones creadas por el usuario veremos tambin la
utilizacin de la asignacin por referencia en los parmetros de las funciones.

Comparacin
Operador Operacin
==
Devuelve True si los dos valores que separa son iguales y False si
no lo son.
Ejemplo: (4==3); devuelve False.
<
Devuelve True si el valor que est a la izquierda es menor que el de
la derecha y False si no lo es.
Ejemplo: (4<5); devuelve True.
<=
Devuelve True si el valor que est a la izquierda es menor o igual
que el de la derecha y False si no lo es.
Ejemplo: (5<=5); devuelve True.
>
Devuelve True si el valor que est a la izquierda es mayor que el de
la derecha y False si no lo es.
Ejemplo: (4>5); devuelve False.
>=
Devuelve True si el valor que est a la izquierda es mayor o igual
que el de la derecha y False si no lo es.
Ejemplo: (5>=4); devuelve True.
!=
Devuelve True si los dos valores que separa son diferentes y False
si no lo son.
Ejemplo: (5!=4); devuelve True.
===
Devuelve True si los dos valores que separa son idnticos en
contenido y tipo y False si no lo son.
Ejemplo: (5===5); devuelve True.
Al utilizar los operadores de comparacin, hay que tener en cuenta lo siguiente:
1. Pueden compararse entre s casi todos los datos, aunque sean de diferente tipo, pero si
queremos estar seguros del resultado, lo mejor es comparar datos del mismo tipo.
2. De la expresin construida con estos operadores siempre se deduce un resultado lgico:
True (Verdadero ) o False (Falso).
3. Cuando los datos comparados son del mismo tipo, la comparacin se lleva a cabo de la
forma siguiente:
Si los datos son de tipo numrico, se compara su magnitud. Por ejemplo, en la
expresin 5 == 7, se comparan los valores 5 y 7, y se obtiene el resultado False.
Si los datos son de tipo cadena, la comparacin se basa en el valor decimal que
tenga cada carcter de la cadena segn el cdigo ASCII. Si utilizamos el operador ==,
la comparacin se lleva a cabo de izquierda a derecha y de carcter en carcter hasta
que se encuentra alguna diferencia o hasta que se acaban las posiciones de las
cadenas.
Por ejemplo, en la expresin "Delfos" == "Delos" se inicia la comparacin por la letra "D"
de ambas cadenas. Al advertir que los dos caracteres tienen el mismo valor Decimal ASCII
(69), se compara el siguiente carcter, que tambin es igual, etctera. Si antes de comparar
todos los caracteres de las cadenas, se encuentra alguna diferencia, como en este caso en
la cuarta letra (f frente a o), se concluye que son desiguales y, por tanto, se obtiene el
resultado False.
El operador === (exactamente igual) debe usarse cuando se quiere saber si un valor es
igual a otro, tanto en su contenido completo como en su tipo. Por ejemplo, la expresin
(+010 == 10.0) devuelve True. En cambio, la expresin (+010 === 10.0) devuelve
False.
Si los datos son de tipo fecha, la comparacin se basa en el valor cronolgico. Por ejemplo,
la fecha 12/12/97 es anterior cronolgicamente a la fecha 12/01/98.
Si los datos son de tipo lgico, el valor Falso (False) es igual al valor Falso (False) y el
Verdadero (True) es igual a Verdadero (True). Por ejemplo, True == True obtiene
Verdadero; en cambio, de la expresin compleja (5 > 10) == (6 < 12) se deduce un valor
Falso, pues la primera expresin (cinco es mayor que diez) es Falsa (False); sin embargo, la
segunda expresin (seis es menor que doce) es Verdadera (True). Por tanto, la expresin
False == True devuelve un valor Falso.
Condicional
Operador Operacin
?:
Ternario
Si la expresin que est a la izquierda del operador devuelve True,
asigna a la variable el valor de la primera expresin que queda a su
derecha; de lo contrario, le asigna el valor de la segunda expresin.
Ejemplos:$a = (8>7) ? (6*8) : (4+7);a $a se
le asigna el valor 48.
$a = (8<7) ? (6*8) : (4+7);a $a se le asigna el valor 11.
Ejecucin
Operador Operacin
`orden`
Ejecucin
PHP soporta un operador de ejecucin: el apstrofe invertido (``). No
son apstrofes normales. PHP intentar ejecutar la instruccin
contenida dentro de los apstrofes invertidos como si fuera un
comando del Shell; su salida es devuelta como el valor de esta
expresin. Tambin puede asignarse a una variable.
Ejemplos: $salida = `ls -al`;
a la variable $salida se le asigna el resultado de la orden ls al.
Cadena
Operador Operacin
.
Concatenacin
Devuelve el resultado de unir el contenido de las dos cadenas que
hay a su izquierda y a su derecha.
Ejemplos:$a=casa; $b= grande;
$c=$a.$b; a $c se le asigna casa grande.
Puede combinarse con el operador de asignacin =as:
$a .= baja; a la variable $a se le asigna la cadena casa baja.
Incremento / decremento
Operador Operacin
++$var
Preincremento
Incrementa $var en uno y despus devuelve el su valor.
Ejemplo:<? $a=4; echo ++$a; ?>. En la pgina web aparecer 5.
--$var
Predecremento
Decrementa $var en uno y despus devuelve su valor.
Ejemplo:<? $a=4; echo --$a; ?>. En la pgina web aparecer 3.
$var++
Posincremento
Devuelve el valor de $var y despus lo incrementa en uno.
Ejemplo:<? $a=4; echo $a++; echo $a; ?>. En la pgina web
aparecer primero 4 y luego 5.
$var--
Posdecremento
Devuelve el valor de $var y despus lo decrementa en uno.
Ejemplo:<? $a=4; echo $a--; echo $a; ?>. En la pgina web
aparecer primero 4 y luego 3.
Lgicos
Los operadores lgicos reciben este nombre porque nos permiten obtener resultados
lgicos o booleanos. Los valores lgicos son aquellos que slo pueden contener uno de
estos dos valores: Verdadero (True en ingls) o Falso (False en ingls). Este tipo de datos
se usa principalmente para establecer condiciones que nos permitan ejecutar unas
operaciones u otras dentro de las sentencias de bifurcacin condicional y para controlar los
bucles. Por este motivo los operadores lgicos son muy importantes en la programacin y se
emplean constantemente.
Son los siguientes:
Operador Operacin
!
No
Niega el valor lgico de una expresin.
Ejemplos:
Si $casado == True; luego !$casado ser igual a False.
And o &&
Y
Devuelve True si las dos expresiones que une son verdaderas (True) y
False si al menos una es falsa.
Ejemplos: La expresin (3<5 && 10<15) devuelve True. En cambio, la
expresin (3<1 && 10<15) devuelve False.
OR o ||
O
Devuelve True si al menos una de las dos expresiones que une es
verdaderas (True) y False si las dos son falsas.
Ejemplos: La expresin (3<5 or 10<8) devuelve True. En cambio, la
expresin
(3<1 || 10<8) devuelve False.
XOR
Y no
Devuelve True si slo una de las dos expresiones que une es verdadera
(True) y False si las dos son falsas(False) o las dos son verdaderas
(True).
Ejemplos: La expresin (3<5 xor 10<8) devuelve True. En cambio, la
expresin
3(3<1 xor 10<8) devuelve False.
Bit a bit
Permiten activar o desactivar los bits individualmente de un nmero entero. Estos
operadores slo se usan para operaciones muy especficas. No vamos a utilizarlos en este
curso, por lo cual no los explicamos.
Reglas de precedencia entre los operadores
Cuando en una instruccin aparecen expresiones complejas en las que interviene varios
operadores de diferentes tipos, es preciso conocer bien el orden en que el ordenador ejecuta
esos operadores. Este orden o jerarqua se denomina precedencia. Por ejemplo, la
expresin $a = (10+6/2) asigna a la variable $a el valor 13 en lugar de 8, pues el operador /
se ejecuta antes que el operador +. As pues, en este orden (6+10)/2 se obtiene el resultado
citado.
Cmo podemos alterar esta jerarqua en las operaciones? Para hacer que los operadores
se ejecuten en un orden distinto del establecido, debemos utilizar los parntesis. Por
ejemplo, si necesitamos sumar 6 y 2, y dividir el resultado entre 2, no podemos escribir la
expresin 6 + 2 / 2, pues resultara 7 segn las reglas de precedencia establecidas; en
cambio, si escribimos (6 + 2) / 2, primero se ejecuta la operacin que est entre parntesis y
despus, la operacin de dividir obtenindose 4 como resultado.
A continuacin, se refleja el orden en que el ordenador ejecuta las operaciones. En la tabla
siguiente se indican de arriba (inferior) abajo (superior) y de izquierda (superior) a derecha
(inferior) esta jerarqua.
Orden de ejecucin de los operadores
or
xor
and
= += - = *= /= %=
?:
||
&&
== != ===
< <= > >=
+ - .
* / %
(a la derecha) ! ++ -- Operadores de modelado
(int)(boolean)(double)(string)(array)(object)

9 - Mostrar informacin en la pgina web
En los ejemplos anteriores ya hemos usado alguna orden que permite mostrar informacin.
Como sta es una operacin bastante frecuente y sencilla, vamos a comentar ahora las
diferentes formas que tenemos para hacer que en la pgina del usuario se muestre
informacin con un determinado formato.
En esta operacin hay que distinguir dos aspectos:
1. El contenido de la informacin que debe mostrarse. Hay que escribirla entre comillas
detrs de la orden o asignarla a una variable y, luego, poner esta variable como argumento
de la orden correspondiente.
2. El formateo de esa informacin en la pgina HTML del cliente. Para que el cliente que
hace una solicitud al servidor vea el contenido de la informacin ordenado y maquetado, es
preciso incorporar en el cdigo fuente los controles necesarios.
Se puede mostrar informacin con las rdenes siguientes:
1. echo
Ya hemos visto varios ejemplos de este comando. Tiene esta sintaxis:
echo argumento, donde la informacin que se muestra (argumento) puede ser una cadena
de caracteres entre comillas o una variable. Tambin puede usarse la sintaxis
echo (argumento1, argumento2,...)
Si el argumento es una cadena entre comillas dobles, debemos tener en cuenta que las
variables incluidas en ese texto se expanden, es decir, muestran su contenido, no su
nombre. Sin embargo, las funciones no se expanden. Cmo podemos conseguir que las
variables no se expandan y las funciones s lo hagan? Veamos el ejemplo siguiente donde
mostramos en letras maysculas el contenido de una variable:
$x = "el amor es libre";
echo "La variable $x contiene el texto strtoupper($x) en
letras maysculas.";
Ejecutando estas dos instrucciones aparece en la pantalla:
La variable el amor es libre contiene el texto strtoupper($x) en letras maysculas.
Observamos que, aunque est dentro de una cadena, la variable $x se ha expandido, es
decir, ha mostrado su texto; en cambio, la funcin strtoupper (string to upper, convertir el
texto de la cadena en letras maysculas) no se ha expandido.
Pero nosotros queremos que en la pgina web aparezca:
La variable $x contiene el texto EL AMOR ES LIBRE en letras maysculas.
Para conseguirlo, hay que utilizar esta otra sintaxis:
$x = el amor es libre;
echo La variable \$x contiene el texto.strtoupper($x). en letras maysculas.;
Si nos fijamos en esta ltima sintaxis, podemos observar que hemos utilizado la barra hacia
la izquierda (\) delante de la variable, para que no expanda su contenido. Adems, hemos
sacado la funcin de las comillas y la hemos concatenado con el texto anterior y posterior
usando el operador de concatenacin (.).
2. print
Esta orden es prcticamente igual que echo, hasta el punto de que se pueden intercambiar
sin problemas.
Veamos un ejemplo en que se usa la orden print en lugar de echo.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 1 - Ejemplo 3</TITLE></HEAD>
<BODY>

<? // Aqu se inicia el cdigo PHP.

print "<H1><CENTER>Uso de la orden print. Funciona como echo.</H1>
</CENTER><H2>";
/* Mostramos el texto anterior con un tamao de letra grande
y centrado.*/
$pares=0;

/* Abrimos un bucle para repetir la operacin 20 veces.
En la Unidad 2 se estudia esta estructura de control.*/
for (;$pares<40;)
{
print " -- $pares "; // Observa que la variable se expande.
if ($pares==40) // Si la variable $pares vale 40...
break; // Salimos del bucle.
$pares+=2; // Sumamos 2 al valor actual de la variable.
}

print "</H2><P><H3>&nbsp;&nbsp;&nbsp;&nbsp; Relacin de los 20
primeros nmeros pares.</H3>";
/* Mostramos el texto anterior con un tamao de letra pequeo.
Como HTML slo respeta un espacio en blanco, con el comando
&nbsp; hacemos que la frase deje 5 espacios a la izquierda. */

/* Aqu acaba el cdigo PHP. No podemos poner este comentario a
continuacin del signo ?>, pues estara fuera del cdigo PHP.*/
?>

</BODY>
</HTML>

Desde el Programa gestor del curso puede abrirse el Ejemplo 3 de la Unidad 1 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado del programa anterior, en el que
hemos utilizado la orden print.
3. printf
Es una funcin que permite mostrar informacin formateada segn los valores que
aparezcan en una cadena de formato integrada por caracteres fijos y por una directiva %.
Su sintaxis es:
printf ("cadena de formato", argumento1, argumento2,...)
En los argumentos se incluye la informacin que se quiere mostrar, como con echo o con
print. En la cadena de formato, entre comillas, puede ponerse un texto, que aparece tal cual
lo escribamos, con expansin de las variables si no usamos el signo \, y el valor de una
variable segn se establezca en la directiva %.
Veamos en un ejemplo sencillo cmo se comporta esta funcin. Con el procesador de texto
ASCII escribimos el cdigo fuente siguiente en PHP:
<HTML>
<HEAD></HEAD>
<BODY>
<?
$i=15;
printf ("Valor de la variable \$i=%d \n", $i);
echo "<P>Nueva lnea ";
?>
</BODY>
</HTML>
Si ejecutamos este cdigo, en la pantalla aparece la pgina web siguiente:

Si editamos el cdigo HTML que ha recibido el usuario, vemos cmo es:

En este sencillo ejemplo podemos apreciar varias cosas que debemos conocer. Son las
siguientes:
A. El segundo argumento de la funcin printf(), que es $i, aparece con la informacin que
tiene esta variable.
B. El primer argumento determina el formato de salida de esa informacin y est integrado
por un texto literal (Valor de la variable \$i=), que se muestra tal como lo hemos escrito, por
una directiva (%d), que establece que el valor de $i ha de aparecer como nmero decimal
(en base 10) entero. Y as lo hace.
En este ejemplo hay que observar tambin varias cosas que debemos tener en cuenta:
1. Conviene recordar que en el texto literal hemos tenido que utilizar el signo \ delante de $i
para que la variable no se expandiera. No confundirlo con el comando \n que sirve para que
se produzca un salto de lnea.
2. La directiva %d lleva detrs el comando del cdigo PHP \n. Puede llevar tambin otro
literal. El comando \n sirve para que, una vez mostrado el resultado de la variable $i, se
produzca un salto de lnea dentro del cdigo HTML, como ya hemos dicho.
3. En el cdigo fuente PHP hemos dejado hasta cinco espacios en blanco despus del
primer literal y antes de la directiva, pero en la pgina web slo aparece uno. Hay que tener
en cuenta que HTML slo muestra un espacio, no todos los que haya repetidos en el cdigo.
Para que HTML muestre ms de un espacio en blanco, debemos incluir en el cdigo el
comando tantas veces como espacios en blanco deban mostrarse. Por ejemplo, la
instruccin
printf("Valor de la variable \$i=%d\n", $i);
s muestra los espacios en blanco as: Valor de la variable $i=15.
Dentro de la cadena de formato nos interesa ver cmo se configura una directiva y qu
significa cada uno de los caracteres que la integran.
Toda directiva debe iniciarse por un signo %. Si se quiere anular el efecto de % de forma
que la directiva se vea como un literal, hay que poner delante otro signo %. Por ejemplo, la
orden
printf("Valor de la variable \$i= %%d \n", $i);
muestra el texto Valor de la variable $i= %d sin el valor de $i ya que no hemos precisado su
formato.
As pues, si queremos que en la pgina web aparezca la frase
La variable $i con la directiva %d aparece como 15
debemos escribir la funcin de esta forma:
printf("La variable \$i con la directiva %%d aparece como %d \n", $i);
La directiva % puede estar integrada hasta por cinco elementos:
Un carcter de relleno, para que ocupe las posiciones vacas cuando lo que ha de
mostrarse no completa todas. Si no se pone, se supone que las posiciones vacas
han de ser espacios en blanco. En el caso de nmeros, puede indicarse que se
rellenen con ceros o con otro carcter (escribir entre comillas simples) como primer
integrante de la directiva. Es decir, indica el nmero total de caracteres de la cadena
impresa.
El carcter opcional -, para alinear un nmero por la izquierda.
El nmero mnimo de posiciones que ha de ocupar la salida. Si su contenido no
ocupa tantas posiciones, los espacios vacos se completan con el carcter que se
haya indicado en el componente primero. Por ejemplo, la instruccin
printf("La variable \$i con la directiva %%05d aparece como %05d \n", $i);
muestra en la pgina el texto
La variable $i con la directiva %05d aparece como 00015
donde el 0 primero indica el carcter de relleno, el 5 es el nmero de posiciones que debe
ocupar la salida y la d, como veremos, indica que ha de mostrarse en formato decimal (base
10). Notamos que hemos escrito "\n" para enviar un salto de lnea en el cdigo que se
enva al navegador.
Cuando la salida es un nmero, este guarismo slo se refiere a la parte entera, no a la
decimal, cuya longitud de salida se fija con el elemento siguiente, separando ambos
elementos por un punto.
El nmero de decimales que deben mostrarse cuando los haya, es decir, cuando
trabajemos con nmeros de coma flotante. Este nmero debe ir separado del nmero
entero anterior por un punto ( .).
Por ejemplo, si la varible $i vale 11.3456, la instruccin
printf("La variable \$i con la directiva %%011.5f aparece como %011.5f \n", $i);
muestra en la pgina el texto
La variable $i con la directiva %011.5f aparece como 00011.34560
Fjate que hemos escrito %011.5f para que el nmero total de caracteres sea 11 incluyendo
el punto decimal y 5 caracteres en la parte decimal.
Especificacin del tipo de salida. Este ltimo es el ms importante, hasta el punto de
que la mayora de las veces es el nico que sigue al signo de directiva %.
Puede ser una sola de las letras que aparecen en la tabla siguiente:
Letra Formato de salida. La variable $i contiene 15.
b
La salida numrica aparece en formato binario (base 2).
Orden: printf("\$i con %%b aparece como %b", $i);
Muestra: $i con %b aparece como 1111
C
La salida completa aparece como un carcter que se indica
detrs de la C.
Orden: printf("\$i con %%CZ aparece como %CZ", $i);
Muestra: $i con %CZ aparece como Z
d
La salida numrica aparece en formato decimal (base 10).
Orden: printf("\$i con %%d aparece como %d", $i);
Muestra: $i con %b aparece como 15
f
La salida numrica aparece en formato de coma flotante.
Orden: printf("\$i con %%f aparece como %f", $i);
Muestra: $i con %b aparece como 15.000000
o
La salida numrica aparece en formato octal (base 8).
Orden: printf("\$i con %%o aparece como %o", $i);
Muestra: $i con %b aparece como 17
S
La salida, aunque sea numrica, aparece como una cadena.
Orden: printf("\$i con %%s aparece como %s cadena con
nmeros", $i);
Muestra: $i con %s aparece como 15 cadena con nmeros
X
La salida numrica aparece en formato hexadecimal (base
16) con las letras en minscula.
Orden: printf("\$i con %%04x aparece como %04x", $i);
Muestra: $i con %04x aparece como 000f
X
La salida numrica aparece en formato hexadecimal (base
16) con las letras en mayscula.
Orden: printf("\$i con %%04X aparece como %04X", $i);
Muestra: $i con %04x aparece como 000F
En el ejemplo siguiente se muestra cmo usar la orden printf().
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 1 - Ejemplo 4</TITLE></HEAD>
<BODY>

<CENTER>
<H3>TABLA DE LOS 20 PRIMEROS NMEROS EN DIFERENTES
BASES</H3>
<TABLE BORDER=2>
<TH> &nbsp;&nbsp;Decimal&nbsp;&nbsp;</TH>
<TH> &nbsp;&nbsp;Binario&nbsp;&nbsp;&nbsp;</TH>
<TH> &nbsp;&nbsp;Octal&nbsp;&nbsp;&nbsp;</TH>
<TH> &nbsp;&nbsp;Hexadecimal&nbsp;&nbsp;</TH>

<? // Aqu se inicia el cdigo PHP.

echo "<BR>"; // Salto de lnea para dejar un espacio entre
// el ttulo y la tabla.

/* Abrimos un bucle para repetir la operacin 20 veces.
En la Unidad 2 se estudia esta estructura de control.*/
for ($a=0;$a<21;$a++)
{
echo "<TR>"; // Nueva fila de tabla.
printf("<TD>&nbsp;%02d</TD><TD>&nbsp;%06b</TD>
<TD>&nbsp;%02o</TD><TD>&nbsp;%02X</TD>"
,$a,$a,$a,$a);
/* Observa que en la cadena de formato, entre parntesis,
hemos incluido los cdigos HTML (<TD>&nbsp;...</TD>)
y la directiva (%02d, %06b, %02o y %02X) de cada una
de las formas de presentar el valor de la varible $a. */

print "</TR>";
}

/* Aqu acaba el cdigo PHP. No podemos poner este comentario a
continuacin del signo ?>, pues estara fuera del cdigo PHP.*/
?>

</TABLE>
</CENTER>
</BODY>
</HTML>
Desde el Programa gestor del curso puede abrirse el Ejemplo 4 de la Unidad 1 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado del ejercicio anterior, donde se
trabaja con esta orden utilizando diferentes plantillas en la cadena de formato.
4. sprintf
Esta funcin nos permite dar formato a una cadena de texto exactamente igual que con
printf, y guardar, adems el resultado en una variable, para utilizarlo posteriormente.
Su sintaxis es la siguiente:
%cadena=sprintf(cadena de formato, argumento 1, argumento 2,...)
Siguiendo el ltimo ejemplo de la tabla anterior, podamos escribir:
<HTML>
<HEAD></HEAD>
<BODY>
<?
$i=15;
$cadena=sprintf("\$i con %%04X aparece como %04X", $i);
echo $cadena;
echo "<P>Nueva lnea";
?>
</BODY>
</HTML>
El resultado es la pgina web siguiente:

Aunque la cadena de formato parezca inicialmente algo complicada, con la prctica el
alumno se acostumbrar a usarla sin dificultad.
5. print_r
Muestra el contenido y la informacin de una variable de manera ms sencilla
simplificando su lectura en el navegador. En el caso de una variable de tipo string,
integer o float, la informacin imprimida por pantalla ser el valor contenido en la
variable. En el caso de una matriz, los valores sern presentados en un formato
que muestra las claves y los elementos de la misma.
Su sintaxis es la siguiente:
print_r(variable, [, bool devolver])
El parmetro devolver es optativo y si escribimos el valor true, print_r() devolver
su salida en lugar de imprimirla en el navegador (cosa que hace por defecto).
Para ver cmo funciona podemos escribir:
<HTML>
<HEAD></HEAD>
<BODY>
<?
$matriz = array ('a' => 'casa',
'b' => 'calle mayor',
'c' => array ('primero', 'segundo','tercero'));
echo "<PRE>";
print_r ($matriz);
echo "</PRE>";
?>
</BODY>
</HTML>
El resultado es la pgina web siguiente:

Observa que hemos usado las etiquetas <PRE> y </PRE> para que se muestren los espacios
e intros en HTML. En el apartado siguiente trataremos las matrices y se entender mejor
esta funcin que sirve de mucha utilidad cuando se necesita conocer lo que contiene una
matriz.

10 - Tipos de datos y expresiones

Tipos de datos
El lenguaje PHP, igual que la mayora, puede tratar los siguientes tipos de datos:
- Numrico entero. Slo contiene elementos aritmticos sin decimales. Con este tipo de
dato se pueden llevar a cabo operaciones aritmticas, como suma, resta, multiplicacin,
divisin, funcin exponencial, etc. Al escribirlos, no hay que incluirlos entre delimitadores,
como las comillas simples o dobles.
Segn la base que se utilice para representarlos, pueden tener diferentes representaciones:
$y = 1234; nmero decimal (base 10)
$y = -123; nmero negativo decimal (base 10)
$y = 0011; nmero binario(base 2: equivale al 3 decimal)
$y = 0123; nmero octal (base 8: equivale al 83 decimal)
$y = 00e1; nmero hexadecimal (base 16: equivale al 225
decimal)
$y = 0x12; nmero hexadecimal (base 16: equivale al 18
decimal. 0x significa que 12 est en formato
hexadecimal.)
- Numrico de punto flotante. Tambin se denominan nmeros reales y son datos
numricos con parte entera y parte decimal. Un punto separa ambas partes. PHP utiliza
nmeros reales double, es decir, que nos permiten escribir, incluido el punto decimal, hasta
16 dgitos.
En base decimal pueden tener dos sintaxis diferentes:
$y = 1.23456; nmero de punto flotante decimal (base 10)
$y = 1.2e3; nmero de punto flotante en forma exponencial
(base 10) equivalente a 1200. Es como si
multiplicamos 1,2 por 10 elevado a 3.
- Arrays. En el tratamiento de este tipo de datos PHP permite una gran flexibilidad. Por
ejemplo, admite en sus elementos datos de diferentes tipo, el ndice que identifica a cada
uno de sus elementos puede ser numrico, a partir de 0, o un texto, los arrays se crean con
slo asignarles un valor y se admiten arrays multidimensionales.
Por ejemplo, podemos crear una matriz (array), sin necesidad de haberla declarado antes,
de la forma siguiente:
$persona["nombre"]="Josefa";
$persona["apellido1"]="Prez";
$persona["apellido2"]="Rubio";
$persona["edad"]=60;
Podamos haberla creado as:
$persona=array("nombre"=> "Josefa",
"apellido1"=> "Prez",
"apellido2"=> "Rubio",
"edad"=>60);
Supongamos que queremos crear una matriz bidimensional con las calificaciones obtenidas
por una alumna en las tres evaluaciones de Matemticas, Lengua y Dibujo. Como podemos
usar ndices alfanumricos, podemos hacerlo as:
$notas["Mat"]["Pri"] = "Suficiente";
$notas["Mat"]["Seg"] = "Bien";
$notas["Mat"]["Ter"] = "Notable";
$notas["Len"]["Pri"] = "Sobresaliente";
$notas["Len"]["Seg"] = "Sobresaliente";
$notas["Len"]["Ter"] = "Notable";
$notas["Dib"]["Pri"] = "Notable";
$notas["Dib"]["Seg"] = "Bien";
$notas["Dib"]["Ter"] = "Suficiente";
Con la misma filosofa de ndices, podamos haberlo hecho as:
$notas = array("Mat"=>array("Pri"=>"Suficiente",
"Seg"=>"Bien",
"Ter"=>"Notable"),
"Len"=>array("Pri"=>"Sobresaliente",
"Seg"=>" Sobresaliente",
"Ter"=>"Notable"),
"Dib"=>array("Pri"=>"Notable",
"Seg"=>"Bien",
"Ter"=>"Suficiente"));
Igualmente, podamos haber puesto las calificaciones en nmero y usado ndices numricos
para las evaluaciones y las asignaturas, de 0 a 2 para ambas. En este caso la matriz $notas
habra quedado as:
$notas[0][0] = 5;
$notas[0][1] = 6;
$notas[0][2] = 7;
$notas[1][0] = 9;
$notas[1][1] = 9;
$notas[1][2] = 7;
$notas[2][0] = 7;
$notas[2][1] = 6;
$notas[2][2] = 5;
Es ms breve, si bien hay que saber a qu asignatura y evaluacin pertenece cada ndice.
En la otra sintaxis quedara as
$notas = array(0=>array(0=>5,1=>6,2=>7),
1=>array(0=>9,1=>9,2=>7),
2=>array(0=>7,1=>6,2=>5));
Aunque aqu la informacin dada es breve, en la Unidad 3 (Tratamiento de arrays) se
explican las matrices de manera ms clara y con varios ejemplos. Tmese, por lo tanto, este
texto sobre matrices como una introduccin simple.
- Cadena de caracteres . Contiene informacin alfanumrica y se denomina string o
cadena. Las cadenas de caracteres deben escribirse entre comillas dobles o simples.
Debemos tener en cuenta una cosa importante: si usamos comillas simples para enmarcar
una cadena, PHP no analiza el contenido de la cadena. Por lo tanto, no se expande el
contenido de las variables ni es necesario proteger el signo $ que las precede con el signo \.
Por ejemplo, si la variable $i contiene el valor 7 y escribimos la instruccin
echo 'La variable \$i vale $i';
en la pgina web se muestra el texto
La variable \$i vale $i
En cambio, si escribimos la cadena con comillas dobles, aparece:
La variable $i vale 7
Dentro de una cadena acotada por comillas dobles, si se necesita que aparezcan otras
comillas, hay que usar igualmente el signo \ para que PHP entienda estas comillas como
literales en lugar de como delimitadores de la cadena. Por ejemplo, la sentencia
echo "La variable \$i vale "$i";
no muestra nada, pues PHP encuentra tres delimitadores de cadena. En cambio, si
escribimos la instruccin
echo "La variable \$i vale \"$i";
aparece el texto con las comillas protegidas por la barra \, de esta forma:
La variable $i vale "7
En este caso, cuando dentro de una cadena no hay variables que deban expandirse, lo
mejor es poner comillas simples enmarcando la cadena y dentro las comillas dobles que
necesitemos.
- Objetos. PHP permite tratar tambin objetos propios de la Programacin Orientada a
Objetos (POO) a travs de un tipo de datos denominado clase (class). Los objetos son
componentes dotados de propiedades y eventos que pueden manipularse independiente
unos de otros y en diferentes entornos. Las clases de declaran de la forma siguiente:
class identificador_de_la_clase
{
public $nombre_de_las variables;
function nombre_de_la_funcion_de_la_clase($argumentos)
{Declaracin de la funcin }
}
La orden new permite crear un nuevo elemento de la clase declarada y el operador ->
permite acceder a cada componente de ese elemento.
Por ejemplo, supongamos que necesitamos crear una clase que contenga los siguientes
datos de nuestros contactos, a modo de agenda: nombre, apellidos, profesin, edad e
importe de sus servicios por mes. Podemos declarar as la clase:
class Contactos
{
public $nombre;
public $apellido;
public $profesion;
public $edad;
public $importe;
function completa($nom,$ape,$pro,$eda,$impor)
{
$this->nombre=$nom;
$this->apellido=$ape;
$this->profesion=$pro;
$this->edad=$eda;
$this->importe=$impor;
}
}
Ahora ya podemos crear la clase con la instruccin
$contac = new Contactos;
Finalmente, podemos asignar valores a cada nuevo contacto con la orden
$contac->completa("Mara","Prez Mas","mdico",35,"350.000");
Para poder verlo en la pantalla damos la orden siguiente:
echo "$contac->nombre<P>";
echo "$contac->apellido<P>";
echo "$contac->profesion<P>";
echo "$contac->edad<P>";
echo "$contac->importe<P>";
Desde el Programa gestor del curso puede abrirse el Ejemplo 5 de la Unidad 1 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de este programa en el que hemos
creado y usado una clase.
En Internet se pueden buscar libreras de clases para hacer casi todo.
Aunque aqu la informacin dada es breve, en la Unidad 3 (La Programacin Orientada a
Objetos (PPO)) se expone la POO de manera ms clara y con varios ejemplos. Tmese, por
lo tanto, este texto sobre POO como una introduccin simple. Adems, es muy
recomendable echarle un buen vistazo al anexo sobre POO que puede encontrarse en la
mesa del curso.
Conversin de tipos
Ya hemos comentado que PHP es un lenguaje poco typeado, es decir, la compatibilidad
entre diferentes tipos es muy grande y no es preciso declarar y mantener posteriormente el
tipo de datos en ninguna variable. Por ejemplo, a la variable $i podemos asignarle en un
momento del programa una cadena de caracteres y en otro un nmero entero.
De esto se deduce que el tipo de variable depende del valor que se le asigne de hecho.
Pero podemos hacer que una variable sea de un determinado tipo independientemente del
tipo de dato que se le asigne? Por ejemplo, podemos necesitar que la variable $a contenga
el dgito 5 como un carcter, no como un nmero, de forma que esta variable sea de tipo
cadena, no de tipo entero.
Es posible hacer esto sin problemas en PHP. Para ello, basta poner detrs del operador de
asignacin = entre parntesis el tipo de dato que queremos contenga la variable. Por
ejemplo, la instruccin $todo = (3 * 10 / 4) asignara a $todo el valor 7,5 convirtindola en
un tipo de coma flotante. Pero podemos hacer que sea de tipo entero escribiendo $todo =
(int) (3 * 10 / 4). Tambin podemos hacerla de tipo cadena con la sintaxis $todo =
(string) (3 * 10 / 4).
Las palabras reservadas que debemos poner entre parntesis para indicar el tipo de variable
son: int, boolean, double, string, array y object.
Lgicamente, debemos saber discernir si la estructura de los datos que asignamos a una
variable es la apropiada al tipo de dato que queremos que contenga. En todo caso, el
intrprete PHP no da errores si no procedemos adecuadamente y le asigna el tipo
predefinido.
Para saber el tipo de dato que hay en una variable, podemos utilizar la funcin gettype(),
que nos devuelve el tipo de la variable que le pasemos como argumento. Por ejemplo, las
instrucciones
$todo= (int) (3 * 10 / 4);
echo gettype($todo);
muestran en la pgina el dato de tipo integer.
Adems, en la Unidad 3 (Tratar cadenas de caracteres) se mostrar la manera de convertir
una variable numrica en una cadena formateando el resultado.
Expresiones
Como en cualquier lenguaje de programacin, en PHP las expresiones son un elemento
bsico. Podemos definir una expresin como aquello que tiene o devuelve un valor.
Las expresiones bsicas estn integradas por constantes, variables y operadores. La
sentencia de asignacin $z = 9; es una expresin: 9 es un valor constante entero que se
asigna a la variable $z mediante el operador de asignacin =.
Las expresiones ms complejas estn integradas cuantitativamente por sentencias y
controles condicionales o de bucle en los que intervienen muchas variables y operadores de
diferente tipo. Por ejemplo, son expresiones ms complejas las siguientes:
$x=( !(Paro) or (Num > 30) ) and ( (Car = "flor") and Paro);
o
if ( !(Paro) or (Num > 30) ) and ( (Car = "flor") and Paro)
Algo ms complejas, al menos cualitativamente, son las expresiones en las que interviene
una funcin. Por ejemplo, $z=suma_datos($a,$b,$c);. A la variable $z se le asigna el valor
devuelto por la funcin suma_datos(), que debe estar declarada e implementada en otra
parte del programa o estar incluida en una librera.
A lo largo del curso, se usarn expresiones en las que intervendrn todos los tipos de datos
y todos los operadores. Con la prctica, el alumno aprender a construir, interpretar y
valorar las expresiones sin dificultad. Por otra parte, ya las habr usado en el lenguaje de
programacin que haya estudiado antes de inicial este curso.


11 - Resumen
Hay que saber al final de esta unidad
PHP es un lenguaje de programacin pensado para elaborar
pginas web dinmicas que ofrece altas prestaciones.
El lenguaje PHP es sencillo, rpido, multiplataforma y
gratuito. Permite utilizar mltiples recursos y
libreras, programar con objetos y acceder a muchas bases
de datos de diferentes formatos.
Su funcionamiento es sencillo: el usuario o cliente
solicita al servidor web una pgina; ste enva el cdigo
PHP al intrprete, que lo ejecuta y devuelve al usuario
la pgina en formato HTML.
Para poder usar PHP se necesita un servidor web, una
plataforma, como Windows o Linux, y un gestor de base de
datos. En concreto, este curso utiliza el servidor
Apache, instalado en el ordenador local del usuario, el
sistema operativo Windows y el gestor MySQL de bases de
datos.
El lenguaje PHP se entremezcla y combina con el lenguaje
HTML, de forma que uno puede enmarcar o envolver al otro
y viceversa.
El signo <? indica que comienza el cdigo PHP y el signo
?> seala el final de este cdigo. Dentro de estos dos
signos no se puede anidar otro cdigo PHP enmarcado entre
<? y ?>.
Para escribir el cdigo fuente necesitamos de un editor
de texto ASCII. Puede utilizarse cualquiera, si bien para
el curso hemos incluido el editor dev-PHP, que dispone de
las principales opciones propias de este tipo de
editores.
Desde la opcin Ayuda de este editor se puede acceder al
Manual de PHP.
Los ficheros que contengan el cdigo fuente PHP deben
llevar la extensin php, para que el intrprete los
reconozca.
Los ficheros que contengan el cdigo fuente de las
actividades del alumno han de guardarse en la carpeta
personal que debe aparecer dentro de la carpeta alumnos
de c:\CursoPHP5\curso.
Para comprobar que un programa funciona, hay que arrancar
primeramente el servidor Apache y a continuacin el
navegador de Internet poniendo en la direccin el camino
donde hemos guardado el fichero de tipo php donde hemos
escrito el cdigo fuente. Puede ser:
http://localhost/alumnos/nombre_carpeta/nombre_fichero.php
Todas las sentencia de PHP deben acabar con ;.
Las sentencias o instrucciones compuestas contienen
varias sentencias simples y deben estar incluidas entre
los signos { y }. Generalmente, una sentencia compuesta
est integrada por sentencias simples de un bucle o de la
declaracin de una funcin que deben ejecutarse como un
bloque.
Los nombres de las variables y arrays deben iniciarse
siempre con el signo $. Deben ser correctos y conviene
que sean fciles de manejar y que tengan algn
significado que informe de su contenido.
Para poder seguir mejor el flujo de un programa y ver ms
intuitivamente su cdigo, conviene indentar (adentrar
unos espacios) las sentencias que estn incluidas dentro
de una estructura.
Los comentarios ayudan mucho a comprender un programa.
Los que slo ocupan una lnea deben ir precedidos de los
signos //. Si el texto ocupa ms de una lnea, hay que
incluirlo entre los signos /* y */. stos no deben
iniciarse detrs de una instruccin, sino en lnea
aparte.
Hay operadores de varios tipos: aritmticos, de
asignacin, de comparacin, condicional, de ejecucin, de
cadena, de incremento/decremento, lgicos y de bit a bit.
Dentro de una expresin los operadores no se ejecutan de
izquierda a derecha en el orden en que estn escritos,
sino que siguen una prelacin u orden jerrquico que
debemos tener en cuenta. Los parntesis sirven para
determinar el orden de ejecucin de los operadores sin
tener en cuenta la precedencia de los mismos.
Las rdenes echo y print sirven para mostrar informacin
en la pgina web tal como la escribamos literalmente o
segn est contenida en una variable.
Las funciones printf() y sprintf() permiten mostrar
informacin con un formato determinado, segn se
especifique en una cadena de formato integrada por textos
literales y por directivas. Las directivas deben
iniciarse con el signo %.
En el lenguaje PHP hay datos de los siguientes tipos:
numrico entero, numrico de coma flotante, arrays
(matrices), cadenas de caracteres y objetos.
Hay conversores de tipos que permiten definir una
variable como de un determinado tipo. Son int, double,
string, array y object.
Es muy importante saber construir expresiones correctas
con variable, literales, operadores y funciones, as como
saber interpretarlas.
En PHP como en cualquier lenguaje las expresiones
constituyen uno de los asuntos ms importantes de la
programacin, pues intervienen en todas las sentencias y
estn integradas por todos los elementos de un lenguaje
informtico.


MENTOR - CNICE MEC 2009
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5

Teora: El lenguaje de programacin PHP 5

1 - Objetivos
Objetivos
Conocer y saber usar las variables en toda su extensin como elementos
fundamentales del lenguaje PHP.
Aprender a preguntar e introducir datos desde la pgina PHP mediante
formularios, asignndola a sus elementos diferentes variables y utilizndolos
despus en diversas operaciones.
Conocer cmo se pasa informacin entre scripts php y se accede desde unos
a otros.
Aprender a utilizar correctamente las estructuras de control condicionales y
las estructuras de bucle aplicndolas con eficiencia a las diferentes situaciones
que lo requieran.
Saber acceder a ficheros externos desde la pgina web actual.


2 - Algo ms sobre las variables
Ya se habr podido advertir que las variables son un elemento fundamental en la
programacin. En la Unidad 1 slo hemos comentado algunos aspectos bsicos de las
mismas. En esta Unidad vamos a completar algo ms esa informacin.
mbito de las variables
Como ya hemos dicho, el lenguaje PHP es interpretado, es decir, no permanece en la
memoria, sino que, una vez ejecutado el script de la pgina php, se pierde el contenido de
las variables utilizadas en el cdigo. As pues, cada variable slo tiene validez en el contexto
en que est definida, bien aparezca dentro de un servidor, de un script php o de una funcin.
As pues, por defecto las variables que forman parte de una pgina o funcin tienen un
mbito exclusivamente local.
Cmo podemos hacer que una variable tenga un valor global, es decir, que se conserve
tanto en una funcin como en una pgina o entre pginas diferentes?

Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Para alterar el mbito de una variable, disponemos de dos modificadores:
1. global: este modificador permite acceder a una variable en la pgina php cuando se
invoca una funcin. Veamos en el ejemplo siguiente cmo se comporta una variable local y
la misma si es global.
En este ejemplo usamos la variable $texto como local tanto en la pgina como en la
funcin.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 1</TITLE></HEAD>
<BODY>
<?
function ver_texto()
{
echo "<BR>";
echo "No se ve el contenido de la variable \$texto,
pues slo tiene un mbito local. Por eso se
muestra el mensaje de error siguiente:";
echo "<BR>";
echo $texto;
}
$texto="Volvern las oscuras golondrinas...";
ver_texto();
?>
</BODY>
</HTML>
Si ejecutamos la pgina desde el explorador de Internet, vemos que no se muestra el
contenido de la variable $texto, pues el valor asignado a la misma en el script php no pasa a
la funcin, que es donde debe mostrarse. En cambio, se muestra la frase Notice:
Undefined variable: texto, que podemos traducir como Aviso: La variable
texto no se ha definido. Desde el Programa gestor del curso puede abrirse el
Ejemplo 1 de la Unidad 2 y con el botn Ejecutar mostrar en nuestra pantalla el resultado
de su interpretacin.
En cambio, si utilizamos el modificador global, s se muestra el valor de la variable, como
puede observarse en el mismo ejemplo anterior modificado.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 2</TITLE></HEAD>
<BODY>
<?
function ver_texto()
{
global $texto;
echo "<BR>";
echo "Ahora se ve el contenido de la variable
\$texto, pues tiene un mbito global.";
echo "<BR>";
echo "<BR>";
echo $texto;
}
$texto="Volvern las oscuras golondrinas...";
ver_texto();
?>
</BODY>
</HTML>
Desde el Programa gestor del curso puede abrirse el Ejemplo 2 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
2. static: este modificador es prcticamente igual que el anterior, pero algo ms extenso,
pues hace que la variable conserve el mismo valor en sucesivas ocasiones en que se
invoque la funcin a lo largo de un programa. Una variable esttica existe slo en el mbito
local de la funcin, pero no pierde su valor cuando la ejecucin del script php abandona este
mbito. Por eso, es necesario crearla como esttica dentro de la funcin y asignarle valor en
este mbito.
En el ejemplo siguiente puede verse cmo se usa el modificador static.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo
3</TITLE></HEAD>
<BODY>
<?
function ver_valor()
{
echo "<BR>";
static $valor=0;
echo $valor;
$valor++;
}
echo "La variable \$valor aumenta cada vez que
invocamos la funcin.";
ver_valor();
ver_valor();
ver_valor();
?>
</BODY>
</HTML>
Desde el Programa gestor del curso puede abrirse el Ejemplo 3 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.
3. Matriz $GLOBALS(). PHP desde la versin 3 dispone de otra forma de acceder a las
variables de una forma global. El array $GLOBALS asocia en cada uno de sus elementos el
nombre de la variable con su contenido de tal forma que accediendo al primero podemos
saber su contenido dentro de un mbito global.
En el ejemplo siguiente se ve claramente cmo funciona este mtodo.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 4</TITLE></HEAD>
<BODY>
<?

// Asignamos a las variables $v y $x los valores 3 y 6
respectivamente.
// Observa que no las declaramos como globales, luego son locales.
$v = 3;
$x = 6;

Function Sumar()
{
$GLOBALS["z"] = $GLOBALS["v"] * $GLOBALS["x"];
/* Observa que las variables $v, $x y $z no son declaradas
como globales pero accedemos a ellas globalmente mediante
la matriz $GLOBALS.*/
}

Sumar();

echo "La variable \$v=3 multiplicada por la variable \$x=6
produce el resultado 18, que asignamos a la variable \$z.";
echo "<BR>";
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
echo "<BR>";
echo "Luego \$z vale $z.";

?>
</BODY>
</HTML>
Desde el Programa gestor del curso puede abrirse el Ejemplo 4 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.
Variables de variables
PHP ofrece la posibilidad de utilizar variables que hagan referencia al contenido de otra
variable, en una especie de suplantacin o sustitucin de una variable por otra. Es til para
leer fichero de configuracin. Para que una variable sustituya a otra es preciso utilizar el
operador { }. En el siguiente ejemplo puede verse cmo se comporta una variable y su
sintaxis.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo
5</TITLE></HEAD>
<BODY>
<?

$nombre = "Mara";
$n = "nombre";

echo "La variable \$nombre contiene \"Mara\".";
echo "<BR>";
echo "La variable \$n contiene \"nombre\".";
echo "<BR>";
echo "La variable variable $\{\$n} contiene tambin
\"${$n}\".";
// Observa la sintaxis para citar una variable
variable: ${$n}.

?>
</BODY>
</HTML>
Desde el Programa gestor del curso puede abrirse el Ejemplo 5 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.

Cmo obtener informacin sobre la existencia y el contenido de una variable
Hemos visto que en PHP el tratamiento de las variables es muy flexible, a la vez que
impreciso. Su tiempo de vida tambin es breve. En ocasiones, antes de volver a usarla, es
necesario conocer si una variable est definida y, si lo est, qu valor tiene. Puede ser que
en el transcurso de un programa que llame a varias pginas web la variable haya sido
eliminada de la memoria o que haya adquirido el valor nulo. Para conocer estos dos datos,
PHP dispone de las dos funciones siguientes:
1. empty(), que devuelve el valor verdadero si la variable no est definida o lo est, pero
tiene un valor nulo. Por ejemplo, si a la variable $num le asignamos el valor 10, las
instrucciones
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
if (!empty($num))
echo "La variable \$num contiene $num.";
else
echo "La variable \$num no est definida.";
genera la pgina
La variable $num contiene 10.
En cambio, si no hubiramos definido la variable, devolvera la pgina
La variable $num no est definida.
2. isset(), que devuelve el valor verdadero si la variable ha sido inicializada con un valor y
falso si no lo ha sido. Por ejemplo, si inicializamos la variable $num con valor 10, las
instrucciones
if (isset($num))
echo "La variable \$num ha sido inicializada y contiene $num.";
else
echo "La variable \$num no ha sido inicializada o definida.";
genera la pgina
La variable $num ha sido inicializada y contiene 10.
En cambio, si no hubiramos definido la variable, devolvera la pgina
La variable $num no ha sido inicializada o definida.
Cmo obtener informacin sobre el tipo de una variable
A veces, tambin necesitamos saber de qu tipo son las variables. PHP dispone con este fin
de un conjunto de funciones que empiezan por is_ y que devuelven verdadero si el tipo de
variable es el que se indique y falso si no lo es. Son las siguientes:
1. is_array(). Devuelve verdadero si el tipo de la variable es una matriz y falso si no lo es.
2. is_bool(). Devuelve verdadero si el tipo de la variable es booleano y falso si no lo es.
3. is_double(). Devuelve verdadero si el tipo de la variable es un nmero de tipo doble y
falso si no lo es.
4. is_float(). Devuelve verdadero si el tipo de la variable es un nmero de coma flotante y
falso si no lo es.
5. is_int() o is_integer(). Devuelve verdadero si el tipo de la variable es un nmero entero
y falso si no lo es.
6. is_long(). Devuelve verdadero si el tipo de la variable es un nmero entero largo y falso
si no lo es.
7. is_object(). Devuelve verdadero si el tipo de la variable es un objeto y falso si no lo es.
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
8. is_real(). Devuelve verdadero si el tipo de la variable es un nmero real y falso si no lo
es.
9. is_string(). Devuelve verdadero si el tipo de la variable es una cadena de caracteres y
falso si no lo es.
10. is_numeric(). Devuelve verdadero si el tipo de la variable es un nmero y falso si es una
cadena.
11. gettype(). Esta ltima funcin, ms directa que las anteriores, devuelve directamente el
tipo de la variable que se le pasa como argumento. Los tipos posibles son boolean, integer,
double, string, array, object y unknown (desconocido).
Si slo se necesita saber de qu tipo es una variable, esta ltima funcin es la ms
directa y recomendable. En cambio, si se necesita que una variable sea de un determinado
tipo para operar con ella, es ms directo y recomendable utilizar las correspondiente
anterior.
Cmo modificar una variable
PHP dispone tambin de funciones para realizar estas operaciones:
1. Eliminar una variable de la memoria. Recordamos que todas las variables se eliminan
por s mismas al acabar la interpretacin de un programa, por lo cual no es necesario
eliminarlas explcitamente. Esta operacin slo es recomendable cuando se comprueba que
dentro de un mismo script php se consumen innecesariamente muchos recursos, como
cuando hay muchas variables definidas que ya no se usan.
En este caso, podemos utilizar la funcin unset(), que elimina una variable definida
previamente. El nombre de la variable que debe eliminarse se pasa a la funcin como
parmetro. Por ejemplo, si queremos que $casa ya no est definida, podemos escribir
unset($casa). Si la operacin se ha llevado a cabo con xito, la funcin devuelve el valor
verdadero; de lo contrario, devuelve falso.
2. Asignar un tipo concreto a una variable. En la Unidad 1 ya vimos cmo poda hacerse
esto con los conversores de tipos boolean, int, double, string, array y object. La funcin
settype() permite, igualmente, forzar que una variable sea del tipo especificado.
Por ejemplo, si queremos que la variable $cosa sea de tipo cadena, debemos escribir:
settype($cosa, "string");. Como puede observarse, el primer argumento es el nombre de
la variable y el segundo (entre comillas dobles) es el tipo de dato que debe tener: boolean,
integer, double, string, array y object.
Separar el contenido de una variable
El contenido de una variable de cadena puede contener letras y nmeros. PHP dispone de
diferentes funciones que permiten separar los nmeros del texto y asignarlos a las variables
correspondientes de su tipo.
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Por ejemplo, si tenemos la cadena 89.53Pepe es madrileo, es posible separar el
contenido numrico de este texto: 89.53. Veamos cmo se hace estudiando cada una de las
funciones siguientes:
1. doubleval(). Devuelve el nmero de coma flotante que haya en la frase. Conviene
advertir que esto slo ocurre si el nmero de coma flotante aparece al principio de la frase.
De no se as, se devuelve 0.
2. intval(). Devuelve el nmero entero que haya en la cadena o 0 si no lo hay.
3. strval(). Devuelve una cadena de caracteres utilizando el contenido de la variable.
Desde el Programa gestor del curso puede abrirse el Ejemplo 6 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin.
Constantes
Aunque en este apartado tratamos de las variables, queremos aadir que en PHP tambin
pueden definirse constantes, es decir, asignar a identificadores valores que no van a
cambiar nunca a lo largo de un programa. Por ejemplo, hay valores constantes que no
tienen por qu ser escritos cada vez que los necesitemos, sino que podemos asignarlos a
una constante y operar con ella como si fuera una variable. Por ejemplo, el euro vale
166,386 pesetas. En lugar de escribir siempre este valor, podemos definir la constante tasa
y luego usarla en las operaciones.
La funcin define() nos permite crear constantes y asignarles un contenido. Por ejemplo, si
queremos crear la variable tasa y asignarle su valor en relacin con la peseta, debemos
escribir la sentencia define("tasa",166.386);. Una ver definida la constante, si
tenemos la variable $euros, podramos operar as: $pesetas=($euros * tasa);.
Debemos observar que los identificadores de las constantes no llevan el signo $ delante.
Las constantes no tienen un concreto mbito de utilizacin, por lo que son accesibles desde
cualquier lugar de nuestra pgina php. Adems, las constantes no pueden ser redefinidas
una vez que han sido inicializadas.
La funcin defined() devuelve verdadero si se define con xito una constante y falso si no es
as.


3 - Lectura de datos desde una pgina web
Trabajando con formularios
En la Unidad anterior hemos visto cmo presentar informacin en la pgina web. En sta
vamos a dar un paso ms estudiando cmo podemos preguntar datos desde una pgina y
hacer que esa informacin pase a otra.
Los formularios nos proporcionan la posibilidad de preguntar al usuario cliente una serie de
datos que pueden ser devueltos al servidor. ste los procesar luego segn los objetivos del
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
programa: almacenndolos en una base de datos, controlando si son correctos, tratndolos
para ofrecer posteriormente al cliente otra pgina, etctera.
Veamos un ejemplo sencillo de formulario:
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 7</TITLE></HEAD>
<BODY>
<CENTER>
<H1>Introduzca sus datos</H1><P>
<FORM ACTION=index.php METHOD=POST>


<?
//inicializamos las variable $nom, $apel y $des
if (!isset($_POST["nom"])) $nom="";
else $nom=$_POST["nom"];
if (!isset($_POST["apel"])) $apel="";
else $apel=$_POST["apel"];
if (!isset($_POST["des"])) $des="";
else $des=$_POST["des"];

echo "<TABLE border=1 cellpadding=10><TR><TD>
<TABLE border=0>";
echo "<TR><TD align=right>Nombre: </TD>
<TD><INPUT NAME=nom VALUE=\"$nom\"></TD>
</TR>";
echo "<TR><TD align=right>Apellidos: </TD>
<TD><INPUT NAME=apel VALUE=\"$apel\" ></TD>
</TR>";
echo "<TR><TD align=right>Descripcin: </TD>
<TD><TEXTAREA NAME=des COLS=20 ROWS=5>$des</TEXTAREA></TD>
</TR>
</TABLE></TD></TR></TABLE>";
echo "<P><INPUT TYPE=submit VALUE='Aceptar'><P><P>";

if (! empty($nom) and ! empty($apel) and ! empty($des))
{
echo "<H2><CENTER>Los datos introducidos son:</CENTER></H2><P>";
echo "Nombre: $nom <P>";
echo "Apellidos: $apel <P>";
echo "Descripcin: $des <P>";
}

/* Observa que en este script se entremezclan cdigo HTML y cdigo
PHP usando los separadores necesarios en cada caso. En las ocho
primera lneas se usa cdigo HTML incluyendo dentro del mismo
entre comillas dobles tres instrucciones PHP. En las siguientes
y entre los signos <? y ?> se muestran debajo los datos escritos
en el formulario mediante las rdenes INPUT. Si lo precisas, repasa
en el Apndice 2 las rdenes de cdigo HTML que no entiendas.*/
?>

</FORM>
</CENTER>
</BODY>
</HTML>
Desde el Programa gestor del curso puede verse el Ejemplo 7 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod
fuente permite estudiar su cdigo.
El cdigo PHP anterior crea un formulario. Al pulsar sobre el botn Aceptar se vuelve a
ejecutar el mismo cdigo. Si hemos completado en el formulario los tres datos solicitados
(Nombre, Apellidos y Descripcin), se muestran en la parte inferior de la pgina, debajo del
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
formulario. As pues, conviene saber que en PHP es frecuente que una pgina se llama a s
misma. Este procedimiento se denomina recursividad.
Cuando se ejecuta el cdigo por primera vez, slo se preguntan los datos del formulario y no
aparecen los mismos en la parte inferior. Es lgico, pues las variables an no tienen
contenido. Cuando las tres variables tengan algn contenido, introducido en la pgina
mediante el formulario, se muestra esta informacin en la pgina llamada de nuevo al
pulsarse el botn Aceptar y ejecutarse la orden <FORM ACTION=index.php METHOD=POST>.
Esta forma de proceder es muy til para verificar si los datos introducidos son correctos. Si
ponemos las condiciones de correccin dentro del cdigo PHP, la comprobacin se realiza
en el servidor, lo cual impide que cualquier usuario pueda cambiar dichas condiciones, como
ocurre en JavaScript.
El formulario de este ejemplo ha sido escrito en cdigo HTML, pues resulta ms sencillo y
rpido que hacerlo en PHP.
Ntese que para acceder al contenido de la variables definidas en el formulario usamos la
variable global $_POST (que es una matriz) para METHOD=POST y $_GET (que es otra
matriz) para METHOD=GET en la etiqueta FORM de HTML. PHP tambin define la variable
$_REQUEST (que tambin es una matriz) que contiene los valores de $_POST y de $_GET
por lo que no es necesario conocer el mtodo utilizado en la etiqueta <FORM>.
Ya que podemos cambiar el nombre del fichero PHP que se llama a s mimo, en lugar de
citar dentro del cdigo expresamente su nombre, como hemos hecho, podemos usar la
variable de entorno $_SERVER['PHP_SELF'], que guarda el nombre del fichero al
ejecutarse. Escribiramos en este caso:
<FORM ACTION=<? $_SERVER['PHP_SELF'] ?> METHOD=POST>
Tambin resulta fcil cambiar el texto del botn, de forma que, al arrancar o cuando en el
formulario no se hayan metido los datos requeridos, se muestre Meter datos y, cuando ya
haya datos, aparezca Ver datos. Para hacerlo, habra que cambiar as las dos lneas
siguientes del script:
<?
if (!isset($_POST["boton"]) or (empty($nom) and empty($apel) and empty($des)))
$boton="Meter datos";
else
$boton="Ver datos";
?>
y la lnea
<INPUT TYPE=submit NAME=boton VALUE="<? echo $boton?>" >
Pasar informacin entre diferentes scripts
Hasta ahora hemos pasado valores dentro del mismo script llamndolo dos o ms veces
(recursividad). Tambin hemos visto que es infrecuente que una aplicacin hecha en PHP
est integrada por un solo fichero que genere una nica pgina. Generalmente, las
aplicaciones tienen mltiples pginas web que corresponden a mltiples scripts. Por lo tanto,
necesitamos saber pasar informacin de unos a otros. Cmo se consigue esto?
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
1. Utilizando un formulario. Los datos introducidos en un formulario pueden pasar a otra
pgina diferente. Veamos cmo se hace mostrando en una segunda pgina la informacin
que se escriba en el formulario del ejemplo anterior.
En este primer script creamos el formulario. Al interpretarse este cdigo, en la pgina
resultante se preguntan los datos.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 8a</TITLE></HEAD>
<BODY>
<CENTER>
<H1>Introduzca sus datos</H1>
<FORM ACTION=resultado.php METHOD=POST>

<?
echo "<TABLE border=1 cellpadding=10><TR><TD>
<TABLE border=0>";

echo "<TR><TD align=right>Nombre: </TD>
<TD><INPUT NAME=nom VALUE=''></TD>
</TR>";
echo "<TR><TD align=right>Apellidos: </TD>
<TD><INPUT NAME=apel VALUE=''></TD>
</TR>";
echo "<TR><TD align=right>Descripcin: </TD>
<TD><TEXTAREA NAME=des COLS=20 ROWS=5></TEXTAREA>
</TD>
</TR>
</TABLE></TD></TR></TABLE>";
echo "<P><INPUT TYPE=submit VALUE=\"Aceptar\"><P><P>";

?>

</FORM>
</CENTER>
</BODY>
</HTML>
En este segundo cdigo, que est guardado en el fichero resultado.php, mostramos la
informacin en otra pgina.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 8b</TITLE></HEAD>
<BODY>
<CENTER>

<?
//leemos las variable $nom, $apel y $des
if (!isset($_POST["nom"])) $nom="";
else $nom=$_POST["nom"];
if (!isset($_POST["apel"])) $apel="";
else $apel=$_POST["apel"];
if (!isset($_POST["des"])) $des="";
else $des=$_POST["des"];

echo "<H2>Los datos introducidos son:</H2><P>";
echo "Nombre: '$nom' <P>";
echo "Apellidos: '$apel' <P>";
echo "Descripcin: '$des' <P>";

echo "<BR><BR><INPUT type='button' value='Volver a la pgina
anterior'onClick='history.back()'>";
?>

</CENTER>
</BODY>
</HTML>
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Con el Programa gestor puede abrirse el Ejemplo 8 de la Unidad 2 y con el botn Ejecutar
mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod fuente permite
estudiar su cdigo.
2. Utilizando enlaces. Cuando pasamos un valor a un enlace, en la pgina destino se crea
de forma automtica la variable con el valor que le hayamos asignado. Veamos cmo se
hace transformando el ejemplo anterior de forma que en lugar de un formulario en el primer
script se use un enlace.

<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 9a</TITLE></HEAD>
<BODY>
<CENTER>
<H1>En esta pgina asignamos valores y creamos el enlace</H1>

<?
echo "A la variable \$nom le asignamos el valor \"Pedro.\" <P>";
echo "A la variable \$apel le asignamos el valor \"Garca.\" <P>";
echo "A la variable \$des le asignamos el valor \"Alto.\" <P>";

?>

<A HREF="resultado.php?nom=Pedro&apel=Garca&des=Alto">
Pulsar aqu para enlazar con la otra pgina</A>

</CENTER>
</BODY>
</HTML>

La instruccin donde se crea, en cdigo HTML, el enlace es
<A HREF="resultado.php?nom=Pedro&apel=Garca&des=Alto">
Pulse aqu para enlazar con la otra pgina </A>
Conviene advertir que detrs de la orden HREF= hay que poner el nombre del fichero donde
est el cdigo de la pgina a la que hay que pasar los valores, seguido del signo ?. Detrs
de ste, se pone el nombre de la variable cuyo contenido se debe pasar sin usar el signo $.
Si hay ms de una variable, se ponen todas separadas por el signo &, como en el ejemplo
anterior.
Cuando pulsamos sobre el enlace, se llama al script de la pgina siguiente, que es ste:
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 9b</TITLE></HEAD>
<BODY>
<CENTER>

<?
//leemos las variable $nom, $apel y $des
// Fjate que aqu usamos $_GET porque la variables
// se pasan en la URL del enlace.
if (!isset($_GET["nom"])) $nom="";
else $nom=$_GET["nom"];
if (!isset($_GET["apel"])) $apel="";
else $apel=$_GET["apel"];
if (!isset($_GET["des"])) $des="";
else $des=$_GET["des"];

Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
echo "<CENTER><H2>Aqu se muestran los datos del enlace</H2>
</CENTER><P>

Nombre: '$nom' <P>
Apellidos: '$apel' <P>
Descripcin: '$des' <P>
";
echo "<BR><BR><INPUT type='button' value='Volver a la pgina
anterior'onClick='history.back()'>";
?>

</CENTER>
</BODY>
</HTML>
Debemos observar que en este segundo cdigo no se han definido las variables cuyo
contenido se muestra, sino que se transfieren mediante el enlace desde el cdigo del fichero
anterior. Adems, es recalcamos el hecho de que hemos usado $_GET para acceder al
contenido de la variables que hemos definido en la URL. Recomendamos leer el anexo
HTML (Formularios).
Con el Programa gestor puede verse el Ejemplo 9 de la Unidad 2 y con el botn Ejecutar
mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod fuente permite
estudiar su cdigo.
Queremos acabar este apartado con dos advertencias ms:
HTML no entiende de espacios y, por tanto, si el contenido de las tres variables
anteriores hubiera tenido ms de una palabra con espacios en medio, la pgina no se
habra mostrado, sino que se producira un error. Para que HTML respete los posibles
espacios entre palabras, es preciso utilizar la funcin urlencode(). Mira cmo hemos
aplicado esta funcin en el ejemplo 10, que aparece un poco despus, y es una
transformacin del ejemplo 9.
Cuando se pasan bastantes variables mediante un enlace, lo mejor es crear otra
variable que contenga una cadena de caracteres donde se concatenen los nombres
de todas las variables pasadas, de forma que, detrs del nombre del fichero que se
cita en la orden HREF, se ponga slo el nombre de la variable que contiene todos los
nombres. Mira en el ejemplo 10 cmo hemos aplicado este procedimiento
transformando el cdigo del ejemplo 9.

<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 10a</TITLE></HEAD>
<BODY>
<CENTER><H1>En esta pgina asignamos cadenas largas y creamos el
enlace</H1>


<?
echo "A la variable \$nom le asignamos el valor \"Pedro Jos.\"<P>";
echo "A la variable \$apel le asignamos el valor \"Garca de Dios.\"<P>";
echo "A la variable \$des le asignamos el valor \"Alto y moreno.\"<P>";

$variables_pasadas="nom=".urlencode("Pedro Jos.").
"&apel=".urlencode("Garca de Dios.").
"&des=".urlencode("Alto y moreno.");
?>

<A HREF=resultado.php?<? echo $variables_pasadas; ?> >
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Pulse aqu para enlazar con la otra pgina </A>

</CENTER>
</BODY>
</HTML>
Desde el Programa gestor puede verse el Ejemplo 10 de la Unidad 2 y con el botn
Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod fuente
permite estudiar su cdigo.

4 - Estructuras de bifurcacin condicional
Uno de los elementos ms necesarios y frecuentes en la programacin informtica son las
estructuras de bifurcacin condicional. La ejecucin de las instrucciones de un programa no
tiene que seguir necesariamente una lnea secuencial, es decir, en el caso de PHP no han
de interpretarse todas las sentencias que aparezcan en el cdigo. Por el contrario, a veces
es imprescindible que algunas dejen de interpretarse y, en cambio, s han de ser procesadas
otras. Esto se consigue mediante las estructuras de bifurcacin condicional, que vamos a
estudiar a continuacin.
Llamamos a estas estructuras de bifurcacin condicional, control condicional o decisin
condicional por la decisin que ha de tomarse entre varias alternativas o diferentes
posibilidades. Mediante ellas conseguimos que se realice una operacin u otra en funcin de
unos valores o contenidos dados.
En este curso suponemos que el alumno ya sabe usar esta estructura y nos vamos a limitar
a explicar la sintaxis de las rdenes con las que se aplica en el cdigo PHP. Por otra parte,
en los ejemplos y ejercicios anteriores ya hemos utilizado estructuras de este tipo esperando
que el alumno o alumna las haya entendido y aplicado correctamente.
Estructura simple
La estructura ms elemental est integrada por la palabra reservada if seguida de una
expresin, como se ve en la sintaxis siguiente:
if (expresin)
{sentencia simple o compuesta;}
Por ejemplo, si la variable $numero contiene 5 y queremos multiplicar ese valor por 2 si
$numero vale menos de 10, debemos escribir as la sentencia:
if ($numero<10)
{$numero*=2;}
En este caso, como 5 es menor que 10, se ejecuta la instruccin, de forma que $numero
pasa a valer 10.
Si hay que ejecutar un bloque con mltiples sentencias, es imprescindible incluirlo entre las
llaves {...}. Por ejemplo, si la variable $a contiene 3 y la variable $b contiene 5, y queremos
multiplicar $a por 4 y $b por 2 en el caso de que $a multiplicada por $b resulte 25,
escribiremos:
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
if ($a*$b=25)
{
$a*=4;
$b*=2;
}
En este caso, como 3 ($a) por 5 ($b) resulta 15, que es distinto de 25, no se ejecuta la
instruccin compleja y, por tanto, ninguna de las dos variables cambiar de valor.
Estructura completa
En el caso de la estructura anterior una sentencia se ejecuta si se cumple la condicin
puesta en la expresin y no se ejecuta si no se cumple. Pero tambin es posible ejecutar
una instruccin si se cumple la condicin o ejecutar otra si no se cumple la condicin. Aqu
se aplica con toda precisin el trmino bifurcacin, que significa divisin de un camino en
dos. PHP dispone tambin de esta estructura ms completa, cuya sintaxis es la siguiente:
if (expresin)
{sentencia simple o compuesta;}
else
{sentencia simple o compuesta;}
Por ejemplo, si la variable $numero contiene 5 y queremos multiplicar ese valor por 2 si
$numero vale menos de 10 o por 4 si vale 10 o ms, debemos escribir as la sentencia:
if ($numero<10)
{$numero*=2;}
else
{$numero*=4;}
En este caso, como 5 es menor que 10, se ejecuta la primera instruccin, de forma que
$numero pasa a valer 10. Si $numero hubiera contenido 10, se habra ejecutado la segunda
instruccin, de forma que $numero hubiera pasado a valer 20.
Complementaria de esta estructura es otra ms completa que admite ms de dos
posibilidades o condiciones y, por tanto, se puede ejecutar una instruccin entre muchas
posibles. Tiene esta estructura:
if (expresin1)
{sentencia simple o compuesta;}
elseif (expresin2)
{sentencia simple o compuesta;}
elseif (expresin3)
{sentencia simple o compuesta;}
......
else
{sentencia simple o compuesta;}
Por ejemplo, supongamos que a la variable $etapa le queremos asignar los literales "Beb"
si la edad de una persona es menor de 1 ao, "Niez" si est comprendida entre 2 y 12,
"Adolescencia" si la persona tiene entre 13 y 16 aos, "Juventud" entre 17 y 21 aos,
"Madurez" entre 22 y 70 aos y "Vejez" desde 71 en adelante. Debemos escribir as la
estructura condicional para que a cada persona se le asigne la etapa correspondiente a su
edad:
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
if ($edad<1)
{$etapa="Beb";}
elseif ($edad<13)
{$etapa="Niez";}
elseif ($edad<17)
{$etapa="Adolescencia";}
elseif ($edad<22)
{$etapa="Juventud";}
elseif ($edad<71)
{$etapa="Madurez";}
else
{$etapa="Vejez";}
Si la variable $edad contiene 34, se ejecutara la quinta instruccin, que es
$etapa="Madurez"; dado que la primera expresin que devuelve Verdadero (True) es
($edad<71). Las condiciones se comprueban de arriba abajo y, cuando se encuentra una
expresin que devuelve True, se ejecutan las instrucciones que contenga en esa clusula,
abandonando despus la estructura condicional.
Para que la variable $etapa no quede indeterminada, es conveniente poner como ltima la
clusula else, a fin de que, si no se han cumplido ninguna de las condiciones anteriores, el
flujo del programa pase por esta ltima y asigne el valor que nos convenga a la variable
$etapa.
Conviene recordar que, si dentro de cada clusula aparecen varias instrucciones (sentencia
compleja), es necesario ponerlas entre las llaves {...}, si bien es buena costumbre poner
siempre las dos llaves como hacemos nosotros casi siempre.
Hay otra instruccin que permite tambin codificar estructuras condicionales de forma muy
similar a la que acabamos de ver. Es la orden switch, que tiene la estructura siguiente:
switch (variable)
{
case valor:
sentencia simple o compuesta;
break;
case valor:
sentencia simple o compuesta;
break;
case valor:
sentencia simple o compuesta;
break;
......
default
sentencia simple o compuesta;
}
Veamos su sintaxis en un ejemplo. Supongamos que en la variable $ciudad tenemos el
nombre de una provincia y que a la variable $comunidad queremos asignarle la Comunidad
Autnoma a la que pertenece. Podramos escribir as la estructura condicional:
switch ($ciudad)
{
case "Lugo":
$comunidad="Galicia";
break;
case "Huesca":
$comunidad="Aragn";
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
break;
case "Soria":
$comunidad="Castilla Len";
break;
case "Almera":
$comunidad="Andaluca";
break;
default:
$comunidad="Otra";
}
Si la variable $ciudad contiene "Soria", a $comunidad se le asigna "Castilla Len". Si
contuviera "Cceres", se le asignara "Otra". En esta estructura hay que tener en cuenta que
el flujo del programa comprueba todas las clusulas case, incluso aunque encuentre una
condicin verdadera. Por ello, conviene poner siempre la orden break para abandonar la
comprobacin cuando se encuentre la primera expresin que devuelva Verdadero.
El lenguaje PHP ofrece una sintaxis alternativa para alguna de sus estructuras de control
condicionales: permite cambiar la llave de apertura { por dos puntos (:) y la de cierre } por
endif; o endswitch;. Incluso es posible mezclar cdigo HTML dentro de una estructura
condicional del lenguaje PHP. Observa el ejemplo siguiente:
<? if ($ciudad=="Segovia" ?>
Esta ciudad pertenece a Castilla Len
<? endif; ?>
En este ejemplo el bloque HTML Esta ciudad pertenece a Castilla Len se incluye dentro de
una sentencia if escrita en la sintaxis alternativa. El bloque HTML se mostrar slo si
$ciudad es igual a "Segovia".
La sintaxis alternativa puede aplicarse incluso dentro de las clusulas else y
elseif, como puede verse en el ejemplo siguiente:
if ($ciudad == "Soria"):
print "Castilla Len";
print "...";
elseif ($ciudad =="Badajoz"):
print "Extremadura";
print "!!!";
else:
print "Sin determinar;
endif;
Tambin en la orden switch puede aplicarse esta sintaxis alternativa as:
$var=3;
switch ($var):
case 0:
print "var vale 0";
break;
case 1:
print "var vale 1";
break;
case 2:
print "var vale 2";
break;
default:
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
print "var es distinta de 0, 1 o 2";
endswitch;
Anidamiento de estructuras condicionales
Las sentencias if se pueden anidar indefinidamente dentro de otras sentencias if. Esto
proporciona a PHP una gran riqueza y flexibilidad para ejecutar estructuras condicionales en
las diferentes partes de un programa.
Se denomina anidamiento a la operacin que consiste en incluir unas estructuras
condicionales dentro de otras. Anidar, pues, consiste en meter estructuras condicionales
dentro de una, de varias o de todas las clusulas de otra estructura condicional.
En la operacin de anidar estructuras condicionales debe tenerse en cuenta la siguiente:
Las estructuras condicionales anidadas pueden ser muy variadas y complejas. Lo
ms importante es saber identificar los diversos niveles de anidamiento y las
clusulas de cada estructura.
Siempre deben adentrarse los mrgenes (indentar) de las estructuras anidadas para
poder ver mejor dnde se abre y se cierra cada estructura condicional, as como las
clusulas que la integran. Las instrucciones de cada clusula tambin deben
identarse.
Cuando aparece una estructura condicional anidada dentro de una clusula de otra
estructura condicional, la estructura condicional anidada debe incluirse
completamente dentro de esa clusula. Adems, pueden aparecer o no instrucciones
antes y despus de la estructura condicional anidada. Es decir, la estructura anidada
no tiene por qu ser el nico elemento de una clusula condicional.
Las estructuras condicionales slo deben anidarse cuando no hay otra solucin ms
sencilla y que exija menos instrucciones, como usar la orden switch en lugar de
anidar hasta varios niveles.
En el prximo ejemplo puedes ver cmo hemos resuelto el supuesto siguiente usando
estructuras condicionales y un formulario: Un colegio imparte enseanza matinal para nios
y nias de 2 a 10 aos, enseanza vespertina para alumnos y alumnas de 11 a 17 aos,
enseanza nocturna para adultos de 18 a 25 aos y enseanza a distancia para personas
mayores de 25 aos. Necesita una pgina web en que se muestre los datos principales del
colegio y se pregunte la edad de la persona que quiere matricularse. Segn los aos
indicados, se muestra la informacin acadmica de los cuatro modalidades de enseanza.
Desde el Programa gestor del curso puede abrirse el Ejercicio 2 de la Unidad 2 y con el
botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin. Si se pulsa
sobre el botn Cod fuente, se accede al cdigo fuente.

5 - Estructuras de bucle
Los bucles, juntamente con las estructuras condicionales, constituyen otro de los elementos
ms necesarios y frecuentes en la programacin informtica. Una caracterstica importante
de todo buen programa, adems de la velocidad de ejecucin, es que resuelva el problema
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
planteado utilizando el menor nmero posible de lneas de instrucciones. La estructura de
bucle permite ahorrar muchas lneas de programacin y aumenta sensiblemente la velocidad
de ejecucin de los programas informticos. De ah su trascendencia y la importancia que
debe darse a la compresin y correcto uso de este elemento.
Como ya debe saber la persona que haga este curso, en informtica el trmino bucle es
sinnimo de iteracin o repeticin, es decir, se refiere al hecho de repetir o iterar una
operacin cuantas veces necesitemos o queramos. As pues, podemos definir un bucle
como la estructura de control que permite que una instruccin o varias se ejecuten ms de
una vez mientras se cumpla una condicin dada.
Imaginemos que necesitamos hallar los mltiplos de 5 que hay entre 5 y 1000. Para hacerlo,
utilizamos la variable $multiplos_5, que inicialmente tiene el valor 1 y se va incrementando
de uno en uno. Cuando el nmero resultante es mltiplo de 5, se muestra en la pgina. Es
un problema muy sencillo de suma y divisin, pero si no se emplease un bucle, exigira
muchas lneas de instrucciones, como puede verse a continuacin.
if ($multiplos_5 mod 5 = 0)
{ echo $multiplos_5;}
$multiplos_5+=1;
Las instrucciones anteriores serviran para realizar las operaciones mencionadas en el caso
de que 1 fuera mltiplo de 5. Sin utilizar un bucle, necesitaramos repetir esta secuencia
1.000 veces. En cambio, si usamos una estructura de bucle, con escribir este cdigo una
vez es suficiente.
En resumen, un bucle es una estructura de control del flujo de un programa que permite
repetir una o varias operaciones cuantas veces sea necesario dependiendo de una
condicin. Siempre que la condicin se cumpla, se repetir la operacin. Cuando deje de
cumplirse, se sale de la estructura de bucle y el programa contina su flujo ejecutando las
instrucciones que aparecen detrs del bucle.
La estructura de bucle while
Esta orden permite repetir una o varias instrucciones un determinado nmero de veces
mientras se cumpla una condicin dada. Se abandona el bucle cuando la condicin
establecida devuelva falso (False) o bien insertando la orden break segn nos convenga. En
el primer caso es preciso cambiar el valor de algn elemento de la expresin dentro del
propio bucle para que la condicin devuelva falso (False). En el segundo no es preciso que
la condicin devuelva falso para salir del bucle.
sta es su sintaxis:
while (expresin)
{sentencia simple o compleja;}
Veamos cmo se usa esta estructura en un ejemplo. La siguiente pgina muestra los
nmeros entre 0 y 1.000 que son mltiplos de 4, los cuenta y los suma.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo 11</TITLE></HEAD>
<BODY>
<H1> <CENTER>Nmeros de 1 a 1.000 mltiplos de 4 </CENTER></H1><P>
<?
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5

$i=1;
$z=0;
$suma=0;

while ($i<1001)
// Se abre un bucle que repite las operaciones 1000 veces.

{

/* Con esta estructura se salta al principio del bucle
sin ejecutar las intrucciones siguientes cuando
el valor de $i contenga de 500 a 699.*/
/* if ($i > 499 and $i < 700)
{
$i++;
continue;
}
*/

// Si el resto de dividir el nmero entre 4 es cero...
if ($i % 4 == 0)
{
printf("%04d -",$i);
$z++;
$suma+=$i;
} // Aqu acaba la estructura condicional.

/* Si la suma de los mltiplos de 4 es mayor de 100.000
Se sale del bucle. Este cdigo est comentado.*/
/* if ($suma>100000)
{break;}
*/
$i++;

} /* Aqu se cierra el bucle. Se abandona cuando
la variable $i valga 1.001.*/

?>

<CENTER>
<H2>Suma de estos nmeros :
<? printf("%06d",$suma); ?>
<P>

En total hay
<? echo $z; ?>
nmeros </CENTER></H2>
</BODY>
</HTML>

Con el Programa gestor del curso puede verse el Ejemplo 11 de la Unidad 2 y pulsando
el botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod
fuente permite estudiar su cdigo.
En el programa anterior no se usa la orden break para salir de bucle antes de que se deje
de cumplir la condicin. Si quisiramos abandonar el bucle cuando la suma de los mltiplos
de 4 fuera mayor que 100.000, podramos hacerlo con la estructura condicional siguiente:
if ($suma>100000)
{break;}
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Si se quiere ver cmo funciona, basta descomentar estas dos lneas del cdigo anterior y
actualizar la pgina web.
Como ocurre con las estructuras condicionales, con las estructuras de bucle tambin puede
utilizarse una sintaxis alternativa, que consiste en sustituir la primera de las llaves { por dos
puntos (:) y la ltima por la palabra endwhile;. En este caso la sintaxis es la siguiente:
while (expresin): sentencia ... endwhile;
Dentro de las estructuras de bucle se puede usar la orden continue para que el flujo del
programa salte al principio del bucle sin ejecutar las sentencias que hubiera entre la orden
continue y el cierre del bucle. Por ejemplo, si en el caso anterior queremos saltar desde el
nmero 500 hasta el 700, debemos insertar al principio del bucle la estructura condicional
siguiente:
if ($i > 499 and $i < 700)
{
$i++;
continue;
}
Si se quiere ver cmo funciona, basta descomentar estas lneas del cdigo del ejemplo
anterior y actualizar la pgina web.
La estructura de bucle do ... while
Esta orden funciona prcticamente igual que la anterior, con una sola diferencia: en la
estructura while, si la expresin devuelve False la primera vez que se evala, no se entra en
el bucle y, por tanto, las sentencias que haya en su interior no se ejecutan ni una vez. En
cambio, en la estructura do...while la sentencia se ejecuta al menos una vez y, luego, se
sigue ejecutando mientras sea verdadera la expresin.
En el caso de while decimos: Si la expresin es verdadera y mientras lo siga siendo,
ejecutar las sentencias. En cambio, en el caso de do...while indicamos: Haz esto y,
mientras la expresin sea verdadera, sigue hacindolo.
sta es su sintaxis:
do {sentencia simple o compleja;} while (expresin)
Por lo dems, esta estructura se comporta igual que while.
La estructura de bucle for
Esta orden de bucle permite, al igual que las anteriores, repetir una o varias instrucciones un
determinado nmero de veces segn el resultado de una expresin.
Su sintaxis es algo ms compleja que en las estructuras anteriores:
for (expresin1; expresin2; expresin3)
{sentencia simple o compleja;}
donde:
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
expresin1 indica el valor inicial desde el que debe comenzar el contador del bucle.
Esta expresin slo se evala la primera vez que se ejecuta el bucle.
expresin2 especifica la expresin que se evala cada vez que se repite el bucle. Si
devuelve True, se ejecutan las instrucciones de su interior. Si devuelve False, se
abandona el bucle.
expresin3 indica el incremento que se produce en la variable que se utiliza como
contador del bucle. Se evala al final de cada iteracin.
El segundo parmetro (expresin2) es imprescindible, mientras que el primero (expresin1)
y el tercero (expresin3) pueden aparecer dentro del parntesis o no. En este ltimo caso el
primer parmetro habr de inicializarse antes del bucle y el tercero deber incrementarse
dentro del mismo.
Si en el ejemplo anterior hubiramos usado la orden for, deberamos haber escrito:
for ($i=1;$i<1001;$i++)
En este caso, seran ya innecesarias las instrucciones $i=1; y $i++;.Tambin podemos
mantener estas dos instrucciones donde estn y escribir as el for:
for (;$i<1001;)
Por lo dems, la estructura for admite tambin la sintaxis alternativa
for (expr1; expr2; expr3): sentencia; ...; endfor;
as como las instrucciones break y continue en su interior.
Mira en el ejemplo siguiente una forma bastante elegante de mostrar en la pgina los 20
primeros nmeros pares.
<HTML>
<HEAD><TITLE>Curso PHP 5 - Unidad 2 - Ejemplo
12</TITLE></HEAD>
<BODY>

<CENTER>
<H2>Relacin de los nmeros pares de 0 a 20</H2>
<P>
<H3>

<?

for ($i = 0; $i <= 20; print " - $i", $i+=2);

?>

</H3></CENTER>
</BODY>
</HTML>
Con el Programa gestor del curso puede verse el Ejemplo 12 de la Unidad 2 y pulsando
el botn Ejecutar mostrar en nuestra pantalla el resultado de su interpretacin. El botn Cod
fuente permite estudiar su cdigo.
La estructura de bucle foreach
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
La orden foreach, que facilita el acceso y tratamiento de los elementos de los arrays.
Veamos su doble sintaxis y cmo se utiliza cada una a travs de ejemplos.


1. foreach (expresion_array as $value) sentencia
En esta primera sintaxis se recorren todos los elementos de un array desde el primero hasta
el ltimo y se asigna a $value el contenido de cada elemento avanzando el puntero un
elemento en cada iteracin del bucle. El puntero se coloca de forma automtica en el primer
elemento al comienzo del bucle.
En el ejemplo siguiente se recorren y muestran los elementos del array $impares usando
esta sintaxis.
$impares=array(1,3,5,7,9);
foreach($impares as $numimp)
print "Valor del elemento de \$impares: $numimp<P>";
Al interpretarse este cdigo se muestra la pgina siguiente:
Valor del elemento de $impares: 1
Valor del elemento de $impares: 3
Valor del elemento de $impares: 5
Valor del elemento de $impares: 7
Valor del elemento de $impares: 9
2. foreach (expresion_array as $key => $value) sentencia
Esta sintaxis hace lo mismo que la anterior, pero aqu disponemos de un dato ms, que es el
ndice del elemento por el que se va pasando en cada vuelta del bucle. Veamos cmo
funciona en el mismo ejemplo anterior:
$impares=array("uno"=>1,"dos"=>3,"tres"=>5,
"cuatro"=>7,"cinco"=>9);
foreach($impares as $indice=>$numimp)
print "Valor del elemento $indice de \$impares: $numimp<P>";
Al interpretarse este cdigo se muestra la pgina siguiente, similar a la anterior, en la que se
muestra el nombre del ndice de cada elemento:
Valor del elemento uno de $impares: 1
Valor del elemento dos de $impares: 3
Valor del elemento tres de $impares: 5
Valor del elemento cuatro de $impares: 7
Valor del elemento cinco de $impares: 9
En la Unidad 3 se estudiarn con ms detalle los arrays. Si el alumno lo necesita, puede
recurrir a las explicaciones dadas en la misma.
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5

6 - Cmo incluir ficheros en la pgina principal
Ya se habr observado en los ejercicios que hemos realizado que el cdigo correspondiente
a cada pgina web suele ser breve. Esto se consigue llamando a funciones, usando bucles,
etc. Adems, PHP permite tambin incorporar, cuando sea necesario, cdigo de otros
ficheros, gracias a lo cual este cdigo no tiene que estar en la pgina actual, sino que slo
es necesario citarlo o invocarlo dentro del script correspondiente.
Es muy conveniente utilizar este procedimiento para declarar funciones, para crear
cabeceras de pgina, para almacenar los datos de una configuracin, etctera, que se usan
en mltiples pginas, de forma que no sea preciso escribir este cdigo, declarar e inicializar
las variables o funciones ni definir las constantes cada vez que se usen en una pgina.
Basta con incluirlas o requerirlas como veremos a continuacin.
Orden include(). Permite leer el contenido de un fichero y colocar su cdigo en la posicin
donde se cita. Podemos incluir un fichero escribiendo entre comillas directamente su nombre
como parmetro de la orden. Por ejemplo, si escribimos include("cabecera.php");, se lee el
contenido de este fichero y se trae a la posicin del cdigo donde se cita, haciendo que se
ejecute como si lo hubiramos escrito ah mismo.
Si tenemos que incluir varios ficheros, podemos hacerlo usando un array y un bucle de esta
forma:
$ficheros=array("cabecera.php","configura.php","colores.php");
for ($a=0;$a<count($ficheros);$a++)
{
include($ficheros[$a]);
}
As pues, la funcin include() permite interpretar el cdigo que contenga el fichero citado
como parmetro cada vez que se utiliza.
Orden require(). Es muy parecida a la anterior y sirve, igualmente, para acceder desde un
script a un fichero externo. En este caso la funcin es reemplazada por el contenido del
fichero al que hace referencia. Se usa principalmente para acceder a ficheros que contienen
funciones y constantes que no van a ser modificadas, sino slo utilizadas en la pgina donde
de cita el fichero.
Veamos cmo se usa en ejemplo siguiente:
Contenido del fichero que vamos a requerir, que denominamos notas.php:
<?
define ("nota1","Insuficiente");
define ("nota2","Suficiente");
define ("nota3","Notable");
define ("nota4","Sobresaliente");
?>
Contenido del fichero donde se requiere el anterior:
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
<?
require ("notas.php");
print nota1."<P>";
print nota2."<P>";
print nota3."<P>";
print nota4;
?>
Al interpretarse este cdigo se muestra la pgina siguiente:
Insuficiente
Suficiente
Notable
Sobresaliente
Cuando realizamos la llamada desde una pgina diferente, el contenido de las constantes
que hemos creado e inicializado en notas.php pasa a formar parte del script donde est el
cdigo de la pgina actual y, por tanto, toda la informacin del fichero notas.php est
disponible para utilizarla en sta.
Debemos tener en cuenta que la orden require() no puede se incluirse dentro de un bucle
para acceder a mltiples ficheros, como hemos hecho con la orden include().
Los ficheros que pueden citarse como parmetros de las funciones include() y require()
pueden ser otra pgina web u otros ficheros no interpretados cuyo formato pueda ser ledo
por PHP, como los de tipo HTML, CSS, TXT, etctera.
Adems, al citar un fichero, es necesario tener en cuenta la lgica de la pgina web
(configuracin de directorios y subdirectorios) donde se citan, tanto por lo que se refiere a la
carpeta donde estn archivados como al camino para encontrarlos.
En el Ejercicio 3 y en el Ejercicio 4 de esta Unidad se usan las funciones include() y
require(). Cuando los realices, mira cmo se han incorporado estas funciones dentro del
cdigo de estos scripts.

7 - Resumen
Hay que saber al final de esta unidad
Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5
Identificar qu mbito tienen las variables y hacer que
tengan mbito local, global o esttico segn nos convenga
para el desarrollo de la pgina web utilizando correctamente
las rdenes global, static y la matriz GLOBALS().
Utilizar variables de variables.
Reconocer si una variable ha sido definida e inicializada y
acceder a su contenido mediante las funciones empty() e
isset().
Obtener informacin sobre el tipo de una variable con las
funciones is_xxx() correspondientes y con la funcin
gettype().
Eliminar una variable de la memoria con la funcin unset() y
asignarle un tipo determinado con la funcin settype().
Separar el contenido numrico del contenido alfanumrico de
una variable con las funciones doubleval(), intval() y
strval().
Declarar e inicializar constantes con la funcin define() e
identificar si estn definidas con la funcin defined().
Preguntar datos al usuario de una pgina web mediante
formularios.
Pasar datos entre diferentes scripts usando un formulario o
un enlace.
Conservar los espacios de un texto insertado en el cdigo PHP
cuando se devuelve en cdigo HTML con la funcin urlencode().
Aplicar correctamente dentro del cdigo PHP las estructuras
de bifurcacin condicional if... elseif...else y
switch...case...default.

Anidar estructuras condicionales dentro de otras.
Aplicar correctamente dentro del cdigo PHP las estructuras
de bucle while, do...while, for y foreach.
Acceder a ficheros externos desde la pgina web actual
sirvindose de las funciones include() y require().

Curso de PHP 5 Unidad 2 El lenguaje de programacin PHP 5





MENTOR - CNICE MEC 2009
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Teora: Varias funciones de PHP
1 - Objetivos
Objetivos
Conocer y saber aplicar correctamente las principales funciones
para tratar cadenas de caracteres.
Conocer y saber aplicar correctamente las principales funciones
para tratar fechas.
Crear, inicilizar y tratar arrays.
Utilizacin eficaz de funciones creadas por el usuario.
2 - Tratar cadenas de caracteres
En las dos Unidades anteriores hemos usado frecuentemente cadenas de caracteres. Hasta el
momento slo hemos escrito los textos entre comillas sin darle mayor importancia y los hemos
mostrado en la p!inas web tal como los ha"#amos escrito en el cdi!o.
En este apartado de la Unidad 3 $amos a a"ordar con mayor detalle las diferentes operaciones
%ue se pueden lle$ar a ca"o con este tipo de datos estudiando las principales funciones %ue
permiten hacerlo.
En la Unidad & ya estudiamos las funciones echo' print y printf' por lo cual en (sta no $amos
a repetir las explicaciones dadas.
Por otra parte' en el Captulo CVI. Funciones de cadena del anual de !"! )puede
encontrarse en la ayuda del Editor de$*PHP+ aparecen ms de ,- funciones de cadena de
caracteres. En este apartado nos $amos a limitar a explicar "re$emente las ms frecuentes y
necesarias. .uestro o"/eti$o es %ue el alumno aprenda a utilizar al!unas para familiarizarse
con ellas y poder' lue!o' utilizar correctamente las %ue necesite o"teniendo informacin en el
0anual.
#daptar las cadenas al conte$to
1l mezclarse el cdi!o H203 y PHP es preciso ocasionalmente %ue el int(rprete sepa distin!uir
los si!nos propios de cada len!ua/e %ue puedan aparecer en el interior de una cadena. 3as
funciones %ue permiten adaptar el contenido de una cadena al contexto de cada cdi!o son las
1 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
si!uientes4
3a funcin addSlashes() de$uel$e una cadena con "arras in$ertidas delante de los caracteres
%ue necesitan marcarse en consultas de "ases de datos y en otras operaciones en las %ue
inter$ienen esos caracteres. .os estamos refiriendo a la comilla simple )%+' a la comilla do"le
)&+' a la "arra in$ertida )'+ y a .U3 )"yte nulo+.
3a forma de prote!er estos caracteres' para %ue no sean interpretados por el 5hell o por PHP
como caracteres si!nificati$os' es poner una "arra in$ertida )Slash+ delante de los mismos.
Por e/emplo' si a la $aria"le $consulta le asi!namos el $alor 67HE8E nom 9 :1na;6' las
comillas simples interiores sern interpretadas como caracteres si!nificati$os' pero
necesitamos %ue sean interpretados como comillas. 1s# pues' con la funcin addSlashes() lo
conse!uimos de esta forma4
$consulta="WHERE nom = 'Ana'";
// As la variale $consulta contendr! WHERE nom = "Ana#
$consulta=addSlashes($consulta);
// As la variale $consulta contendr! WHERE nom = $"Ana$#
3a funcin stripSlashes() de$uel$e una cadena sin "arras in$ertidas delante de la comilla
simple )%+' la comilla do"le )&+' la "arra in$ertida )'+ y el $alor .U33. Esta funcin' pues' realiza
la funcin in$ersa de la funcin anterior.
5i!uiendo con el e/emplo anterior podemos usarla de esta forma4
$consulta="WHERE nom = 'Ana'";
// As la variale $consulta contendr! WHERE nom = 'Ana'
$consulta=addSlashes($consulta);
// As la variale $consulta contendr! WHERE nom = $'Ana$'
$consulta=stri%Slashes($consulta);
// As la variale $consulta contendr! WHERE nom = 'Ana'
En la Unidad <' dentro del apartado (ectura de datos desde una p)*ina web' ya nos hemos
referido a la funcin urlencode()' %ue preser$a los espacios de un texto para %ue H203 los
respete como tales. Veamos ahora con mayor detalle esta funcin y su contraria.
3a funcin urlencode()de$uel$e una cadena en la %ue todos los caracteres no alfanum(ricos'
excepto *' +' y.' son reemplazados por un si!no de porcenta/e )=+ se!uido por dos d#!itos
hexadecimales. 3os espacios son sustituidos por si!nos positi$os )>+. Es con$eniente usar esta
funcin para escri"ir una cadena de texto %ue $a a ser usada dentro del cdi!o H203 %ue
forma parte de una U83 )direccin ?e"+. 2am"i(n es una forma adecuada de pasar $aria"les a
la p!ina si!uiente. 3o ms frecuente es %ue la usemos para %ue H203 respete los espacios
en "lanco %ue haya dentro del texto.
Veamos en un e/emplo cmo se producen las con$ersiones4
2 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
$='&A HRE' = ( ) "*o+,-./ura 0 ) 1 2 //';
echo $."&*3";
/4 A5u se muestra la misma cadena 5ue hemos
escrito entre comillas sim%les. 4/
echo urlencode($);
/4 A5u se muestra la cadena 678A9HRE'967:9(9)
996;;*o6'0,67'./ura9096;<96;796;=96;'6;' 4/
Con$iene o"ser$ar %ue los espacios se representan con el si!no >' las letras' excepto la @' y
los nAmeros se de/an i!ual' y los dems si!nos' como B' 9' +' etc(tera' son sustituidos por el
si!no = se!uido de dos d#!itos en "ase hexadecimal.
3a funcin urldecode()realiza la operacin in$ersa de la anterior. Por e/emplo' si escri"imos las
instrucciones
$c='SELECT+ALL+FROM+tabla+WHERE+nombre%3D%22JUANA%22';
$d=urldecode($c);
echo $d."<P>";
la p!ina muestra la cadena ori!inal
SE>E8? A>> 'R@A tala WHERE nomre="BCADA"
3as funciones rawurlencode() y rawurldecode() )cdi!o puro para U83+ se comportan
prcticamente i!ual %ue las dos anteriores' con la diferencia de %ue (stas no con$ierten en
cdi!o H203 las letras' los nAmeros y el carcter de su"rayado )++' pero s# codifican en el
mismo los si!nos *' y. Usando las primeras se consi!uen efectos ms amplios' por lo %ue
recomendamos su uso preferente.
3a funcin nl2br() se utiliza tam"i(n para dar formato a las salidas en H203. Esta funcin
transforma los cdi!os de salto de l#nea de los ficheros de texto en cdi!os de salto de l#nea
propios de H203 conser$ando los anteriores. 5e utiliza principalmente para or!anizar el texto
introducido en 2EC218E1 de un formulario. Cam"ia' pues' la orden Dn )salto de l#nea en un
fichero de texto+ en B"rE )salto de l#nea en cdi!o H203+ produciendo un salto de l#nea real'
tanto en el cdi!o H203 de$uelto al interpretarse el cdi!o PHP como en la p!ina web %ue
se muestra.
Por e/emplo' si escri"imos las si!uientes instrucciones
$frase="Primero \n Segundo \n Tercero";
echo "<br> \n";
echo "Sin aplicar saldo de lnea HTML: \"$frase\"";
echo "<br> \n";
$frase=nl2br($frase);
echo "Aplicando salto de lnea HTML: \"$frase\"";
se de$uel$e al si!uiente cdi!o H203
&H?A>3
&HEA:3&/HEA:3
&E@:F3
&r3
3 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Sin a%licar salto de lnea H?A>G "*rimero
SeHundo
?ercero"&r3
A%licando salto de lnea H?A>G "*rimero &r3
SeHundo &r3
?ercero"
&/E@:F3
&/H?A>3
y se !enera la si!uiente p!ina4
Sin a%licar saldo de lnea H?A>G "*rimero SeHundo ?ercero"
A%licando salto de lnea H?A>G "*rimero
SeHundo
?ercero"
5e puede o"ser$ar %ue los saltos de l#nea del fichero de texto 'n mediante la funcin nl;r()
han sido sustituidos en el cdi!o H203 por saltos de l#nea ,br-.
(i.piar cadenas de caracteres
3a funcin chop/0 elimina los espacios en "lanco %ue haya al final de una cadena de
caracteres' incluyendo los cdi!os de fin de l#nea si los hu"iere.
Por e/emplo' la instrucciones
$I=">a ciencia es un con/unto de verdades $n ";
$H=cho%($I);
echo ">a variale $$I contiene ".strlen($I)."
caracteres de los 5ue ".(strlen($I))strlen($H)).
"son es%acios en lanco o saltos de lnea.&*3";
echo "En camioJ si usamos la IunciKn cho%()
la variale $$I contiene sKlo ".strlen($H).
"caracteres.&*3";
!eneran la p!ina si!uiente4
>a variale $I contiene LL caracteres de los 5ue M son es%acios en lanco o saltos de
lnea.
En camioJ si usamos la IunciKn cho%() la variale $I contiene sKlo 7M caracteres.
1l!o ms a"a/o se $er %ue la funcin strlen() de$uel$e el nAmero de caracteres %ue tiene
una cadena.
3a funcin ltrim() elimina los espacios en "lanco %ue haya al principio de una cadena de
caracteres.
Por e/emplo' las instrucciones
$h=" >a ciencia es un con/unto de verdades";
$i=ltrim($i);
4 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
echo ">a variale $$h contiene ".strlen($h)." caracteres
de los 5ue ".(strlen($h))strlen($i))."son es%acios
en lanco.&*3";
echo "En camioJ si usamos la IunciKn ltrim() la variale
$$i contiene sKlo ".strlen($i)." caracteres.&*3
Ha %erdido los es%acios en lanco iniciales.&*3";
!eneran la p!ina si!uiente4
>a variale $h contiene L; caracteres de los 5ue N son es%acios en lanco.
En camioJ si usamos la IunciKn ltrim() la variale $h contiene sKlo 7M caracteres.
Ha %erdido los es%acios en lanco iniciales.
3a funcin trim() es una com"inacin de las dos anteriores4 elimina los espacios en "lanco
%ue haya al principio y al final de una cadena.
Por e/emplo' si $lim%ia contiene 6 casa 6' la instruccin echo trim($lim%ia) de$uel$e
6casa6.
3a funcin strip_tags() elimina los controles H203 de una cadena. Por e/emplo' las
instrucciones si!uientes
$5uita(html="&H03?eOto Hrande&/H03 &E3DeHrita&/E3&*3";
echo $5uita(html."&*3";
echo stri%(taHs($5uita(html);
!eneran esta p!ina
Texto grande
Negrita
?eOto Hrande DeHrita
Puede o"ser$arse %ue en el primer echo se e/ecutan los cdi!os H203. En cam"io' en el
se!undo' al eliminarse estos controles con stri%(taHs()' se muestra el texto sin ellos.
(etras .ay1sculas y letras .in1sculas
1l!unas funciones permiten con$ertir todos o slo al!unos caracteres de una cadena en
mayAsculas o minAsculas se!An nos con$en!a. 5on muy fciles de usar. 8esumimos las ms
importantes.
Funcin strtoupper()4 de$uel$e la misma cadena con$irtiendo todos sus caracteres en
mayAsculas.
E/emplo4 si $a contiene 6Pepe6' echo strtou%%er($a); de$uel$e 6PEPE6.
Funcin strtolower()4 de$uel$e la misma cadena con$irtiendo todos sus caracteres en
minAsculas.
5 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
E/emplo4 si $A contiene 6PEPe6' echo strtolo,er($A); de$uel$e 6pepe6.
Funcin ucfirst()4 de$uel$e la misma cadena con$irtiendo su primer carcter en mayAscula si
es una letra.
E/emplo4 si $A0 contiene 6diosa6' echo ucIirst($A0); de$uel$e 6Giosa6.
Para %ue esta funcin ten!a en cuenta el alfa"eto completo espa@ol en mayAsculas' so"re todo
si las letras tienen tilde' como 6H!uila6' hay %ue esta"lecer su confi!uracin pre$iamente con la
funcin setlocale (LC_ALL!spanish!)". Estos $alores son los formatos de hora' moneda'
alfa"eto' separador de decimales' etc(tera.
Funcin ucwords()4 de$uel$e la misma cadena con$irtiendo el primer carcter de todas las
pala"ras en mayAscula.
E/emplo4 si $A(%al contiene 6diosa de la anti!Iedad e!ipcia6' la instruccin echo
uc,ords($A(%al); de$uel$e 6Giosa Ge 3a 1nti!Iedad E!ipcia6.
Conocer la lon*itud de una cadena
Funcin strlen()4 de$uel$e la lon!itud de una cadena expresada en $alor num(rico entero.
Cuenta todas las posiciones' aun%ue sean espacios en "lanco. Ja hemos $isto cmo se usa en
las funciones chop()' ltrim() y trim().
E/emplo4 si $larHo contiene 6diosa de la anti!Iedad e!ipcia6' la instruccin echo
strlen($larHo); de$uel$e el $alor num(rico 3-.
2epetir una cadena
Funcin str_repeat()4 de$uel$e la misma cadena %ue toma como primer ar!umento repetida
tantas $eces como se indi%ue en el se!undo ar!umento.
E/emplo4 si $re%e contiene 6diosaBPE6' echo str(re%eat($re%eJ7); de$uel$e la cadena 6diosa6
repetida tres $eces en distintas l#neas.
odificar al*unos caracteres de una cadena
Funcin strtr()4 de$uel$e la misma cadena sustituyendo los caracteres de la misma %ue se
indi%uen en el se!undo ar!umento por los %ue se indi%uen en el tercer ar!umento haci(ndolos
e%ui$aler uno a uno.
E/emplo4 si $camia contiene 63os d#as perdidos en $erano6 y necesitamos sustituir las as por
us y las os por as' podemos escri"ir la sentencia si!uiente4 echo strtr($camiaJ"ao"J"ua");
3a funcin de$ol$er la cadena 63as d#us perdidas en $eruna6.
3uscar dentro de las cadenas
Hay funciones %ue permiten "uscar dentro de una cadena. .o se usan con frecuencia' por lo
6 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
cual %uien lo necesite puede o"tener informacin en el 0anual so"re las mismas. .os
limitamos a enumerar las principales y a indicar para %u( sir$en4
strcspn()4 de$uel$e el nAmero del primer carcter de la primera cadena )primer
ar!umento+ %ue encuentre en la se!unda cadena )se!undo ar!umento+. 5e cuenta
desde - en adelante.
strspn()4 de$uel$e el nAmero de caracteres iniciales de la cadena pasada como primer
ar!umento %ue aparecen en la cadena pasada como se!undo ar!umento comparando
de (sta slo los caracteres %ue coincidan consecuti$amente.
strpos()4 de$uel$e el nAmero de la posicin del primer carcter de la primera cadena
)primer ar!umento+ %ue coincida con la se!unda cadena completa )se!undo ar!umento+.
5e cuenta desde - en adelante. 1dmite un tercer ar!umento' %ue es el nAmero a partir
del cual de"e "uscarse el texto de la se!unda cadena en la primera.
strrpos()4 de$uel$e el nAmero de la posicin del Altimo carcter de la primera cadena
)primer ar!umento+ %ue coincida con la se!unda cadena completa )se!undo ar!umento+.
5e cuenta desde - en adelante. 1 partir de PHP 5 admite un tercer ar!umento' %ue es el
nAmero )siempre ne!ati$o+ a partir del cual de"e "uscarse el texto de la se!unda cadena
en la primera.
strrchr()4 de$uel$e la su"cadena %ue comprende el fra!mento de la primera cadena
)primer ar!umento+ %ue $a desde la Altima aparicin del carcter pasado como se!undo
ar!umento hasta el final de la primera cadena.
strstr()4 de$uel$e una su"cadena de la cadena pasada como primer ar!umento %ue
comprende desde la primera aparicin de la cadena pasada como se!undo ar!umento
hasta el final de la primera cadena.
Pueden $erse e/emplos de estas funciones en el Ejemplo 1 y analizar su sintaxis y los
$alores %ue de$uel$e.
Operaciones con subcadenas
3a funcin substr() de$uel$e una su"cadena de la cadena %ue se pasa como primer
ar!umento. Esta su"cadena contiene los caracteres de la cadena desde la posicin %ue se
indica en el se!undo ar!umento' %ue de"e ser un nAmero entero' hasta el nAmero %ue se
indi%ue en el tercer ar!umento.
Por e/emplo' echo sustr("Aemorias de PIrica"J7JL) de$uel$e la su"cadena 6oria6. Con$iene
o"ser$ar %ue la cuenta empieza desde -.
3a sintaxis de esta funcin puede ser $ariada4
5in tercer ar!umento4 se de$uel$e desde la posicin inicial hasta el final.
Con un se!undo ar!umento ne!ati$o4 se de$uel$e desde el final de la cadena tantos
caracteres como se indi%ue en ese nAmero ne!ati$o.
Con un se!undo ar!umento ne!ati$o y un tercero positi$o4 se de$uel$en tantos
caracteres como se indi%ue en el tercer ar!umento desde la posicin del final de la
7 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
cadena %ue se indi%ue en el se!undo ar!umento.
Pueden $erse ms e/emplos de esta funcin en el Ejemplo 1 ya citado.
3a funcin substr_replace() sustituye una su"cadena de la cadena %ue se pasa como primer
ar!umento con la su"cadena %ue se pasa como se!undo ar!umento desde la posicin de inicio
%ue se pasa como tercer ar!umento tantos caracteres como se indi%ue en el cuarto ar!umento.
Propia de PHP 5.
Por e/emplo'
echo sustr(re%lace("Aemorias de PIrica"J"en"JQJ;) de$uel$e la
cadena como "Aemorias en PIrica6.
En la sintaxis de esta funcin tam"i(n pueden darse $arias circunstancias4
Con un tercer ar!umento ne!ati$o4 se cam"ian los caracteres contando desde el final
de la cadena.
Con cuarto ar!umento ne!ati$o4 la nue$a cadena estar formada por el texto del
se!undo ar!umento desde la posicin del tercer ar!umento ms los caracteres
especificados en el cuarto ar!umento contado desde el final de la cadena.
5in cuarto ar!umento4 la nue$a cadena estar formada por el texto del se!undo
ar!umento desde la posicin del tercer ar!umento ms los caracteres pre$ios a la
posicin del tercer ar!umento.
Pueden $erse ms e/emplos de esta funcin en el Ejemplo 1.
3a funcin strto#() separa una cadena de texto )primer ar!umento+ en "lo%ues se!An el
separador indicado en el se!undo ar!umento.
Puede $erse en el Ejemplo 1 cmo separamos una frase en pala"ras con esta funcin
tomando como separador los espacios en "lanco %ue hay entre ellas.
3a funcin parse_str() trata una cadena de caracteres como si su informacin se pasase a
otra p!ina mediante la U83. Con$iene o"ser$ar %ue esa cadena de"e tener el formato
adecuado. Por e/emplo' las sentencias
$variales="nom=Dacho2a%e0=Roa2a%e;=Eastos"J
%arse(str($variales);
define las $aria"les $nom' $a%e0 y $a%e;' y les asi!na los $alores 6.acho6' 68oa6 y 6Kastos6'
respecti$amente. 1s# puede pasarlas a otra p!ina.
Invertir el te$to de una cadena
8 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
3a funcin strre$() reci"e una cadena de caracteres y la de$uel$e al re$(s.
Por e/emplo' la sentencia echo strrev("%aseo"); de$uel$e 6oesap6.
Co.parar cadenas
3a funcin strcasecmp() compara dos cadenas pasadas como ar!umentos sin distin!uir entre
letras mayAsculas y minAsculas y de$uel$e un nAmero entero' %ue es un cero si son i!uales' un
nAmero mayor %ue cero si la primera es mayor %ue la se!unda y un nAmero menor %ue cero si
la primera es menor %ue la se!unda.
Por e/emplo' la instruccin strcasecm%("AE8"J"ac") de$uel$e 4' la instruccin
strcasecm%("8AE"J"ac") de$uel$e 5 y la instruccin strcasecm%("AE8"J"ca") de$uel$e 65.
1l estudiar los operadores de comparacin en la Unidad & se explic cmo se comparan los
datos de tipo cadena.
3a funcin strcmp() compara dos cadenas pasadas como ar!umentos distin!uiendo entre
letras mayAsculas y minAsculas y de$uel$e los mismos $alores %ue la funcin anterior con la
sal$edad indicada. En el mismo e/emplo anterior' las tres instrucciones siempre de$ol$er#an 5.
Otras funciones de cadena 1tiles
3a funcin chr()reci"e un nAmero entero y de$uel$e el carcter correspondiente del cdi!o
15CLL.
Por e/emplo' echo chr(=N); de$uel$e la letra # mayAscula.
3a funcin ord()reci"e un carcter del cdi!o 15CLL y de$uel$e el nAmero entero
correspondiente.
Por e/emplo' echo ord("A"); de$uel$e el nAmero 78.
3a funcin number_format() permite formatear un nAmero como nos con$en!a. 8eci"e un
nAmero de coma flotante como primer ar!umento y de$uel$e una cadena con un determinado
nAmero de decimales fi/ado en el se!undo ar!umento' separado de la parte entera por un si!no
especificado en el ar!umento tercero y un separador de los miles %ue se fi/a en el ar!umento
cuarto.
Por e/emplo' si la $aria"le $numero contiene el $alor &<3M.5NO, )el punto es el separador
decimal+' la instruccin echo numer(Iormat($numeroJ7J"J"J"."); de$uel$e la cadena
9.5:;,87<.
Es importante sa"er cmo estn definidos los $alores de confi!uracin local de PHP para los
puntos decimales. En la funcin si!uiente se explica este asunto.
3a funcin setlocale() esta"lece los $alores de distintas cate!or#as %ue pueden ser diferentes
para distintas confi!uraciones locales' como la con$ersin y clasificacin de caracteres en los
di$ersos idiomas' los separadores de decimales' el formato de fecha y hora' as# como la
comparacin de cadenas y de monedas.
9 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Por e/emplo' la instruccin setlocale(>8(A>>J"s%anish") fi/a todas las cate!or#as disponi"les
)3CP1334 con$ersin y clasificacin de caracteres en los diferentes idiomas' separadores de
decimales y formato de fecha y hora+ para el entorno espa@ol' %ue en la mayor#a de las
cate!or#as es i!ual al europeo.
=uevas funciones de !"! 8
3a funcin str_split()con$ierte una cadena en una matriz. Como se!undo ar!umento en esta
funcin podemos indicar el nAmero de caracteres %ue %ueremos usar.
Por e/emplo' $matriR= str(s%lit("esto es as"J 7); de$uel$e la matriz4
$matriR= ArraS ( T =3 "est"J 0 =3 "o e"J ; =3 "s a"J 7 =3 "s" ).
3a funcin strpbr#() "usca en una cadena cual%uier caracter de otra y de$uel$e la su"cadena
desde ea posicin.
Por e/emplo' echo str%rU("Esto es una %ruea"J '%o'); de$uel$e el resultado4
6o es una prue"a6 por%ue primero encuentra el caracter 6o6 antes %ue 6p6.
Gesde el !ro*ra.a *estor del curso puede a"rirse el Ejemplo 1 de esta Unidad. El "otn
E/ecutar muestra en la p!ina el resultado de su interpretacin. Con el "otn Cod fuente se
accede la cdi!o PHP del mismo. En este e/ercicio se incluye la mayor#a de los e/emplos cuyo
cdi!o hemos ido escri"iendo /unto a las funciones explicadas y otros nue$os %ue no aparecen
en el texto anterior.
3 - Tratamiento de fechas
El uso de fechas es muy frecuente e imprescindi"le en Lnternet. PHP dispone tam"i(n de
funciones para tratar y o"tener fechas. En este se!undo apartado $amos a estudiar las ms
importantes y necesarias' as# como su aplicacin en las p!inas web .
En el Captulo >VII. Funciones de fecha y hora del anual de !"! )puede encontrarse en la
ayuda del Editor de$*PHP+ aparecen hasta &3 funciones de fecha.
Co.probar la validez de una fecha
3a funcin chec?date/0 nos permite compro"ar si una fecha' %ue se pone como ar!umento' es
$lida. 5i lo es' la funcin de$uel$e el $alor True )$erdadero+. En el caso contrario' de$uel$e
False )falso+.
5e considera como $lida una fecha cuando su a@o est comprendido entre los a@os - y el
3<ONO' su mes entre & y &<' y su d#a entre & y <, para fe"rero no "isiesto' <Q para fe"rero
"isiesto' 3- para a"ril' /unio' septiem"re y no$iem"re' y 3& para el resto de los meses. 1s#
pues' esta funcin controla los a@os "isiestos al compro"ar la $alidez de una fecha.
3a sintaxis de esta funcin es checUdate(mesJdaJa+o); donde los tres parmetros son
nAmeros enteros. Con$iene o"ser$ar el orden en %ue de"en introducirse los parmetros' ya
%ue no coinciden con la posicin ha"itual de nuestras fechas )d#a'mes'a@o+
10 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Por e/emplo' la instruccin checUdate(TJ;NJ;TTT); de$uel$e False. En cam"io la instruccin
checUdate(MJ;NJ;TTT); de$uel$e True.
Pueden $erse e/emplos de esta funcin en el Ejemplo 2 de esta Unidad.
@ar for.ato a una fecha y una hora
3a funcin date/0 de$uel$e una cadena de texto %ue refle/a una fecha y una hora formateadas
como se indi%ue en el primer parmetro. En el se!undo ar!umento puede indicarse la fecha
%ue se %uiere mostrar utilizando un $alor de tipo timestamp )instante calculado como nAmero
de se!undos transcurridos desde el &R&R&QO-' (poca U.LC+. 5i no se especifica este se!undo
parmetro' se muestra la hora actual.
3a sintaxis de esta funcin es4
date(cadena de IormatoJ nVmero entero del instante o nada);
Aabla de caracteres y su si*nificado en la cadena de for.ato
Bi*no @escripcin de su resultado en la p)*ina web
a 6am6 o 6pm6
# 6106 o 6P06
d d#a del mes' dos d#!itos con cero a la iz%uierdaS es decir' de 6-&6 a 63&6
@ d#a de la semana' en texto' con tres letrasS por e/emplo' 6Fri6
F mes' en texto' completoS por e/emplo' 6Tanuary6
h hora' de 6-&6 a 6&<6
" hora' de 6--6 a 6<36
* hour' sin ceros' de 6&6 a 6&<6
C hour' sin cerosS de 6-6 a 6<36
i minutosS de 6--6 a 65Q6
j d#a del mes sin cero inicialS de 6&6 a 63&6
l d#a de la semana' en texto' completoS por e/emplo' 6Friday6
( 6&6 or 6-6' se!An si el a@o es "isiesto o no
. mesS de 6-&6 a 6&<6
n mes sin cero inicialS de 6&6 a 6&<6
mes' en texto' 3 letrasS por e/emplo' 6Tan6
s se!undosS de 6--6 a 65Q6
B sufi/o ordinal en in!l(s' en texto' < caracteresS por e/emplo' 6th6' 6nd6
t nAmero de d#as del mes dadoS de 6<,6 a 63&6
U se!undos desde el $alor de UepochU
D d#a de la semana' en nAmero' de 6-6 )domin!o+ a 6N6 )s"ado+
E a@o' cuatro cifrasS por e/emplo' 6&QQQ6
y a@o' dos cifrasS por e/emplo' 6QQ6
z d#a del a@oS de 6-6 a 63N56
F diferencia horaria en se!undos )de 6*M3<--6 a 6M3<--6+
Con$iene o"ser$ar %ue esta cadena no utiliza cate!or#as locales' por lo cual los nom"res de los
d#as y los meses aparecen en in!l(s. Para formatear una fecha y mostrar su resultado' es
me/or utilizar la funcin strfti.e/0' %ue se explica despu(s.
11 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
G$traer infor.acin de una fecha
3a funcin *etdate/0 se usa para extraer informacin de una fecha dada. 2ampoco admite
cate!or#as locales y' por tanto' la informacin literal est en in!l(s.
3a sintaxis de esta funcin es4
Hetdate(nVmero entero del instante);
El instante es un nAmero referido a los se!undos transcurridos desde el d#a &R&R&QO- hasta la
fecha. 3a informacin o"tenida se almacena en un array cuyos #ndices son los si!uientes4
&. VsecondsH4 nAmero de se!undos
<. V.inutesH4 nAmero de minutos
3. VhoursH4 nAmero de horas
M. V.dayH4 d#a del mes
5. V.onH4 nAmero de mes
N. VyearH4 a@o
O. VydayH4 d#a del a@o
,. VDee?dayH4 nom"re del d#a de la semana
Q. V.onthH4 nom"re del mes.
Por e/emplo' la instruccin $Iecha=Hetdate(); asi!na al array $Iecha los nue$e contenidos
indicados antes. En el Ejemplo 2 de esta Unidad pueden $erse los resultados !enerados en
la p!ina web con esta informacin.
3a funcin .?ti.e/0 se usa para extraer el $alor timestamp de una fecha. Gespu(s' podemos
utilizar este $alor como ar!umento de otros funciones. El t(rmino timestamp se refiere al
momento exacto de una fecha concreta expresado en se!undos desde el d#a & de enero de
&QO- )(poca U.LC+. Esta funcin nos permite hallar el nAmero de se!undos %ue han
transcurrido desde entonces hasta la fecha %ue especifi%uemos.
3a sintaxis de esta funcin es
mUtime(horasJminutosJseHundosJmesJdaJa+o);
Por e/emplo' si %ueremos sa"er el momento timestamp del d#a &N de diciem"re de &QQQ' a las
&- horas' &5 minutos y <- se!undos' de"emos escri"ir la instruccin
$momento=mUtime(0TJ0NJ;TJ0;J0=J0<<<);. El resultado es <LN77<7;T.
1hora podemos dar este nAmero como ar!umento de la funcin !etdate)+ y o"tenemos la
misma fecha %ue le dimos a mWtime)+. Esta funcin es' adems' muy Atil para compro"ar
fechas y compararlas.
12 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
@ar for.ato a una fecha traduciendo los no.bres
3a funcin strfti.e/0 se usa para formatear una fecha teniendo en cuenta las especificaciones
y cate!or#as locales. 1s# soslayamos los pro"lemas de este tipo %ue plantean las funciones
date)+ y !etdate)+.
3a sintaxis de esta funcin es
strItime(cadena de IormatoJinstante);
5i no se proporciona el se!undo parmetro' %ue es el nAmero de se!undos' se toma la hora
del sistema. Veamos ahora los si!nos de la cadena de formato y sus resultados en la
presentacin de una fecha.
Aabla de caracteres y su si*nificado en la cadena de for.ato
Bi*n
o
@escripcin de su resultado en la p)*ina web
Ia
nom"re del d#a de la semana a"re$iado
I#
nom"re del d#a de la semana completo
Ib
nom"re del mes a"re$iado
I3
nom"re del mes completo
Ic
representacin de fecha y hora preferidas en el idioma actual
Id
d#a del mes en nAmero )de -- a 3&+
I"
hora como un nAmero de -- a <3
II
hora como un nAmero de -& a &<
Ij
d#a del a@o como un nAmero de --& a 3NN
I.
mes como un nAmero de -& a &<
I
minuto en nAmero
Ip
am; o :pm;' se!An la hora dada' o las cadenas correspondientes en el idioma actual
IB
se!undos en nAmero
IU
nAmero de la semana en el a@o' empezando con el primer domin!o como el primer
d#a de la primera semana
IJ
nAmero de la semana en el a@o' empezando con el primer lunes como el primer d#a
de la primera semana
13 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
ID
d#a de la semana en nAmero )el domin!o es el -+
I$
representacin preferida de la fecha sin la hora
I>
representacin preferida de la hora sin la fecha
Iy
a@o en nAmero de -- a QQ
IE
a@o en nAmero de cuatro cifras
IF
nom"re o a"re$iatura de la zona horaria
II
carcter U=U
5i %ueremos %ue los nom"res aparezcan en castellano' a%u# s# podemos incluir en el script la
instruccin setlocale(>8(A>>J"s%anish"); para traducirlos. En el Ejemplo 2 de esta Unidad
puede $erse el cdi!o %ue escri"imos en la sintaxis de esta funcin y los efectos %ue produce.
=uevas funciones en !"! 8
3a funcin idate/0 se usa para o"tener el nAmero entero de una fecha se!An el formato escrito
en el primer parmetro.
Por e/emplo' si %ueremos sa"er el momento el nAmero del a@o actual' de"emos escri"ir la
instruccin echo idate('S');. El resultado es N.
3a funcin date+sunset/0 y date+sunrise/0 se usa para o"tener la hora de la puesta de sol y
amanecer respecti$amente para un d#a y u"icacin determinados.
En el Ejemplo 2 de esta Unidad puede $erse el cdi!o %ue escri"imos en la sintaxis de esta
funcin y los efectos %ue produce.
(eer una fecha desde una p)*ina web
Xsta es una de las operaciones ms frecuentes en Lnternet. 3a me/or forma de leer una fecha
desde una p!ina web es utilizar un formulario. 1 partir de esa informacin con la funcin
time() o"tenemos una fecha' compro"amos si es correcta y le damos el formato %ue sea
necesario con la funcin strItime(). 5i los nom"re de los d#as o de los meses aparecen en
in!l(s' ya sa"emos %ue con la instruccin %ue hemos citado antes
setlocale(>8(A>>JidentiIicador(local); podemos hacer %ue se muestre en el idioma %ue
%ueramos.
En el cdi!o del Ejercicio 2 de esta Unidad se lle$a a ca"o el proceso explicado. En el
mismo puedes $er el resultado.
Gesde el !ro*ra.a *estor del curso puede a"rirse el Ejercicio 2 de esta Unidad. El "otn
E/ecutar muestra en la p!ina el resultado de su interpretacin. Con el "otn Cod fuente se
accede al cdi!o PHP del mismo. En este e/ercicio se incluye la mayor#a de los e/emplos cuyo
cdi!o hemos ido escri"iendo /unto a las funciones explicadas y otros nue$os %ue no aparecen
14 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
en el texto anterior.
4 - Tratamiento de arrays
Hemos $isto %ue una $aria"le tiene un nom"re %ue de"e iniciarse por el si!no dlar )Y+ y un
$alor de uno de los tipos %ue soporta PHP. Pero en una $aria"le slo podemos introducir un
$alor. ZHay al!una forma de asi!nar ms de un $alor a un identificador[ 5#' pero hay %ue usar
arrays' %ue son con/untos de datos de diferentes tipos %ue se asi!nan a un solo nom"re.
Un array o .atriz se caracteriza por tres cosas4
Est inte!rado por mAltiples elementos )elements+.
2iene un #ndice )key o index+ para referirse a cada uno de sus elementos. Este #ndice'
tam"i(n llamado su"#ndice' puede ser de tipo num(rico entero o de tipo cadena. En PHP el
#ndice del primer elemento tiene el $alor -' si es de tipo num(rico entero.
Cada elemento tiene un contenido )value+' %ue puede ser de diferente tipo %ue el resto de los
elementos.
5uponemos %ue el alumno o alumna %ue hace este curso ya est familiarizado con las
matrices' por lo cual damos por explicados los principales conceptos so"re los arrays. 1%u# nos
$amos a limitar a resumir "re$emente las principales funciones con las %ue PHP trata este tipo
de datos.
En el Captulo II. Funciones de .atrices del anual de !"! )puede encontrarse en la ayuda
del Editor de$*PHP+ aparecen hasta NM funciones para tratar este tipo de datos.
Crear e inicializar una .atriz
En PHP' como en la mayor#a de los len!ua/es informticos' hay $arias formas de crear un
matriz y de asi!nar $alores a cada uno de sus elementos. En la Unidad &' al explicar este tipo
de datos' ya pusimos $arios e/emplos4
$%ersonaW"nomre"X = "BoseIa";
$%ersonaW"a%ellido0"X = "*YreR";
$%ersonaW"a%ellido;"X = "Ruio";
$%ersonaW"edad"X = =T;
En las cuatro instrucciones anteriores hemos creado la matriz $%ersona' %ue tiene cuatro
elementos %ue se referencian por cuatro #ndices de tipo cadena. Pero tam"i(n pod#amos ha"er
creado e inicializado esta matriz as#4
$%ersonaWX = "BoseIa";
$%ersonaWX = "*YreR";
$%ersonaWX = "Ruio";
$%ersonaWX = =T;
En este se!undo caso' PHP asi!na los #ndice -' &' < y 3 a cada elemento secuencialmente. 3o
15 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
mismo hu"i(ramos conse!uido con la sintaxis
$%ersonaWTX = "BoseIa";
$%ersonaW0X = "*YreR";
$%ersonaW;X = "Ruio";
$%ersonaW7X = =T;
aun%ue ha"r#a resultado ms lar!o e innecesario. .o es preciso asi!nar #ndices %ue sean
$alores num(ricos enteros consecuti$os' si "ien es preciso conocer el nAmero o el nom"re de
los #ndices para poder' despu(s' referirse a los elementos correspondientes.
\tra forma de crear la misma matriz con #ndices de cadena es la si!uiente4
$%ersona = arraS("nomre"=3 "BoseIa"J"a%ellido0"=3 "*YreR"J
"a%ellido;"=3 "Ruio"J"edad"=3=T);
Como puede $erse' esta sintaxis utiliza la pala"ra reser$ada array' pone entre comillas los
#ndices de cadena y usa el si!no K- para asi!nar el $alor a los elementos.
Para crear una matriz "idimensional con las calificaciones o"tenidas por una alumna en las tres
e$aluaciones de 0atemticas' 3en!ua y Gi"u/o usando #ndices alfanum(ricos' podemos
escri"ir lo si!uiente4
$notasW"Aat"XW"*ri"X = "SuIiciente";
$notasW"Aat"XW"SeH"X = "Eien";
$notasW"Aat"XW"?er"X = "Dotale";
$notasW">en"XW"*ri"X = "Soresaliente";
$notasW">en"XW"SeH"X = "Soresaliente;;
$notasW">en"XW"?er"X = "Dotale";
$notasW":i"XW"*ri"X = "Dotale";
$notasW":i"XW"SeH"X = "Eien";
$notasW":i"XW"?er"X = "SuIiciente";
Con la misma filosof#a de #ndices' pod#amos ha"erlo hecho de la forma si!uiente4
$notas = arraS("Aat"=3arraS("*ri"=3"SuIiciente"J
"SeH"=3"Eien"J
"?er"=3"Dotale")J
">en"=3arraS("*ri"=3"Soresaliente"J
"SeH"=3"Soresaliente"J
"?er"=3"Dotale")J
":i"=3arraS("*ri"=3"Dotale"J
"SeH"=3"Eien"J
"?er"=3"SuIiciente"));
L!ualmente' pod#amos ha"er puesto las calificaciones en nAmero y usado #ndices num(ricos
para las e$aluaciones y las asi!naturas' de - a < para am"as. En este caso la matriz Ynotas
ha"r#a %uedado as#4
$notasWTXWTX = 0;
$notasWTXW0X = ;;
$notasWTXW;X = 7;
$notasW0XWTX = L;
16 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
$notasW0XW0X = N;
$notasW0XW;X = =;
$notasW;XWTX = M;
$notasW;XW0X = Q;
$notasW;XW;X = <;
Es ms "re$e' si "ien hay %ue sa"er a %u( asi!natura y e$aluacin pertenece cada #ndice. En
la sintaxis precedente %uedar#a as#4
$notas = arraS(T=3arraS(T=30J0=3;J;=37)J
0=3arraS(T=3LJ0=3NJ;=3=)J
;=3arraS(T=3MJ0=3QJ;=3<));
Como hemos $isto' pues' la funcin arra%() permite crear e inicializar matrices' si "ien no es la
Anica forma de hacerlo.
5u sintaxis es
arraS(lista de elementos se%arados %or comas);
En la lista de elementos se pueden poner $alores de los diferentes tipo de datos %ue admite
PHP. 1dems' es posi"le especificar expresamente un #ndice num(rico o de cadena para
referirse a cada uno de sus elementos.
3a funcin range() de$uel$e una matriz %ue slo contiene los elementos indicados entre dos
nAmeros' am"os incluidos.
5u sintaxis es
ranHe(nVmero entero del lmite inIeriorJ nVmero entero del lmite su%erior);
Por e/emplo' si creamos la matriz $numeros=ranHe(;J=) la matriz resultante tiene cinco
elementos4 el primero contiene el $alor < y el Altimo' el $alor N.
En el Ejemplo 3 de esta Unidad puede $erse cmo se usan estas funciones y la p!ina %ue
!eneran.
2ecorrer los ele.entos de una .atriz unidi.ensional
3as matrices tienen un puntero %ue apunta a uno de sus elementos. Cuando se accede o usa
por primera $ez una matriz' el puntero est posicionado so"re el primer elemento. Pero no
siempre est so"re este elemento' ya %ue el puntero puede ha"erse mo$ido para leer o
modificar el contenido de la matriz.
3a operacin de recorrer los elementos de una matriz se lle$a a ca"o de forma diferente se!An
se trate de matrices secuenciales' es decir' %ue tienen ordenados sus elementos por un #ndice
ordinal como -' &' <' 3' etc(tera' o de matrices no secuenciales' es decir' %ue no tienen
ordenados sus elementos por un #ndice ordinal.
5i creamos una matriz sin utilizar expresamente un #ndice' PHP le asi!na un #ndice ordinal
num(rico secuencial' %ue se inicia con el $alor -. 1s# pues' los elementos %uedarn ordenados
por su #ndice desde - hasta su elemento n*&.
17 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Pero podemos crear una matriz asi!nndole un #ndice num(rico %ue no est( ordenado o
incluso un #ndice de tipo cadena desordenado. Por e/emplo' pod#amos ha"er creado e
inicializado as# la matriz $%ersona4
$%ersonaW0TX= "BoseIa";
$%ersonaW;X = "*YreR";
$%ersonaWNX = "Ruio";
$%ersonaW0X = =T;
En este caso el primer elemento contendr#a tam"i(n 6Tosefa6' pero si %ueremos acceder al
mismo por su #ndice de"er#amos citar el &-. 1s# pues' esta matriz est desordenada por su
#ndice. Veremos ms adelante cmo ordenar matrices por su #ndice o por el contenido de sus
elementos.
3a funcin reset() coloca el puntero de una matriz so"re su primer elemento y de$uel$e su
contenido. Por e/emplo' la instruccin echo reset($%ersona); de$uel$e 6Tosefa6.
Cuando conocemos %ue el #ndice utilizado en una matriz es de tipo num(rico entero secuencial
)-' &' <'...+' la forma ms fcil de acceder a cada elemento es usar la funcin count() para
sa"er cuntos elementos tiene. Gespu(s' podemos utilizar un "ucle Ior para recorrer todos sus
elementos.
3a funcin end() coloca el puntero de una matriz so"re su Altimo elemento y de$uel$e su
contenido. Por e/emplo' la instruccin echo end($%ersona); de$uel$e N-.
3a funcin count() )podemos in$ocar tam"i(n esta funcin con si&eof()' ya %ue se trata de
un alias' al!o as# como un sinnimo) cuenta los elementos %ue inte!ran una matriz y de$uel$e
un nAmero entero. Por e/emplo' la instruccin echo count($%ersona); de$uel$e M. 3a
instruccin echo siReoI($%ersona); tam"i(n de$uel$e M.
1 partir de esta informacin' podemos recorrer los elementos y mostrar su contenido con un
"ucle' de esta forma4
$numero(elementos=count($%ersona);
Ior ($i=T; $i & $numero(elementos; $i99)
echo $%ersonaW$iX."&*3";
Podemos pensar %ue nos hu"i(ramos e$itado una instruccin si ponemos la funcin count()
como parte de la condicin dentro de Ior. .o es con$eniente hacerlo por dos moti$os4
&. E$itar %ue se e/ecute la funcin cada $ez %ue se pase por el "ucle con la consi!uiente
p(rdida de tiempo al contar siempre lo mismo.
<. E$itar un mal funcionamiento del "ucle si dentro de las instrucciones del "ucle se altera el
nAmero de elementos de la matriz con la funcin unset().
En cam"io' si %ueremos recorrer una matriz "idimensional' no podemos usar la funcin
count()' sino %ue de"emos utilizar dos "ucles' uno anidado en el otro de esta forma4
Ior ($i=T; $i & 7; $i99)
Z
Ior ($/=T; $/ & 7; $/99)
18 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
echo "&E3".$notasW$iXW$/X." ) &/E3";
[
En el Ejemplo 3 de esta Unidad puede $erse cmo funciona este cdi!o.
3a funcin next() de$uel$e el contenido del si!uiente elemento se!An la posicin donde est( el
puntero y desplaza (ste a esa posicin nue$a. 5i se ha alcanzado el Altimo elemento' esta
funcin de$uel$e False.
Por e/emplo' la instruccin echo neOt($%ersona); de$uel$e 6P(rez6 si el puntero esta"a so"re
el elemento primero antes de e/ecutarse la funcin.
En el Ejemplo 3 de esta Unidad puede $erse cmo funciona este cdi!o.
3a funcin pre$() de$uel$e el contenido del elemento anterior se!An la posicin donde est( el
puntero y desplaza (ste a esa posicin nue$a. 5i se ha alcanzado el primer elemento' esta
funcin de$uel$e False.
Por e/emplo' la instruccin echo %rev($%ersona); de$uel$e 6P(rez6 si el puntero esta"a so"re
el elemento primero antes de e/ecutarse la funcin.
En el Ejemplo 3 de esta Unidad puede $erse cmo funciona este cdi!o.
3a funcin current() de$uel$e el contenido de elemento so"re el %ue est el puntero sin $ariar
su posicin. Por e/emplo' echo current)Ypersona+S de$uel$e 68u"io6 si el puntero est so"re el
elemento 3. 5i se ha so"repasado el Altimo elemento de la matriz' current() de$uel$e False.
1 partir de esta informacin tam"i(n podemos recorrer los elementos y mostrar su contenido
con el "ucle anterior
Ior ($i=T; $i & count($%ersona); $i99)
Z
echo current($%ersona)."&*3";
neOt($%ersona);
[
En el Ejemplo 3 de esta Unidad puede $erse cmo funciona este cdi!o.
3a funcin #e%() de$uel$e el #ndice de la posicin actual del puntero' se trate de un nAmero
entero o de una cadena. Por e/emplo' la instruccin echo UeS($%ersona); de$uel$e 6apellido&6
si el puntero est so"re el se!undo elemento.
Podemos recorrer los elementos y mostrar su #ndice y su contenido con las instrucciones
si!uientes4
$datos=arraS("nomre"=3"BoseIa"J"a%ellido0"=3"*YreR"J
"a%ellido;"=3"Ruio"J"edad"=3=T);
$numero(elementos=count($%ersona);
Ior ($i=T; $i & $numero(elementos; $i99)
Z
$indice=UeS($datos);
echo "\ndiceG&E3 $indice. &/E38ontenidoG &E3$%ersonaW$iX&/E3&*3";
neOt($datos);
[
19 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Este cdi!o muestra la p!ina si!uiente4
\ndiceG nombre' 8ontenidoG (osefa
\ndiceG apellido)' 8ontenidoG *+re&
\ndiceG apellido2' 8ontenidoG ,ubio
\ndiceG edad' 8ontenidoG -.
En el Ejemplo 3 de esta Unidad puede $erse cmo funciona este cdi!o.
Convertir cadenas de caracteres en .atrices y viceversa
3a funcin explode() permite con$ertir una cadena de caracteres en una matriz mediante un
separador dado.
5u sintaxis es
eO%lode(car!cter se%aradorJ cadena);
En el Ejemplo 3 de esta Unidad puede $erse cmo se usa esta funcin.
3a funcin implode() lle$a a ca"o la operacin in$ersa4 lle$a los elementos de una matriz a una
cadena separndolos como se indi%ue.
5u sintaxis es
im%lode(car!cter se%aradorJ matriR);
En el Ejemplo 3 de esta Unidad puede $erse cmo se usa esta funcin.
Ordenar .atrices
Ja hemos comentado %ue los elementos de las matrices pueden estar desordenados' "ien por
su #ndice "ien por su contenido. Veamos cmo podemos ordenar los elementos de una matriz
de diferentes formas.
3a funcin arsort() ordena los elementos de una matriz teniendo en cuenta su contenido de
mayor )en el cdi!o 15CLL+ a menor manteniendo la asociacin del contenido de cada
elemento con su #ndice.
5u sintaxis es
arsort(matriR);
Por e/emplo' si tenemos la matriz
$%alaras=arraS("0"=3"amaRona"J";"=3"leKn"J"7"=3"RoRora"J
"L"=3"saueso"J "N"=3"ondad"J"="=3"oVs");
la instruccin arsort($%alaras); de$uel$e la matriz
$%alaras=arraS("7"=3"RoRora"J"L"=3"saueso"J"="=3"oVs"J
";"=3 "leKn"J "N"=3"ondad"J"0"=3"amaRona");
20 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
3a funcin asort() hace exactamente lo mismo %ue la funcin arsort()manteniendo la
asociacin del contenido de cada elemento con su #ndice.
5u sintaxis es
asort(matriR);
Por e/emplo' si tenemos la matriz
$%alaras=arraS("0"=3"amaRona"J";"=3"leKn"J"7"=3"RoRora"J
"L"=3"saueso"J "N"=3"ondad"J"="=3"oVs");
la instruccin asort($%alaras); de$uel$e la matriz
$%alaras=arraS("0"=3"amaRona"J"N"=3"ondad"J ";"=3 "leKn"J
"="=3"oVs"J "L"=3"saueso"J"7"=3"RoRora");
3a funcin rsort() ordena los elementos de una matriz teniendo en cuenta su contenido de
menor )en el cdi!o 15CLL+ a mayor pero sin mantener la asociacin del contenido de cada
elemento con su #ndice.
3a funcin sort() hace exactamente lo mismo %ue la funcin rsort().
3a funcin #rsort() ordena los elementos de una matriz teniendo en cuenta su #ndice de
mayor )en el cdi!o 15CLL+ a menor manteniendo la asociacin de cada #ndice con el contenido
de cada elemento.
5u sintaxis es
Ursort(matriR);
Por e/emplo' si tenemos la matriz
$%alaras=arraS("0"=3"amaRona"J";"=3"leKn"J"7"=3"RoRora"J
"L"=3"saueso"J"N"=3"ondad"J"="=3"oVs");
la instruccin Ursort($%alaras); de$uel$e la matriz
$%alaras=arraS("="=3"oVs"J"N"=3"ondad"J"L"=3"saueso"J
"7"=3"RoRora"J";"=3"leKn"J"0"=3"amaRona");
3a funcin #sort() ordena los elementos de una matriz teniendo en cuenta su #ndice de menor
)en el cdi!o 15CLL+ a mayor manteniendo la asociacin de cada #ndice con el contenido de
cada elemento.
5u sintaxis es
Usort(matriR);
Por e/emplo' si tenemos la matriz
21 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
$%alaras=arraS("0"=3"amaRona"J";"=3"leKn"J"7"=3"RoRora"J
"L"=3"saueso"J"N"=3"ondad"J"="=3"oVs");
la instruccin Usort($%alaras); de$uel$e la misma matriz' pues ya est ordenada se!An su
#ndice' ya %ue' al crearla' hemos colocado los #ndices ordenados.
3a funcin shuffle() de$uel$e una matriz en la %ue los elementos se han ordenado de forma
aleatoria.
5u sintaxis es
shuIIle(matriR);
En el Ejemplo 3 puede o"ser$arse %ue los elementos cam"ian de posicin cada $ez %ue se
actualiza la p!ina al e/ecutarse esta funcin de nue$o y lo hacen de forma aleatoria. 2am"i(n
puede $erse cmo se usa un "ucle do...?hile.
3a funcin uasort() ordena los elementos de una matriz teniendo en cuenta su contenido y
se!An una funcin de comparacin definida por el usuario manteniendo la asociacin del
contenido de cada elemento con su #ndice.
5u sintaxis es
uasort(matriRJIunciKn de usuario);
Por e/emplo' si definimos la funcin de usuario com%ara() y la usamos como se!undo
ar!umento de la funcin uasort()' o"tenemos estos resultados4
Iunction com%ara($aJ$)
Z
return (sustr($aJ7J0)3sustr($J7J0))
[
$colores=arraS("a"=3"lanco"J""=3"aRul"J"c"=3"ro/o"J
"d"=3"amarillo"J"e"=3"verde");
uasort($coloresJ"com%ara");
Ior (reset($colores);$indice=UeS($colores);neOt($colores))
echo "\ndiceG &E3$indice&/E3 8ontenidoG&E3$coloresW$indiceX
&/E3&*3";
En este caso la funcin uasort() ordena los elementos se!An el cuarto carcter de su
contenido de menor a mayor )se cuenta desde -S por eso hemos puesto 3 en la funcin de
usuario+' %ue es lo %ue e/ecuta la funcin de usuario com%ara(). 1s# pues' la matriz %ueda as#4
$colores=arraS("e"=3"verde"J""=3"aRul"J"a"=3"lanco"J
"c"=3"ro/o"J"d"=3"amarillo");
En el Ejemplo 3 de esta Unidad puede $erse este cdi!o y la p!ina %ue !enera.
3a funcin usort() hace exactamente lo mismo %ue la anterior' suponiendo l!icamente %ue
aplicramos la misma funcin de usuario %ue es la %ue determina el orden de los elementos
se!An su contenido' pero sin mantener la asociacin del #ndice de cada elemento con su
contenido.
22 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
3a funcin u#sort() ordena los elementos de una matriz teniendo en cuenta su #ndice y se!An
una funcin de comparacin definida por el usuario manteniendo la asociacin del #ndice de
cada elemento con su contenido.
5u sintaxis es
uUsort(matriRJIunciKn de usuario);
Por e/emplo' si definimos la funcin de usuario com%ara() y la usamos como se!undo
ar!umento de la funcin u#sort()' o"tenemos estos resultados4
Iunction com%ara($aJ$)
Z
return (sustr($aJ7J0)3sustr($J7J0));
[
$colores=arraS("%rimero"=3"lanco"J"seHundo"=3"aRul"J
"tercero"=3"ro/o"J"cuarto"=3"amarillo"J
"5uinto"=3"verde");
uasort($coloresJ"com%ara");
Ior (reset($colores);$indice=UeS($colores);neOt($colores))
echo "\ndiceG &E3$indice&/E3 8ontenidoG&E3$coloresW$indiceX
&/E3&*3";
En este caso la funcin uUsort() ordena los elementos se!An el cuarto carcter de su #ndice
de mayor a menor )se cuenta desde -S por eso hemos puesto 3 en la funcin de usuario+' %ue
es lo %ue e/ecuta la funcin de usuario com%ara().
1s# pues la matriz %ueda as#4
$colores=arraS("seHundo"=3"aRul"J"cuarto"=3"amarillo"J
"5uinto"=3"verde"J"%rimero"=3"lanco"J
"tercero"=3"ro/o");
En el Ejemplo 3 de esta Unidad puede $erse este cdi!o y la p!ina %ue !enera.
odificar .atrices
3as matrices ya creadas e inicializadas pueden modificarse de diferentes formas4
&. Uniendo los elementos de dos o ms matrices.
3a funcin arra%_merge()' reci"e como ar!umentos dos o ms matrices y de$uel$e otra en la
%ue se han unido todas las %ue se pon!an como ar!umentos anexionando los elementos de
unas a continuacin de las otras' se!An el orden en %ue se pon!an los ar!umentos.
5u sintaxis es
arraS(merHe(matriR0JmatriR;...);
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo y la p!ina %ue !enera.
5i en la mezcla al!An #ndice se repite' el Altimo en a@adirse elimina el elemento de las matrices
anteriores en %ue se repita.
23 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
<. Completando los elementos de una matriz.
3a funcin arra%_pad() rellena una matriz a@adiendo los elementos %ue se indi%ue con el
contenido %ue se especifi%ue.
5u sintaxis es
arraS(%ad(matriRJnVmero de elementos de la matriR resultanteJ
relleno de los elementos a+adidos);
donde matriz es la matriz ori!inal a la %ue se a@aden elementosS nAmero de elementos es un
entero %ue indica cuntos elementos tendr la matriz despu(s de e/ecutarse la funcinS relleno
es la cadena o $alor con el %ue se completar el contenido de los nue$os elementos.
5i nAmero de elementos es i!ual o inferior al nAmero de elementos de la matriz ori!inal' no se
produce nin!An cam"io en la misma. 5i es ne!ati$o' los elementos se a@aden por el principio
de la matriz ori!inal. 5i es positi$o' se a@aden por el final.
Por e/emplo' si tenemos la matriz de cinco elementos
$saores=arraS("dulce"J"amarHo"J"salado"J"soso"J"menta");
la instruccin
$com%leta=arraS(%ad($saoresJQJ"indeterminado");
!enera la matriz
$com%leta=arraS("dulce"J"amarHo"J"salado"J"soso"J"menta"J
"indeterminado"J"indeterminado"J "indeterminado");
En el Ejemplo 3 de esta Unidad puede $erse este e/emplo y la p!ina %ue !enera.
3. Ln$irtiendo el orden de la matriz ori!inal.
3a funcin arra%_re$erse() de$uel$e otra matriz %ue contiene los mismos elementos
ordenados al re$(s' es decir' in$ierte el orden de los elementos de forma %ue el primero pasa a
ser el Altimo y el Altimo pasa a ser el primero. Hace' pues' lo mismo %ue la funcin rsort().
5u sintaxis es
arraS(reverse(matriR);
M. 5ustituyendo un fra!mento de elementos por otro.
3a funcin arra%_splice() de$uel$e la misma matriz sustituyendo $arios elementos
consecuti$os por otros nue$os.
5u sintaxis es
arraS(s%lice(matriR oriHinalJ%osiciKn inicial del des%laRamientoJ lonHitud del
des%laRamientoJcadena)valor)matriR 5ue sustituSe el IraHmento de
24 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
la oriHinal);
donde4
el ar!umento posicin inicial del desplazamiento es un nAmero entero %ue indica la
posicin' contando desde -' del primer elemento %ue de"e ser sustituido. 5i es menor
%ue -' se cuenta desde el Altimo elemento de la matriz ori!inal siendo el Altimo elemento
el %ue ocupa la posicin &.
el ar!umento lon!itud del desplazamiento es un nAmero entero %ue indica el nAmero de
elementos %ue sern sustituidos a partir de la posicin especificada en el ar!umento
anterior. 5i se omite' se eliminan todos desde la posicin indicada. 5i es menor %ue -' se
eliminan tantos como se indi%ue' pero contando desde el final de la matriz ori!inal hasta
la posicin especificada.
el ar!umento cadena' $alor o matriz contiene el contenido %ue ha de asi!narse a los
elementos eliminados. Puede no existir. En este caso' la matriz ori!inal pierde los
elementos eliminados sin ser sustituidos por otros.
Veamos al!unos e/emplos4
$matriR0=arraS("muS alto"J"alto"J"medio"J
"a/o"J"muS a/o");
$matriR;=arraS("K%timo"J"ueno"J"malo");
arraS(s%lice($matriR0J;J;);
!enera la matriz
$matriR0=arraS("muS alto"J"alto"J"muS a/o");
5e han eliminado los elementos tercero y cuarto.
arraS(s%lice($matriR0J;);
!enera la matriz
$matriR0=arraS("muS alto"J"alto");
5e han eliminado todos los elementos desde el tercero.
arraS(s%lice($matriR0J););
!enera la matriz
$matriR0=arraS("muS alto"J"alto"J"medio");
5e han eliminado los dos Altimos elementos.
arraS(s%lice($matriR0J;J0);
!enera la matriz
25 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
$matriR0=arraS("muS alto"J"alto"J"a/o"J"muS a/o");
5e ha eliminado el elemento tercero.
arraS(s%lice($matriR0J7J7J$matriR;);
!enera la matriz
$matriR0=arraS("muS alto"J"alto"J"medio"J "K%timo"J"ueno"J"malo");
5e han sustituido' desde el elemento tercero' tres elementos con el contenido de la matriz
$matriR;.
arraS(s%lice($matriR0Jcount($matriR0)J7J$matriR;);
!enera la matriz
$matriR0=arraS("muS alto"J"alto"J"medio"J"a/o"J
"muS a/o"J"K%timo"J"ueno"J"malo");
5e han a@adidos los elementos de la se!unda matriz a los de la primera.
.o con$iene confundirse con esta funcin4 si !eneramos una se!unda matriz con esta misma
orden' (sta contendr los elementos eliminados.
Por e/emplo' la orden
$nueva=arraS(s%lice($matriR0J7J7J$matriR;);
!enera la matriz
$nueva=("a/o"J"muS a/o");
%ue son los dos elementos eliminados de la matriz ori!inal.
5. E/ecutando una funcin de usuario so"re cada elemento de la matriz
3a funcin arra%_wal#() aplica una funcin de usuario a cada elemento de la matriz.
5u sintaxis es
arraS(,alU(matriR oriHinalJIunciKn de usuarioJ%reIi/o);
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo de cmo se utiliza esta funcin y la
p!ina %ue muestra.
N. Tuntando $aria"les en una sola matriz
3a funcin compact() de$uel$e otra matriz en la %ue se han incorporado como elementos las
diferentes $aria"les y matrices %ue se especifi%uen como ar!umento. Como #ndice se pone el
26 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
nom"re de la $aria"le y como contenido el $alor de cada $aria"le.
5u sintaxis es
com%act(lista de variales o arraSs...);
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo de cmo se utiliza esta funcin y la
p!ina %ue muestra.
G$traer infor.acin de las .atrices
3a funcin arra%_count_$alues() reci"e como ar!umento una matriz y de$uel$e otra cuyos
#ndices son los contenidos de la ori!inal y cuyo contenido es la frecuencia con %ue se repite el
mismo contenido en la matriz ori!inal.
5u sintaxis es
arraS(count(values(matriR);
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo y la p!ina %ue !enera.
3a funcin arra%_#e%s()reci"e como ar!umento una matriz y de$uel$e otra %ue contiene slo
los #ndices de la matriz ori!inal como contenidos de los nue$os elementos. Como #ndices de la
nue$a matriz se asi!nan $alores num(ricos enteros desde - en adelante.
5u sintaxis es
arraS(UeSs(matriRJvalor);
El se!undo ar!umento es opcional y' si se usa' sir$e para decir %ue pase a la matriz resultante
slo los #ndices de los elementos %ue conten!an ese $alor.
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo y la p!ina %ue !enera.
3a funcin arra%_slice() de$uel$e otra matriz %ue contiene una porcin de elementos de la
matriz ori!inal.
5u sintaxis es
arraS(slice(matriR oriHinalJ %osiciKn inicial del des%laRamientoJ
lonHitud del des%laRamiento);
donde
el ar!umento posicin inicial del desplazamiento es un nAmero entero %ue indica la
posicin' contando desde -' del primer elemento %ue de"e ser extra#do. 5i es menor %ue
-' se cuenta desde el Altimo elemento de la matriz ori!inal siendo el Altimo elemento el
%ue ocupa la posicin &.
el ar!umento lon!itud del desplazamiento es un nAmero entero %ue indica el nAmero de
elementos %ue sern extra#dos a partir de la posicin especificada en el ar!umento
anterior. 5i se omite' se extraen todos los elementos desde la posicin indicada. 5i es
menor %ue -' se extraen tantos como se indi%ue' pero contando desde el final de la
27 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
matriz ori!inal hasta la posicin especificada.
Como se $e' esta funcin tiene un comportamiento similar a la funcin arraS(s%lice()' pero
a%u# se extraen los elementos y en a%u(lla se eliminan o sustituyen.
$altura=arraS("muS alto"J"alto"J"medio"J"a/o"J"muS a/o");
$nueva=arraS(s%lice($alturaJ;J;);
!enera la matriz
$nueva=arraS("medio"J"a/o");
5e han extra#do los elementos tercero y cuarto.
En el Ejemplo 3 de esta Unidad puede $erse (stos y otros e/emplos' as# como las p!inas
%ue !eneran.
3a funcin arra%_$alues()reci"e como ar!umento una matriz y de$uel$e otra en la %ue se han
eliminado los #ndices de/ando slo los contenidos.
5u sintaxis es
arraS(values(matriR oriHinal);
3!icamente' como no puede ha"er una matriz sin #ndices' a cada elemento se le asi!nan
#ndices num(ricos desde - en adelante y se eliminan los %ue tu$iera antes' sean cadenas u
otros $alores num(ricos.
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo y la p!ina %ue !enera.
3a funcin each()lee el elemento actual de una matriz y a$anza el puntero al elemento
si!uiente. Con el elemento le#do fa"rica otra matriz de cuatro elementos4 dos para el #ndice )- y
Wey+ y dos para el contenido )& y $alue+. ]eneralmente' esta funcin se utiliza com"inada con
la funcin list() para recorrer los elementos de una matriz con un "ucle.
5u sintaxis es
each(matriR oriHinal);
Por e/emplo' si tenemos la matriz
$con(indices=arraS("uno"=3"muS alto"J"dos"=3"alto"J
"tres"=3"medio"J"cuatro"=3"a/o"J
"cinco"=3"muS a/o");
y suponemos %ue el puntero est so"re el elemento "tres"=3"medio"' la instruccin
$nueva=each($con(indices); de$uel$e la matriz de cuatro elementos si!uiente
$nueva=arraS(T=3"tres"J"UeS"=3"tres"J 0=3"medio"J"value"=3"medio")
3os dos primeros elementos de la matriz resultante hacen referencia al #ndice del elemento
actual de la matriz ori!inal. Ge esta forma podemos referirnos a su contenido tam"i(n de dos
28 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
formas4 $nuevaWTX o $nueva("UeS").
Como puede $erse' los dos Altimos elementos de la matriz resultante hacen referencia al
contenido del elemento actual de la matriz ori!inal. Ge esta forma podemos referirnos a su
contenido de dos formas4 como $nuevaW0X o como $nueva("value").
3a funcin extract()pasa los contenidos de los elementos de una matriz como contenidos de
las $aria"les %ue lle$an como nom"re el #ndice de cada elemento de la misma matriz. Como
consecuencia' a la ta"la de s#m"olos de $aria"les se incorporan estas nue$as $aria"les.
5u sintaxis es
eOtract(matriRJ si haS conIlictos ti%o de eOtracciKnJ
si haS conIlictos cadena de sustituciKn);
3os dos Altimos ar!umentos son opcionales y slo se aplican' si existen' cuando al e/ecutar la
extraccin se han producido colisiones' es decir' si la $aria"le %ue se pretend#a crear ya exist#a
e incluso si era de diferente tipo.
En caso de colisin entre $aria"les' el se!undo ar!umento tiene los $alores si!uientes4
EC28P\VE878L2E4 se descarta el $alor anterior de la $aria"le y se pone el nue$o.
Este $alor es el %ue se usa por defecto en caso de colisin' aun%ue no se indi%ue como
ar!umento.
EC28P5^LP4 se descarta el $alor nue$o de la $aria"le y se pone el anterior.
EC28PP8EFLCP510E4 al nom"re de la $aria"le nue$a conflicti$a se le pone como
prefi/o la cadena del tercer ar!umento se!uida de un !uin de su"rayado )++.
EC28P P8EFLCP1334 al nom"re de todas las $aria"les nue$as conflicti$as se le pone
como prefi/o la cadena del tercer ar!umento se!uida de un !uin de su"rayado )++.
Esta funcin comprue"a tam"i(n si el nom"re de las nue$as $aria"les es $lido y slo las crea
si lo es.
En el Ejemplo 3 de esta Unidad pueden $erse e/emplos de esta funcin y las p!inas %ue
!eneran.
3a funcin in_arra%()de$uel$e True si un $alor est contenido en al!uno de los elementos de
una matriz y False si no lo est'
5u sintaxis es
in(arraS(valor uscadoJ matriR donde se usca);
En el Ejemplo 3 de esta Unidad puede $erse un e/emplo de esta funcin y la p!ina %ue
!enera.
3a construccin list()asi!na en una Anica operacin el $alor de los elementos de una matriz a
una lista de $aria"les %ue se usan como ar!umento. Ja comentamos %ue la funcin each() se
usa' por lo !eneral' com"inada con la funcin list() para recorrer los elementos de una matriz
29 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
dentro de un "ucle.
5u sintaxis es
list(lista de variales);
Por e/emplo' si tenemos la matriz
$comunidad=arraS("8A0"=3"AraHKn"J"8A;"=3"Andaluca"J
"8A7"=3"]alicia"J"8AL"=3"Aurcia"J
"8AN"=3"^alencia"J"8A="=3"8anarias");
el "ucle si!uiente recorre y muestra el contenido de todos sus elementos4
,hile (list($indiceJ$valor)=each($comunidad))
Z
%rint ("El elemento &E3$indice&/E3 contiene el valor &E3$valor
&/E3&*3");
[
En la condicin con la %ue se esta"lece el "ucle com"inando list() y each() se consi!ue %ue
list() tome en sus dos $aria"les el #ndice y el contenido de cada elemento' %ue lue!o se
muestran. 1dems' una $ez proporcionada por each() la informacin de cada elemento a
list()' hace a$anzar el puntero un elemento ms' por lo %ue el "ucle se aca"a cuando ya no
hay elementos %ue ofrezcan la informacin necesaria.
En el Ejemplo 3 de esta Unidad puede $erse este e/emplo y la p!ina %ue !enera.
Aratar un array co.o si fuera una pila
PHP permite tratar las matrices como si fueran pilas de tipo 3LF\ )Last In First Out' _ltimo en
Entrar Primero en 5alir+ mediante cuatro funciones. El concepto de pila ya es clsico en
Lnformtica y se refiere a la forma de almacenar informacin en forma de montn o pila' 5i
tenemos muchos platos' podemos almacenarlos apilndolos unos encima de otros. En este
caso lo ms usual ser %ue el Altimo plato colocado en la pila sea el primero %ue se retira. 3as
matrices tam"i(n pueden considerarse como pilas de datos' %ue son sus elementos.
Veamos las funciones %ue nos permiten realizar operaciones de tipo pila con las matrices.
3a funcin arra%_pop() extrae el Altimo elemento de la matriz eliminndolo.
5u sintaxis es
arraS(%o%(matriR);
3a funcin arra%_push() a@ade elementos al final de la matriz.
5u sintaxis es
arraS(%ush(matriRJlista de elementos 5ue se a+aden);
3a funcin arra%_shift() extrae el primer elemento de la matriz eliminndolo y desplazando
todos una posicin a la iz%uierda.
30 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
5u sintaxis es
arraS(shiIt(matriR);
3a funcin arra%_unshift() inserta elementos por el principio de la matriz desplazando los
dems a la derecha.
5u sintaxis es
arraS(unshiIt(matriRJlista de elementos 5ue se a+aden);
Es con$eniente o"ser$ar %ue' cuando a@adimos elementos' PHP crea los #ndices para cada
uno' %ue son de tipo num(rico ordinal.
En el Ejemplo 3 de esta Unidad pueden $erse e/emplos de estas cuatro funciones y las
p!inas %ue !eneran.
=uevas funciones en !"! 8
3a funcin arra%_combine() crea una matriz usando una matriz para las cla$es y otra para sus
$alores.
3a funcin arra%_wal#_recursi$e() aplica una funcin de usuario recursi$amente a cada
miem"ro de una matriz.
3a funcin arra%_uintersect() lle$a a ca"o la interseccin entre < o ms matrices y utiliza
para comparar los elementos de cada matriz la funcin indicada en el Altimo parmetro.
Gesde el !ro*ra.a *estor del curso puede a"rirse el Ejemplo 3 de esta Unidad. El "otn
E/ecutar muestra en la p!ina el resultado de su interpretacin. Con el "otn Cod fuente se
accede la cdi!o PHP del mismo. En este e/ercicio se incluyen prcticamente todos los
e/emplos cuyo cdi!o hemos ido escri"iendo /unto a las funciones explicadas y otros nue$os
%ue no aparecen en las explicaciones.
5 - Funciones creadas por el usuario
En los tres apartados anteriores hemos estudiado las principales funciones estndar de %ue
dispone PHP para realizar operaciones con cadenas' fechas y matrices.
El usuario tam"i(n puede crear sus propias funciones' como ya se ha hecho en las dos
primeras unidades y en esta misma. Por e/emplo' en el apartado anterior' en el %ue se a"ordan
las funciones estndar de las matrices' hemos creado y usado las funciones de usuario
camia()' ver() y com%ara().
En este apartado $amos a explicar "re$emente cmo se crean y usan funciones de usuario
con la finalidad de ahorrar muchas l#neas de instrucciones e/ecutando siempre el mismo
cdi!o' sin necesidad de repetirlo en cada ocasin en %ue de"a lle$arse a ca"o una tarea
espec#fica dentro del mismo script.
El uso de funciones de usuario para tareas repetiti$as facilita mucho y ahorra tiempo en el
31 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
proceso de modificacin y actualizacin del cdi!o fuente.
Creacin de funciones de usuario
3as funciones de usuario son "lo%ues de cdi!o %ue pueden ser utilizados en cual%uier
momento dentro del cdi!o PHP.
En primer lu!ar y antes de hacer uso de ellas' es preciso declararlas y crear su cdi!o. 5e
hace con la sentencia function se!uida del nom"re de la funcin y de las l#neas de
instrucciones. Estas Altimas de"en ir entre las lla$es L...M. 5i la funcin tiene %ue de$ol$er un
$alor a la l#nea de cdi!o donde se in$oc' como Altima instruccin hay %ue poner la orden
return se!uida del $alor %ue se de$uel$e. 5i no se de$uel$e un $alor' sino %ue slo se
e/ecutan instrucciones dentro del cdi!o de la propia funcin' puede prescindirse de la
sentencia return.
3as funciones' en la mayor#a de los casos' tienen parmetros o ar!umentos entre par(ntesis' a
tra$(s de los cuales se pasan los datos con los %ue hay %ue realizar operaciones.
2ratemos de refle/ar todo lo dicho en un e/emplo. 5upon!amos %ue dentro del cdi!o PHP es
preciso hallar y mostrar $arias $eces el cuadrado y el do"le de un nAmero. 5i disponemos de
una funcin %ue lle$e a ca"o estas dos operaciones' no ser preciso ms %ue in$ocar esta
funcin cuantas $eces sea necesario pasndole cada $ez el nAmero del %ue es preciso o"tener
el cuadrado y el do"le. 3a escri"iremos as#4
Iunction ver(cuadrado(S(dole($num=;)
Z
$cuadrado=($num4$num);
$dole=($num4;);
echo "El cuadrado de &E3$num&/E3 es &E3$cuadrado&/E3
S el dole es &E3$dole&/E3.&*3";
[
$num0=L;
ver(cuadrado(S(dole($num0);
$num;=N;
ver(cuadrado(S(dole($num;);
$num7==;
ver(cuadrado(S(dole($num7);
$numL=M;
ver(cuadrado(S(dole($numL);
ver(cuadrado(S(dole();
En este e/emplo aparecen casi todos los componentes de una funcin de usuario' %ue son4
&. 5entencia function se!uida del nom"re de la funcin creada por nosotros
)ver(cuadrado(S(dole+ y' entre par(ntesis' del ar!umento (/num) %ue se reci"e desde el
cdi!o del script. F#/ate %ue hemos escrito (/num02) en el ar!umento de la funcin. Esto
si!nifica %ue si no se indica el ar!umento' entonces el $alor por defecto es 6<6.
<. 5entencias %ue contienen el cdi!o %ue ha de e/ecutarse dentro de la funcin. Hay %ue
ponerlas entre lla$es L...M' como hemos hecho. 1dems' antes de in$ocar una funcin de
usuario' es preciso crearla' como hemos hecho. En este e/emplo' no aparece la sentencia
return' ya %ue no es necesario de$ol$er nin!An $alor por realizarse la operacin completa
dentro del cdi!o de la funcin.
32 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
3. Ln$ocacin de la funcin de usuario dentro del script del cdi!o PHP. En este e/emplo
hemos in$ocado la funcin hasta cuatro $eces. Gesde esta l#nea pasamos el $alor %ue reci"e la
funcin en su ar!umento. 3os nom"res de am"os ar!umentos )el de la in$ocacin )$num0+ y el
de la funcin )$num+ no es necesario %ue coincidan+. En cam"io' s# es imprescindi"le %ue el
nAmero de parmetros pasados y reci"idos sea el mismo. En este caso se pasa uno y se
reci"e uno.
5i no hu"iera ar!umentos' se pone slo el par(ntesis. En nuestro caso ser#a lo si!uiente4
ver(cuadrado(S(dole(); y el ar!umento /num tomar#a el $alor por defecto' %ue es 6<6.
Veamos otro e/emplo en el %ue hay $arios ar!umentos y necesitamos la sentencia return. 5e
trata de una funcin %ue reci"e tres pala"ras y fa"rica con ellas una matriz. Con la sentencia
return de$uel$e la matriz. 5e muestran' lue!o' sus elementos fuera de la funcin con otra
funcin de usuario %ue hemos denominado ver(). Xste es el cdi!o4
Iunction ver($contenidoJ $indice)
Z
echo "\ndiceG &E3$indice&/E3 8ontenidoG&E3 $contenido&/E3&r3$n";
[
Iunction hacer(matriR($%al0J$%al;J$%al7)
Z
$todas="$%al0J$%al;J$%al7";
$matriR=eO%lode("J"J$todas);
reset($matriR);
return $matriR;
[
$teOto0="%erro";
$teOto;="rinoceronte";
$teOto7="/iraIa";
arraS(,alU(hacer(matriR($teOto0J$teOto;J$teOto7)J'ver');
Este cdi!o' %ue puede $erse y estudiarse en el Ejemplo 4 de esta Unidad' nos ense@a
$arias cosas %ue de"emos tener en cuenta al crear y utilizar funciones de usuario. 5on (stas4
1%u# hemos utilizado la sentencia return $matriR como Altima instruccin de la funcin
hacer(matriR(). En la in$ocacin de esta funcin
arraS(,alU(hacer(matriR($teOto0J$teOto;J$teOto7)J'ver');.
hemos mandado tres datos )$teOto0J$teOto;J$teOto7+' %ue se han reci"ido como parmetros
de la funcin )$%al0J$%al;J$%al7+. Con ellos se ha operado dentro del cdi!o de la funcin'
pero slo se ha de$uelto uno )$matriR+' %ue es la matriz creada en la funcin cuyos elementos
se muestran ahora con la funcin de usuario ver(). Con la sentencia return no se pueden
de$ol$er $arios ar!umentos' slo un $alor.
Podemos o"ser$ar' adems' %ue se pueden anidar $arias funciones unas dentro de
otras' como hemos hecho a%u#4 como primer ar!umento de una funcin estndar hemos
puesto una funcin de usuario y como se!undo ar!umento' otra funcin. 5lo hay %ue
procurar %ue los ar!umentos sean $lidos tanto por su nAmero como por el tipo de dato
%ue re%uieren.
33 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
En este e/emplo' hemos pasado los datos con el procedimiento denominado por valor'
es decir' %ue en la funcin se crea una copia de los datos %ue se reci"en' de forma %ue'
aun%ue se modifi%ue su contenido dentro de la funcin' en el cdi!o PHP si!uen
manteni(ndolo. Por e/emplo' la $aria"le $teOto0 al en$iarla contiene el contenido Vperro`.
1un%ue dentro de la funcin se modifi%ue $%al0' $aria"le donde se reci"e' y se le asi!ne
el contenido Vlen`' la primera se!uir conser$ando su $alor inicial.
En el si!uiente e/emplo $amos a usar el mismo cdi!o' casi' para pasar datos por referencia.
Iunction camiar(2$%al0J2$%al;J2$%al7)
Z
$%al0=strtr($%al0J'aeiou'J'.....');
$%al;=strtr($%al;J'aeiou'J'.....');
$%al7=strtr($%al7J'aeiou'J'.....');
$%al0=strrev($%al0);
$%al;=strrev($%al;);
$%al7=strrev($%al7);
[
$teOto0="%erro";
$teOto;="rinoceronte";
$teOto7="/iraIa";
echo "&H73&8ED?ER3\nicialmente las variales $$teOto0J $$teOto; S $$teOto7
contienenG&/H73&/8ED?ER3";
echo "&E3$teOto0&/E3&*3";
echo "&E3$teOto;&/E3&*3";
echo "&E3$teOto7&/E3&*3";
echo "&H73&8ED?ER3:es%uYs de la transIormaciKn las variales $$teOto0J$$teOto;
S $$teOto7 contienenG&/H73&/8ED?ER3";
camiar($teOto0J$teOto;J$teOto7);
echo "&E3$teOto0&/E3&*3";
echo "&E3$teOto;&/E3&*3";
echo "&E3$teOto7&/E3&*3";
En este cdi!o' %ue puede $erse tam"i(n en el Ejemplo 4 de esta Unidad' hemos pasado los
datos por referencia' es decir' las $aria"les %ue se escri"en como parmetros en la funcin
tam"i(n pueden ser modificadas en el cdi!o PHP de la citada funcin. Para conse!uir esto'
hay %ue utilizar el si!no andpersand )N+ delante de los parmetros de la funcin. Cuando'
despu(s de ha"er e/ecutado la funcin camiar()' mostramos los mismos datos en la p!ina'
podemos o"ser$ar %ue s# han cam"iado como necesitamos.
En cuanto al m"ito o alcance de la $aria"les' as# como so"re la $ida de (stas' aplicado ahora
a las funciones' $ale lo %ue ya hemos explicado en el apartado O.bito de las variables de la
Unidad <.
Gesde el !ro*ra.a *estor del curso puede a"rirse el Ejemplo 4 de esta Unidad. El "otn
E/ecutar muestra en la p!ina el resultado de su interpretacin. Con el "otn Cod fuente se
accede la cdi!o PHP del mismo. En este e/ercicio se incluye el cdi!o %ue hemos ido
escri"iendo en las funciones de usuario creadas en este apartado.
34 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
6 - a !ro"ramaci#n Orientada a Objetos $!OO%
El len!ua/e PHP ha ido incorporando tam"i(n las t(cnicas y procedimientos propios de la
pro!ramacin orientada a o"/etos' incluyendo la mayor#a de la caracter#sticas de este tipo de
pro!ramacin. En este Altimo apartado de la Unidad 3 $amos a explicar cmo se crean y usan
o"/etos en PHP.
PuQ son las clases
5o"re este asunto con$iene recordar %ue hay una !ran similitud entre lo %ue llamamos en
informtica o"/etos y los o"/etos de la $ida real. 3as clases son un con/unto o coleccin de
$aria"les %ue descri"en al!o y de funciones %ue acceden a esas $aria"les para actuar so"re
ellas. 1plicando este concepto a la $ida real' podemos decir %ue una clase informtica es como
un dise@o' modelo o proyecto de al!o' %ue descri"e ese al!o y determina las operaciones o
funcionalidades %ue pueden lle$arse a ca"o con eso.
5upon!amos %ue a un in!eniero aeronutico se le encar!a el dise@o de un prototipo de a$in.
Ese profesional descri"e en los planos y memorias ese prototipo indicando %u( caracter#sticas
$a a tener4 en$er!adura' tama@o' capacidad' potencia' etc(tera. Estos son las propiedades o
$aria"les del o"/eto. 1dems' de"e definir %u( operaciones y funcionalidades $a a tener4
aterrizar' despe!ar' na$e!ar' etc(tera. Estos son las funciones del o"/eto. Pues "ien' en un
pro!rama informtico a ese con/unto o coleccin de datos y funciones' relacionadas con los
datos y refle/adas en el proyecto o modelo' lo llamamos clase. 3o mismo ocurre si un ar%uitecto
dise@a un edificio' un in!eniero de caminos una carretera o un entrenador deporti$o una
t(cnica de ata%ue o de defensa. Con$iene tener en cuenta %ue se trata slo de un dise@o' de
un modelo' de una plantilla' no con$ertida toda$#a en realidad' en o"/eto concreto.
Una $ez creado un o"/eto informtico' la persona %ue desarrolla un pro!rama puede
incorporarlo con facilidad' al mar!en incluso de otros pro!ramadores %ue est(n desarrollando
otra seccin de la misma aplicacin. 3a P\\ permite' pues' una pro!ramacin ms
estructurada a tra$(s de los o"/etos. El desarrollador no tiene %ue conocer necesariamente
cmo funciona ni cmo es por dentro un o"/eto. 3e "asta conocer para %u( sir$e' cmo es y
cmo puede modificar esas caracter#sticas )$aria"les+' de %u( forma )funciones+ y %u(
parmetros )ar!umentos+ de"e poner para %ue lo ha!a. Un o"/eto es como una ca/a ne!ra de
la %ue hay %ue sa"er Anicamente sacar informacin' en nuestro caso hay %ue sa"er utilizarlo.
!ara RuQ sirven las clases
3as clases son el mximo exponente de la P\\ y PHP implementa en su len!ua/e toda la
funcionalidad necesaria para definirlas. Usndolas podemos hacer el cdi!o ms le!i"le y'
adems' reutiliza"le. Escri"ir el cdi!o de una clase es ms lar!o %ue escri"ir el cdi!o
directamente' pero a lar!o plazo resulta ms renta"le' ya %ue podemos hacer uso de una
misma clase en otras aplicaciones. 1dems' el mantenimiento de la clase es Anico' por lo %ue
nos ahorra tener %ue "uscar y modificar los fra!mentos %ue usen las mismas l#neas de cdi!o
en diferentes scripts.
Por lo dems' aun%ue en $ersiones anteriores PHP no era un len!ua/e orientado a o"/etos' en
la Altima $ersin de PHP 5 s# dispone de todas las caracter#sticas de un len!ua/e orientado a
o"/etos' como los interfaces y m(todos de polimorfismo. 5i "ien' PHP 5 no dispone toda$#a de
un sistema de herencia mAltiple.
35 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Creacin de objetos en !"!
En la P\\ los conceptos de clase y objeto estn #ntimamente relacionados. Una clase es un
modelo' patrn o plantilla so"re el cual se plantea un o"/eto. Un o"/eto es ya una instancia de
una clase' es decir' un caso real %ue se crea "asndose en el modelo clase. En el e/emplo
anterior la clase a$in define el modelo !en(rico de lo %ue de"e ser un a$in. Cuando se
concreta ya en la clase a$in las caracter#sticas y funcionalidades %ue hemos atri"uido a
nuestro a$in' se con$ierte en un o"/eto.
Para declarar una clase hay %ue usar la pala"ra reser$ada class se!uida del nom"re de la
clase %ue se %uiere crear. 2odas las instrucciones %ue inte!ran la nue$a clase de"e ir entre los
si!nos 123. 1dems' para definir las propiedades de la clase' las $aria"les tiene %ue ir
precedidas de la pala"ras reser$adas public' protected o pri$ate. \"ser$a el e/emplo
si!uiente4
class carro(com%ra
Z
public $%roductos = arraS();
function ((construct($clase="Rumo"J$numero=N)
Z
$this)3incluir(%roductos($claseJ$numero);
[
function ((destruct()
Z
unset($this)3%roductos);
[
function incluir(%roductos($claseJ$numero)
Z
$this)3%roductosW$claseX9=$numero;
[
function retirar(%roductos($claseJ$numero)
Z
if($this)3%roductosW$claseX 3 $numero)
Z
$this)3%roductosW$claseX)=$numero;
return true;
[ else
Z
return Ialse;
[
[
[
En este e/emplo definimos una clase llamada carro_compra. Est inte!rada por una matriz
)/productos+' en cuyos elementos se !uardan los productos' y dos funciones para meter
)incluir_productos+ estos productos en el carro y sacarlos )retirar_productos+ del mismo.
\"ser$a %ue usamos tam"i(n el prefi/o /this45, %ue es un puntero especial %ue nos permite
citar cada elemento de la matriz. Es una forma "re$e de sustituir el nom"re de la clase. En
lu!ar de codificar la instruccin escri"iendo carro_compra45productos podemos escri"ir' de
forma ms "re$e' /this45productos.
\pcionalmente' las clases pueden incluir una funcin especial denominada constructor. Esta
funcin se e/ecuta automticamente cada $ez %ue se crea un o"/eto. 1un%ue podamos in$ocar
la funcin constructor cuando %ueramos como lo hacemos con cual%uier otra funcin'
!eneralmente' se usa para lle$ar a ca"o operaciones "sicas' como determinar el tipo de datos
%ue $a a contener la clase' asi!nar $alores a sus $aria"les' inicializar las propiedades o los
36 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
m(todos del o"/eto' etc(tera. Para %ue una funcin de las creadas dentro de una clase se
con$ierta en constructor' es preciso %ue llame __construct. El constructor tam"i(n puede
tener parmetros a tra$(s de los cuales reci"e datos. En el e/emplo anterior el constructor es la
funcin
function ((construct($clase="Rumo"J$numero=N)
Z
$this)3incluir(%roductos($claseJ$numero);
[
donde hacemos %ue' cada $ez %ue se instancie la clase en un nue$o o"/eto' nuestra compra
del carro incluya 5 unidades del producto 6zumo6.
En $ersiones anteriores de PHP el constructor se llama"a i!ual %ue la clase. .otamos %ue
PHP 5 es tam"i(n compati"le con esta definicin. En este e/emplo anterior ser#a as#4
function carro(com%ra($claseJ$numero)
Z
$this)3incluir(%roductos($claseJ$numero);
[
1dems' tam"i(n opcionalmente' las clases pueden incluir una funcin especial
denominada destructor. Esta funcin se e/ecuta automticamente cada $ez %ue se destruye
un o"/eto. ]eneralmente' se usa para lle$ar a ca"o las operaciones para li"erar los recursos y
las $aria"les del o"/eto. Para %ue una funcin de las creadas dentro de una clase se con$ierta
en destructor' es preciso %ue llame __destruct. En el e/emplo anterior el destructor es la
funcin
function ((destruct()
Z
unset($this)3%roductos);
[
donde hacemos %ue' cada $ez %ue se destruya un o"/eto' se "orran pre$iamente todos los
productos del carro de la compra.
C.o se crean y se usan los objetos
Hemos dicho %ue las clases son como plantillas o dise@os o proyectos' colecciones de
$aria"les' propiedades y funciones %ue forman un con/unto. Pero aAn no existen como o"/etos
reales. Para ello' hay %ue instanciar la clase' es decir' concretarla en un o"/eto. 3os o"/etos
son' pues' instancias a una clase' es decir' tipos de datos %ue asumen las $aria"les'
propiedades' atri"utos y m(todos de la clase a la %ue pertenecen. Cada o"/eto es Anico e
independiente de otro %ue pueda crearse como instancia de la misma clase.
En PHP se crea un o"/eto usando la pala"ra reser$ada ne,. Con esta sentencia se asi!na a
una $aria"le o cla$e las caracter#sticas de la clase %ue se instancia. Por e/emplo' para crear un
o"/eto de la carro_clase de"emos escri"ir
$mi(com%ra = new carro(com%ra;
1 partir de ahora ya podemos referirnos a este o"/eto' %ue contendr el tipo de datos declarado
37 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
en la clase. 1dems' podemos actuar so"re sus propiedades )$aria"les+ y m(todos )funciones+'
lle$ando a ca"o en el o"/eto las operaciones %ue se hayan esta"lecido en la clase.
2am"i(n podemos incluir parmetros %ue pasarn al constructor directamente. Cuando se
pasan $alores en los parmetros la funcin se e/ecuta sin tener en cuenta los $alores
asi!nados por defecto dentro de la funcin constructor. Cuando se pasa solamente parte de los
$alores la funcin toma los $alores reci"idos y conser$a los dems asi!nados por defecto. Esto
mismo pasa con las dems funciones' aun%ue no sean el constructor.
Por e/emplo' podemos escri"ir $mi(com%ra = new carro(com%ra("Rumo"JN);
para hacer %ue el o"/eto se inicialice con esta informacin.
En la instruccin anterior no slo se crea el o"/eto /mi_compra' sino %ue adems se llama al
constructor de esta clase para pasar informacin al o"/eto creado mediante la funcin
incluir_productos(/clase /numero).
C.o se usan las propiedades y .Qtodo de un objeto
En PHP todas las propiedades y m(todos de la clase pueden ser $istos desde fuera de la
misma' siempre y cuando sean son pA"licos )$er apartado ms a"a/o so"re Hm"ito de
$aria"les y fucniones+. Esto si!nifica %ue podemos acceder a ellos desde fuera de la clase
citando directamente la propiedad o el m(todo precedidos del nom"re del o"/eto y del si!no
apuntador 45. Por e/emplo' podemos escri"ir lo si!uiente4
// 8reamos el o/eto.
$mi(com%ra = new carro(com%ra;
// Aostramos el nVmero de %roductos de un o/eto
// accediendo a su %ro%iedad /productos.
// @serva 5ue /productos es una matriR S 5ue usamos
// como ndice de la misma el nomre del %roducto.
echo $mi(com%ra)3%roductosW"caIY"X;
// \ncluimos un %roducto en el o/eto citando la IunciKn
// 5ue hemos creado como constructor.
$mi(com%ra)3incluir(%roductos("caIY"JL);
\"ser$a %ue los m(todos de un o"/eto son llamados de la misma forma %ue las funciones
normales pasndoles' cuando los haya' los parmetros %ue necesiten. 3os m(todos son
funciones %ue pertenecen al o"/eto' por lo %ue es preciso indicar el nom"re del o"/eto al %ue
pertenecen. 1s# pues' la forma de llamar a un m(todo es i!ual %ue la de llamar a una propiedad
de un o"/eto.
5i los m(todos de$uel$en al!An $alor' podemos asi!narlo a una $aria"le. Por e/emplo' en lu!ar
de mostrar el nAmero de productos del o"/eto /mi_compra' pod#amos ha"erlo asi!nado a la
$aria"le /producto_cafe de esta forma4
$%roducto(caIe = $mi(com%ra)3%roductosW"caIY"X;
3as $aria"les definidas e incluso inicializadas con al!An $alor dentro de la clase pueden usarse
directamente dentro de la propia clase por las funciones internas de la misma' sin necesidad de
usar el si!no *E. En este caso' tendrn un m"ito exclusi$amente local' no sern pA"licas.
38 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Gje.plos
Veamos un sencillo e/emplo de lo expuesto anteriormente. Estudia su cdi!o y haz %ue PHP lo
interprete dentro de un script' para %ue puedas compro"ar me/or sus resultados.
Gje.plo 9
&-
class suma
Z
public $numero0=0N;
public $numero;=;7;
function o%era()
Z
echo $this)3numero09$this)3numero;;
[
[
$resultado = new suma;
$resultado)3o%era();
-3
En este script se ha lle$ado a ca"o una sencilla operacin de sumar dos nAmeros y mostrar su
resultado en el na$e!ador del usuario. 5e ha hecho usando una clase y un o"/eto' ms por
moti$os didcticos %ue por con$eniencia de recursos de pro!ramacin.
En la primera parte del cdi!o se crea la clase suma haciendo preceder su nom"re por la
pala"ra reser$ada class. 3os si!nos 123 delimitan el cdi!o de la clase. 3as $aria"les /numero)
y /numero2 son propiedades o atri"utos de esta clase. \"ser$a %ue de"en ir precedidas de la
pala"ra reser$ada public. 1 la $ez %ue se declaran' se les ha asi!nado un $alor num(rico
entero. 3a funcin opera() constituye un m(todo de esta clase. Esta funcin suma los $alores
de las dos $aria"les anteriores y muestra el resultado de dicha suma. \"ser$a %ue el puntero
especial /this45 sustituye al nom"re de la clase. El nom"re de las dos $aria"les %ue lo si!uen
ahora no $a precedido del s#m"olo /.
En la se!unda parte del cdi!o' ya fuera de la creacin de la clase' se instancia en un o"/eto la
clase creada. El o"/eto creado se llama /resultado. 3a pala"ra reser$ada new' se!uida del
nom"re de la clase' permite crear este o"/eto' %ue tendr las mismas propiedades y m(todos
%ue la clase. Finalmente' se llama al m(todo opera() desde el propio o"/eto. 2am"i(n ahora es
preciso apuntar con el si!no 45 al nom"re de la funcin.
Gje.plo 5
Veamos otro e/emplo parecido' pero al!o ms comple/o' en el %ue se crean dos o"/etos a partir
de la misma clase y se ampl#a el nAmero de m(todos.
&-
class resta
Z
public $diIerencia;
39 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
function calcula($OJ$S)
Z
$this)3diIerencia=$O)$S;
[
function muestra()
Z
echo $this)3diIerenciaJ"&r3";
[
[
$diIe = new resta;
$diIe)3calcula(0TJN);
$diIe0 = new resta;
$diIe0)3calcula(;7J00);
$diIe)3muestra();
$diIe0)3muestra();
-3
En la primera parte de este cdi!o se crea una clase denominada resta. Gentro de ella se
define la $aria"le )propiedad+ /diferencia y dos funciones )m(todos+4 la funcin calcula()
para hallar la diferencia entre dos nAmeros )/dife y /dife)+ %ue se reci"en como parmetros
cuando se in$oca desde los o"/etos. Esta funcin de$uel$e el resultado de restar el se!undo
nAmero del primero. 3a funcin muestra() en$#a al na$e!ador del usuario el $alor de la
propiedad /diferencia.
En la se!unda parte del cdi!o' fuera ya del cdi!o donde se crea la clase' se crean dos
o"/etos de la clase anterior4 /dife y /dife). 1dems' se usan los m(todos de la misma'
en$iando en el primero de (stos los operandos con los %ue de"en realizarse las operaciones
de la resta.
Gje.plo :
En este tercer e/emplo' muy parecido al anterior' $amos a $er cmo la informacin de las
propiedades de una clase' instanciada en un o"/eto' pueden !uardarse en una matriz.
&-
class %roducto
Z
public $resul=arraS();
public $i=T;
function o%era($vJ$s)
Z
$this)3resulW$this)3iX=$v4$s;
$this)3i99;
[
function muestra()
Z
foreach($this)3resul as $numero)
40 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Z
echo $numeroJ"&r3";
[
[
[
$%roduc = new %roducto;
$%roduc)3o%era(NJL);
$%roduc)3o%era(0TJ=);
$%roduc)3o%era()NJ0=);
$%roduc)3muestra();
-3
En este script creamos la clase producto y el o"/eto produc. 3o nue$o a%u# es %ue la $aria"le
/resul es un dato de tipo array en cuyos elementos se $a !uardando el resultado de multiplicar
los dos nAmeros %ue se en$#an como parmetros cada una de las tres $eces %ue se interpreta
el m(todo opera()' llamado desde el o"/eto produc. En la funcin muestra() se usa un "ucle
con la sentencia foreach para mostrar el $alor de cada uno de los tres elementos introducidos.
2en en cuenta %ue' si llamamos $arias $eces a una funcin del mismo o"/eto' los resultados de
la Altima llamada se so"rescri"en so"re los de la llamada anterior. 5i %ueremos' pues'
conser$ar la informacin anterior' ser preciso crear $arios o"/etos o "ien usar una matriz'
como hemos hecho en el e/emplo Altimo.
Gje.plo ;
En este cuarto e/emplo usamos un constructor para completar de forma automtica los datos
del primer elemento de la matriz %ue se muestra en la ta"la. 2en en cuenta %ue siempre %ue se
crea un o"/eto la funcin constructor se e/ecuta automticamente. En el cdi!o si!uiente se
calculan las operaciones de suma' resta' multiplicacin y di$isin con los $alores
&-
class varios
Z
public $valor(inicial=;T;
public $numero(0=arraS();
public $numero(;=arraS();
public $suma=arraS();
public $resta=arraS();
public $%roducto=arraS();
public $division=arraS();
public $control=T;
function varios ($valor(0==TJ$valor(;=0N)
Z
$this)3control9=0;
$a=$this)3control;
$this)3numero(0W$this)3controlX=$valor(0;
$this)3numero(;W$aX=$valor(;;
$this)3sumaW$aX=$valor(09$valor(;;
$this)3restaW$aX=$valor(0)$valor(;;
$this)3%roductoW$aX=$valor(04$valor(;;
$this)3divisionW$aX=$this)3valor(inicial4$valor(0/$valor(;;
[
41 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
function muestra()
Z
echo "&tale aliHn=center order=03";
echo "&td3DVmero 0&/td3&td3DVmero ;&/td3&td3Suma&/td3";
echo "&td3Resta&/td3&td3Aulti%licaciKn&/td3
&td3:ivisiKn&/td3&tr3";
foreach($this)3numero(0 as $indice=3$valor)
Z
$n;=$this)3numero(;W$indiceX;
$s=$this)3sumaW$indiceX;
$r=$this)3restaW$indiceX;
$%=$this)3%roductoW$indiceX;
$d=$this)3divisionW$indiceX;
echo "&td aliHn=center3$valor&/td3";
echo "&td aliHn=center3$n;&/td3";
echo "&td aliHn=center3$s&/td3";
echo "&td aliHn=center3$r&/td3";
echo "&td aliHn=center3$%&/td3";
echo "&td aliHn=center3$d&/td3&tr3";
[
echo "&/tale3";
[
[
$calculos= new varios;
for ($i=0;$i&00;$i99)
Z
for ($/=0;$/&00;$/99)
Z
$calculos)3varios($iJ$/);
[
[
$calculos)3muestra($iJ$/);
-3
\"ser$a %ue en este e/emplo se pasan unos $alores directamente al constructor desde dentro
de la propia clase' es decir' datos definidos e inicializados en la misma clase. Hay otra forma
de pasar $alores' %ue consiste en pasar $alores como parmetros creados e inicializados fuera
de la clase' como hemos $isto antes en al!An e/emplo.
Otros eje.plos
Un e/emplo clsico es el %ue se aplica a un $eh#culo' como un coche' al %ue se asi!nan ciertas
propiedades )$aria"les+ y atri"uyen determinados m(todos )funciones+.
&-
class vehiculo
Z
// *ro%iedades.
public $velocidadJ $colorJ $Hama;
// 8onstructorG asiHnaciKn de velocidad inicialJ
// color S Hama.
42 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
function ((construct()
Z
$this)3velocidad = T;
$this)3color = "lanco";
$this)3Hama = "alta";
[
// AYtodo acelerar. El coche va m!s r!%ido.
function acelerar($velo)
Z
$this)3velocidad=$velo;
[
// AYtodo Irenar. El coche va m!s lento
// hasta Irenar.
function Irenar($velo)
Z
iI ($this)3velocidad 3 T)
Z
$this)3velocidad=$velo;
[
[
[
$mi(coche = new vehiculo;
echo "Ai coche es de color ".$mi(coche)3color."&r3&r3";
echo "Su Hama es ".$mi(coche)3Hama.".&r3&r3";
echo "Ahora est! %aradoG ".$mi(coche)3velocidad."UilKmetros.&r3&r3";
$mi(coche)3acelerar(0TT);
echo "Ai choche ha acelerado. Ahora avanRa a ".$mi(coche)3velocidad
." UilKmetros %or hora.&r3&r3";
$mi(coche)3Irenar(0T);
echo "Ai choche ha Irenado. Ahora avanRa a ".$mi(coche)3velocidad
." UilKmetros %or hora.&r3&r3";
-3
(a herencia
PHP puede crear clases extendidas' es decir' clases %ue pueden heredar las propiedades
)$aria"les+ y m(todos )funciones+ de la clase ori!inal' a la $ez %ue pueden tener otras
propiedades y m(todos propios. Esta posi"ilidad reci"e en la P\\ el nom"re de herencia. 1s#
pues' se pueden crear nue$as clases "asadas en otra anterior' cuyas propiedades y m(todos
son reco!idos en la nue$a sin necesidad de repetir todo el cdi!o.
3a clase ori!inal se denomina parent o superclase y la clase nue$a' child.
3a instruccin extends permite crear una clase nue$a' hi/a' a partir de otra' madre. 5u sintaxis
es como si!ue4
class vehiculo(lu/o extends vehiculo
Z
declaraciones (%ro%iedadesJ mYtodosJIunciones) de la clase;
[
1 partir de ahora la clase $ehiculoPlu/o tendr las mismas propiedades y m(todos %ue $ehiculo'
43 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
adems de los propios.
Hay %ue tener en cuenta %ue para las clases heredadas el constructor de la clase padre no se
e/ecuta automticamente cuando se llama al constructor de la clase hi/a. Por tanto' en una
clase hi/a slo se e/ecuta de forma automtica su propio constructor si lo hay. El constructor de
la clase ori!inal )padre+ slo se e/ecuta en la clase hi/a si es in$ocado expresamente desde
(sta.
Gje.plo
&-
class %adre
Z
public $n0=0T;
public $n;=Q;
function %adre()
Z
echo $this)3n04$this)3n;J"&r3";
echo "Se ha multi%licado $n0 %or $n;.&r3";
[
[
class hi/a extends %adre
Z
public $n7=L;
function hi/a()
Z
echo "El resultado es &3". $this)3n04$this)3n;/$this)3n7J"&/3&r3";
echo "Se ha multi%licado ". $this)3n0 ." %or ".
$this)3n;. " S el resultado se ha dividido entre ". $this)3n7 ."J&r3";
[
[
$%ruea = new hi/a();
-3
Como puedes $er' la clase hi6a reci"e de la clase ori!inal padre las propiedades %ue tiene' %ue
son los dos primeros nAmeros con sus $alores )/n) y /n2+. Por su parte incorpora al dise@o de
la clase ori!inal otra propiedad )$aria"le /n7+ y una nue$a funcin' %ue es su constructor'
llamado en esta caso hi6a().
Z5oporta PHP la herencia mAltiple[
1l!unos len!ua/es P\\ permiten la herencia mAltiple' esto si!nifica %ue una
su"clase puede heredar de $arias clases padres. PHP no permite esto y una
su"clase solo puede heredar de una clase padre' sin em"ar!o en PHP no hay
nin!An tipo de restriccin en cuanto a el nAmero de su"clases %ue pueden
heredar de una misma clase padre o superclase.
44 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Polimorfismo en PHP 5
Cual%uier len!ua/e de pro!ramacin orientado a o"/etos de"e soportar el
polimorfismo' esto si!nifica %ue diferentes clases tendrn un comportamiento
distinto para la misma operacin. Esto se $e ms claro con el si!uiente e/emplo.
5upon!amos %ue tenemos dos clases distintas coche y ciclomotor. 1m"as tienen
sus propios m(todos de mo$imiento' (stos tienen diferentes comportamientos'
pero su nom"re es el mismo
class coche Z
function avanRa() Z
[
function %ara() Z
[
function Hirar(derecha() Z
[
[
class ciclomotor Z
function avanRa() Z
[
function %ara() Z
[
function Hirar(derecha() Z
[
[
Como podemos o"ser$ar' am"as clases tienen los mismos m(todos' supon!amos ahora %ue
tenemos otra clase %ue controla el mo$imiento de todos los $eh#culos' es a%u# donde entra en
/ue!o el polimorfismo' %ue dependiendo del o"/eto %ue tratemos actuar de una forma u otra el
m(todo al %ue llamamos.
class movimiento Z
function mover(adelante($o/) Z
$o/)3avanRa();
[
[
5upon!amos %ue %ueremos mo$er cual%uier $eh#culo hacia adelante entonces escri"imos4
$o/(coche = new coche();
$o/(ciclomotor = new ciclomotor();
$o/(movimiento = new movimiento();
// con esta sentencia el coche avanRaria hacia adelante.
$o/(movimiento)3mover(adelante($o/(coche);
// con esta sentencia el ciclomotor avanRara hacia adelante.
$o/(movimiento)3mover(adelante($o/(ciclomotor);
Como podemos $er el mismo m(todo del o"/eto mo$imiento actAa de dos formas diferentes
dependiendo del o"/eto %ue le pasamos como parmetro.
45 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Hm"ito de $aria"les y funciones
En la teor#a de la Unidad < se explic el m"ito de $aria"les. El m"ito de una $aria"le o
funcin de una clase es al!o muy parecido. Puede ser definida al anteponerle a la declaracin
de la $aria"le o funcin las pala"ras reser$adas4 public' protected o pri$ate. 3os elementos
declarados con public indican %ue pueden ser accedidos desde cual%uier m"ito. 3os
declarados con protected limitan el m"ito a la clase %ue define el elemento )es decir' slo
podemos acceder a las mismas desde dentro de la clase mediante otras funciones+ y a las
clases heredadas )hi/as+. 3os declarados con pri$ate limitan el m"ito a la clase %ue lo defini
)es decir' se comporta i!ual %ue protected pero las clases hi/as no heredan estas $aria"les y
propiedades+.
En el caso de las $aria"les siempre es o"li!atorio definirlas con public' protected o pri$ate.
En el caso de funciones puede omitirse esta pala"ra' en cuyo caso PHP supondr %ue est
definida como public. .ota4 el constructor ((construct siempre se considera una funcin
pA"lica.
E/emplo de m"ito $isi"ilidad de las propiedades4
&-
// :eIinimos la clase automovil
class automovil
Z
public $variale(%ulica = '*Vlica';
protected $variale(%roteHida = '*roteHida';
pri$ate $variale(%rivada = '*rivada';
function im%rimir(variales()
Z
echo $this)3variale(%ulica;
echo $this)3variale(%roteHida;
echo $this)3variale(%rivada;
[
[
$o/eto = new automovil();
// Se muestra la variale %Vlica
echo $o/eto)3variale(%ulica;
// *H* muestra un error %or5ue no se %uede mostrar una variale %roteHida
echo $o/eto)3variale(%roteHida;
// *H* muestra un error %or5ue no se %uede mostrar una variale %rivada
echo $o/eto)3variale(%rivada;
// *H* muestra las 7 variales
$o/eto)3im%rimir(variales();
// :eIinimos la clase automovil(desca%otale
// 5ue es heredada de la clase automovil
class automovil(desca%otale extends automovil
Z
// *odemos redeclarar la variale %roteHida %ero no la %rivada
protected $variale(%roteHida = '*roteHida ;';
function im%rimir(variales()
Z
echo $this)3variale(%ulica;
echo $this)3variale(%roteHida;
echo $this)3variale(%rivada;
46 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
[
[
$o/eto; = new automovil(desca%otale();
// Se muestra la variale %Vlica
echo $o/eto)3variale(%ulica;
// *H* muestra un error %or5ue no se %uede mostrar una variale %roteHida
echo $o/eto)3variale(%roteHida;
// *H* muestra un error %or5ue la variale %rivada no se hereda
echo $o/eto)3variale(%rivada;
// *H* muestra sKlo ; varialesJ la %rivada no se hereda
$o/eto)3im%rimir(variales();
-3
E/emplo de m"ito $isi"ilidad de las funciones4
&-
// :eIinimos la clase automovil
class automovil
Z
// El constructor siem%re es %Vlico
public function ((construct() Z [
// :eclaramos una IunciKn %Vlico
public function Iuncion(%ulica() Z echo "IunciKn %Vlica"; [
// :eclaramos una IunciKn %roteHida
protected function Iuncion(%roteHida() Z echo "IunciKn %roteHida"; [
// :eclaramos una IunciKn %rivada
pri$ate function Iuncion(%rivada() Zecho "IunciKn %rivada"; [
// Esta IunciKn es %Vlica %or5ue no se ha escrito nada
function Iuncion(5ue(e/ecuta(todas()
Z
$this)3Iuncion(%ulica();
$this)3Iuncion(%roteHida();
$this)3Iuncion(%rivada();
[
[
$o/eto = new automovil;
// Auestra el resultado de la IucniKn %Vlica
$mSclass)3Iuncion(%ulica();
// *H* muestra un error %or5ue no se %uede e/ecutar una IunciKn %roteHida
$mSclass)3Iuncion(%roteHida();
// *H* muestra un error %or5ue no se %uede e/ecutar una IunciKn %rivada
$mSclass)3Iuncion(%rivada();
// *H* e/ecuta las 7 Iunciones
$mSclass)3Iuncion(5ue(e/ecuta(todas();
// :eIinimos la clase automovil(desca%otale
class automovil(desca%otale extends automovil
Z
// Esta IunciKn es %Vlica
function Iuncion(5ue(e/ecuta(todas;()
Z
$this)3Iuncion(%ulica();
$this)3Iuncion(%roteHida();
47 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
// *H* muestra un error %or5ue las Iunciones %rivadas no se heredan
$this)3Iuncion(%rivada();
[
[
$o/eto; = new automovil(desca%otale;
// Auestra el resultado de la IucniKn %Vlica
$mSclass)3Iuncion(%ulica();
// *H* sKlo e/ecuta las ; Iunciones %or5ue la %rivada no se hereda
$mSclass)3Iuncion(5ue(e/ecuta(todas;();
-3
Funciones para obtener infor.acin de las clases y objetos
PHP tiene ya dise@adas al!unas funciones Atiles para tra"a/ar con clases y o"/etos. 5on las
si!uiente4
.ethod+e$ists/o"/eto' funcin0' %ue comprue"a si o"/eto tiene definida una funcin.
Ge$uel$e 2rue )$erdadero+ si lo est y False )falso+ si no lo est.
*et+class+vars/clase0' %ue de$uel$e una matriz asociati$a %ue lle$a como #ndice de sus
elementos el nom"re de cada $aria"le definida e inicializada dentro de la clase y como
contenido el $alor asi!nado a esa $aria"le.
*et+class+.ethods/clase0' %ue de$uel$e una matriz con los $alores actuales de todas
las funciones incluidas en la clase.
*et+object+var/o"/eto0' %ue de$uel$e el nom"re y el contenido de todas la $aria"les
contenidas en un o"/eto.
C.o lla.ar a una funcin de una clase sin crear un objeto
En PHP tam"i(n es posi"le llamar a una funcin definida dentro de una clase sin %ue sea
necesario crear pre$iamente un o"/eto. Para ello' hay %ue usar el s#m"olo 88 de la forma
si!uiente4
clase GG Iuncion
Esta instruccin funciona exactamente i!ual %ue si creramos un o"/eto y desde (l
in$ocramos la funcin correspondiente de esta forma4
$o/eto = new clase
$o/eto)3Iuncion ()
Veamos un e/emplo de cmo podemos utilizar SS
&-
class _
Z
public static function mensa/e()
Z
echo "Esta IunciKn muestra un teOto&r3";
[
[
// A5u llamamos a la IunciKn sin crear un o/eto %revio.
48 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
_GGmensa/e();
// *ero tamiYn %odemos crear un o/eto
// e invocar la IunciKn a travYs de Yl.
$mensa = new _;
$mensa)3mensa/e();
-3
F#/ate %ue hemos usado la pala"ra reser$ada static antes de function dentro de la clase.
Geclarar $aria"les o funciones de clases como estticos' los hace accesi"les desde afuera del
contexto del o"/eto sin necesidad de crear el o"/eto pre$iamente. Ge"ido a %ue los m(todos
estticos son accesi"les sin %ue se haya creado una instancia del o"/eto' la pseudo $aria"le
$this no est disponi"le dentro de los m(todos declarados como estticos.
Veamos ahora un sencillo e/emplo de clase. 5e trata de una calculadora elemental' %ue realiza
las operaciones suma' resta' producto y di$isin.
En el Ejemplo 5 de esta unidad hemos creado dos clases y dos o"/etos parecidos )clases4
$calculadora0 y $calculadora;' o"/etos4 $calculos0 y $calculos;+ para %ue se $ea cmo
pueden pasarse los $alores %ue son los parmetros tanto desde la instruccin donde se crea el
o"/eto como desde la utilizacin de sus propiedades y m(todos. El pro!ramador o
pro!ramadora slo de"e sa"er %ue' para poder usar cada clase' ha de pasarle dos $alores
num(ricos al crear el o"/eto )primera+ o al utilizar sus m(todos )se!unda+.
En el Ejemplo 5 de esta unidad hemos creado otra clase $calculadora7 %ue hereda de
$calculadora0 todos las propiedades y m(todos' e incorpora un nue$o m(todo' propio' para
hallar el cuadrado del nAmero %ue reci"e como primer ar!umento.
Gesde el !ro*ra.a *estor del curso puede a"rirse el Ejemplo 5 de esta Unidad. El "otn
E/ecutar muestra en la p!ina el resultado de su interpretacin. Con el "otn Cod fuente se
accede la cdi!o PHP del mismo. En este e/ercicio se incluye el cdi!o %ue hemos comentado
a lo lar!o de este apartado.
Finalmente' recordamos %ue las posi"ilidades de PHP 5 respecto a la P\\ son muy amplias.
En este apartado hemos $isto una introduccin "sica so"re las clases necesaria para este
curso de iniciacin. PHP 5 presenta adems las si!uientes caracter#sticas4
1uto car!a de las \"/etos.
Constantes en \"/etos.
1"straccin de \"/etos.
Lnterfaces de \"/etos.
5o"recar!a de $aria"les y funciones.
Lnteraccin de \"/etos.
Patrones.
0(todos m!icos.
3a pala"ra reser$ada UFinalU.
Clonado de \"/etos.
Comparacin de \"/etos.
8efleccin.
49 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
2ype Hintin!.
5i el alumno o alumna desea ampliar sus conocimientos so"re P\\ puede utilizar el 0anual de
PHP %ue aparece en el editor php*Ge$ o "ien apuntarse a un curso a$anzado de PHP.
& - 'esumen
"ay Rue saber al final de esta unidad
Adaptar al contexto cadenas con las Iunciones addSlashes()J
tri%Slashes()J urldecode()J urldecode() S nl;r().
Limpiar cadenas con cho%()J ltrim()J trim() S stri%(taHs().
*oner en letras ma%9sculas o min9sculas cadenas com%letas o
%arcialmente con strtou%%er()J strtolo,er()J ucIirst() S
uc,ords().
:allar la lonHitud de una cadena con strlen().
,epetir cadenas con str(re%eat().
;odificar cadenas con strtr().
<uscar en el interior de las cadenas con strcs%n()J strs%n()J
str%os()J strr%os()J strrchr() S strstr().
Tratar sucadenas con sustr()J sustr(re%lace()J strtoU() S
%arse(str().
=n$ertir el teOto de una cadena con strrev().
Comparar cadenas con strcasecm%() S strcm%().
>tili&ar correctamente las Iunciones chr()J ord() S
numer(Iormat().
?stablecer cateHorias locales con setlocale().
Comprobar la valideR de una Iecha con checUdate().
@ar formato a una Iecha con date() S strItime().
?xtraer correctamente inIormaciKn de una Iecha con Hetdate() S
mUtime().
Leer una fecha desde una %!Hina web.
50 de 51
Curso de PHP 5 Unidad 3 Varias funciones de PHP
Crear e iniciali&ar matrices con arraS() S ranHe().
,ecorrer los elementos de las matrices con reset()J end()J
count()J neOt()J %rev()J current()J UeS()J eahc() S list().
Con$ertir cadenas en matrices S viceversa con eO%lode() e
im%lode().
Ardenar matrices con arsort()J rsort()J asort()J Ursort()J
Usort()J shuIIle()J uasort()J usort() S uUsort().
;odificar matrices con arraS(merHe()J arraS(%ad()J
arraS(reverse()J arraS(s%lice()J arraS(,alU() S
arraS(com%act().
?xtraer informaciBn de las matrices con arraS(count(values()J
arraS(UeSs()J arraS(slice()J arraS(values()J eOtract() e
in(arraS().
Tratar una matri& como una pila con arraS(%o%()J arraS(%ush()J
arraS(shiIt() S arraS(unshiIt().
Crear % utili&ar correctamente Iunciones de usuario.
Crear % utili&ar correctamente clases S o/etos.
MENTOR - CNICE MEC 2006
51 de 51
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Teora: Funciones de acceso a ficheros
1 - Objetivos
Objetivos
Aprender a abrir y a cerrar ficheros, as como saber mostrar su
contenido.
Entender y saber apicar as funciones !ue permiten recorrer ficheros
y leer su contenido.
Entender y saber apicar as funciones !ue permiten modificar e
contenido de os ficheros.
Saber copiar, borrar, renombrar y conocer los atributos de os
ficheros.
Entender y saber apicar as funciones !ue permiten subir ficheros a
ser"idor y bajarlos, as como validarlos.
#aber transformar un fichero de tipo H$%& en otro de tipo te'to.
Aprender a reenar un SELECT con os ficheros de un directorio.
Conocer c(mo se tratan los directorios )carpetas* de ser"idor de
red.
#aber tratar los permisos y propietarios de os ficheros.
2 - Abrir y cerrar ficheros
En esta Unidad 4 "amos a abordar e tratamiento de os ficheros en PHP. Hasta e momento a
informaci(n !ue escribamos se perda a cerrar e na"e+ador o bien debamos +uardara en e
c(di+o fuente PHP. Pero esto ,timo en reaidad no es posibe hacero cuando se trata de una
apicaci(n PHP rea cuyo c(di+o est- en e ser"idor y e ciente no tiene acceso a mismo sino
como mero usuario !ue se beneficia de su interpretaci(n. #(o puede hacero e due.o de a
apicaci(n de acuerdo con e administrador de ser"idor.
1 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
#in embar+o, PHP permite +uardar y recuperar informaci(n a tra"/s de os ficheros, para o
cua dispone de funciones y procedimientos para acceder a os mismos y a su informaci(n, as
como para crearos, destruiros, modificar su contenido, etc/tera. PHP tambi/n puede tratar as
carpetas o directorios.
En esta a Unidad, pues, "amos a estudiar de forma te(rico0pr-ctica as diferentes operaciones
!ue se pueden e"ar a cabo con os directorios y con os ficheros. Concretamente, en este
primer apartado abordamos c(mo abrir y c(mo cerrar ficheros.
En e Captulo XXX. unciones del Sistema de !rchivos de "anual de #$# )puede
encontrarse en a ayuda de Editor de"0PHP* aparecen hasta 15 funciones de ficheros. En este
apartado nos "amos a imitar a e'picar bre"emente as m-s frecuentes y necesarias. 2uestro
ob3eti"o es !ue e aumno aprenda a utii4ar a+unas para famiiari4arse con eas y poder,
ue+o, utii4ar correctamente as !ue necesite obteniendo informaci(n en e %anua.
%ota importante
Como en los ejemplos y ejercicios de esta Unidad se van a realizar
operaciones que pudieran afectar a los ficheros del curso, es
imprescindible que, antes de iniciar los ejercicios, el alumno
copie a su directorio de trabajo personal los ficheros de tipo
texto (txt o php) que aparecen en el directorio
C:\CursoPHP5\curso\Alumnos\ficheros_del_curso, para que pueda
acceder a ellos y tratarlos sin problemas. En el directorio
original no se permiten operaciones de escritura, por lo cual no
podra practicar aquellas operaciones que lo exigen, como borrar o
renombrar un fichero o un directorio.
!or otra parte, a continuaci"n se explica en primer lugar la
funci"n chdir(), que permite establecer el directorio actual por
defecto. En todos sus programas, el alumno ha de ponerla como
primera lnea de instrucciones indicando como argumento su
directorio de trabajo.
!or ejemplo, si el directorio se denomina afer001, deber# escribir
la sentencia chdir("C:\CursoPHP5\curso\Alumnos\afer001") delante
de las lneas de instrucciones donde se tratan los ficheros.
$tra buena soluci"n puede ser crear con el !ditor de"#PHP o con el
$loc de notas algunos ficheros propios, sean de tipo php o txt, y
guardarlos en el propio directorio de trabajo. En este caso no es
preciso copiar los ficheros de estos tipos creados por nosotros
para realizar las operaciones y archivados en el directorio
C:\CursoPHP5\curso\Alumnos\ficheros_del_curso.
!ara poder abrir con el !ditor de"#PHP los ficheros de tipo txt,
hay que poner en el apartado %om&re de archi"o '(' y se mostrar#n
todos, no s"lo los del tipo php, antes de seleccionar el que
queramos abrir.
Establecer el directorio por defecto
Aun!ue a funci(n chdir() pertenece a apartado donde se trata e traba3o con os directorios,
se e'pica a!u por necesidad. $odas as operaciones con ficheros !ue reaice e aumno o
aumna han de e"arse a cabo sobre os ficheros presentes en su directorio de traba3o. Por
2 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
eso, con"iene !ue en todos sus scripts inserte como primera nea de c(di+o esta funci(n para
fi3ar e directorio donde est-n o deben crearse os ficheros con os !ue se "a a traba3ar.
&a funci(n chdir() estabece e directorio actua por defecto donde est-n archi"ados o donde
se "an a archi"ar os ficheros !ue se utiicen para reai4ar diferentes operaciones. A e3ecutarse,
comprueba si e directorio pasado como ar+umento e'iste o no. En e primer caso esta funci(n
de"ue"e %rue5 en e se+undo, &alse. Una "e4 !ue se ha estabecido e directorio por defecto, si
e camino especificado e'iste, ya no es necesario indicar deante de nombre de fichero e
directorio donde debe buscarse o crearse os ficheros !ue se usen en e mismo script.
#u sinta'is es a si+uiente6
chdir)7nombre competo de directorio8*5
&a me3or forma de usar esta funci(n es incuy/ndoa dentro de una estructura condiciona de a
forma si+uiente6
if (chdir('C()Curso!*!+)curso),lumnos)ficheros-del-curso'..
echo '/01El directorio
)'C())Curso!*!+))curso)),lumnos))ficheros-del-curso)'
existe y ha quedado fijado como actual./201'3
else
echo '/01El directorio
)'C())Curso!*!+))curso)),lumnos))ficheros-del-curso)'
no existe y no se ha podido fijar como actual./201'3
Puede "erse c(mo funciona este c(di+o en e Ejemplo 1 de esta Unidad.
!brir un fichero
#iempre !ue traba3emos con ficheros para escribir, modificar o eer su contenido, es
imprescindibe reai4ar un proceso !ue est- inte+rado, a menos, por tres operaciones6
9. Abrir e fichero.
:. ;eai4ar as operaciones de ectura o escritura pre"istas.
<. Cerrar e fichero.
&a funci(n fopen() permite abrir un fichero para traba3ar con e mismo. A e3ecutarse,
comprueba si e fichero pasado como primer ar+umento e'iste o no. En e primer caso esta
funci(n de"ue"e %rue5 en e se+undo, &alse. Por eo, con"iene incuir tambi/n esta funci(n
dentro de una estructura condiciona !ue nos informe de a apertura o no de fichero
especificado.
=sta es su sinta'is6
fopen('nombre del fichero','modo de apertura',
entero para mirar tambi4n en el camino fijado
en la instrucci"n include.3
donde
E primer par-metro es e nombre e'acto de fichero !ue se desea abrir. #i dentro de este
3 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
ar+umento se indica e directorio por no haber usado pre"iamente a funci(n chdir(., es
imprescindibe poner as dos barras &&, para !ue a barra de directorio sea interpretada
correctamente, es decir, como si+no te'tua de directorio y no como un smboo de en+ua3e
H$%&.
E se+undo par-metro es e modo de apertura, !ue debe ponerse tambi/n entre comias. Un
fichero puede abrirse de "arios modos, cada uno de os cuaes se indica con e si+no
correspondiente6
'r' 0 Abre e fichero para s(o ectura5 sit,a e puntero de fichero a comien4o de mismo.
'r(' 0 Abre e fichero para ectura y escritura5 sit,a e puntero de fichero a comien4o de
fichero.
')' 0 Abre e fichero para s(o escritura5 sit,a e puntero de fichero a comien4o de
fichero y trunca e fichero con on+itud cero. #i e fichero no e'iste, trata de crearo.
')(' 0 Abre e fichero para ectura y escritura5 sit,a e puntero de fichero a comien4o de
mismo y trunca e fichero con on+itud cero. #i e fichero no e'iste, trata de crearo.
'a' 0 Abre e fichero s(o para escribir )a.adir*5 sit,a e puntero de fichero a fina de
mismo. #i e fichero no e'iste, trata de crearo.
'a(' 0 Abre e fichero para ectura y escritura )a.adiendo*5 sit,a e puntero de fichero a
fina de mismo. #i e fichero no e'iste, trata de crearo.
Adem-s de uno de os anteriores, este ar+umento, denominado mode, puede contener a etra
'b'. Esto es ,ti para sistemas !ue diferencian entre ficheros binarios y de te'to, como >indo?s.
Es in,ti en Uni'. #i no se necesita, es i+norado.
E tercer par-metro, opciona, permite indicar !ue a b,s!ueda de fichero se ha+a tambi/n en
e camino donde se haan os ficheros especificados en a orden include. En este caso, hay
!ue poner e "aor 9.
@eamos un e3empo6
if (fopen('&icheros-5.php','r'..
echo '/01El fichero )'&icheros-5.php)' existe
y ha quedado abierto./201'3
else
echo '/01El fichero )'&icheros-5.php)' no existe./201'3
En as instrucciones anteriores se intenta abrir e fichero FicherosA9.php en modo de s(o
ectura especificando !ue, si se puede abrir, e puntero !uede a principio de mismo.
Con"iene obser"ar !ue, a i+ua !ue ocurre con as matrices, en os ficheros tambi/n hay un
puntero o apuntador !ue se.aa una de as posiciones de fichero.
#i no se hubiera usado antes a funci(n chdir(., sera preciso haber escrito6
if (fopen('C())Curso!*!+))curso)),lumnos))ficheros-del-curso))fichero5.php', 'r'..
En u+ar de poner una estructura de contro condiciona, tambi/n es posibe utii4ar una sinta'is
4 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
m-s ee+ante usando a funci(n die(), !ue permite de"o"er un mensa3e a na"e+ador de
ciente y da por finai4ado e script !ue se est- interpretando. As !uedara e c(di+o en este
caso6
6fopen('&ichero-5.php','r'.
or die('/01El fichero )'&ichero-5.php)' no se ha podido abrir./201/!1'.3
Be esta forma, m-s ee+ante y efica4, se consi+ue e"itar e mensa3e de error !ue se en"a a
ciente )por eso hemos usado e operador C* y se de3an de e3ecutar as si+uientes neas de
c(di+o )+racias a a funci(n die(.*. #i e fichero e'iste y puede abrirse, no se muestra e
mensa3e y se prosi+ue con a interpretaci(n de as si+uientes neas de c(di+o.
Puede "erse c(mo funciona este c(di+o en e Ejemplo 1 de esta Unidad. Como e fichero
citado )FicheroA9.php* no e'iste, hemos comentado estas neas de c(di+o para !ue puedan
se+uir e3ecut-ndose as si+uientes instrucciones. #i se !uiere "er de hecho c(mo funciona, e
aumno puede copiar e fichero de este e3empo a su directorio de traba3o y !uitar os si+nos de
comentario con e Editor de"0PHP. #i no os "ue"e a poner, no se interpretar- nunca e resto
de as neas !ue aparecen en e e3empo competo.
&a forma m-s frecuente de citar e nombre de un fichero y su identificador es usando dos
"ariabes, una para !ue conten+a e nombre de fichero y otra para !ue conten+a e
identificador de mismo. %ira e si+uiente c(di+o6
7fichero58'&icheros-5.php'3
7id-fichero586fopen(7fichero5,'r'.
or die('/01El fichero )'&ichero-5.php)' no se ha podido abrir.
/201/!1'.3
echo '/01El fichero )'&icheros-5.php)' existe y ha quedado
abierto en modo lectura./201/!1'3
En a "ariabe 7fichero5 hemos +uardado e nombre de fichero5 a "ariabe 7id-fichero5
contiene e identificador de fichero. Para reai4ar cua!uier operaci(n con este fichero abierto,
debemos utii4ar e identificador creado.
#i se pretende abrir un fichero en modo escritura y no e'iste, se intenta crear e fichero
especificado. #i e'iste, es preciso tener mucho cuidado con e par-metro mode !ue se utiice,
ya !ue 7)* y 7)(* truncan e fichero de3ando su tama.o a cero y coocando e puntero a
principio de fichero. Esto !uiere decir !ue se perder- su contenido anterior. En cambio, 7a* y
7a(* no truncan e fichero y coocan e puntero a fina de fichero. Por o tanto, e contenido
nue"o se a.adir- a o !ue ya haba.
En e Ejemplo 1 pueden "erse "arias operaciones de este tipo y sus resutados. Con"iene
abrir con e Doc de notas o con e Editor de"0PHP os ficheros &icheros-9.txt )una "e4
creado* y &icheros-:.txt despu/s de reai4ar cada una de estas operaciones, para "er su
contenido y comprender bien c(mo funciona cada par-metro mode.
7fichero98'&icheros-9.txt'3
7id-fichero986fopen(7fichero9,';'.3
Con estas dos instrucciones, si e fichero &icheros-9.txt no e'ista, se crea con tama.o E5 si
ya e'ista y tena contenido, se de3a "aco.
7fichero:8'&icheros-:.txt'3
5 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
7id-fichero:86fopen(7fichero:,'a'.3
Con estas dos instrucciones, si e fichero &icheros-:.txt e'ista, se abre y se de3a e puntero
a fina de mismo, disponibe para a.adir m-s contenidos5 si no e'ista, se crea con tama.o E
tambi/n disponibe para a.adir contenidos.
Cerrar un fichero
$odo fichero !ue ha sido abierto debe ser cerrado una "e4 !ue se ha acabado de reai4ar con
/ as operaciones pre"istas.
&a funci(n fclose() permite cerrar os ficheros abiertos. #u sinta'is es sencia6
fclose(nombre de identificador.3
#e cierra s(o e fichero de identificador !ue se especifi!ue. A e3ecutarse esta funci(n, se
comprueba si e fichero pasado como ar+umento est- abierto y o ha podido cerrar o no. En e
primer caso esta funci(n de"ue"e %rue5 en e se+undo )si e fichero no e'iste o no est-
abierto*, &alse.
Besde e #ro+rama +estor de curso puede abrirse e Ejemplo 1 de esta Unidad. E bot(n
E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n Cod fuente, se
accede a c(di+o PHP de mismo. En este e3ercicio se incuyen os e3empos cuyo c(di+o
hemos ido escribiendo 3unto a as funciones e'picadas.
3 - Recorrer ficheros y leer su contenido
En este apartado de a Unidad 4 "amos a e'picar c(mo se recorre un fichero en PHP. %uchas
"eces es necesario mo"er e puntero de ficheros a una posici(n determinada desde otra pre"ia
para eer su contenido o para modificaro o insertar a+,n te'to. PHP tiene tambi/n funciones
!ue permiten mo"er e puntero por e contenido de os ficheros.
En os e3empos !ue acompa.an a as e'picaciones "amos a utii4ar os mismos ficheros con
os !ue hemos traba3ado en e apartado anterior y uno nue"or6 &icheros-5.php,
&icheros-9.txt, &icheros-:.txt y &icheros-<.txt. ;ecordamos !ue /stos deben haber
sido copiados o creados en e directorio de traba3o de aumno. Adem-s, este directorio debe
especificarse como ar+umento de a funci(n chdir(.. #i e aumno o aumna tiene a+una duda
sobre este asunto, debe eer a %ota de apartado anterior.
,ecorrer un fichero
&a funci(n re)ind() sir"e para coocar e puntero de acceso a os ficheros en a primera
posici(n. Fa hemos "isto !ue, cuando se abre un fichero, a+unos par-metros de su ar+umento
mode coocan e puntero en a primera posici(n, pero, a o ar+o de di"ersas operaciones con e
mismo, puede suceder !ue no sepamos d(nde est- e puntero. Para coocaro en a primera
posici(n, debemos usar re)ind(). Para poder reai4ar esta operaci(n, (+icamente, e fichero
debe estar abierto.
#u sinta'is es a si+uiente6
re;ind('nombre completo del fichero' o identificador.3
6 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Por e3empo, a instrucci(n re;ind('&icheros-5.php'.3 cooca e puntero de ese fichero en a
primera posici(n.
&a funci(n fsee*() se utii4a para mo"er e puntero tantas posiciones hacia deante )si e
se+undo ar+umento es un n,mero positi"o* o hacia atr-s )si es un n,mero ne+ati"o* como se
indi!ue en su se+undo ar+umento. $iene una sinta'is tambi/n sencia6
fsee=('nombre completo del fichero' o identificador,
n>mero de posiciones que hay que saltar.3
Por e3empo, a instrucci(n fsee=('&icheros-5.php',?+.3 cooca e puntero de fichero en e
car-cter )byte* !ue ocupa a posici(n 15.
&a funci(n ftell() se utii4a para conocer en !u/ posici(n de fichero est- e puntero. $iene
esta sinta'is6
ftell('nombre completo del fichero' o identificador.3
Be"ue"e un n,mero entero y se usa cuando se desconoce a posici(n de puntero. #uee
combinarse con a funci(n fsee=(. para despa4ar e puntero de forma reati"a.
Por e3empo, a instrucci(n ftell('&icheros-5.php'.3 escrita despu/s de
fsee=('&icheros-5.php',?+.3 de"ue"e e "aor 15.
#i !ueremos mo"er e puntero de forma reati"a die4 posiciones adeante, escribiremos a
instrucci(n
fsee=('&icheros-5.php',ftell('&icheros-5.php'.@5A.3
&a funci(n feof() se utii4a para detectar si se ha sobrepasado a ,tima posici(n de fichero, es
decir, si se ha acan4ado a marca de fina de fichero. $iene esta sinta'is6
feof('nombre completo del fichero' o identificador.3
Be"ue"e e "aor (+ico %rue si se ha acan4ado a marca de fina de fichero o &alse si no se ha
hecho.
Por e3empo, a instrucci(n feof('&icheros-5.php'.3 escrita despu/s de
fsee=('&icheros-5.php',+AAA.3 de"ue"e e "aor True, ya !ue e fichero tiene menos de 5.EEE
caracteres )bytes* y, por tanto, se encuentra a marca de fina de fichero.
Esta funci(n es muy ,ti para eer uno a uno o nea a nea todos os caracteres de un fichero
usando un buce ;hile (Bfeof(.., como estudiaremos m-s adeante.
Puede "erse c(mo se usan as funciones e'picadas en e Ejemplo 2 de esta Unidad.
Leer los contenidos de un fichero
Hasta ahora s(o hemos accedido a un fichero y nos hemos mo"ido por sus caracteres,
posiciones o bytes, pero en nin+,n momento hemos "isto o modificado su contenido. @eamos
ahora c(mo podemos eer un fichero.
7 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
&a funci(n fread() se utii4a para eer una cadena de un fichero abierto. $iene esta sinta'is6
fread('nombre completo del fichero' o identificador,
n>mero de caracteres que se deben leer.3
#i se acan4a a marca de fina de fichero )feof(.* antes de eer todos os caracteres indicados,
se ee hasta e fina de mismo, si bien no se produce nin+,n error a e+ar a fina de fichero.
Por e3empo, a instrucci(n fread('&icheros-:.txt',9+. de"ue"e os :5 primeros caracteres
de este fichero, pues e puntero despu/s de abrir e fichero con e par-metro 7r* estaba a
comien4o de mismo. Adem-s, e puntero se despa4a a a posici(n :G, por cua una se+unda
ectura parte desde esta posici(n.
Puede "erse e uso de esta funci(n en e Ejemplo 2 de esta Unidad.
&a funci(n f+ets() hace e'actamente o mismo !ue a funci(n fread() y e"a os mismo
par-metros como ar+umentos. #(o se diferencian en !ue a funci(n f+ets() s(o ee una
cadena !ue, como m-'imo, abarca hasta !ue encuentre a marca de fina de nea )retorno de
carro*. Por eo, si e n,mero de se+undo par-metro es superior a os caracteres de una nea,
a cadena !ue se ee comprender- s(o e te'to de a nea.
Con esta funci(n incuida dentro de un buce podemos eer nea a nea un fichero de esta
forma6
re;ind('&icheros-:.txt'.3
;hile (Bfeof('&icheros-:.txt'..
C
7linea8fgets('&icheros-:.txt',9+D.3
echo '/017linea /201/!1'3
E
Con"iene ad"ertir !ue, cuando se e3ecutan as funciones anteriores, a cadena contiene una
posici(n menos !ue a indicada en e ar+umento, es decir, si ponemos 9E como on+itud de a
cadena, se muestran H caracteres. Esto se debe a os c(di+os de sato de nea, !ue se een
tambi/n, aun!ue no se muestran.
&a funci(n f+etss() hace e'actamente o mismo !ue a funci(n f+ets(), pero en a ectura
prescinde de as eti!uetas propias de en+ua3e H$%&. #u sinta'is es a si+uiente6
fgetss('nombre completo del fichero' o identificador,
n>mero de caracteres que se deben leer,
'etiquetas que pueden leerse'.3
E uso de esta funci(n tambi/n puede "erse en e Ejemplo 2 de esta Unidad.
&a funci(n f+etc() se utii4a para eer un car-cter de un fichero abierto a partir de a posici(n
de puntero. $iene esta sinta'is6
fgetc('nombre completo del fichero' o identificador.3
Por e3empo, a instrucci(n fgetc('&icheros-:.txt'. de"ue"e e car-cter de este fichero sobre
e !ue est/ e puntero. =ste tambi/n se despa4a una posici(n.
Usando esta funci(n dentro de un buce !ue recorra desde a primera posici(n hasta a marca
8 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
de fina de fichero puede mostrarse e contenido competo de /ste.
Puede "erse e uso de esta funci(n en e Ejemplo 2 de esta Unidad.
&a funci(n file() tambi/n se usa para eer un fichero y asi+nar e te'to de cada nea a una
matri4. &a primera nea se cooca como eemento E y as sucesi"amente. En este caso e
identificador !ue se pasa como ar+umento es e propio nombre de fichero y a funci(n count()
permite saber cu-ntos eementos tiene a matri4 para poder recorrera posteriormente. @eamos
un e3empo6
7matriz8file('&icheros-:.txt'.3
for (7i8A37i/count(7matriz.37i@@.
C
print ('/01 Elemento 7i(/201 7matrizF7iG/!1'.3
E
&a funci(n readfile() permite tambi/n eer un fichero y en"iar su contenido a a p-+ina de
ciente. $iene a si+uiente sinta'is6
readfile('nombre completo del fichero', camino de la orden include.3
E se+undo ar+umento es opciona e indica, si se pone, !ue e fichero se bus!ue tambi/n en os
directorios citados en a c-usua include.
Pr-cticamente hace o mismo a funci(n fpassthru(). Esta funci(n de"ue"e %rue si se ha
podido reai4ar a operaci(n y &alse si no se ha hecho.
Puede "erse e uso de estas dos funciones en e Ejemplo 2 de esta Unidad.
Besde e #ro+rama +estor de curso puede abrirse e Ejemplo 2 de esta Unidad. E bot(n
E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n Cod fuente se
accede a c(di+o PHP de mismo. En este e3ercicio se incuyen os e3empos cuyo c(di+o
hemos ido escribiendo 3unto a as funciones e'picadas.
4 - Modificar el contenido de los ficheros
En este apartado de a Unidad 4 "amos a e'picar c(mo se modifica e contenido de os
ficheros en PHP. Este en+ua3e dispone tambi/n de funciones !ue permiten modificar e
contenido de os ficheros.
En os e3empos !ue acompa.an a as e'picaciones "amos a utii4ar os mismos ficheros con
os !ue hemos traba3ado en os dos apartados anteriores6 &icheros-5.php, &icheros-9.txt,
&icheros-:.txt y &icheros-<.txt. ;ecordamos !ue /stos deben haber sido copiados o
creados en e directorio de traba3o de aumno. Adem-s, este directorio debe especificarse
como ar+umento de a funci(n chdir(..
Como, en adeante, se "an a reai4ar operaciones !ue modifican su contenido, e incuso se
borrar-n o renombrar-n, aconse3amos comprimir estos cuatro ficheros, para !ue se pueda
"o"er a ori+ina siempre !ue se necesite. #i e aumno o aumna tiene a+una duda sobre este
asunto, debe eer a %ota de apartado anterior.
9 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
"odificar el contenido de un fichero
&a funci(n fputs() sir"e para escribir en e fichero especificado una cadena de caracteres de
tama.o !ue se indi!ue. Para poder reai4ar esta operaci(n, (+icamente, e fichero debe estar
abierto. Esta funci(n de"ue"e e "aor (+ico %rue si se ha podido reai4ar a operaci(n sin
probema o &alse si no se ha podido.
#u sinta'is es a si+uiente6
fputs('nombre completo del fichero' o identificador,
cadena que se escribe,tamaHo de la cadena.3
E tercer ar+umento es opciona. #i no se pone, se escribe a cadena competa. #i se indica,
s(o se escribe e n,mero de caracteres se.aado.
Para !ue esta operaci(n funcione correctamente es preciso utii4ar bien e modo de apertura
de fichero. #i ha de a.adirse e te'to por e principio de fichero, debemos usar e par-metro de
apertura 7r(*5 si necesitamos a.adir e te'to por e fina, usaremos os par-metros de apertura
7a* o -a(*5 si !ueremos sustituir e contenido competo de fichero, hay !ue poner os
par-metros de apertura 7)* o 7)(*.
Por e3empo, a instrucci(n fputs('&icheros-9.php','Iuevo texto'.3 suponiendo !ue e
fichero se ha abierto con e par-metro 7r(*, a.ade e te'to a principio de fichero indicado
sustituyendo os caracteres ori+inaes !ue /ste ocupe.
&a funci(n f)rite() es id/ntica a fputs(. y su sinta'is e"a os mismos ar+umentos, !ue se
comportan i+ua !ue en a funci(n e'picada. As pues, puede usarse tambi/n en u+ar de a
anterior.
En e Ejemplo 3 de esta Unidad pueden "erse "arias operaciones con esta funci(n.
Besde e #ro+rama +estor de curso puede abrirse e Ejemplo 3 de esta Unidad. E bot(n
E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n Cod fuente se
accede a c(di+o PHP de mismo. En este e3ercicio se incuyen os e3empos cuyo c(di+o
hemos ido escribiendo 3unto a as funciones e'picadas y otros nue"os.
5 - Copiar borrar y reno!brar ficheros" Conocer sus atributos
En este apartado de a Unidad 4 "amos a e'picar otras operaciones !ue tambi/n pueden
e"arse a cabo en PHP con os ficheros6 copiaros, renombraros, borraros y conocer sus
atributos.
En os e3empos !ue acompa.an a as e'picaciones "amos a utii4ar os mismos ficheros con
os !ue hemos traba3ado en os dos apartados anteriores6 &icheros-5.php, &icheros-9.txt,
&icheros-:.txt y &icheros-<.txt. ;ecordamos !ue /stos deben haber sido copiados o
creados en e directorio de traba3o de aumno. Adem-s, este directorio debe especificarse
como ar+umento de a funci(n chdir(..
Como en os e3empos de este apartado tambi/n se "an a reai4ar operaciones !ue afectan a a
inte+ridad de os ficheros, como borraros o renombrar-n, aconse3amos comprimir estos cuatro
10 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
ficheros, para !ue se pueda "o"er a ori+ina siempre !ue se necesite. En todo caso,
procuraremos !ue en e Ejemplo . os ficheros !ueden a fina i+ua !ue estaban, para !ue
cua!uier aumno o aumna pueda practicar con eos. #i se tiene a+una duda sobre este
asunto, /ase a %ota de apartado se+undo )!brir y cerrar ficheros*.
Copiar un fichero
&a funci(n cop,() sir"e para hacer una copia fsica de un fichero en otro. Para poder reai4ar
esta operaci(n, e fichero ori+ina no debe estar abierto. Esta funci(n de"ue"e e "aor (+ico
%rue si se ha podido reai4ar a operaci(n sin probemas o &alse si no se ha podido.
#u sinta'is es a si+uiente6
copy('nombre del fichero original', 'nombre del fichero destino'.3
Por e3empo, copy('&icheros-9.txt','&icheros9-9.txt'.3 hace una copia e'acta de primero
en e se+undo.
En e Ejemplo 4 de esta Unidad pueden "erse "arias operaciones con esta funci(n y as
si+uientes de este apartado.
#i e fichero destino e'iste, es sustituido autom-ticamente. Por eso, con"iene combinar a
funci(n copy(. con a funci(n file_exists(), !ue detecta si un fichero e'iste, para no sustituir
in"ountariamente e contenido de un fichero con e de otro. As se hace en e Ejemplo ..
&a funci(n unlin*() sir"e para borrar fsicamente un fichero. Para poder reai4ar esta
operaci(n, e fichero ori+ina no debe estar abierto. Esta funci(n de"ue"e e "aor (+ico %rue si
se ha podido reai4ar a operaci(n sin probema o &alse si no se ha podido.
#u sinta'is es a si+uiente6
unlin=('nombre del fichero que debe borrarse'.3
Por e3empo, a instrucci(n unlin=('&icheros-9.txt'.3 eimina e fichero especificado. #i no se
ha fi3ado con chdir(. e directorio actua, hay !ue indicar deante de nombre de fichero e
camino competo donde se haa.
Para e"itar errores, con"iene combinar a funci(n unlin=(. con a funci(n file-exists(., como
hemos hecho con a funci(n copy(..
&a funci(n rename() sir"e para cambiar e nombre de un fichero. Para poder reai4ar esta
operaci(n e fichero ori+ina no debe estar abierto. Esta funci(n de"ue"e e "aor (+ico %rue si
se ha podido reai4ar a operaci(n sin probemas o &alse si no se ha podido.
#u sinta'is es a si+uiente6
rename('nombre del fichero original','nuevo nombre del fichero'.3
Por e3empo, rename('Iuevo.txt','&icheros-9.txt'.3 cambia e nombre de fichero ori+ina
por e nue"o nombre.
#i ya hay un fichero con e mismo nombre, a operaci(n no se e"a a cabo. Por eso, con"iene
11 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
combinar a funci(n rename(. con a funci(n file-exists(., tanto para comprobar !ue e'iste e
fichero ori+ina como para comprobar !ue no e'iste otro con e nombre !ue se e !uiere poner.
As se hace en e Ejemplo ..
Conocer los atributos, el tipo y el tama/o de un fichero
&as tres operaciones !ue hemos e'picado antes s(o pueden e3ecutarse si e fichero, caso de
!ue e'ista, tiene e atributo de s(o ectura en estado de &alse. Adem-s, es preciso saber otras
cosas para poder tratar un fichero, como si e'iste o no, si e nombre indicado es un de un
fichero o de un directorio y e tipo de fichero !ue es. $odo esto o "amos a "er en este
apartado.
&a funci(n filesi-e() de"ue"e e tama.o de un fichero e'presado en n,mero de bytes.
&a funci(n filet,pe() de"ue"e e tipo de fichero pasado como ar+umento. #e+,n e nombre
pasado como ar+umento, os tipos !ue puede de"o"er esta funci(n son6
fie6 es un fichero norma.
dir6 es un nombre de directorio.
inI6 es un enace simb(ico )s(o en sistema U2JK*.
fifo6 es una pia de tipo FJFL.
char6 es en dispositi"o de tipo car-cter, por e3empo 7C6M8.
bocI6 es un dispositi"o de bo!ue.
unIno?n6 tipo desconocido.
&a funci(n is_dir() de"ue"e %rue si es un directorio y &alse si no o es o no e'iste.
&a funci(n is_executa&le() de"ue"e %rue si es un fichero e3ecutabe por e ciente !ue accede
a mismo y &alse si no o es o no e'iste.
&a funci(n is_file() de"ue"e %rue si es un fichero norma y &alse si no o es o no e'iste.
&a funci(n is_lin*() de"ue"e %rue si es un enace simb(ico y &alse si no o es o no e'iste.
&a funci(n is_)rita&le() de"ue"e %rue si es un fichero en e !ue se puede escribir y &alse si
no o es o no e'iste.
&a funci(n is_reada&le() de"ue"e %rue si es un fichero !ue se puede eer y &alse si no o es o
no e'iste.
&a funci(n stat() de"ue"e una matri4 con 9< eementos !ue contienen informaci(n sobre e
fichero, si e'iste. Concretamente, se informa de os si+uientes aspectos6 dispositi"o, i0nodo,
permisos, n,mero de enace, propietario, +rupo, tipo de dispositi"o, tama.o, instante de ,timo
acceso, instante de a ,tima modificaci(n, instante de ,timo cambio, tama.o de bo!ue y
n,mero de bo!ues asi+nados. Como se "e, es una informaci(n m-s bien adecuada para e
12 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
administrador de un ser"idor. Adem-s, a+unas informaciones s(o son propias de sistema
&inu', por o !ue >indo?s de"ue"e e "aor 9.
En e Ejemplo 4 de esta Unidad pueden "erse "arias operaciones con as funciones
anteriores.
Besde e #ro+rama +estor de curso puede abrirse e Ejemplo 4 de esta Unidad. E bot(n
E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n Cod fuente se
accede a c(di+o PHP de mismo. En este e3ercicio se incuyen os e3empos cuyo c(di+o
hemos ido escribiendo 3unto a as funciones e'picadas y otros nue"os.
# - Operaciones con directorios
Hasta ahora s(o hemos traba3ado con ficheros dando por supuesto !ue /stos se haan en e
directorio C6McursoPHP5McursoMAumnosMficherosAdeAcurso, !ue hemos estabecido como
actua con a funci(n chdir(..
Pero PHP permite tratar tambi/n directorios6 crearos, eiminaros, fi3ar a+uno por defecto, as
como subir ficheros desde e ciente a ser"idor, usaros y "aidaros, etc/tera. En este apartado
"amos a estudiar estas funciones.
En os e3empos !ue acompa.an a as e'picaciones "amos a utii4ar e mismo directorio
C6McursoPHP5McursoMAumnosMficherosAdeAcurso y os mismos ficheros con os !ue hemos
traba3ado en os apartados anteriores6 &icheros-5.php, &icheros-9.txt, &icheros-:.txt y
&icheros-<.txt. Para no tocar os directorios y ficheros de Curso de PHP 5 , recordamos !ue
e aumno debe disponer de un directorio de traba3o y !ue os ficheros mencionados deben
haber sido copiados o creados en e mismo.
Como en os e3empos de este apartado tambi/n se "an a reai4ar operaciones !ue afectan a a
inte+ridad de os directorios, como crearos o borraros, con"iene traba3ar siempre en e propio
directorio, como en nuestro caso reai4amos siempre as operaciones dentro de
C6McursoPHP5McursoMAumnosMficherosAdeAcurso. En todo caso, procuraremos !ue en as
diferentes operaciones de Ejemplo 0 os directorios !ueden a fina i+ua !ue estaban, para
!ue cua!uier aumno o aumna pueda practicar con eos. #i se tiene a+una duda sobre este
asunto, /ase a %ota de apartado se+undo )!brir y cerrar ficheros*.
ijar un directorio del servidor por defecto
Fa hemos estudiado y practicado suficiente con a funci(n chdir(), !ue permite estabecer un
directorio como actua o por defecto. 2os remitimos a as e'picaciones dadas en e apartado
!brir y cerrar ficheros. Una "e4 fi3ado este directorio, cua!uier referencia a un fichero se
buscar- a!u, si no se especifica otro camino donde deba hacerse.
!brir un directorio
&a funci(n opendir() permite entrar en un directorio de ser"idor y tener acceso a sus ficheros
y subdirectorios. Es imprescindibe abrir un directorio para, despu/s, poder cerraro con
closedir(., eer sus ficheros con readdir(. o mo"er e puntero de ectura de un directorio con
re;inddir(..
13 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
#u sinta'is es a si+uiente6
opendir('camino completo de directorio'.3
Esta funci(n de"ue"e un identificador de directorio !ue nos ser"ir- despu/s para hacer
referencia a ese directorio, como ocurre con os ficheros.
Por e3empo, opendir('curso!*!+'.3 abre este directorio. Para !ue nos de"ue"a un
identificador !ue necesitaremos despu/s, o me3or es escribir6
7id-dircurso8opendir('curso!*!+'.3
Adem-s, como hemos hecho en os ficheros, recomendamos a si+uiente estructura, ya usada
y e'picada en os ficheros6
7id-dircurso8
6opendir('2curso!*!+2curso2,lumnos2ficheros-del-curso2'.
or die('/01El directorio )'2curso!*!+2curso2,lumnos2ficheros-del-curso2)'
no se ha podido abrir./201/!1'.3
Es importante tener en cuenta !ue, a escribir e camino, a barra & debe escribirse dobe, si bien
recomendamos usar me3or a barra ,nica 1.
PHP dispone tambi/n de una case !ue nos permite acceder y tratar os directorios. Es a case
dir(). Para abrir un directorio funciona i+ua !ue opendir(.. Adem-s, tiene dos propiedades,
!ue son handle )puntero* y path )camino*, y tres m/todos, !ue son read(. )eer e nombre de
un fichero o subdirectorio*, re;ind(. )e"ar e puntero a principio de directorio* y close(.
)cerrar e directorio*. Bentro de esta case pueden usarse, adem-s, as funciones est-ndar de
mane3o de directorios. En a Unidad anterior se e'pican as cases, donde e aumno puede
repasar estos contenidos, si o necesita.
@er c(mo se usa esta case en e Ejemplo 5.
Cerrar un directorio
&a funci(n closedir() permite cerrar un directorio de ser"idor. E directorio debe haber sido
abierto pre"iamente.
#u sinta'is es a si+uiente6
closedir('nombre del identificador de directorio'.3
Leer un directorio
&a funci(n readdir() permite eer os ficheros o directorios de directorio abierto.
#u sinta'is es a si+uiente6
readdir('nombre del identificador de directorio'.3
Esta fnci(n ee e nombre de fichero o directorio sobre e !ue est/ e puntero y a"an4a /ste a
si+uiente. &o norma es usar esta funci(n dentro de un buce !ue "aya eyendo uno a uno os
eementos )ficheros o subdirectorios* de directorio.
14 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Por e3empo, podemos recorrer un directorio competo de a forma si+uiente6
7id-dircurso8
6opendir('2curso!*!+2curso2,lumnos2ficheros-del-curso'.
or die('/01El directorio)'2curso!*!+2curso2,lumnos2ficheros-del-curso)'
no se ha podido abrir./201/!1'.3
;hile (7fichero8readdir(7id-dircurso..
C
if (is-dir(7fichero..
print ('7fichero /01es un directorio./201/!1'.3
else
print ('7fichero /01es un fichero./201/!1'.3
E
&a case dir() tambi/n permite eer un directorio, como hemos e'picado antes.
"over el puntero de lectura de un directorio
&a funci(n re)inddir() e"a e puntero de ectura de un directorio a principio de /ste, para
poder eero competo si e puntero se haba despa4ado anteriormente.
#u sinta'is tambi/n es sencia6
re;inddir('nombre del identificador de directorio'.3
En e Ejemplo 5 de esta Unidad pueden "erse "arias operaciones con estas funciones y as
si+uientes de este apartado.
Crear un directorio
&a funci(n m*dir() permite crear un directorio dentro de directorio actua. &a sinta'is es
sencia6
m=dir('nombre del nuevo directorio',entero octal de modo.3
En U2JK hay !ue poner un se+undo par-metro )n,mero entero en base octa*, !ue indica e
modo o permisos de creaci(n. 2o es e caso de este curso. En >indo?s debemos poner E en
este par-metro.
Esta funci(n de"ue"e e "aor (+ico %rue si se ha podido reai4ar a operaci(n sin probema o
&alse si no se ha podido. #i no hay un directorio estabecido como actua, es preciso poner e
camino competo de directorio !ue se !uiere crear.
Por e3empo, as instrucciones
7nuevo-dir8'!ruebas'3
m=dir(7nuevo-dir,A.3
crean e directorio 7Pruebas8 dentro de 7C6McursoPHP5McursoMAumnosM ficherosAdeAcurso8.
Con e E'porador de >indo?s puede comprobarse !ue reamente se ha creado.
#i e directorio ya e'iste, se produce un error. Por eso, a i+ua !ue ocurre con os ficheros,
15 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
con"iene comprobar con a funci(n file-exists(. si ya e'iste, para no intentar crearo en este
caso.
2orrar un directorio
&a funci(n rmdir() permite borrar un directorio. #u sinta'is es tambi/n sencia6
rmdir('nombre del directorio que se quiere borrar'.3
Esta funci(n de"ue"e e "aor (+ico %rue si se ha podido reai4ar a operaci(n sin probema o
&alse si no se ha podido. #i no hay un directorio estabecido como actua, es preciso poner e
camino competo de directorio !ue se !uiere eiminar. Para poder borrarse, e directorio debe
e'istir y estar "aco.
Por e3empo, as instrucciones
7directorio8'!ruebas'3
rmdir(7nuevo-dir.3
eiminan e directorio 7Pruebas8 dentro de NC6McursoPHP5McursoMAumnosM ficherosAdeAcurso8.
Con e E'porador de >indo?s puede comprobarse, i+uamente, !ue reamente se ha
eiminado.
#i e directorio no e'iste o no est- "aco, se produce un error. Por eso, a i+ua !ue ocurre con
os ficheros, en esta operaci(n con"iene comprobar con a funci(n file-exists(. si e'iste, con
e si+no C para e"itar e mensa3e si no e'iste y con die(. para mostrar un mensa3e propio si
e'iste, pero no est- "aco. =sta sera una forma ee+ante de hacero6
7directorio8'!ruebas'3
if (file_exists(7directorio.. .rmdir(7directorio.
or die('/01El directorio )'!ruebas)' no se ha podido borrar
al no estar vaco./201/!1'.3
#i e probema consiste en !ue no est- "aco, hay !ue eiminar todos os ficheros con a funci(n
unlin=(. antes de intentar borrar e directorio.
En e Ejemplo 5 de esta Unidad pueden "erse "arias operaciones con as funciones
e'picadas
Subir ficheros al servidor, usarlos y validarlos
Con PHP e ciente de una p-+ina ?eb tambi/n puede subir ficheros a ser"idor desde su
ordenador, es decir, se puede con"ertir en emisor de informaci(n.
&a forma m-s frecuente de hacero es reenando formuarios con a informaci(n !ue e website
e pida, sea /sta persona, profesiona o econ(mica, a fin de conse+uir a+o, como obtener
datos sobre a+o !ue e interesa, comprar a+,n producto, apuntarse en un ser"icio, etc/tera.
&os datos !ue e usuario en"a a ser"idor sueen ser de tipo te'to. Cuando se reciben en su
destino, se procede con eos como con"en+a se+,n a finaidad de a apicaci(n.
16 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Pero tambi/n es posibe en PHP en"iar ficheros a ser"idor, en formato te'to o binario. Por
e3empo, se puede remitir un fichero con e currculum vitae o una foto+rafa, etc/tera.
@amos a estudiar os pasos !ue se dan cuando se sube un fichero a ser"idor6
9. %ediante un formuario se pre+unta e nombre de fichero. En e Ejemplo 6 de esta
Unidad se usa e script uni4Ae3eG.php para pre+untar e fichero !ue se !uiere subir. E'picamos
bre"emente e c(di+o, !ue est- compuesto e'cusi"amente por eti!uetas H$%&.
/J
include 'uni<-ejeD-configura.php'3
echo '/&$KL EIC%M!E8multipart2formNdata LE%*$O8post ,C%P$I87destino1
Iombre del fichero( /PI!U% %M!E8&ile I,LE8fichero QPRE8:+1
/PI!U% %M!E8ShiddenS name8SL,T-&PUE-QPRES V,UUE8S+59AAS1
/PI!U% %M!E8submit I,LE8submit V,UUE8Qubir-al-Qervidor1'3
J1
En primer u+ar, se usa a orden include para acceder a os datos de un fichero de
confi+uraci(n )uni<-ejeD-configura.php* donde hemos definido e inciai4ado a+unas "ariabes
!ue usaremos ue+o en este script, como 7destino, en a !ue se +uarda e nombre de script
!ue debe e3ecutarse para subir e fichero ee+ido a ser"idor )'uni<-ejeD-sube.php'* y otras
!ue se usan tambi/n en este ,timo fichero, como 7directorio, !ue es e destino de fichero
!ue se sube o 7fr-repetida, donde se +uarda a frase !ue se muestra a usuario si e fichero
no se ha podido subir por haber uno ya en e ser"idor con e mismo nombre.
Con"iene obser"ar !ue e script uni<-ejeD-configura.php se incuye tambi/n en e script
Nuni<-ejeD-sube.phpN.
&as eti!uetas H$%& nue"as son6
EIC%M!E8multipart2formNdata para poder e'aminar directorios a seeccionar e fichero
!ue se !uiere subir.
%M!E8&ile para indicar !ue e tipo de dato !ue se "a a pasar a script
uni<-ejeD-sube.php es un fichero.
%M!E8ShiddenS name8SL,T-&PUE-QPRES V,UUE8S+59AAS para definir una entrada ocuta
)hidden* a usuario de a p-+ina en a !ue se fi3a !ue e tama.o m-'imo )L,T-&PUE-QPRE*
de fichero debe ser de 5E Ob.
Cuando se seecciona un fichero y se pusa sobre e bot(n 'Qubir al servidor', de forma
autom-tica se pasa e fichero a ser"idor.
:. ;ecepci(n de fichero en e ser"idor. A e3ecutarse e script uni<-ejeD-sube.php, e ser"idor
recibe este fichero en un directorio tempora, especificado en a "ariabe de entorno
upload-tmp-dir. En nuestro caso, este directorio es c()curso!*!+)bin),pache9)php+)temp. A
fichero se e pone un nombre !ue se inicia por php, se+uido de unos n,meros y de a e'tensi(n
tmp. Por e3empo, !hp5AA5.tmp. Adem-s, de forma autom-tica, se crea a "ariabes nue"a
/_012!345fichero56, !ue nos informan de os si+uientes datos6
7-&PUEQFSficheroSGFSnameSG6 nombre ori+ina de fichero !ue se pasa.
7-&PUEQFSficheroSGFStmp-nameSG6 nombre de fichero tempora !ue se sube a ser"idor.
17 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
7-&PUEQFSficheroSGFSsizeSG6 tama.o de fichero !ue se pasa.
7-&PUEQFSficheroSGFtypeSG6 tipo de fichero !ue se pasa.
Pero e fichero tempora permanece s(o unos instantes en e directorio tempora de ser"idor,
por o cua hay !ue copiaro a directorio donde !ueremos !ue se manten+a.
<. Copia de fichero desde e directorio tempora hasta e directorio destino. A e"ar a cabo
esta operaci(n es e momento de hacer os controes !ue creamos oportunos para !ue no se
copie un fichero de cua!uier tipo, ni se sustituya otro !ue tu"iera e mismo nombre, ni se
sobrepase una determinado tama.o, etc/tera.
Para copiar e fichero, podemos usar as instrucciones
7fichero-destino8'7directorio'.7-&PUEQFSficheroSGFSnameSG3
move-uploaded-file(7-&PUEQFSficheroSGFStmp-nameSG, 7fichero-destino.3
En cuanto a os controes anteriores a a copia, podemos haceros as6
Para e"itar !ue se copie un fichero de tama.o mayor de 5E Ob o !ue no ha sido ee+ido
en e formuario a en"iar a "ariabe 7-&PUEQ "aca, podemos escribir6
if (7-&PUEQFSficheroSGFSsizeSG1+59AA or 7-&PUEQFSficheroSGFSsizeSG/5.
C
die ('/01El fichero ocupa m#s de +5.9AA bytes o no ha indicado
su nombre en el formulario. Io puede copiarse./201'.3
E
Para copiar ficheros de cua!uier tipo, podemos escribir6
if (7subir-cualquiera88'QP'.
C
7fichero-destino8'7directorio'.7-&PUEQFSficheroSGFSnameSG3
move-uploaded-file(7-&PUEQFSficheroSGFStmp-nameSG, 7fichero-destino.3
E
4. Bestrucci(n de fichero tempora. Aun!ue e ser"idor borra autom-ticamente en pocos
se+undos e fichero tempora, es con"eniente eiminaro tambi/n desde e propio pro+rama para
e"itar !ue se "ayan !uedando en ese directorio tempora ficheros !ue ya no se necesitan. Por
e3empo, e ser"idor puede funcionar ma, apa+arse, etc/tera, sin haber e+ado a eiminar e
fichero tempora. #e hace con a instrucci(n
unlin=(7-&PUEQFSficheroSGFStmp-nameSG.3
En e Ejemplo 6 de esta Unidad puede "erse comentado y competo e c(di+o anterior. En
esa sencia apicaci(n se ei+e un fichero y se sube a ser"idor poniendo a+unos controes de
"aidaci(n.
Besde e #ro+rama +estor de curso pueden abrirse e Ejemplo 5 y e Ejemplo 6 de esta
Unidad. E bot(n E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n
Cod fuente se accede a c(di+o PHP de os mismos. En este e3ercicio se incuyen os e3empos
cuyo c(di+o hemos ido escribiendo 3unto a as funciones e'picadas en este apartado.
18 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
$ - Otras operaciones con ficheros y directorios
Adem-s de as operaciones mencionadas, con os ficheros y directorios pueden e"arse a cabo
otras operaciones, como as !ue e'picamos a continuaci(n.
,ellenar una ventana desple+able con los ficheros de un directorio
;esuta muy c(mo seeccionar uno entre "arios ficheros si en una eti!ueta #E&EC$ de H$%&
pueden incuirse todos os ficheros de directorio o s(o a+unos, se+,n su tipo. En e c(di+o
si+uiente puede "erse c(mo se hace6
7directorio8('2curso!*!+2curso2,lumnos2&icheros-del-curso2'.3
echo '/QEUEC% I,LE8)'7directorio)'1'3
7puntero8opendir(7directorio.3
22 ,vanzamos el puntero hasta el primer
22 fichero sobrepasando . y ..
7fichero8readdir(7puntero.3
7fichero8readdir(7puntero.3
;hile (7fichero.
C
7fichero8readdir(7puntero.3
if (ereg('7',7fichero..
2W Ua funci"n ereg(. permite buscar cadenas
coincidentes. !ertenece a las funciones
para expresiones regulares, como eregi(. y
split(., entre otras. W2
echo '/$!%P$I V,UUE8S7ficheroS17fichero/2$!%P$I1/!1'3
E
echo '/2QEUEC%1'3
Puede "erse c(mo se e"a acabo esta operaci(n en e Ejemplo 7 de esta Unidad. En e
mismo aparecen os par-metros !ue deben ponerse en a funci(n ere+() para !ue s(o se
muestren os ficheros de tipo php o txt.
Transformar un fichero $T"L en otro de tipo te3to
A estudiar a funci(n fgetss(. ya "imos !ue esta funci(n ee un fichero y, si es de tipo H$%&,
eimina as eti!uetas propias de este en+ua3e. @eamos c(mo se e"a a cabo esta operaci(n6
7origen-html8fopen('uni<-eje?-fichero.html','r'.3
7destino-txt8fopen('uni<-eje?-fichero.txt',';'.
or die ('Io se puede crear el fichero destino.'.3
;hile (Bfeof(7origen-html..
C
7linea8fgetss(7origen-html,9+D,''.3
echo '7linea /!1'3
fputs(7destino-txt,trim(7linea..')n'.3
E
A "eces, puede resutar ,ti esta rutina cuando se necesita disponer de un fichero en cuyo
contenido se hayan eiminado as eti!uetas H$%& y con"ertido e fichero en otro nue"o de tipo
te'to.
19 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Besde e #ro+rama +estor de curso pueden abrirse e Ejemplo 7 de esta Unidad. E bot(n
E3ecutar muestra en a p-+ina e resutado de su interpretaci(n. Con e bot(n Cod fuente se
accede a c(di+o PHP de os mismos. En este e3ercicio se incuyen os e3empos cuyo c(di+o
hemos ido escribiendo 3unto a as funciones e'picadas en este apartado.
#ermisos y propietarios
Cuando se traba3a en una pataforma U2JK, cosa habitua en Jnternet, PHP dispone de un
con3unto de funciones !ue permiten +estionar os permisos y propietarios de os ficheros y de
os directorios. Como este curso ha sido creado para >indo?s, recomendamos a aumno o
aumna !ue use PHP con Uni'P&inu' !ue estudie y aprenda a usar as funciones si+uientes6
ch+rp()6 permite cambiar e +rupo a !ue pertenece un fichero.
chmod()6 permite cambiar os permisos de un fichero.
ch)on()6 permite cambiar e propietario de un fichero.
file+roup()6 de"ue"e e identificador de un +rupo.
fileo)ner6 de"ue"e e identificador de usuario de un fichero.
fileperms()6 de"ue"e os permisos de un fichero.
% - Resu!en
$ay 4ue saber al final de esta unidad
!sta&lecer un directorio por defecto con chdir(..
A&rir un fichero con fopen(. o con dir(., poniendo
controles con die(. y con file-exists(. por si el
fichero no existe o la operaci"n con se puede
realizar.
7sar el operador 6 y aplicar correctamente los
diversos modos de abrir un fichero, tanto de lectura
como de escritura.
Cerrar un fichero con fclose(..
8ecorrer un fichero moviendo el puntero con fread(.
y con re;ind(..
9o"er el puntero de un fichero con fsee=(..
2ocali-ar la posici:n del puntero con ftell(..
20 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
Conocer si el puntero ha lle+ado a la marca de final
de fichero con feof(..
2eer el contenido de un fichero con feread(.,
fgets(., fgetc(. y fgetss(..
2eer un fichero l;nea a l;nea con file(. y saber
cu#ntas lneas tiene con count(..
2eer el contenido de un fichero completo con
readfile(. y fpassthru(..
!scri&ir en un fichero con fputs(. y f;rite(.
sabiendo aplicar en cada caso los diferentes modos
de apertura.
Copiar ficheros con copy(. combinada con
file-exists(..
$orrar ficheros con unlin=(..
8enom&rar ficheros con rename(..
Conocer el tama<o de un fichero con filesize(., su
tipo con filetype(. y sus atri&utos con is-dir(.,
is-executable(., is-file(., is-lin=(., is-;ritable(.
y is-readable(..
Conocer la informaci:n so&re un fichero que se genera
con la funci"n stat(. y se guarda en una matriz.
A&rir un directorio con la funci"n opendir(. y la
clase dir(..
Conocer , sa&er usar correctamente las propiedades ,
m=todos de la clase dir(..
Cerrar un directorio con closedir(..
2eer los ficheros o su&directorios de un directorio
con readdir(. o con la clase dir(..
9o"er el puntero de lectura de un directorio con
re;inddir(..
Crear un directorio con m=dir(..
$orrar un directorio con rmdir(..
21 de 22
Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros
3u&ir ficheros al ser"idor> usarlos , "alidarlos(
8ellenar una "entana desple+a&le (QEUEC% de *%LU. con
los ficheros de un directorio.
?ransformar un fichero H?92 en otro de tipo texto.

MENTOR - CNICE MEC 2006
22 de 22
Teora: Gestin Usuarios y sesiones
1 - Objetivos
Objetivos
Conocer qu son las cookies, para qu se usan y sus limitaciones.
Distinguir los elementos que integran las cookies.
Aplicar correctamente las funciones que permiten crear cookies.
Aplicar correctamente las funciones que permiten leer el contenido de
las cookies.
Aplicar correctamente las funciones que permiten borrar las cookies.
Limitar el alcance de los cookies.
Conocer qu son las sesiones de usuario, para qu se usan y
cmo se gestionan.
Aplicar correctamente las funciones que permiten gestionar y
manejar las sesiones.
Aplicar correctamente las funciones que permiten controlar las
conexiones y operaciones que realizan los usuarios que acceden
al servidor.
2 - Las cookies
El sistema de trabajo basado en la comunicacin entre cliente y servidor a travs de nternet
puede reali!arse sin que sea necesario que el primero" que #ace una solicitud al segundo y
recibe de l informacin" necesite identificarse. As$ lo #emos #ec#o #asta a#ora en los
ejercicios de las %nidades anteriores" m&s por motivos did&cticos que tcnicos.
'ero lo m&s frecuente en las comunicaciones y transacciones reales entre cliente y servidor es
que ste obtenga informacin del usuario e incluso controle y permita su acceso" as$ como que
tenga constancia de sus operaciones y las autorice mediante los correspondientes permisos.
Esto se logra de dos formas que vamos a abordar en esta %nidad( mediante las cookies" que
entre otras pueden tener esta misin" y sobre todo mediante el control de usuarios y la gestin
de sesiones.
Concepto de cookie
Las cookies son unos fic#eros de te)to muy peque*os que contienen informacin sobre el
propio cliente. El servidor solicita al usuario algunos datos" que se guardan en el disco duro del
propio cliente +navegador, y pueden ser recuperados despus por el servidor en sucesivas
cone)iones. As$" el servidor puede comprobar de alguna forma si ese usuario ya #a solicitado
una informacin determinada o contestado a alguno de los cuestionarios propuestos" para
poder seguir sus cone)iones" orientarle sobre lo solicitado" almacenar datos de cone)in"
contrase*a o preferencias" etctera.
-o es lugar ste para discutir la moralidad de este procedimiento que" seg.n algunos" atenta
contra la privacidad del usuario. En todo caso" conviene saber que la informacin que puede
contener una cookie es muy elemental y b&sica" y no puede incluir informacin reservada o
cr$tica" como claves personales" n.meros de cuentas corrientes o de tarjetas de crdito"
etctera. De todas formas" son los administradores de los servidores y sus due*os quienes
deciden qu informacin solicitan y" por tanto" los responsables de su recogida y usos.
/ambin el usuario puede completarla o no" seg.n sus conveniencias.
Las cookies son usadas con bastante frecuencia por las web que necesitan llevar un control de
los usuarios que las visitan y las consultas que #acen" sobre todo las que se dedican al
comercio electrnico" que almacenan en ellas los cdigos de los productos que consultan" para
poder recuperarlos directamente de este fic#ero si el cliente vuelve a visitarlas.
Casi todos los navegadores" como -etscape o nternet E)plorer" slo admiten un n.mero
m&)imo de cookies en total +unas 011 dependiendo del tipo de navegador,. Adem&s" el tama*o
m&)imo por cookie es de 2 3b +2.145 bytes," por lo cual no #ay que tener miedo de que saturen
la capacidad del disco duro.
Informacin de las cookies
La informacin de una cookie est& definida en el protocolo 6//' e integrada por los siguientes
datos" que constituyen los par&metros de la funcin que la crea(
7. -ombre de la cookie.
8. 9alor" que es el contenido de la cookie.
0. :ec#a de caducidad( periodo de vigencia durante el cual puede ser recuperada por el
servidor.
2. Dominio dentro del cual es v&lida la cookie. ;i no se especifica" slo es v&lida para el
dominio del servidor que la gener. El navegador devuelve la cookie a cualquier equipo que
tenga el dominio especificado.
<. =uta( por defecto es >?@" es decir" el directorio ra$! de las p&ginas a las que se devuelve la
cookie.
5. ;eguro( por defecto est& desactivado +Disabled," pero puede especificarse este par&metro
para establecer un canal seguro del protocolo 6//'; si se necesita por tratarse de una
informacin confidencial.
Al estudiar las funciones de creacin y manejo de las cookies" se ver& cmo incluir estos
par&metros dentro de la funcin correspondiente.
El lenguaje '6' dispone de funciones para crear" leer y borrar cookies. De ellas vamos a tratar
en los apartados siguientes. ;i lo quiere" el alumno o alumna" a partir de a#ora" puede incluir
este procedimiento en las aplicaciones que escriba.
En el Captulo !"# Cookies del $anual de %&% +puede encontrarse en la ayuda del Editor
devA'6', aparecen las e)plicaciones sobre este procedimiento y las funciones que permiten su
manejo.
Crear, leer y borrar cookies
La funcin setcookie() crea y env$a al cliente una cookie estableciendo los elementos que la
integran. ;u sinta)is es la siguiente(
setcookie ("nombre de la cookie", $valor, fecha de caducidad,
ruta, dominio, seguro);
De estos seis par&metros slo es imprescindible el primero" nombre de la cookie. ;i no se pone
el segundo" se crea la cookie" pero a la ve! se borra en el ordenador del cliente. Los tres
par&metros siguientes" si no se ponen" toman el valor que est fijado en la configuracin del
servidor. El .ltimo" si no se pone" queda des#abilitado. ;i se quiere #abilitar" #ay que poner el
valor 7. 'ara saltar un par&metro cuando #ay que poner otro posterior" deben ponerse las
comas y entre ellas una cadena vac$a (,"",) en $valor" ruta y dominio. En el caso de fecha
de caducidad y seguro #ay que poner un n.mero entero +n.mero de segundos en la fecha, o 1
+en seguro, si no se quiere fijar e)presamente.
La funcin setcookie() crea y env$a una cookie al cliente juntamente con la cabecera de la
p&gina. 'or eso" es absolutamente imprescindible escribir esta funcin antes que las etiquetas
B6/CLD o B6EADD" incluso sin poner delante espacios ni l$neas en blanco" para que sea la
primera que se ejecute al procesarse el script '6'. De lo contrario" se produce un error
indicando que no puede a*adirse la informacin de la cabecera.
6ay que tener en cuenta que" cuando se crea una cookie" es enviada al cliente" por lo cual no
se puede ver #asta que se carga de nuevo la p&gina. ;i se #an incluido en el mismo script las
dos operaciones +crear cookie y ver su contenido," debe ejecutarse la p&gina dos veces para
que se muestre el valor que tenga en la segunda carga.
9eamos varios ejemplos donde se crean cookies con diferentes par&metros(
$usuario="Jorge";
setcookie("Nombre", $usuario);
crea una cookie denominada nombre que contiene el valor >Eorge@. /ambin pod$amos #aber
escrito m&s directamente
setcookie("Nombre","Jorge");
'odemos fijar su caducidad de esta forma(
$pieza="ornillo";
setcookie("!ierro", $pieza, time()"#$$);
En el tercer par&metro indicamos que dure < minutos +011 segundos, a partir del momento en
que se crea. ;i queremos que dure #asta las 78(01(11 del d$a 07 de julio de 8118" podemos
escribir tambin(
setcookie("!ierro", $pieza, mktime(%&,#$,$,',#%,&$$&);
Al crearse la cookie anterior se crea a la ve! una variable" que tiene como nombre el nombre
de la cookie +$()**+,-."Nombre"/, y como contenido su valor +"Jorge",. Esta variable
permanece con un &mbito global #asta que caduque la cookie.
Las variables que contienen cookies son almacenadas por '6' en un array denominado
$()**+,-."nombre de la variable"/. De esta forma podemos leer y mostrar cada cookie si
conocemos su nombre(
print ("0a cookie nombre tiene el valor "1$()**+,-."Nombre"/1"1");
o recorrer con un bucle toda la matri! de cookies y leer su $ndice y su valor(
2hile( list($nombre, $contenido) = each($()**+,-) ) 3
print ("0a cookie 456$nombre4756 tiene el valor
456"1$contenido1"4756486");
9
/ambin podemos asignar varios valores a una misma cookie. Esto es .til y necesario para no
alcan!ar el l$mite de cookies permitido por el navegador del usuario. 'ara #acerlo" usamos una
matri! que tenga tantos elementos como valores queramos que contenga la misma cookie.
'odemos crearla as$(
setcookie("0ibro.$/","-l m:dico",time()"#$$);
setcookie("0ibro.%/","Noah ;ordon",time()"#$$);
setcookie("0ibro.&/","%<<&",time()"#$$);
Despus" podemos leer y mostrar su contenido con un bucle for accediendo con el $ndice a
cada elemento de su nombre" como en los casos anteriores.
En el Ejemplo 1 de esta %nidad puede verse completo el cdigo de los ejercicios anteriores y
probar cmo funciona en la p&gina que genera.
'ara eliminar una cookie basta escribir la funcin setcookie() incluyendo como .nico
argumento el nombre de la cookie que se quiere eliminar. 'or ejemplo" la instruccin
setcookie("Nombre"); borra la cookie del mismo nombre.
En el Ejemplo 2 de esta %nidad #acemos desaparecer la cookie creada pulsando en el botn
apropiado y utili!ando esta funcin.
La forma m&s frecuente de usar las cookies en nternet es #aciendo que el usuario introdu!ca
los datos mediante un formulario la primera ve! que entra en la p&gina. El cdigo puede ser
similar al siguiente(
4=
if ( (isset($(8*>."accion"/)) ?? ($(8*>."accion"/=="crearcookie") )
3
setcookie("usuario",$(8*>."tu(nombre"/,time()"@$);
echo "!ola, "1$(8*>."tu(nombre"/1"1 5ienvenido a nuestra pAgina 2eb1
BCctualiza la pAgina para ver los datos de la cookie almacenadaD486";
if (isset($()**+,-."usuario"/) and $()**+,-."usuario"/D="")
print ("0a cookie 456usuario4756 tiene el valor456"1$()**+,-."usuario"/1
"4756486");
9
else
echo "4E*FG C),*N=H"uniI(eJe&1phpH" G-!*K=8*>6
4,N8L M8-=H"hiddenH" NCG-=H"accionH" NC0L-=H"crearcookieH"6
Nombre de usuarioO4,N8L M8-=H"tePtH" NCG-=H"tu(nombreH"6
4,N8L M8-=H"submitH" NC0L-=H"-nviarH"6
47E*FG6";
=6
Cuando se ejecuta este cdigo por primera ve!" como $(8*>."accion"/ no es igual a
>crearcookie@" se ejecutan las l$neas del formulario 6/CL" dentro de la cl&usula else. En estas
l$neas se establece que al pulsar el botn >Enviar@ se vuelva a ejecutar el mismo script
+C),*N="uniI(eJe&1php"," se asigna a la variable $(8*>."accion"/ el contenido >crearcookie@
+,N8L M8-="hidden" NCG-="accion" NC0L-="crearcookie", y se pregunta el nombre del
usuario en una ventana +Nombre de usuarioO 4,N8L M8-="tePt" NCG-="tu(nombre",. Cuando
se pulsa >Enviar@ en la variable $(8*>."tu(nombre"/ pasa el contenido y se crea la cookie
usuario con el contenido que #aya en $(8*>."tu(nombre"/ y se le asigna una caducidad de un
minuto +setcookie ("usuario",$(8*>."tu(nombre"/, time()"@$);,. 'ara ver el contenido
guardado en la cookie es necesario ejecutar el script por segunda ve! actuali!ando la p&gina.
'uedes ver cmo funciona un cdigo m&s completo en el Ejemplo 2.
Como #emos visto" a las cookies se les puede poner limitaciones de tiempo +par&metro expire
de caducidad," de camino dentro del cual pueden ser vistas +par&metro path de ruta," de
&mbito dentro del servidor +par&metro domain de dominio, y de proteccin de la privacidad
+par&metro secure de seguridad,.
Desde el %rograma gestor del curso pueden abrirse los Ejemplo 1 y Ejemplo 2 de esta
%nidad. El botn Ejecutar muestra en la p&gina el resultado de su interpretacin. Con el botn
Cod fuente se accede la cdigo '6' del mismo. En este ejercicio se incluyen los ejemplos
cuyo cdigo #emos ido escribiendo junto a las funciones e)plicadas.
3 - Cabeceras de los documentos HTTP, HTML y !L
6emos comentado en el apartado anterior que es absolutamente imprescindible escribir la
funcin setcookie() antes que las etiquetas B6/CLD o B6EADD" incluso sin poner delante
espacios ni l$neas en blanco" para que sea la primera que se ejecute al procesarse el script
'6' antes de que el servidor env$e alguna salida al cliente. Aprovec#amos este momento para
#ablar de las cabeceras de los documentos que generan p&ginas web.
Las cabeceras contienen diversos datos" unos para ofrecer informacin y otros para que la
p&gina se muestre con determinadas caracter$sticas. 'or ejemplo" pueden incluir te)tos que
deben aparecer" claves para que los buscadores puedan encontrarlas" informacin sobre los
crditos de la aplicacin" control de la memoria cac# de navegador" especificacin del tiempo
de refresco de la p&gina" etctera.
En lenguaje 6/CL una cabecera define una propiedad de la p&gina y los atributos de esa
propiedad. En este lenguaje cada cabecera va precedida de la palabra CE/A. 'or ejemplo"
4G-C NCG-="Cutor" )*N-N="J1J1 )aballero"6.
En la direccin #ttp(??FFF.F0.org?'rotocols?rfc815G?rfc815G y en la direccin
http://vancouver-webpages.com/META/ #ay informacin sobre las etiquetas que se usan
en 6/CL dentro de las cabeceras y para qu sirven.
'6' dispone de la funcin header() para enviar cabeceras 6//' desde este lenguaje. ;u
sinta)is es sencilla(
header(cadena con el nombre de la cabecera Q su valor);
Al igual que pasa con setcookie()" para que funcione correctamente" #ay que poner esta
instruccin al principio del script" antes de que se env$e ninguna salida al navegador del cliente.
'or ejemplo" la instruccin
header("-PpiresO Gon, &$ Jul &$$I &&O$$O$$ ;G");
establece que el documento 6/CL generado con esta cabecera y presente en la cac# de un
servidor pro)y o del mismo navegador del cliente e)pira el d$a 81 de julio de 811< a las 71 de la
noc#e.
Conviene observar que el nombre de la etiqueta +-Ppires, es propio del lenguaje 6/CL y" por
tanto" para saber cu&les son y lo que #ace cada una" se puede recurrir a la segunda direccin
de nternet que #emos indicado m&s arriba.
La instruccin
header(")ontentRQpeO tePt7html");
establece el tipo de documento que ser& v&lido en el navegador del usuario" en este caso los
documentos de tipo te)to o planos.
Desde el %rograma gestor del curso pueden abrirse el Ejemplo 3 de esta %nidad. El botn
Ejecutar muestra en la p&gina el resultado de su interpretacin. Con el botn Cod fuente se
accede la cdigo '6' del mismo.
" - Control sim#le de usuarios
El control de usuarios de una aplicacin en nternet es uno de los procedimientos m&s
frecuentes y comunes" de forma que slo puedan acceder a determinadas p&ginas aquellas
personas que sean reconocidas y estn autori!adas en sus diferentes perfiles. De este asunto
vamos a tratar precisamente en el presente apartado.
Como sabemos" este control suele #acerse preguntando un nombre o identificador de usuario
+id o login, y una clave o contrase*a +password,. Heneralmente" esta validacin de los usuarios
que acceden a un servidor web suele ser llevada a cabo por el propio servidor. 'ero tambin es
posible #acerlo enviando en la cabecera una solicitud de validacin para entrar en una
aplicacin concreta.
En todo caso" slo es posible utili!ar estas funciones correctamente para enviar esta validacin
cuando se configura '6' como un mdulo +librer$a dll en IindoFs, que carga el servidor #ttp.
Es decir" no funciona en la versin CH de '6'" como ocurre si #as instalado el curso en
IindoFs 4G o Ce" debido a que el este sistema operativo no permite la carga correcta de los
mdulos en Apac#e. ;i el curso lo #as instalado en IindoFs -/2.1" 8111 J' no tendr&s
ning.n problema en ver el resultado.
El Canual de '6' e)plica este proceso en el Captulo !'# (utentificacin &))% con %&%. Es
recomendable leer las e)plicaciones que se dan en esta parte del Canual.
En la direccin #ttp(??FFF.!end.com?!end?tut?aut#entication.p#pK6eading70 puede
encontrarse un buen Canual +en ingls, de autentificacin con '6' publicado por Lend.
'ara que una aplicacin pueda obtener un nombre de usuario y una contrase*a" es preciso dar
los siguientes pasos(
7. El servidor debe remitir al cliente una cabecera de validacin.
8. El navegador del cliente pregunta al usuario" en un cuadro de di&logo" el nombre de usuario
y su contrase*a.
0. El navegador proporciona al servidor estos datos y solicita cargar la p&gina" cosa que
sucede si #ay coincidencia de ambos datos con los que contiene el servidor.
E)pliquemos paso a paso este proceso suponiendo que no es el servidor quien controla
e)ternamente este proceso de validacin de usuarios" sino que se #ace a travs de las
cabeceras oportunas utili!ando '6'.
'ara remitir la cabecera de validacin" #ay que utili!ar las dos instrucciones siguientes"
que env$an dos cabeceras(
header(STTTRCuthenticateO 5asic realm=")urso de 8!8 I"S);
header(S!87%1$ U$% LnauthorizedS);
;i se necesita conocer el valor de los argumentos 6//'?7.1 +6yper/e)t /ransfer 'rotocol,"
puede buscarse informacin en la direccin de nternet #ttp(??FFF.ics.uci.edu?.
Al enviar estas cabeceras de validacin" '6' presenta un cuadro de di&logo solicitando
el nombre y la contrase*a. Este cuadro de di&logo puede ser diferente en cada
navegador.
%na ve! le$dos los valores" estos dos datos se asignan a las variables de entorno
$(>-FN-F.S8!8(CL!(L>-FS/ +nombre de usuario, y $(>-FN-F.S8!8(CL!(8TS/
+contrase*a,.
Como puede ocurrir que ninguna de las dos variables de entorno citadas
+$(>-FN-F.S8!8(CL!(L>-FS/ y $(>-FN-F.S8!8(CL!(8TS/, est definida porque el usuario
todav$a no se #a validado" conviene utili!ar el control condicional if
(Disset($(>-FN-F.S8!8(CL!(L>-FS/)) para prevenir posibles errores.
En el caso de que usemos la validacin e)terna de la que dispone el servidor Apac#e usamos
la variable $(>-FN-F.SF-G*-(L>-FS/ para conocer la identidad del usuario que se #a validado
e)ternamente.
En Ejemplo 4 de esta %nidad puede verse el cdigo completo de una aplicacin que utili!a
este procedimiento de validacin. En el mismo podemos ver los dos casos( usuario validado
e)ternamente +$(>-FN-F.SF-G*-(L>-FS/, y mediante el lenguaje '6'
+$(>-FN-F.S8!8(CL!(L>-FS/,.
%na ve! que tenemos el nombre de usuario y su contrase*a" podemos comprobar de m.ltiples
formas si son correctos y darle acceso a la p&gina que pretende ver.
El procedimiento m&s elemental es comparar la informacin que nos proporciona el usuario en
ambos apartados del cuadro de di&logo con los datos que tengan asignados dos variables y
comprobar su coincidencia" en cuyo caso se le permite el acceso. De no ser as$" se muestra un
mensaje indicando que no est& autori!ado. En el Ejemplo 4 de esta %nidad lo #acemos as$.
El botn Ejecutar muestra en la p&gina el resultado de su interpretacin. Con el botn Cod
fuente se accede la cdigo '6' del mismo.
%n procedimiento m&s complejo y frecuente es acceder a una base de datos o a un fic#ero de
te)to donde estn arc#ivados los nombres y contrase*as de los usuarios autori!ados y
comprobar si los que #a proporcionado el cliente est&n dentro de ese fic#ero o de la base.
/ambin es posible #acer esta validacin de usuarios intentando una cone)in a una base de
datos con la informacin proporcionada por el usuario. Como todav$a no #emos abordado las
bases de datos" pondremos alg.n ejemplo de estos dos .ltimos procedimientos en ese
momento.
Mtro tema relacionado con la validacin de usuarios es la revalidacin de un usuario en un
momento dado. ;i un usuario deja abierto su navegador" cualquier otra persona puede acceder
a su informacin. Es m&s" algunos navegadores ofrecen la posibilidad de guardar los datos de
acceso en la memoria cac#" con lo cual es f&cil acceder utili!ando esa informacin sin
necesidad de ser el usuario autori!ado ni conocer su nombre y contrase*a. 'or esto es mejor
utili!ar las ;esiones de usuario que se ver&n en el apartado siguiente.
$ - %esti&n de sesiones
La gestin de las sesiones de usuario facilita considerablemente el trabajo del desarrollador de
una aplicacin web para controlar la navegacin del usuario por las p&ginas del servidor.
Cediante las sesiones se puede saber qu operaciones reali!a el cliente a lo largo de su
navegacin" dato que deben conocer las aplicaciones que tengan que controlarlo" como son las
de comercio electrnico" las de transacciones bancarias o las que tienen una cesta de la
compra" en las que suelen proporcionarse y transmitirse datos confidenciales que e)igen mejor
gestin de las sesiones.
%na sesin se crea en el momento en que un usuario entra en un website pudindose
identificar o acceder annimamente. Al entrar" se genera un identificador +id," que puede
seguirse mientras est conectado para saber qu informaciones obtiene o qu operaciones
reali!a el citado usuario. Los datos de la sesin asociados a este identificador se guardan en el
servidor dentro de un fic#ero en el directorio especificado en la seccin .>ession/ del fic#ero
de configuracin p#p.ini. Concretamente" al instalar el Curso #emos fijado el camino siguiente
para guardar este identificador" como puede verse en el fic#ero citado antes(
session1save(path = ")OHcurso8!8IHbinHCpache&HphpIHsesiones"
6ay dos maneras de propagar el id del usuario entre las diferentes p&ginas (
Cediante Cookies.
A travs de 'ar&metros %=L.
Debido a que el mtodo ideal consiste en utili!ar cookies" vamos a centrarnos en stas.
Este identificador tiene un tiempo de vida y" por tanto" la sesin que lo #a creado tambin
caduca. Este tiempo puede fijarse en el fic#ero p#p.ini dentro de la variable
session1cookie(lifetime" que #emos establecido a *++ para que caduque pasados < minutos.
De esta manera el alumno o alumna podr& comprobar en su ordenador el contenido de la
cookie generada. 'or defecto" las cookies se guardan" si utili!as nternet E)plorer" en el
directorio cOH2indo2sHcookies +en FindoFs 4G?Ce, o en )OHKocuments and
>ettingsHnombre(usuario(2indo2sH)ookies +en FindoFs -/?8111?J', en un fic#ero cuyo
nombre sea parecido a Nlocal#ostO7P.t)t y si usas Co!illa :irefo) en el directorio cOHKocuments
and >ettingsHnombre(usuario(2indo2sHKatos de
programaHGozillaHEirefoPH8rofilesHdefault1dla. La cookie se llama cookie1tPt.
El Canual de '6' e)plica este proceso en el Captulo ,C-I# .unciones para el manejo de
/esiones. Es recomendable leer las e)plicaciones que se dan en esta parte del Canual y en
cada una de las funciones que permiten establecer sesiones" mantenerlas y cerrarlas.
.unciones para manejar las sesiones desde %&%
'6' incorpora funciones para gestionar las sesiones de usuarios. El nombre de todas se inicia
con el prefijo session seguido de 0 y del nombre de la funcin que reali!an.
(brir una sesin y conocer los datos de la misma
La funcin session_start() abre una nueva sesin de trabajo o prolonga la que ya est& abierta
conservando su identificador. ;u sinta)is es sencilla(
session(start();
/odas las p&ginas que quieran gestionar sesiones de usuario deben incorporar esta funcin o
bien se puede establecer en el fic#ero p#p.ini dentro de la variable session1autostart=% para
no tener que incluir esta sentencia en los scripts p#p.
%na ve! ejecutada esta funcin" se crea una cookie en el ordenador del usuario o se lee la
almacenada. Adem&s" se guarda la informacin de la sesin en un fic#ero en el directorio del
servidor especificado en session1save(path del fic#ero p#p.ini.
Diversas funciones nos permiten acceder a los datos de la sesin abierta. 9eamos cu&les son.
La funcin session_name() devuelve y?o establece el nombre de la sesin abierta en ese
momento. ;e utili!a como nombre de la cookie. 'or defecto es 8!8>->>,K" pero podemos
cambiarlo poniendo como argumento de esta funcin otro nombre diferente.
'or ejemplo" la instruccin
print(session(name());
devuelve el valor de 8!8>->>,K.
y las instrucciones
session(name("Gi(sesiVn");
print(session(name());
devuelve Gi(sesiVn.
La funcin session_save_path() devuelve y?o establece el camino donde se guardan el fic#ero
con los datos de un identificador de sesin.
'or ejemplo" las instrucciones
session(save(path(")O7curso8!8I7curso7Clumnos7ficheros(del(curso7");
print(session(save(path());
devuelve )O7curso8!8I7curso7Clumnos7ficheros(del(curso7 y" adem&s" desde este momento"
la sesin abierta guarda el identificador y los datos de la sesin en un fic#ero en este directorio.
La funcin session_id() devuelve y?o establece el nombre del identificador de la sesin en
curso. 6ay que tener en cuenta que esta identificacin es absolutamente imprescindible para el
manejo y control de las sesiones de un usuario" pues identifica el nombre de la cookie que se
guarda en el ordenador del usuario.
'or ejemplo" la instruccin
print(session(id());
devuelve el valor de 8!8>->>,K.
y las instrucciones
session(id("0a sesiVn del curso");
print(session(id());
devuelve 0a sesiVn del curso.
1estruir una sesin
La funcin session_destroy() borra toda la informacin que se #aya recogido y asociado a la
sesin activa. ;u sinta)is es sencilla(
session(destroQ();
/ambin produce los mismos efectos la sinta)is que incluye como argumento el identificador de
la sesin session(destroQ($session(id); e incluso session(destroQ("0a sesiVn del
curso");
Debemos tener en cuenta que esta funcin no destruye la sesin ni el fic#ero donde se #a
guardado la cookie con su identificador" sino slo la informacin asociada a la misma que se va
generando a medida que un usuario va movindose y reali!ando operaciones dentro de una
aplicacin web.
2egistrar la informacin de una sesin
/odos los datos devueltos por las funciones anteriores slo permiten crear sesiones" destruirlas
e identificarlas. 'ero lo verdaderamente importante es poder asociar informacin sobre las
operaciones y despla!amientos de un cliente por una aplicacin web. En este apartado vamos
a estudiar las funciones que permiten guardar esta informacin y acceder a ella posteriormente.
La funcin session_register() permite registrar las variables que se pasen como argumentos.
Esta funcin soporta un n.mero indeterminado de variables o de arrays" donde se guardar& la
informacin que necesitemos o queramos conservar. Las variables definidas tienen la siguiente
forma( $(>->>,*N."nombre de la variable"/. Estas variables tienen &mbito global" por lo cual
se pueden utili!ar mientras dure la sesin abierta. ;u sinta)is es la siguiente(
session(register(Svar%S,Svar&S,Svar#S111);
'ara poder guardar la informacin de una sesin es imprescindible #aber creado la sesin con
session(start() antes de escribir la funcin session(register().
A travs de un ejemplo vamos a e)plicar cmo se guardan los datos de una sesin.
4=
session(start();
session(register(SusuarioS,ShoraS,ScontadorS,SpaginaS);
$(>->>,*N."usuario"/="Cna";
$(>->>,*N."hora"/=time();
$(>->>,*N."pagina"/="$(>-FN-F."8!8(>-0E"/;
if (emptQ($(>->>,*N."contador"/)) 3$(>->>,*N."contador"/=$;9
$(>->>,*N."contador"/"";
echo "Nombre de la sesiVnO "1$(>->>,*N.SnombreS/1
"486Nombre del usuario O "1$(>->>,*N.SusuarioS/1
"486!ora Wltima entradaO "1strftime("X!OXGOX>
del Xd7Xm7XM",$(>->>,*N.ShoraS/);
=6
En primer lugar" ponemos la orden session(start(); para crear una sesin. A continuacin"
usamos la funcin session(register() para definir las variables que deseamos almacenar.
:inalmente modificamos el contenido de las variables generadas y mostramos la informacin
guardada.
En el Ejemplo 5 de esta %nidad puede verse el cdigo fuente de una aplicacin completa
que utili!a sesiones de usuario.
La funcin session_unregister() se usa para desligar una o m&s variables del registro de la
sesin. Es decir" aqu$ se reali!a la operacin contraria( si una variable #a sido registrada como
global con la funcin session(register()" con session(unregister() podemos eliminarla para
que no forme parte de los par&metros iniciales.
En el ejemplo anterior" si escribimos session(unregister(SusuarioS); la variable
$(>->>,*N."usuario"/ queda eliminada y" por tanto" ya no ser& posible mostrar su informacin.
La funcin session_is_registered() nos permite saber si una variable est& definida en el
registro de la sesin o no. Devuelve rue si lo est& y Ealse si no lo est&. ;iempre que
trabajemos con variables del registro de una sesin" conviene usar esta funcin evitando as$
posibles errores si una de ellas no est& registrada"
La funcin session_encode() devuelve una cadena que contiene los valores codificados de una
sesin. Dentro de la cadena separa cada valor con un signo 3 al principio y un signo Q al final.
La funcin session_decode() recupera los datos de una sesin guardados en una cadena que
se le pasa como argumento y los asigna a las variables de la sesin en curso. As$ pues" sirve
para restaurar los valores de las variables previamente guardadas en una cadena con la
funcin session(encode().
Desde el %rograma gestor del curso puede abrirse el Ejemplo 5 de esta %nidad. El botn
Ejecutar muestra en la p&gina el resultado de su interpretacin. Con el botn Cod fuente se
accede la cdigo '6' del mismo.
' - Control de cone(iones
Cientras un usuario est& conectado al servidor nos puede interesar conocer las acciones que
reali!a e incluso manejar sus decisiones" como la orden de cancelar la carga de la p&gina. '6'
dispone de funciones para conocer y controlar" #asta cierto punto" las cone)iones de los
clientes al servidor. En este apartado vamos a tratar brevemente de este asunto.
El lenguaje '6' distingue tres estados en la cone)in(
-ormal( el usuario est& conectado. /iene el valor 1.
Abortado( el usuario #a mandado detener la carga de la p&gina. /iene el valor 7 que
equivale a la constante CM--EC/M-RASM=/ED.
Caducado( se #a sobrepasado el tiempo establecido de cone)in. /iene el valor 8 que
equivale a la constante CM--EC/M-R/CEM%/.
Cuando un script '6' se est& ejecutando" se activa el estado 4ormal. ;i el cliente remoto se
desconecta" se pasa al estado (bortado. Esto suele ocurrir cuando el usuario pulsa en el
botn ;top +Detener, del navegador. ;i se alcan!a el l$mite de tiempo fijado en '6' para
ejecutar un script +ver las funciones connection(timeout() y set(time(limit()," se pasa al
estado Caducado +,G-*L,.
'uede ocurrir que sea necesario tambin #acer que termine la cone)in de un usuario" por
ejemplo" cuando no se #a validado correctamente o su consulta persistente no obtiene
resultados.
9eamos a continuacin las principales funciones de '6' que permiten llevar a cabo las
operaciones mencionadas.
El Canual de '6' e)plica este proceso en el Captulo 5+# $anejando conexiones. Es
recomendable leer las e)plicaciones que se dan en esta parte del Canual y en cada una de las
funciones que permiten el control de las cone)iones.
Conocer si el cliente 6a cortado una conexin
La funcin connection_aborted() permite saber si el usuario #a desconectado una cone)in en
curso. Esta funcin devuelve True si lo #a #ec#o y False en el caso contrario. ;u sinta)is es
sencilla(
connection(aborted();
;i el usuario de la p&gina pulsa sobre el botn Detener +Stop, de su navegador" la funcin
connection(status() devuelve el valor 7 y se deja de interpretar la p&gina que se est
cargando. 'or lo tanto" no debe esperarse que '6' mande ninguna salida m&s a la pantalla
del usuario. En este caso" la mayor$a de los servidores y navegadores tienen previsto enviar al
cliente un mensaje est&ndar para que sepa qu est& pasando. 'or ejemplo" cuando una p&gina
caduca" puede aparecer(
CdvertenciaO 0a pAgina ha caducado
0a pAgina solicitada se creV utilizando la informaciVn Yue enviV en un formulario1
-sta pAgina no estA Qa disponible1 )omo medida de precauciVn, ,nternet -Pplorer no
volverA a enviarle la informaciVn1
8ara volver a enviar la informaciVn Q ver esta pAgina Teb haga clic en el botVn
Actualizar 1
En el Ejemplo 6 de esta %nidad puede verse el cdigo que permite desconectarse y los
efectos que produce.
La funcin connection_status() devuelve el estado actual de la cone)in" seg.n lo e)plicado
anteriormente( el valor 1 indica que el usuario sigue conectadoT el valor 7" que #a interrumpido
la cone)in voluntariamenteT el valor 8" que el tiempo de cone)in #a caducadoT el valor 0" que
la cone)in #a sido interrumpida por el usuario y que tambin #a caducado.
-ota( slo es posible utili!ar esta funcin correctamente para conocer el estado de la cone)in
cuando se configura '6' como un mdulo +si #as instalado el curso en FindoFs -/?8111?J',.
Es decir" no funciona si #as instalado el curso en FindoFs 4G?Ce.
La funcin connection_timeout() devuelve el valor True si el tiempo de cone)in #a caducado
y False si no lo #a #ec#o.
%n script tambin se puede terminar por un tempori!ador interno. El timeout por defecto es de
01 segundos. ;e puede cambiar usando la directiva maP(ePecution(time en el fic#ero p#p.ini o
la correspondiente directiva php(maP(ePecution(time en la configuracin del servidor de
p&ginas Apac#e.
La funcin set_time_limit() nos permite tambin establecer el tiempo de ejecucin de un
script. Cuando el tempori!ador acaba su cuenta" el script se aborta como en el caso de la
descone)in del cliente. Debe tenerse en cuenta que este tempori!ador empie!a a contar
desde 7 prescindiendo de los segundos que ya se #ubieran consumido. Como argumento
debemos pasarle el n.mero de segundos que debe durar. El valor cero indica que no #ay l$mite
de tiempo.
La funcin ignore_user_abort() determina si la descone)in voluntaria del usuario debe
suspender la ejecucin del script. Esta funcin" pues" des#abilita la posibilidad que tiene el
cliente de desconectarse pulsando Detener +Stop,. Aunque el usuario deje de ver la
interpretacin de la p&gina" '6' acaba con el cdigo completo.
La funcin register_shutdown_function() permite registrar una funcin que debe ejecutarse al
cerrarse una cone)in. /oma como argumento el nombre de otra funcin" que se ejecutar& al
acabarse la ejecucin de un script. La funcin pasada como argumento slo se ejecuta
despus de #aberse producido todas las salidas de la p&gina" por lo cual no puede usarse para
mostrar informacin en el navegador o guardarla en un fic#ero normal. 'or esto"
recomendamos utili!ar la funcin de p#p error_log() que permite guardar la informacin en
fic#ero. Es recomendable leer las e)plicaciones que se dan sobre esta funcin en el apartado
U/ratamiento de ErroresU de la teor$a de la %nidad G o fijarse en el Ejemplo 6 de esta
%nidad..
La funcin get_browser() obtiene la informacin de un navegador guardada en el fic#ero
bro2scap1ini. /oma como argumento el nombre del navegador. La informacin se refiere a las
capacidades que tiene el navegador del usuario.
Otras funciones de %&% que suelen usarse en las conexiones
La funcin exit() o exit nos permite terminar un programa cuando nos interese. La
interpretacin del cdigo '6' se interrumpe cuando se encuentra esta orden. Va la #emos
usado en diferentes script.
La funcin die() #ace lo mismo que ePit" pero permite mostrar un mensaje de te)to entre
comillas dentro de los parntesis. La interpretacin del cdigo '6' se interrumpe cuando se
encuentra esta orden y se muestra la cadena de te)to que se pone como argumento. Va la
#emos usado tambin en diferentes script.
La funcin sleep() retrasa la ejecucin de un programa tantos segundos como se indique en
su argumento. 'or ejemplo" la instruccin sleep(%$); retrasa la interpretacin de la p&gina 71
segundos. Conviene saber que la interpretacin del programa no se detiene cuando se
encuentra esta instruccin" sino que se detiene desde el principio" es decir" no se manda nada
a la pantalla del usuario aunque la funcin sleep() ocupe la .ltima l$nea.
La funcin usleep() retrasa la ejecucin de un programa tantos microsegundos como se
indique en su argumento. 'or ejemplo" la instruccin usleep(%$$$); retrasa la interpretacin de
la p&gina 7.111 microsegundos.
Desde el %rograma gestor del curso puede abrirse el Ejemplo 6 de esta %nidad. El botn
Ejecutar muestra en la p&gina el resultado de su interpretacin. Con el botn Cod fuente se
accede al cdigo '6' del mismo.
) - !esumen
&ay que saber al final de esta unidad
Identificar una cookie Q conocer la informaciVn Yue
contiene1
!rear y enviar una cookie al servidor con la funciVn
setcookie()1
"liminar una cookie con la misma funciVn1
#eer el contenido de una cookie1
$tilizar correctamente la funci%n header() para
crear Q enviar al servidor una cabecera !81
Autentificar usuarios, tanto desde el propio
servidor como mediante el envZo de las cabeceras
!8 oportunas1
&evalidar usuarios1
'estionar usuarios Yue acceden al servidor1
Abrir una sesi%n y conocer sus datos con las
funciones session(start(), session(name(),
session(module(name(), session(save(path() Q
session(id()1
(estruir una sesi%n con session(destroQ()1
&egistrar los datos de una sesi%n con la funciVn
session(register()1
"liminar alg)n dato del registro de una sesi%n con
la funciVn session(unregister()1
!onocer si una variable est* definida en el registro
de una sesiVn con la funciVn
session(is(registered()1
+asar a una cadena los valores registrados en una
sesiVn con la funciVn session(encode() Q
recuperarlos de la misma con session(decode()1
!onocer el estado de una conexi%n con la funciVn
connection(status()1
(etectar si el usuario de ha desconectado con la
funciVn connection(aborted()1
(etectar si la conexi%n ha caducado con la funciVn
connection(timeout() Q fiJar un nuevo periodo de
conePiVn con set(time(limit()1
(esactivar la posibilidad de Yue el usuario se
desconecte finalizando el script php con la funciVn
ignore(user(abort()1
!onocer las capacidades del navegador Yue estamos
usando con la funciVn get(bro2ser()1
Interrumpir la e,ecuci%n de un programa con las
funciones ePit() Q die()1
(etener temporalmente la e,ecuci%n de un programa
con las funciones sleep() Q usleep()1
MENTOR - CNICE MEC 2!
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Teora: Introduccin y uso de MySQL
1 - Objetivos
Objetivos
Conocer la arquitectura de una aplicacin web que utilia bases de
datos!
Asimilar el concepto y estructura de una base de datos!
Adquirir conocimientos bsicos de la base de datos MySQL y
utiliar correcta"ente sus sentencias para realiar di#erentes
operaciones con los contenidos de las bases de datos!
Conocer y saber aplicar correcta"ente las principales sentencias
SQL!
2 - Arquitectura de una aplicacin web que use bases de datos
He"os $isto %asta a%ora c"o &enerar p'&inas din'"icas con PHP! (n los e)ercicios y
e)e"plos anteriores %e"os podido apreciar la capacidad de este len&ua)e para crear este tipo
de p'&inas* si bien la in#or"acin "ostrada %asta el "o"ento es bastante sencilla y ele"ental!
Pero PHP adquiere $erdadera potencia y utilidad en la &eneracin de p'&inas din'"icas
cuando utilia la in#or"acin arc%i$ada en bases de datos!
+ste es precisa"ente el terreno en el que los len&ua)es &eneradores de p'&inas web alcanan
resultados espectaculares* %asta el punto de que "'s del ,-. de los websites se sir$en de
este procedi"iento para en$iar al cliente su in#or"acin! Por e)e"plo* cualquier cadena de
noticias tiene una base de datos que puede ser actualiada per"anente"ente* incluso a lar&a
distancia por los corresponsales re"otos* cuya in#or"acin o#rece en tie"po real a los clientes
que entran en su web! Lo "is"o pasa con las e"presas de co"ercio electrnico /e-
commerce01 usan di#erentes bases de datos para contener in#or"acin sobre sus productos* los
per#iles de sus clientes reales o potenciales y los datos de las co"pras que 2stos $ayan
%aciendo! 3a"bi2n las web de las entidades bancarias usan bases de datos para arc%i$ar y
"ostrar in#or"acin sobre los "o$i"ientos en las cuentas corrientes y otras operaciones de
sus clientes!
(n esta Unidad $a"os a abordar conoci"ientos b'sicos sobre las bases de datos y c"o se
inte&ran en una p'&ina web* estudiando concreta"ente la base de datos MySQL y el len&ua)e
de consulta SQL! (n la si&uiente Unidad abordare"os* directa"ente ya* c"o trata PHP las
bases de datos al &enerar las p'&inas din'"icas!
1 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Arquitectura de una aplicacin web
(n el apartado Funcionamiento de un programa codificado con PHP de la Unidad 4
presenta"os el si&uiente esque"a1
Servidor web
Intrprete PHP
Ejecuta
Programa
escrito en
lenguaje PHP
Devuelve al
usuario la
pgina web en
formato HTM
Solicita al
servidor una
pgina web

!suario
cliente

(n este &r'#ico aparecen slo dos de las tres capas /tiers0 que inte&ran el proceso co"pleto de
interpretacin de una p'&ina web!
(n la pri"era capa o ni$el el usuario* utiliando su na$e&ador* %ace una solicitud al ser$idor*
con el que se conecta a tra$2s del protocolo H33P! Le pide que interprete un script y le re"ita
el resultado* que se recibe en #or"ato de p'&ina H3ML!
(n la se&unda capa o ni$el el ser$idor en$5a esa solicitud al int2rprete PHP para que e)ecute el
pro&ra"a y de$uel$e el resultado al na$e&ador del cliente!
Pero a%ora* lle&ado el "o"ento* debe"os a6adir una tercera capa o ni$el* que est' inte&rada
por la base o bases de datos con las que conecta el ser$idor y de las que e7trae la in#or"acin
solicitada por el cliente! (s decir* el ser$idor* cuando encuentra en el pro&ra"a rdenes y
#unciones de creacin* "odi#icacin y consulta de una base de datos* acceda a ella y e7trae*
eli"ina o actualia esa in#or"acin* se&8n las operaciones que deban e)ecutarse en el script!
Para establecer esta cone7in entre el ser$idor y la base de datos* es preciso utiliar enlaces
que sir$an de canal de co"unicacin entre a"bos! (stos enlaces pueden ser de dos tipos1 el
tipo est'ndar 9:;C /Open DataBase Conectivity0* que es "'s &en2rico y sir$e para conectar
cualquier ser$idor con aquellas bases que lo soporten* que son casi todas< y el enlace
particular o nati$o que ten&a cada tipo de base de datos* deno"inado =PI /Application
2 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Programming Interface0* que est' inte&rado por el con)unto de #unciones propias de un tipo de
base de datos que puede incorporar el pro&ra"ador cuando est' utiliando ese tipo de base!
(l pri"er tipo de enlace es "'s &eneral y* por tanto* $ale para todos los tipos de base que lo
soporten* que son la &ran "ayor5a* pero a su $e su e)ecucin es "'s lenta que la de las =PIs
de cada base de datos particular! (l se&undo tipo de enlace es "'s r'pido y e#ica cuando se
traba)a slo con un tipo de base de datos* pero e7i&e ca"biar el cdi&o si se utilia otro tipo de
base de datos! Por e)e"plo* 9racle y MySQL tienen =PIs co"pleta"ente di#erentes* "ientras
que estos dos tipos de base de datos soportan per#ecta"ente ta"bi2n el enlace 9:;C!
As queda el esquema completo
"ase de datos
#D"$
%PI
Servidor web
Intrprete PHP
Ejecuta
Programa escrito en
lenguaje PHP

HTTP
Devuelve al
usuario la pgina
web en formato
HTM
Solicita al servidor
una pgina web

!suario
cliente
=s5 pues* en las Unidades 6 y > $a"os a aplicar el proceso co"pleto1
Se escribe el cdi&o #uente de la p'&ina web en len&ua)e PHP incluyendo las #unciones
=PI nati$as de la base de datos* en nuestro caso MySQL!
Se &uarda este cdi&o en el ser$idor web!
3 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
(l na$e&ador del usuario solicita al ser$idor la p'&ina codi#icada y &uardada en los dos
pasos anteriores!
(l ser$idor interpreta el cdi&o PHP conectando* cuando sea preciso* con la base de
datos y realiando con ella las operaciones pre$istas!
(l ser$idor en$5a el resultado del cdi&o PHP al na$e&ador del usuario* que $e en su
pantalla la p'&ina en #or"ato H3ML!
3 - Las bases de datos
(n este apartado $a"os a e7plicar bre$e"ente al&unos conceptos #unda"entales sobre las
bases de datos! Supone"os que el alu"no o alu"na ya tiene conoci"ientos su#icientes sobre
las "is"as y* por tanto* abordare"os slo al&unos conoci"ientos "'s relacionados con la
#or"a en que PHP accede a las bases de datos y trata su in#or"acin!
(l t2r"ino base de datos es in#or"'tico* pero puede aplicarse ta"bi2n a la #or"a co"o se
al"acena* ordena y utilia "anual"ente la in#or"acin! Por e)e"plo* la a&enda en la que
apunta"os "anual"ente los datos con el no"bre* direccin y tel2#ono de nuestros a"i&os o
personas con las que necesita"os relacionarnos* puede ser considerada una base de datos en
este sentido "'s a"plio! I&ual"ente* el arc%i$ador en el que &uarda"os las #ic%as
biblio&r'#icas de una in$esti&acin o de una biblioteca ta"bi2n puede ser considerado co"o
tal! (n todas ellas se al"acena in#or"acin* se ordena de al&una #or"a /al#ab2tica"ente en la
a&enda* por te"as* autores o t5tulos en el #ic%ero de la biblioteca* etc2tera0 y se consulta
cuando es necesario!
Sin e"bar&o* en el sentido in#or"'tico* la palabra base de datos se re#iere a una coleccin*
con)unto o depsito de datos* al"acenados en un soporte "a&n2tico o de otro tipo* accesibles
por "8ltiples usuarios de #or"a r'pida y e#ica "ediante el ordenador a tra$2s de una o de
$arias aplicaciones in#or"'ticas independientes de los datos! +stos se relacionan entre s5 y
est'n or&aniados de tal "anera que es #'cil introducirlos* actualiarlos* recuperarlos o lle$ar a
cabo con ellos otras operaciones de &estin!
(n el caso de PHP es el ser$idor quien conecta con la base de datos* a peticin del na$e&ador
del usuario* y realia las operaciones pre$istas en la aplicacin* de$ol$iendo posterior"ente al
na$e&ador del cliente los resultados de esas operaciones!
?eneral"ente* en las bases de datos relacionales* de las que %ablare"os despu2s* la
in#or"acin est' al"acenada y or&aniada en #ic%eros #or"ados por #ilas y colu"nas* co"o
puede $erse en el e)e"plo si&uiente* en el que se presentan al&unos datos de cinco libros de
una biblioteca1
Columnas
4 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Filas
Ttulo Autor Editorial
El invierno en
Lisboa
Antonio
Muoz
Molina
Seix Barral
Tener o ser? Erich Fromm
Fondo de Cultura
Econmica
Crnica de una
muerte anunciada
!abriel
!arc"a
M#r$uez
Bru%uera
El lobo
este&ario
'ermann
'esse
Ana(a Editores
La vida est# en
otra &arte
Milan
)undera
Seix Barral
Cada #ila contiene el t5tulo* el autor y la editorial de un libro y se relaciona con las de"'s #ilas
&racias a que incluye el "is"o tipo de in#or"acin /datos de los libros0 y en todas ellas la
in#or"acin est' or&aniada de la "is"a #or"a1 la pri"era colu"na contiene el t5tulo del libro*
la se&unda* el autor y la tercera* la editorial!
=s5 pues* una base de datos contiene un con)unto de #ic%eros cuya in#or"acin est'
or&aniada de tal #or"a que puede ser tratada in#or"'tica"ente con rapide y e#icacia! La
in#or"acin de una base de datos puede al"acenarse en un solo #ic%ero o en $arios!
Los #ic%eros de una base de datos est'n &rabados en el ser$idor! 3ienen un no"bre /por
e)e"plo* #lores* rios* libros* coc%es* a"i&os* articulo* clientes* $entas * #acturas* etc2tera0! Su
deno"inacin debe se&uir las nor"as establecidas para que el no"bre de un #ic%ero sea
correcto! Co"o puede $erse* %e"os prescindido de las tildes en los identi#icadores que las
lle$an orto&r'#ica"ente!
(l tipo o e7tensin de estos #ic%eros de base de datos puede ser "uy $ariado* se&8n el tipo de
base de datos utiliado1 en d;ase es dbf /Data Base File* @ic%ero de ;ase de :atos0* en
=ccess mdb* en Interbase db o dbf* en MySQL myd* etc2tera!
Las #ilas de un arc%i$o de base de datos se deno"inan registros y las colu"nas* campos
/#ields* en in&l2s0!
=s5 pues* un #ic%ero de base de datos est' inte&rado por registros* que son cada uno de sus
ele"entos o co"ponentes /#lor* r5o* libro* coc%e* a"i&o* art5culo* cliente* $enta o #actura0!
3odos los re&istros contienen un con)unto de campos en los que se al"acena su in#or"acin<
este con)unto de#ine la estructura del #ic%ero que inte&ra una base de datos!
(n la representacin &r'#ica si&uiente puede obser$arse* en #or"a de tabla* la estructura de un
5 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
#ic%ero que contiene una base de datos con in#or"acin sobre personas1
Campos
Nombre Sueldo Fecha_nac Observacio Foto
1
2
3

!e"istros #
$
%
&
'
1(
11
(n las #ilas aparecen %asta once re&istros cada uno de los cuales* en este caso* contiene los
cinco ca"pos si&uientes1 Ao"bre* Sueldo* @ec%aBnac* 9bser$acio y @oto!
(n el e)e"plo anterior slo se %an incluido once re&istros y cinco ca"pos* pero de %ec%o en las
bases de datos que $a"os a usar el n8"ero de re&istros es ili"itado /depende de la capacidad
del soporte0 y el de ca"pos es "uy a"plio* se&8n el tipo de base de datos usada! 3odos los
re&istros tienen los "is"os ca"pos!
Si co"para"os un #ic%ero de base de datos con los arc%i$adores de una biblioteca* pode"os
decir que 2stos inte&ran la base de datos! Cada arc%i$ador es co"o un #ic%ero de la base de
datos* las #ic%as que %ay en su interior son los re&istros y los apartados de cada #ic%a /t5tulo*
autor* editorial* etc2tera0 son los ca"pos!
Cada ca"po de un re&istro tiene un nombre* un tipo* una longitud o anc%o* un n!mero de
decimales si es de tipo nu"2rico o de co"a #lotante y un ndice opcional! Se&8n el tipo de
base de datos que se est2 utiliando* el identi#icador del ca"po* la clase de tipos y la lon&itud
de los "is"os pueden ser di#erentes! Aos $a"os a re#erir* co"o e)e"plo* slo a la estructura
de las bases de datos creadas con MySQL!
(l no"bre de cada ca"po puede ser "uy lar&o* si bien reco"enda"os que en el orden
pr'ctico sea lo "'s bre$e posible y ten&a al&8n si&ni#icado! :ebe atenerse a las re&las de
todos los identi#icadores ya co"entadas anterior"ente!
Hay estos tipos de campos* que cita"os de #or"a &en2rica1
4! Campo de tipo Carcter ! (s el "'s co"8n /letras* d5&itos* si&nos* etc2tera0* y contiene
in#or"acin que es tratada co"o una cadena de caracteres! Se asi&na este tipo a un ca"po
cuando no se realian operaciones arit"2ticas con sus datos* ni contiene una #ec%a* ni es un
te7to "ayor de C55 caracteres! Por e)e"plo* se asi&na este tipo al ca"po cuyo contenido $a a
ser el no"bre de una persona* sus apellidos* do"icilio* localidad* pro$incia* etc2tera! =d"ite
5ndice! (n MySQL %ay dos tipos de ca"pos para al"acenar datos de esta clase1 CH=D y
E=DCH=D! 3iene una lon&itud desde 4 %asta C55 caracteres! Si la lon&itud de la cadena que
se asi&na a este ca"po no alcana los C55 caracteres* el tipo CH=D co"pleta con espacios en
6 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
blanco los que #alten ocupando sie"pre este ca"po la "is"a lon&itud! (n ca"bio* el tipo de
car'cter E=DCH=D slo ocupa el espacio que precise la cadena de te7to* es decir* su lon&itud
es $ariable y* por tanto* se a%orra espacio cuando el contenido puede ser "uy di#erente en
lon&itud!
C! Ca"po de tipo "um#rico! Se utilia para escribir n8"eros* incluidos los si&nos positi$o y
ne&ati$o! Se asi&na este tipo a un ca"po cuando se realian operaciones arit"2ticas con
n8"eros enteros o reales* co"o su"ar* restar* "ultiplicar* di$idir* etc2tera! =d"ite 5ndice!
MySQL ad"ite estos $alores para deter"inar los ca"pos de este tipo1 3IAFIA3* SM=LLIA3*
M(:IUMIA3* IA3* ;I?IA3* D(=L* :9U;L(* @L9=3* :(CIM=L y AUM(DIC! Co"o puede
$erse* en realidad los $alores posibles se re#ieren a si es un ca"po de n8"ero entero o
deci"al y al n8"ero de d5&itos con los que debe representarse el $alor en cada caso!
G! Ca"po de tipo Fec$a! Puede contener #ec%as y tie"pos /%oras* "inutos* se&undos0! =d"ite
5ndice! MySQL ad"ite aqu5 los $alores si&uientes1 :=3(* 3IM(* 3IM(S3=MP y :=3(3IM(!
H! Ca"po de tipo Memo! (s un ca"po de lon&itud $ariable que ad"ite &ran cantidad de te7to
se&8n nuestras necesidades! Para cada re&istro tendr' una lon&itud distinta* se&8n la cantidad
de te7to que se introduca en este ca"po! Ao ad"ite 5ndice! MySQL ad"ite aqu5 los $alores
si&uientes1 3IAF;L9;* ;L9;* M(:IUM;L9;* L9A?;L9;* 3IAF3(I3* 3(I3* M(:IUM3(I3
y L9A?3(I3!
5! Ca"po de tipo serie! (s un ca"po donde se puede poner uno de los $alores incluidos en
una lista o serie de $alores! MySQL ad"ite aqu5 los $alores si&uientes1 (AUM y S(3!
Cuando utilice"os la base de datos MySQL* $ere"os concreta"ente c"o se crean las bases
de datos* sus tablas y los ca"pos de cada una!
%enta&as de las bases de datos
He"os dic%o que los arc%i$adores de una biblioteca o de una a&enda pueden considerarse* en
cierta #or"a* bases de datos* pues en ellos se al"acena in#or"acin en un deter"inado orden
y es posible buscar esta in#or"acin* consultarla* "odi#icarla o eli"inarla con #acilidad!
Sin e"bar&o* todas estas operaciones suelen lle$ar "uc%o tie"po y* en ocasiones* no se
e#ect8an tan #'cil"ente co"o desear5a"os! =de"'s* ocupan bastante espacio si la
in#or"acin es abundante! Incluso* en ocasiones* al&unas operaciones #unda"entales son
i"posibles de realiar "anual"ente!
Por e)e"plo* si tene"os 4!--- #ic%as biblio&r'#icas ordenadas por autor y necesita"os
ordenarlas por t5tulo* la operacin %a de realiarse "anual"ente* "irando una a una cada
#ic%a* lo cual puede %acerse "uy lar&o y pesado! Pod5a"os %aber escrito dos e)e"plares de
cada #ic%a* uno para el arc%i$o por autores y otro para el de t5tulos* pero esto %ubiera lle$ado el
doble de tie"po* de traba)o y 2stas ocupar5an el doble de espacio!
Supon&a"os a%ora que necesita"os seleccionar todas las #ic%as en las que aparece la "is"a
editorial! :e nue$o la tarea puede parecernos pesada y lar&a* y lo es! Ao di&a"os si se ca"bia
la situacin de los libros en los ar"arios de la biblioteca! 3a"bi2n ser' necesario "odi#icar la
si&natura en las #ic%as!
7 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
He"os puesto este e)e"plo para e7plicar los &ra$es proble"as que se deri$an de la &estin
"anual de la in#or"acin! Las di#icultades au"entan a "edida que crece el $olu"en de
in#or"acin que debe "ane)arse y se&8n sean los criterios de ordenacin y seleccin!
(n una base de datos in#or"'tica* en ca"bio* al &estionarse la in#or"acin auto"'tica"ente*
"uc%os de los proble"as anterior"ente "encionados desaparecen!
(n pri"er lu&ar* la rapide de las operaciones #unda"entales /introduccin de datos*
ordenacin por di#erentes ca"pos* consultas* b8squedas* elaboracin de in#or"es*
actualiacin y "odi#icacin de los datos* etc2tera0 au"enta de una #or"a "uy destacada!
(n se&undo lu&ar* el espacio que ocupa una base de datos es "uc%o "enor que el de
cualquier otra #or"a de arc%i$o "anual! (n un disco #le7ible de G*5 pul&adas puede
al"acenarse casi un "illn y "edio de caracteres! (n los discos duros de los actuales
ser$idores el $olu"en de in#or"acin puede ser pr'ctica"ente ili"itado!
(n tercer lu&ar* las operaciones #unda"entales de &estin de la in#or"acin son auto"'ticas*
lo cual %ace que sean "enos pesadas y tediosas si son lle$adas a cabo por el ordenador! =s5
pues* el traba)o se %u"ania y el tie"po libre de las personas que "ane)an la in#or"acin es
"ayor!
@inal"ente* la se&uridad de los datos in#or"atiados ta"bi2n es "ayor que la contenida en
arc%i$os de tipo "anual* pues el ordenador nos per"ite %acer r'pida"ente cuantas copias
quera"os de esa in#or"acin en di#erentes soportes!
:esde la aparicin de los ordenadores* 2stos se %an dedicado al al"acena"iento y
or&aniacin de &randes $ol8"enes de datos! I&ual"ente* se %an aplicado a la e$aluacin de
las di$ersas soluciones propuestas para resol$er los proble"as de estructuracin y acceso a
dic%a in#or"acin!
'ases de datos relacionales
Se %a descubierto que la "e)or #or"a de resol$er estos proble"as es or&aniar la in#or"acin
de #or"a relacional! :e aqu5 %a sur&ido el concepto de bases de datos relacionales /D:;MS*
Delation :ata;ase Mana&e"ent Syste"0!
(l #unda"ento terico de las bases de datos relacionales es co"ple)o* ya que se basa en el
concepto "ate"'tico de relacin entre los ele"entos de un con)unto! Sus caracter5sticas y
propiedades #or"ales requieren ciertos conoci"ientos de la teor5a de con)untos! Sin e"bar&o*
en la pr'ctica* el concepto de relacin es "uy sencillo de utiliar porque en 2sta la or&aniacin
de los datos es "uy clara e intuiti$a!
(n otros tipos de or&aniacin de la in#or"acin* co"o las bases de datos )er'rquicas o las
bases de datos en red* anteriores a las relacionales* aparec5an distintas cate&or5as de datos y
estructuras "uy co"ple)as y poco #le7ibles que di#icultaban la posibilidad de relacionar 2stos
con e#icacia y rapide! (n ca"bio* en las bases de datos relacionales la in#or"acin se
or&ania en #ic%eros que tienen estructura tabular o en #or"a de tabla* en la que todos los
datos tienen la "is"a cate&or5a! Cada tabla ta"bi2n recibe el no"bre de relacin!
8 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Por e)e"plo* en el &r'#ico si&uiente puede obser$arse una tabla de tipo d'ase que contiene
di$ersos datos de personas1
Cabecera Nombre )irecci*n Edad Se+o ,ro-esi*n
1 Len !arc"a C* +urita, -. -. / Admtvo0
2 Mar"a 12rez C* Flores, 3. 45 M Abo%ada
Filas .!e"istros/
3
6os2 7odr"%uez C* 7"o Sil, 33 .5 / 8e&endiente
6uana de 8ios Avda0 Canarias, .5 95 M 6ubilada
# Be%oa L&ez 1za0 Se%ovia, s*n 3. M Estudiante
|___________|______________|____|____|__________|
Columnas .Campos/
Co"o se $e* una tabla consta de #ilas y de colu"nas< en cada colu"na* deno"inada ca"po en
la base de datos* %ay un dato1 Ao"bre* :ireccin* (dad* etc2tera< cada #ila es un re&istro que
contiene todos los datos de los ele"entos de la base! Cada tabla tiene un re&istro especial*
deno"inado cabecera* que contiene los no"bres de los ca"pos y sus atributos /tipo y
lon&itud0! Cada tabla se al"acena en un #ic%ero de tipo dbf * es decir* un #ic%ero de base de
datos!
?eneral"ente* una base de datos no consta de una sola tabla* sino de $arias!
?r'#ica"ente puede representarse as51
(stas tablas no son independientes unas de otras* sino que tienen al "enos un ca"po co"8n
con las otras a tra$2s del cual se puede acceder a la in#or"acin que contienen todas en
con)unto!
Por e)e"plo* la base de datos de una biblioteca puede estar inte&rada por una tabla de libros*
otra de lectores* otra de pr2sta"os y otra de editoriales! (l #ic%ero de libros puede contener la
in#or"acin co"pleta de cada $olu"en1 t5tulo* autor* editorial* a6o de edicin* precio* n8"ero
de p'&inas* cdi&o de "ateria* n8"ero de re&istro* etc2tera!
(l #ic%ero de editoriales contendr' los datos de cada entidad editora1 no"bre* direccin*
tel2#ono* plao de entre&a* descuentos* etc2tera!
(l #ic%ero de lectores estar' inte&rado por los datos personales y pro#esionales de 2stos1
no"bre* :AI * direccin* tel2#ono* pro#esin* centro de traba)o* n8"ero de carn2* etc2tera!
9 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
(l #ic%ero de pr2sta"os contendr' datos de este tipo1 n8"ero de re&istro del libro prestado*
n8"ero de carn2 del lector* #ec%a del pr2sta"o* plao* etc2tera!
Co"o puede $erse* la in#or"acin no debe repetirse en todos los #ic%eros* pero s5 debe poder
relacionarse! Por e)e"plo* los #ic%eros de libros y editoriales* tienen en co"8n el ca"po
(:I39DI=L! Los #ic%eros de libros y pr2sta"os tienen en co"8n* al "enos* el AJM(D9 :(
D(?IS3D9 del libro prestado* &racias a lo cual desde uno se puede acceder a los datos del
otro! Los #ic%eros de lectores y pr2sta"os tienen en co"8n el ca"po C=DA+* etc2tera!
Son bases de datos relacionales Microso#t =ccess* 9racle* SQL Ser$er* MySQL y otras! (n
este curso $a"os a utiliar* sobre todo* bases de datos de este tipo!
Hay otro tipo de base de datos que est' orientado a los ob)etos /9:;MS* 9b)ect 9riented
:;MS0 en las que cada dato es tratado co"o si #uera un ob)eto con sus atributos y "2todos!
Son de este tipo 9b)ectStore* Eersand* ?e"Store* etc2tera!
3a"bi2n %ay otro tipo que re8ne caracter5sticas propias de los dos tipos anteriores* co"o
Post&reSQL* que son conocidas co"o (D:;MS /(7tended Delacional :;MS0 y co"o
9D:;MS /9b)ect Delational :;MS0! PHP puede tratar pr'ctica"ente todas las bases de datos
"encionadas!
(ise)o de bases de datos
(l dise6o de bases de datos puede presentar distinto tipo de di#icultad dependiendo de la
co"ple)idad e interrelacin de los datos que se quiera &estionar!
I"a&ine"os que una co"pa65a a2rea quiere &estionar toda la in#or"acin contenida en una
base de datos relati$a a los a$iones y su "anteni"iento* a los $uelos* $ia)es* destinos* clientes*
personal de la e"presa* a&encias de $ia)es* billetes* asistencia* etc2tera! (s e$idente que* en
este caso* la co"ple)idad es enor"e y que para realiar el dise6o de esta base se requiere la
colaboracin de t2cnicos especialistas que #aciliten la tarea!
Sin e"bar&o* en la "ayor5a de las ocasiones el dise6o de una base de datos se resuel$e con
uno* dos o tres #ic%eros co"o "'7i"o! (n este caso no es necesario pro#undiar en aspectos
co"ple)os de t2cnicas de dise6o* sino que basta aplicar el sentido co"8n para or&aniar los
#ic%eros de la base de datos de #or"a co%erente!
:eben crearse tantos #ic%eros co"o cate&or5as o &rupos de ele"entos distintos %aya que
or&aniar! Por e)e"plo* en una tienda que $ende al por "enor bastar5a con crear un #ic%ero de
art5culos y otro de pro$eedores* y a lo su"o otros tres1 de pedidos* de $entas y de clientes!
=ntes de ponerse a crear una base de datos con el ordenador* es preciso dise6arla
pre$ia"ente sobre el papel! La plani#icacin es #unda"ental en este caso para e$itar errores
&ra$es1 #alta de datos necesarios* repeticin innecesaria de al&unos* equi$ocacin del tipo de
ca"po o #alta de precisin en su lon&itud! =unque es posible "odi#icar la estructura de una
base de datos* una $e creada* se puede perder "uc%o tie"po e incluso datos en esta
operacin!
:ise6ar una base de datos consiste en deter"inar los datos que $an a introducirse en ella* la
#or"a co"o se $an a or&aniar y el tipo de esos datos! =de"'s* se debe precisar la #or"a
co"o se $an a solicitar y las clases de operaciones que %ay que realiar con los "is"os1
arit"2ticas* l&icas* de #ec%as* de car'cter* etc2tera! 3a"bi2n con$iene conocer los resultados
10 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
concretos que se espera obtener1 consultas* in#or"es* actualiaciones* docu"entos* etc2tera!
= continuacin* se resu"en las operaciones que deben lle$arse a cabo al dise6ar una base de
datos1
10 Atendiendo a la in-ormaci*n 1ue contiene es &reciso:
;denti<icar los di<erentes elementos in<ormativos =art"culos,
clientes, ventas, <acturas, etc2tera> $ue <orman &arte de la base de
datos0
8eterminar los datos $ue debe contener cada uno de esos elementos0
1recisar el %rado de necesidad ( de utilizacin de cada dato0
Concretar las o&eraciones $ue se van a realizar con los datos:
aritm2ticas, l%icas, de salida slo &or la &antalla, de salida
tambi2n &or la im&resora, etc2tera0
Seleccionar el dato o datos esenciales $ue deben ser el cam&o clave
&or el $ue se ordenar#n las unidades o elementos mencionados0
Fi?ar los datos comunes a los di<erentes <icheros de la base de
datos $ue van a &ermitir relacionar la in<ormacin distribuida entre
ellos0
20 Atendiendo a la estructura de la base de datos
8istribuir la in<ormacin en <icheros se%@n los di<erentes %ru&os
$ue se ha(an hecho =art"culos, clientes, etc2tera> ( dar un nombre a
cada <ichero0
8eterminar el nombre de cada cam&o de los re%istros de cada
<ichero0 Este nombre ha de ser claro ( debe si%ni<icar al%o &ara $ue
&ueda recordarse <#cilmente0
8ecidir $u2 ti&o conviene asi%nar a cada cam&o se%@n la clase de
o&eraciones $ue va(amos a realizar con sus datos0
Asi%nar a cada cam&o una lon%itud a&ro&iada &ara tener los datos
<undamentales sin des&il<arro de memoria interna ni de es&acio en el
disco duro o so&orte em&leado0
Establecer un orden l%ico ( &r#ctico a%ru&ando los cam&os se%@n un
criterio concreto: clase e im&ortancia de los datos, <recuencia de
utilizacin, &roximidad, &arecido, etc2tera0
8ecidir cu#l o cu#les van a ser los cam&os clave &ermanentes (
situarlos al &rinci&io de la estructura0
Ao incluir cam&os $ue &uedan ser el resultado de diversas
11 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
o&eraciones de tratamiento &osterior0
Fi?ar los cam&os comunes a todos los <icheros &ara &oder
relacionarlos con otros de la misma a&licacin0
4 - La base de datos MySL
La base de datos MySQL %a #or"ado y #or"a desde el principio una pare)a per#ecta con PHP!
(n este apartado $a"os a traba)ar con ella* ya que es la que utilia"os en el curso!
La "ayor5a de los desarrolladores* desde que PHP puede utiliar bases de datos* %an
seleccionado esta base de datos! Por e)e"plo* %ace ya al&unos a6os que la A=S= "i&r
al&unas de sus aplicaciones web a PHP utiliando co"o base de datos precisa"ente MySQL!
=d$erti"os que una de las operaciones "'s pesadas y en&orrosas es instalar el ser$idor
MySQL* pero al instalarse el curso se da la instalacin ya %ec%a de #or"a auto"'tica* con los
usuarios necesarios para el curso ya creados y los per"isos de acceso y pri$ile&ios asi&nados
con$eniente"ente* as5 co"o la cone7in ya %ec%a! Considera"os que 2stas son operaciones
propias de los ad"inistradores del ser$idor* para quienes no $a diri&ido este curso! =s5 pues* el
alu"no o alu"na podr' traba)ar per#ecta"ente sin tener que instalar el ser$idor MySQL ni
poseer conoci"ientos sobre la con#i&uracin adecuada del "is"o! Si el alu"no o alu"na
dispone ya de un ser$idor MySQL instalado en el ordenador reco"enda"os desinstalarlo para
que el ser$idor MySQL del curso arranque sin proble"as!
Con el #in de asi"ilar bien los contenidos sobre las bases de datos* en esta Unidad slo se $an
a e7plicar de #or"a sencilla y pr'ctica dos asuntos i"portantes1
4! La base de datos MySQL* a tra$2s del Cliente MySQL* que #acilita y %ace "'s intuiti$a la
co"prensin de los conceptos! =s5 se e$ita* a la $e* la poco esti"ulante tarea de escribir una
a una las instrucciones en el prompt del siste"a! (l estudio y las pr'cticas realiadas con esta
utilidad preparar'n a los alu"nos y alu"nas para poder aplicar estos conceptos a otros tipos
de bases de datos!
C! Las #unciones de PHP que per"iten tratar las bases de datos y su in#or"acin en MySQL!
(ste asunto se abordar' en el apartado si&uiente!
Con los conoci"ientos anteriores bien asi"ilados* ser' "'s #'cil co"prender con detalle y
aplicar correcta"ente las #unciones de PHP que per"iten conectarse a una base de datos*
realiar consultas* acceder a los resultados de las consultas y realiar otras operaciones
au7iliares e in#or"ati$as sobre cualquiera de las bases de datos que usa"os en el curso!
3a"bi2n ser' posible utiliar el len&ua)e de consulta SQL para obtener in#or"es! (sto es
precisa"ente lo que abordare"os en la Unidad si&uiente!
Para tener acceso a las bases de datos* en pri"er lu&ar* %ay que arrancar el ser$idor de datos
MySQL!
Si el curso se instala en *indo+s ,-.Me* en la carpeta Curso de PHP / del escritorio aparece
el icono Ser0idor MySQL 123 4 Arrancar! Con doble click lo arranca"os! Cuando quera"os
parar el ser$idor basta con %acer doble clic en el icono Ser0idor MySQL 123 4 Parar!
12 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Si el curso se instala en *indo+s "5.6777.8P* en la carpeta Curso de PHP / del escritorio
aparece el icono Ser0idor MySQL 123! Con doble click lo arranca"os! (n la parte derec%a de
la barra de %erra"ientas del escritorio aparece un nue$o icono! Si %ace"os clic con el botn
derec%o sobre el "is"o* aparecer' un Men emergente donde debere"os pulsar el botn
K=rrancar Ser$idorK deba)o del icono LCrso P!P - My"#$ %&' - Para(o)! = continuacin se
ca"biar' el "ensa)e en esta $entana indicando que el ser$idor MySQL est' arrancado!
=de"'s* en este Men8 se o#recen $arias opciones para &estionar el ser$idor* que nos per"iten
realiar* entre otras* operaciones co"o cerrarlo /Parar "ervi(or 0* configurar el ser0idor
/Configrar "ervi(or0 y arrancar el ser0idor de nue$o /Arrancar "ervi(or 0* etc2tera! =
continuacin* se "uestra este Men1

=%ora ya pode"os arrancar el #ic%ero Mysql2e9e* que aparece en el directorio
C1McursoPHP5MbinMMySQLH!4Mbin! (ste pro&ra"a se e)ecutar' en "odo MS:9S y se
presentar' en la pantalla la $entana principal de este &estor de bases de datos! Para arrancarlo
debe"os escribir "ysql!e7e Nu root /con KNu rootK esta"os indicando el usuario con el que
quere"os conectarnos al ser$idor0 desde una $entana de co"andos en el directorio
C1McursoPHP5MbinMMySQLH!4Mbin! +ste es su te7to inicial1
Belcome to the M(SCL monitor0 Commands end Dith E or F%0
Gour M(SCL connection id is H to server version: H0303-a
T(&e Ihel&EI or IFhI <or hel&0 T(&e IFcI to clear the bu<<er0
m(s$lJ
Fa conoce"os este tipo de pro&ra"as MS:9S! Pode"os traducirlo co"o
Bienvenido al monitor de M(SCL0 Acabe los comandos con E o con F%0
Su identi<icador de conexin M(SCL es H en el servidor versin: H0303-a0
Escriba Ihel&EI o IFhI &ara &edir a(uda0 Escriba IFcI &ara vaciar el bu<<er0
m(s$lJ
(l cursor se coloca detr's del promtp mysql: esperando que $aya"os introduciendo las
rdenes o co"andos que deban e)ecutarse! Por e)e"plo* si escribi"os
13 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
m2s1l3 shoD databasesE
se "uestra a continuacin1
KLLLLLLLLLLLLK
M 8atabase M
KLLLLLLLLLLLLK
M curso&h&. M
M m(s$l M
KLLLLLLLLLLLLK
- roDs in set =5055 sec>
Si escribi"os
m2s1l3 Fh
aparece la in#or"acin de ayuda
M(SCL commands:
Aote that all text commands must be <irst on line
and end Dith IEI
hel& =Fh> 8is&la( this hel&0
? =F?> S(non(m <or Nhel&I0
clear =Fc> Clear command0
connect =Fr> 7econnect to the server0 O&tional ar%uments are db and host0
e%o =F!> Send command to m(s$l server, dis&la( result verticall(0
exit =F$> Exit m(s$l0 Same as $uit0
%o =F%> Send command to m(s$l server0
notee =Ft> 8onIt Drite into out<ile0
&rint =F&> 1rint current command0
$uit =F$> Cuit m(s$l0
rehash =FP> 7ebuild com&letion hash0
source =F0> Execute a SCL scri&t <ile0 TaQes a <ile name as an ar%ument0
status =Fs> !et status in<ormation <rom the server0
tee =FT> Set out<ile RtoSout<ileT0 A&&end ever(thin% into %iven out<ile0
use =Fu> Use another database0 TaQes database name as ar%ument0
(l uso de esta %erra"ienta supone que debe"os conocer las rdenes de MySQL y su sinta7is
correcta* procedi"iento ya al&o anticuado y de otra 2poca ! Por eso* %e"os pre#erido ser$irnos
de una utilidad "'s "oderna ba)o Oindows* con la que pode"os realiar en MySQL todas las
operaciones con las bases de datos* a la $e que aprender de una #or"a "'s a"i&able los
co"andos de MySQL que per"iten realiar todas las operaciones propias de las bases de
datos! Se deno"ina MySQL Query 'ro+ser /si %as instalado el curso en Oindows
A3PC---PIP0 o MySQL4Front /si %as instalado el curso en Oindows ,QPMe0! ="bas pueden
arrancarse desde la carpeta Curso de PHP / pulsado sobre el acceso directo Cliente MySQL!
=bandona"os* pues* con el co"ando 1uit4 la utilidad MySQL "onitor y arranca"os esta
"oderna aplicacin con la que $a"os a aprender a traba)ar con las bases de datos de tipo
MySQL!
14 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
MySQL Query 'ro+ser
Si %as instalado el curso en Oindows A3PC---PIP se instalar' este cliente MySQL! =l arrancar
el pro&ra"a Cliente MySQL* se "uestra en la pantalla la $entana si&uiente de cone7in1

=cepta"os los datos que est'n puestos por de#ecto1 descripcin de la cone7in /local%ost0*
no"bre del ser$idor /local%ost0* usuario /root0 y la contrase6a /passwor(0 en blanco! (l usuario
root /ra50 es el que tiene todos los per"isos y pri$ile&ios de acceso* sin restricciones* a las
bases de datos* co"o si #uera el ad"inistrador! =s5 pues* no %ay que ca"biar nada* sino slo
pulsar sobre el botn ;< y se&uir!
= continuacin* entra"os ya en la pantalla de esta aplicacin* que es la si&uiente1

15 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
=n la mitad superior pueden obser$arse tres ele"entos1
4! (l "en8 de opciones y los iconos de acceso r'pido1
File =dit %ie+ Query Scripts 5ools Help
C! La $entana del Sc%e"ata /;ases de datos0 y ;ooR"arRs /"arcadores0 "uestra las bases
de datos a los que tiene acceso y las tablas y los ca"pos que inte&ran esta base de datos! Si
%ace"os doble clic sobre el no"bre de una base de datos en particular $ere"os que su te7to
se ca"bia a ne&rita< esto indica que %e"os acti$ado esta base de datos y todas las SQLSs se
aplicar'n sobre la "is"a! La $entana es la si&uiente1

G! La $entana de ayuda donde se describen la sint'7is y las #unciones de MySQL es 2sta 1

(n la $entana si&uiente puede $erse el cuadro de te7to para introducir una Consulta SQL! (s
i"portante saber que en este cuadro de te7to slo podre"os introducir una 8nica consulta!
Aota"os que aparece el botn ?o bacR y Ae7t para recuperar del bu##er los co"andos
anteriores y si&uientes! (l botn (7ecute sir$e para e)ecutar la consulta! La $entana es 2sta1

16 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Si desea"os e)ecutar un script con "uc%as consultas SQLSs entonces debe"os %acer clic en la
opcin File."e+ Script 5ab del Men principal! La $entana que se "uestra es la si&uiente1
La base de datos con el no"bre "ysql es propia de MySQL y es i"prescindible para el
#unciona"iento del ser$idor de datos! Por eso* no deben borrarse ni alterarse su estructura o
"odi#icarse la in#or"acin que contienen! (n ellas la base de datos MySQL &uarda el siste"a
co"pleto de per"isos* pri$ile&ios* $istas y onas %orarias! =de"'s* la base de datos
cursop%p5 ta"poco debe borrarse por ser necesaria para que el curso #unciones
correcta"ente!
=n la parte inferior de la $entana principal $an apareciendo de #or"a auto"'tica "ensa)es
que indican si la e)ecucin de la SQL %a ido bien "ostrando un "ensa)e de error en caso
contrario!
17 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
MySQL 4Front
Si %as instalado el curso en Oindows ,QPMe se instalar' este cliente MySQL! =l arrancar el
pro&ra"a Cliente MySQL* se "uestra en la pantalla la $entana si&uiente de cone7in1

=cepta"os los datos que est'n puestos por de#ecto1 descripcin de la cone7in /cursoPHP50*
no"bre del ser$idor /local%ost0* usuario /root0 y la contrase6a /passwor(0 en blanco! (l usuario
root /ra50 es el que tiene todos los per"isos y pri$ile&ios de acceso* sin restricciones* a las
bases de datos* co"o si #uera el ad"inistrador! =s5 pues* no %ay que ca"biar nada* sino slo
pulsar sobre el botn Connect> y se&uir!
= continuacin* entra"os ya en la pantalla de esta aplicacin* que es la si&uiente1
18 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL

=n la mitad superior pueden obser$arse tres ele"entos1
4! (l "en8 de opciones y los iconos de acceso r'pido1
File =dit *indo+ =9tra Help

C! La $entana del usuario y del ser$idor al que est' conectado con las bases de datos a los
que tiene acceso1

19 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
G! La $entana donde se describen y relacionan los ele"entos que inte&ran el ele"ento acti$o
de la $entana anterior1

=qu5 $e"os que el ser$idor /pesta6a Host0 tiene dos usuario /ad"in y root0! Si acti$a"os la
pesta6a SQL Query /Consulta SQL0 $e"os que no %ay nin&una* pero pode"os escribir una y
&uardarla /Sa$e0* =brir una ya e7istente /Load SQL0* ()ecutar la actual /Dun @,0 o =cceder a
las #unciones que necesite"os /@unctions0* co"o puede $erse en la $entana si&uiente1

Si acti$a"os en la $entana iquierda la base de datos MFSQL* $e"os esta $entana1

Co"o puede $erse* se "uestran a%ora las tablas que inte&ran esta base de datos!
Seleccionado una* se puede Eer su datos /Eiew :ata0* Mostrar las propiedades de la tabla
/S%ow 3ableNProperties0* Insertar un re&istro /Insert Decord0 o Eaciar la tabla /("pty 3able0!
=n la mitad inferior de la $entana principal $an apareciendo de #or"a auto"'tica los
co"andos que se e)ecutan a "edida que nosotros $a"os realiando operaciones
c"oda"ente desde las opciones de los "en8s o pulsando sobre los iconos! Con$iene #i)arse
en cada l5nea* pues as5 sabre"os c"o debe"os escribir despu2s cada co"ando al codi#icar
los scripts en len&ua)e PHP* que es real"ente el ob)eti$o!
Con$iene que to"e"os nota de lo si&uiente1
4! (n el directorio C:Fcurso1'1.FbinFM(SCLH03Fshare est'n los "ensa)es de error del ser$idor
para los distintos idio"as! (n C:Fcurso1'1.FbinFM(SCLH03Fbin est'n los #ic%eros e)ecutables y
20 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
en C:Fcurso1'1.FbinFM(SCLH03Fdata se %allan las bases de datos que %aya"os creado* una en
cada carpeta!
C! Co"o %e"os dic%o* para cada base de datos que nosotros crea"os* MySQL crea un
directorio con el no"bre que le %e"os asi&nado a la base de datos! :entro de este directorio*
por cada tabla que de#ina"os MySQL crea tres arc%i$os1 Tno"bre de la tablaU2M?(* que
contiene los datos* Tno"bre de la tablaU2M?@A que contiene las cla$es e 5ndices* y Tno"bre de
la tablaU2frm* que contiene la estructura de la tabla!
G! Co"o las bases de datos de MySQL son #ic%eros de un directorio* pode"os realiar copias
de se&uridad utiliando las %erra"ientas de co"presin que %abitual"ente usa"os en nuestro
siste"a!
Cree"os que cualquier persona acostu"brada a pro&ra"ar y a utiliar &estores de bases de
datos* co"o debe ser el alu"no que se %aya "atriculado en este curso* no tendr' proble"as
en aprender r'pida"ente el "ane)o del Cliente MySQL! Por eso* no $a"os a dar "'s
e7plicaciones sobre el "is"o* pero reco"enda"os practicar sus di#erentes opciones y
operaciones creando al&una base de datos que conten&a $arias tablas* co"o puede $er que
%e"os %ec%o nosotros con la base de datos cursop$p/ y sus tablas! +sta ser' la "e)or #or"a
de #a"iliariarse con este &estor de datos y de asi"ilar los co"andos de "ane)os de tablas y
su sinta7is!
Cuando el alu"no analice la base de datos cursop$p/* no debe ca"biar nada* para que
cualquier otro alu"no o alu"na que %a&a el curso en el "is"o ordenador a otra %ora no se $ea
a#ectado por sus operaciones! Co"o traba)o de pr'cticas* puede crear otra base de datos
si"ilar que deno"ine co"o su no"bre de correo /por e)e"plo* )#er--40 y traba)ar con 2sta
a6adiendo tablas* "odi#ic'ndolas* co"plet'ndolas* etc2tera! =l "enos cuando acabe el curso o
cuando se d2 de ba)a te"poral o total* procure copiar esa base a un disco propio* si quiere
conser$arla* y eli"inarla despu2s del disco duro* para no saturar innecesaria"ente el
ordenador!
! - "rincipales sentencias de MySL
(n este apartado $a"os a estudiar las sentencias #unda"entales que per"iten tratar bases de
datos de tipo MySQL!
Ea"os a utiliar las principales sentencias de este &estor de datos escribiendo detr's del
prompt cada orden y obser$ando con la aplicacin Cliente MySQL los e#ectos que produce la
interpretacin de cada co"ando!
=s5 pues* para estudiar este te"a* %ay que acti$ar el Ser0idor MySQL 123 y el Cliente MySQL
para obser$ar intuiti$a"ente lo que pasa y el pro&ra"a mysql2e9e* que se e)ecuta en una
$entana del :9S! Para arrancarlo debe"os escribir "ysql!e7e Nu root desde una $entana de
co"andos en el directorio C1McursoPHP5MbinMMySQLH!4Mbin!
21 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
=l arrancar este 8lti"o* se presenta la $entana si&uiente1

Creacin de una bases de datos
Para traba)ar con una base de datos* en pri"er lu&ar %ay que crearla! Se %ace con la orden
create database se&uida del no"bre que quere"os darle! Para crear la base de datos
Lal"acenV* escribi"os
create database almacenE
Pode"os co"probar que %a sido creada de cuatro #or"as di#erentes1
4! Leyendo el "ensa)e que de$uel$e MySQL indicando que se %a %ec%o 1
Cuer( O), 3 roD a<<ected =5055 sec>
C! Mirando con el (7plorador de Oindows que se %a creado una carpeta nue$a con el no"bre
Lal"acenV en el directorio C:Fcurso1'1.FbinFM(SCLH03Fdata!
G! =rrancando la aplicacin Cliente MySQL /con la opcin Cliente MySQL de la carpeta del
curso0 si no lo est' o seleccionando con el botn derec%o sobre Sc%e"ata la opcin De#res% si
est' ya arrancada! Se $er' que %ay una nue$a base de datos deno"inada Lal"acenV que a8n
no tiene nin&una tabla en su interior!
H! ()ecutando en la propia $entana del MySQL "onitor la orden shoD databases* que
estudia"os a continuacin!
He"os e7plicado esto para que el alu"no trate de co"probar el resultado de las sentencias
que escriba y $ea c"o se co"portan! Si crea"os esta base de datos desde la aplicacin
Cliente MySQL pulsando con el botn derec%o sobre Sc%e"ata en la opcin Create Aew
Sc%e"a* se pre&unta en un cuadro de di'lo&o el no"bre de la base de datos!
Co"o puede ocurrir que ya e7ista un base de datos con el "is"o no"bre que la se pretende
crear* en cuyo caso se perder5a la anterior con todos los datos* lo "e)or es usar la sinta7is
condicional create database i< not exists almacenE ! :e esta #or"a* si la base de datos
e7iste* no se crea una nue$a destruyendo la anterior!
22 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Mostrar todas las bases de datos
La sentencia shoD databasesE se usa para "ostrar todas las bases de datos que %aya en el
ser$idor MySQL! Pode"os obser$arlo en la $entana si&uiente1

Decorda"os que las bases de datos "ysql y cursop%p5 son i"prescindibles para el
#unciona"iento correcto del siste"a y del curso* por lo cual no deben borrase nunca!
BtiliCar una base de datos
Para poder usar una base de datos* por e)e"plo para acceder a sus tablas* es preciso abrirla
antes* operacin que se realia con la sentencia use Vnombre de la base de datosJ! Por
e)e"plo* si quere"os abrir la base de datos Lal"acenV* escribire"os use almacen y* si se %a
podido abrir* el siste"a "uestra el "ensa)e de con#ir"acin 8atabase chan%ed ! = partir de
aqu5* ya pode"os crear tablas en su interior o acceder a los re&istros y ca"pos de las "is"as!
Si usa"os la aplicacin Cliente MySQL basta con %acer doble clic sobre el no"bre de la base
de datos que quere"os usar< $ere"os que su te7to ca"bia a ne&rita indic'ndonos que est'
acti$a!
Crear una tabla
Una $e que %e"os abierto la base de datos Lal"acenV* $a"os a crear tres tablas sencillas
dentro de la "is"a1 LproductosV* Lco"prasV y LclientesV! Para crear la tabla LproductosV* da"os
la orden si&uiente1
create table i< not exists &roductos =
codi%o ;AT 17;MA7G )EG AUTOS;AC7EMEAT,
nombre /A7C'A7=45> AOT AULL,
&recioSeuros 8EC;MAL=W,4> AOT AULL,
stocQ T;AG;AT AOT AULL,
descuento SET=ISI,IAI> AOT AULL 8EFAULT ISI,
23 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
caduca 8ATE,
notas TEXT>E
Con esta orden %e"os creado* dentro de la base de datos Lal"acenV* la tabla LproductosV* que
tiene esta estructura1
Nombre del campo Tipo de campo 5on"itud ,ropiedades
codi%o ;AT 33
17;MA7G )EG
AUTOS;AC7EMEAT
nombre /A7C'A7 45 AOT AULL
&recio 8EC;MAL W,4 AOT AULL
stocQ T;AG;AT H AOT AULL
descuento
SET

AOT AULL
8EFAULT YSY
caduca 8ATE
notas TEXT
La "is"a in#or"acin puede obtenerse con la sentencia
shoD columns <rom &roductosE
co"o puede $erse en esta $entana1

Con$iene %acer al&unas obser$aciones que el alu"no debe tener en cuenta1
4! (n la tabla LproductosV %e"os creado seis ca"pos cuyo identi#icador debe ser $'lido1
codigo, nombre * &recioSeuros * stocQ * descuento * caduca y notas!
24 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
C! = cada ca"po le %e"os asi&nado su tipo* lon&itud y caracter5sticas adecuadas * se&8n el
contenido que $a"os a introducir en ellos1
(l ca"po codi%o es de tipo nu"2rico entero ;AT y tiene una lon&itud de 33 d5&itos
/incluido el si&no si lo %ay0< no puede ser nulo* es decir* estar $ac5o< es el 5ndice
pri"ario* es decir* el $alor 8nico /uno distinto para cada re&istro0 por el que MySQL $a a
ir ordenando los re&istros a "edida que se den de alta< y se autoincre"enta cada $e
que se a6ade un re&istro nue$o! 9bser$e el alu"no que en el tipo de ca"po no %a sido
preciso escribir la lon&itud* pues MySQL asu"e por de#ecto que el tipo ;AT es de 44
posiciones! Los tipos nu"2ricos enteros pueden ser "'s lar&os o "'s cortos* se&8n el
n8"ero "'7i"o que pretenda"os introducir en ese ca"po1 T;AG;AT asi&na H* SMALL;AT
asi&na 6* ME8;UM;AT asi&na ,* B;!;AT asi&na C-!
(l ca"po nombre es de tipo /A7C'A7 * tiene una lon&itud de 45 y no puede ser nulo! Si se
obser$a a%ora la sinta7is de la sentencia* se $er' que %e"os puesto la lon&itud de este
ca"po entre par2ntesis! (l $alor "'7i"o posible es de C55! (l tipo C'A7 se co"porta
i&ual que /A7C'A7 * con la di#erencia de que C'A7 &uarda la lon&itud co"pleta indicada*
aunque parte del ca"po est2 $ac5a* co"o ya %e"os e7plicado en un apartado anterior!
(l ca"po &recioSeuros es de tipo 8EC;MAL * lo cual indica que el n8"ero que se puede
&uardar en 2l tendr' parte entera y parte deci"al! 3a"poco puede ser nulo! Hay que
to"ar nota de la sinta7is &recioSeuros 8EC;MAL=W,4> 1 entre par2ntesis se ponen dos
n8"eros separados por una co"a! (l pri"ero / W 0 es la lon&itud del n8"ero co"pleto y
el se&undo / 4 0 indica el n8"ero de deci"ales que tiene! Para tratar ca"pos en los que
%aya que escribir n8"eros reales MySQL dispone ta"bi2n de di#erentes tipos1 FLOAT /de
co"a #lotante0 y 8OUBLE * que no e7i&en poner lon&itud! (l pri"ero soporta %asta 44
posiciones incluidos el si&no 4 * el punto deci"al* la parte entera y la deci"al! (l se&undo
soporta %asta C- posiciones!
(l ca"po stocQ es de tipo T;AG;AT * tiene una lon&itud de H y no puede ser nulo! (n el
"is"o slo podre"os re&istrar co"o "'7i"o el $alor 4C> para saber las e7istencias de
un producto!
(l ca"po descuento es de tipo SET * ad"ite slo los $alores LSV o LAV* por de#ecto to"a
LSV y no puede ser nulo! Ao precisa ponerle lon&itud! (l tipo EAUM se co"porta de una
#or"a si"ilar al tipo SET y tiene la "is"a sinta7is! Hay que obser$ar c"o debe
escribirse el con)unto de $alores que puede contener este ca"po1 entre par2ntesis* cada
$alor entre co"illas y separados unos $alores de otros por una co"a!
(l ca"po caduca es de tipo 8ATE * es decir que $a a contener una #ec%a! Ao %ay que
poner lon&itud! Para este tipo de datos MySQL dispone ade"'s de los tipos T;ME para la
%ora* "inutos y se&undos* 8ATET;ME * para la #ec%a y la %ora y T;MESTAM1 para el n8"ero
de se&undos transcurridos desde el 4 de enero de 4,>- /2poca Uni70!
(l ca"po notas es de tipo TEXT ! (ste tipo de datos per"ite introducir &ran cantidad de
in#or"acin* de bastantes Mb* al i&ual que el tipo BLOB ! Ao %ay que poner lon&itud!
G! Si escribi"os la sentencia de creacin de la tabla desde el prompt de M(SCL monitor * dado
que es "uy lar&a* pode"os pulsar Intro antes de escribir E y en este caso aparece el si&no 63
en una l5nea in#erior* para indicarnos que la l5nea de la sentencia si&ue en la #ila in#erior! Slo
cuando pon&a"os E al #inal de la sentencia* 2sta intentar' e)ecutarse!
25 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
H! Utiliar esta #or"a de traba)ar resulta de"asiado pesada * debido sobre todo a que el
prompt de M(SCL monitor slo per"ite escribir y borrar %acia atr's* por lo cual resulta
desesperante si uno se equi$oca y* ade"'s* no se &uarda nada de lo escrito ni siquiera en el
bu#er del teclado!
Por eso* lo "'s c"odo y producti$o es crear #ic%eros de te7to* es decir* script MySQL* que se
&uardan donde nos con$en&a con la e7tensin s$l ! (n ellos se escriben las sentencias
MySQL que desea"os se e)ecuten cuando sea necesario!
(n las pr'cticas de esta Unidad cada alu"no debe &uardar estos #ic%eros en su carpeta de
traba)o! Para crearlos puedes utiliar el Cliente MySQL para escribirlo y &uardarlo usando la
opcin del Men @ilePSa$e as!!! eli&iendo tipo de #ic%ero SQL Script! 3a"bi2n puede escribir el
script MySQL con el =ditor de04PHP del curso /con W!W en la $entana de di'lo&o =brir se
pueden $er todos los #ic%eros* no slo los que sean de tipo p%p0 o con cualquier otro
procesador de te7to plano!
Una $e escrito y &uardado el #ic%ero con la e7tensin s$l* se puede e)ecutar de dos #or"as1
:esde una $entana del :9S * e)ecutando m(s$l0exe Lu root y redireccionando %acia 2l el
#ic%ero s$l ! Por e)e"plo* supon&a"os que %e"os creado el script creatabla0s$l y que lo
%e"os &uardado en C:Fcurso1'1.FcursoFalumnos! Aos situa"os en una $entana del :9S en el
ca"ino C:Fcurso1'1.FbinFM(SCLH03Fbin y escribi"os1
m(s$l Lu root VC:Fcurso1'1.FcursoFalumnos\creatabla0s$l =;ntro>
Si las sentencias son correctas* se e)ecutar'n y producir'n los e#ectos pretendidos! Si el #ic%ero
e)ecutable estu$iera en un ca"ino y el #ic%ero s$l en otro* %ay que indicar el ca"ino para que
el siste"a pueda %allar los #ic%eros indicados!
Si las sentencias del #ic%ero s$l son "uc%as y se e)ecutan se&uidas de #or"a que el resultado
ocupa "'s de una pantalla* puede utiliarse el co"ando More del :9S para detener la
e)ecucin en cada pantalla! (scribir* entonces*
m(s$l Lu root VC:Fcurso1'1.FcursoFalumnos\creatabla0s$l M More =;ntro>
:e nue$o* reconoce"os que este procedi"iento no de)a de ser pesado y en&orroso! Por eso*
aconse)a"os utiliar el si&uiente!
:esde el Cliente MySQL en la opcin del Men @ileP9pen Scripts seleccionando en 3ipo de
#ic%ero SQL Script @ile =ASI* abri"os el #ic%ero s$l y lo e)ecuta"os! Si no #unciona
correcta"ente* pode"os arre&larlo en el editor se&8n los "ensa)es de error que se aparecen
en la parte in#erior de la $entana!
(n el Ejemplo 1 de esta Unidad puede $erse el #ic%ero script MySQL con el que %e"os
creado la base de datos Lal"acenV y sus tres tablas LproductosV* Lco"prasV y LclientesV! Co"o
no es un #ic%ero de PHP* no puede interpretarse ni &enerar una p'&ina web* sino slo sir$e
para crear esta base de datos! (n la Unidad si&uiente aprendere"os a %acerlo con #unciones
de PHP!
Con los e)e"plos y e)ercicios de esta Unidad* re#eridos todos a MySQL* slo pretende"os que
el alu"no asi"ile bien los principales contenidos sobre las bases de datos y sus tablas!
26 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
@ntroducir registros en una tabla
Pode"os insertar un re&istro en la tabla LproductosV con la sentencia si&uiente1
insert into &roductos values =5,Y1alaY,350..,355,YSY,
Y-553L3-L3ZY,YFuerte ( barataY>E
9tra #or"a de %acerlo es escribiendo en un #ic%ero de tipo txt la in#or"acin anterior* por
e)e"plo* en el #ic%ero datosS&roductos0txt* e incorporando los datos de esta #or"a1
load data local in-ile YdatosS&roductos0txtY
into table &roductosE
3anto en la tabla LproductosV co"o en Lco"prasV y en LclientesV %e"os introducido tres
re&istros! Con$iene que el alu"no "ire en el Ejemplo 2 el cdi&o para $er c"o pueden
co"pletarse los $alores de los di#erentes ca"pos* sobre todo los de #ec%a y los nu"2ricos*
tanto enteros co"o reales! Si e)ecuta este script $arias $eces se&uidas* se a6adir'n tres
re&istros nue$os cada $e con los "is"os datos! Para co"probar que se %an car&ado los
datos correcta"ente en las tablas desde el Cliente MySQL %ay que %acer doble clic sobre el
no"bre de la tabla y lue&o pulsar el botn (7ecute /Control X Intro0!
Seleccionar o consultar registros dentro de una tabla
La sentencia select per"ite buscar y "ostrar los datos de una tabla! Su estructura es bastante
rica y co"ple)a! Por ello* aconse)a"os a los alu"nos que consulten al&8n libro o direccin de
Internet sobre el len&ua)e SQL! =qu5 slo $a"os a abordar al&unas sentencias* las "'s
i"portantes* para poder incorporar estas rdenes dentro de los scripts PHP en la Unidad
si&uiente! (n concreto* dentro del propio Cliente MySQL puede obtenerse ayuda en in&l2s
sobre los di#erentes co"andos que ad"ite MySQL! Sie"pre que lo necesite* el alu"no puede
consultarlo si no dispone de otro "aterial que le resulte "'s asequible!
Por e)e"plo* en la seccin 31232D S=L=C5 Synta9* se indica la sinta7is si&uiente1
SELECT
RALL M 8;ST;ACT M 8;ST;ACT7OB T
R';!'S17;O7;TGT
RST7A;!'TS6O;AT
RSCLSSMALLS7ESULTT RSCLSB;!S7ESULTT RSCLSBUFFE7S7ESULTT
RSCLSCAC'E M SCLSAOSCAC'ET RSCLSCALCSFOUA8S7OBST
selectSex&r, 000
R;ATO OUTF;LE I<ileSnameI ex&ortSo&tions
M ;ATO 8UM1F;LE I<ileSnameIT
RF7OM tableSre<erences
RB'E7E DhereSde<initionT
R!7OU1 BG [colSname M ex&r M &osition\
RASC M 8ESCT, 000 RB;T' 7OLLU1TT
R'A/;A! DhereSde<initionT
RO78E7 BG [colSname M ex&r M &osition\
RASC M 8ESCT , 000T
RL;M;T [Ro<<set,T roDScount M roDScount OFFSET o<<set\T
R17OCE8U7E &rocedureSname=ar%umentSlist>T
RFO7 U18ATE M LOC) ;A S'A7E MO8ETT
Eea"os c"o se usa esta orden en sus cl'usulas "'s i"portantes y #recuentes1
27 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
=plicada a la base de datos LproductosV* la sentencia
select codi%o,nombre,caduca <rom &roductosE
"uestra estos ca"pos de todos los re&istros de la tabla citada!
Si quere"os que la b8squeda slo se realice entre los 5- pri"eros re&istros de la tabla *
pode"os utiliar la cl'usula limit as51
select codi%o,nombre,caduca <rom &roductos limit 5,.5E
Para co"probar c"o #unciona esta orden* %ay que e)ecutarla desde una $entana del :9S
poniendo los ca"inos adecuados! Por e)e"plo* suponiendo que %e"os creado el script
muestra y que lo %e"os &uardado en C:Fcurso1'1.FbinFM(SCLH03Fbin * nos situa"os en una
$entana del :9S en ese directorio y escribi"os1
m(s$lVmuestra0s$l M More =;ntro>
La rdenes si&uientes pueden incorporarse en un #ic%ero script MySQL de te7to e ir
e)ecut'ndose una a una co"o %e"os indicado /File."e+ Query 5ab en el Men del pro&ra"a0
para poder $er el resultado! (n el Ejemplo 3 %e"os colocado $arias sentencias select con
sinta7is $ariadas para que el alu"no o alu"na pueda apreciar la seleccin de re&istros que se
%ace se&8n las cl'usulas que inte&ren su estructura!
Con la orden anterior se "uestran estos datos1
codi%o nombre caduca
3 1ala -553L3-L3Z
- Azadn -553L5WL53
4 Cuerda de &ita 355 metros -553L5WL53
Si quere"os que aparecan todos los ca"pos* usa"os la sinta7is
select ] <rom &roductosE
Si quere"os que apareca el $alor del ca"po caduca sin repeticiones* pode"os usar la orden
select count=distinct caduca> <rom &roductosE
:etr's de la cl'usula select pode"os indicar* co"o %e"os $isto* $arios ar&u"entos di#erentes
para seleccionar los re&istros de la consulta1
4! (l no"bre de uno o de $arios ca"pos de una o de $arias tablas!
C! (l si&no ] para indicar que aparecan todos los ca"pos!
G! (l operador distinct para eli"inar de la consulta los re&istros duplicados!
H! Las #unciones de a&rupa"iento count=> para contar* sum=> para su"a y av%=> para %allar
la "edia de un ca"po nu"2rico!
28 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
5! 9tras #unciones* co"o max=> para %allar el $alor "'7i"o nu"2rico y min=> para buscar el
"5ni"o!
(n el Ejemplo 3 puede $erse su sinta7is y los resultados de la cl'usula select aplicando
di#erentes sinta7is!
La cl'usula -rom /desde0 indica el ori&en de las tablas en las que est' arc%i$ada la in#or"acin!
:etr's de ella debe escribirse el no"bre de la tabla o tablas* separadas por co"as* de las que
se quiere obtener la in#or"acin! :entro de 2sta puede asi&narse un alias o no"bre "'s
sencillo* bre$e y "ane)able con el que desea"os re#erirnos en adelante a cada tabla! Por
e)e"plo* en las tablas LproductosV y LclientesV %ay un ca"po deno"inado LnombreV! Para
poder identi#icar cada uno dentro de una "is"a cl'usula select * debe"os escribir1
select &roductos0nombre,clientes0nombre
<rom &roductos,clientesE
:e una #or"a "'s bre$e* pod5a"os %aber usado un alias para cada tabla as51
select 10nombre,C0nombre <rom &roductos 1,clientes CE
La cl'usula 7here /donde0 se usa para seleccionar slo los re&istros de una tabla que cu"plan
una deter"inada condicin! Por e)e"plo* la instruccin
select ] <rom &roductos Dhere nombre^_1ala_E
"ostrar' todos los ca"pos de la tabla LproductosV que lle$en co"o contenido LPalaV en el
ca"po nombre!
La condicin puede ser co"ple)a usando e7presiones en las que inter$en&an no"bres de
ca"pos* $alores constantes y operadores* co"o
select ] <rom &roductos
Dhere nombre^Y1alaY and stocQJ.5 and &recioSeurosJ35E
(n este caso se "ostrar'n los re&istros de la tabla LproductosV que conten&an KPalaK en el
ca"po nombre y de los que %aya en stocE "'s de 5- e)e"plares cuyo precioFeuros sea
superior a 4- euros! Se pueden usar ta"bi2n alias para re#erirnos a las tablas e incluir en la
condicin ca"pos de di#erentes tablas!
Pueden utiliarse* i&ual"ente* #unciones dentro de las e7presiones* co"o
select nombre,ti&o
<rom clientes Dhere (ear=alta>J-555E
donde "ostra"os slo el no"bre y el tipo de los re&istros de la tabla LclientesV cuyo a6o de la
#ec%a de alta sea posterior a C---!
La cl'usula "roup b2 /a"rupados por0 per"ite %acer una consulta su"aria* es decir* en lu&ar
de "ostrase todos los re&istros* se a&rupan los que ten&an unas "is"as caracter5sticas y se
"uestra slo cu'ntos son! Por e)e"plo* la instruccin
29 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
select descuento,count=]>
<rom &roductos %rou& b( descuentoE
"uestra slo el n8"ero de re&istros de la tabla LproductosV que tienen descuento y el n8"ero
de los que no lo tienen!
La cl'usula havin" /si ha20 per"ite li"itar el n8"ero de &rupos poniendo una condicin a la
inte&racin de los &rupos! :ebe usarse slo detr's de "roup b2 para insertar la condicin! Por
e)e"plo* la instruccin
select descuento,count=]>
<rom &roductos %rou& b( descuento
havin% count=]>J3E
"uestra slo el n8"ero de re&istros de la tabla LproductosV que tienen descuento y que no lo
tienen si son "'s de 4! =s5 pues* no aparece a%ora el producto que no tiene descuento* pues
slo %ace un &rupo de 4!
La cl'usula order b2 /ordenar por0 %ace aparecer en la consulta los re&istros ordenados por el
ca"po que se indique ! Por e)e"plo* la instruccin
select ] <rom &roductos order b( nombreE
"uestra los re&istros de la tabla LproductosV ordenados por el ca"po no"bre! Por de#ecto* se
ordenan de #or"a =SCendente /de "enor a "ayor en el cdi&o =SCII0* pero pode"os
ordenarlos ta"bi2n al re$2s a6adiendo la cl'usula :(SC! Si a%ora escribi"os
select ] <rom &roductos order b( nombre descE
los re&istros de "ostrar'n ordenados de "ayor a "enor /en el cdi&o =SCII0!
3a"bi2n es posible "ostrar los re&istros ordenados por un se&undo ca"po cuando %ay
coincidencia de dos o "'s re&istros en el pri"ero! Por e)e"plo* la instruccin
select ] <rom &roductos order b( nombre,stocQE
en el caso de que %ubiera dos o "'s productos con el nombre L=adnV* "ostrar5a 2stos
ordenados se&8n el n8"ero* de "enor a "ayor* del ca"po stocE!
:esde la $ersin H!- del ser$idor MySQL es posible ta"bi2n utiliar las Subqueries
/subconsultas0! (s decir* utiliar el resultado de una consulta dentro de otra! Por e)e"plo* la
instruccin
SELECT ] F7OM clientes
B'E7E clientes0codi%o ;A =SELECT com&ras0codi%oScliente <rom com&ras>
obtiene todos los re&istros de la tabla LclientesV que ten&an dado de alta al&8n re&istro en la
tabla Lco"prasV!
=de"'s* desde la $ersin H!- del ser$idor MySQL ta"bi2n es posible ta"bi2n utiliar las
Y9IAS /uniones0! Las )oins son b'sica"ente la co"binacin de dos o "'s re&istros de
di#erentes tablas usando al&una sentencia de co"paracin! Por e)e"plo* la instruccin
30 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
si&uiente "uestra el "is"o resultado que la anterior
SELECT ] F7OM clientes
LEFT 6O;A com&ras OA clientes0codi%o ^ com&ras0codi%oScliente
Si el alu"no o alu"na desea au"entar sus conoci"ientos sobre subqueries o )oins puede
diri&irse al "anual de MySQL donde se "uestran la sinta7is y "'s e)e"plos!
=conse)a"os al alu"no que ten&a e)ecut'ndose la utilidad Cliente MySQL a la $e que la
$entana del :9S desde la que est2 e)ecutando las sentencias SQL! =s5* desde esta 8lti"a
$entana podr' ir a6adiendo y "odi#icando el contenido de los re&istros de la tablas LproductosV*
Lco"prasV y LclientesV< lue&o* desde la $entana de Cliente MySQL puede ir $iendo los
resultados de las sentencias SQL!
ActualiCar los registros de una tabla
Para "odi#icar el contenido de los re&istros de una tabla* %ay que utiliar la sentencia update *
que tiene esta sinta7is1
update Vnombre de la tablaJ set Vnombre del cam&oJ
8 Vex&resinJ,000,000 R7here VcondicinJT
Por e)e"plo* si quere"os que en la tabla LproductosV dentro del ca"po stocE se pon&a el $alor
4C- en aquellos re&istros que conten&an el $alor 4--* pode"os usar la instruccin
u&date &roductos set stocQ ^ 3-5 Dhere stocQ^355E
Si no %ubi2ra"os usado la condicin en la cl'usula Dhere * se %abr5an ca"biado los $alores del
ca"po stocE de todos los re&istros de la tabla!
3a"bi2n pode"os ca"biar el contenido de $arios ca"pos a la $e y usar #unciones y
operaciones para "odi#icar los ca"pos! Por e)e"plo* aplicada a la tabla LclientesV la instruccin
u&date clientes set ba?a^noD=>,
deudasSeuros^deudasSeuros]3035E
"odi#ica el actual $alor AULL del ca"po ba&a con la #ec%a y %ora actuales* e incre"enta el
ca"po deudasFeuros en el 4- .* en todos los re&istros
Si dese"os "odi#icar los re&istros de $arias tablas a la $e la sinta7is que debe"os usar es la
si&uiente1
9,)ATE tabla3, tabla- 000
SET nombreScolumna3^ex&r3, nombreScolumna-^ex&r- 000
R:;E!E condicinT
(n el Ejemplo 4 puede $erse el uso de la sentencia u&date y los resultados aplicando
di#erentes sinta7is!
31 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
'orrar registros
La sentencia delete per"ite eli"inar re&istros de una tabla! Su sinta7is es
delete -rom Vnombre de la tablaJ R7here VcondicinJT
Si no se incluye al cl'usula Dhere* que es opcional* se eli"inan todos los re&istros! Por
e)e"plo* la instruccin
delete <rom clientesE
de)a la tabla sin re&istros* pero no la eli"ina! Ao es #recuente eli"inar todos los re&istros de
&olpe! Por eso* casi sie"pre se utilia la cl'usula Dhere para seleccionar los re&istros que se
desea eli"inar! Por e)e"plo* la instruccin
delete <rom clientes Dhere deudasSeuros^5E
eli"ina los re&istros de la tabla LclientesV que no ten&an deudas! (n ca"bio*
delete <rom clientes Dhere codi%o^3E
eli"ina el re&istro que ten&a el n8"ero 4 co"o codigo!
Si dese"os lle$ar a cabo una eli"inacin "8ltiple en $arias tablas la sinta7is que debe"os
usar es la si&uiente1
delete Vnombre de la tablas donde borramos los re%istrosJ
-rom Vnombre de la tablas sobre la $ue hacemos consultas J R7here VcondicinJT
Por e)e"plo* para eli"inar los re&istros cuyo cdi&o de cliente es 4 tanto en la tabla
clientes co"o en co"pras escribi"os1
delete com&ras, clientes -rom com&ras, clientes
7here clientes0codi%o^3 and com&ras0codi%oScliente^clientes0codi%oE
(n el Ejemplo puede $erse el uso de la sentencia delete y los resultados aplicando
di#erentes sinta7is!
";5A1 es i"portante tener en cuenta que las sentencias S(L(C3* UP:=3( y :(L(3(
pueden ser utiliadas con)unta"ente con subconsultas! =de"'s* todas estas sentencias
per"iten actuar sobre $arias tablas a la $e!
Crear y destruir ndices
Los 5ndices est'n asociados al #ic%ero de los datos y sir$en para "antener en orden los
re&istros de una tabla !
Para cada tabla slo puede %aber un ndice primario* que ordena los re&istros por uno o "'s
ca"pos al ir introduciendo los re&istros en una tabla! Un 5ndice pri"ario identi#ica los re&istros
de una tabla de #or"a 8nica! Si se obser$a las tres tablas creadas por nosotros* LproductosV*
Lco"prasV y LclientesV* puede $erse que %e"os &enerado en todos los casos un 5ndice pri"ario
por el ca"po codi&o* de #or"a que 2ste ser' el orden natural al ir introduciendo los re&istros!
32 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
(ste ca"po se autoincre"enta de #or"a que* se&8n se $an a6adiendo re&istros* cada uno $a
to"ando un n8"ero consecuti$o!
La cl'usula primar2 <e2 * incluida dentro de la sentencia create table * per"ite crear un 5ndice
pri"ario! 3a"bi2n puede $erse en el Ejemplo 1 c"o lo %e"os %ec%o en la instruccin
si&uiente de creacin de la tabla LproductosV1
create table i< not exists
&roductos= codi%o ;AT ,!=>A!? @E? AUTOS;AC7EMEAT,
nombre /A7C'A7=45> AOT AULL,
&recioSeuros 8EC;MAL=W,4> AOT AULL,
stocQ T;AG;AT AOT AULL,
descuento SET=ISI,IAI> 8EFAULT YSY AOT AULL,
caduca 8ATE,
notas TEXT>E
Fa %e"os co"entado que los #ic%eros de 5ndice tienen la e7tensin m2i y el "is"o no"bre que
el #ic%ero que contiene los datos de la tabla!
3a"bi2n pueden crearse #ic%eros de 5ndice no primario* tantos co"o se necesite! (ste tipo de
5ndices no identi#ica cada re&istro de #or"a 8nica* sino que dos o "'s re&istros pueden lle$ar la
"is"a cla$e! Los #ic%eros de 5ndice no pri"ario se crean to"ando co"o cla$e de ordenacin
uno o "'s ca"pos de la tabla! Su sinta7is es la si&uiente1
create Runi$ueM<ulltextT inde+ Vnombre del "ndiceJ on Vnombre de la tablaJ=nombre del
cam&o,000 >
La opcin uni$ue debe usarse cuando quere"os que slo %aya un re&istro con la "is"a cla$e*
de #or"a que* al introducir otro con la "is"a* no se per"ita %acerlo! La opcin <ulltext slo
puede usarse con ca"pos de tipo varchar y text * e indica que se to"e su te7to co"pleto
co"o cla$e de ordenacin! Si se usan co"o cla$es ca"pos de tipo char y varchar * se puede
indicar una lon&itud de la cla$e de ordenacin* sin que sea necesario usar el ca"po co"pleto!
Si se usan co"o cla$es ca"pos de tipo blob y text * es i"prescindible indicar una lon&itud de
la cla$e de ordenacin!
Por e)e"plo* si quere"os crear un #ic%ero de 5ndice deno"inado cBno"bre en el que se
ordenen los re&istros de la tabla LclientesV por el ca"po nombre* debe"os escribir la
instruccin
create index cSnombre on clientes=nombre>E
Si %ubi2ra"os querido usar co"o cla$e de orden slo los 4- pri"eros caracteres del ca"po
nombre* deber5a"os %aber escrito la instruccin
create index cSnombre on clientes=nombre=35>>E
Con$iene obser$ar que este 5ndice* co"o el pri"ario* se &uarda ta"bi2n en el "is"o #ic%ero
de tipo m(i ya "encionado!
La sentencia drop inde+ per"ite eli"inar 5ndices! 3iene esta sinta7is
drop inde+ Vnombre del "ndiceJ
on Vnombre de la tablaJ
33 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
Por e)e"plo* si quere"os eli"inar el 5ndice cBno"bre* debe"os escribir
dro& index cSnombre on clientesE
(n el Ejemplo ! se realian di#erentes operaciones de creacin de 5ndices* de "ostrar los
5ndices asociados a una tabla y de eli"inacin de los "is"os aplicadas a las tablas LproductosV
y LclientesV!
=liminar tablas y bases de datos
Para eli"inar una tabla %ay que usar la sentencia dro& table * que tiene esta sinta7is1
drop table Ri< existsT Vnombre de la tablaJ,000
Por e)e"plo* si quere"os eli"inar la tabla LproductosV* %ay que usar la instruccin
dro& table i< exists &roductosE
Para eli"inar una base de datos %ay que usar la sentencia dro& database* que tiene esta
sinta7is1
drop database Ri< existsT Vnombre de la base de datosJ,000
Por e)e"plo* si quere"os eli"inar la base de datos Lal"acenV* %ay que usar la instruccin
dro& database i< exists almacenE
(n el Ejemplo " se eli"inan las dos tablas creadas en la base de datos Lal"acenV y la propia
base de datos! (l alu"no puede estudiar en ese cdi&o s$l c"o se aplican las instrucciones
co"entadas anterior"ente!
"otas importantes
4! Los siete e)e"plos de este apartado no son cdi&o &h& * por lo cual no pueden interpretarse
ni &enerar p'&inas web co"o %e"os %ec%o %asta a%ora! Por eso* en la $entana del curso slo
aparece el botn I"pri"ir* para que el alu"no pueda $er y estudiarlo este cdi&o SQL !
C! Para e)ecutar estos e)e"plos* lo "e)or es copiar estos #ic%eros desde la carpeta
c1McursoPHP5McursoMcursoBiniMcapitulosM-Qunidad6Me)e"plos al directorio de traba)o propio y
lue&o e)ecutarlos desde una $entana del :9S* co"o %e"os e7plicado! Por e)e"plo*
suponiendo que nuestra carpeta sea c1McursoPHP5McursoMalu"nosMal#er--4 y que quere"os
e)ecutar el ()e"plo 4 /#ic%ero uni6Be)e4!sql* supon&a"os0* pode"os abrir una $entana del
:9S* ponernos en al ca"ino C1McursoPHP5MbinM"ysqlH!4Mbin y desde a%5 escribir
m(s$lVC:Fcurso1'1.FcursoFalumnosFal<er553FuniZSe?e30s$l M more
=;ntro>
G! Por otra parte* es "uy i"portante e)ecutar los e)e"plos en orden* pues en ellos se si&ue un
proceso l&ico1 pri"ero se crea la base de datos Lal"ac2nV y sus tres tablas LproductosV*
Lco"prasV y LclientesV /e)e"plo 40< lue&o* se incorporan tres re&istros cada una de las $eces
que se e)ecuta el e)e"plo C< en el e)e"plo G se utilian di#erentes sinta7is de la sentencia
select para %acer consultas< posterior"ente* se eli"inan re&istros /e)e"plo H0< a continuacin*
34 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
se actualian los datos de los re&istros /e)e"plo 50< se&uida"ente* se crean 5ndices y se
destruyen /e)e"plo 60< y* #inal"ente* se eli"inan las tablas y la base de datos /e)e"plo >0! :e
a%5 la necesidad de proceder de #or"a l&ica al ir e)ecutando los citados e)e"plos!
H! Por otra parte* la utilidad Cliente MySQL puede ayudarnos a $er los datos y a co"prender
"'s intuiti$a"ente lo que pasa en cada proceso! Para e)ecutar scripts co"ple)os con $arios
co"andos SQL se&uidos de K<K debes usar la opcin del Men @ilePAew Script 3ab!
5! @inal"ente* quere"os insistir en que slo %e"os e7puesto lo b'sico del len&ua)e SQL*
debido a que el aprendia)e del "is"o no es ob)eto de este curso* sino que se supone que los
alu"nos y alu"nas que se %an "atriculado en este curso de PHP deben tener ya pre$ia"ente
asi"ilados los conoci"ientos b'sicos necesarios de SQL para realiar el curso de PHP!
# - $esu%en
Hay que saber al final de esta unidad
Cmo es la ar1uitectura de una aplicaci*n ,;, 1ue
utilice bases de datos ( mediante 1uA dos tipos de
enlaces &uede acceder el servidor a las bases de
datos0
5os conceptos <undamentales de las bases de datos
relacionales: di-erentes tipos de bases de datos
relacionalesB or"aniCaci*n de la in-ormaci*n en
-ilas .re"istros/ 2 columnas .campos/B
caractersticas de cada campo .nombreB tipoB
lon"itudB si es la clave de un ndiceB etcAtera/0
5as ventaDas 1ue aportan las bases de datos al
almacenamiento ( mane?o de la in<ormacin $ue
contienen0
Cmo se lleva a cabo el diseEo correcto 2 e-icaC de
una base de datos0
Arrancar el servidor de datos >2SF5B comprobar 1ue
estG activado 2 desactivarlo .echarlo abaDo/ al
acabar la sesi*n de trabaDo del curso0
Arrancar el pro"rama H>2SF5 monitorH desde una
ventana del 8OS ( escribir desde su prompt las
sentencias SF5 bGsicas &ara tratar las bases de
datos ( las tablas0
Arrancar la utilidad HCliente >2SF5HB conectarse al
servidor de datos ( maneDar con cierta soltura las
&rinci&ales o&ciones de este &ro%rama $ue &ermiten
crear bases de datos 2 tablasB eliminarlasB acceder
35 de 36
Curso de PHP 5 Unidad 6 Introduccin y uso de MySQL
a la in-ormaci*n de las mismas 2 tratarla, etc2tera0
CrearB "uardarB abrir 2 eDecutar Fueries con la
utilidad anterior0
Aplicar correctamente las principales sentencias SF5
para crear bases de datos 2 tablasB mostrar las 1ue
ha2a creadasB usarlasB introducir re"istros en las
tablasB consultar su in-ormaci*nB actualiCarlosB
eliminarlosB crear 2 eliminar ndicesB as como
eliminar tablas 2 bases de datos0
MENTOR - CNICE MEC 2006
36 de 36
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
Teora: Acceder con PHP a las bases de datos
1 - Objetivos
Objetivos
Saber conectarse al servidor que contiene el gestor de bases de
datos MySQL.
Aprender a crear una base de datos, a conectarse a ella y a
borrarla con sus tablas e inor!aci"n# sabiendo utili$ar# ade!%s# las
unciones que controlan los posibles errores.
Aprender a consultar una base de datos utili$ando queries en las
que intervengan las &rinci&ales unciones de PHP &ara acceder a
bases de datos de ti&o MySQL y tratar su inor!aci"n.
Saber insertar# actualizar y eliminar registros de una tabla# 'aciendo
uso# ade!%s# de or!ularios y de celdas de tablas &ara !ostrar su
inor!aci"n# &reguntarla o seleccionar ca!&os.
Aprender a instalar el controlador MyODBC &ara &oder conectar
bases de datos de ti&o MS Access con las de ti&o MySQL# as( co!o
saber importar o exportar tablas entre a!bos gestores de bases de
datos.
Saber mantener una base de datos reali$ando a trav)s de unciones
de usuario las &rinci&ales o&eraciones de este ti&o* altas# ba+as#
consultas# b,squedas# actuali$aciones# etc)tera.
2 - Funciones de PHP para acceder a las bases de datos
Conexin con una base de datos
-a 'e!os co!entado en las Unidades anteriores que PHP &er!ite acceder y tratar la
inor!aci"n de las &rinci&ales bases de datos que 'ay en el !ercado actual!ente* .racle#
MySQL# PostgreSQL# Sys/ase# 0nor!i1# etc)tera. 2n la Unidad anterior ta!bi)n 'e!os
co!entado que &uede 'acerlo tanto a trav)s de los &rogra!as nativos de la &ro&ia base de
datos 3AP04 co!o !ediante una cone1i"n gen)rica de ti&o ./5C.
2n esta Unidad va!os a e1&oner y e1&licar# &recisa!ente# c"!o accede PHP a MySQL y las
1 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
unciones que &er!iten reali$ar o&eraciones con las bases de datos# sus tablas y los datos que
contengan* crearlas# introducir inor!aci"n# actuali$ar )sta# eli!inarla# elaborar inor!es a &artir
de la !is!a# etc)tera. As( &ues# en esta Unidad se estudiar%n las &rinci&ales unciones de PHP
relacionadas con el servidor de datos MySQL.
2n el ca&(tulo L!"# $unciones MyS%L del Manual de PHP se listan las &rinci&ales unciones
de acceso al servidor de bases de datos MySQL y se &er!ite acceder a la e1&licaci"n de cada
una !ediante los enlaces corres&ondientes. Hare!os# &ues# uso de las AP0s originales de esta
base de datos.
2n esta !is!a Unidad# !%s adelante# establecere!os ta!bi)n una cone1i"n ./5C que nos
&er!itir% acceder a las bases de datos de ti&o MS Access.
Si los alu!nos y alu!nas del curso 'an co!&rendido y asi!ilado bien los conce&tos
unda!entales sobre las bases de datos relacionales# e1&licados en la Unidad anterior# y
a&renden a !ane+ar en esta Unidad las bases de datos de ti&o MySQL# estar%n &re&arados sin
duda &ara &oder a&licar las unciones corres&ondientes de otros ti&os de bases de datos# que
ta!bi)n incor&ora el lengua+e PHP.
2n esta Unidad va!os a seguir un &roceso si!ilar al de la Unidad anterior# llevando a cabo
!%s o !enos las !is!as o&eraciones con las bases de datos# &ero en este caso usando las
unciones de PHP.
2stablecer una cone1i"n con el servidor de bases de datos MySQL
Para reali$ar una cone1i"n con una base de datos creada con MySQL 'ay que utili$ar la
unci"n mysql_connect().
La unci"n mysql_connect() establece una cone1i"n con el servidor de bases de datos MySQL.
6iene la siguiente sinta1is*
mysql_connect ([nombre del servidor [:puerto]
[:/camino/al/socket]
[, string usuario
[, string password]]]
)
2sta unci"n devuelve un identiicador de enlace 3n,!ero entero &ositivo4 si se establece la
cone1i"n o False si no se consigue conectar.
6odos los argu!entos son o&cionales. Si no los 'ay# se asu!en los valores &or deecto# que
son 7local'ost7 co!o no!bre del servidor# usuario &ro&ietario del &roceso del servidor# en
nuestro caso 8root9# y password vac(a.
Co!o 'e!os visto# &ara establecer una cone1i"n con el servidor MySQL# &ueden utili$arse
'asta cinco datos*
:. Servidor* no!bre del equi&o o direcci"n 0P donde est% la base de datos. Por deecto# si no
se &one nada# se asu!e el servidor ;local'ost<.
=. &uerto* v(a &or donde se accede a la base de datos. Si no se &one# &or deecto se asu!e
el valor &or deecto que es el ;>>?@<.
2 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
>. Camino al soc'et 3pat()to)soc'et4* no!bre del subdirectorio donde est% el &rogra!a
que est% usando el servidor &ara escuc'ar las &eticiones de los clientes. S"lo tiene eecto en el
entorno Uni1. Si no se &one# &or deecto se asu!e ;At!&A!ysql.socB<.
C. *suario* no!bre del usuario que accede a la base de datos. Por deecto es el que tenga el
&ro&ietario del servidor# que suele ser ;root<.
5. Clave* es la &assDord de acceso que tiene el usuario. Si no se &one# se asu!e una cadena
vac(a.
Si ya 'e!os establecido una cone1i"n y 'ace!os una nueva lla!ada a la unci"n
mysql_connect() con los !is!os argu!entos# no se establece un nuevo identiicador de
enlace# sino que se devuelve el !is!o de la cone1i"n ya abierta.
La cone1i"n con el servidor se cierra cuando acaba de inter&retarse el script PHP. Puede
cerrarse antes indic%ndolo e1&l(cita!ente con la unci"n mysql_close(). 2sta unci"n tiene la
sinta1is siguiente*
mysql_close ([identificador de conexin])
5evuelve True si se cierra la cone1i"n y False si no se 'ace.
As( &ues# mysql_close() cierra la cone1i"n con la base MySQL que est) asociada con el
identiicador de enlace es&eciicado. Si no se es&eciica el identiicador de enlace# se asu!e
&or deecto el ,lti!o enlace abierto.
Puede ocurrir que necesite!os !antener una cone1i"n &ersistente# es decir# que no se cierre
cuando acabe de inter&retarse el script PHP# de or!a que siga establecida cuando se e+ecuten
otros scripts. 2n este caso# debe!os establecer una cone1i"n &ersistente# que se crea con la
unci"n mysql_pconnect(). 2sta unci"n tiene la !is!a sinta1is que la unci"n mysql_connect()#
con la sola dierencia de que establece una cone1i"n &ersistente# que no se acaba con la
inter&retaci"n del ic'ero script donde se 'a establecido# sino que se !antiene al inter&retarse
otros. Una cone1i"n &ersistente no se cierra con la unci"n mysql_close().
Por e+e!&lo# si quere!os establecer una cone1i"n con el servidor ;!i'ost< utili$ando el
no!bre de usuario ;+ose+a< y la clave ;garcia<# debe!os escribir
mysql_connect("miost", "!ose"a", "garcia")#
Hay que tener en cuenta que# &ara que estos datos sean ace&tados co!o v%lidos# es necesario
que el servidor se deno!ine as(. Ade!%s# el no!bre del usuario y de la clave deben 'aber sido
dados de alta en el servidor MySQL antes de &retender usarlos# ya que el servidor &rocede a
autentiicar estos datos antes de &er!itir la cone1i"n.
A'ora bien# co!o esta instrucci"n# si se consigue# devuelve un identiicador de cone1i"n que
des&u)s 'e!os de utili$ar en otras unciones# lo !e+or es asignar a una variable el no!bre de
este identiicador# de esta or!a*
$id_cone%ion & mysql_connect("miost'", "!ose"a", "garcia")#
Por otra &arte# &uede ser que no se logre conectar# en cuyo caso se &roducir(a un error con un
!ensa+e en ingl)s. Para o&ti!i$ar un &oco la salida en este caso# lo !e+or es utili$ar el
3 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
o&erador @# &ara &rescindir del !ensa+e del siste!a# y la unci"n die()# &ara !ostrar nuestro
!ensa+e# co!o 'e!os 'ec'o en las Unidades anteriores# de esta or!a*
$id_cone%ion & (mysql_connect("miost","!ose"a","garcia")
or die(")o se pudo establecer la cone%i*n")#
Ade!%s# co!o lo !%s &robable es que necesite!os usar al !enos estos tres datos en
sucesivas cone1iones# lo !e+or es asignar sus valores a tres variables# guardarlas en un ic'ero
de te1to y# luego# con la sentencia include o require traerlas al script corres&ondiente cuando
se necesiten &ara establecer una cone1i"n.
Por e+e!&lo# crea!os el ic'ero datos_cone%ion+pp y guarda!os en el !is!o este contenido*
,-
$servidor&"miost"#
$usuario&"!ose"a"#
$clave&"garcia"#
-.
5es&u)s# ya &ode!os establecer la cone1i"n en el script corres&ondiente# de esta or!a*
,-
include("datos_conexion.php");
$id_conexion=@mysql_connect($servidor,$usuario,$clave)
or die("No se pudo estalecer la conexi!n");
"#
2n el Ejemplo 1 de esta Unidad &uede verse c"!o 'e!os usado la unci"n mysql_connect()
&ara establecer una cone1i"n con el servidor MySQL instalado &ara la reali$aci"n del curso.
Para &oder e+ecutarlo# es &reciso arrancar el servidor MySQL antes de &retender establecer
una cone1i"n. A'ora ya no es &reciso arrancar la utilidad MySQLEFront ni conectarse !ediante
la !is!a.
Ade!%s# en los scripts del !odelo de &royecto +inal del curso 3car&eta
c:/curso0102/curso/curso_ini/capitulos/33proyecto_"inal/proyecto_"inal4 se usan
ta!bi)n todas las unciones que se van a e1&licar en esta Unidad. Conviene que# ya desde
este !o!ento# el alu!no o alu!na vaya i+%ndose en esta a&licaci"n que &retende!os le sirva
co!o !odelo &ara reali$ar el &ro&io &royecto inal que 'a de enviar al tutor o tutora antes de
'acer la &rueba inal &resencial del curso.
Conexin a servidores ,ue conten-an otros tipos de bases de datos
Aunque en este curso s"lo se usa el gestor de base de datos MySQL# &one!os a continuaci"n
las unciones con la que se conectar(a a otros ti&os de bases de datos de las que &udiera
dis&oner &articular!ente el alu!no. 2n todo caso# consultando el Manual de PHP &uede
obtenerse inor!aci"n detallada sobre estas unciones y conocer su sinta1is.
Base de datos $uncin para conectarse
PostgreSQL pg_connect("ost&$servidor,username&$usuario,
password&$clave,port&245',dbname&$base")#
4 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
0nor!i1 i"%_connect($base,$usuario,$clave)#
2n estos dos ti&os de bases de datos# se reali$an a la ve$ dos o&eraciones* conectarse al servidor y a la base de
datos.
.5/C odbc_connect(6dsn,$usuario,$clave)#
2n el ,lti!o a&artado de esta Unidad a&rendere!os a establecer cone1iones !ediante el est%ndar .5/C y a
acceder a los datos de bases de datos de ti&o Access.
SQL Server mssql_connect($servidor,$usuario,$clave)#
.racle ocilogon($usuario,$clave[,$basedatos])#
Para establecer una cone1i"n &ersistente# 'ay que &oner pconnet en lugar de connect. 2n
.racle se &one ociplogon.
3 - Crear, seleccionar y destruir una base de datos
PHP &er!ite ta!bi)n crear# seleccionar y borrar bases de datos asociadas a un identiicador
de cone1i"n dentro del servidor al que se 'a conectado.
Quere!os 'acer aqu( una advertencia i!&ortante. Las o&eraciones de crear y eli!inar bases
de datos y tablas dentro de )stas son !%s bien &ro&ias del ad!inistrador del servidor y# &or
tanto# no es 'abitual que un usuario o cliente &ueda crearlas y destruirlas. 2n ca!bio# son
o&eraciones !%s &ro&ias de un cliente 'acer solicitudes que &er!itan consultar y# co!o
!%1i!o# a!&liar# !odiicar o eli!inar el contenido de una base de datos desde su navegador.
2s i!&ortante saber que si se borra una base de datos# )sta no s"lo &ierde el contenido# sino
que# des&u)s# no se &ueden recu&erar sus datos.
2n este a&artado va!os a estudiar las !aneras de crear bases de datos y destruirlas.
Asi!is!o# vere!os c"!o &ode!os seleccionar una entre las dierentes base de datos que
'aya en el servidor.
Crear una base de datos
2n versiones anteriores a PHP 5 estaba dis&onible la unci"n mysql_create_db() que &er!it(a
crear una base de datos de ti&o MySQL asociada a un identiicador de cone1i"n. Go obstante#
en las ,lti!as versiones de PHP se 'a o!itido esta unci"n &ara si!&liicar el c"digo y 'ay que
crear las bases de datos directa!ente usando una ,uery# es decir# e+ecutando una consulta.
Por e+e!&lo# si quere!os crear la base de datos ;&ruebas< asociada a la cone1i"n del a&artado
anterior# &ode!os escribir
mysql_query(789:;<: =;<;>;?: pruebas7, $id_cone%ion)#
Para asi!ilar bien la unci"n mysql_query()# 'ay que estudiarla detenida!ente en el a&artado
siguiente# donde se aborda.
5 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
Co!o &uede &roducirse alg,n error# es conveniente utili$ar una estructura condicional de la
or!a siguiente*
i" (mysql_query(789:;<: =;<;>;?: pruebas7, $id_cone%ion))
print("@a base de datos /Apruebas/A se a creado correctamente ,0.")#
else print"(")o se a podido crear la base de datos:6s ,0.",7:rror nB
7+mysql_errno()+7+C7+mysql_error())#
He!os a&rovec'ado la estructura condicional anterior &ara incluir dos nuevas unciones que
&ueden servirnos de control de errores cuando se &rodu$can )stos en cualquier ti&o de
o&eraci"n con una base de datos. Son las siguientes*
La unci"n mysql_errno() devuelve el n,!ero de error asignado &or MySQL y mysql_error()
devuelve el !ensa+e en ingl)s corres&ondiente al error que se 'a &roducido. Por e+e!&lo# si ya
e1iste la base de datos ;&ruebas< &or 'aber sido creada antes# se indicar% lo siguiente al
e+ecutarse la cl%usula else de la estructura anterior*
2rror nH :??7.ECan7t create database 7&ruebas7. 5atabase e1ists
Si e!&lea!os acertada!ente estas dos unciones &ara !ane+ar y controlar los errores# se
&ueden conocer y detectar# antes de solucionarlos# &osibles &roble!as al reali$ar dierentes
o&eraciones con las bases de datos de ti&o MyQSL.
.liminar una base de datos
2n versiones anteriores a PHP 5 estaba dis&onible la unci"n mysql_drop_db() que &er!it(a
eli!inar una base de datos de ti&o MySQL asociada a un identiicador de cone1i"n. Go
obstante# en las ,lti!as versiones de PHP se 'a o!itido esta unci"n &ara si!&liicar el c"digo
y 'ay que borrar las bases de datos directa!ente usando una ,uery# es decir# e+ecutando una
consulta.
Por e+e!&lo# si quere!os borrar la base de datos ;&ruebas< asociada al identiicador de
cone1i"n actual# &ode!os escribir
mysql_query(7=9D0 =;<;>;?: pruebas7, $id_cone%ion)#
Iecorda!os que &ara asi!ilar bien la unci"n mysql_query()# 'ay que estudiarla
detenida!ente en el a&artado siguiente# donde se aborda.
2s i!&ortante tener !uc'o cuidado al utili$ar esta unci"n# ya que# si se e+ecuta# se &erder% la
base de datos con sus tablas y toda la inor!aci"n que contengan# sin que sea &osible
recu&erarlas &osterior!ente.
6a!bi)n en este caso conviene utili$ar una estructura de control condicional y las unciones de
control de errores# co!o 'e!os 'ec'o y e1&licado al crear esta base de datos.
Seleccionar una base de datos
La unci"n mysql_select_db() &er!ite elegir la base de datos de ti&o MySQL con la que se va
a traba+ar entre las dierentes bases que 'aya en el servidor. Su sinta1is es )sta*
mysql_select_db(base de datos[, identi"icador de cone%i*n])
6 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
Por e+e!&lo# si quere!os traba+ar con la base de datos ;&ruebas< asociada al identiicador de
cone1i"n actual# &ode!os seleccionarla escribiendo*
mysql_select_db("pruebas",$id_cone%ion)#
Si no se es&eciica el identiicador de cone1i"n# que es o&cional# se asu!e co!o tal el ,lti!o
creado.
Al igual que en las dos o&eraciones anteriores# conviene utili$ar una estructura condicional &ara
co!&robar si la o&eraci"n se 'a llevado a cabo correcta!ente# conocer los &osibles &roble!as
y &oder arreglarlos.
2n el Ejemplo 1 de esta Unidad &uede verse c"!o 'e!os usado las unciones de creaci"n y
de borrado de base de datos y mysql_select_db(). Iecorda!os que# &ara &oder e+ecutarlo# es
&reciso arrancar el servidor MySQL antes de crear una base de datos# destruirla o
seleccionarla# y que no es &reciso utili$ar la utilidad Cliente MySQL.
Creacin de tablas
Co!o 'e!os dic'o# PHP no dis&one de unciones &ara crear tablas dentro de las bases de
datos. Jsta es !%s bien una o&eraci"n del ad!inistrador del servidor que contiene la
inor!aci"n. Por ello# quien necesite crear tablas dentro de una base de datos 'a de recurrir a
scripts de ti&o sql que &uede e+ecutar desde una ventana del 5.S con el &rogra!a gestor de
datos mys,l#exe o bien !ediante la utilidad Cliente MySQL. 5e todo ello 'e!os 'ablado y
reali$ado suicientes &r%cticas en la Unidad @.
Go obstante# en el a&artado siguiente vere!os que se &ueden crear tablas !ediante una
,uery# es decir# e+ecutando una consulta. Por e+e!&lo# si dentro de la base de datos ;&ruebas<
quere!os incluir la tabla ;agenda<# &ode!os 'acerlo as(*
$consulta & "create table agenda (registro E)< )D< )F@@
;F<D_E)89:G:)<, nombre 81;9(2H),direccion 81;9(3HH),
tele"ono 81;9(32), email 81;9(2H), I:J (registro) )A#
$datos& (mysql_query($consulta,$id_cone%ion) or
die(")o se a podido e!ecutar la consulta+ 8ompruebe si la
sinta%is de la misma es correcta+")#
2n la &ri!era de las dos instrucciones anteriores asigna!os a la variable $consulta la
sentencia sql de creaci"n de la tabla ;agenda< indicando el no!bre de )sta# as( co!o el
no!bre de los ca!&os# su ti&o y longitud. Ade!%s# i+a!os co!o clave de (ndice el ca!&o
;registro<.
2n la segunda instrucci"n e+ecuta!os la ,uery# gracias a lo cual dentro de la base de datos
;&ruebas< se crea la tabla ;agenda< con la estructura es&eciicada. 2n el a&artado siguiente
encontrar%s toda la inor!aci"n necesaria sobre la unci"n mysql_query().
6a!bi)n en el Ejemplo 1 de esta Unidad a&arece el c"digo donde se crea la tabla indicada.
Las nuevas unciones utili$adas se e1&lican en el a&artado siguiente de esta !is!a Unidad.
7 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
4 - Realizar consultas en una base de datos
PHP &er!ite ta!bi)n consultar la inor!aci"n que 'aya en las tablas de una base de datos
e!itiendo con ella dierentes ti&os de inor!es.
2n este a&artado va!os estudiar las unciones que &er!iten reali$ar consultas y elaborar
inor!es a &artir de la inor!aci"n contenida en las tablas de una base de datos.
Concreta!ente# nos va!os a conectar a la base de datos ;biblioteca<# ya creada en el servidor
MySQL al instalarse el curso# y a servirnos de su inor!aci"n &ara elaborar los inor!es y
reali$ar las queries 3consultas4 de este a&artado.
A'ora necesita!os conocer y recordar las sentencias SQL que va!os a &oner co!o
argu!entos de las unciones de PHP. 2n la Unidad @ se e1&licaron las !%s i!&ortantes. Si el
alu!no tiene alguna duda sobre la inter&retaci"n de las !is!as# &uede recurrir a los
contenidos de la Unidad anterior o bien consultar alg,n !anual &ro&io sobre SQL o buscar
inor!aci"n en las direcciones de 0nternet# indicadas en la Presentaci"n del curso# que 'acen
reerencia a este lengua+e.
Consultar una base de datos
La unci"n mysql_query() env(a una sentencia SQL al servidor &ara que )ste la inter&rete. Su
sinta1is es )sta*
mysql_query(consulta[,identi"icador de cone%i*n])
Lo !%s reco!endable es crear una variable y asignarle el te1to de la consulta. 5es&u)s#
&asa!os esta variable co!o &ri!er argu!ento de la unci"n mysql_query().
Por e+e!&lo# si quere!os enviar al servidor una consulta de la base de datos ;biblioteca< en la
que se !uestren el t(tulo y el autor de los libros de la tabla ;libros<# debe!os escribir
$consulta&"select titulo,autor "rom libros"#
mysql_query($consulta,$id_cone%ion)#
Si no se es&eciica el identiicador de cone1i"n# que es o&cional# se asu!e co!o tal el ,lti!o
identiicador creado. Si no 'ay ninguno# de or!a auto!%tica la unci"n intenta establecer un
enlace co!o si se utili$ara la unci"n mysql_connect() sin argu!entos# y lo utili$a.
Hay que advertir que la sentencia SQL# asignada co!o te1to de la variable $consulta# no
&uede ter!inar en &unto y co!a.
La unci"n mysql_query() devuelve True &ara indicar que la sentencia es correcta y se 'a
e+ecutado sin &roble!as y False en caso contrario. Ade!%s# no indica el n,!ero de ilas
devueltas 3en el e+e!&lo anterior# registros de la tabla4# aunque la sentencia SQL se e+ecute
correcta!ente.
Co!o &uede &roducirse alg,n error# es conveniente utili$ar alguno de los &rocedi!ientos ya
conocidos* una estructura condicionalK la co!binaci"n del o&erador @ con la unci"n die()#
co!o ya 'e!os e1&licado anterior!enteK o las unciones mysql_errno() y mysql_error()# que
co!entare!os des&u)s.
8 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
Co!o &uede verse en el Ejemplo 2# 'e!os &reerido la siguiente sinta1is*
$consulta&"select titulo,autor "rom libros"#
$datos& (mysql_query($consulta,$id_cone%ion) or
die(")o se a podido e!ecutar la consulta+
8ompruebe si la sinta%is de la misma
es correcta+")#
Conviene observar que la unci"n mysql_query() e+ecuta la consulta si es correcta# &ero no
devuelve &or s( sola ninguna inor!aci"n al navegador del cliente. Por eso# 'e!os asignado su
resultado a la variable $datos# que va!os a usar co!o identiicador de la consulta dentro de la
unci"n mysql_result().
As( &ues# debe!os co!binar la &ri!era unci"n 3mysql_query()4 con la segunda
3mysql_result()4 &ara &oder asignar la inor!aci"n de la consulta a dierentes variables y#
luego# &oder !ostrar )stas en la &antalla del cliente.
La unci"n mysql_db_query() env(a una sentencia SQL al servidor es&eciicando el no!bre de
la base de datos sobre la que se e+ecuta la sentencia. 6iene# &ues# el !is!o co!&orta!iento
que la unci"n mysql_query()# si bien su sinta1is es !%s co!&leta# co!o &uede verse*
mysql_db_query(nombre de la base de datos, consulta
[,identi"icador de cone%i*n])
2n este caso no es necesario# en consecuencia# seleccionar &revia!ente la base de datos con
la unci"n mysql_select_db().
Por e+e!&lo# si quere!os usar esta unci"n &ara enviar al servidor una consulta de la base de
datos ;biblioteca< en la que se !uestren el t(tulo y el autor de los libros de la tabla ;libros<# sin
necesidad de seleccionar &revia!ente la base de datos# debe!os escribir
$consulta&"select titulo,autor "rom libros"#
mysql_db_query("biblioteca",$consulta,$id_cone%ion)#
La unci"n mysql_result() devuelve los datos solicitados 3registros de datos4 de un
identiicador generado &or la unci"n mysql_query(). Su sinta1is es )sta*
mysql_result(identi"icador de la consulta, nKmero de
"ila, nKmero de columna o nombre de campo)
2n la Unidad anterior ya e1&lica!os que una tabla est% estructurada en ilas 3registros4 y
colu!nas 3ca!&os4. Pues bien# al &roducirse la consulta# el identiicador devuelto &or la !is!a
es una es&ecie de !atri$ bidi!ensional que tiene en la &ri!era di!ensi"n tantas ilas co!o
registros se 'ayan visto aectados y en la segunda# tantas colu!nas co!o se 'aya indicado.
Por e+e!&lo# en nuestra consulta anterior# que e+ecuta la sentencia SQL select titulo,autor
"rom libros# sabe!os que 'ay =L ilas 3todos los registros de la tabla ;libros<4 y = colu!nas
3los ca!&os indicados4.
Pode!os acceder a cualquiera de esos 5@ datos indicando si!&le!ente el n,!ero de ila y el
de colu!na# contando sie!&re desde ? en adelante. 2n el Ejemplo 2 de esta Unidad &uede
verse que !ostra!os los dos ca!&os 3t(tulo y autor4 de los dos &ri!eros registros de la or!a
siguiente*
9 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
$resul_HH&mysql_result($datos,H,H)#
$resul_H3&mysql_result($datos,H,3)#
eco $resul_HH+7 de 7+$resul_H3#
$resul_3H&mysql_result($datos,3,H)#
$resul_33&mysql_result($datos,3,3)#
eco $resul_3H+7 de 7+$resul_33#
2n lugar del n,!ero de colu!na# &ode!os indicar directa!ente el no!bre del ca!&o# co!o
cadena# o bien el alias que le 'aya!os asignado. Por e+e!&lo# &ode!os escribir ta!bi)n as( la
&ri!era instrucci"n de asignaci"n*
$resul_HH&mysql_result($datos,H,"autor")#
o bien# si 'ubi)ra!os deinido la consulta co!o select titulo,autor as a "rom libros#
&od(a!os 'aber escrito
$resul_HH&mysql_result($datos,H,"a")#
2n las e1&licaciones anteriores 'e!os utili$ado el acceso individuali$ado a cada uno de los
datos de la consulta &or !otivos did%cticos# &ara que el alu!no co!&renda bien c"!o se
&roduce la consulta y el resultado que genera. Cabe destacar que no conoce!os el n,!ero de
registros de una base de datos MySQL 'asta que 'ace!os una consulta sobre la !is!a.
A continuaci"n# estudiare!os otras unciones que &er!iten un trata!iento !%s adecuado y
una &resentaci"n !%s eica$ de la inor!aci"n resultante de una consulta. Son las siguientes*
La unci"n mysql_fetch_row() devuelve el contenido de una sentencia SQL en un array
identiicando cada ele!ento con un ca!&o de la tabla y !ueve el &untero al registro siguiente#
devolviendo una !atri$ de (ndices nu!)ricos con los datos contenidos en los distintos ca!&os*
wile($"ila & mysql_"etc_row($datos))
L
eco $"ila[H]+" de "+$"ila[3]#
M
Si la unci"n mysql_"etc_row() llega al inal de los registros resultantes de la consulta SQL
entonces devuelve N;@?: en lugar de la !atri$ con los datos.
La unci"n mysql_fetch_array() devuelve el contenido de una sentencia SQL en un array
identiicando cada ele!ento con un ca!&o de la tabla. 21trae s"lo una ila del resultado co!o
una !atri$ asociativa y !ueve el &untero al registro siguiente. Su sinta1is es )sta*
mysql_fetch_array()(identi"icador de la consulta, [,tipo de resultado])
La unci"n mysql_"etc_array() es una versi"n e1tendida de la unci"n mysql_"etc_row()#
estudiada anterior!ente# &ues no s"lo guarda los datos en el (ndice nu!)rico de la !atri$# sino
que ta!bi)n guarda los datos en los (ndices asociativos# usando el no!bre del ca!&o co!o
clave 3distinguiendo entre !in,sculas y !ay,sculas4.
Si la unci"n mysql_"etc_array() llega al inal de los registros resultantes de la consulta SQL
entonces devuelve N;@?: en lugar de la !atri$ con los datos.
Si dos o !%s ca!&os del resultado tienen el !is!o no!bre# el ,lti!o tiene &rioridad. Para
acceder a los otros ca!&os con el !is!o no!bre# 'ay que es&eciicar el (ndice nu!)rico o
10 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
deinir un alias &ara esos ca!&os. Por e+e!&lo# en nuestra base de datos ;biblioteca< las tres
tablas tiene el ca!&o 'o!"ni!o ;registro<. Para que en la !atri$ resultante de la consulta se
distingan los tres# deber(a!os escribir as( la sentencia SQL*
select l+registro as lr, u+registro as ur, p+registro as pr
"rom libros l,usuarios u, prestamos p#
5e esta or!a# en la !atri$ resultante tendr(a!os una colu!na &ara lr 3registro de libros4# otra
&ara ur 3registro de usuarios4 y una tercera &ara &r 3registro de &r)sta!os4.
2l segundo argu!ento# que es o&cional# es una constante y &uede tener los valores siguientes*
M-SQLMASS.C# M-SQLMGUM# y M-SQLM/.6H 3valor &or deecto4 que indican los ti&os de
(ndices que se deben guardar en la !atri$* asociativos# nu!)ricos o a!bos.
Por ra$ones evidentes &reeri!os utili$ar la unci"n mysql_"etc_array().
2n el Ejemplo 2 de esta Unidad &uede verse c"!o a&lica!os la unci"n e1&licada
incluy)ndola dentro de una bucle &ara recorrer todos los registros de la tabla. Jste es el c"digo
que 'e!os e!&leado*
wile($"ila & mysql_"etc_array($datos))
L
eco $"ila["titulo"]+" de "+$"ila["autor"]#
M
mysql_"ree_result($datos)#
La unci"n mysql_free_result() libera de la !e!oria el resultado de la consulta. Conviene
utili$arla sie!&re que tenga!os dudas sobre la ca&acidad de la !e!oria del ordenador en el
que e+ecuta!os la consulta.
La unci"n mysql_fetch_objetc() devuelve el contenido de una sentencia SQL co!o un ob+eto.
21trae s"lo una ila del resultado co!o un ob+eto con sus &ro&iedades. 6iene la !is!a sinta1is
que la unci"n mysql_"etc_array()# &ero se dierencia de ella en la or!a en que debe!os
reerirnos a cada dato. Por e+e!&lo# si usa!os esta unci"n en el caso del Ejemplo 2#
debe!os escribir*
wile($"ila & mysql_"etc_ob!ect($datos))
L
eco $"ilaC.titulo+" de "+$"ilaC.autor#
M
mysql_"ree_result($datos)#
La unci"n mysql_num_rows() devuelve el n,!ero de ilas que se 'an vista aectadas al
e+ecutarse una sentencia SQL. Una ve$ que conoce!os este valor# &ode!os utili$arlo# &or
e+e!&lo# &ara 'acer un bucle que recorra todos los registros resultantes de la consulta y
!ostrar sus datos. Por e+e!&lo# &ode!os !ostrar el t(tulo# la editorial# el aNo de &ublicaci"n# el
n,!ero de &%ginas y el &recio de todos los libros que sean de la editorial ;Alaguara<#
ordenados &or t(tulo# con el bucle siguiente*
$consulta&"select titulo,editorial,anno_publica,paginas,precio_euros
"rom libros
were editorial&7;l"aguara7
order by titulo"#
$datos& (mysql_query($consulta,$id_cone%ion)
or die(")o se a podido e!ecutar la consulta+8ompruebe
11 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
si la sinta%is de la misma es correcta+")#
$"ilas&mysql_num_rows($datos)#
$campos&mysql_num_"ields($datos)#
"or ($i&H#$i,$"ilas#$iOO)
L
$datos_"ila&mysql_"etc_array($datos)#
print "<Ptulo: "+$datos_"ila["titulo"]+"+"+
" :ditorial: "+$datos_"ila["editorial"]+"+"+
" ;Qo de publicaci*n:"+$datos_"ila["anno_publica"]+A+
" )Kmero de pRginas:"+$datos_"ila["paginas"]+"+"+
" 0recio en euros"+$datos_"ila["precio_euros"]+"+,0."#
M
eco ":n la consulta anterior se a visto a"ectados $campos campos+"#
La unci"n mysql_data_seek() !ueve el &untero interno a la ila es&eciicada del resultado.
6iene la siguiente sinta1is*
mysql_ data_seek(identi"icador de la consulta,nKmero de "ila)
Una ve$ le(do un resultado con la unci"n mysql_"etc_array()# &ode!os llevar el &untero a la
,lti!a ila del resultado con la orden
mysql_data_seek($datos,mysql_num_rows($datos)C3)#
5ebe!os tener en cuenta que en la !atri$ los ele!entos 3ilas del resultado4 se cuentan desde
? 'asta mysql_num_rows()C3.
5es&u)s de e+ecutarse la unci"n mysql_data_seek()# la &r"1i!a lla!ada a la unci"n
mysql_"etc_rows() devuelve los datos de la ila a la que se 'a llevado el &untero interno.
5e or!a si!ilar a mysql_num_rows()# la unci"n mysql_num_fields() devuelve el n,!ero de
ca!&os del resultado de e+ecutar una sentencia SQL. Puede observarse c"!o 'e!os usado
esta unci"n en el c"digo anterior asignando a la variable $campos el n,!ero de ca!&os
aectados &or esta consulta.
2n el Ejemplo 2 &uede verse el c"digo co!&leto de la consulta anterior.
Con la unci"n mysql_fetch_field() &ode!os conocer las caracter(sticas siguientes de un
ca!&o 3colu!na de la consulta4# que se devuelven co!o &ro&iedades de un ob+eto*
/ame0 Go!bre de la colu!na.
1able0 Go!bre de la tabla a la que &ertenece la colu!na.
Max)len-t(0 Longitud !%1i!a de la colu!na.
/ot)null0 5evuelve : si la colu!na no &uede contener un valor nulo.
&rimary)'ey0 5evuelve : si la colu!na es la clave &ri!aria.
*ni,ue)'ey0 5evuelve : si la colu!na es una clave ,nica.
Multiple)'ey0 5evuelve : si la colu!na es una clave no ,nica.
/umeric0 E 5evuelve : si la colu!na es nu!)rica.
Blob0 5evuelve : si la colu!na es un /L./.
1ype0 6i&o de la colu!na#
*nsi-ned0 5evuelve : si la colu!na es unsigned.
12 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
2ero+ill0 5evuelve : si la colu!na es zero-filled.
Su sinta1is es la siguiente*
mysql_fetch_field(identi"icador de la consulta,[,salto de campo])
2l segundo argu!ento# que es o&cional# indica el n,!ero de ca!&o# contando desde ?# al que
nos reeri!os. Si no se indica y es la &ri!era ve$ que se e+ecuta esta unci"n# se devuelven las
&ro&iedades del ca!&o ? 3en la tabla ;libros< es ;autor<4. Si no se indica y se e+ecuta la unci"n
sucesivas veces# cada ve$ se devuelven las &ro&iedades del ca!&o siguiente. Si se indica# se
devuelven las del ca!&o que se es&eciique.
La unci"n anterior &uede co!binarse con la unci"n mysql_"ield_seek()# que asigna el
&untero del resultado al n,!ero de ca!&o es&eciicado. Por e+e!&lo# la instrucci"n
mysql_"ield_seek($datos,5)#
lleva el &untero al ca!&o ># contando el &ri!ero co!o ?# de la tabla ;libros<# que es
;annoM&ublica<. Si a'ora e+ecuta!os la unci"n mysql_"etc_"ield() sin es&eciicar el salto de
ca!&o# se devuelven las &ro&iedades de este ca!&o.
2l conoci!iento de estos datos &uede ser necesario en ocasiones. 2n el Ejemplo 2 3o&ci"n
&ropiedades y +la-s de al-unos campos4 &uede verse c"!o !ostra!os en la &antalla las
&ro&iedades del ca!&o ;sueldoMeuros< de la tabla ;usuarios<.
Hay otras unciones !%s sencillas que &er!iten conocer s"lo algunas caracter(sticas
&articulares de un ca!&o. Son )stas*
La unci"n mysql_field_flas() devuelve los flags asociados a un ca!&o deter!inado de la
tabla. Cada flag es devuelto co!o una &alabra. Los flags est%n se&arados &or un es&acio. La
unci"n e%plode() &er!ite dividir los no!bres de los flags devueltos. La versi"n de MySQL
usada en el curso so&orta los siguientes lags* OnotMnullO# O&ri!aryMBeyO# OuniqueMBeyO#
O!ulti&leMBeyO# OblobO# OunsignedO# O$eroillO# ObinaryO# Oenu!O# OautoMincre!entO# Oti!esta!&O.
La unci"n mysql_field_len() devuelve la longitud del ca!&o es&eciicado de la tabla.
La unci"n mysql_field_name() devuelve el no!bre del ca!&o es&eciicado de la tabla.
La unci"n mysql_field_table() devuelve el no!bre de la tabla donde a&arece el ca!&o
es&eciicado.
La unci"n mysql_field_type() devuelve el ti&o del ca!&o es&eciicado de la tabla.
La unci"n mysql_fetch_lenths() devuelve en un array la longitud de todos los ca!&os de la
tabla sobre la que se 'a e+ecutado una sentencia SQL. 21trae el resultado de la ,lti!a ila
devuelta &or mysql_"etc_row()# mysql_"etc_array() y mysql_"etc_ob!ect().
Su sinta1is es )sta*
mysql_fetch_lenths(identi"icador de la consulta)
Con las e1&licaciones dadas cree!os que los alu!nos y alu!nas &ueden utili$ar correcta y
13 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
eica$!ente las unciones abordadas y servirse del Manual de PHP &ara obtener la inor!aci"n
que &recisen sobre las !is!as.
Por otra &arte# en el Ejemplo 2 de esta Unidad &uede estudiarse el c"digo donde se a&lican
las &rinci&ales unciones de este ti&o y se reali$an abundantes consultas SQL.
Otras +unciones ,ue muestran in+ormaciones sobre las bases de datos
PHP incor&ora en la AP0 de MySQL algunas unciones !%s que &er!iten obtener inor!aci"n
sobre las bases de datos y sus tablas. Son las siguientes*
La unci"n mysql_list_"ields() &er!ite obtener los ca!&os de una tabla de una base de
datos. 6iene la siguiente sinta1is*
mysql_list_fields(base de datos, tabla [,identi"icador de cone%i*n])
Por e+e!&lo# la instrucci"n
mysql_list_"ields("biblioteca","usuarios",$id_cone%ion)#
devuelve un &untero 3n,!ero entero &ositivo4 que &uede ser usado des&u)s co!o argu!ento
de las unciones mysql_"ield_len()# mysql_"ield_name() y mysql_"ield_type() &ara conocer
la longitud# el no!bre y el ti&o# res&ectiva!ente# de los ca!&os de la tabla OusuariosO de la
base de datos ;biblioteca<. Si se &roduce un error# esta unci"n devuelve el valor :.
2n el Ejemplo 3 'e!os utili$ado as( la unci"n mysql_list_"ields() co!bin%ndola con las
unciones mysql_num_"ields()# mysql_"ield_len()# mysql_"ield_name() y
mysql_"ield_type().
$campos_tabla&mysql_list_"ields("biblioteca", "usuarios",$id_cone%ion)#
$numero_campos&mysql_num_"ields($campos_tabla)#
"or ($i&H#$i,$numero_campos#$iOO)
L
$nombre_campo&mysql_"ield_name($campos_tabla,$i)#
$tipo_campo&mysql_"ield_type($campos_tabla,$i)#
$longi_campo&mysql_"ield_len($campos_tabla,$i)#
print (",>.)ombre:,/>.$nombre_campo ,>.<ipo:,/>.
$tipo_campo ,>.@ongitud: ,/>.$longi_campo ,0.")#
M
La unci"n mysql_list_dbs() &er!ite obtener la lista de las bases de datos dis&onibles en el
servidor MySQL. 6iene la siguiente sinta1is*
mysql_list_dbs([identi"icador de cone%i*n])
Por e+e!&lo# la instrucci"n
mysql_list_dbs($id_cone%ion)#
devuelve un &untero 3n,!ero entero &ositivo4 que &uede ser usado des&u)s co!o argu!ento
de la unci"n mysql_tablename() &ara !ostrar el resultado.
14 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
2n el Ejemplo 3 'e!os utili$ado as( la unci"n mysql_list_dbs() co!bin%ndola con la
unci"n mysql_tablename().
$id_bases&mysql_list_dbs($id_cone%ion)#
$no_bases&mysql_num_rows($id_bases)#
"or ($i&H#$i,$no_bases#$iOO)
L
$nombre_base&mysql_tablename($id_bases,$i)#
print (",>.)ombre:,/>.$nombre_base,0.")#
M
Para !ostrar las tablas que contiene una base de datos debe!os escribir la ,uery
directa!ente una ve$ seleccionada la base de datos# &ode!os escribir
mysql_query(7?1DS <;>@:?7, $id_cone%ion)#
Co!o 'e!os indicado# en el Ejemplo 3 de esta Unidad a&arece el c"digo co!&leto de este
script# en el que se utili$an las unciones e1&licadas.
Cmo utilizar ventanas, botones y tablas
2n los e+e!&los anteriores 'e!os orecido la inor!aci"n de las bases de datos ;a &elo<# es
decir# !ostrando sus datos tal cual. 2n este caso nuestra intenci"n 'a sido que los alu!nos y
alu!nas asi!ilen bien las unciones e1&licadas y su sinta1is. Por ello# no nos 'e!os
&reocu&ado de!asiado de la &resentaci"n en la &antalla de su inor!aci"n.
Pero# 'abitual!ente# se utili$an etiquetas H6ML &ara or!atear la salida de la inor!aci"n#
seleccionar alg,n dato o introducirlo desde la &antalla de nuestro navegador usando
or!ularios. 2sto se consigue rellenando etiquetas* ventanas des&legables 3Select4 y botones
3!nput4 con los datos de uno o de varios ca!&os de una tabla de datos. Ade!%s# la inor!aci"n
&uede 'acerse a&arecer dentro de las celdas de alguna tabla 31able4# de or!a que los
registros y ca!&os se incluyan en el interior de )stas.
Pea!os algunos casos &r%cticos que 'e!os incluido en el Ejemplo 4. 2ste e+ercicio es
bastante co!&le+o. Por ello# si encuentras diicultad en co!&render el c"digo de algunas
o&ciones# ab"rdalo en su totalidad cuando acabes el estudio co!&leto de esta Unidad.
<?
require("../uni7_var.php");
/* Recuperamos las variables globales de la conexin.*/
/********** Funciones auxiliares de la pgina *******/
function cabecera()
{
header("Cache-Control:no-cache");
header("Pragmal: no-cache");
echo "<HTML><HEAD><TITLE>Curso PHP 5 - Unidad 7 - Ejemplo
4</TITLE></HEAD><BODY>";
$acciones=array("Nuevo","Buscar","Mostrar_todos");
echo "<CENTER><H1>Usuarios</H1>";
for ($i=0;$i<count($acciones);$i++)
echo "<A
HREF=".$_SERVER["PHP_SELF"]."?op=$acciones[$i]>$acciones[$i]||</A>";
echo "</CENTER><P>";
}
function pie()
15 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
{
echo "</BODY></HTML>";
}
function formulario_datos($registro, $dni,$nombre,$apellidos,
$domicilio,$localidad,$provincia,$telefono,$tipo
)
{
echo "
<FORM ACTION=".$_SERVER["PHP_SELF"]."?op=$tipo METHOD=POST>
<CENTER>
<TABLE>
<TR>
<TD>DNI</TD>
<TD><INPUT NAME=dni VALUE=\"$dni\" size=9></TD>
</TR><TR>
<TD>Nombre</TD>
<TD><INPUT NAME=nombre VALUE=\"$nombre\" size=10></TD>
</TR><TR>
<TD>Apellidos</TD>
<TD><INPUT NAME=apellidos VALUE=\"$apellidos\"size=25></TD>
</TR><TR>
<TD>Direccin</TD>
<TD><INPUT NAME=domicilio VALUE=\"$domicilio\" size=35></TD>
</TR><TR>
<TD>Localidad</TD>
<TD><INPUT NAME=localidad VALUE=\"$localidad\" size=20></TD>
</TR><TR>
<TD>Provincia</TD>
<TD><INPUT NAME=provincia VALUE=\"$provincia\" size=20></TD>
</TR><TR>
<TD>Telfono</TD>
<TD><INPUT NAME=telefono VALUE=\"$telefono\" size=20></TD>
</TR>
</TABLE>
<INPUT TYPE=HIDDEN NAME=registro VALUE=$registro>
<INPUT TYPE=SUBMIT VALUE=Aceptar></CENTER>
</FORM><P>";
}
function formulario_busqueda()
{
$campos=array( array("dni","DNI"),
array("nombre","Nombre"),
array("apellidos","Apellidos"),
array("domicilio","Direccin"),
array("localidad","Localidad"),
array("provincia","Provincia"),
array("telefono","Telfono"));

for ($i=0;$i<count($campos);$i++)
echo "<FORM ACTION=".$_SERVER["PHP_SELF"]."?op=Buscar
METHOD=POST>
<INPUT TYPE=hidden NAME='campo_busqueda'
VALUE=".$campos[$i][0].">
<TABLE>
<TR>
<TD width=90>".$campos[$i][1]."</TD>
<TD><INPUT NAME=buscar_txt></TD>
<TD><INPUT TYPE=SUBMIT NAME=boton VALUE=\"Buscar
por '".$campos[$i][0]."'\"></TD>
</TR></TABLE></FORM>";
16 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
}

function listado($los_datos)
{
$filas=mysql_num_rows($los_datos);
echo "<TABLE BORDER=1>";
echo "<TR><TD>Registro</TD><TD>DNI</TD>
<TD>Nombre</TD><TD>Apellidos</TD>
<TD>Direccin</TD><TD>Localidad</TD><TD>Provincia</TD>
<TD>Telfono</TD><TD colspan=2>Operacin</TD>
</TR>";
for ($i=0;$i<$filas;$i++)
{
list($registro,$dni,$nombre,$apellidos,$domicilio,$localidad,
$provincia,$telefono)=mysql_fetch_array($los_datos);
echo "<TR>
<TD>$registro</TD><TD>$dni</TD>
<TD>$nombre</TD><TD>$apellidos</TD>
<TD>$domicilio</TD><TD>$localidad</TD>
<TD>$provincia</TD><TD>$telefono</TD>
<TD><A
HREF=".$_SERVER["PHP_SELF"]."?op=editar&registro=$registro>
Editar</A></TD>
<TD><A
HREF=".$_SERVER["PHP_SELF"]."?op=borrar&registro=$registro>
Borrar</A></TD>
</TR>";
}
echo "</TABLE><P>";
}

/******* END Funciones auxiliares de la pgina *******/
//Aqu empieza la funcionalidad de la pgina
cabecera();
$id_conexion =@mysql_pconnect($DBHost, $DBUser, $DBPass) or
die("<CENTER><H3>No se ha podido establecer la conexin.<P>
Compruebe si est activado el servidor de bases de
datos MySQL.</H3></CENTER>");
/* Intentamos establecer una conexin persistente con el servidor.*/

if (!mysql_select_db("biblioteca"))
printf("<CENTER><H3>No se ha podido seleccionar la base de
datos \"biblioteca\": <P>%s",'Error n '.
mysql_errno().'.-'.mysql_error());

/* Intentamos seleccionar la base de datos "biblioteca". Si no
se consigue, se informa de ello y se indica cul es el
motivo del fallo con el nmero y el mensaje de error.*/
if (isset($_GET["op"])) {
if ($_GET["op"]=="Nuevo")
{
formulario_datos("","","","","","","","","inserta");
}
else
if ($_GET["op"]=="inserta")
{ $bien = ( (!empty($_POST["dni"])) && (!empty($_POST["nombre"])) &&
(!empty($_POST["apellidos"])) &&
(!empty($_POST["domicilio"])) &&
17 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
(!empty($_POST["localidad"])) &&
(!empty($_POST["provincia"])) &&
(!empty($_POST["telefono"])) );
if ($bien)
{
$consulta="insert into usuarios values
('".$_POST["nombre"]."','".$_POST["apellidos"]."','".
$_POST["dni"]."','1962-09-10',
'".$_POST["domicilio"]."','".$_POST["localidad"]."',
'".$_POST["provincia"]."',2000.000,
'".$_POST["telefono"]."','','',NULL)";
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la
consulta.<P>Compruebe si la sintaxis de
la misma es correcta.<P></H3></CENTER>");
echo "<CENTER><H3>El registro ha sido dado de alta
correctamente</H3></CENTER>";
}
else
formulario_datos(0,$_POST["dni"],$_POST["nombre"],$_POST["apelli
dos"],
$_POST["domicilio"],$_POST["localidad"],
$_POST["provincia"],$_POST["telefono"],"inser
ta");
}//end if inserta
else
if ($_GET["op"]=="Mostrar_todos")
{
$consulta="select registro,dni,nombre,apellidos,
domicilio,localidad,provincia,telefono
from usuarios order by registro";
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la consulta.
<P>Revise la sintaxis de la orden.</H3></CENTER>");
listado($datos);

}//end Mostrar_todos
else
if ($_GET["op"]=="editar")
{
$consulta="select registro,dni,nombre,apellidos,
domicilio,localidad,provincia,telefono
from usuarios where registro=".$_GET["registro"];
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la consulta.
<P>Revise la sintaxis de la orden.</H3></CENTER>");
list($registro,$dni,$nombre,$apellidos,$domicilio,$localidad,
$provincia,$telefono)=mysql_fetch_array($datos);

formulario_datos($registro,$dni,$nombre,$apellidos,$domicilio,
$localidad,$provincia,$telefono,"actualiza");
}//end editar
else
if ($_GET["op"]=="actualiza")
{
$consulta ="update usuarios set dni='".$_POST["dni"]."',
nombre='".$_POST["nombre"]."',
apellidos='".$_POST["apellidos"]."',
domicilio='".$_POST["domicilio"]."',
localidad='".$_POST["localidad"]."',
provincia='".$_POST["provincia"]."',
telefono='".$_POST["telefono"]."'
where registro=".$_POST["registro"];
18 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la consulta.
<P>Revise la sintaxis de la orden.</H3></CENTER>");
echo "<CENTER><H3>El registro ha sido modificado
correctamente</H3></CENTER>";
} //end actualiza
else
if ($_GET["op"]=="borrar")
{
$consulta="select registro,dni,nombre,apellidos,
domicilio,localidad,provincia,telefono
from usuarios where registro=".$_GET["registro"];
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la consulta.<P>
Revise la sintaxis de la orden.</H3></CENTER>");
list($registro,$dni,$nombre,$apellidos,$domicilio,$localidad,
$provincia,$telefono)=mysql_fetch_array($datos);
echo "Registro $registro<BR>DNI $dni<BR>nombre $nombre<BR>
Apellidos $apellidos<BR>Domicilio $domicilio<BR>
Localidad $localidad<BR>Provincia $provincia<BR>
Telfono $telefono.";
$consulta="delete from usuarios where
registro=".$_GET["registro"];
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la consulta.<P>
Revise la sintaxis de la orden.</H3></CENTER>");
echo "<CENTER><H3>El registro ha sido borrado
correctamente</H3></CENTER>";
}//end borrar
else
if ($_GET["op"]=="Buscar")
{
if (!isset($_POST["campo_busqueda"])) formulario_busqueda();
else
{
$consulta="select registro,dni,nombre,apellidos,domicilio,
localidad,provincia,telefono from usuarios
where ".$_POST["campo_busqueda"].
" like '%".$_POST["buscar_txt"]."%'";
$datos=@mysql_query($consulta,$id_conexion) or
die("<CENTER><H3>No se ha podido ejecutar la
consulta.<P>Revise la sintaxis de la orden.
</H3></CENTER>");
listado($datos);
}
}//end if buscar
}//end if isset($_GET["op"])
pie();
?>
19 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
- !odi"icar la in"or#aci$n de una base de datos
PHP &er!ite ta!bi)n !odiicar la inor!aci"n que 'aya en una base de datos actuali$ando los
registros de sus tablas# introduciendo nuevos registros o eli!inando algunos de los que tengan
)stas. Las o&eraciones !encionadas se llevan a cabo ta!bi)n !ediante consultas en las que
se usan sentencias SQL.
2n este a&artado va!os estudiar las unciones que &er!iten reali$ar consultas que !odiican
la inor!aci"n de las bases de datos. Gos servire!os# ta!bi)n en esta ocasi"n# de la base de
datos ;biblioteca<# la !is!a que 'e!os consultado en el a&artado anterior
!nsertar, actualizar y borrar re-istros de una tabla
La unci"n mysql_insert_id() devuelve un identiicador del registro insertado cuando en el
!is!o 'ay un ca!&o de ti&o AU6.M0GCI2M2G625# cada ve$ que se e+ecuta una sentencia
insert. Su sinta1is es la siguiente*
mysql_insert_id([identi"icador de cone%i*n])
Lo !%s reco!endable es crear una variable y asignar a )sta el valor devuelto &or la consulta#
en la que necesaria!ente debe a&arecer la sentencia insert.
Por e+e!&lo# si necesita!os conocer el identiicador del registro insertado# debe!os enviar al
servidor una consulta de la base de datos ;biblioteca< en la que se aNada un registro a los que
'aya en la tabla ;libros<. Puede se as(*
$consulta&"insert into libros values(7>rancet, >ob7,
7Gicroso"t ?T@ ?erver U+27,70rentice 1all7,
73VVW7,X4Y,WH+W2,7)7,7E)N7,7Y4CVYXXHCVVCV7,
7>uen manual7,7;lgo antiguo7,H)"#
$datos& (mysql_query($consulta,$id_cone%ion) or
die(",8:)<:9.,15.)o se a podido e!ecutar
la consulta+,0. 8ompruebe si la sinta%is
de la misma es correcta+,0.,/15.,/8:)<:9.")#
A continuaci"n# ya &ode!os asignar a una variable el identiicador del registro insertado# que
ser% el !is!o n,!ero que el del ca!&o ;registro<# que es el ca!&o de la tabla que tiene el ti&o
AU6.M0GCI2M2G625# de esta or!a*
$id_insertar&mysql_insert_id($id_cone%ion)#
Una ve$ obtenido )ste# ya &ode!os utili$arlo en una nueva consulta# &or e+e!&lo &ara ver sus
datos. Se 'ace as(*
$consulta& "select Z "rom libros were registro&$id_insertar"#
Si no se es&eciica el identiicador de cone1i"n# que es o&cional# se asu!e co!o tal el ,lti!o
identiicador de este ti&o creado. Si no 'ay ninguno# de or!a auto!%tica la unci"n intenta
establecer un enlace co!o si se utili$ara la unci"n mysql_connect() sin argu!entos# y lo
utili$a.
20 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
La unci"n mysql_affected_rows() devuelve el n,!ero de ilas 3registros4 que se 'an visto
aectadas al e+ecutarse una sentencia insert# update o delete.
Su sinta1is es la siguiente*
mysql_affected_rows[identi"icador de cone%i*n])
Lo !%s reco!endable es crear una variable y asignar a )sta el valor devuelto &or la consulta#
en la que necesaria!ente debe a&arecer una sentencia insert# update o delete.
Si la ,lti!a sentencia e+ecutada ue delete sin cl%usula QH2I2 y todos los registros quedaron
borrados de la tabla# esta unci"n devuelve ?.
2sta unci"n no es eectiva &ara las sentencias S2L2C6# sino s"lo &ara las sentencias que
!odiican registros.
Las o&eraciones de actuali$ar y borrar registros se llevan a cabo igual!ente !ediante
consultas SQL en las que se incluyen las sentencias update y delete# res&ectiva!ente# tal
co!o se 'an e1&licado en la Unidad anterior.
2n el Ejemplo 5 de esta Unidad a&arece el c"digo co!&leto de estas o&eraciones 3insertar#
actuali$ar y borrar registros de una tabla4. 2n el !is!o &uede verse c"!o 'e!os utili$ado las
unciones e1&licadas en este a&artado.
2n los .jercicios de esta Unidad 'e!os &rocurado incluir sencillas a&licaciones de
!anteni!iento de tablas# de or!a que en ellas se incor&oren y utilicen las &rinci&ales
unciones abordadas en este a&artado y en el anterior. 2studiando su c"digo# leyendo los
co!entarios y tratando de re&roducir &rogra!as si!ilares# el alu!no o alu!na del curso &uede
asi!ilar adecuada!ente los contenidos de esta Unidad.
6a!bi)n el !odelo de &royecto +inal se sirve# de una or!a integrada# de estas unciones con
las que PHP nos &er!ite conectarnos a un servidor# acceder a una base de datos y tratar
correcta!ente la inor!aci"n de las tablas. -a desde este !o!ento# cada alu!no o alu!na
debe estudiar este &royecto e ir elaborando uno &ro&io# que debe re!itir al tutor o tutora antes
de &resentarse a la &rueba inal &resencial.
% - &nstalaci$n y uso de !yO'(C
!nstalacin y con+i-uracin
2n este a&artado se e1&lica el &roceso de instalaci"n del controlador 3driver4 My.5/C >= bits
&ara QindoDs. 2sto nos &er!itir% acceder desde un cliente QindoDs que dis&onga de MS
Access a un servidor MySQL.
Su&one!os que el gestor de datos MS Access est% ya instalado en el ordenador donde se
reali$a el curso. Si no lo estuviera# ser(a i!&osible llevar a cabo los &asos e1&licados a
continuaci"n.
2n el C5EI.M curso 'e!os incluido el driver My.5/C !%s reciente &ara QindoDs. Si el
alu!no o alu!na &recisa el controlador de versiones su&eriores de este entorno o quiere
dis&oner en su d(a de una versi"n !%s actuali$ada de este controlador# &uede recogerse en la
21 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
direcci"n 'tt&*AADDD.!ysql.co!A. 2l ic'ero del controlador incluido en el curso se deno!ina
GyD=>8C5+23+e%e y est% en el directorio 8:/curso0102/bin/Gy?T@4+3/GyD=>8.
Quere!os advertir que el controlador My.5/C no se instala con el curso y# &or tanto# el
alu!no no lo 'allar% ya uncionando en el ordenador donde traba+e. Si quiere conectar una
base de datos de ti&o MySQL desde MS Access# debe instalar &revia!ente el controlador tal
co!o indica!os a continuaci"n.
Para convertir nuestro MS Access en un cliente QindoDs de MySQL# en &ri!er lugar debe!os
instalar el controlador e+ecutando el ic'ero GyD=>8C5+23+e%e.
Una ve$ instalado el driver .5/C &ara MySQL# debe!os e+ercutar la utilidad Ad!inistrador de
.r(genes de 5atos .5/C que se encuentra en el Panel de Control 3si dis&ones de QindoDs
=??? " RP estar% dentro de la la car&eta Herra!ientas Ad!inistrativas4. Se !ostrar% la
siguiente ventana

A continuaci"n# dentro de la &estaNa 5GS de usuario # &ulsa!os sobre el bot"n Agregar# &ara
aNadir un nuevo origen de datos y selecciona!os el driver MySQL ODB !"#$ Driver
corres&ondiente a la base de datos MySQL y &ulsa!os el bot"n Finali$ar a&areciendo la
siguiente ventana
22 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos

Seguida!ente# escribi!os los valores siguientes# su&oniendo# &or e+e!&lo# que va!os a
conectarnos con la base de datos ;biblioteca< del servidor MySQL y &ulsa!os el bot"n .S*
Data Source /ame* no!bre que dare!os a la cone1i"n. 2n nuestro e+e!&lo# &one!os
CursoPHP5.
Server* es el no!bre o direcci"n 0P del servidor al que nos quere!os conectar. 2n nuestro
e+e!&lo# &one!os local'ost.
*ser* no!bre de usuario. 2n nuestro e+e!&lo# &one!os root.
&ass3ord* clave del usuario. 2n nuestro e+e!&lo# lo de+a!os en blanco.
Database* no!bre de la base de datos MySQL a la que quere!os conectarnos. 2n nuestro
e+e!&lo# &one!os biblioteca.
Conexin remota a MyS%L desde MS Access
Pea!os c"!o &ode!os conectarnos a una base de datos MySQL que est% en un servidor
re!oto usando un cliente QindoDs a trav)s de MS Access. Para &oder 'acerlo# es &reciso
tener instalado en nuestro cliente QindoDs el driver My.5/C# as( co!o 'aber arrancado el
servidor MySQL.
5ebe!os seguir estos &asos*
:. Arrancar MS Access.
=. 2n el !en, Arc'ivo selecciona!os Abrir.
>. 2n la ventana de di%logo Abrir# a&artado 6i&o de arc'ivo# selecciona!os .5/C
23 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
5atabases34.
C. Para seleccionar el origen de los datos al que nos va!os a conectar# en la &estaNa .rigen
de datos de equi&o escoge!os en la colu!na Go!bre del origen de datos el no!bre que
&usi!os en la o&ci"n QindoDs 5GS na!e# que en nuestro e+e!&lo es CursoPHP5# que
crea!os en la instalaci"n de My.5/C o desde el Panel de control de QindoDs.
5. Una ve$ que 'e!os reali$ado la cone1i"n a nuestra base de datos re!ota MySQL# en la
ventana Pincular tablas# debe!os escoger las tablas que quere!os vincular. Si las tablas
vinculadas no tienen una clave &ri!aria# MS Access nos &edir% que eli+a!os una.
Quere!os recordar que &ara &oder !odiicar las tablas desde MS Access 'ay que tener los
&er!isos &ertinentes co!o usuarios de MySQL.
.xportar un tabla de tipo MS Access a otra de tipo MyS%L
A'ora va!os a ver c"!o &ode!os e1&ortar una tabla de una base de datos MS Access a otra
base de datos re!ota MySQL !ediante .5/C. Para &oder 'acerlo es &reciso tener instalado
en nuestro cliente QindoDs el driver My.5/C# as( co!o 'aber arrancado el servidor MySQL.
5ebe!os seguir estos &asos*
:. Arranca!os MS Access y abri!os una tabla de una base de datos.
=. 2n el !en, Arc'ivo selecciona!os 21&ortar.
>. 2n la ventana de di%logo# a&artado Tuardar co!o ti&o# selecciona!os .5/C 5atabases34.
C. 2n la ventana que a&arece se indica el no!bre que va tener la tabla e1&ortada en la base
de datos MySQL.
5. Para seleccionar el destino de los datos nos conecta!os y# en la &estaNa .rigen de datos
de equi&o# escoge!os en la colu!na Go!bre del origen de datos el no!bre que &usi!os en la
o&ci"n QindoDs 5GS na!e# que en nuestro e+e!&lo anterior era CursoPHP5.
Una ve$ que ya tene!os la tabla original en or!ato MySQL# segura!ente necesitare!os
desde el servidor MySQL# con la a&licaci"n Cliente MySQL# arreglar el no!bre o el ti&o de
alg,n ca!&o# los (ndices# claves# etc)tera.
!mportar una tabla de tipo MyS%L a otra de MS Access
A'ora va!os a ver c"!o desde MS Access &ode!os i!&ortar una tabla de ti&o MySQL
!ediante .5/C. Para &oder 'acerlo es &reciso tener instalado en nuestro cliente QindoDs el
driver My.5/C# as( co!o 'aber arrancado el servidor MySQL.
5ebe!os seguir estos &asos*
:. Arranca!os MS Access y abri!os la base de datos donde deba incor&orarse la tabla
MySQL.
=. 2n el !en, Arc'ivo selecciona!os .btener datos e1ternos# o&ci"n 0!&ortar.
24 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
>. 2n la ventana de di%logo 0!&ortar# a&artado 6i&o de arc'ivo# selecciona!os .5/C
5ata/ases34.
C. Para seleccionar el origen de los datos MySQL# en la &estaNa .rigen de datos de equi&o#
escoge!os en la colu!na Go!bre del origen de datos el no!bre que &usi!os en la o&ci"n
QindoDs 5GS na!e# que en nuestro e+e!&lo anterior era CursoPHP5.
5. Una ve$ que 'e!os reali$ado la cone1i"n a nuestra base de datos re!ota MySQL# en la
ventana 0!&ortar tablas# debe!os escoger las tablas que quere!os i!&ortar.
Conviene tener en cuenta que en la o&eraci"n vincular s"lo se da acceso a las tablas MySQL
desde MS Access# &ara &oder tratar su inor!aci"n a trav)s del controlador .5/C. 2n ca!bio#
en las o&eraciones importar y exportar# las tablas aectadas ca!bian de or!ato de ti&o de
bases de datos# convirti)ndose en bases de datos de ti&o MySQL# en el &ri!er caso# o de MS
Access en el segundo.
) - Resu#en
4ay ,ue saber al +inal de esta unidad
!onectarse al servidor que contiene el gestor de
bases de datos Gy?T@+
!rear bases de datos, conectarse a ellas y
destruirlas, con sus tablas e in"ormaci*n+
"tili#ar las funciones que controlan los posibles
errores al reali[ar las operaciones anteriores+
!onsultar una base de datos utili[ando queries en
las que intervengan las principales "unciones de 010
para acceder a bases de datos de tipo Gy?T@+
$nsertar, actuali#ar y eliminar registros de una
tabla+
"sar formularios y celdas de tablas para mostrar
in"ormaci*n de una tabla, preguntarla o seleccionar
alguno de sus campos+
$nstalar el controlador %y&'(! para poder conectar
bases de datos de tipo G? ;ccess con las de tipo
Gy?T@+
$mportar o exportar tablas entre ambos gestores de
bases de datos+
%antener las tablas de una base de datos reali[ando
a trav\s de "unciones, tanto estRndar de 010 para
Gy?T@ como de usuario, las principales operaciones
25 de 26
Curso de PHP 5 Unidad 7 Acceder con PHP a las bases de datos
de este tipo: altas, ba!as, consultas, bKsquedas,
actuali[aciones, etc\tera+
$%N&'( ) *N+*% $%* ,--.
26 de 26
Curso de PHP 5 Unidad 8 Utilidades prcticas
Teora: Utilidades prcticas
1 - Objetivos
Objetivos
Saber aplicar las principales funciones matemticas de PHP a las
diferentes situaciones en que deban emplearse: trigonomtricas! para
"allar redondeos! m#imos $ m%nimos! para calcular e#ponentes $
logaritmos! as% como para generar n&meros aleatorios'
Aprender a detectar y corregir los principales errores de un
script! utili(ando efica(mente las funciones de PHP que permiten
conocer su nivel $ enviar a un dispositivo un mensaje de error con el
te#to que sea adecuado a cada situaci)n'
*aber crear fic"eros comprimidos! abrirlos! cerrarlos! leer su
contenido, total o en parte, as como mover el puntero de lectura-
escritura por sus diferentes bytes.
+prender a crear documentos P,- sirvindose de las principales
funciones de PHP para hacerlo.
2 - Funciones matemticas
+ lo largo del curso "emos estudiado muc"as funciones! si bien no "a sido nuestra intenci)n
abarcar e#"austivamente todas las funciones de PHP' .n este apartado vamos a estudiar las
funciones matemticas de que dispone PHP! al menos de una forma breve! para que as% se
cono(ca que e#isten $ se puedan utili(ar cuando sea necesario'
.l /anual de PHP aborda estas funciones en su apartado !!. "unciones matemticas'
Puede consultarse esta informaci)n accediendo a este documento a travs de la a$uda del
.ditor dev0PHP'
"unciones trigonomtricas
Funcin Devuelve Ejemplo de su sintaxis
acos(float)
El arcocoseno del
argumento en radianes
acos(120.678)
asin(float)
El arcoseno del argumento
en radianes
asin(120.678)
atan(float) El arcotangente del atan(120.678)
1 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
argumento en radianes
cos(float)
El coseno del argumento
en radianes
cos(120.678)
sin(float)
El seno del argumento en
radianes
sin(120.678)
tan(float)
El tangente del argumento
en radianes
tan(120.678)
#edondeos, m$imos y mnimos
Funcin Devuelve Ejemplo de su sintaxis
a!s(n"me#o)
El valor absoluto (sin
signo) de un nmero
a!s($120)
ceil(float)
El valor entero superior
de un nmero decimal
ceil(120.678)
floo#(float)
El valor entero inferior
de un nmero decimal
floo#(120.678)
max(n"me#os)
El valor mayor de los
nmeros dados
max(120%2&0) Para
tipos y argumentos ver
Manual.
min(n"me#os)
El valor menor de los
nmeros dados
min(120%2&0) Para
tipos y argumentos ver
Manual.
#ound(float)
El valor de un decimal
redondeado en la parte
entera segn lo habitual
#ound(120.678)
#ound(120.&78)
%$ponentes y logaritmos
Funcin Devuelve
Ejemplo de su
sintaxis
exp(n"me#o)
El valor de elevar e (base
del logaritmo natural=
2.7!2!!2!"#$%") al
argumento n"me#o
exp(')
lo((n"me#o)
El logaritmo del argumento
n"me#o
lo((120.678)
lo(10(n"me#o) El logaritmo en base % del )o(10(120.678)
2 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
argumento n"me#o
po*(num1%num2)
El valor de elevar num1 a
num2
po*(+%')
s,#t(n"me#o)
El valor de la ra&' cuadrada
de n"me#o
s,#t(2+)
&eneraci'n de n(meros aleatorios
Funcin Devuelve Ejemplo de su sintaxis
(et#andmax()
El mayor valor
aleatorio
generable
(et#andmax()
mt-#and()
(n valor aleatorio
me)orado
mt-#and()
mt-#and(100%+00)
mt-s#and()
*ntroduce la
semilla del
generador de
nmeros aleatorios
me)orado
mt-s#and((dou!le)
mic#otime()
.100000)
mt-(et#andmax()
El mayor valor
aleatorio
generable me)orado
mt-(et#andmax()
#and()
(n valor aleatorio
#and()
#and(+00%1000)
s#and()
*ntroduce la
semilla del
generador de
nmeros aleatorios
s#and((dou!le)
mic#otime()
.1000000)
+l generar n&meros aleatorios! es conveniente seguir estos pasos:
1' 2enerar la semilla del n&mero aleatorio! es decir! iniciali(ar la b&squeda del n&mero
aleatorio a partir de un valor' Para crear esta semilla! se usan las funciones srand() $
mt+srand(). .stas funciones llevan como argumento una e#presi)n que iniciali(a el buscador
de n&meros aleatorios' 3as funciones getrandma,() $ mt+getrandma,() devuelven el n&mero
m#imo posible en cada caso! que es 45'676 $ 5'186'884'786! respectivamente'
3 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
5' Crear el n&mero aleatorio' .sto se "ace con las funciones rand() $ mt+rand()' *i no se
indica ning&n argumento! el n&mero generado estar comprendido entre 9 $ getrandma,() o
mt+getrandma,()! respectivamente' *i se especifican argumentos! "an de ponerse los dos
l%mites! inferior $ superior! entre los cuales debe buscarse el n&mero aleatorio'
"ormatear n(meros
3a funci)n number+format() permite dar formato a un n&mero en grupo de miles' :iene la
siguiente sinta#is;
number+format(nmero-n. de decimales-separador de decimales-separador de miles)
*i s)lo se pone el primer parmetro! nmero se muestra sin decimales $ con una coma <,= entre
cada grupo de miles'
*i se especifican dos parmetros! nmero se muestra con un punto <.= como separador de los
decimales $ una coma <,= entre cada grupo de miles'
*i se especifican los cuatro parmetros! nmero se muestra con el carcter que se indique en el
tercer parmetro en lugar de con un punto <.= como separador de los decimales $ con el
carcter que se indique en el cuarto parmetro en lugar de con una coma <,= entre cada grupo
de miles'
.n el %)emplo *! dentro de +(meros aleatorios! se usa esta funci)n aplicndola a un n&mero
entero' Puede estudiarse su sinta#is en el mismo' ,e la misma forma! se puede aplicar a un
n&mero decimal'
.n el Ejemplo 1 de esta Unidad "emos usado algunas funciones matemticas! donde puede
verse su sinta#is $ los efectos que producen'
3 - Tratamiento de errores
+l escribir el c)digo de los programas es fcil cometer bastantes errores! sobre todo cuando se
est aprendiendo $ no se conoce con e#actitud la sinta#is de los comandos' .n este apartado
vamos a enumerar los errores ms frecuentes para aprender a solucionar los problemas que se
producen al ejecutar el c)digo de los scripts PHP' +dems! estudiaremos algunas funciones de
PHP que nos a$udarn a detectar $ a tratar los posibles errores de nuestros programas'
.n la Unidad 6 $a "emos usado las funciones mys/l+errno()! que devuelve el n&mero de error
asignado por /$*>3! $ la funci)n mys/l+error()! que devuelve el mensaje! en ingls!
correspondiente al error que se "a producido'
*i utili(amos acertadamente las funciones de que dispone PHP para manejar $ controlar los
errores! se pueden conocer $ detectar! antes de solucionarlos! posibles problemas en el c)digo
PHP'
.n el fic"ero de configuraci)n php.ini se fijan! entre otras muc"as cosas! las condiciones de
comportamiento de los mensajes de error que se generen al ejecutarse un fic"ero script PHP'
Concretamente! en la secci)n Error handling and logging se contemplan los siguientes
valores:
4 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
display+errors=0n' *e activa el env%o de los mensajes de error a la salida estndar! por
defecto el monitor del cliente'
error+reporting=E+122' .n el te#to de los mensajes de error se muestran todos los
errores! avisos e informaci)n disponible sobre ellos'
log+errors=0ff' *i se activara con el valor 0n entonces el env%o de los mensajes de
error se "ar%a al fic"ero al fic"ero errores+php#.t,t' .ste fic"ero se ir%a generando en el
mismo directorio donde est el script que se interpreta a medida que se producen los
errores' Como es un fic"ero de te#to! podemos abrirlo $ ver su contenido! que puede
a$udarnos muc"o a solucionar el problema' ?a que puede llegar a ser mu$ grande!
conviene eliminarlo de ve( en cuando! para que se inicie de nuevo ocupando menos $
siendo ms fcil la locali(aci)n de los errores que se citan'
.n el propio fic"ero php.ini se e#plican! en ingls! los posibles valores de configuraci)n de los
errores! as% como lo que significa cada uno' .l alumno! al reali(ar el curso en al +ula /entor!
no debe modificar este fic"ero en ninguna de sus l%neas! $a que en el mismo todo est
configurado para que las actividades $ aplicaciones del curso funcionen correctamente'
.n el /anual de PHP se aborda este tema en los apartados ,aptulo --.!. "unciones de
&esti'n de %rrores y #egistros' Puede consultarse esta informaci)n accediendo al /anual
desde de la a$uda del .ditor dev0PHP' .n este apartado nosotros s)lo vamos a referirnos a los
aspectos ms importantes $ s)lo abordaremos las funciones bsicas'
.rrores ms frecuentes
+ continuaci)n! citamos los errores que se repiten con ma$or frecuencia! seg&n nuestra
e#periencia:
1' "altan las comillas'
:anto en PHP como en H:/3 las comillas deben ir emparejadas' *i falta alguna! la de apertura
o la de cierre! en lugar de interpretarse el c)digo! se produce un error' .n el .ditor dev0PHP!
que "emos creado e#presamente para este curso! se pone de otro color el te#to pr)#imo a este
error! de forma que no es dif%cil apreciar cundo falta alguna de las dos comillas'
5' ,omillas no protegidas'
Cuando dentro de una pareja de comillas necesitamos utili(ar otras comillas o bien! dentro de
PHP! en las etiquetas H:/3 es preciso poner comillas! es imprescindible proteger las interiores
con el signo @! como "emos visto' ,e no "acerlo as%! PHP acabar%a la pareja de comillas con la
primera interior $ se producir%a un error en la interpretaci)n del resto' Por ejemplo! la
instrucci)n
echo 32e llam4 3gamberro335
se interpreta como 3e llam) ' Ha$ que proteger las comillas interiores as%:
echo 32e llam4 63gamberro6335
o bien usar en la pareja interior comillas simples as%:
5 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
echo 32e llam4 7gamberro735
.ste fallo es mu$ frecuente al incluir etiquetas H:/3 entre comillas dentro de un literal PHP
que va tambin entre comillas' Ao es correcto escribir
echo 38*9P(: 91ME=3nombre3 ;12(E=3<nombre335
Ha$ que escribir
echo 38*9P(: 91ME=63nombre63 ;12(E=63<nombre6335
/. "alta el punto y coma 012 al final de una sentencia
.s un error bastante com&n' .l colorido del .ditor dev0PHP tambin puede a$udarnos a
locali(ar d)nde falta' Como PHP interpreta que la sentencia no "a acabado! suele marcar el
error en alguna de las l%neas de c)digo siguientes'
3. "alta uno o ambos c'digos indicadores de PHP4 56 o 67
.s otro error frecuente' Ao es "abitual omitir alguno cuando en el script s)lo "a$ un indicador
de inicio del c)digo PHP $ otro de cierre' Pero! cuando se me(clan c)digo H:/3 $ PHP! s%
puede omitirse uno con facilidad' *i se omite el de apertura <BC=! no se interpreta como PHP el
c)digo que sigue $ llega al navegador del cliente tal cual! como si fuera H:/3' *i se omite el
segundo <CD=! se produce un error al tratar de interpretarse c)digo H:/3 como si fuera PHP'
8. Se omite el smbolo 9 delante de una variable
Como esta caracter%stica no es propia de otros lenguajes de programaci)n! no es infrecuente
quitar este s%mbolo que debe preceder a todos los identificadores de variables $ objetos' *i no
se pone! se producirn diferentes errores o bien el identificador ser tomado como un literal
dentro de una cadena'
:. +o aparece el smbolo 9 en la pantalla
Cuando queremos mostrar el nombre de una variable dentro de una cadena! no su valor! es
preciso anteponer el signo ; delante del mismo para proteger el s%mbolo $ convertirlo en un
carcter normal representable en la pantalla'
<. .ariable sin definir
Como en PHP no es preciso declarar las variables! a veces es dif%cil saber si la "emos creado
o no' *i no lo est! se provoca un error en la ejecuci)n del script' O bien los resultados sern
inesperados' Por eso! cuando se tiene duda! al escribir el c)digo! pueden usarse la funciones
isset()! empty() u otras'
=. a pgina resultante aparece en blanco
Cuando ocurre esto! lo ms probable es que el c)digo H:/3 incluido en el c)digo PHP sea
incorrecto' Por ejemplo! puede suceder que no se "a$a cerrado alguna etiqueta! como
B:+E3.D con BF:+E3.D! o que se intente cerrar una etiqueta que no tiene esta modalidad'
>. ,onfundir los operadores ? y ??
6 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
.s un error tambin mu$ frecuente' Cuando se quiere comparar dos e#presiones para ver si
son iguales! "a$ que utili(ar el operador de comparaci)n GG' .n cambio! para asignar el valor o
resultado de la e#presi)n derec"a a una variable que aparece a la i(quierda! "a$ que utili(ar el
operador de asignaci)n G'
*@. Amisi'n de uno de los dos elementos empare)ados
+dems de las comillas! "a$ otros componentes del lenguaje PHP que deben abrirse $
cerrarse! como las llaves BC! los parntesis 02 $ los corc"etes DE' Para detectar esta posible
omisi)n de uno de los dos elementos! generalmente el segundo <cerrar=! lo mejor es tabular
<indentar= bien el c)digo! de forma que resulte fcil e intuitivo encontrar d)nde se produce esta
ausencia' .l colorido del te#to en el .ditor dev0PHP tambin puede a$udarnos a detectar este
error'
**. %l intrprete PHP no lee el c'digo del script
.ste problema puede deberse a que +pac"e est mal configurado! que no es nuestro caso! o a
que la e#tensi)n del fic"ero en el que est arc"ivado el c)digo no es php'
*F. S'lo aparece la primera palabra al pasar un valor de un formulario
*i tenemos la instrucci)n
echo 38*9P(: 91ME=nombre dado ;12(E=<nombre35
s)lo aparece en el resultado la palabra nombre' Para que se vea nombre dado es preciso
escribir:
echo 38*9P(: 91ME=63nombre dado63 ;12(E=7<nombre735
*/. %l valor pasado a una G# llega incompleto
*e produce este error cuando en la direcci)n que pasa a la UH3 aparece alg&n espacio en
blanco o una variable que lo contiene' Por ejemplo! la referencia
echo 381 =E>=7e)e.php?nombre=<te,to7@Enlace8A1@35
puede producir un error si <te,to contiene alg&n carcter no admitido! como un espacio' Para
evitar este error "a$ que poner
echo 381 B=E>=7e)e.php?nombre=urlencode(<te,to)7@Enlace8A1@35
*3. %rrores en la funci'n checHdate02
,ebemos tener en cuenta que en sta $ en otras funciones o e#presiones que lleven una fec"a
como argumento o parte de las mismas! el orden es mesCd&aCaDo'
*8. Alguna informaci'n aparece en ingls
3os d%as de la semana o los meses pueden aparecer en ingls si no se "a especificado otra
cosa mediante la funci)n setlocale()' Puede mirarse c)mo se cambian estos valores en la
Unidad 4! Iratamiento de fechas'
7 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
*:. Al cargar una pgina nueva no pasan las variables de la anterior
+s% se comporta PHP' Para que las variables de una pgina puedan pasar a otra nueva es
necesario que las pasemos e#pl%citamente! sea como campo <incluso oculto= de un formulario!
sea como asignaci)n dentro de una UH3'
*<. +o se puede crear un fichero, escribir en l o eliminarlo
,ebemos tener en cuenta que! para poder reali(ar operaciones de escritura! es preciso tener
los permisos adecuados' Istos se consiguen a travs de la autentificaci)n al entrar en un
servidor' *i un cliente no se autentifica de forma e#presa e individual! en todo caso acceder al
servidor como nobody! que es un usuario de tipo genrico que! en el mejor de los casos! s)lo
puede ver determinada informaci)n'
*=. a variable 9JS%#.%#DKPHPJAGIHJGS%#KE aparece vaca dentro de un script
.l contenido de esta variable depende normalmente del tipo de autentificaci)n que el usuario
consiga del servidor! e#terna o mediante PHP' Cuando un usuario se identifica de manera
e#terna usando un m)dulo de +pac"e entonces es la variable <+EE=;E=F3=EM0:E+(EE=3G la que
contiene la identificaci)n! mientras que la variable <+EE=;E=F3PBP+1(:B+(EE=3G queda sin
contenido $ s)lo se rellena si se usan las funciones de PHP de autentificaci)n' Aota: ver el
.jemplo 8 de la Unidad 5'
*>. %l mensa)e del error dice4 ,all undefined o Gnsoported function
Puede ocurrir este error cuando estamos llamando a una funci)n no declarada o declarada en
otro fic"ero que no se inclu$e en el script actual' :ambin puede deberse a las opciones
incluidas al compilarse los m)dulos de PHP' .n este caso! lo mejor es mirar qu librer%as se
"an incluido en la versi)n de PHP que estamos usando $ con qu opciones e#pl%citas se "a
compilado'
"unciones de PHP para tratar errores
3a funci)n e##o#-lo(() remite un mensaje de error al dispositivo que se indique'
Ista es su sinta#is:
error+log(mensa)e-tipo de mensa)e F-destino F-direcci4n de destinoGG)
.sta funci)n env%a un mensaje de error al fic"ero de tipo log de errores del servidor web! a un
puerto :CP o a un fic"ero diferente de log' .l primer parmetro <mensa)e= contiene la cadena
con el te#to del mensaje de error' .l segundo parmetro <tipo de mensa)e= indica el lugar al
que debe dirigirse mediante uno de estos cuatro valores:
1' @ .l mensaje se env%a al registro de sistema de PHP! utili(ando el mecanismo de registro de
sistema del *istema Operativo o a un fic"ero! dependiendo del valor de la directiva de
configuraci)n error+log de php.ini'
5' * .l mensaje se env%a por correo electr)nico a la direcci)n del parmetro destino' .n tipo
de mensaje "a$ que utili(ar el cuarto parmetro <direcci4n de destino='
8 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
4' F .l mensaje se env%a al depuraci)n de PHP' .n este caso el parmetro destino especifica
el nombre de host o la direcci)n JP'
8' .l mensaje se env%a al fic"ero destino'
3a funci)n () se usa para indicar el nivel de las incidencias que deben ser registradas cuando
se producen errores en la interpretaci)n de un script'
Ista es su sinta#is'
e##o#-#epo#tin((FnivelG)
.l nivel se e#presa mediante un n&mero entero donde cada bit tiene su propio significado' +
continuaci)n aparecen algunos de los valores posibles $ su significado:
/alo#
del !it
0ipo E##o#
inte#no
Desc#ipcin de e##o#
E+E==0=
Error grave /ue impide seguir con la e)ecuci4n del
script.
2 E+H1=9*9I
1viso de error /ue no impide seguir con la e)ecuci4n del
script.
" E+P1=EE
1viso de error de sinta,is /ue impide seguir con la
e)ecuci4n del script.
! E+90:*JE
1viso de un posible error /ue no impide seguir con la
e)ecuci4n del script.
K E+J0=E+E==0=
Eimilar a E+E==0=- generado por el ncleo del PBP. (na
funci4n no debe generar este tipo de error
L2 E+J0=E+H1=9*9I
Eimilar a E+H1=9*9I- generado por el ncleo
del PBP. (na funci4n no debe generar este tipo
de error
2#K E+(EE=+E==0=
Error generado por el script. Es como un E+E==0=-
e,cepto /ue es generado desde c4digo PBP usando la
funci4n trigger+error().
2%"7 E+122
Ee muestran todos los errores y advertencias
e,cepto los del nivel E+E:=*J:.
2%"! E+E:=*J:
1dvertencias en de tiempo de e)ecuci4n /ue indican
sugerencias sobre cambios en tu c4digo para me)orar la
interoperabilidad y mantener la compatibilidad del
mismo.
Aotamos que en PHP 5 se "a aumentado esta lista para mostrar ms tipos de errores $ poder
encontrar los errores del c)digo ms fcilmente'
.n la secci)n error+reporting del fic"ero de configuraci)n php.ini aparece el valor E+122!
para que se muestren todos los errores' *i usamos la instrucci)n echo error+reporting()5! se
devuelve el valor 45' Pero podemos cambiar este valor indicando! por ejemplo! otro nivel de la
9 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
forma siguiente:
error+reporting(7)5
en cu$o caso se mostrarn los mensajes de error de los tres primero niveles <1K5K8=' *i
escribimos
error+reporting(#)5
se mostrarn los mensajes de error de los cuatro primeros niveles <1K5K8K8='
.n el Ejemplo 2 de esta Unidad "emos usado estas dos funciones para detectar $ controlar
los errores de un programa estableciendo diferentes niveles $ procedimientos para mostrar $
escribir los mensajes de error en fic"eros'
4 - Compresin de ficheros
.n este apartado vamos a estudiar la compresi)n $ descompresi)n de fic"eros utili(ando
funciones de PHP'
Para poder comprimir $ descomprimir fic"eros necesitamos utili(ar la librer%a Llib de Lean0loup
2aill$ $ /arM +dler! que permite leer $ escribir arc"ivos comprimidos de tipo g'' Podemos
recoger esta librer%a en la direcci)n httpCAAMMM.'lib.netA' + partir de PHP 8'4 $ para la
plataforma NindoNs esta librer%a $a viene compilada internamente en p"p! por lo cual podemos
servirnos de ella sin necesidad de recogerla ni instalarla en nuestro ordenador'
.l /anual de PHP aborda estas funciones en su apartado ,--!.. "unciones de ,ompresi'n
Mlib ' 3os alumnos $ alumnas que lo precisen pueden consultar esta informaci)n accediendo a
este documento a travs de la a$uda del .ditor dev0PHP'
Hecomendamos repasar las e#plicaciones dadas en la :eor%a de la Unidad 8 sobre las
funciones de PHP para reali(ar diferentes operaciones con fic"eros' +s% se comprendern
mejor algunos conceptos abordados en este apartado
"unciones de PHP para comprimir y descomprimir ficheros
Para abrir y cerrar ficheros
3a funci)n (1open() permite abrir un fic"ero g(ip en el que se va a escribir de forma
comprimida'
Ista es su sinta#is:
(1open(nombre del fichero-modoF-incluir pathG)
3a funci)n g'open() devuelve un puntero! que es un n&mero entero! del arc"ivo abierto'
,espus! al reali(ar operaciones de lectura o de escritura relacionadas con este fic"ero! "a$
que citar este descriptor de arc"ivo' *i la apertura falla! esta funci)n devuelve el valor False'
.l segundo parmetro indica si el fic"ero "a de abrirse en modo de s)lo lectura <OrP= o en modo
de escritura <ONP=' .n este parmetro pueden usarse los mismos valores que en la funci)n
fopen()' +dems! en esta librer%a se puede indicar el grado de compresi)n! de 1 a Q' Por
10 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
ejemplo! el valor ONbQ indica que! al escribir! se utilice la m#ima compresi)n posible'
:ambin se puede especificar la estrategia con la que se "a de comprimir: Of para filtrado de
datos! O" para comprimir usando s)lo el mtodo Huffman! etctera' .n la pgina oficial sobre
(lib puede "allarse ms informaci)n sobre este parmetro de estrategia' Por ejemplo! el valor
ONbQf indica que "a de escribirse con la m#ima compresi)n filtrando los datos'
*e puede usar tambin un tercer parmetro! que es opcional: si ponemos el valor 1! estamos
indicando que el fic"ero "a de buscarse tambin en la tra$ectoria especificada en el parmetro
include+path del fic"ero de configuraci)n php.ini'
3a funci)n (1close() cierra un fic"ero g(ip que se "a abierto correctamente con la funci)n
g'open()'
Ista es su sinta#is:
(1close(puntero o descriptor vNlido del fichero abierto)
,evuelve True si la operaci)n se reali() sin problemas $ False si "ubo errores'
Para saber d'nde est el puntero o moverlo por el fichero
3a funci)n (1#e*ind() coloca el puntero de un arc"ivo de tipo g(ip al comien(o del mismo' +l
abrirse un fic"ero! el puntero queda situado al comien(o del mismo! pero se mueve con las
operaciones de lectura o escritura'
Ista es su sinta#is:
(1#e*ind(puntero o descriptor vNlido del fichero abierto)
3a funci)n (1see2() busca una posici)n especificada $ coloca el puntero de un arc"ivo de tipo
g(ip sobre la misma'
Ista es su sinta#is:
(1see2(puntero o descriptor vNlido del fichero
abierto-nmero de bytes)
Por ejemplo! si el fic"ero tiene un tamaRo de 1'958 b$tes! la instrucci)n
(1see2 (<id+fichero-!#% )5
coloca el puntero de lectura o escritura en el b$te 859'
*i el arc"ivo se "a abierto para lectura! la funci)n se emula! $a que no se comprime de "ec"o!
si bien la operaci)n es mu$ lenta' *i se "a abierto para escritura! s)lo se busca "acia delante $!
en este caso! la funci)n g'seeO() comprime el contenido saltado en una secuencia de ceros
"asta que el puntero alcan(a la nueva ubicaci)n'
*i la operaci)n se completa sin problemas! esta funci)n devuelve el valor 9; de lo contrario!
devuelve 01' ,ebemos tener en cuenta que no se produce ning&n error cuando la b&squeda
alcan(a la marca de final del fic"ero'
11 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3a funci)n (1eof() comprueba si el puntero de un arc"ivo de tipo g(ip "a alcan(ado la marca
de final de fic"ero'
Ista es su sinta#is:
(1eof(puntero o descriptor vNlido del fichero abierto)
,evuelve True si el puntero est en la marca de fin del arc"ivo o cuando "a ocurrido un error'
,e lo contrario! devuelve False'
3a funci)n (1tell() devuelve el n&mero de b$tes <despla(amiento del puntero dentro del
fic"ero= sobre el que est situado el puntero de un arc"ivo de tipo g(ip'
Ista es su sinta#is:
(1tell(puntero o descriptor vNlido del fichero abierto)
,evuelve False cuando "a ocurrido un error al ejecutarse la funci)n'
Para escribir dentro de un fichero en formato comprimido
3as funciones g'Mrite() $ g'puts()! que son idnticas en su funcionamiento! escriben una
cadena dada dentro de un fic"ero de tipo g(ip en modo binario'
Ista es su sinta#is:
(1puts(puntero o descriptor vNlido del fichero
abierto-cadenaF-tamaDoG)
(1*#ite(puntero o descriptor vNlido del fichero
abierto-cadenaF-tamaDoG)
*i el parmetro opcional tamaDo est presente! se detiene la escritura cuando se alcan(a el
n&mero de b$tes <descomprimidos= indicado; o bien se deja de escribir cuando se llega al final
de cadena; lo que ocurra primero'
Para leer ficheros comprimidos
3a funci)n #ead(1file() lee un fic"ero g(ip! lo descomprime $ lo escribe en la salida estndar'
Ista es su sinta#is:
#ead(1file(nombre del fichero-Fincluir pathG)
.n realidad! devuelve s)lo el numero de b$tes <descomprimidos= le%dos del arc"ivo' *i ocurre
alg&n error! devuelve False $ muestra un mensaje de error! a no ser que se use el operador P
delante'
*e puede usar tambin un segundo parmetro! que es opcional: si ponemos el valor 1!
estamos indicando que el fic"ero "a de buscarse tambin en la tra$ectoria especificada en el
parmetro include+path del fic"ero de configuraci)n php.ini'
3as funci)n (1file() se comporta en la prctica como la funci)n readg'file() anterior'
12 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3as funci)n (1#ead() lee un fic"ero de tipo g(ip en modo binario'
Ista es su sinta#is:
(1#ead(puntero o descriptor vNlido del fichero
abierto-tamaDo)
3a lectura se detiene cuando se alcan(a el n&mero de b$tes indicado en el parmetro tamaDo; o
bien finali(a cuando se llega al final del fic"ero! lo que ocurra primero'
3as funci)n (1(etc() lee un carcter de un fic"ero de tipo g(ip' .n concreto! lee el carcter
sobre el que est el puntero de lectura0escritura'
Ista es su sinta#is:
(1(etc(puntero o descriptor vNlido del fichero
abierto)
3as funci)n (1(ets() lee una l%nea de un fic"ero de tipo g(ip'
Ista es su sinta#is:
(1(ets(puntero o descriptor vNlido del fichero
abierto-tamaDo)
,evuelve una cadena <descomprimida= que tiene una longitud de tamaDoQ b$tes! le%da del
arc"ivo de tipo g'ip apuntado por descriptor del fichero' 3a lectura finali(a cuando se "a
le%do esta longitud o bien al encontrarse un salto de l%nea o la marca de final de fic"ero! lo que
ocurra antes'
3as funci)n (1(etss() se comporta como la funci)n g'gets() anterior! pero intenta quitar
cualquier etiqueta H:/3 o PHP del te#to que se lee' +dems! permite usar un tercer
parmetro! opcional! para indicar qu etiquetas en concreto no deben ser e#tra%das'
3as funci)n (1passt3#u() lee desde la posici)n del puntero "asta el final de un fic"ero de tipo
g(ip <el remanente= $ escribe los resultados descomprimidos en la salida estndar' +l acabar la
lectura! el fic"ero le%do queda cerrado'
Ista es su sinta#is:
(1passt3#u(puntero o descriptor vNlido del fichero abierto)
.n el Ejemplo 3 de esta Unidad puede verse c)mo "emos usado las funciones que permiten
crear fic"eros comprimidos! as% como descomprimirlos $ leerlos'
5 - Crear documentos !F
.l lenguaje PHP dispone de funciones para crear documentos de tipo P,- <Portable ,ocument
-ormat=' .n este apartado vamos a iniciarnos solamente en el uso de las funciones ms
importantes para elaborar este tipo de documentos'
PN" es un formato de arc"ivo original de los sistemas de +dobe $ sirve para intercambiar
13 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
documentos independientemente del softNare de la aplicaci)n original! del "ardNare $ del
sistema operativo' Puede contener documentos con cualquier combinaci)n de te#to! grficos e
imgenes $ visuali(arse en cualquier ordenador' *e necesita un lector! el +crobat Header! que
puede bajarse desde: http://www.adobe.es/'
+s% pues! para poder comprobar si el documento que "emos creado con las funciones P,- de
PHP est correctamente reali(ado! es preciso tener instalado en nuestro ordenador alguna de
las versiones del programa +crobat Header'
.n el /anual de PHP <ver +$uda del .ditor dev0PHP= se aborda este tema en dos cap%tulos
diferentes: ---. "unciones PN" $ -. "unciones de ,libPN"' .n el primero de los dos se
utili(a la librer%a creada por :"omas /er(! que es gratuita si se utili(a con fines educativos $
puede bajarse de la direcci)n http://www.pdflib.com/' .n el curso $a est instalada $
configurada la versi)n 5'9'4 de esta librer%a para poder utili(arse directamente sin que el
alumno o alumna tenga que "acer nada e#presamente para reali(ar los ejercicios del curso
sobre este asunto'
.n el segundo cap%tulo citado del /anual aparece la librer%a JlibPR>' Ao es gratuita! sino que
"a$ que cumplir las condiciones de uso establecidas en su licencia' Por otra parte! si
comparamos la &ltima versi)n de pdflib de :"omas /er( con la librer%a JlibPR>! no "a$
diferencia significativa entre ambas ni en la velocidad de confecci)n del documento P,- ni en
el tamaRo del fic"ero creado' +s% pues! nosotros vamos a abordar e#clusivamente las
funciones de la librer%a pdflib' .n todo caso! advertimos que son mu$ parecidas! por lo que!
aprendiendo las que aqu% se e#plican! es posible utili(ar las funciones de la librer%a Jlibpdf sin
ma$or dificultad! si se dispone de ella'
Seamos a continuaci)n las principales funciones de PHP para crear documentos de tipo P,-'
Abrir y cerrar un fichero de tipo PN"
Para utili(ar fic"eros pdf en p"p usando esta librer%a es necesario definir primero
un objeto que ser el que! con sus propiedades $ funciones! nos permita crear $
abrir este tipo de fic"eros' 3a clase en cuesti)n se llama pdf-ne*! $ para usarla
debemos escribir:
4pdf 5 pdf-ne*()
3a funci)n pdf-open() permite abrir un nuevo documento de tipo P,-' :iene esta sinta#is:
pdf-open-file(identificador de fichero- nombre del fichero pdf)
.l parmetro identificador de fichero es el objeto que se "a creado previamente con la
clase pdf+neM' .sta funci)n devuelve :=(E o >12EE dependiendo de si se "a conseguido crear
el fic"ero o no'
+s% pues! si queremos crear un nuevo documento P,- $ arc"ivarlo en el fic"ero Oreloj'pdfP! por
ejemplo! debemos escribir las siguientes instrucciones:
<fichero+pdf = 3relo).pdf35
<pdf = pdf+neM()5
pdf+open+file(<pdf- <fichero+pdf)5
14 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
+ partir de aqu% el identificador del documento P,- que estamos elaborando es el
representado por el objeto <pdf'
3a funci)n pdf-close() permite cerrar un documento de tipo P,-' :iene esta sinta#is:
pdf-close(identificador del documento)
.s imprescindible utili(arlo al acabar la creaci)n del documento P,-! pues el sistema no da por
concluido el documento "asta que no se encuentra esta orden'
+s% pues! al final de nuestro script de creaci)n de un documento P,- "emos de incluir las
instrucciones siguientes:
pdf+close(<pdf)5
Asignar informaci'n a un documento
Podemos asignar a un documento P,- algunas informaciones que despus podrn verse con
+crobat Header'
3a funci)n pdf-set-info() permite asignar al documento P,- diversas informaciones' :iene
esta sinta#is:
pdf+set+info((identificador del documento- nombre del apartado- te,to del apartado)5
,e esta forma podemos asignar al documento los campos 1uthor <+utor=! Jreator <Creador=!
:itle <:%tulo=! Eub)ect <+sunto=! SeyMords <Palabras clave= $ Justom>ield <Campo de usuario='
Por ejemplo! escribiendo las instrucciones siguientes
pdf+set+info(<pdf-31uthor3-3Jlodoaldo y Ravid =obledo3)5
pdf+set+info(<pdf-3Jreator3-3Mentor Q J9*JE Q MEJ3)5
pdf+set+info(<pdf-3:itle3-3Jonfeccionar un documento PR>3)5
pdf+set+info(<pdf-3Eub)ect3-3Prueba3)5
pdf+set+info(<pdf-3SeyMords3-3=oot- alia)3)5
pdf+set+info(<pdf-3Justom>ield3-3E)emplo " T(nidad ! Q Jurso de PBP # 3)5
podemos ver esta informaci)n abriendo el documento con +crobat Header! fuera del
navegador! en la opci)n +rc"ivo ,atos del documento 2eneralidades' +parece as%:
15 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas

Abrir y cerrar una pgina del documento
+ntes de poder escribir en el documento! es preciso ir abriendo $ cerrando cada pgina en la
que escribamos'
3a funci)n pdf-!e(in-pa(e() seRala el inico de una nueva pgina en la que se va a escribir
fijando a la ve( su tamaRo' :iene esta sinta#is:
pdf-!e(in-pa(e(identificador del documento- ancho- alto)
Ha$ que tener en cuenta que los valores ancho <width= $ alto <height= de la pgina determinan
el tamaRo de la misma! que tendr una anc"ura desde 9 "asta $ $ una altura desde 9 "asta y'
Cuando queramos escribir! colocar una imagen o dibujar una figura en una posici)n
determinada dentro de una pgina! ser necesario indicar las coordenadas $,y dentro de estos
l%mites' +dems! "a$ que tener en cuenta que al situar algo <te#to! imagen! grfico! etctera= en
una pgina se empie(a a contar como en la pantalla del ordenador: de abajo arriba $ de
i(quierda a derec"a'
Por ejemplo! si abrimos una pgina con la instrucci)n
pdf+begin+page(<pdf- #$#- !"2)5
tendr una anc"ura de 5Q5 $ una altura de 885' .stos valores estn e#presados en centsimas
de pulgada <1 pulgadaG5!58 cm='
+l crear el documento! podemos "acerlo todo lo grande o lo pequeRo que queramos! pues en
la pantalla se puede ver con +crobat Header con el tamaRo que lo "a$amos creado! "asta
ciertos l%mites! claro' +"ora bien! si queremos imprimirlo! debemos pensar en el tamaRo del
papel' 3as medidas anteriores definen una pgina de tamaRo ,JA+8 <519 mm # 5Q6 mm='
16 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
+s% pues! si tomamos como modelo el tamaRo de pgina fijado anteriormente! las coordenadas
$,y de las esquinas son stas: inferior i(quierda G 9!9; inferior derec"a G 5Q5!9; superior
i(quierda G9!885; superior derec"a G5Q5!885' ,entro de ellas se puede incluir te#to! grficos!
imgenes! etctera'
3a funci)n pdf-end-pa(e() seRala el final de una pgina' :iene esta sinta#is:
pdf-end-pa(e(identificador del documento)
3as dos funciones anteriores tienen que preceder $ seguir! respectivamente! al contenido de
toda pgina que se incorpore al documento' .n su interior se escribirn las dems funciones
que completen el contenido de la pgina! su formato! tipo $ tamaRo de letra! grficos!
imgenes! etctera'
Por ejemplo! con las dos instrucciones siguientes abrimos una pgina $ la cerramos:
pdf+begin+page(<pdf- #$#- !"2)5
pdf+end+page(<pdf)5
%scribir te$to en un documento PN"
Para escribir un te#to en un documento! en primer lugar! "a$ que especificar la fuente con que
debe aparecer el te#to $ su tamaRo'
3a funci)n pdf-findfont() permite buscar la fuente que queremos usar' :iene esta sinta#is:
pdfJfindfont(identificador del documento- nombre de la fuente-
c4digo de la fuente% 9o usar fuente interna)
.l nombre de la fuente es una cadena! el c)digo! a partir de la versi)n 5 de pdflib! es tambin
una cadena' Ista puede tener los valores siguientes: ObuiltinP! OpdfdocP! OmacromanP!
Omace#pertP $ ONinansiP' .n el ejemplo de este apartado usaremos este &ltimo! por ser el ms
apropiado para TindoNs' Ao Usar fuente interna <podemos escribir 1 ) 9= significa que la
librer%a pdflib usa las fuentes que estn compiladas internamente en la misma librer%a cuando
escribimos 9' .sta funci)n devuelve un entero que identifica un tipo de fuente'
3a funci)n pdf-setfont() permite establecer la fuente $ su tamaRo' :iene esta sinta#is:
pdf-setfont(identificador del documento- identificador de la fuente-
tamaDo de la fuente )
Por ejemplo! podemos fijar as% la fuente $ el tamaRo:
<fuente = pdf+findfont(<pdf- 3Jourier3- 3Minansi3- %)5
pdf+setfont(<pdf- <fuente- L%)5
:ambin podemos cambiar el color de la fuente con la funci)n pdf-setcolo#()! que tiene esta
sinta#is:
pdfJsetcolor0identificador del documento!tipo! valor para el
color ro)o- valor para el color verde-
valor para el color a'ul% valor e,tra de color )
17 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
Por ejemplo! con los siguientes valores establecemos el color a(ul:
pdf+setcolor(<pdf- 3both3- 3rgb3- %.%- %.%- .%- %.%)5
*i queremos escribir con el color negro! debemos poner la instrucci)n asU:
pdf+setcolor(<pdf- 3both3- 3rgb3- %.%- %.%- %.%- %.%)5
+s% pues! esta funci)n controla el color mediante combinaci)n rgb <redGrojo! greenGverde $
blueGa(ul=' *i se pone 9'9 en los tres argumentos! se obtiene el color negro' *i se pone 1'9 en
uno solo de los tres argumentos! se consigue el ro)o! el verde o el aLul! respectivamente' .l
valor de cada argumento! si no es 9! puede estar comprendido entre 9'999991 $ 1'9' +dems!
se pueden combinar los tres colores bsicos para obtener los colores complementarios'
Seamos $a c)mo escribir un te#to en el documento P,-'
3a funci)n pdf-s3o*() permite escribir un te#to en la posici)n actual del puntero de escritura'
:iene esta sinta#is:
pdf-s3o*(identificador del documento-te,to)
+ abrirse un documento P,-! el puntero queda colocado en la posici)n 9!9 <coordenadas $,y='
Por tanto! si ejecutamos esta funci)n seguidamente! el te#to se escribe a partir de aqu%' Pero!
seg&n va$amos elaborando el documento! el puntero de escritura se ir despla(ando! por lo
que no sabremos mu$ bien d)nde va a aparecer el te#to utili(ando esta funci)n' +s% pues! no
resulta demasiado c)moda'
3a funci)n pdf-continue-text()! que "emos mencionado poco antes! es prcticamente igual
que la anterior' :ambin permite escribir un te#to en la posici)n actual del puntero de escritura'
:iene esta sinta#is:
pdf-continue-text(identificador del documento-te,to)5
*i bien tiene los mismos inconvenientes que pdf+shoM()! en cambio resulta c)moda cuando
tenemos que escribir un te#to que ocupa varias l%neas! pues podemos fijar el espacio entre las
l%neas $ luego utili(ando esta funci)n consecutivamente escribiremos cada l%nea con la
separaci)n establecida'
3a funci)n que permite fijar varias de las caracter%ticas que va a tener el documento es
pdf-set-value' Por ejemplo! si queremos cambiar el espaciado entre las l%neas su sinta#is es:
pdf-set-value(identificador del documento- 3leading3- espaciado)
3a distancia es un n&mero entero entre 9 $ el m#imo asignado a la coordenada y' .n nuestro
ejemplo! "emos creado una pgina de 885 de alto'
3a funci)n pdf-s3o*-!oxed() permite escribir un te#to en la posici)n actual del puntero de
escritura dentro de un cuadro' :iene esta sinta#is:
pdf-s3o*-!oxed(identificador del documento-te,to-
coordenada ,-coordenada y-altura-anchura-
posici4n del te,to dentro del recuadro%
tipo de alineamiento)
18 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3os parmetros coordenada , $ coordenada y fijan el punto donde aparecer el vrtice inferior
i(quierdo del cuadrado' *i la altura $ la anchura del cuadrado no son 9! pueden indicarse
como posici4n del te,to dentro del cuadrado los valores OleftP! OrightP $ OcenterP' .n cambio!
si son 9! puede ponerse en este &ltimo parmetro los valores OjustifyP $ OfulljustifyP'
Hemos visto que es necesario controlar la posici)n del puntero si no queremos que nuestra
pgina P,- sea un verdadero galimat%as $ m#imo e#ponente de la pintura abstracta' 3a
funci)n que nos permite situar el puntero de escritura en la posici)n en que necesitemos
escribir es pdf-set-text-pos()' *u sinta#is tambin es sencilla:
pdf-set-text-pos(identificador del documento-
coordenada ,-coordenada y)
Una ve( dada esta orden! $a podemos estar seguros de que la siguiente escritura se producir
a partir de este punto'
3a funci)n pdf-s3o*-x6() permite escribir un te#to en la posici)n especificada por las
coordenadas #!$' :iene esta sinta#is:
pdf-s3o*-x6(identificador del documento-te,to-
coordenada ,-coordenada y)
.sta orden resulta ms c)moda que las anteriores! pues permite a la ve( escribir un te#to e
indicar d)nde debe aparecer' ?a "emos indicado que los valores de las coordenadas deben
estar dentro del rango asignado a la anc"ura $ a la altura de la pgina'
Otras funciones permiten adornar el te#to usando la funci)n pdf-set-value()! como las
siguientes:
pdf-set-value(identificador del documento- 3te,trendering3- modo) especifica c)mo
debe aparecer el te#to' *u segundo parmetro es el modo como debe presentarse cada letra'
3os valores ms relevantes son: 9Gcompactas; 1Gvac%as con borde; 5Gllenas con borde;
4Ginvisibles'
pdf-set-value(identificador del documento- 3te,trise3- puntos) resalta el te#to' .l
realce se indica en el segundo parmetro con un n&mero entero que especifica el n&mero de
puntos que debe sobresalir el te#to'
pdfJsetJvalue0identificador del documento! Vc"arspacingV! puntos2 fija la separaci)n entre
las letras de un te#to' .l segundo parmetro es un n&mero entero que indica el n&mero de
puntos con que deben separarse los caracteres del te#to entre s%'
pdf-set-value(identificador del documento- 3Mordspacing3- puntos) fija
la separaci)n entre las palabras de un te#to' .l segundo parmetro es un n&mero entero que
indica el n&mero de puntos con que deben separarse las palabras del te#to entre s%' *i
ponemos 9 en estas dos &ltima funciones! se restablece el paso por defecto'
19 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3a funci)n pdf-add-note() permite incluir notas dentro de una pgina' Ista es su sinta#is:
pdf-add-note(identificador del documento-
coordenada ,-coordenada y-coordenada ,2-
coordenada y2-t&tulo de la nota-te,to-
icono- nota abierta)
.sta funci)n escribe el t%tulo $ el te#to de la nota dentro de un cuadro que tiene su esquina
inferior i(quierda en las coordenadas ,-y $ su esquina superior derec"a en las coordenadas
,2-y2' .l parmetro iconopuede tomar los siguientes valores: comment- insert- note-
paragraph- neMparagraph- Oey- o help' .l parmetro nota abierta indica si la nota debe
estar desplegada <1 ) 9= cuando se abra el documento'
.n cada nota se puede! adems! poner un borde con la funci)n pdf-set-!o#de#-st6le()! que
tiene esta sinta#is:
pdf-set-!o#de#-st6le(identificador del documento-
nombre del estilo-anchura)
.l nombre del estilo del borde puede ser OsolidP <s)lido= $ OdashedP <transparente='
3a funci)n pdf-set-!o#de#-colo#() permite cambiar el color de la caja que contiene el t%tulo de
la nota' :iene esta sinta#is:
pdf-set-!o#de#-colo#(identificador del documento-
valor para el color ro)o- valor para el color verde-
valor para el color a'ul)
.n el Ejemplo 4 de esta Unidad elaboramos un documento P,- utili(ando funciones del
lenguaje PHP' .n el mismo puede estudiarse el c)digo comentado para ver c)mo "emos
usado las funciones que permiten crear este tipo de documentos'
Nibu)ar en un documento PN"
PHP nos permite tambin dibujar algunas figuras sencillas dentro de un documento de tipo
P,-' Seamos las principales funciones para "acerlo'
3a funci)n pdf-setlinecap() especifica c)mo deben ser los e#tremos de una l%nea' :iene esta
sinta#is:
pdf-setlinecap(identificador del documento-valor)
.l parmetro valor puede tener los valores siguientes: 9Gunidos al final! 1Gredondeados!
5Gcon su esquina pro$ectada'
3a funci)n pdf-setlinejoin() especifica c)mo deben ser las esquinas de una l%nea' :iene esta
sinta#is:
pdf-setlinejoin(identificador del documento-valor)
.l parmetro valor puede tener los valores siguientes: 9Gen forma de ingletes!
1Gredondeadas! 5Gen ngulo oblicuo'
20 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3a funci)n pdf-setline*idt3() especifica la anc"ura de una l%nea' :iene esta sinta#is:
pdf-setline*idt3(identificador del documento-valor)
3a funci)n pdf-setlinedas3() especifica el patr)n de una l%nea' :iene esta sinta#is:
pdf-setlinedas3(identificador del documento-
unidades blancas-unidades negras)
*i ponemos 9 en los dos parmetros unidades! se dibuja una l%nea s)lida'
3a funci)n que pdf-moveto() permite situar el puntero en la posici)n donde debe aparecer el
dibujo' *u sinta#is es sencilla:
pdf-moveto(identificador del documento- coordenada ,-coordenada y)
3a funci)n que pdf-#otate() permite "acer rotar el puntero' Ista es su sinta#is:
pdf-#otate(identificador del documento- grados /ue debe rotar)
Seamos a"ora las figuras Oue se pueden dibu)ar dentro de un documento P,-'
3a funci)n pdf-cu#veto() dibuja una l%nea curva seg&n los puntos indicados' :iene esta
sinta#is:
pdf-cu#veto(identificador del documento-
coordenada ,-coordenada y-
coordenada ,2-coordenada y2-
coordenada ,L-coordenada yL)
3a l%nea curva se inicia en el punto donde est el puntero $ acaba en ,L-yL! pasando por los
puntos ,-y $ ,2-y2'
3a funci)n pdf-lineto() dibuja una l%nea recta seg&n los puntos indicados' :iene esta sinta#is:
pdf-lineto(identificador del documento- coordenada ,-coordenada y)
3a l%nea recta se inicia en el punto donde est el puntero $ acaba en las coordenadas ,-y'
3a funci)n pdf-ci#cle() dibuja un c%rculo' :iene esta sinta#is:
pdf-ci#cle(identificador del documento- coordenada ,-coordenada y-radio)
.l c%rculo tiene su centro en las coordenadas ,-y $ el radio que se especifica en el parmetro
radio'
3a funci)n pdf-a#c() dibuja un arco' :iene esta sinta#is:
pdf-a#c(identificador del documento-
coordenada ,-coordenada y-radio-
inicio-final)
.l arco tiene su centro en las coordenadas ,-y $ el radio que se especifica en el parmetro
radio' *e inicia en el ngulo seRalado en inicio $ termina en el ngulo final'
21 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
3a funci)n pdf-#ect() dibuja un rectngulo' :iene esta sinta#is:
pdf-#ect(identificador del documento-
coordenada ,-coordenada y-anchura-altura)
.l rectngulo tiene su esquina inferior i(quierda en las coordenadas ,-y'
3a funci)n pdf-closepat3() cierra el camino actual' :iene esta sinta#is:
pdf-closepat3(identificador del documento)
3a operaci)n Ocerrar el camino actualP significa que se dibuja una l%nea desde el punto actual
"asta el punto donde se inicio la primera l%nea'
3a funci)n pdf-st#o2e() dibuja una l%nea a lo largo de un camino' :iene esta sinta#is:
pdf- st#o2e(identificador del documento)
,ibujar una l%nea a lo largo de un caminoP significa que la l%nea tendr la longitud que se "a$a
fijado antes con la funci)n pdf+lineto()'
.n el Ejemplo 5 de esta Unidad "emos recreado $ comentado el ejemplo del reloj que
aparece en el /anual! creando un documento de s)lo dos pginas! para que pueda verse
c)mo se usan las funciones de dibujo $ los efectos que producen'
!ncluir imgenes en un documento PN"
PHP dispone tambin de algunas funciones que permiten incorporar imgenes de diferentes
formatos en un documento P,-' Seamos brevemente cules son'
3a funci)n pdf-delete() cierra un documento P,- abierto' *e comporta igual que la funci)n
pdf+close() salvo que libera de la memoria del ordenador los recursos reservados antes de
que el script finalice' Como argumento debe indicarse el identificador del documento'
3a funci)n pdf-open-ima(e-file() abre en el documento P,- un fic"ero de imagen' .sta
funci)n lleva como argumentos! al menos! el identificador del documento! el tipo <formato= de
imagen $ el nombre del fic"ero que contienen la imagen' .s similar a la funci)n
pdf-open-memo#6-ima(e()! que abre en la memoria una imagen que se inserta en un
documento P,-' .n este caso la imagen se crea dentro del propio documento' 3leva como
argumentos el identificador del documento $ el identificador de la imagen que se va a crear' .n
el ejemplo que se pone en esta funci)n dentro del /anual de PHP puede verse que se utili(a
de la forma siguiente:
8?
<im= mageJreate(%%-%%)5
<col=*mageJolor1llocate(<im-!%-"#-$%)5
*mage>ill(<im-%-%-<col)5
<pim=7DF-open-memo#6-ima(e(<pdf-<im)5
*mageRestroy(<im)5
pdf+place+image(<pdf-<pim-%%-%%-)5
pdf+close+image(<pdf-<pim)5
?@
22 de 23
Curso de PHP 5 Unidad 8 Utilidades prcticas
*imilares a las dos funciones anteriores son pdf-open-jpe(()! pdf-open-(if() $
pdf-open-pn(()' Permiten abrir fic"ero de imagen del formato jpeg! gif $ png! respectivamente'
3levan como primer argumento el identificador del documento P,- $ como segundo! el nombre
del fic"ero de imagen! que "a de ser del tipo correspondiente a cada funci)n'
3a funci)n pdf-close-ima(e() cierra una imagen abierta'
3a funci)n pdf-(et-value() obtiene determinados valores numricos' .n el %)emplo : "emos
obtenido la altura <imageheight= $ la anc"ura <imageMidth= de la imagen que "emos
incorporado en el documento' .sta funci)n lleva como primer argumento el identificador del
documento! como segundo! el parmetro que buscamos! $ como tercero! el identificador de la
imagen'
3a funci)n pdf-place-ima(e() sit&a una imagen en la posici)n especificada de una pgina'
.sta funci)n lleva cinco argumentos: el identificador del documento! el identificador de la
imagen! la coordenada ,! la coordenada y! $ como quinto! la escala'
.n el Ejemplo 6 de esta Unidad presentamos una imagen en un documento P,- usando las
funciones del lenguaje PHP' .n este caso! no guardamos el documento en un fic"ero! sino que
s)lo mostramos la imagen incluida en el documento con el +crobat Header' .n el mismo puede
estudiarse el c)digo comentado para ver c)mo "emos usado las funciones que permiten
incorporar imgenes dentro de los documentos P,-'
" - #esumen
Ha$ que saber al final de esta unidad
8plica# las p#incipales funciones matem9ticas de 7:7 a las
diferentes situaciones en /ue deban emplearseC
trigonomUtricas- para hallar redondeos- mN,imos y m&nimos-
para calcular e,ponentes y logaritmos- as& como para
generar nmeros aleatorios.
Detecta# 6 co##e(i# los p#incipales e##o#es de un script-
utili'ando efica'mente las funciones de PBP /ue permiten
conocer su nivel y enviar a un dispositivo un mensa)e de
error con el te,to /ue sea adecuado a cada situaci4n.
;#ea# fic3e#os comp#imidos- abrirlos- cerrarlos- leer su
contenido- total o en parte- as& como mover el puntero de
lecturaQescritura por sus diferentes bytes.
;#ea# documentos en fo#mato 7DF sirviUndose de las
principales funciones de PBP para escribir te,to- dibu)ar
figuras e incorporar imNgenes.
MENTOR - CNICE MEC 200
23 de 23

S-ar putea să vă placă și