You are on page 1of 219

Tomo I

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
ndice General
Introduccin a las tecnologas
'i(erencia entre
! A"P ###################### $%
!A"P & !A"P#####################################################################
######### $% )*+!inux & !inux##############################################$% )*
################################$/ ,ree -o(t.are ,oundation & el Pro&ecto
In(ormacin complementaria########################################################
$/ -itios Web de 0e(erencia#####################################################
######$/ Bibliogra(a complementaria##############################################
#######$1 Preparacin b2sica del entorno de desarrollo############################
###$1 Instalacin de *buntu )*+!inux en Windo.s##########################$1 Instal
acin de *buntu )*+!inux como 3nico -istema 4perati5o ############################
###################################################################### $6 Instal
acin de Apache -er5er####################################################$6 4tras
opciones de Apache7###################################################89 It Wor
:s;#############################################################################
### 8$ Instalacin de "&-<!#######################################################
#########88 Instalacin de PHP####################################################
################88 =eri(icando la 5ersin de PHP##################################
##############88 >on(igurando el directorio de tu Web !ocal#####################
##############8? >rear el directorio para tu Web local##########################
###############8? "odi(icando el directorio ra@ de tu Web local##################
#########8%
>onociendo PHP##################################################### 86
EtiAuetas de apertura & cierre #################################################
####86 >onocer el 5alor actual de shortBopenBtag###############################8
C Instrucciones & estructuras###################################################
########8C Identacin en PHP######################################################
###################?9 Impresin en pantalla#######################################
############################?$ =ariables & tipos de datos b2sicos###############
#################################?8
?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
)ullD 5arBdumpEF e issetEF######################################################
####?/ "alas pr2cticas con 5ariablesD Aue a(ectan el uso de memoria ?G 4peradore
s aritmHticos#################################################################?C
Haciendo c2lculos con el I=A###################################################
##?C sett&pe Iun bug no resuelto o (eature objetableJ#####################%9 HT"
! & PHP en un mismo archi5o#################################################%8 *
na mala pr2ctica7 colocar cdigo HT"! embebido dentro de 5ariables de PHP#########
##############################################################%8 *na buena pr2ti
ca para e5itar lo anterior#################################%? >omentando & docum
entando el cdigo (uente############################%% Inclusin de archi5os en PHP#
#######################################################%1 'i(erencia entre inclu
sin de archi5os remotos & locales##########%6 'i(erencia entre include & reAuire#
############################################%G Include & reAuire KBonceK########
##################################################%G
Estructuras de >ontrol Parte I EcondicionalesF ########%C
'e(inicin########################################################################
############## %C >ondicionales i(D else & else i(##############################
#########################%C 4peradores lgicos & de comparacin#####################
#################/9 4peradores de comparacin#####################################
################/9 'i(erencia entre igualdad e idHntico en la comparacin#########
##/$ 4peradores lgicos###########################################################
########/$ >reando condicionales################################################
##############/8 Estructuras de control con -.itch##############################
###################/% I>u2ndo utili@ar i( & cuando s.itchJ######################
###################/1
Tipos de 'atos complejos7 "atrices simples & multidimensionales#################
############################### /G
"atrices en PHP#################################################################
########### /G -intaxis b2sica##################################################
########################/G
%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Imprimir en pantalla con printBr################################################
/C Acceso a los tems de un arra&#################################################
/C "odi(icando elementos########################################################
#####19 Agregar elementos#######################################################
#############19
Estructuras de >ontrol Parte II Ebucles IF ###############18
0ecorriendo matrices din2micamente con (oreach#######################18 -intaxis
b2sica del constructor (oreach####################################18 *n ejemplo
de iteracin compleja con (oreach#########################1? "odi(icando matrices
din2micamente con (oreach###################1%
Estructuras de >ontrol Parte III Ebucles IIF #### # # # # # # # # # 16
WhileD un bucle simple##########################################################
########16 *n ejemplo sencillo##################################################
#################16 *n ejemplo pr2ctico#########################################
#########################1G 'o .hileD tan simple como .hile pero con una 5entaja
################1C *n ejemplo simple############################################
########################1C Bucles (orD los m2s complejos de PHP#################
##########################6$ -intaxis7##########################################
########################################## 6$ >uriosidades sint2cticas de la bip
olaridad no diagnosticada de PHP ###############################################
####################################################### 6% otoD si lo usas### es
tu eleccin;##############################################6/ *n ejemplo noLpr2cti
co para entender goto#############################6/
,unciones de(inidas por el usuario ########################## 6G
'e(inicin########################################################################
############## 6G 'eclarando ,unciones##########################################
#########################6G -intaxis b2sica#####################################
#####################################6G -obre el nombre de las (unciones########
#####################################6G -obre los par2metros####################
############################################6G !lamando a una (uncin#############
###################################################6C
/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
-obre la (inalidad de las (unciones#############################################
###G9 Paso de 5ariables por re(erencia en (unciones#############################
#G9 "odi(icando 5ariables globales mediante el uso de global###########G$ !lamad
as de retorno###################################################################
##G8 Pasar argumentos en una llamada de retorno##########################G? Argu
mentos no conocidos#########################################################G% >
onocer la cantidad de argumentos#####################################G% 4btener
una lista completa de todos los argumentos###########G/ 4btener un argumento esp
ec(ico#########################################G/ -aber si una (uncin puede ser ll
amada EcallableF####################G/ "aterial de lectura adicional############
#########################################G1 'i(erentes (ormas de recoger argumen
tos para hacer una llamada de retorno###########################################
#########################G6 ,orma $7 recibir argumentos en un arra&#############
#################G6 ,orma 87 recibir argumentos $ a $###########################
#############GG !lamadas recursi5as#############################################
########################GC Helpers##############################################
############################################ C$ *n helper Aue retorna la (echa a
ctual#######################################C$ *n helper Aue modi(ica una 5ariab
le globalD haciendo una llamada de retorno######################################
##############################C8 Taller de ,unciones############################
############################################C?
Trabajando con el -istema de Archi5os #################### C%
0ecorrido r2pido por las principales (unciones##############################C% A
pertura de archi5os#############################################################
####C% "odos de apertura########################################################
########C/ 0uta hacia el archi5o################################################
#############C1 *tili@ar o no includeBpath######################################
################C1 !ectura de Archi5os##########################################
########################C6 Escribir en un archi5o###############################
################################C6
1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"o5iendo el puntero dentro del archi5o####################################CG *n
contador de 5isitas sencillo#############################################CG M>ui
dado con los permisos;#######################################################CC
Trabajando con directorios######################################################
######CC >reando el gestor######################################################
################CC Explorando el contenido de un directorio#####################
##########$99 ,iltrando el tipo de elemento#####################################
#############$98 4tras (unciones Aue necesitar2s con (recuencia#################
########$9% >omprobar la existencia de un archi5o o directorio################$9
/ >omprobar si un archi5o o directorio es legible######################$9/ >ompr
obar si un archi5o o directorio puede escribirse###########$91 "2s (unciones sob
re el sistema de archi5os###########################$91
Procesamiento de texto & manipulacin de strings # #$96
Ampliando la de(inicin de 5ariables de tipo string#####################$96 Escapa
ndo caracteres#################################################################$
9G >aracteres de escape#########################################################
####$9C ,unciones para manipulacin de strings####################################
#$$9 ,unciones de escape########################################################
#######$$9 ,unciones de con5ersin################################################
#########$$$ E5itando ejecucin de cdigo no deseado##########################$$8 ,u
nciones de (ormato##############################################################
$$? ,unciones de manipulacin#####################################################
$$1 "anipulando subcadenas en cadenas################################$$C ,uncion
es de encriptacin######################################################$8$ 0esume
n de las principales (unciones de string#########################$8% Taller de A
rchi5os & Procesamiento de ,ormularios#####################$81
Anexo I7 constantesD 5ariables 5ariables & 5ariables superglobales##############
######################################## $86
6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>onstantes######################################################################
############ $86 'e(inicin cl2sica de constantes en PHP##########################
#######$86 'e(inicin de constantes en PHP /#?####################################
###$8G ,inalidad de las constantes##############################################
#######$8C =ariables 5ariables##################################################
####################$?9 =ariables superglobales#################################
#############################$?$
En5o de correo electrnico con PHP ###################### $??
!a (uncin mailEF & su sintaxis###################################################
##$?? El par2metro NdestinatarioO7 (ormatos admitidos####################$?? >ab
eceras adicionales como par2metro extra########################$?% >omprobando A
ue el eLmail pudo en5iarse#############################$?% En5iando mensajes en
(ormato HT"!#########################################$?1
,unciones para el manejo de ,echa & Hora ############# $?6
,unciones simples de (echa & hora#############################################$?
6 4btener la (echa & hora actual en un arra& asociati5o###########$?6 4btener (e
cha & hora actual con (ormato en una cadena de texto############################
########################################################### $?G =alidar una (ech
a####################################################################$%$ >2lculo
de (echa + hora sencillo##############################################$%$ Ejemp
los pr2cticos de c2lculos basados en (echas#####################$%? I>u2nto tiem
po ha pasadoJ####################################################$%? I<uH edad t
iene###J#################################################################$%% IEn
AuH (echa naci###J###########################################################$%%
,unciones matem2ticas######################################## $%1
4btener un n3mero ele5ado a la potencia##################################$%1 4bt
ener el n3mero m2s alto & el n3mero m2s bajo####################$%1 0edondear un
n3mero con ) cantidad de decimales##################$%6 0edondear un n3mero hac
ia abajo#############################################$%6
G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
0edondear un n3mero hacia arriba#############################################$%6
4btener un n3mero entero aleatorio##########################################$%G
,unciones para el manejo de matrices ################### $%G
'i5iendo & uniendo arra&s#######################################################
###$%G 'i5idir un arra& en matrices m2s peAuePas###########################$%G 4
btener la porcin espec(ica de un arra&##############################$/9 >ombinar d
os arra&sD utili@ando uno para las cla5es & otro para los 5alores###############
################################################################ $/9 >ombinar do
s o m2s arra&s####################################################$/$ >ombinar d
os o m2s arra&s multidimensionales de manera recursi5a##########################
####################################################### $/$ 4rdenando Arra&s por
sus 5alores##############################################$/8 4rdenar un arra& d
e menor a ma&or######################################$/8 4rdenar un arra& de ma&
or a menor######################################$/8 4rdenar un arra& de menor a
ma&or manteniendo la relacin con los ndices#######################################
#################################$/? 4rdenar un arra& de ma&or a menor mantenien
do la relacin con los ndices######################################################
##################$/? 4rdenando Arra&s por su cla5e#############################
######################$/% 4rdenar un arra& de menor a ma&or por su cla5e########
##########$/% 4rdenar un arra& de ma&or a menor por su cla5e##################$/
% >omparando (unciones de ordenamiento de arra&s###################$// Agregar &
Eliminar elementos de un arra&##################################$// Agregar ele
mentos al (inal del arra&#######################################$// Agregar elem
entos al comien@o del arra&###############################$/1 Eliminar el 3ltimo
elemento de un arra&#################################$/1 Eliminar el primer ele
mento de un arra&################################$/1 Eliminar 5alores duplicados
en un arra&#################################$/6 B3sAuedas & (iltros############
##########################################################$/6
C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>ontar la cantidad de 5eces Aue los elementos aparecen en un arra&##############
######################################################################### $/6 >o
ntar la cantidad de elementos de un arra&#########################$/G 4btener la
suma matem2tica de los 5alores de un arra&#######$/G 4btener las di(erencias en
tre dos o m2s arra&s######################$/G ,iltrar datos de un arra&D utili@a
ndo una (uncin de retorno# # #$/C =eri(icar si un arra& contiene una cla5e determ
inada#############$19 4btener todas las cla5es de un arra& o todos los 5alores##
#####$19 =eri(icar si un arra& contiene una 5alor determinada#############$1$ Bu
scar un 5alor detrminado en un arra& & obtener su cla5e correspondiente#########
#############################################################$1$
>oo:ies & -esiones de usuario############################## $18
I<uH es una coo:ieJ#############################################################
######$18 !as coo:ies no son eternas############################################
#########$1? I<uH son las sesiones de usuarioJ##################################
############$1? *sos e importancia##############################################
#######################$1% !o b2sico############################################
######################################### $1% >reacinD lecturaD modi(icacin & elim
inacin de coo:ies#######$1% >rear una coo:ie#####################################
############################$1/ !eer una coo:ie#################################
##################################$11 "odi(icar una coo:ie######################
#####################################$11 Eliminar una coo:ie####################
#########################################$11 *n ejemplo pr2ctico con >oo:ies####
########################################$16 Trabajando con -esiones#############
################################################$69 Primeros pasos con sesiones#
#################################################$6$ >rear una nue5a sesin#######
###################################################$6$ !eer una sesin############
###########################################################$68 "odi(icar la sesin
##################################################################$68 Eliminar u
na 5ariable de sesin##############################################$6?
$9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
*n caso pr2ctico de uso de sesiones##########################################$6?
,unciones necesarias###########################################################
###$6/ ,unciones de acceso al sistema##########################################$
6/ ,unciones para destruir la sesin del usuario#####################$66 ,unciones
para 5eri(icacin & 5alidacin de sesiones#########$66 !a (uncin Aue redirige a los
usuarios#################################$6C Pasos (inales######################
##################################################### $6C
Tratamiento & control de errores ########################### $G8
Tipos de errores################################################################
##########$G8 >on(igurando errores en tiempo de ejecucin#########################
###$G% *n ejemplo sencillo pero altamente producti5o######################$G% *t
ili@ando el smbolo Q para silenciar errores############################$G/
Trabajando con Bases de 'atos "&-<! ################### $G6
Acerca de "&-<!#################################################################
#######$GG Instalacin & con(iguracin de "&-<!#####################################
$GG IniciarD reiniciar & detener el ser5idor "&-<!##########################$GC
Administracin de "&-<!#######################################################$C$
>onectarse & desconectarse al ser5idor#############################$C$ >omandos
para administrar "&-<! dede el shell interacti5o ###############################
############################################################# $C$ -obre el lengu
aje -<!#################################################################$C? Tipo
s de datos m2s comunes ErecomendadosF#######################$C? -int2xis b2sica
de las sentencias -<!#####################################$C% >rear tablas en un
a base de datos#####################################$C% Insertar datos en una ta
bla#################################################$C1 -eleccionar registros###
########################################################$C1 "odi(icar registros#
##############################################################$C6 Eliminar regis
tros################################################################$CG
$$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>onsultas a5an@adas#############################################################
#$CC !a cl2usula WHE0E##########################################################
###$CC 4rdenando consultas7 la cl2usula 40'E0 BR######################89$ Alias
de tablas & campos########################################################89$ ,u
nciones del lenguaje -<! de "&-<!####################################898 >ontar
la cantidad de registros7 >4*)TEF###########################898 -umar totales7 *"EF##########################################################898 >oncatenar cad
enas7 >4)>ATEF##########################################898 >on5ertir a min3scul
as & ma&3sculas7 !>A-EEF & *>A-EEF# 89? 0eempla@ar datos7 0EP!A>EEF#############
###############################89? 4btener los primeros o 3ltimos caracteres7 !E
,TEF & 0I HTEF #################################################################
########################### 89? 0edonder n3meros7 04*)'EF#######################
######################89? 4btener solo la (echa de un campo 'ATETI"E o TI"E-TA"P
7 'ATEEF########################################################################
######### 89? 4btener una (echa (ormateada7 'ATEB,40"ATEF################89? 4bt
ener el registro con el 5alor m2ximo & mnimo7 "ASEF & "I)EF######################
############################################################# 89% 4ptimi@acin de
bases de 'atos#################################################89% Todos los reg
istros deben tener un I' 3nico############################89% >rear ndices en las
tablas######################################################89/ Indica cu2les c
ampos no pueden ser nulos#############################89/ *tili@a el motor Inno'
B###########################################################891 4btener ma&or in
(ormacin########################################################891
Trabajando con "&-<! desde PHP########################## 896
"&-<! desde PHP con el conector m&sAl####################################89G >on
ectarse a la base de datos################################################89G -e
leccionar una base de datos###############################################89C Ej
ecutar una consulta simple##################################################89C
$8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Ejecutar una consulta de seleccin m3ltiple & capturar sus resultados#############
################################################################## 89C >apturamo
s el arra& con los resultados##############################89C !iberar los resul
tados##########################################################8$9 >errar la con
exin###################################################################8$9 Alguno
s ejemplos concretos####################################################8$$ >ons
ulta de seleccin#########################################################8$$ Inse
rtar 5arios registros en un solo paso############################8$$ "&-<! desde
PHP con el conector m&sAli###################################8$? Abrir una cone
xin mediante m&sAli#######################################8$% Preparar la consult
a################################################################8$% Ejecutar la
consulta################################################################8$/ >er
rar la consulta#################################################################
###8$/ >errar la conexin#########################################################
##########8$1 Ejemplo de insercin completo#######################################
########8$1 >apturar resultados de una consulta de seleccin##################8$6
Ejemplo completo de consultas de seleccin##########################8$G
$?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Introduccin a las tecnologas ! A"P
!A"P son las siglas de cuatro tecnologas libresD Aue con(orman la base de las apl
icaciones Web basadas en7 -istema 4perati5o7 )*+!inux
-er5idor Web7 Apache -er5idor de bases de datos7 "&-<! !enguaje de programacin hbr
ido EmultiparadigmaF & de alto ni5el7 PHP
! A"P & ! A"P
!a ma&ora de las 5ecesD encontraremos bibliogra(a Aue al momento de re(erirse a la
s tecnologas !A"PD suprimen la N O del comien@oD cometiendo el gra5e error de lla
marlas simplemente !A"P# 'e la misma (ormaD en una gran cantidad de casosD la do
cumentacin se re(iere al -istema 4perati5o )*+!inuxD como N!inuxOD suprimiendo la
s siglas N )*O# Pero I<uH tiene aAuello de erradoJ !a respuesta a esta preguntaD
est2 en la gran di(erencia entre )*+!inux & !inux#
'i(erencia entre !inux
)*+!inux &
!inuxD es un :ernelD es decirD el n3cleo de un -istema 4perati5oD mientras Aue )
*+!inuxD el -istema 4perati5o Aue utili@a el Ternel !inux como n3cleo#
$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
El Ternel !inuxD parte (undamental del -istema 4perati5oD (ue desarrollado por !
inus Tor5alsD utili@ando como modelo a *)IS# *na de las di(erencias (undamentale
s entre los n3cleos !inux & *)ISD es Aue el primeroD es -o(t.are !ibreD mientras
Aue el segundo no lo es# Por otra parteD mientras existe un 3nico Ternel !inux
Econ 5ersiones di(erentesFD existen decenas & hasta cientos de distribuciones )*
+!inux D es decirD di(erentes -istemas 4perati5os basados en el Ternel !inuxD en
tre las cuales se destacan7 'ebianD *buntuD TubuntuD ,edora D entooD -lac:.areD
>ent4-D Arch!inuxD AsturixD entre otros cientos#
,ree -o(t.are ,oundation & el Pro&ecto )*
!a ,ree -o(t.are ,oundation D organi@acin sin (ines de lucroD (undada por 0ichard
-tallmanD principal precursor del -o(t.are !ibreD es el organismo Aue creD di(un
de & promue5eD el -istema 4perati5o )*+!inuxD a tra5Hs del Pro&ecto )* #
In(ormacin complementaria
-itios Web de 0e(erencia
-itio Web de la ,ree -o(t.are ,oundation 7 ...#(s(#org -itio Web del Pro&ecto )*
7 ...#gnu#org -itio Web del Ternel !inux7 http7++...#:ernel#org+ -itio Web de la
!inux ,oundation 7 http7++...#linux(oundation#org+
$/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Bibliogra(a complementaria
Introduccion al so(t.are libre#pd( E*ni5ersitat 4bierta de >atalun&aF -istema op
erati5o gnu linux basico#pd( E*ni5ersitat 4bierta de >atalun&aF
Preparacin b2sica del entorno de desarrollo
En este cursoD nos en(ocaremos en tecnologas !A"PD a partir de la distribucin *bun
tu $9#9% !T- E!ucidF Lo superiorL de )*+!inuxD basada en 'ebian# En caso de RA c
ontar con otra distribucinD 5ersin de *buntu o 'ebianD puedes saltar estos p2rra(o
s e ir directamente a la instalacin de Apache #
Instalacin de *buntu Windo.s
)*+!inux en
-i eres usuario de Windo.s & deseas conser5ar tu -istema 4perati5o actualD puede
s descargar *buntu Windo.s Installer desde el sitio Web o(icial de >anonical Eem
presa Aue desarrolla & mantiene *buntuF en la siguiente *0!7 http7++...#ubuntu#c
om+do.nload+ubuntu+.indo.sLinstaller *buntu Windo.s Installer se instalar2 desde
el propio "Windo.sU como si (uese un -o(t.are m2sD permitiHndote iniciar tu ord
enador con *buntu o "- Windo.sU seg3n elijas# Para instalar instrucciones descar
gaD las N-ho. me ho.O *buntu Windo.s InstallerD sigue las de los pasos 8 & ? de
la *0! de cuales podr2s 5isuali@ar pulsando el botn de cada uno de los pasos#
$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Instalacin de *buntu )*+!inux como 3nico -istema 4perati5o
Para instalar *buntu como 3nico -istema 4perati5oD sigue los siguientes pasos7 $
# ingresa en http7++...#ubuntu#com+do.nload+ubuntu+do.nload 8# En el paso $D sel
ecciona la 5ersin de *buntu Aue deseas descargar# Para procesadores de un solo n3
cleoD selecciona la 5ersin $9#9% !T-# Para procesadores m2s modernosD puedes sele
ccionar la 3ltima 5ersin E5ersin Aue aparece seleccionada por de(ecto en el desple
gable de 5ersionesF# -i tienes dudas sobre si elegir la 5ersin para ?8 o 1% bitsD
elige la de ?8Lbits# Pulsa el botn N-tart do.nloadO & aguarda a Aue se descargue
el archi5o# ?# *na 5e@ descargado el archi5oD podr2s Auemarlo en un >'+'=' o un
Pendri5e *-B# En el paso 8 de la *0! de descargaD selecciona >' o *-B stic: seg
3n tus pre(erencias & el -istema 4perati5o desde el cual har2s la copia EWindo.s
o "acF# Pulsa el botn Nsho. me ho.O & sigue las instrucciones de Auemado# %# A c
ontinuacinD salta al paso % del sitio de descarga Eel ? es solo para probar *bunt
u sin instalarloFV pulsa el botn Nsho. me ho.O & sigue las instrucciones para ins
talar *buntu en tu ordenador#
Instalacin de Apache -er5er
Antes de instalar Apache en tu distribucin )*+!inuxD crearemos un !an@ador de la
terminal Ellamado Nacceso directoO en Windo.sFD para &a tenerlo Na manoO# Para e
lloD sigue los siguientes pasos7 $# En el panel superior Edonde
$6
(iguran
los
men3es

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
NAplicacionesD !ugares & -istemaOFD ha@ clic derecho con el ratn luego del men3 N
-istemaOD & selecciona la opcin NAPadir al PanelO# 8# A continuacinD ha@ doble cli
c sobre la primera opcin !an@ador de Aplicacin Personali@ado # ?# En la 5entana de
creacin de lan@adorD ingresa los datos como se muestra a continuacin7 )ombre7 Ter
minal >omando7 gnomeLterminal >omentario7 Abrir terminal en modo gr2(ico
%# Pulsa el botn NAceptarO# =er2s ahoraD el smbolo de la terminal en tu panel supe
rior# *na 5e@ creado el lan@adorD 5amos a continuar instalando Apache# Para ello
D abre una terminalD pulsando una 5e@D sobre el cono del lan@adorD Aue acabas de
crear# *na 5e@ en la terminalD lo primero Aue haremosD ser2 asegurarnos de tener
actuali@ado el sistema operati5o & de esta (ormaD securi@arlo# Para elloD escri
be el siguiente comando7
sudo apt-get update
'eber2s ingresar tu contrasePa # "ientras la escribasD no se mostrar2 ning3n car
2cter en la pantalla Eni siAuiera asteriscosF#
-4B0E !4- >4"A)'4sudo7 te con5ierte en super usuario# Wnico usuario Aue tiene pe
rmisos para instalar paAuetes en tu sistema operati5o# apt-get7 es distribucione
s la utilidad para manejar paAuetes en )*+!inux basadas en 'ebian#
$G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Alternati5amenteD puede utili@ar el comando aptitude en 5e@ de apt-get# update7
opcin de aptLget Aue sincroni@a los archi5os del ndice de paAuetes con los reposit
orios o(iciales Edicho de otra (ormaD obtiene un ndice de actuali@acionesF
*na 5e@ (inali@ada la actuali@acionesD escribe7
sudo apt-get upgrade
sincroni@acin
del
ndice
de
)ue5amente deber2s ingresar tu contrasePa# PosiblementeD deban instalarse actual
i@aciones# EntoncesD te preguntar2 si deseas continuar# 'eber2s pulsar la tecla
y Ede N&esOF & luego la tecla enter & esperar Aue (inalicen las actuali@aciones#
0ecuerda7 siempreD antes de instalar cualAuier paAueteD debes ejecutar pre5iame
nteD los comandos sudo apt-get update & luego sudo apt-get upgrade#
*na 5e@ actuali@ado el sistema operati5oD procederemos a instalar Apache# Para e
lloD escribe el siguiente comando7
sudo apt-get install apache2
-4B0E !4- >4"A)'4install es la opcin de apt-get Aue indica Aue se instalar2 uno o
m2s paAuetes
$C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
apache2 es el nombre del paAuete Aue se instalar2
Ra tenemos el -istema 4perati5o & el ser5idor Web instalado# Para asegurarnos de
Aue Apache estH (uncionandoD 5amos a escribir el siguiente comando en la termin
al7
sudo /etc/init.d/apache2 start
TIP7 Al escribir comandosD nombres de archi5os &+o directorios en la terminalD p
ulsando la tecla de tabulacinD se autocompletan # >uando al pulsar la tecla de ta
bulacinD un pitido es emitidoD puede signi(icar una de dos cosas7 aF Aue el coman
doD nombre de archi5o o directorio no se ha locali@adoV bF la m2s (recuenteD Aue
existen 5arias opciones posibles para autocompletar# Por esoD cuando un pitido
sea emitidoD pulsa la tecla de tabulacin dos 5eces consecuti5as# -i existen 5aria
s opcionesD te las mostrar2 en pantalla#
4tras opciones de Apache7
Iniciar Apache7
sudo /etc/init.d/apache2 start
Apagar Apache7
sudo /etc/init.d/apache2 stop
0einiciar Apache7
89

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
sudo /etc/init.d/apache2 restart
se debe utili@ar siempreD tras reali@ar alguna modi(icacin a Apache# !os cambios
de con(iguracin de Apache D se reali@an modi(icando el archi5o apache2.conf Aue s
e encuentra en el directorio /etc/apache2/# Este archi5oD solo puede modi(icarse
D accediendo a HlD como super usuario7
sudo gedit /etc/apache2/apache2.conf
el comando geditD abrir2 el archi5o con la aplicacin editor de textos# 0ecargar A
pache7
sudo /etc/init.d/apache2 reload
edit7 un
se utili@a generalmenteD cuando un nue5o sitio Web es con(igurado#
It Wor:s;
>uando Apache ha sido instalado e iniciali@adoD podr2s 5er la p2gina de bien5eni
daD ingresando la *0! http7++localhost o http7++$86#9#9#$ en tu na5egador de Int
ernet#
Para abrir el na5egador de Internet D 5e a Aplicaciones X Internet X )a5egador W
eb ,ire(ox # TambiHn puedes abrir escribiendo firefox# ,ire(ox desde la terminal
D
Es posible tambiHnD abrir una *0! en ,ire(ox desde la
8$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
terminalD escribiendo7 firefox http://www.google.com (o la URL a la cual desees
acceder)
Instalacin de "&-<!
E5er seccin7 PHP & "&-<! m2s adelanteF
Instalacin de PHP
Instalar PHP en *buntu es tan simple Aue solo reAuiere un comando# Apro5echaremo
s esta simplicidadD para Nmatar dos p2jaros de un tiroOD e instalarD adem2s de P
HPD PHPL>!I7 un intHrprete de lnea de comando para PHPD Aue nos permitir2 probar
cdigo escrito en este lenguajeD utili@ando un shell interacti5o desde la terminal
# Para instalar PHP & PHPL>!I D escribe7
sudo apt-get install php5 php5-cli
=eri(icando la 5ersin de PHP
En tu terminalD escribe7
php -v
4btendr2s un resultado similar al siguiente7
88

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
eugenia@cocochito:~$ php -v PHP 5.3.2-1u untu!.1! with "uhosin-#atch $cli% $ uil
t: &e 11 2'12 '(:5':!(% )op*right $c% 1++,-2''+ -he #.# /roup 0end 1ngine v2.2.'
3 )op*right $c% 1++4-2'1' 0end -echnologies
>on(igurando el directorio de tu Web !ocal
Por de(ectoD Apache espera Aue los archi5os de tu sitio Web localD se alojen en
el directorio /var/www/D pero trabajar en este directorio puede ser mu& incmodoD
&a Aue solo podr2s acceder a HlD con permisos de super usuario# Para e5itar este
esco&oD tenemos dos (ormas di(erentes de solucionarlo7 4pcin $7 >rear un enlace
simblico Ellamado Nacceso directoO en Windo.sFD en la carpeta /var/www/D Aue redi
reccione hacia la carpeta de tu homeD donde Auieras hospedar los archi5os de tu
Web local# 4pcin 87 "odi(icar el directorio ra@ de tu Web local & establecerlo apu
ntando hacia el directorio de tu home donde Auieras hospedar los archi5os de tu
Web local# Esta segunda opcinD ser2 la (orma Aue elegiremos en este curso# -in pe
rjuicio de elloD aprenderemos sobre como lle5ar adelante la opcin $#

>rear el directorio para tu Web local


Abre una terminal & escribe el comando cd ~ Aue te lle5ar2 directamente a la hom
e de tu usuario & a continuacin escribe el comando pwd Aue te indica en Aue direc
torio te encuentras
8?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
actualmente# 0ecuerda Aue el comando cd sir5e para mo5erte desde la terminalD po
r todos los directorios# =er2s algo como esto7
eugenia@cocochito:/etc/apache2$ cd ~ eugenia@cocochito:~$ pwd /home/eugenia
!o anteriorD indica Aue el directorio de la home de mi usuarioD es /home/eugenia
# El tu&o ser2 /home/nom re5de5tu5usuario# *na 5e@ allD crearemos un directorio l
lamado curso-phpD a (in de almacenar allD todos los archi5os Aue utilicemos en el
curso para luegoD con5ertirlo adem2sD en la home de tu Web local# Para crear el
directorioD escribe lo siguiente7
m6dir curso-php
El comando mkdir es el utili@ado para crear directorios#
"odi(icando el directorio ra@ de tu Web local
En la terminalD na5ega con el comando cd hasta el directorio de Apache donde se
almacenan los archi5os de con(iguracin de los sitios Web hospedados7
cd /etc/apache2/sites-availa le/
A continuacinD lista los archi5os de esa carpeta con el comando ls Eele eseF segu
ido de la opcin -l EeleF Aue te permitir2 listarlos uno debajo del otro Esin la o
pcin -lD se
8%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
mostraran uno al lado del otroF# =er2s algo como lo Aue sigue7
eugenia@cocochito:~$ cd /etc/apache2/sites-availa le/ eugenia@cocochito:/etc/apa
che2/sites-availa le$ ls -l total ! -rw-r--r-- 1 root root +(' 2'11-1'-21 22:12
default
El archi5o default es el Aue modi(icaremos# Para modi(icar el archi5o defaultD n
ecesitamos hacerlo como super usuario & lo abriremos con editD escribiendo7
sudo gedit default
*na 5e@ allD locali@a la lnea Aue establece cu2l ser2 la ra@ de tu Web local7
Document oot /var/www
R modi(cala por7
7ocument8oot /home/tu-usuario/curso-php
A continuacinD el bloAue Aue establece directi5as de con(iguracin especiales para
el directorio ra@ de tu Web local# 'icho bloAueD es el Aue comien@a por7
!Directory /var/www/9
0eempla@a allD php/
/var/www/
por /home/tu-usuario/curso:7irector* /home/tu-usuario/curso-php/9
uarda los cambios & cierra edit# ,inalmenteD tendremos Aue reiniciar Apache para
Aue los cambios se 5ean re(lejados# Para elloD en la terminalD escribe7
8/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
sudo /etc/init.d/apache2 restart
>omo bien comentamos antesD hubiese sido posibleD crear un enlace simblico en /va
r/www/ Aue apuntara a /home/tuusuario/curso-php/# 'e haber optado por esta alter
nati5aD nos hubiHsemos 5alido del comando ln Eele eneF con la opcin -sD destinado
a crear enlaces simblicos Eo s&mlin:sF# >omo la escritura en el directorio /var/
www/ est2 restringida a usuarios con permiso de root Esuper usuariosFD deberamos
haber ejecutado dicho comando anteponiendo el comando sudo# !a sintaxis para cre
ar enlaces simblicos dentro de una carpetaD es7
ln -s destino nombre_del_enlace_simbolico
'onde destino ser2 la ruta completa del directorio Eo archi5oF al Aue Aueremos a
puntarD & nombreBdelBenlaceBsimbolico el NaliasO para ese s&mlin:# Para crear un
enlace simblicoD llamado miwe D dentro del directorio /var/www/ & Aue apunte a /
home/eugenia/cursophp/ deberamos haber hecho lo siguiente7
cd /var/www/ sudo ln -s /home/eugenia/curso-php/ miwe
Entonces cuando accediHramos hubiHsemos estado 5iendo /home/eugenia/curso-php/#
a los
/var/www/miwe / archi5os de
81

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>onociendo PHP
EtiAuetas de apertura & cierre
>omo se explic anteriormenteD existen dos posibilidades para de(inir Aue un archi
5o debe ser interpretado en PHP7# =eremos aAuD las 5entajas & des5entajas de cada
uno de ellos# 4pcin Y$ ErecomendadaF7
!"php // a;u< ir= todo el contenido en lengua>e #.# "#
Esta opcinD se sugiere como alternati5a recomendadaD puesto Aue independientement
e del 5alor establecido en shortBopenBtag en el php#iniD (uncionar2 por de(ecto
& sin necesidad de modi(icar el archi5o php#iniD en cualAuier ser5idor# Por otro
ladoD la utili@acin de esta alternati5aD trae aparejadas las siguientes 5entajas
7 $# Permite la utili@acin de S"! en el ser5idor# El lenguaje S"! utili@a como et
iAuetas de apertura & cierreD ZJ & JX# Alternati5amenteD permite tambiHn ZJxml &
JX# Por lo tantoD utili@ando ZJphp se permite ejecutar cdigo S"! como tal# 8# E5
ita tener Aue embeber$ cdigo S"! dentro de PHP ?# Es una (orma de de(inir un leng
uaje estandar de PHP#
$ Embeber cdigo se re(iere a hacer un print Eo echoF con PHPD para escribir utili
@ando otro lenguaje# Es una de las pr2cticas de programacin m2s desaconsejadasD &
a Aue di(iculta la lectura de cdigo haciendo di(cil la escalabilidad & mantenimien
to de aplicaciones# 86

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A=I-47 Para poder utili@ar S"! Eadem2s de PHPFD se recomienda establecer el 5alo
r de short$open$tag en %ffD en el archi5o php#iniD puesto Aue el 5alor por de(ec
to se encuentra establecido en %n#
4pcin Y87
!" // a;u< ir= todo el contenido en lengua>e #.# "#
Esta alternati5aD representa una (orma abre5iada de las etiAuetas anteriores# *t
ili@arlaD reAuiere de con(igurar el archi5o php#iniD estableciendo el 5alor de s
hort$open$tag a %n#
? -his directive determines whether or not #.# will recogni@e code etween ? :A a
nd A9 tags as #.# source which should e processed as such. BtCs een ? recommende
d for several *ears that *ou not use the short tag Dshort cutD and ? instead to
use the full :Aphp and A9 tag com ination. Eith the wide spread use ? of FGH and
use of these tags * other languages3 the server can ecome easil* ? confused and
end up parsing the wrong code in the wrong context. Iut ecause ? this short cut
has een a feature for such a long time3 itCs currentl* still ? supported for ac
6wards compati ilit*3 ut we recommend *ou donCt use them. ? 7efault Jalue: Kn ?
7evelopment Jalue: Kff ? #roduction Jalue: Kff ? http://php.net/short-open-tag s
hort$open$tag & %n
Puede leer m2s in(ormacin sobre shortBopenBtag en http7++...#php#net+manual+es+in
i#core#phpYini#shortLopenLtag A=I-47
8G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
)tese Aue no existe posibilidad shortBopenBtag en tiempo de ejecucin#
de
modi(icar
>onocer el 5alor actual de shortBopenBtag
Para conocer el 5alor actual de short$open$tagD ejecute el siguiente comando en
una terminal7
php -r Cecho phpinfo$%?C L grep short5open5tag
*na (orma resumida de lo anteriorD puede ser tambiHn7
php -i L grep short5open5tag
dnde el par2metro -i da la misma salida Aue phpinfo'( TambiHn puede buscar este 5
alorD directamente en el archi5o php#ini7
grep short5open5tag /etc/php5/apache2/php.ini
A=I-47 0eemplace )etc)php5)apache2)php.ini php#ini en su ser5idorD de ser necesa
rio# por la ruta del
Instrucciones & estructuras
Existen dos tipos de instrucciones en PHP7 aAuellas instrucciones Aue se ejecuta
n en una 3nica lnea & las estructuras de control Aue almacenan dichas instruccion
es# !as instrucciones simples D siempre deben (inali@ar con un
8C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
punto & coma EVF mientras Aue las estructuras de control D encerrer2n dichas ins
trucciones entre lla5es [ \#
:Aphp estructura de control * instrucciMn 1+ instrucciMn 2+ , A9
Identacin en PHP
PHP es un lenguaje Aue no reAuiere de identacin EsangradoF para ser interpretado#
Por el contrarioD todo el cdigo (uente PHP puede ser escrito sin identacinD aunAu
e estoD es una pr2ctica desaconsejadaD &a Aue al igual Aue el cdigo embebidoD di(
iculta la lectura & la consecuente escalabilidad & mantenimiento de la app#
Estandari@acin de cdigo >omo regla de estiloD se sugiere utili@ar identacin de % es
pacios en blanco & dejar una lnea en blancoD entre estructuras de control#
!a identacinD es utili@ada para di(erenciar estructuras de control & algoritmosD
dentro del cdigo (uente7
:Aphp estructura de control 1 N instrucciMn a? estructura de control 1.1 N instr
ucciMn ? estructura de control 1.1.1 N instrucciMn c? O O
?9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
O
estructura de control 1.2 N instrucciMn d? O
estructura de control 2 N instrucciMn e? O A9
Impresin en pantalla
En PHPD existen 5arias (unciones para imprimir contenido en pantalla# !as dos (u
nciones b2sicas son echo & print# Estandari@acin de cdigo >omo regla de estilo se
sugiere optar por una de ellas & no utili@ar ambas (unciones en una misma app#
:Aphp echo D.ola GundoD? A9
Imprime Hola "undo en pantalla#
:Aphp print DPdiMs GundoD? A9
Imprime Adis "undo en pantalla#
?$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
=ariables & tipos de datos b2sicos
*na 5ariable es elemento destinado a almacenar datos# ]staD puede almacenar dato
s numHricos Eenteros o (lotantesFD cadenes de textoD booleano E5erdadero ^true_
o (also ^(alse_FD etc# *na 5ariable se de(ine Ees decirD se creaFD se le asigna
un 5alor Ees decirD se almacenan datosFD puede modi(icarse Ecambiar de 5alorF &
eliminarse# 'e(inicin de una 5ariable7 !as 5ariables en PHP se de(inen anteponien
do el sigo dlar E`F seguido del nombre Aue se le Auiera dar a esta# )ombre de las
5ariables7 El nombre de HstasD debe guardar ciertas reglas7 -olo pueden comen@a
r por car2cter al(abHtico o guin bajo EBF El nombre puede estar con(ormado por ma
&3sculasD min3sculasD guiones bajos EBF & n3meros
Asignacin de 5alores7 para asignar 5alor a una 5ariableD se coloca el sigo igual
EaF segudio del 5alor# Tipos de datos7 cuando el 5alor de una 5ariableD es una c
adena de textoD HsteD debe escribirse entre comillas dobles EKFD aunAue tambiHn
entre comillas simples EbF# A (in de estandari@ar el cdigoD utili@aremos siempre
comillas dobles para cadenas de texto# Tanto los 5alores numHricos E&a sean
?8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
HstosD n3meros enteros o de coma (lotanteF & los booleanos D no reAuieren ser en
treLcomillados#
A=I-47 Para los n3meros de coma (lotante se utili@a el punto E#F & )4 la coma ED
F
=eamos un 5ariables7
ejemplo
de
de(inicin
&
asignacin
de
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5
'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51
Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? A9
Es posible adem2sD asignar a una 5ariable el 5alor de otra 5ariable7
:Aphp $nom re5de5producto5por5defecto Q D#roducto alimenticioD? -nom.re$producto
& -nom.re$de$producto$por$defecto+ echo $nom re5producto? // imprime: #roducto
alimenticio A9
TambiHn es posibleD insertar el 5alor de una 5ariableD dentro de una cadena de t
exto 7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q /-nom.re$
de$producto$por$defecto en oferta/? echo $nom re5producto? // imprime: #roducto
en oferta A9
??

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Pero IAuH sucede si se necesita concatenar el 5alor de una 5ariable a una cadena
de texto pero sin mediar espaciosJ Por ejemploD si en el caso anteriorD se dese
a Aue `nombreBproducto sea KProductos en o(ertaK# Estos casosD se resuel5en en5o
l5iendo dicha 5ariable entre lla5es7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q D*-nom.re
$de$producto$por$defecto,s en ofertaD? echo $nom re5producto? // imprime: #roduc
tos en oferta A9
En PHPD tambiHn es posible concatenar 5ariables mediante el operador de concaten
acin KpuntoK E#F7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q -nom.re$d
e$producto$por$defecto . / en oferta/? echo $nom re5producto? // imprime: #roduc
to en oferta A9
AunAue esta 3ltima pr2cticaD debe utili@arse responsablementeD puesto Aue en det
erminadas ocasiones puede resultar di(cil de leer & desci(rar la salida (inal Aue
tendr27
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5
'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51
Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5prod
ucto Q /'/ . -codigo$de$producto . /( / . -nom.re$producto . /. Precio0 12D / .
-precio . /.-/+ A9
El ejemplo anteriorD podra resultar m2s legibleD de la siguiente (orma7
?%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5
'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51
Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5prod
ucto Q /'-codigo$de$producto( -nom.re$producto. Precio0 12D -precio.-/+ A9
Para modi(icar una 5ariable D reempla@ando su 5alorD solo basta con reasignarle
datos7
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5
'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51
Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5prod
ucto Q D$$codigo5de5producto% $nom re5producto. #recio: R"7 $precio.-D? echo $de
talles5del5producto? $detalles5del5producto Q DSo ha* detalles definidosD? print
$detalles5del5producto? A9
)ullD var$dump'( e isset'(
)o solo es posible modi(icar el 5alor de una 5ariable# TambiHn es posible7 aF 5a
ciarla manteniendo su tipo7
?/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
:Aphp $producto Q D)oca-)ola x 135 Hts.D? -producto & //+ A9
bF 5aciarla sin conser5ar su tipo7
:Aphp $producto Q D)oca-)ola x 135 Hts.D? -producto & 3144+ A9
cF oD eliminarla EdestruirlaF por completo7
:Aphp $producto Q D)oca-)ola x 135 Hts.D? unset'-producto(+ A9
En todo momentoD PHP nos permite conocer el tipo & 5alor de una 5ariableD median
te la (uncin var$dump'(7
:Aphp $producto Q D)oca-)ola x 135 Hts.D? var$dump'-producto(+ # salida: string(
20) "Coca-Cola x 1,5 Lts." $producto Q DD? var$dump'-producto(+ # salida: string
(0) "" $producto Q SRHH? var$dump'-producto(+ # salida: !LL unset$$producto%? va
r$dump'-producto(+ "# $enerar% &n error, 'a (&e la )ariable *+rod&cto ,a sido de
str&ida -alida: ./. otice: !nde0ined )ariable: +rod&cto ... !LL #" A9
?1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
var$dump'( imprimir2 los resultados en pantalla Etipo & 5alor de una 5ariableFD
pero tambiHnD es posible conocer el tipo de una 5ariable Eno su 5alorFD sin impr
imirlo en pantallaD con gettype'(7
:Aphp $a Q 25? -tipo$a & gettype'-a(+ echo $tipo5a? #im+rimir% integer A9
Es mu& 3til adem2sD saber si una 5ariable ha sido de(inida E& no se ha destruido
con unset'(F & tiene un tipo asignado Ees decirD no es 3144F# Para elloD dispon
es de la (uncin isset'(# Esta (uncinD de5ol5er2 5rue si ha sido de(inida & no es 3
144# 'e lo contrarioD retornar2 6alse7
:Aphp $producto Q D)oca-)ola x 135 Hts.D? echo isset'-producto(+ # retorna 1r&e
$producto Q DD? echo isset'-producto(+ # 2etorna 1r&e $producto Q SRHH? echo iss
et'-producto(+ # retorna 3alse unset$$producto%? echo isset'-producto(+ # retorn
a 3alse A9
I 3144 o unset'(J I>u2l de los dos usarJ >uando una 5ariable &a no es necesariaD
debe priori@arse el uso de unset sobre 3144D &a Aue con unset'(D se libera la
?6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
direccin de la memoria en la cual haba sido escrita dicha 5ariable#
"alas pr2cticas con 5ariablesD Aue a(ectan el uso de memoria
Es posible tambiHnD agregar a una 5ariableD otros datos al (inal de la cadena# P
ara elloD se utili@a el signo punto E#F antecediendo al signo igualdad EaF7
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5
'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51
Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5prod
ucto $detalles5del5producto $detalles5del5producto $detalles5del5producto $detal
les5del5producto $detalles5del5producto $detalles5del5producto Q D$D? .& $codigo
5de5producto? .& D% D? .& $nom re5producto? .& D #recio: R"7 D? .& $precio? .& D
.-D?
echo $detalles5del5producto? A9
Pero esta pr2cticaD reduce el rendimiento de la aplicacinD &a Aue cada instruccinD
ser2 almacenada en una direccin de memoria di(erenteD mientras Aue de la (orma a
nteriorD solo reAuiere una direccin de memoria para su almacenamiento#
?G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4peradores aritmHticos
PHP permite reali@ar operaciones aritmHticas de lo m2s 5ariadas & por consiguien
teD utili@ar PHP Kcomo calculadoraK# Para elloD disponemos de los siguientes ope
radores aritmHticos7 4peradores aritmHticos
Ejemplo
-$a $a T $a $a U $a / $a V $ $ $ $ $
Nombre
Negacin Adicin Sustraccin Multiplicacin Di!isin Mdulo
Resultado
Opuesto de $a. Suma de $a y $b. Diferencia de $a y $b. roducto de $a y $b. "ocie
nte de $a y $b. Resto de $a di!idido por $b.
0e(erencia del manual o(icial de PHP7 http7++...#php#net+manual+es+language#oper
ators#arithmetic#p hp
Haciendo c2lculos con el I=A
:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua G
ineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $preci
o5neto Q $precio5 ruto T $iva? A9
Estandari@acin de cdigo *tili@a nombres descripti5os para las 5ariablesV -i el nom
bre es compuestoD separa cada palabra por un
?C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
guin bajoV Escribe los nombres de 5ariables en min3sculasV >uando debas asignar m
3ltiples 5alores a una 5ariableD utili@a una sola instruccin toda 5e@ Aue sea pos
ibleV *tili@a comillas dobles para encerrar las cadenas de textoD en 5e@ de comi
llas simplesV *tili@a espacios en blanco antes & despuHs de un operador aritmHti
co para (acilitar la lecturaV
sett&pe Iun bug no resuelto o (eature objetableJ
PHPD asume Aue un n3mero encerrado entre comillas es lgicamenteD una cadena de te
xto7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q /33/? var5dump$$a%?C string'2( /33
/
-inembargoD reali@ar2 operaciones aritmHticas de (orma correctaD aunAue alguno d
e los n3merosD sea de tipo string7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q D22D? $ !2 Q 1'? echo $a T $ ?C
)o obstanteD si se intenta reali@ar una operacin aritmHtica con cadenas de textoD
Aue adem2s de n3merosD inclu&an otro caracterD PHPD en 5e@ de (allar & a5isarno
s del errorD pasar2 por alto la 5ariable con(licti5a7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q D122D? $ 1' Q 1'? echo -a 7 -.?C
Existe una (uncin para con5ertir el tipo de una 5ariable
%9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
settype'-varia.le8 /nuevo$tipo/(7
55eugenia51+,45esP855@m*dream:~$ php -a Bnteractive shell php 9 $a Q D22 man@ana
sD? php 9 settype'-a8 /integer/(+ php 9 var5dump$$a%? int$22% php 9
*tili@ando settypeD KpodramosK operaciones aritmHticas seguras7
:Aphp $a Q D22 man@anasD? $ Q 1'? settype'-a8 /integer/(+ echo $a T $ ? # salida
: 45 A9
asegurarnos
reali@ar
-in embargo Iprueba cdigoJ
$a Q Dman@anas 22D? $ Q 1'? sett*pe$$a3 DintegerD%? echo $a T $ ?
Aue
sucede
al
ejecutar
este
A=I-47 )o con(es en settype'( para e(ectuar operaciones aritmHticas# Es pre(eribl
e e5itar su uso para estos casos#
%$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
HT"! & PHP en un mismo archi5o
>omo se coment anteriormenteD es posible Kme@clarK cdigo HT"! con PHPD sin necesid
ad de imprimir etiAuetas HT"! mediante PHP# Es decirD conser5ar la independencia
de ambos lenguajes en el mismo archi5o# El mejor procedimiento para hacer estoD
es comen@ar escribiendo el cdigo HT"! & utili@ando comentarios para recordarnos
dnde debemos insertar el cdigo PHP# En la programacin (uncional o estructuradaD Hst
eD es el mejor mHtodo# Puesto Aue nos aseguraD la ma&or legibilidad posible# =am
os a 5er un ejemplo de aAuello Aue no debe hacerse & sugerir una mejor pr2ctica
#
*na mala pr2ctica7 colocar cdigo HT"! embebido dentro de 5ariables de PHP
:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua G
ineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $preci
o5neto Q $precio5 ruto T $iva? $producto Q D:p9: 9#roducto::/ 9 $$codigo5de5prod
ucto% $nom re5producto: r/9 : 9#recio::/ 9 R"7 $precio5neto.- $BJP incluido%:/p9
D? A9 :Wdoct*pe html9 :html9 :head9 :title97etalles del producto :Aphp echo $nom
re5producto? A9:/title9 :/head9 : od*9 :Aphp echo $producto? A9 :/ od*9 :/html9
%8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
*na buena pr2tica para e5itar lo anterior
:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua G
ineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $preci
o5neto Q $precio5 ruto T $iva? A9 :Wdoct*pe html9 :html9 :head9 :title97etalles
del producto :Aphp echo $nom re5producto? A9:/title9 :/head9 : od*9 :p9: 9#roduc
to::/ 9 $:Aphp echo $codigo5de5producto? A9% :Aphp echo $nom re5producto? A9: r/
9 : 9#recio::/ 9 R"7 :Aphp echo $precio5neto? A9.- $BJP incluido%:/p9 :/ od*9 :/
html9
A=I-47 )tese Aue la instruccin !"&-foo+ "# es una abre5iacin de !"php echo -foo+ "#
la cual solo se ejecutar2 de (orma satis(actoria desde la 5ersin /#% de PHPD aun
Aue el 5alor de short$open$tag sea %ff# En 5ersiones anterioresD se debe utili@a
r !"php echo -foo+ "# o en su de(ectoD establecer en %nD el 5alor de short$open$
tag en php.ini
%?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>omentando & documentando el cdigo (uente
*na de las pr2cticas m2s recomendadasD consiste en KcomentarK el cdigo (uente# >o
mentar el cdigoD signi(ica Kescribir re(erencias sobre el cdigo (uente Aue nos a&u
den a entenderloK# En PHPD existen dos tipos de comentarios7 $# !os comentarios
de una sola lnea 8# !os comentarios de 5arias lneas Eo docstringsF !os comentarios
de una sola lnea D pueden escribirse antecedidos de una doble barra diagonal E++
F o una almohadilla EYF7
:Aphp "" al6c&ota del 789 (en +orcenta:e) $alicuota5iva Q 21? "" ;atos del +rod&
cto $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5''
mlD? $precio5 ruto Q 2.,5? # +recio sin 789 "" C%lc&los relacionados al 789 $iv
a Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? # .recio con 789 incl&
ido A9
4tra utilidad de comentar el cdigo (uenteD es recomendarnos aAuello Aue nos Aueda
por hacer# Para elloD se utili@a la palabra T4'4 Edel inglHs Kto doK Aue en esp
aPol signi(ica Kpor hacerKF al comentario7
:Aphp "" al6c&ota del 789 (en +orcenta:e) $alicuota5iva Q 21? "" ;atos del +rod&
cto $codigo5de5producto Q 124!?
%%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? # +r
ecio sin 789 "" C%lc&los relacionados al 789 $iva Q 2.,5 U 21 / 1''? $precio5net
o Q $precio5 ruto T $iva? # .recio con 789 incl&ido # 5%D% calc&lar desc&entos +
or cantidad A9
En cambioD los comentarios de 5arias lneas se encierran entre )9 & 9) Ecomo en >-D por ejemploF7
:Aphp "" al6c&ota del 789 (en +orcenta:e) $alicuota5iva Q 21? "" ;atos del +rod&
cto $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5''
mlD? $precio5 ruto Q 2.,5? # +recio sin 789 "" C%lc&los relacionados al 789 $iv
a Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? # .recio con 789 incl&
ido "# 5%D% calc&lar desc&entos +or cantidad +ara ello, tener en c&enta los sig&
ientes +orcenta:es de desc&ento: 1 a 5 +rod&ctos: 0< = a 10 +rod&ctos: 2.5< 11 a
25 +rod&ctos: =.2< >%s de 25: 10<
#" A9
%/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Inclusin de archi5os en PHP
PHP nos permite insertar cualAuier tipo de archi5os con (ormato de textoD dentro
de un archi5o PHP# Entre los tipos de archi5os Aue podemos insertar dentro de u
n (ichero #phpD se encuentran aAuellos con las siguientes extensiones7 #phpD #tx
tD #htmD #htmlD entre otros con (ormato de texto# Para insertar archi5osD PHP di
spone de cuatro (unciones7 $# include7 http7++...#php#net+manual+es+(unction#inc
lude#php 8# includeBonce7 http7++...#php#net+manual+es+(unction#includeLonce#php
?# reAuire7 http7++...#php#net+manual+es+(unction#reAuire#php & %# reAuireBonce
7 http7++...#php#net+manual+es+(unction#reAuireLonce#php Estas cuatro (uncionesD
necesitan recibir como par2metro 8D la ruta local o remota del archi5o a ser in
cluido# Ejemplos de inclusin de archi5os locales7
:Aphp include$Darchivo.phpD%? include5once$Darchivo.txtD%? re;uire$Darchivo.html
D%?
8 "2s adelanteD cuando hablemos de (uncionesD 5eremos detenidamente AuH es & par
a AuH sir5e un par2metro# Por el momentoD cuando hablemos de par2metroD entender
emos Aue se trata de un K5alorK Aue debemos pasar+en5iar a una (uncin# %1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
re;uire5once$Darchivo.htmD%? A9
Ejemplos de inclusin de archi5os remotos7
:Aphp include$Dhttp://www.miwe .com/archivo.phpAfooQ arD%? include5once$Dhttp://
www.miwe .com/archivo.phpD%? re;uire$Dhttp://www.miwe .com/archivo.htmlD%? re;ui
re5once$Dhttp://www.miwe .com/archivo.txtD%? A9
'i(erencia entre inclusin de archi5os remotos & locales
*na di(erencia (undamentalD entre incluir archi5os remotos & archi5os localesD e
s Aue los archi5os PHP remotosD ser2n interpretados pre5iamente en el ser5idor d
e origen & Kser5idosK al ser5idor de destino Eel Aue los inclu&eFD &a interpreta
dos# -in embargoD cuando un archi5o PHP local es incluidoD no ser2 pre5iamente i
nterpretadoD sino Aue de esoD se encargar2 el archi5o Aue lo inclu&# Es decirD Au
e si Aueremos incluir el archi5o miB(ichero#php &a interpretado con(orme el 5alo
r del par2metro K(ooKD si utili@amos7
include$Dmi5fichero.phpAfooQ15D%?
PHP arrojar2 un errorD &a Aue buscar2 un archi5o llamado miB(ichero#phpJ(ooa$/ e
n 5e@ de interpretarlo# -in embargoD podremos incluir remotamente para Aue se no
s de5uel5a el archi5o interpretadoD mediante7
include$Dhttp://miwe .com/mi5fichero.phpAfooQ15D%?
%6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
)o obstanteD PHP dispone de una (uncin alternati5a -4!4 para estos casos Einclusin
de archi5os remotos &a interpretadosF Aue incluso permite almacenar los datos r
ecibidos en una 5ariable7
$contenido Q file5get5contents$Dhttp://miwe .com/mi5fichero.phpAfooQ15D%?
'i(erencia entre include & reAuire
-i bien las (unciones reAuireEF e includeEF de PHP reali@an una accin similar Eim
portar un archi5oFD no son iguales# includeEF intenta importar al archi5o indica
do & en caso de no poder hacerloD arroja un error & contin3a ejecutando el resto
del script# -in embargoD la (uncin reAuireEFD cuando no logra importar el archi5
o indicadoD arroja un error & (inali@a sin permitir Aue el resto del script cont
in3e ejecut2ndose#
Include & reAuire KBonceK
!a 3nica di(erencia Aue existe entre include e includeBonce & reAuire & reAuireB
onceD es Aue si el archi5o indicado con KBonceK &a ha sido incluido no 5ol5er2 a
importarse#
%G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Estructuras de >ontrol Parte I EcondicionalesF
'e(inicin
*na estructura de control es un bloAue de cdigo Aue permite tomar decisiones de m
anera din2mica D sobre cdigo existente#
>ondicionales i(D else & else i(
El condicional i(D al igual Aue otras estructuras de controlD permite tomar deci
sionesD partiendo de la base de e5aluar si una determinada condicin se cumple# El
ra@onamiento de condicionales puede representarse como sigue7
si condicion F se cumple N hacer esto O sino3 si condicion X se cumple: N hacer
esto otro O si no se cumple ni F ni X N hacer tal otra cosa O
)o
lo
de
si

necesariamente el condicional debe cumplir la estructura anterior# A 5eces so


es necesario e5aluar una 3nica condicin & tomar una decisin -4!4 sobre la base
si esta condicin se cumple7
condiciMn F se cumple N hacer esto? // fin de la evaluaciMn O

!a sintaxis b2sica para los condicionales en PHPD se resume en7


%C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
if $condiciMn P% N // algoritmo si se cumple condiciMn P O else if $condiciMn I%
N // algoritmo si se cumple condiciMn I O else N // algoritmo si no se cumplen
las condiciones anteriores O
4peradores lgicos & de comparacin
Para e5aluar condicionesD no solo podemos recurrir a si KA es igual a BK# Existe
n otros operadores Aue nos permiten e5aluar di(erentes condiciones# Estos operad
ores se denominan operadores lgicos & son aAuellos Aue nos permiten e5aluar m3lti
ples condiciones en un mismo proceso D mientras Aue se denominan operadores de c
omparacin D a aAuellos Aue utili@amos para e5aluar EcompararF la relacin existente
enntre elementos#
4peradores de comparacin
Ejemplo
#a $$ #%
Nombre
&gual
Resultado
TRUE si $a es igual a $b despu's de la manipulacin de tipos. TRUE si $a es igual
a $b( y son del mismo tipo. TRUE si $a no es igual a $b despu's de la manipulacin
de tipos. TRUE si $a no es igual a $b despu's de la manipulacin de tipos. TRUE s
i $a no es igual a $b( o si no son del mismo tipo. TRUE si $a es estrictamente m
enor ,ue $b. TRUE si $a es estrictamente mayor ,ue $b.
#a $$$ #% &d'ntico #a )$ #% #a *+ #% #a )$$ #% #a * #% #a + #% #a *$ #% #a +$ #%
Diferente Diferente No id'ntico Menor ,ue Mayor ,ue
Menor o igual ,ue TRUE si $a es menor o igual ,ue $b. Mayor o igual ,ue TRUE si
$a es mayor o igual ,ue $b.
/9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
'i(erencia entre igualdad e idHntico en la comparacin
A=I-47 )tese Aue la di(erencia principal entre igualdad EaaF e idHntico EaaaFD es
Aue el primero con5ierte ambos elementos al mismo tipo Eanulando asD la comparac
in de tiposD & arrojando Aue $9 ser2 igual Aue K$9KFD mientras Aue el segundoD co
mpara adem2s si ambos elementos pertenecen al mismo tipo# !o anteriorD tambiHn a
plica a ;a & ;aa # =eamos algunos ejemplos7
$a $ $c $d $e $a $a $a $a Q Q Q Q Q 1'? D1'D? 11? '? &alse? -rue &alse &alse -ru
e $d $d $d $d QQ $e QQQ $e WQ $e WQQ $e -rue &alse &alse -rue
QQ $ QQQ $ WQ $ WQQ $
4peradores lgicos
Ejemplo
#a and #% #a or #% #a -or #% ) #a #a // #% #a 00 #%
Nombre
And (y) Or (o inclusi!o) .or (o e-clusi!o) Not (no) And (y) Or (o inclusi!o)
Resultado
TRUE si tanto $a como $b son TRUE. TRUE si cual,uiera de $a o $b es TRUE. TRUE s
i $a o $b es TRUE( pero no am%os. TRUE si $a no es TRUE. TRUE si tanto $a como $
b son TRUE. TRUE si cual,uiera de $a o $b es TRUE.
En el manual o(icial de PHP http7++...#php#net+manual+es+language#operators#logi
cal#phpD
/$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
podemos 5er una le&enda Aue dice7 "La razn para tener las dos variaciones diferen
tes de los operadores "and" y "or" es que ellos operan con precedencias diferent
es." !o ciertoD es Aue tanto el operador and como el operador cc poseen una prec
edencia i@Auierda Ees decirD Aue la condicin es e5aluada de i@Auierda a derechaF
& lo mismo sucede con or & dd#
>reando condicionales
E5aluando una 3nica condicin7
$a Q 1'? if $$a QQ 1'% N echo DY$a es igual a 1'D? O
Bniciar P en 1' si $P es igual a 1'%3 entonces imprimir CP es igual a 1'C
4 tambiHnD tomar una decisin si la condicin se cumple & otra si no se cumple7
$a Q 1'? if $$a QQ 1'% N echo DY$a es igual a 1'D? O else N echo DY$a SK es igua
l a 1'D? O
TambiHn podemos conbinar else e i(D para tomar tantas decisiones como condicione
s Auieran e5aluarse7
/8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$a Q 15? if $$a QQ 1'% echo DY$a O else if $$a echo DY$a O else if $$a echo DY$a
O
N es QQ es QQ es
igual a 1'D? 12% N igual a 12D? 15% N igual a 15D?
R si a lo anterior le agregamos else estaramos cubriendo todas las posibilidades7
$a Q 15? if $$a QQ 1'% echo DY$a O else if $$a echo DY$a O else if $$a echo DY$a
O else N echo DY$a O N es QQ es QQ es
igual a 1'D? 12% N igual a 12D? 15% N igual a 15D?
SK es ni 1' ni 12 ni 15D?
A=I-47 -e debe tener especial cuidado en la comparacin de n3meros reales E(lotant
esF# =eremos esto con detenimiento m2s adelante# Para ma&or in(ormacinD 5isitar l
a documentacin o(icial en7
http7++...#php#net+manual+es+language#t&pes#(loat#phpYlanguage #t&pes#(loat#comp
arison
/?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Estructuras de control con -.itch
-.itch es una de las estructuras de controlD Aue mejor se disponen para programa
r la toma de decisiones basadas en la comparacin de un 3nico elemento# -.itch se
asemeja sutilmente a la e5aluacin de condiciones mediante Kelse i(KD pero di(eren
ci2ndose notablemente por su aplicacin en la pr2cticaD &a Aue es 5erdaderamente 3
til en aAuellos casos donde la utili@acin de else i( resulte redundante# B2sicame
nteD con -.itchD lo Aue hacemos es e5aluar una 3nica expresin o 5ariableD & tomar
di5ersas decisiones en base a los di(erentes posibles 5alores de la misma7
$numero5dia Q date$CSC%? "# la 0&nci?n nati)a date() de ./., +ermite dar 0ormato
a la 0ec,a local , retorna &n n@mero de 1 a A, (&e re+resenta el n@mero de d6a
de la semana, siendo 1 L&nes ' A domingo. Bsta 0&nci?n, ser% )ista con detenimie
nto, m%s adelante. .ara ma'or in0ormaci?n, )isitar la doc&mentaci?n o0icial en ,
tt+:""CCC.+,+.net"man&al"es"0&nction.date.+,+ #" $nom re5dia Q CC? switch $$nume
ro5dia% N case 1: $nom re5dia Q DHunesD? rea6? case 2: $nom re5dia Q DGartesD? r
ea6? case 2: $nom re5dia Q DGiZrcolesD? rea6? case !: $nom re5dia Q D[uevesD? re
a6?
/%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
case 5: $nom re5dia Q DJiernesD? rea6? case (: $nom re5dia Q D"= adoD? rea6? cas
e ,: $nom re5dia Q D7omingoD? rea6? default: $nom re Q DSo sa emos ;ue d<a esD?
O
El (uncionamiento de s.itch puede resultar complejo de entender en un comien@o#
Pero 5a a ir paso a paso# -.itch tiene una sintaxis b2sica Aue se compone de7
switch $$varia le% N case Dposi le valor 1D: "" algoritmo a e:ec&tar si *)ariabl
e DD "+osible )alor 1" rea6? case Dposi le valor 2D: "" algoritmo a e:ec&tar si
*)ariable DD "+osible )alor 5" rea6? default: "" algoritmo a e:ec&tar si )alor n
o ,a sido contem+lado en "" ning@no de los case anteriores O
>ada case representa un KcasoK Eel posible 5alor Aue pueda retornar la 5ariable
e5aluadaF# !a palabra cla5e reser5ada brea:D KrompeK la ejecucin de la estructura
# Es decirD Aue cuando un case es e5aluado como 5erdaderoD tras ejecutar el algo
ritmo de ese caseD la palabra cla5e reser5ada brea: indica la (inali@acin de toda
la estructura Ees decirD no se contin3an e5aluando los siguientes KcaseK#
//

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!a palabra cla5e reser5ada de(aultD contendr2 el algoritmo a ser ejecutadoD cuan
do la e5aluacin de todos los KcaseK anterioresD ha&a sido ,alse# A (in de e5itar
la redundancia en el cdigo Epor ejemploD si se debiara aplicar el mismo algoritmo
a dos o m2s 5alores distintosFD s.itch nos permite agrupar los casos7
switch $$varia le% N case Dposi le valor 1D: case Dposi le valor 2D: case Dposi
le valor 2D: "# algoritmo a e:ec&tar si el )alor de *)ariable es +osible )alor 1
, +osible )alor 2 o +osible )alor 5 #" rea6? case Dposi le valor !D: "# algoritm
o a e:ec&tar si el )alor de *)ariable es +osible )alor 4 #" rea6? default: "" al
goritmo a e:ec&tar si )alor no ,a sido contem+lado en "" ning@no de los case anter
iores O
I>u2ndo utili@ar i( & cuando s.itchJ
-i bien el uso de una u otra estructuraD depender2 de la desicin de cada programa
dorD existe un sentido lgico Aue debe priori@arse para decidir su uso# Para elloD
ha& Aue tener en cuenta Aue7 i( nos sir5e para e5aluar KcondicionesK & comparar
m3ltiples elementosD mientras Aue s.itchD solo permite la e5aluacin de un 3nico
elemento o expresin# Por lo tantoD toda 5e@ Aue solo se reAuiera la e5aluacin de u
n 3nico elemento o expresinD se ma&ormente Econ ciertas excepcionesFD se utili@ar
2 s.itch & se optar2 por i(D cuando el uso de s.itch no sea posible#
/1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
/6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Tipos de 'atos complejos7 "atrices simples & multidimensionales
"atrices en PHP
*na matri@ Earra&F es un mapa de datos ordenado Aue asocia Kcla5esK a sus 5alore
s correspondientes# Es asD Aue estas matricesD nos son de gran utilidad para crea
r desde diccionarios de datos hasta 2rboles de m3ltiples diccionarios#
-intaxis b2sica
!a sintaxis b2sica se compone de7
arra*$clave Q9 valor3 %?
'onde cla5eD puede ser un entero7
$nom res5de5mu>er Q arra*$' Q9 CPnaC3 1 Q9 C/a rielaC3 2 Q9 C)eciliaC3 %?
4 una cadena de texto 7
$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3 C[avierC Q9 C!+21 \ 12''C
3%?
R 5alorD cualAuier tipo de dato7
/G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$datos5de5>uan Q arra*$CapellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+
,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,252'C3 C-ra
a>oC Q9 C!('!+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %?
!a (orma para declarar un arra&D es simplemente asignarlo a una 5ariableD tenien
do en cuentaD Aue un arra&D puede estar inicialmente 5aco7
$mi5arra* Q arra*$%?
Imprimir en pantalla con printBr
Para imprimir una matri@ completa en pantalla D se puede utili@ar la (uncin print
$r'-array(7
php 9 $arra* Q arra*$' Q9 CPnaC3 1 Q9 C/a rielaC3 2 Q9 CSoeliaC3%? php 9 print$r
'-array(+ Prra* $ ]'^ Q9 Pna ]1^ Q9 /a riela ]2^ Q9 Soelia % php 9
Acceso a los tems de un arra&
Para acceder a un item del arra& D se puede reali@ar haciendo una llamada a su c
la5eD o por su n3mero de ndice En3mero de almacenamiento internoFD siendo : Ecero
F el primero7
$apellidos Q arra*$CPnaC Q9 C8odrigue@C3 CGarcosC Q9 C/Mme@C3%? echo $apellidos]
CPnaC^? "" im+rime 2odrig&eE echo $apellidos]1^? "" im+rime $?meE
/C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A=I-47 !a sintaxis b2sica para acceder -array;indice< o -array;=clave=< a un arr
a& es
!os 5alores de un arra&D pueden no tener una cla5e explcitamente asociada 7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%?
En ese casoD siempre se acceder2 a ellos por su n3mero de ndice7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? echo $mi5arra*]2^? "" i
m+rimir% F&lia
"odi(icando elementos
Para modi(icar un elementoD basta con acceder a Hste & asignare un nue5o 5alor7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? $mi5arra*]2^ Q CFimenaC
? echo $mi5arra*]2^? "" im+rimir% Gimena
Agregar elementos
Para agregar un 5alor a un arra& existenteD se asigna Hste a un ndice 5aco7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? $mi5arra*]^ Q C)eciliaC
? print5r$$mi5arra*%?
El nue5o 5alorD ser2 agregado al (inal de la lista7
19

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
php 9 print5r$$mi5arra*%? Prra* $ ]'^ Q9 Pna ]1^ Q9 /a riela ]2^ Q9 [ulia ]2^ Q9
Soelia ]!^ Q9 )ecilia %
Pero si se desea asociar dicho 5alor a una cla5e D Hsta debe indicarse7
$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3 C[avierC Q9 C!+21 \ 12''C
3%? $telefonos5de5amigos]CHuisC^ Q C!221-5'12C? $telefonos5de5amigos]C)arlosC^ Q
C15 222+-'!22C?
A'=E0TE)>IA sobre cla5es de matrices7 Al usar T0*E como cla5eD el 5alor ser2 e5a
luado al integer $# Al usar ,A!-E como cla5eD el 5alor ser2 e5aluado al integer
9# Al usar )*!! como cla5eD el 5alor ser2 e5aluado a un string 5aco# El uso de un
string 5aco como cla5e D crear2 Eo reempla@ar2F una cla5e con un string 5aco & su
5alorV no es lo mismo Aue usar corchetes 5acos #
=ale aclarar adem2sD Aue si por error intentamos agregar un nue5o elementoD usan
do como cla5e o como ndiceD alguna cla5e o ndice existenteD estaramos "4'I,I>A)'4 d
icho elemento en 5e@ de estar agregando uno nue5o#
1$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Estructuras de >ontrol Parte II Ebucles IF
0ecorriendo matrices din2micamente con (oreach
6oreach es un constructor nati5o de PHPD Aue permite reali@ar operaciones iterat
i5as EcclicasF con matricesD recorriendo uno a uno los elementos de una matri@D c
omen@ando por el primer elemento#
-intaxis b2sica del constructor (oreach
foreach$$arra* as $valor5del5elemento% N "" algoritmo a realiEar con cada &no de
los elementos O
'nde -array ser2 el nombre de la matri@ a ser iterada & -valor$del$elementoD un n
ombre Aue utili@aremos como identi(icador del elementoD el cual retornar2 su 5al
or7
$nom res5propios Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPl ertoC3 C)eciliaC3 C)arlosC
3%? foreach$$nom res5propios as $nom re% N echo $nom re . chr$1'%? O "# -alida:
9na F&lia L&isa 9lberto Cecilia Carlos #"
18

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Es posible tambiHnD iterar obteniendo las cla5es de cada elementoD adem2s de su
5alor# Para elloD se utili@a la siguiente sintaxis7
foreach$$arra* as $clave Q9 $valor% N "" algoritmo a e:ec&tar en cada iteraci?n
O
*n ejemplo de iteracin compleja con foreach
$datos5de5>uan Q arra*$CPpellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+
,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,-252'C3 C-ra
a>oC Q9 C!('!-+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %? foreach$$datos
5de5>uan as $titulo Q9 $dato% N if$Wis5arra*$$dato%% N if$$dato QQQ -rue% N $dat
o Q C"BC? O else if $$dato QQQ &alse% N $dato Q CSKC? O echo DN$tituloO: N$datoO
D . chr$1'%? O else N foreach$$dato as $tipo5telefono Q9 $numero% N echo D-elZfo
no N$tipo5telefonoO: N$numeroOD . chr$1'%? O O O "# 9+ellido: .reE 3ec,a de naci
miento: 25-11-1HA0 1elI0ono Casa: 4510-H050 1elI0ono >?)il: 15 401A-2550 1elI0on
o 1raba:o: 4=04-H000 Casado: -7 .asa+orte: J #"
1?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A=I-47 !a (uncin is$array'-array( nos permite e5aluar una 5ariable & conocer si s
u tipo es Karra&K# 'e5uel5e 5 1> si e(ecti5amente es un arra& & 6?42> en caso co
ntrario#
"odi(icando matrices din2micamente con (oreach
En el ejemplo anteriorD e5al3abamos si el dato recibido era True o ,alseD asigna
ndo un nue5o 5alor a Hste E-I para True & )4 para ,alseF# PeroD si tras (inali@a
r el bucleD hiciHramos un print$r'( a -datos$de$@uanD el 5alor de la cla5e Kcasa
doK continuara siendo TrueD mientras Aue el de KPasaporteKD ,alse7
php 9 print5r$$datos5de5>uan%? Prra* $ ]Ppellido^ Q9 #re@ ]&echa de nacimiento^
Q9 22-11-1+,' ]-elfonos^ Q9 Prra* $ ])asa^ Q9 !21'-+'2' ]Gvil^ Q9 15 !'1,-252' ]
-ra a>o^ Q9 !('!-+''' % ])asado^ Q9 1 ]#asaporte^ Q9 %
Es decirD Aue ese datoD solo (ue modi(icado en un 2mbito localD el cual aplica s
olo a esa estructura de control# Pero IAuH sucede si Aueremos modi(icar globalme
nte los 5alores de los elementos de una matri@J PHPD nos (acilita esa opcinD asig
nando
1%
el
5alor
por

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
re(erencia# *na asignacin por antecediendo el signo c al 5alor7
re(erenciaD
se
reali@a
$datos5de5>uan Q arra*$CPpellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+
,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,-252'C3 C-ra
a>oC Q9 C!('!-+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %? foreach$$datos
5de5>uan as $titulo Q9 A-dato% N if$Wis5arra*$$dato%% N if$$dato QQQ -rue% N $da
to Q C"BC? O else if $$dato QQQ &alse% N $dato Q CSKC? O echo DN$tituloO: N$dato
OD . chr$1'%? O else N foreach$$dato as $tipo5telefono Q9 $numero% N echo D-elZf
ono N$tipo5telefonoO: N$numeroOD . chr$1'%? O O O
-i tras el caso anteriorD hiciHramos un printBrEF notaramos Aue los 5alores de K>
asadoK & KPasaporteK han modi(icado su 5alor & su tipo7
php 9 print5r$$datos5de5>uan%? Prra* $ ]Ppellido^ Q9 #re@ ]&echa de nacimiento^
Q9 22-11-1+,' ]-elfonos^ Q9 Prra* $ ])asa^ Q9 !21'-+'2' ]Gvil^ Q9 15 !'1,-252' ]
-ra a>o^ Q9 !('!-+''' % ;Basado< &# 2C ;Pasaporte< &# 3%
%
!a asignacin por re(erencia D suele ser mu& 3tilD cuando por ejemploD se necesita
aplicar una misma (uncinD a todos los elementos de un arra& Epor ejemploD con5er
tir a ma&3sculas
1/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
todos los 5aloresD con la (uncin strtoupper'(D nati5a de PHPF7
$nom res Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPl ertoC3 C)eciliaC3 C)arlosC3%? fore
ach$$nom res as _$nom re% N $nom re Q strtoupper$$nom re%? O print5r$$nom res%?
"# 9rra' ( K0L DM 9 9 K1L DM F!L79 K2L DM L!7-9 K5L DM 9LNB21J K4L DM CBC7L79 K5
L DM C92LJ) #"
11

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Estructuras de >ontrol Parte III Ebucles IIF
WhileD un bucle simple
As como foreach puede parecer uno de los bucles m2s complejosD whileD resulta ser
el m2s simple de todos# DhileD simplemente e5aluar2 de (orma booleana Etrue o (
alseF una expresin de iterati5amenteD hasta Aue la expresin e5aluada retorne 6alse
D & parar2# -u sintaxis es la siguiente7
while $expresiMn% N "" algoritmo a e:ec&tar ,asta ex+resi?n retorne 3alse O
4 dicho de (orma humanamente legible7
mientras ;ue $esta condiciMn se cumpla% N hacer esto O
*n ejemplo sencillo
$n Q '? while $$n :Q 5% N echo $n . chr$1'%? $nTT? "" incremento el )alor de *n
en 1. B(&i)ale a *n D * O 1P O
!ectura humana7
iniciar S en cero
16

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
mientras ;ue $S sea menor o igual a 5% N imprimir S incrementar S O
*n ejemplo pr2ctico
$*ears Q arra*$%? $*ear Q 1++'? while $$*ear :Q 2'''% N $*ears]^ Q $*ear? $*earT
T? O print5r$$*ears%? "# 9rra' ( K0L DM 1HH0 K1L DM 1HH1 K2L DM 1HH2 K5L DM 1HH5
K4L DM 1HH4 K5L DM 1HH5 K=L DM 1HH= KAL DM 1HHA KQL DM 1HHQ KHL DM 1HHH K10L DM
2000 ) #"
=ale la pena hacer notarD Aue si al iniciar una iteracin con .hileD la primera ex
presin es (alsaD no se continuar2 ejecutando el bucle7
$*ears Q arra*$%? $*ear Q 1++'? while $$*ear : 1++'% N $*ears]^ Q $*ear? $*earTT
? O print5r$$*ears%?
1G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"# 9rra' ( ) #"
'o .hileD tan simple como .hile pero con una 5entaja
El bucle doL.hile esD como indica el ttuloD tan simple como .hile & (unciona de m
anera pr2cticamente idHntica# !a 3nica di(erenciaD el algoritmo iterati5o se eje
cutar2 s o sD una 5e@ al comien@o & luegoD e5aluar2 la expresinD & 5ol5er2 a ejecut
ar el algoritmo si la expresin es 5erdadera# -u sintaxis es la siguiente7
do N "# algoritmo a e:ec&tarse al +rinci+io de la iteraci?n ' toda )eE (&e ex+re
si?n sea )erdadera #" O while $$expresion%?
!ectura humana7
hacer N esto3 la primera * ve@ * luego hacerlo... O mientras ;ue $esta condiciMn
se cumpla%?
*n ejemplo simple
$*ears Q arra*$%? $*ear Q 1++'? do * $*ears]^ Q $*ear?
1C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$*earTT? , while $$*ear : 1++'%? print5r$$*ears%? "# 9rra' ( K0L DM 1HH0 ) #" pr
int $*ear? // 1++1
69

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Bucles (orD los m2s complejos de PHP
!os bucles (or son los ciclos iterati5os m2s complejos de los cu2les se dispone
en PHP# ]stosD e5al3an ? expresiones en cada iteracinD siguiendo este esAuema7 Pr
imera expresin7 se ejecuta incondicionalmente al comien@o del bucleV -egunda expr
esin7 se e5al3a como 5erdadera o (alsa al inicio de cada iteracin# El bucle contin
3aD solo si es 5erdadera# Tercera expresin7 se ejecuta al (inal de cada iteracin

-intaxis7
for $expresion1? expresion2? expresion2% N // algoritmo ;ue se e>ecuta cuando ex
presion2 es verdadera O
*n ejemplo7
for $$i Q '? $i :Q 2? $iTT% N echo $i . chr$1'%? O "# 0 1 2 5 #"
>ada una de las expresionesD puede contener m3ltiples expresionesD las cuales de
ber2n ir separadas por una coma7
6$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
for $$i Q 13 $prefi>o Q D)odigo S` '''D? $i :Q !? $sufi>o Q chr$1'%3 $iTT% N ech
o DN$prefi>oON$iON$sufi>oOD? O "# Codigo Codigo Codigo Codigo #" R R R R 0001 00
02 0005 0004
A=I-47 Al utili@ar expresiones m3ltiplesD se debe tener en cuentaD Aue las expre
siones m3ltiples en la segunda expresin son e5aluadasD pero el resultado solo se
toma de la 3ltima parte#
*n ejemplo absurdoD pero Aue gra(ica el a5iso anterior7
for $$i Q 13 $prefi>o Q D)odigo S` '''D? -i !& E8 -i ! 2+ $sufi>o Q chr$1'%3 $iT
T% N echo DN$prefi>oON$iON$sufi>oOD? O "# Codigo #" R 0001
)o obstanteD es posible Aue puedan coexistir expresiones 5acas7
for $$i Q 13 $prefi>o Q D)odigo S` '''D3 $sufi>o Q chr$1'%? + $iTT% N if $$i 9 !
% N rea6? O echo DN$prefi>oON$iON$sufi>oOD? O "# Codigo Codigo Codigo R 0001 R 0
002 R 0005
68

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Codigo #"
R 0004
A=I-47 -i la segunda expresin est2 5aca D el bucle ser2 corrido de (orma inde(inid
aD moti5o por el cualD debe utili@arse en alg3n puntoD la expresin brea: E5ista e
n s.itchF# 'e lo contrarioD podra producirse un desbordamiento de la memoria# Est
oD es debido a Aue PHPD considera la expresin 5aca como True Eal igual Aue >F#
6?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>uriosidades sint2cticas de la bipolaridad no diagnosticada de PHP
<ueremos a PHP & por eso lo usamos IciertoJ Pero aAuello de Aue Kel amor es cieg
oKD es bastante relati5oD cuando lo Aue nos gua como programadoresD es la lgica# R
es allD cuando nos encontramos con Aue PHPD pareciera ser KbipolarK &D seg3n su
2nimoD la sintaxis de las estructuras de controlD pueden escribirse de dos (orma
s7 la Aue &a conocemos &### esta de aAu7
if$$#.# QQ Des ipolarD%0 echo DSo te aconse>o utili@ar esta sintaxis :7D? endif+
R a 5ecesD est2 un poco deprimido7
if$$#.# QQ Des ipolarD%0 echo DSo te aconse>o utili@ar esta sintaxis :7D? else i
f $$#.# QQ Dest= en su fase depresivaD%: echo /%hF 3oF De.iste utiliGar elseif s
in separaciHnF ?hora fallarIF/+ endif+
Por curiosidadD el ejemplo anterior pero sin (allas7
if$$#.# QQ Des ipolarD%0 echo DSo te aconse>o utili@ar esta sintaxis :7D? elseif
$$#.# QQ Dest= en su fase depresivaD%0 echo DK6. Rsemos elseif sin separaciMn a
s< no se eno>aD? else0 echo DXa podemos volver a utili@ar llavesD? endif+
M4hD no; >on .hile tambiHn sucede;
while $$i : 1'%0 echo DX a;u< tenemos un #.# man<acoWD? endwhile+
6%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
R tal cual lo imaginasD e(ecti5amenteD con (or & (oreachD PHP puede ser Nbipolar
O# I)o me creesJ "ira esto;
for $$i Q '? $i : 2? $iTT%0 echo $i . chr$1'%? endfor+ $arra* Q arra*$13 23 2%?
foreach$$arra* as $a%0 echo $a . chr$1'%? endforeach+
otoD si lo usas### es tu eleccin;
-i todo lo anteriorD te dej la (rase Nno Auera saber tantoOD rondando en tu cabe@a
D sabr2s disculparmeD pero debo contarte tambiHn sobre goto EaunAue entre nosD a
5eces puede ser 3tilF# goto es un NoperadorO al Aue podramos llamar N operador s
int2cticoOD Aue se utili@a para Nsaltar O a una @ona espec(ica del programa# El p
unto de destino es especi(icado mediante una etiAueta seguida de dos puntos & la
instruccin es dada como goto seguida de la etiAueta del destino deseado# Joto po
dra reempla@ar en ocasionesD el uso de brea:D puesto Aue solo puede ser utili@ado
dentro de una misma estructura & con 5arias restricciones#
*n ejemplo no Lpr2ctico para entender goto
:Aphp echo D.ola GundoWD? goto mi5eti;ueta? echo D1sto no se mostrar=3 *a ;ue go
to lo saltar=D?
6/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
mi$etiKueta0 echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%? echo DX esta tam
iZnWD . chr$1'%? A9
!o anteriorD generar2 la siguiente salida7
eugenia@cocochito:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mos
trado N esta tam.iOnF eugenia@cocochito:~/cursophp asico$
-in embargoD al no tener las etiAuetas de(inidasD un identi(icador de cierre &D
PHPD ser un lenguaje Aue no reAuiere de identacin para la de(inicin de estructuras
D todo el cdigo escrito debajo de una etiAuetaD ser2 ejecutado cuando goto sea ll
amado7
:Aphp echo D.ola GundoWD? goto mi5eti;ueta? echo D1sto no se mostrar=3 *a ;ue go
to lo saltar=D? mi5eti;ueta: echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%? o
tra$etiKueta0 echo Dmmmm... esta tam iZn se muestra :/D . chr$1'%? A9
R aAuD la prueba7
eugenia@cocochito:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mos
trado mmmm... esta tam.iOn se muestra 0) eugenia@cocochito:~/cursophp asico$
61

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Por lo tantoD utili@ar gotoD puede ser engorroso &a Aue para e5itar lo anteriorD
deberan especi(icarse m2s & m2s etiAuetas & m2s & m2s gotos7
:Aphp echo D.ola GundoWD? goto mi5eti;ueta? echo D1sto no se mostrar=3 *a ;ue go
to lo saltar=D? mi5eti;ueta: echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%? g
oto ya$.asta$de$e@ecutarse+ otra5eti;ueta: echo DPhora *a no vo* a imprimirmeWD
. chr$1'%? ya$.asta$de$e@ecutarse0 exit$%? A9
>omo se 5e a continuacinD esta 5e@D lo logramos7
eugenia@cocochito:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mos
trado eugenia@cocochito:~/cursophp asico$
Puedes 5er m2s sobre gotoD le&endo la documentacin o(icial7 http7++...#php#net+ma
nual+es+controlLstructures#goto#php
66

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
,unciones de(inidas por el usuario
'e(inicin
*na (uncinD es una (orma de agrupar expresiones & sentencias EalgoritmosF Aue rea
licen determinadas accionesD pero Aue HstasD solo se ejecuten cuando son llamada
s Eal igual Aue las (unciones nati5as de PHPF#
'eclarando ,unciones
-intaxis b2sica
!a sintaxis b2sica de una (uncinD es 5erdaderamente sencilla7
function nom re5de5la5funcion'parametros( * "" algoritmo ,
-obre el nombre de las (unciones
Para el nombre de las (uncionesD aplica todo lo dicho para el nombre de 5ariable
s#
-obre los par2metros
*n par2metro es un 5alorD Aue la (uncin espera a (in de ejecutar acciones en base
al mismo# *na (uncin puede esperar uno o m2s par2metros EAue ir2n separados por
una comaF o ninguno#
6G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
function nom re5de5la5funcion'parametroP8 parametro2( * "" algoritmo , function
otra5funcion'( * "" algoritmo ,
!os par2metrosD se indican entre los parHntesisD a modo de 5ariablesD a (in de p
oder utili@arlos como talD dentro de la misma (uncin7
function nom re5de5la5funcion'-parametroP8 -parametro2( * "" algoritmo ,
Adem2sD a cada par2metroD se le puede asignar un 5alor por de(ecto de cualAuier
tipo7
function nom re5de5la5funcion'-nom.re8 -edad&258 -seQo&=6=( * "" algoritmo ,
!lamando a una (uncin
*na (uncin no ser2 ejecutada nuncaD hasta Aue no se la llame7
:Aphp function hola5mundo$% N echo D.ola GundoWD . chr$1'%? O A9
)inguna salida ser2 obtenida de lo anteriorD puesto Aue la (uncinD no ha sido lla
mada7
eugenia@cocochito:~$ php -f file.php eugenia@cocochito:~$
6C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Para llamar a una (uncin D simplemente debe especi(icarse su nombreD en el lugar
preciso donde se desea Aue Hsta se ejecute# -iempre deben incluirse los parHntes
is en las llamadasD incluso aunAue no reAuieran Aue un par2metro les sea pasado7
:Aphp function hola5mundo$% N echo D.ola GundoWD . chr$1'%? O hola$mundo'(+ A9
Ahora sD se obtendr2 el resultado de la ejecucin de la (uncin7
eugenia@cocochito:~$ php -f file.php Hola LundoF eugenia@cocochito:~$
-obre la (inalidad de las (unciones
*na (uncinD puede tener cualAuier tipo de algoritmo & cualAuier cantidad de ellos
&D utili@ar cualAuiera de las caractersticas 5istas hasta ahora# )o obstante ell
oD una buena pr2cticaD indica Aue la (inalidad de una (uncinD debe ser reali@ar u
na 3nica accinD reutili@able & por lo tantoD tan genHrica como sea posible#
Paso de 5ariables por re(erencia en (unciones
Al igual Aue en el bucle (oreachD es posible pasar 5ariables por re(erencia a un
a (uncin#
G9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Para elloD al de(inirse la (uncinD debe colocarse el signo NcO antecediendo a aAu
ellos par2metros Aue hagan re(erencia a una 5ariable global7
"" de0inimos &na )ariable de %mbito global -mi$varia.le$glo.al Q 1'? "" de0inimo
s &na 0&nci?n (&e modi0icar% la )ariable global function modificar5varia le5glo
al$A-varia.le3 $otro5parametro% N $varia le Q $varia le U $otro5parametro? O ""
llamamos a la 0&nci?n +asando como re0erencia la )ariable global modificar5varia
le5glo al$-mi$varia.le$glo.al3 2%? "" im+rimimos la )ariable global echo -mi$va
ria.le$glo.al? "" salida: 20
"odi(icando 5ariables globales mediante el uso de glo.al
En PHPD es posible tambiHnD modi(icar una 5ariable de 2mbito globalD sin necesid
ad de pasarla como re(erencia# Para elloD dentro de la (uncinD se har2 re(erencia
a la 5ariable global a ser utili@adaD mediante el uso de la palabra cla5e Nglob
alO# El siguiente ejemploD es sinnimo del anterior7
"" de0inimos &na )ariable de %mbito global -mi$varia.le$glo.al Q 1'? "" de0inimo
s la 0&nci?n (&e ,ar% re0erencia a la )ariable global function modificar5varia l
e5glo al$$otro5parametro% N glo.al $mi5varia le5glo al? $mi5varia le5glo al Q $m
i5varia le5glo al U $otro5parametro? O "" llamamos a la 0&nci?n modificar5varia
le5glo al$2%? "" im+rimimos la )ariable global echo -mi$varia.le$glo.al? "" sali
da: 20
G$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A=I-4 )tese Aue si la 5ariable global a la cual se hace re(erencia dentro de la (
uncinD no ha sido declarada pre5iamenteD glo.al -mi$varia.le crear2 la 5ariable g
lobal `miB5ariable#
!lamadas de retorno
En PHPD es posible Eal igual Aue en la gran ma&ora de los lenguajes de programacin
FD llamar a una (uncin dentro de otraD de (orma (ija & de la misma manera Aue se
la llamaraD desde (uera de dicha (uncin7
function mi5funcion$$parametro% N mi5otra5funcion$%? $una5varia le Q otra5funcio
n5mas$$parametro%? O
-in embargoD es posible Aue se desee reali@ar dicha llamadaD de manera din2micaD
es decirD desconociendo el nombre de la (uncin a la Aue se desear2 llamar# A est
e tipo de accionesD se las denomina llamadas de retorno# En una llamada de retor
noD el nombre de la (uncin a la cual se desea llamarD es pasado como una cadena d
e texto & para elloD se utili@a la (uncin nati5a de PHPD
call$user$func'=nom.re$de$la$funcion$a$llamar=(#
"" 3&nci?n (&e llamarI desde otra 0&nci?n function decir5hola$% N return D.ola G
undoWD? O "" 3&nci?n (&e ,ar% la llamada de retorno function llamar5a5otra$$func
ion% N
G8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
echo call$user$func$$funcion%? echo chr$1'%? "" contin&aci?n del algoritmo O lla
mar5a5otra$=decir$hola=%?
Pasar argumentos en una llamada de retorno
I<uH sucede si la (uncin a la cual se desea llamarD necesita recibir uno o m2s ar
gumentosJ En este casoD tenemos dos opciones7 $F Pasar los argumentos a continua
cin del nombre de la (uncin7
call5user5func$Cnom re5de5la5funcionC3 $parametro13 $parametro2%?
Ejemplo7
"" 3&nci?n (&e llamarI con call_&ser_0&nc function sumar5dos5numeros$$a3 $ % N r
eturn $a T $ ? O $numero51 Q 5? $numero52 Q 1'? $resultado Q call5user5func$Csum
ar5dos5numerosC3 $numero513 $numero52%? echo $resultado?
8F 'e(inir un arra& con todos los argumentos necesariosD & hacer la llamada de r
etorno ampliada7
call5user5func$array$Cnom re5de5la5funcionC3 $arra*5con5argumentos%?
Ejemplo7
G?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"" 3&nci?n (&e llamarI con call_&ser_0&nc_arra' function sumar5dos5numeros$$a3 $
% N return $a T $ ? O $args Q arra*$53 1'%? $resultado Q call$user$func$array$C
sumar5dos5numerosC3 $args%? echo $resultado?
Argumentos no conocidos
>uando dentro de una (uncinD reali@amos una llamada de retornoD as como la (uncin p
uede desconocer el nombre de aAuella a la cual deber2 llamarD tambiHn es probabl
e Aue si esa (uncin reAuiere de argumentosD se descono@ca tambiHn la cantidad de
argumentos# Para resol5er este planteoD contamos con 5arias (unciones nati5as Au
e nos a&udar2n a lograr un mejor tratamiento de las llamadas de retornos# =eamos
algunas de ellas#
>onocer la cantidad de argumentos
>on la func$num$args podemos conocer exactamenteD la cantidad de argumentos reci
bidos en una (uncin7
function foo$% N $cantidad5de5argumentos Q func$num$args'(? echo D8eci imos N$ca
ntidad5de5argumentosO argumentosD? O foo$Cargumento 1C3 Cotro5argumentoC%?
>omo podemos notarD la (uncin foo$% en realidadD no esperaba ning3n argumento# -i
n embargoD al hacer la llamada a foo$%D hemos pasado dos argumentos#
G%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4btener una lista completa de todos los argumentos
Es posible obtener una matri@ Earra&F con todos los argumentos recibidos# Para e
lloD disponemos de la (uncin func$get$args7
function foo$% N $argumentos Q func$get$args'(? print5r$$argumentos%? "# 2etorna
r% &n arra' con todos los arg&mentos: 9rra' ( K0L DM arg&mento 1 K1L DM otro arg
&mento ) #" O foo$Cargumento 1C3 Cotro argumentoC%?
4btener un argumento espec(ico
Puede ser mu& util adem2sD obtener un argumento determinado# Para elloD disponem
os de la (uncin func$get$arg'index(D donde indexD ser2 el n3mero de ndice del argu
mento en la matri@7
function foo2$% N echo func$get$arg'P(? "" salida: otro arg&mento O foo2$Cargume
nto 1C3 Cotro argumentoC%?
-aber si una (uncin puede ser llamada EcallableF
Cuando decimos callable nos referimos a si la funcin existe y adems, puede ser lla
mada.
G/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>uando trabajamos con llamadas de retornoD asumimos Aue nuestro scriptD desconoc
e el nombre de la (uncin a la Aue se desea llamar & por lo tantoD no debemos con(
iar en Aue el nombre de la (uncin pasada como cadena de textoD sea e(ecti5amente
el nombre de una (uncin callable# Para sortear este obst2culoD disponemos de la (
uncin is$calla.leD la cual nos retornor2 -8R1 en caso de ser una (uncin calleable#
'e lo contrarioD retornar2 &PH"1#
function funcion5calla le$% N echo DHlamada correctaD? O function llamar5a5funci
on5calla le$$funcion% N if$is$calla.le'$funcion(% N call5user5func$$funcion%? O
else N echo DHa funciMn no es calla leD? O O llamar5a5funcion5calla le$Cfuncion5
calla leC%? "" salida: Llamada correcta llamar5a5funcion5calla le$Cfuncion5inexi
stenteC%? "" salida: La 0&nci?n no es calleable
"aterial de lectura adicional
-obre callBuserB(unc http7++...#php#net+manual+es+(unction#callLuserL(unc#php -o
bre callBuserB(uncBarra& http7++...#php#net+manual+es+(unction#callLuserL(uncL a
rra&#php -obre (uncBnumBargs
G1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
http7++...#php#net+manual+es+(unction#(uncLnumL args#php -obre (uncBgetBargs htt
p7++...#php#net+manual+es+(unction#(uncLgetLargs#php -obre (uncBgetBarg http7++.
..#php#net+manual+es+(unction#(uncLgetLarg#php -obre isBcallable http7++...#php#
net+manual+es+(unction#isLcallable#php -obre (unctionBexists Ealternati5a a isBc
allable Aue solo comprueba si la (uncin existe o noD pero no 5eri(ica Aue HstaD p
ueda ser llamadaF http7++...#php#net+manual+es+(unction#(unctionL exists#php
'i(erentes (ormas de recoger argumentos para hacer una llamada de retorno
=eremos aAuD dos (ormas de crear (unciones para hacer llamadas de retorno Aue reA
uieran de argumentos#
,orma $7 recibir argumentos en un arra&
"" 0&nci?n callable function calla le5func51$$arg13 $arg23 $arg2% N $result Q $$
arg1 T $arg2% U $arg2? return $result? O "" 0&nci?n (&e ,ar% la llamada de retor
no function forma51$$funcion3 $argumentosQarra*$%% N $result Q SRHH?
G6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
if$is5calla le$$funcion%% N $result Q call$user$func$array'-funcion8 -argumentos
(? O return $result? O "" im+lemenatci?n $args Q arra*$1'3 53 2%? $resultado Q f
orma51$Ccalla le5func51C3 $args%? echo $resultado?
,orma 87 recibir argumentos $ a $
"" 0&nci?n callable function calla le5func51$$arg13 $arg23 $arg2% N $result Q $$
arg1 T $arg2% U $arg2? return $result? O "" 0&nci?n (&e ,ar% la llamada de retor
no function forma52$% N $num5args Q func5num5args$%? $args Q func5get5args$%? $r
esult Q SRHH? "" )eri0ico (&e al menos se reciba 1 arg&mento if$$num5args 9Q 1%
N "" obtengo el nombre de la 0&nci?n (as&mo (&e es el 1er arg.) $funcion Q func5
get5arg$'%? "" elimino el nombre de la 0&nci?n de los arg&mentos arra*5shift$$ar
gs%? "" elimino el 6ndice 0 "" )eri0ico (&e sea &na 0&nci?n callable ' la llamo
if$is5calla le$$funcion%% N $result Q call5user5func5arra*$$funcion3 $args%? O
O O
return $result? // implementaciMn $funcion Q Ccalla le5func51C? $arg1 Q 1'? $arg
2 Q 5? $arg2 Q 2? $resultado Q forma52$$funcion3 $arg13 $arg23 $arg2%? echo $res
ultado?
GG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!lamadas recursi5as
-e denomina llamada recursi5a Eo recursi5idadFD a aAuellas (unciones Aue en su a
lgoritmoD hacen re(erencia s misma# !as llamadas recursi5as suelen ser mu& 3tiles
en casos mu& puntualesD pero debido a su gran (actibilidad de caer en iteracion
es in(initasD deben extremarse las medidas precauti5as necesarias & solo utili@a
rse cuando sea estrictamente necesario & no exista una (orma alternati5a 5iableD
Aue resuel5a el problemaD e5itando la recursi5idad# PHP admite las llamadas rec
ursi5asD permitiendo a una (uncinD llamarse a s mismaD de igual (orma Aue lo hace
cuando llama a otra (uncin#
function funcion$recursiva'( N //algoritmo... funcion$recursiva'(+ O
=eamos como (unciona# En el siguiente ejemplo7
function funcion5recursiva$$aQ'% N if$$a QQ '% N $a Q 1? $a Q funcion5recursiva$
$a%? O else N $a Q $aU2? O return $a? O
si llamo a funcion5recursiva$% sin pasar ning3n par2metroD (uncionBrecursi5a tom
ar2 el 5alor de $a de(inido por de(ecto E'F# Ejecutar2 entonces el ifD se llamar
2 a si mismaD & en esta segunda ejecucinD actuar2 el else# si en cambioD llamara
a funcion5recursiva$5% pasando un entero como par2metroD se ejecutar2 el else di
rectamente# !o
GC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
mismo sucedera si en 5e@ de un enteroD pasara una cadena como par2metro#
C9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Helpers
En programacinD un helper es una (uncin o conjunto de (unciones genHricasD de uso
com3nD destinadas a ser5ir de a&uda a otros procesos dentro de un mismo sistema#
*n helper Aue retorna la (echa actual
"# 2etorna la 0ec,a act&al en 0ormato largo, corto o 7-J (can?nico) 9rg&mentos:
*0ormato -- largo, retorna la 0ec,a act&al en 0ormato L&nes, 2 de 9gosto de 2011
corto, retorna la 0ec,a en 0ormato 02"0Q"2011 7-J, retorna la 0ec,a en 0ormaro
2011-0Q-02 #" function get5fecha5actual$$formato% N "" de0ino &n arra' con los +
atrones de 0ormato $formato5fecha Q arra*$ DlargoD Q9 Dl3 > YdYe & YdYe XD3 Dcor
toD Q9 Dd/m/XD3 DB"KD Q9 DX-m-dD3 %? "" inicialiEo la )ariable *0ec,a $fecha Q S
RHH? "" com+r&ebo (&e *0ormato sea &n 0ormato )%lido if$arra*56e*5exists$$format
o3 $formato5fecha%% N "" si el 0ormato es )%lido, reasigno el )alor a *0ec,a $fe
cha Q date$$formato5fecha]$formato^%? O "" retorno la 0ec,a 0ormateada return $f
echa?
O
C$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
*n helper Aue modi(ica una 5ariable globalD haciendo una llamada de retorno
"# Llama a la 0&nci?n indicada ' reasigna el )alor de &na )ariable global, 0orma
teado +or la 0&nci?n indicada 9rg&mentos: *)ariable -- )ariable global a ser mod
i0icada *0&ncion -- 0&nci?n a la c&al debe llamarse +ara dar 0ormato a *)ariable
*arg&mentos -- (o+cional) +ar%metros (&e e)ent&almente +&edan ser re(&eridos +o
r *0&ncion
#" function set5varia le5glo al$_$varia le3 $funcion3 $argumentosQarra*$%% N ""
com+r&ebo (&e *0&ncion sea &na 0&nci?n callable if$is5calla le$$funcion%% N $var
ia le Q call5user5func5arra*$$funcion3 $argumentos%? O O
C8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Taller de ,unciones
En este tallerD 5eremos comoD utili@ando buenas pr2cticas de programacinD nos a&u
daremos de (unciones de(inidas por el usuarioD para lograr7 *n sistema din2micoD
seguroD (2cilmente mantenible & escalable !ograr una completa abstraccin de cdigo
HT"!D e5itando embeberlo &+o (usionarlo con PHP

Archi5os necesarios para el taller 'escarga los archi5os Aue utili@aremos en el
tallerD pulsando el siguiente enlace7
http7++tallerLdeLphp#eugeniabahit#com+tallerLdeL (unciones#tar#g@
C?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Trabajando con el -istema de Archi5os
PHP dispone de un conjunto de (unciones nati5asD Aue nos permiten trabajar holga
damente todo el sistema de archi5osD como si lo manej2remos desde el propio sist
ema operati5o# En este captuloD 5eremos las principales (unciones del sistema de
archi5osD Aue nos ser2 3tiles para la ma&or parte de las aplicaciones Aue reAuie
ran manipular tanto archi5os como directorios#
0ecorrido r2pido por las principales (unciones
'e (orma r2pidaD 5eremos aAu como abrir archi5osD leer su contenidoD manipularloD
crear archi5os & escribir en ellos# >omencemos;
Apertura de archi5os
-in dudasD cuando solo se reAuiere abrir un archi5o para leer su contenidoD el m
odo m2s pr2ctico de hacerlo es con la (uncin file$get$contents 5ista al comien@o
E& a lo largoF de este curso# )o obstanteD PHP dispone de la (uncin fopen'( Aue p
ermiteD no solo abrir el archi5o para leerloD sino tambiHnD para escribir en Hl
& manipular sus datos#
fopen$$archivo3 $modo]3 $include5path^%?
C%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A=I-47 !os corchetes ^ & _ indican Aue el par2metro es opcional#
fopen abrir2 el archi5o en el modo indicado & creando un puntero en el mismo# Pu
ntero: lugar del el archivo en el cual se coloca el cursor al ser a ierto. Toda
5e@ Aue un archi5o sea abiertoD debe cerrarse a (in de liberarlo de la memoria#
Para elloD utili@amos fclose'$cursor5creado5con5fopen(7
$cursor Q fopen$Carchivo.txtC3 CrC%? fclose$$cursor%?
"odos de apertura
!os modos posibles de aperturaD los siguientes7
Modo Descripcin r r7 w Lectura Lectura y escritura Escritura Si e arc1i!o no e-is
te( intenta crearlo. Si e-iste( lo so%reescri%e. Lectura y escritura Si e arc1i!
o no e-iste( intenta crearlo. Si e-iste( lo so%reescri%e. Escritura Si el arc1i!
o no e-iste( intenta crearlo. Lectura y escritura Si e arc1i!o no e-iste( intent
a crearlo. Escritura "rea un nue!o arc1i!o para escri%ir en 'l. Si el arc1i!o ya
e-iste( falla. Lectura y 3scritura C/ Puntero Al inicio del arc1i!o Al inicio d
el arc1i!o Al inicio del arc1i!o Al inicio del arc1i!o( trunc2ndolo Al final del
arc1i!o Al final del arc1i!o Al inicio del arc1i!o Al inicio del arc1i!o
w7 a a7 Q Q7

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"rea un nuevo arc ivo para escri%ir en 'l y luego poder leerlo. Si el arc1i!o ya
e-iste( falla. c c7 Escritura Si e arc1i!o no e-iste( intenta crearlo. Lectura
y escritura Si e arc1i!o no e-iste( intenta crearlo. Al inicio del arc1i!o Al in
icio del arc1i!o
0uta hacia el archi5o
!a ruta especi(icada hacia el archi5oD debe seguir la (orma protocolo0))ruta$al$
archivo# 'e esta (ormaD si AuisiHramos abrir una *0!D deberamos utili@ar7 http://
www.dominio.com/archivo.txt Pero si AuisiHramos abrirlo localmente D deberamos in
dicar7 )ruta$a$mi$dominio)pu.lic$html)archivo.tQt A'=E0TE)>IA )tese Aue en Windo.
s deber2 utili@arse el siguiente (ormato7 c:YYruta5aYYarchivo.txt
*tili@ar o no includeBpath
El tercer par2metro EopcionalFD permite indicar si se desea buscar el archi5o en
el includeBpath seteado en el archi5o php#ini# En dicho casoD debe pasarse T0*E
Eo $F7
$file Q fopen$Cfile.txtC3 CrC3 -8R1%?
eneralmenteD no utili@aremos este par2metroD a no ser Aue sea extrictamente nece
sario#
C1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!ectura de Archi5os
*na 5e@ abierto un archi5oD podremos leer su contenido utili@ando la (uncin de le
ctura en modo binario seguroD fread'(# *tili@ando la siguiente sintaxis7
fread$$recurso3 $ *tes%?
podremos leer el contenido de un archi5o en modo binario seguroD necesitando de
un recurso Eobtenido mediante fopenF e indicando la cantidad de b&tes a leer E$
car2cter a $ b&teF# Para leer el contenido completo del archi5oD podemos a&udarn
os de la (uncin filesiGe'-archivo(D donde $archivoD ser2 la ruta completa al arch
i5o Aue se Auiere leer7
$archivo Q Darchivo.txtD? "" nombre del arc,i)o $ *tes Q filesiGe$$archivo%? ""
tamaSo del arc,i)o $cursor Q fopen$$archivo3 DrD%? "" abrir arc,i)o $contenido Q
fread$$cursor3 $ *tes%? "" leer contenido fclose$$cursor%? "" cerrar el c&rsor
(liberar memoria)
Escribir en un archi5o
Para escribir en un archi5oD nos 5alemos de la (uncin fwrite'( la cu2l escribir2
en modo binario seguro# -u sintaxis es la siguiente7
fwrite$$recurso3 $contenido5a5escri ir]3 $cantidad5de5 *tes5a5escri ir^%?
El contenidoD puede ser cualAuier 5ariable de tipo string D mientras Aue la cant
idad de b&tes a escribirD es opcional# -i se
C6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
indica la cantidad de b&tes D se dejar2 de escribir cuando la cantidad de b&tes
se ha&a alcan@ado o cuando la cadena termine Elo Aue suceda primeroF#
$archivo Q Darchivo.txtD? $recurso Q fopen$$archivo3 DaTD%? -nuevo$contenido & /
nuevo contenido/+ fwrite'-recurso8 -nuevo$contenido(+ $ *tes Q filesi@e$$archivo
%? $contenido Q fread$$recurso3 $ *tes%? fclose$$recurso%?
"o5iendo el puntero dentro del archi5o
>uando tenemos Aue escribir un archi5oD es mu& 3til saber en AuH lugar se encuen
tra el punteroD & mo5erlo a la posicin indicada# Podemos obtener la posicin actual
del punteroD con la (uncin ftell'-recurso( & mo5ernos hacia el b&te indicadoD co
n fseek'-recurso8 -.yte(#
*n contador de 5isitas sencillo
function contador5de5visitas$% N $archivo Q Dcontador.txtD? $recurso Q fopen$$ar
chivo3 DrTD%? $ *tes5totales Q filesi@e$$archivo%? $contador Q fread$$recurso3 $
*tes5totales%? $nuevo5contenido Q $contador T 1? $posicion5actual Q ftell$$recu
rso%? if$$posicion5actual QQ $ *tes5totales% N "" me m&e)o al b'te 0 +ara sobree
scribir el arc,i)o fsee6$$recurso3 '%? O fwrite$$recurso3 $nuevo5contenido%? fcl
ose$$recurso%? return $nuevo5contenido? O
CG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"" 9ct&aliEar el n@mero de )isitas ' mostrarlo echo contador5de5visitas$%?
M>uidado con los permisos;
>omo es lgico de esperarD para poder crear un archi5o o escribir sobre un archi5o
existenteD HsteD debe tener permisos de escritura para el usuario ...Ldata# En
un ser5idor WebD tener archi5os o directorios ser5idos con permisos de escritura
D es una puerta Aue se est2 abriendo hasta para el m2s no5ato de los delincuente
s in(orm2ticos Aue transitan por la red# !a mejor alternati5a D es tener un dire
ctorio )4 -E0=I'4 con permisos de escritura Ees decirD un directorio con permiso
s de escrituraD (uera del directorio de publicacin WebF# En este casoD bastar2 co
n utili@ar como ruta del archi5oD la ruta absoluta#
Trabajando con directorios
>omo hemos comentado antesD PHP permite trabajar el sistema de archi5osD como po
dramos hacerlo desde las aplicaciones del propio sistema operati5o# R estoD inclu
&e tambiHnD (unciones relacionadas a los directorios#
>reando el gestor
Al igual Aue con los archi5osD para acceder a un directorioD debe crearse primer
o un recurso Egestor de directorioF# Para elloD al igual Aue fopen abre un archi
5oD tenemos una (uncin para abrir los directorios# Tal 5e@D tomando como base lgic
a el nombre de la (uncin
CC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
fopen EAue pro5iene de ,ile4pen FD estHs esperando una (uncin llamada do+enD pero
lamentablementeD no existe una (uncin llamada dopenD &a Aue PHPD no tiene estand
ari@ado el estilo para nombres de (unciones# A di(erencia de lo Aue esperamosD p
ara abrir un directorioD la (uncin Aue debemos utili@arD se denomina opendir#
$recurso Q opendir$Cnom re5del5directorioC%?
>omo nombre de directorioD es posible utili@ar tambiHnD cualAuier ruta absoluta7
$recurso Q opendir$C/var/www/dominio.com/pu lic5html/archivos/pdfC%?
o una ruta relati5a 7
$recurso Q opendir$C../archivos/pdfC%? $otro5recurso Q opendir$Carchivos/pdfC%?
Al igual Aue cuando abrimos un archi5oD cuando abrimos un directorioD es necesar
io cerrarlo para liberarlo de memoria7
closedir$$recurso%?
Explorando el contenido de un directorio
Explorar el contenido de un directorioD es sumamente sencilloD &a Aue disponemos
de una (uncin para hacerlo7 readdir'$recurso(# -in embargoD la exploracin de dire
ctorios puede ser complejaD debido a Aue7 readdir no de5uel5e el contenido compl
eto de un directorio en su primera ejecucinD sino Aue 5a le&endo cada elemento de
a uno por 5e@ & por lo tantoD readdir debe ejecutarse iterati5amenteV
$99

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit

readdir retorna el nombre del elemento Earchi5o o directorioF pero en caso de er


rorD puede de5ol5er tanto &alse como un 5alor no booleano Aue pueda ser e5aluado
como &alseD por lo cualD antes de ejecutar alguna accinD debe 5eri(icarse el ret
orno# En sistemas basados en *)ISD todo directorio contiene a la 5e@ dos subdire
ctorios ocultos cu&os nombres son . EpuntoF & .. Edoble puntoFD Aue deben ser 5a
lidados pre5iamente a (in de e5itar listarlos#

"" abro el directorio $dir Q opendir$C../taller-de-funcionesC%? "" itero solo si


readdir J de)&el)e 3alse while$$$elemento Q readdir$$dir%% F&& 6alse% N "" im+r
imo el nombre del arc,i)o o directorio echo $elemento . chr$1'%? O "" cierro el
directorio closedir$$dir%? "# -alida: index.+,+ tem+late.,tml 0&nciones.+,+ .. 0
iles .
#"
)tese Aue en el ejemplo anteriorD se est2n listando los dos directorios ocultos tp
icos de todo sistema *)ISL!i:e# Para e5itar esoD ser2 necesario (iltrarlos7
"" abro el directorio $dir Q opendir$C../taller-de-funcionesC%? "" inicialiEo &n
arra' donde g&ardarI cada elemento $contenido Q arra*$%?
$9$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"" itero solo si readdir J de)&el)e 3alse while$$$elemento Q readdir$$dir%% WQQ
&alse% N "" e)ito (&e liste los directorios oc&ltos . ' .. if'-elemento F& /./ a
nd -elemento F& /../( * "" agrego cada elemento en el arra' *contenido $contenid
o]^ Q $elemento? , O "" cierro el directorio closedir$$dir%? "" im+rimo la salid
a print5r$$contenido%? "# -alida: 9rra' ( K0L K1L K2L K5L )
DM DM DM DM
index.+,+ tem+late.,tml 0&nciones.+,+ 0iles
#"
,iltrando el tipo de elemento
>omo 5imos en el ejemplo anteriorD readdir retorna tanto archi5os como directori
os# Es posible (iltrar el tipo de elementoD para poder manipularlos de (orma m2s
apropiada# Para ello disponemos de cuatro (unciones mu& 3tiles7 is$dir'-element
o( )os indica si el elemento e5aluado es un directorio ETrueF o no E,alseF is$fi
le'-elemento( )os indica si el elemento e5aluado es un archi5o ETrueF o no E,als
eF#
$98

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
is$link'-elemento( )os indica si el elemento e5aluado es un elace simblico ETrueF
o no E,alseF# !tese que en "indo#s, los enlaces sim licos son denominados $acceso
s directos%. filetype'-elemento( )os retorna el tipo de elemento siendo los 5alo
res de retorno posibles7 fifo3 char3 dir3 loc63 lin63 file3 soc6et * un6nown.
A'=E0TE)>IA )tese Aue (ilet&pe podr2 de5ol5er ,alse si no pudo ejecutarse con Hxi
to pero tambiHn podra de5ol5er un errorD si el tipo de archi5o es desconocido#
$dir Q opendir$C../taller-de-funcionesC%? $archivos Q arra*$%? $directorios Q ar
ra*$%? $s*mlin6s Q arra*$%? while$$$elemento Q readdir$$dir%% WQQ &alse% N if$$e
lemento WQ D.D and $elemento WQ D..D% N $path5elemento Q D../taller-de-funciones
/N$elementoOD? if$is$dir$$path5elemento%% N $directorios]^ Q $elemento? O elseif
$is$file$$path5elemento%% N $archivos]^ Q $elemento? O elseif$is$link$$path5elem
ento%% N $s*mlin6s]^ Q $elemento? O O O closedir$$dir%?
$9?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$contenido Q arra*$C7irectoriosC Q9 $directorios3 CPrchivosC Q9 $archivos3 C1nla
ces sim MlicosC Q9 $s*mlin6s%? print5r$$contenido%?
!o anteriorD producir2 la siguiente salida7
eugenia@cocochito:~/ orradores$ php -f file.php Prra* $ ]7irectorios^ Q9 Prra* $
]'^ Q9 files % ]Prchivos^ Q9 Prra* $ ]'^ Q9 index.php ]1^ Q9 template.html ]2^
Q9 funciones.php % ]1nlaces sim Mlicos^ Q9 Prra* $ % %
)tese Aue alternati5amente a las tres (unciones utili@adas en el ejemplo Eis5file
D is5dir e is5lin6F se podra comprobar mediante filet*pe$$path5elemento%# -in emb
argoD la (orma segura de chec:ear el tipo de elementoD es con las (unciones usad
as en el cdigo anterior#
4tras (unciones Aue necesitar2s con (recuencia
"uchas 5ecesD ser2 necesario saber si el directorio o archi5os Aue intentamos ab
rirD existeD conocer si puede ser ledo &+o escrito# Estas acciones ser2n mu& (rec
uentesD & para resol5er el dilemaD
$9%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
disponemos de las (unciones necesarias#
>omprobar la existencia de un archi5o o directorio
file$eQists$Carchivo5o5directorioC%
>omprueba si un archi5o o directorio existe ETrueF o no E,alseF7
"" )alidando si &n arc,i)o existe $archivo Q Cruta5a/mi5archivo.txtC? if$file$eQ
ists$$archivo%% N echo D1l archivo N$archivoO existeD? O else N echo D1l archivo
N$archivoO no pudo locali@arseD? O "" a,ora, )eri0icando si &n directorio exist
e $directorio Q Cruta/a/mi/carpetaC? if$file$eQists$$directorio%% N echo D1l dir
ectorio N$directorioO existeD? O else N echo D1l directorio N$directorioO no pud
o locali@arseD? O
>omprobar si un archi5o o directorio es legible
is$reada.le$Carchivo5o5directorioC%
>omprueba si un archi5o o directorio es legible ETrueF o no E,alseF7
"" )alidando si &n arc,i)o es legibe $archivo Q Cruta5a/mi5archivo.txtC? if$is$r
eada.le$$archivo%% N echo D1l archivo N$archivoO puede ser le<doD? O else N echo
D1l archivo N$archivoO no puede ser le<doD? O
$9/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"" a,ora, )eri0icando si &n directorio es legible $directorio Q Cruta/a/mi/carpe
taC? if$is$reada.le$$directorio%% N echo D1l directorio N$directorioO puede ser
le<doD? O else N echo D1l directorio N$directorioO no puede ser le<doD? O
>omprobar si un archi5o o directorio puede escribirse
is$writa.le$Carchivo5o5directorioC%
>omprueba si un archi5o o directorio es legible ETrueF o no E,alseF7
"" )alidando si &n arc,i)o +&ede escribirse $archivo Q Cruta5a/mi5archivo.txtC?
if$is$writa.le$$archivo%% N echo D1l archivo N$archivoO puede ser escritoD? O el
se N echo D1l archivo N$archivoO no puede ser escritoD? O "" a,ora, )eri0icando
si &n directorio +&ede escribirse $directorio Q Cruta/a/mi/carpetaC? if$is$writa
.le$$directorio%% N echo D1l directorio N$directorioO puede ser escritoD? O else
N echo D1l directorio N$directorioO no puede ser escritoD? O
"2s (unciones sobre el sistema de archi5os
"2s (unciones sobre el sistema de archi5osD encontrarse http7++...#php#net+manua
l+es+re(#(iles&stem#php pueden en
$91

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Procesamiento de texto & manipulacin de strings
En este captuloD 5eremos las principales (unciones & (ormas b2sicasD de procesar
texto & manipular strings en PHPD las cuales ser2n la base (undamental de las ex
presiones & algoritmos integrantes de todo sitio Web & aplicacin#
Ampliando la de(inicin de 5ariables de tipo string
>omo hemos 5isto anteriormenteD una cadena de texto en PHPD puede encerrarse tan
to entre comillas simples como entre comillas dobles 7
$var51 Q C1sta es una cadena de textoC? $var52 Q D1sta es otra cadena de textoD?
TambiHn disponemos de la posibilidad de delimitar cadenas de texto de gran exten
sinD mediante heredoc Edel inglHs Nhere documentO L documento aAuFD tpica de una gr
an parte de lenguajes de programacin & shells de -istemas 4perati5os basados *)IS
D cu&a sintaxis es7
$varia le Q !!!CD>35C6CB?D% contenido de heredoc CD>35C6CB?D% +
'onde B71S-B&B)P7K8D podr2 ser cualAuier nombre Aue respete las reglas para nomb
res de 5ariables & el identi(icador de cierreD no podr2 estar sangrado# =eamos u
n ejemplo7
$96

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$documento Q !!!3%5?$2%R >$H> >D%B 1s mu* importante seaalar ;ue la l<nea con el
identificador de cierre no de e contener ningbn caracter3 excepto posi lemente
un punto * coma $?%. 1sto significa en particular ;ue el identificador no de e u
sar sangr<a3 * ;ue no de en existir ningbn espacio ni ta ulaciMn antes o despuZs
del punto * coma. 1s mu* importante darse cuenta ;ue el primer caracter antes d
el identificador de cierre de e ser un salto de l<nea definida por el sistema op
erativo local. 1n los sistemas RSBF ser<a Yn3 al igual ;ue en Gac K" F. 1l delim
itador de cierre $posi lemente seguido de un punto * coma% tam iZn de e ser segu
ido de un salto de l<nea. "i se rompe esta regla * el identificador de cierre no
est= DlimpioD3 no ser= considerado como un identificador de cierre3 * #.# conti
nuar= uscando uno. "i no se encuentra ningbn identificador de cierre antes del f
inal del fichero3 se producir= un error de an=lisis en la bltima l<nea. 3%5?$2%R
>$H> >D%B+
-e recomienda el uso de heredocD para de(inir cadenas de texto de grandes extens
iones#
Escapando caracteres
"uchas 5eces es necesario imprimir ciertos caracteres Aue no pueden simplemente
indicarse# *n ejemplo de elloD es cuando en una cadena de texto delimitada por c
omillas doblesD se desea imprimir el literal de comillas dobles# Hacer esto7
$var Q DHas comillas do les $D% de en escaparseD?
generar2 un errorD puesto Aue PHP considerar2 el (inal de la cadena de texto en
la segunda comilla doble7
$var Q DHas comillas do les $D
& encontrar2 un error de sintaxis a continuacin7
% de en escaparseD?
$9G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Para solucionar este problemaD ciertos caracteres deben escaparseD mediante el u
so de una barra diagonal in5ertida S
$var Q DHas comillas do les $S/% de en escaparseD?
>aracteres de escape
Algunos caracteres de escape pueden representarse como se muestra en la siguient
e table7
!aracter \n \r \t \v \e \f \\ \$ \" S= "i#ni$icado a!ance de l4nea (L5 o 6-6A (7
6) en AS"&&) retorno de carro ("R o 6-6D (78) en AS"&&) ta%ulador 1ori9ontal (:;
o 6-6< (<) en AS"&&) ta%ulador !ertical (=; o 6-6> (77) en AS"&&) (desde : ?.@.
?) escape (3S" o 6-7> (@A) en AS"&&) (desde : ?.B.6) a!ance de p2gina (55 o 6-6"
(7@) en AS"&&) (desde : ?.@.?) %arra in!ertida signo del dlar comillas do%les "o
milla simple &mprimir las lla!es alrededor del contenido de #!ar $a Q ".ola Gund
o"? $ Q "Xo digo YN$aO"? echo $ ? // salida: Xo digo N.ola GundoO
S*-var,
$9C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
,unciones para manipulacin de strings
A continuacinD se mostrar2n las (unciones de uso m2s (recuente para la manipulacin
de cadenas de texto# Para obtener un listado completo de (unciones de stringD 5
isita el manual o(icial en http7++...#php#net+manual+es+re(#strings#php
,unciones de escape
addslashes'-cadena( escapa una cadena de texto aPadiendo barras in5ertidas a las
comillas doblesD siemplesD barras in5ertidas & b&tes nulos# escapar cadenas de
texto Aue deban insertarse en bases de datosD & ha&an sido recibidas mediante HT
TP P4-T# Kuotemeta'-cadena( escapa una cadena de texto aPadiendo barras in5ertid
as a los siguientes caracteres7 . S 7 9 " ; T < ' - (
$doc Q D"i se reali@a el c=lculo $15U2%T]$12T5%U$!.2T'.!5%^ o tendremos el impor
te en $D? $doc Q ;uotemeta$$doc%? echo $doc? "# -alida: -i se realiEa el clc&lo
T(15T#2T)TOTKT(12TO5T)T#T(4T.5TO0T.45T)TL obtendremos el im+orte en T* #"
'e (orma in5ersa a lo anteriorD pueden eliminarse las barras in5ertidas de una c
adena espadaD mediante stripslashes'-cadena(
$doc Q D"i se reali@a el c=lculo $15U2%T]$12T5%U$!.2T'.!5%^ o tendremos el impor
te en $D?
$$9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$doc Q ;uotemeta$$doc%? echo $doc? "# -alida: -i se realiEa el clc&lo T(15T#2T)T
OTKT(12TO5T)T#T(4T.5TO0T.45T)TL obtendremos el im+orte en T* #" echo stripslashe
s$$doc%? "# -alida: -i se realiEa el c%lc&lo (15#2)OK(12O5)#(4.5O0.45)L obtendre
mos el im+orte en * #"
,unciones de con5ersin
htmlentities'-cadena( con5ierte los caracteres aplicables a entidades HT"!# &sta
funcin de e utilizarse siempre que una cadena de texto de a ser impresa en un do
cumento '()L y se desconozca su contenido, para prevenir que cdigo fuente no dese
ado, sea e*ecutado.
$cadena Q DHas negritas se escri en entre los tags : 9 * :/ 9 mientras ;ue el sa
lto de linea se representa con : r/9D? $cadena Q htmlentities$$cadena%? echo $ca
dena? "# Las negritas se escriben entre los tags UltPbUgtP ' UltP"bUgtP mientras
(&e el salto de linea se re+resenta con UltPbr"UgtP #"
-u opuesto es html$entity$decode'-cadena(
$cadena Q DHas negritas se escri en entre los tags _lt? _gt? * _lt?/ _gt? mientr
as ;ue el salto de linea se representa con _lt? r/_gt?D? $cadena Q html$entity$d
ecode$$cadena%? echo $cadena? "#
$$$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Las negritas se escriben entre los tags VbM ' V"bM mientras (&e el salto de line
a se re+resenta con Vbr"M #"
>uando solo se deseen con5ertir a entidades HT"!D caracteres especiales tales co
mo A / = ! #D se utili@ar2 la (uncin htmlspecialchars'-cadena( siendo el opuesto
de esta 3ltimaD la (uncin htmlspecialchars$decode'-cadena(#
E5itando ejecucin de cdigo no deseado
*na (uncin Aue deber2 utili@arse toda 5e@ Aue Auiera e5itarse la ejecucin de cdigo
PHP & HT"! no deseadoD es strip$tags'-cadena8 -caracteres$permitidos(# Esta (unc
in eliminar2 todas las etiAuetas PHP & HT"! exceptuando aAuellas Aue se indiAuen
como caracteres permitidos7
$caracteres5permitidos Q D: 9D? $cadena Q D:p9.ola : 9Gundo:/ 9:/p9:script langu
ageQC>avascriptC9alert$CholaC%?:/script9 :Aphp echo $caracteres5permitidos? A9D?
$resultado Q strip5tags$$cadena3 $caracteres5permitidos%? echo $resultado? "" s
alida: /ola VbM>&ndoV"bMalert(W,olaW)P
Eliminar espacios en blanco D tambiHn 'isponemos de tres (unciones prede(inidas7
es
posible#
ltrim'-cadena(7 Elimina los espacios en blanco del inicio de la cadena rtrim'-ca
dena(7 los elimina del (inal de la cadena trim'cadena(7 los elimina del inicio &
(inal de la cadena
$$8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
,unciones de (ormato
!a (uncin nl2.r'-cadena( nos permite con5ertir saltos de lnea en su representacin H
T"! E: r /9F7
$cadena Q D1sto es una cadena de textoD? $resultado Q nl2.r$$cadena%? echo $resu
ltado? "# salida: Bsto esVbr "M &na cadena Vbr "M de texto #" $cadena Q D1sto es
Ynuna cadenaYnde textoD? $resultado Q nl2.r$$cadena%? echo $resultado? "# salida
: Bsto esVbr "M &na cadena Vbr "M de texto #"
Podemos adem2sD ajustar el ancho de caracteres de una cadena de textoD utili@and
o la (uncin wordwrap'-cadena3 $ancho3 $salto5de5linea3 $no5cortar5pala ras(# Esta
(uncinD recibir2 $ par2metro obligatorio E`cadenaF & tres par2metros opcionales7
-ancho cantidad de caracteres -salto$de$linea el car2cter o patrn Aue se utili@a
r2 para crear el salto de lnea# Ejemplo7 Yn o : r/9# -no$cortar$pala.ras si se es
tablece en T0*ED PHP tendr2 cuidado de insertar el saltoD sin cortar palabras#
$texto Q DHorem ipsum ad his scripta landit partiendo3 eum fastidii accumsan eur
ipidis in3 eum li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit r
idens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit definie
as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit
cu3 eirmod consectetuer signiferum;ue eu per. Bn usu
$$?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
latine e;uidem dolores. cuo no falli viris intellegam3 ut fugit veritus placerat
per.D? $formato Q wordwrap$$texto3 ('3 chr$1'%3 -rue%? echo $formato? "# Lorem
i+s&m ad ,is scri+ta blandit +artiendo, e&m 0astidii acc&msan e&ri+idis in, e&m
liber ,endrerit an. X&i &t Cisi )ocib&s s&sci+iant&r, (&o dicit ridens inciderin
t id. X&o m&ndi lobortis re0ormidans e&, legim&s senserit de0iniebas an eos. B&
sit tincid&nt incorr&+te de0initionem, )is m&tat a00ert +erci+it c&, eirmod cons
ectet&er signi0er&m(&e e& +er. 7n &s& latine e(&idem dolores. X&o no 0alli )iris
intellegam, &t 0&git )erit&s +lacerat +er. #"
Podemos necesitar con5ertir toda una cadena a min3sculas con strtolower'-cadena(
D o solo con5ertir a min3sculaD el primer car2cter de una cadena con lcfirst'-ca
dena(7
$usuario Q DPn/gieD? echo strtolower$$usuario%? "" anggie echo lcfirst$$usuario%
? "" an$gie
Pero tambiHn podemos Auerer con5ertir toda una cadena a ma&3sculas con strtouppe
r'-cadena(D con5ertir solo el primer car2cter de la cadena ucfirst'-cadena( o co
n5ertir el primer car2cter de cada palabra ucwords'-cadena(7
$cadena Q Dhola mundoD? echo strtoupper$$cadena%? "" /JL9 >! ;J echo ucfirst$$ca
dena%? "" /ola m&ndo echo ucwords$$cadena%? "" /ola >&ndo
*n ejemplo min3sculas7
pr2ctico
de
con5ersin
de
ma&3sculas
&
$nom re5*5apellido Q DPnggie Hope@D?
$$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$username Q strtolower$$nom re5*5apellido%? $nom re5visi le Q ucwords$$username%
?
'ar a una cadenaD (ormato de moneda D es posible mediante el uso de money$format
'-formato8 -cadena(7
setlocale$H)5GKS1-P8X3 Des51".R-&-4D%? $ ruto Q 1,4.!5? $iva Q $ ruto U '.21? $n
eto Q $ ruto U 1.21? $ ruto5txt Q mone*5format$CV$d!nC3 $ ruto%? $iva5txt Q mone
*5format$CV$d!nC3 $iva%? $neto5txt Q mone*5format$CV$d!nC3 $neto%? echo $ ruto5t
xt . chr$1'%? echo $iva5txt . chr$1'%? echo $neto5txt . chr$1'%? "# 1AQ,45 Y 5A,
4A Y 215,H2 Y
#"
A=I-4 utili@ar setlocale antes de dar (ormato de monedaD asegura la correcta sal
ida de los datos con el smbolo monetario correspondiente al idioma & pas# Para com
prender mejor los posibles patrones de (ormato Aue pueden ser utili@ados con mon
e*5formatD acceder a las re(erencias o(iciales en http7++...#php#net+manual+es+(
unction#mone&L (ormat#phpYre(sect$L(unction#mone&L(ormatLparameters A 5eces es p
reciso (ormatear un 5alor numHricoD estableciendo decimales & separadores de dec
imales & miles# >ontamos para
$$/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
ello con la (uncin num.er$format$$numero3 $decimales3 $separador5decimales3 $sepa
rador5miles% Aue retorna el n3mero (ormateado como cadena de texto7
$precio Q 12!,4.!+2? $precio5txt Q num er5format$$precio3 23 C3C3 C.C%? echo $pr
ecio5txt? "" 12.4AQ,4H
,unciones de manipulacin
"uchas 5ecesD puede ser mu& 3tilD manipular una cadena de textoD de (orma talD A
ue nos permite operar con di(erentes datos# Por ejemploD es posible di5idir una
cadena de texto D tomando como punto de di5isinD un caracter o patrnD mediante la
(uncin eQplode'-delimitador8 -cadena( & as obtener un arra& con las (racciones de
cadena di5ididasD Aue nos permita iterar sobre cada una7
$contactos Q D[uan Pntonio Pvila :avila@mail.com93 8odrigo Gancusso :rmancu@mail
.com93 "ilvina 7Claggio :dlaggio@mail.com9 D? $patron Q D3D . chr$1'%? $personas
Q explode$$patron3 $contactos%? foreach$$personas as $persona% N echo $persona
. chr$1'%? O "# F&an 9ntonio 9)ila Va)ilaZmail.comM 2odrigo >anc&sso Vrmanc&Zmai
l.comM -il)ina ;Wlaggio VdlaggioZmail.comM #"
Podemos contar la cantidad de caracteres de una cadena de textoD mediante la (un
cin strlen'-cadena(7
$mensa>e Q DHorem ipsum ad his scripta landit partiendo3 eum fastidii accumsan e
uripidis in3 eum li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit
ridens inciderint id. cuo mundi lo ortis reformidans
$$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
eu3 legimus senserit definie as an eos. 1u sit tincidunt incorrupte definitionem
3 vis mutat affert percipit cu3 eirmod consectetuer signiferum;ue eu per. Bn usu
latine e;uidem dolores. cuo no falli viris intellegam3 ut fugit veritus placera
t per. Bus id vidit volumus mandamus3 vide veritus democritum te nec3 ei eos de
et li ris consulatu. So mei ferri graeco dicunt3 ad cum veri accommodare. "ed at
malis omnes;ue delicata3 usu et iusto @@ril meliore. 7icunt maiorum elo;uentiam
cum cu3 sit summo dolor essent te. Se ;uodsi nus;uam legendos has3 ea dicit vol
uptua elo;uentiam pro3 ad sit ;uas ;ualis;ue. 1os voci us deserunt ;uaestio ei.
D? -caracteres & strlen'-mensa@e(+ if$$caracteres 9 1!'% N echo D-u mensa>e es d
emasiado largo. "olo se admiten 1!' caracteres.D? O
>ontar la cantidad de palabras en una cadena de textoD e inclusoD iterar sobre c
ada palabraD puede ser algo realmente 3til# !a (uncin str$word$count'-cadena8 -fo
rmato( nos a&udar2 a hacerlo7
$nom re5*5apellido Q D[uan #.D? $datos Q str$word$count$$nom re5*5apellido3 1%?
if$count$$datos% : 2% N echo DN$nom re5*5apellidoO no es un nom re * apellido v=
lidoD? O else N foreach$$datos as $dato% N if$strlen$$dato% : 2% N echo D#or fav
or3 no utilices iniciales.D? O O O
4tra (uncin Aue podremos utili@ar mu& a menudoD es str$replace'-.usKueda8 -reempl
aGo8 -cadena( Aue nos permite buscar un determinado car2cter o patrn & reempla@ar
lo por el indicado 7
$email Q D>uanpere@@dominio.comD? $mail5no5spam Q str5replace$D@D3 D ]P-^ D3 $em
ail%? echo $mail5no5spam? "" :&an+ereE K91L dominio.com
Esta (uncinD admite como par2metros de b3sAueda &
$$6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
reempla@oD tanto cadenas de textoD como matrices7
$email Q D>uanpere@@dominio.comD? $ us;ueda Q arra*$D@D3 D.D%? $reempla@o Q arra
*$D ]P-^ D3 D ]7K-^ D%? $mail5no5spam Q str5replace$$ us;ueda3 $reempla@o3 $emai
l%? echo $mail5no5spam? "" :&an+ereE K91L dominio K;J1L com
InclusoD permite reempla@ar todos los elementos de un arra& de b3@AuedaD por un
3nico car2cter o patrn de reempla@o Emu& 3til para eliminar espacios en blanco en
una cadenaD como en el siguiente ejemploF7
$username Q D ale>o val2nt1n' D? $ us;ueda Q arra*$D D3 DYtD3 DYnD3 DYrD3 DY'D3
DYx'ID%? $username Q str5replace$$ us;ueda3 CC3 $username%? echo $username? "" a
le:o)al5nt1n0
Es posible tambiHnD reali@ar reempla@osD haciendo Aue la b3sAueda sea insensible
a ma&3sculas & min3sculas# Para elloD debemos utili@ar la (uncin str$ireplace'-.
usKueda8 -reemplaGo8 -cadena( de la misma (orma Aue lo haramos con str5replace$%#
4tra (uncin sumamente 3tilD es strpos'-cadena8 -patron$de$.usKueda(D la cual nos
retornar2 la posicin en la Aue se encuentra el patrn buscadoD dentro de la cedana
7
$email Q D>uanpere@@mail.comD? $patron Q D@D? $posicion Q strpos$$email3 $patron
%? echo $posicion? "" H
-i se desea Aue la b3sAueda sea insensible a ma&3sculas & min3sculasD deber2 uti
li@arse stripos$$cadena3 $patron%# Es importante tener en cuentaD Aue tanto strp
os como striposD
$$G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
retornar2n ,alse cuando el patrn de b3sAueda no sea encontrado# Por la tantoD tod
a condicin debe ser comparada por exactitud de 5alor & tipo de dato7
$var1 Q D.ola GundoD? $var2 Q Dadios mundoD? $patron Q DholaD? if$stripos$$var13
$patron% QQQ '% N echo D1st= al comien@o de la cadenaD . chr$1'%? O # INCORRECT
O if$stripos$$var23 $patron% QQ '% N echo D1st= al comien@o de la cadenaD . chr$
1'%? O if$stripos$$var23 $patron% QQQ &alse% N echo DSo se encontrMD . chr$1'%?
O
"anipulando subcadenas en cadenas
Ha& tres (unciones mu& 3tiles Aue nos permiten manipular subcadenas de texto den
tro de una cadena# !a (uncin su.str'-cadena8 -inicio8 -longitud( nos retornar2 la
longitud de la cadena desde el inicio indicado7
$cadena Q DHorem ipsum ad his scripta landit partiendo3 eum fastidii accumsan eu
ripidis in3 eum li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit
ridens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit defini
e as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit
cu3 eirmod consectetuer signiferum;ue eu per. Bn usu latine e;uidem dolores. cu
o no falli viris intellegam3 ut fugit veritus placerat per.D? $resumen Q su.str$
$cadena3 '3 1''%? echo DN$resumenO]...^D? "# Lorem i+s&m ad ,is scri+ta blandit
+artiendo, e&m 0astidii acc&msan e&ri+idis in, e&m liber ,endreriK...L #"
$$C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
*n ejemplo un poco m2s complejoD puede darse con el uso combinado de 5arias (unc
iones7
$patron Q DdicitD? $inicio5patron Q stripos$$cadena3 $patron%? if$$inicio5patron
WQQ &alse% N echo su str$$cadena3 $inicio5patron3 strlen$$cadena%%? O "# dicit
ridens inciderint id. X&o m&ndi lobortis re0ormidans e&, legim&s senserit de0ini
ebas an eos. B& sit tincid&nt incorr&+te de0initionem, )is m&tat a00ert +erci+it
c&, eirmod consectet&er signi0er&m(&e e& +er. 7n &s& latine e(&idem dolores. X&
o no 0alli )iris intellegam, &t 0&git )erit&s +lacerat +er. #"
>on su.str$count'-cadena8 -patron( podremos obtener la cantidad de 5eces Aue el
patrn es encontrado en la cadena7
$cadena Q DHorem ipsum ad his scripta landit partiendo3 eum fastidii accumsan eu
ripidis in3 eum li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit
ridens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit defini
e as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit
cu3 eirmod consectetuer signiferum;ue eu per. Bn usu latine e;uidem dolores. cu
o no falli viris intellegam3 ut fugit veritus placerat per.D? $patron Q DutD? $a
pariciones Q su.str$count$$cadena3 $patron%? echo $apariciones? "" 5
Es posible tambiHnD reempla@ar una subcadena dentro de una cadena con su.str$rep
lace'-cadena8 -reemplaGo8 -inicio8 -longitud(7
$cadena Q DP*er recorr< las calles de Hiniers con mi primoD? $patron Q Dlas call
es de HiniersD? $ini Q stripos$$cadena3 $patron%? $nueva5cadena Q su.str$replace
$$cadena3 Dlos alrededores de IelgranoD3 $ini3 strlen$$patron%%?
$89

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
echo $nueva5cadena? "" 9'er recorr6 los alrededores de Nelgrano con mi +rimo
,unciones de encriptacin
Podemos obtener el hash "'/ con la (uncin md5'-cadena(7
$clave Q Dpepe5grillo-1251!D? $hash5clave Q md5$$clave%? echo $hash5clave? "" H1
A02eA502=1ba=d0Ab5=aQ0e105Q241
A'=E0TE)>IA )unca utilices con5ersores "'/ online# Estos con5ersoresD suelen alm
acenar las cadenas ingresadas asociadas al hash "'/ resultanteD lo cual directa
o indirectamenteD permite reali@ar una pseudo ingeniera in5ersa sobre los hashes
"'/D haciendo 5ulnerables las contrasePas# -iempre Aue necesites obtener el hash
"'/ de alguna cadenaD utili@a PHPL>!I7 php -r Cecho md5$Dcadena a hashearD%?C
PHP dispone de otras (unciones de ci(radoD para 5arios algoritmos como -HA$ & >0
>?8# -in embargo & a pesar de contar con la (uncin de ci(rado "'/D disponemos de
una (uncin Aue engloba todo lo anteriorD llamada hash'-algoritmo$cifrado8 -cadena
( Aue nos (acilita ci(rar una cadena en 5arios (ormatos # !os posibles algoritmo
s de ci(rado D pueden obtenerse con la (uncin hash$algos'( la cual retorna un arr
a& con todos los algoritmos disponibles7
$8$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
php 9 print5r$hash$algos'(%? Prra* $ ]'^ Q9 md2 ]1^ Q9 md! ]2^ Q9 md5 ]2^ Q9 sha
P ]!^ Q9 sha22! ]5^ Q9 sha25( ](^ Q9 sha24! ],^ Q9 sha5P2 ]4^ Q9 ripemd124 ]+^ Q
9 ripemd1(' ]1'^ Q9 ripemd25( ]11^ Q9 ripemd22' ]12^ Q9 whirlpool ]12^ Q9 tiger1
2432 ]1!^ Q9 tiger1('32 ]15^ Q9 tiger1+232 ]1(^ Q9 tiger1243! ]1,^ Q9 tiger1('3!
]14^ Q9 tiger1+23! ]1+^ Q9 snefru ]2'^ Q9 snefru25( ]21^ Q9 gost ]22^ Q9 adler2
2 ]22^ Q9 crc32 ]2!^ Q9 crc22 ]25^ Q9 salsa1' ]2(^ Q9 salsa2' ]2,^ Q9 haval12432
]24^ Q9 haval1('32 ]2+^ Q9 haval1+232 ]2'^ Q9 haval22!32 ]21^ Q9 haval25(32 ]22
^ Q9 haval1243! ]22^ Q9 haval1('3! ]2!^ Q9 haval1+23! ]25^ Q9 haval22!3! ]2(^ Q9
haval25(3! ]2,^ Q9 haval12435 ]24^ Q9 haval1('35 ]2+^ Q9 haval1+235 ]!'^ Q9 hav
al22!35 ]!1^ Q9 haval25(35 %
Ejemplo Ecorrer este script para 5er los resultadosF7
$clave Q Dt8xc(2!4- 812+D? $hashes Q arra*$%?
$88

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
foreach$hash5algos$% as $hash% N $hash5clave Q hash'-hash8 -clave(+ $hashes]$has
h^ Q $hash5clave? O
$8?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
0esumen de las principales (unciones de string
Tipo de $uncin %uncin Descripcin 3scapa una cadena aCadiendo %arras in!ertidas a e
C Y y %ytes nulos ACade %arras in!ertidas delante de . Y T U A ] f ^ $ $ % 3limi
na las %arras in!ertidas de una cadena escapada "on!ierte los caracteres a entid
ades :;ML &n!ersa a htmlentities "on!ierte a entidades :;ML los siguientes carac
teresD _ D C : 9
addslashes
Escape
Kuotemeta stripslashes htmlentities html$entity$decode htmlspecialchars
!onversin
htmlspecialchars$dec &n!ersa a htmlspecialchars ode strip$tags ltrim rtrim trim
nl2.r wordwrap strtolower lcfirst strtoupper
3limina todos los tags :;ML y : 3limina espacios en %lanco del comien9o de la ca
dena 3limina espacios en %lanco del final de la cadena 3limina espacios en %lanc
o del comien9o y final de la cadena "on!ierte saltos de l4nea en su e,ui!alente
:;ML AEusta el anc1o de caracteres de una cadena "on!ierte toda la cadena a minF
sculas "on!ierte a minFscula el primer carater de una cadena "on!ierte toda la c
adena a mayFsculas "on!ierte el primer car2cter de una cadena a mayFscula "on!ie
rte el primer car2cter de cada pala%ra de una cadena a mayFsculas 5ormatea un nF
mero con el s4m%olo de moneda correspondiente 5ormate un nFmero con el separdor
de miles y decimales correspondiente
%ormato
ucfirst ucwords money$format num.er$format
$8%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>Qplode strlen str$word$count str$replace str$ireplace
Manipulacin
Di!ide una cadena generando un array Retorna la longitud de una cadena "uenta la
cantidad de pala%ras Reempla9a iterati!amente un patrn Retorna la posicin del pat
rn %uscado en una cadena Retorna una porcin de la cadena Retorna la cantidad de ap
ariciones de un patrn en la cadena Reempla9a iterati!amente una porcin de la caden
a Retorna el 1as1 MD? de una cadena Retorna el 1as1 de una cadena( cifrado con e
l algoritmo indicado
strpos stripos su.str su.str$count su.str$replace su.str$ireplace md5
!i$rado
hash
$8/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Taller de Archi5os & Procesamiento de ,ormularios
En este tallerD crearemos un libro de 5isitas basado en el sistema de archi5os E
sin bases de datosF & utili@aremos a la 5e@D las librera de (unciones de stringD
para el procesamiento de los textos# Archi5os necesarios para el taller 'escarga
los archi5os Aue utili@aremos en el tallerD desde el siguiente enlace7 http7++t
allerLdeLphp#eugeniabahit#com+tallerLdeLarchi5osL &L.eb(orms#tar#g@
$81

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Anexo I7 constantesD 5ariables 5ariables & 5ariables superglobales
'urante el tallerD hemos introducido cuatro nue5os conceptosD de los cualesD tra
taremos aAuD dos de ellos7 constantes & 5ariables 5ariables # Para el procesamien
to del (ormularioD tambiHn hemos utili@ado la 5ariable superglobal -$P%25 de PHP
& hablaremos de ello#
>onstantes
PHPD a di(erencia de otros lenguajesD introduce el concepto de constante# *na co
nstanteD para PHPD es un identi(icador Aue se utili@a para almacenar datos (ijos
simples# -e di(erencian de las 5ariablesD en dos aspectos7 Almacenan datos simp
les EaunAue estoD es un punto discutibleF como una cadena de textoD un enteroD u
n (lotanteD etc# *na 5e@ de(inidos no pueden modi(icarse#

'e(inicin cl2sica de constantes en PHP


4riginalmenteD PHP reAuiere del uso de la (uncin define$CSKGI815715HP5)KS"-PS-1C3
CvalorC% para declarar & de(inir una constante7
define$C#81)BKC3 25.,4%?
$86

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
define$C#8K7R)-KC3 C"hort de define$C.PX5"-K)gC3 &alse%?
aao para niaoC%?
Por con5encinD el nombre de las constantes se de(ine en letras ma&3sculas # )o ob
stanteD aplican las reglas de nombre para la de(inicin de 5ariables# Este tipo de
constanteD puede de(inirse en cualAuier 2mbito de la aplicacin D &a sea dentro d
e una (uncin como (uera de ella# Para llamar a una constante D re(erencia a ellaD
por el nombre7
echo #81)BK? // imprime 25.,4
simplemente
se
hace
Este tipo de constantesD admiten como 5alor D cualAuier tipo de dato simpleD inc
lusoD una 5ariable7
$nom re Q strip5tags$$5/1-]Cnom re^%? define$CSKGI81C3 $nom re%?
'e(inicin de constantes en PHP /#?
'esde la 5ersin /#? de PHP D se introdujo el uso de la palabra cla5e const para d
e(inir constantes en PHP7
const #81)BK Q 25.,4? const #8K7R)-K Q C"hort de aao para niaosC?
Este tipo de constantesD son las Aue utili@aremos en nuestros cdigosD puesto Aue
las mismasD introducen un concepto m2s preciso & exacto de lo Aue es una constan
te7
$8G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit

-olo pueden declararse en el 2mbito global de la aplicacinV Admiten cualAuier tip
o de dato simpleD pero no admiten 5ariablesV El 5alor de estas constantesD no pu
ede (ormarse din2micamente Ees NconstanteO en todo sentidoFV )o pueden ser redec
laradas V
,inalidad de las constantes
-i bien en los ejemplos anterioresD hemos utili@ado un precio & producto para de
mostrar como de(inir constantesD la (inalidad de HstasD debe ser de(inir datos n
o 5ariables inherentes al n3cleo de una aplicacin # Para 5er un uso pr2ctico & pr
ecisoD re(erirse al taller de archi5os & .eb (orms#
$8C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
=ariables 5ariables
!eer la (rase N5ariables 5ariablesO no solo parece redundanteD sino adem2sD inex
acto & bastante con(uso# !o ciertoD es Aue no existe otra (orma de poder llamar
a las 5ariables cu&os nombres se (orman din2micamente & pueden ser modi(icados#
Es decirD Aue son N5ariablesO porAue aceptan datos Aue pueden ser modi(icados &
a la 5e@D 5uel5en a ser N5ariablesO porAue adem2s de sus datosD podemos modi(ica
r sus nombre7
$nom re5de5varia le Q CprecioC? $$nom re5de5varia le Q 25.,4? echo $nom re5de5va
ria le? "" im+rime +recio echo $$nom re5de5varia le? "" im+rime 25.AQ
Esto signi(icaD Aue el nombre de la 5ariable Aue almacena el 5alor 8/#6G ser2 Np
recioO# Es decirD Aue estamos creando una 5ariableD cu&o nombre es din2mico & po
r tantoD desconocemosD pero podemos acceder a ellaD &a Aue el nombre otorgadoD e
s el 5alor de otra 5ariable7
$a Q Dmi5varia leD? $$a Q ,5? echo D1l nom re de Y$Y$a es Y$N$aOD? "" salida: Bl
nombre de **a es *mi_)ariable
$?9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
=ariables superglobales
>omo hemos podido 5erD PHP dispone de 5ariables globales a las cuales se accede
mediante el uso de la palabra cla5e glo.al# As como existen las 5ariables globale
sD tambiHn podemos encontrar 5ariables superglobales # Estas 5ariables superglob
alesD suelen ser arra&s asociati5os desde los cuales PHPD de (orma nati5aD nos (
acilita su acceso desde cualAuier parte de la aplicacin sin necesidad de utili@ar
la palabra cla5e glo alD &a Aue son 5ariables internas# A lo largo del superglo
bales7 cursoD hemos utili@ado dos 5ariables
-$J>5 *n arra& asociati5o tipo cla5e aX 5alorD de los par2metros pasados al scri
pt mediante el mHtodo HTTP ETD es decirD par2metros pasados por *0!# -$P%25 Al i
gual Aue el anteriorD es un arra& asociati5o (ormado por cla5e aX 5alorD pero Au
e almacena los datos pasados al scriptD mediante el mHtodo HTTP P4-TD generalmen
teD a tra5Hs de un (ormulario# Adem2s de $5/1- & $5#K"-D existen otras 5ariables
superglobalesD Aue 5eremos m2s adelante# *na de las m2s importantesD es la 5ari
able superglobal -$2> U> Aue contiene in(ormacin del entorno del ser5idor & de la
ejecucin# Entre la lista de ndices Ecla5esF de este arra& asociati5o superglobalD
podemos encontrar algunos de uso (recuente como 81cR1"-5G1-.K7 Aue nos retorna
el mHtodo de peticin HTTP del script en ejecucin EP4-TD ETD P*T o HEA'F o
$?$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
81cR1"-5R8B Aue nos de5uel5e la *0I completa Aue se utili@ para acceder al script
D entre otros#
$metodo Q -$2> U> ;= >V1>25$L>5H%D=<? $uri Q -$2> U> ;= >V1>25$1 C=<? foreach$$5
"18J18 as $claveQ9$valor% N echo DY$5"18J18]C$claveC^ Q $valor: r/9D? O
El (oreach anteriorD generar2 una salida similar a la siguiente Ese resaltan los
:e&s m2s usualesF7
$5"18J18]C.--#5.K"-C^ a localhost $5"18J18]C.--#5)KSS1)-BKSC^ Q 6eep-alive $5"18
J18]C.--#5)P).15)KS-8KHC^ Q max-ageQ' -$2> U> ;=H55P$12> $?J>35=< Q Go@illa/5.'
$F11? Hinux i(4(% PppleEe git/525.11 $g.-GH3 li6e /ec6o% )hrome/1,.'.+(2.,+ "afa
ri/525.11 $5"18J18]C.--#5P))1#-C^ Q text/html3application/xhtmlTxml3application/
xml?;Q'.+3U/U?;Q'.4 $5"18J18]C.--#5P))1#-51S)K7BS/C^ Q g@ip3deflate3sdch -$2> U>
;=H55P$?BB>P5$4?3J1?J>=< Q es-!1+3es?;Q'.4 $5"18J18]C.--#5P))1#-5).P8"1-C^ Q B"
K-445+-13utf-4?;Q'.,3U?;Q'.2 $5"18J18]C#P-.C^ Q /usr/local/ in:/usr/ in:/ in $5"
18J18]C"18J185"B/SP-R81C^ Q $5"18J18]C"18J185"K&-EP81C^ Q Ppache -$2> U> ;=2> U>
$3?L>=< Q localhost $5"18J18]C"18J185P778C^ Q ::1 $5"18J18]C"18J185#K8-C^ Q 4'
$5"18J18]C81GK-15P778C^ Q ::1 -$2> U> ;=D%B1L>35$ %%5=< Q /var/www $5"18J18]C"18
J185P7GBSC^ Q we master@localhost -$2> U> ;=2B CP5$6C4>3?L>=< Q /var/www/euge/fi
le.php $5"18J18]C81GK-15#K8-C^ Q !,5,4 $5"18J18]C/P-1EPX5BS-18&P)1C^ Q )/B/1.1 $
5"18J18]C"18J185#8K-K)KHC^ Q .--#/1.1 -$2> U> ;= >V1>25$L>5H%D=< Q /1-$2> U> ;=V
1> N$25 C3J=< Q parametroQvalor -$2> U> ;= >V1>25$1 C=< Q /euge/file.phpAparamet
roQvalor $5"18J18]C")8B#-5SPG1C^ Q /euge/file.php $5"18J18]C#.#5"1H&C^ Q /euge/f
ile.php $5"18J18]C81cR1"-5-BG1C^ Q 1221,,2!'1
"2s in(ormacin obtenerse en7
sobre
la
superglobal
$5"18J18
puede
http7++...#php#net+manual+es+reser5ed#5ariables#ser5er#php#
$?8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
En5o de correo electrnico con PHP
PHPD dispone de una (uncin llamada mail'( Aue permite en5iar correos electrnicos t
anto en texto plano como HT"!D a tra5Hs del ser5idor WebD utili@ando la librera s
endmail EgeneralmenteD instalada por de(ectoF#
!a (uncin mail'( & su sintaxis
!a (uncin mail'( reAuiere Aue mnimamente le sean pasados ? par2mtros7 destinarioD
asunto & mensaje7
$destinatario Q Duser@mail.comD? $asunto Q D)orreo electrMnico enviado desde #.#
D? $mensa>e Q D1sta es una prue a de env<o.D? mail'-destinatario8 -asunto8 -mens
a@e(+
El par2metro NdestinatarioO7 (ormatos admitidos
!a (uncin mail$% admite como destinatarioD una o m2s direcciones de correo electrn
icoD debiando mantener alguno de los siguientes (ormatos7 Wnico destinatario7
user@mail.com
=arios destinatarios7
user2@mail.com3 user2@mail.com3 user5@mail.com
$??

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
'estinatario con nombre e eLmail7
[uan #Zre@ :mail@dominio.com9
=arios destinatarios con nombre e eLmail7
[uan #Zre@ :mail@dominio.com93 Pna /Mme@ :mail2@dominio.com9
R lgicamenteD anteriores7
cualAuier
combinacin
de
las
user2@mail.com3 Pna /Mme@ :mail2@dominio.com9
>abeceras adicionales como par2metro extra
AdicionalmenteD pueden sumarse a la (uncin mail$% cabeceras adicionales a ser en5
iadas# Estas cabecerasD pueden utili@arse para agregar destinatarios con cocopia
D con copia ocultaD direccin de respuestaD remitenteD tipo de contenidoD etc#
$destinatario Q Duser@mail.comD? $asunto Q D)orreo electrMnico enviado desde #.#
D? $mensa>e Q D1sta es una prue a de env<o.D? $ca $ca $ca $ca eceras5adicionales
eceras5adicionales eceras5adicionales eceras5adicionales Q D6rom: Pna Gar<a HMp
e@ :anita@mail.com9YrYnD? .Q D eply-to0 8oc<o Brao :rocio@mail.com9YrYnD? . DBc0
Priel 7omingo :ariel@mail.com9YrYnD? .Q DRcc0 "upervisor :admin@mail.com9YrYnD?
mail$$destinatario3 $asunto3 $mensa>e3 -ca.eceras$adicionales%?
>omprobando Aue el eLmail pudo en5iarse
!a (uncin mail$% retornar2 5 1> cuando el en5o del mensaje ha&a podido concretarse
# 'e lo contrarioD retornar2 6?42>7
$?%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
if'mail$$destinatario3 $asunto3 $mensa>e3 $ca eceras%( N echo D1l e-mail se ha e
nviado satisfactoriamente.D? O else N echo D"e ha producido un error al intentar
enviar el e-mailD? O
A'=E0TE)>IA !a (uncin mail$% abre un soc:et -"TP en cada llamada # -i bien puede
utili@arse esta (uncinD para reali@ar en5os iterati5os Emediante un bucle (orD por
ejemploFD se desaconseja iterar sobre esta (uncin en en5os masi5os#
$?/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
En5iando mensajes en (ormato HT"!
Para poder en5iar un mensaje con (ormato HT"! desde PHPD solo ser2 necesarioD ag
regar en las cabeceras del correo electrnicoD el Bontent-type correspondiente7
$destinatario Q Duser@mail.comD? $asunto Q D)orreo electrMnico enviado desde #.#
D? -mensa@e & /!p#!a href&/http0))es.wikipedia.org)wiki)4orem$ipsum/#4orem ipsum
!)a# ad his scripta .landit partiendo8 eum fastidii accumsan euripidis in8 eum l
i.er hendrerit an. Vui ut wisi voci.us suscipiantur8 !.#Kuo dicit ridens incider
int id!).#. Vuo mundi lo.ortis reformidans eu8 legimus senserit definie.as an eo
s. >u sit tincidunt incorrupte definitionem8 vis mutat affert percipit cu8 eirmo
d consectetuer signiferumKue eu per. Cn usu latine eKuidem dolores. Vuo no falli
viris intellegam8 ut fugit veritus placerat per.!)p#/+ -ca.eceras$adicionales ca.eceras$adicionales $ca eceras5adicionales $ca eceras5adicionales $ca eceras5a
dicionales $ca eceras5adicionales & .& .Q .Q .Q .Q /LCL>-Uersion0 P.:SrSn/+ /Bon
tent-type0 teQt)html+ charset&utf-WSrSn/+ D&rom: Pna Gar<a HMpe@ :anita@mail.com
9YrYnD? D8epl*-to: 8oc<o Brao :rocio@mail.com9YrYnD? D)c: Priel 7omingo :ariel@m
ail.com9YrYnD? DIcc: "upervisor :admin@mail.com9YrYnD?
if$mail$$destinatario3 $asunto3 $mensa>e3 $ca eceras5adicionales%% N echo D1l email se ha enviado satisfactoriamente.D? O else N echo D"e ha producido un error
al intentar enviar el e-mailD? O
TIP El mensaje a en5iar por correo electrnico puede ser cualAuier tipo de conteni
do almacenado en una 5ariable# Por lo tantoD puede utili@arse un sistema de plan
tillas HT"!D con file5get5contents$%D (ormatearse & manipularse el contenido e i
nclusoD reempla@ar datos din2micamente a tra5Hs de un (ormulario#
$?1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
,unciones para el manejo de ,echa & Hora
!a librera de (unciones para la manipulacin de (echas & horas de PHPD es lo su(ici
entemente ampliaD para permitirnos un control absoluto en el manejo de las misma
s# =eremos aAuD aAuellas Aue utili@aremos con ma&or (recuencia# -in embargoD una
gua completa de re(erencias de (unciones para (echa & horaD puede obtenerseD 5isi
tando la documentacin o(icial en http7++nc#php#net+manual+es+re(#datetime#php
,unciones simples de (echa & hora
4btener la (echa & hora actual en un arra& asociati5o
getdate'( es la (uncin indicada para obtener la in(ormacin relati5a a la (echa & h
ora actualD en un arra& asociati5o7
$datos5fecha5hora Q getdate'(? print5r$$datos5fecha5hora%? "# 9rra' ( KsecondsL
DM 5 Kmin&tesL DM 55 K,o&rsL DM 1= Kmda'L DM 15 KCda'L DM 4 KmonL DM 5 K'earL DM
2012 K'da'L DM A4 KCee[da'L DM 1,&rsda' Kmont,L DM >arc, K0L DM 1551Q411Q5
$?6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
) #"
El arra& asociati5o retornado por getdate'(D como bien se indica en el manual o(
icial?D de5ol5er2 las siguientes cla5es7
!lave seconds minutes hours mday wday mon year yday weekday month : Descripcin Ej
emplo de valores devueltos Representacion num'rica de los 0 a 59 segundos Repres
entacion num'rica de los minutos 0 a 59 Representacion num'rica de las 1oras 0 a
23 Representacion num'rica del d4a del 1 a 31 mes Representacion num'rica del d
4a de la 0 (para Domingo) 1asta 6 (para semana S2%ado) Representacion num'rica d
e un mes 1 1asta 12 Una representacion num'rica completa 3EemplosD 1999 o 2003 d
e una aCo( B d4gitos Representacion num'rica del d4a del 0 1asta 365 aCo Una rep
resentacin te-tual completa del Sunday 1asta Saturday d4a de la semana Una repres
entacin te-tual completa de January 1asta December un mes( como Ganuary o Marc1 D
ependiente del Sistema( Los segundos desde la Hpoca Unit4picamente -2147483648 1
asta 2147483647.
4btener (echa & hora actual con (ormato en una cadena de texto
*na (uncin Aue hemos utili@ado muchoD es date'(# Esta (uncin nos permite obtener d
atos relacionados a la (echa & hora actualD con un (ormato espec(ico# Este (ormat
oD se especi(ica como par2metro tipo string7
echo date$CX-m-dC%? "" 2012-05-15
? http7++nc#php#net+manual+es+(unction#getdate#phpYre(sect$L(unction#getdateL re
turn5alues $?G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
'entro del par2metro tipo stringD algunos de los (ormatos combinables de los cua
les disponemosD son los siguientes7
!ar&cter de formato Da d D j l (ILI minFscula) N D4a del mes( @ d4gitos con ceros
iniciales 01 a 31 Una representacin te-tual de un d4a( tres letras Mon 1asta Sun
D4a del mes sin ceros iniciales 1 a 31 Una representacin te-tual completa del d4
a de la Sunday 1asta Saturday semana Representacin num'rica &SOJKL67 del d4a de l
a 1 (para lunes) 1asta7 (para semana (aCadido en : ?.7.6) domingo) 0 (para domin
go) Representacin num'rica del d4a de la semana 1asta 6 (para s2%ado) 3l d4a del
aCo (comen9ando por 6) 0 1asta 365 NFmero de la semana del aCo &SOJKL67( las sem
anas comien9an en lunes (aCadido en : B.7.6) Una representacin te-tual completa d
e un mes( como Ganuary o Marc1 Representacin num'rica de una mes( con ceros inici
ales Una representacin te-tual corta de un mes( tres letras Representacin num'rica
de un mes( sin ceros iniciales NFmero de d4as del mes dado Si es un aCo %isiest
o Una representacin num'rica completa de un aCo( B d4gitos Una representacin de do
s d4gitos de un aCo )ora Ante meridiem y ost meridiem en minFsculas Ante meridie
m y ost meridiem en mayFsculas 5ormato de 7@ 1oras de una 1ora sin ceros inicial
es 5ormato de @B 1oras de una 1ora sin ceros iniciales $?C Descripcin Ejemplo de
valores devueltos
! Semana " Me# $ m M n t %&o ' ( y a % , 3EemploD 42 (la B@M semana del aCo)
January 1asta December 01 1asta 12 Jan 1asta Dec 1 1asta 12 28 1asta 31 1 si es
%isiesto( 0 si no. 3EemplosD 1999 o2003 3EemplosD 99 o 03 am o *m %M o +M 1 1ast
a 12 0 1asta 23

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!ar&cter de formato .
Descripcin
Ejemplo de valores devueltos 01 1asta 12 00 1asta 23 00 1asta 59 00 1asta 59 3Ee
mplosD 234( -M3(%tlant /c5%!ore# 1 si est2 en 1orario de !erano( 0 si no. 3Eempl
oD 80200 3EemploD 802900 3EemplosD :S3( MD3... -43200 1asta 50400
5ormato de 7@ 1oras de una 1ora con ceros iniciales 5ormato de @B 1oras de una 1
ora con ceros ) iniciales / Minutos( con ceros iniciales # Segundos( con ceros i
niciales 0ona1)orar/a &dentificador de 9ona 1oraria (aCadido en : e ?.7.6) 6 (i
Si la fec1a est2 en 1orario de !erano o no mayFscula) Diferencia de la 1ora de N
reenOic1 (NM;) en 7 1oras Diferencia con la 1ora de NreenOic1 (NM;) con + dos pu
ntos entre 1oras y minutos (aCadido en : ?.7.8) 3 A%re!iatura de la 9ona 1oraria
Pndice de la 9ona 1oraria en segundos. 3l 4ndice para 9onas 1orarias al oeste d
e U;" siempre es 0 negati!o( y para a,uellas al este de U;" es siempre positi!o.
$ec.a5)ora14om*leta c 5ec1a &SO KL67 (aCadido en : ?) r 2 5ec1a con formato R R
5" @K@@ Segundos desde la Hpoca Uni- (7 de 3nero del 7<A6 66D66D66 NM;)
@66BJ6@J7@;7?D7<D@7Q66D66 3EemploD 3.u;1211Dec120001 16901907180200
Alternati5amenteD es posible pasar como par2metro a date$% una constante de (orm
ato prede(inida 7
echo date$7P-158""%? "" 1,&, 15 >ar 2012 1Q:1=:21 -0500
*na lista completa de las constantes de (ormato prede(inidasD puede obtenerse en
http7++nc#php#net+manual+es+class#datetime#phpYdatetime#constan ts#t&pes A=I-4
$%9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
)tese Aue la hora tambiHn puede obtenerseD en (ormato hora *)ISD con la (uncin tim
e'(7 http7++nc#php#net+manual+es+(unction#time#php
=alidar una (echa
Podemos 5alidar la 5eracidad de una (echaD mediante el uso de la (uncin checkdate
'-mes8 -dia8 -aXo( teniendo en cuenta Aue retornar2 5 1> cuando se trate de una
(echa 52lidaD o 6?42> o en caso contrario7
if$checkdate'P28 258 2:PP( QQQ -rue% N echo D&echa v=lidaD? O else N echo D&echa
no v=lidaD? O
>2lculo de (echa + hora sencillo
Es posible reali@ar c2lculos sencillos con la (echa & horaD combinando el uso de
las (unciones date'( & time'(7
$ho* Q date$CX-m-dC%? $manana Q date$CX-m-dC3 $time$% T $1 U 2! U (' U ('%%%? $a
*er Q date$CX-m-dC3 $time$% - $1 U 2! U (' U ('%%%? "# (1 # 24 # =0 # =0) e(&i)a
le a: 1 d6a 24 ,oras =0 min&tos =0 seg&ndos #" echo $a*er . chr$1'% . $ho* . chr
$1'% . $manana . chr$1'%? "# 2011-11-0Q (a'er) 2011-11-0H (,o') 2011-11-10 (maSa
na) #"
!o anteriorD es posible gracias a Aue la (uncin date'( puede recibir opcionalment
e como par2metroD una marca de tiempo
$%$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
tipo *)IS Etimestamp F# >uando la marca de tiempo no es pasada como par2metroD d
ate$% retornar2 el (ormato indicadoD teniendo en cuenta la (echa & hora actual#
Pero cuando una marca de tiempo le es pasadaD (ormar2 esa (echa & hora# 'ado Aue
time$% retorna la (echa+hora en (orma *)IS EtimestampF al sumar o restar median
te otra marca de tiempoD ser2 posible obtener el timestamp deseadoD Aue permitir
2 ser (ormateado con date$%#
php # echo 4(!'' php # echo 12214!,42, php # $a Q php # echo 1221+2!22, php # ec
ho 2'12-'2-1( 1 U 2! U (' U (' ? time$%? 12214!,42, T 4(!''? $a? date$CX-m-dC3 $
a%?
4tra (orma de obtener la marca de tiempo de una (echa determinada es con la (unc
in mktime'(7
php # echo m6time$%? 12214!42((
-i m6time$% no recibe par2metrosD retornar2 la marca de tiempo de la (echa & hor
a actual# 'e lo contrarioD deber2 recibir los par2metros correspondientes a hora
D minutoD segundoD mesD da & aPo#
echo mktime':8 :8 :8 P28 258 2:PP(+ "" obtiene la marca de tiem+o del 25 de dici
embre de 2011
Por lo tantoD podramos reali@ar c2lculosD utili@ando m6time$% como se muestra a c
ontinuacin7
$dia5ho* Q $int%date$CdC%? $mes5ho* Q $int%date$CmC%? $anio5ho* Q $int%date$CXC%
? $semana5siguiente Q mktime$'3 '3 '3 $mes5ho*3 -dia$hoy7Y3 $anio5ho*%?
$%8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
echo date$CX-m-dC3 $semana5siguiente%?
AunAue esta 3ltima (ormaD no es la m2s acertada#
Ejemplos pr2cticos de c2lculos basados en (echas
I>u2nto tiempo ha pasadoJ
Problema7 El $/ de mar@o de 89$$D )atalia le coment a su madreD Aue comen@ara a ah
orrar dinero para comprar un nue5o ordenador & Aue a tal (inD todos los das guard
ara en una caja de @apatosD `8D6/# I>u2nto dinero habr2 ahorrado )atalia a la (ec
ha de ho&J -olucin7
"" obtengo la marca de tiem+o +ara el 15"05"2011 $fecha5inicio Q m6time$'3 '3 '3
23 153 2'11%? "" obtengo la marca de tiem+o +ara ,o' $fecha5fin Q m6time$%? ""
obtengo la di0erencia timestam+ entre ambas 0ec,as $diferencia Q $$fecha5fin - $
fecha5inicio%? "" con)ierto a d6as la di0erencia timestam+ -dias & -diferencia )
'2E 9 Z: 9 Z:(+ # das que pasaron entre dos fechas "" dinero a,orrado x d6a $din
ero Q 2.,5? "" obtengo el im+orte total a,orrado, "" m&lti+licando los d6as x el
im+orte diario $ahorro Q $dias U $dinero? "" 7m+rimo el res&ltado echo $ahorro?
$%?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
I<uH edad tiene###J
Problema7 !ucasD naci el 86 de -eptiembre de $C6G I<uH edad tiene ho&J -olucin7
"" obtengo la marca de tiem+o de la 0ec,a de nacimiento $fecha5nacimiento Q m6ti
me$'3 '3 '3 +3 2,3 1+,4%? "" obtengo la marca de tiem+o de la 0ec,a act&al $ho*
Q m6time$%? "" obtengo la di0erencia entre 0ec,a de nacimiento ' ,o' $diferencia
Q $ho* - $fecha5nacimiento? "" obtengo la edad $edad Q -diferencia ) '3Z5 9 2E
9 Z: 9 Z:(+ # aos que pasaron entre 2 fechas "" im+rimo la edad echo $int%$edad?
IEn AuH (echa naci###J
Problema7 !uciana tiene ho&D $/ aPos IEn AuH (echa pudo haber nacido !ucianaJ -o
lucin7
"" edad act&al de L&ciana en aSos $edad Q 15? "" +robable aSo de nacimiento de l
&ciana $anio Q 'int(date'=N=( - -edad? "" +robable 0ec,a de nacimiento m%s antig
&a $pro a le5mas5antigua Q date$Cd/m/C% . $$anio-1%? "" +robable 0ec,a de nacimi
ento m%s reciente
$%%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$pro a le5mas5reciente Q date$Cd/m/C% . $anio? echo !!!>%5 Huciana tiene ;ue ha
er nacido despuZs del -pro.a.le$mas$antigua * antes o durante el -pro.a.le$mas$r
eciente . >%5+
$%/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
,unciones matem2ticas
PHP dispone de una gran galera de (unciones matem2ticas prede(inidasD Aue pueden
encontrarse en la documentacin o(icial 5isitando http7++...#php#net+manual+es+re(
#math#php "uchas de estas (uncionesD nos resultar2n de gran a&udaD con5irtiHndos
e en (unciones de uso (recuente para nuestros programas# =eremos las mismas a co
ntinuacin#
4btener un n3mero ele5ado a la potencia
pow$$ ase3 $potencia%
echo pow$23 2%? "" Q echo pow$53 2%? "" 25
4btener el n3mero m2s alto & el n3mero m2s bajo
maQ$$valores% - min$$valores%
$precios Q arra*$12.,53 !2.+'3 1'(.('3 +3 25.45%? $producto5mas5caro Q max$$prec
ios%? "" 10=.= $producto5mas5 arato Q min$$precios%? "" H
$me>or5oferta Q max$1',.,53 1'+.4!%? "" 10H.Q4 $peor5oferta Q min$1',.,53 1'+.4!
%? "" 10A.A5
$%1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
0edondear un n3mero con ) cantidad de decimales
round$$numero3 $decimales%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? ""
1=5.2=5A $iva Q round$$iva3 2%? "" 1=5.2=
0edondear un n3mero hacia abajo
floor$$numero%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? ""
1=5.2=5A $iva Q floor$$iva%? "" 1=5
0edondear un n3mero hacia arriba
ceil$$numero%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? ""
1=5.2=5A $iva Q ceil$$iva%? "" 1==
$%6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4btener un n3mero entero aleatorio
rand$$numero5minimo3 $numero5maximo%
$password Q rand$1+++++3 ++++++%? "" 15Q055
,unciones para el manejo de matrices
En captulos anterioresD cuando hablamos sobre arra&sD pudimos 5er 5arias (uncione
s 3tiles para manejar estos tipos m2s complejos# A lo largo de los talleres & ej
ercicios Aue hemos hechoD tambiHn pudimos lle5ar dichas (unciones a la pr2ctica#
=eremos aAu una lista de (unciones para el manejo de matricesD de (orma m2s deta
llada# )o obstanteD una lista completa puede obtenerse en http7++...#php#net+man
ual+es+re(#arra&#php
'i5iendo & uniendo arra&s
'i5idir un arra& en matrices m2s peAuePas
array$chunk$$arra*3 $tamaao]3 $conservar5claves^% oolean
)tese Aue el tercer argumento es opcional# Por de(ectoD arra*5chun6D crear2 nue5a
s cla5es en los nue5os arra&# Pero si se indica -8R1D conser5er2 estas cla5es#
$%G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3 C8aulC3
C1ste anC3 C7iegoC%? $grupos Q arra*5chun6$$personas3 2%? print5r$$grupos%? "#
9rra' ( K0L DM 9rra' ( K0L DM F&an K1L DM Bmilse K2L DM .edro ) K1L DM 9rra' ( K
0L DM Bliseo K1L DM 2osa K2L DM oelia ) K2L DM 9rra' ( K0L DM 2a&l K1L DM Bsteba
n K2L DM ;iego ) ) #"
>on una iteracinD inclusoD podramos asignar los grupos creados a nue5os arra&7
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3 C8aulC3
C1ste anC3 C7iegoC%? $grupos Q arra*5chun6$$personas3 2%? foreach$$grupos as $n
umeroQ9$grupo% N $nom re5arra* Q Dgrupo5N$numeroOD? $$nom re5arra* Q $grupo? O
,inalmenteD obtendramos ? nue5os arra&sD llamados $grupo5'D $grupo51 & $grupo52D
respecti5amente#
$%C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4btener la porcin espec(ica de un arra&
array$slice$$arra*3 $desde]3 $hasta^%
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3 C8aulC3
C1ste anC3 C7iegoC%? $primeras525personas Q arra*5slice$$personas3 '3 2%? print
5r$$primeras525personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilse K2L DM .edro ) #"
$personas5restantes Q arra*5slice$$personas3 2%? print5r$$personas5restantes%?
"# 9rra' ( K0L DM Bliseo K1L DM 2osa K2L DM oelia K5L DM 2a&l K4L DM Bsteban K5L
DM ;iego ) #"
>ombinar dos arra&sD utili@ando uno para las cla5es & otro para los 5alores
array$com.ine$$arra*5claves3 $arra*5valores%
$comodines Q arra*$CN-B-RHKOC3 CN"RI-B-RHKOC%? $valores Q arra*$CGanual de #.#C3
C-ra a>ando con arra*sC%? $datos Q arra*5com ine$$comodines3 $valores%? print5r
$$datos%? "# 9rra' ( K\171!LJ]L DM >an&al de ./. K\-!N171!LJ]L DM 1raba:ando con
arra's
$/9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
) #"
>ombinar dos o m2s arra&s
array$merge$$arra*513 $arra*52]3 $mas5arra*s^%
$grupo5a Q arra*$C1liseoC3 CSoemiC3 C"antiagoC%? $grupo5 Q arra*$C7iegoC3 C)ecil
iaC3 C8omanC%? $personas Q arra*5merge$$grupo5a3 $grupo5 %? print5r$$personas%?
"# 9rra' ( K0L DM Bliseo K1L DM oemi K2L DM -antiago K5L DM ;iego K4L DM Cecilia
K5L DM 2oman ) #"
>ombinar dos o m2s arra&s multidimensionales de manera recursi5a
array$merge$recursive$$arra*513 $arra*52]3 $mas5arra*s^%
$persona5a Q arra*$CSom reCQ9C1liseoC3 C1dadCQ925%? $persona5 Q arra*$CSom reCQ9
CGiriamC3 C1dadCQ92,%? $personas Q arra*5merge5recursive$$persona5a3 $persona5 %
? print5r$$personas%? "# 9rra' ( K ombreL DM 9rra' ( K0L DM Bliseo K1L DM >iriam
) KBdadL DM 9rra'
$/$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
( K0L DM 25 K1L DM 5A ) ) #"
4rdenando Arra&s por sus 5alores
4rdenar un arra& de menor a ma&or
sort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? sort$$nom res%? print5r$$no
m res%? "# 9rra' ( K0L DM 9na K1L DM ;iego K2L DM Bliseo K5L DM oemi ) #"
4rdenar un arra& de ma&or a menor
rsort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? rsort$$nom res%? print5r$$n
om res%? "# 9rra' ( K0L DM oemi K1L DM Bliseo K2L DM ;iego
$/8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
K5L DM 9na ) #"
4rdenar un arra& de menor a ma&or manteniendo la relacin con los ndices
asort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? asort$$nom res%? print5r$$n
om res%? "# 9rra' ( K2L DM 9na K1L DM ;iego K5L DM Bliseo K0L DM oemi ) #"
4rdenar un arra& de ma&or a menor manteniendo la relacin con los ndices
arsort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? arsort$$nom res%? print5r$$
nom res%? "# 9rra' ( K0L DM oemi K5L DM Bliseo K1L DM ;iego K2L DM 9na ) #"
$/?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4rdenando Arra&s por su cla5e
4rdenar un arra& de menor a ma&or por su cla5e
ksort$$arra*%
$personas Q arra*$ CSom reC Q9 CGiguelC3 CPpellidoC Q9 CGonteroC3 %? 6sort$$pers
onas%? print5r$$personas%? "# 9rra' ( K9+ellidoL DM >ontero K ombreL DM >ig&el )
#"
4rdenar un arra& de ma&or a menor por su cla5e
krsort$$arra*%
$personas Q arra*$ CSom reC Q9 CGiguelC3 CPpellidoC Q9 CGonteroC3 C-alleC Q9 CFH
C3 %? 6rsort$$personas%? print5r$$personas%? "# 9rra' ( K1alleL DM GL K ombreL D
M >ig&el K9+ellidoL DM >ontero ) #"
$/%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>omparando (unciones de ordenamiento de arra&s
%uncin asort arsort ksort krsort sort rsort 'rdena por !alor !alor cla!e cla!e !a
lor !alor Mantiene las claves asociadas S& S& S& S& NO NO 'rden de clasi$icacin m
enor a mayor mayor a menor menor a mayor mayor a menor menor a mayor mayor a men
or
Agregar & Eliminar elementos de un arra&
Agregar elementos al (inal del arra&
array$push$$arra*3 $valores%
$personas Q arra*$C[uanC3 C1milioC%? arra*5push$$personas3 CGiguelC3 CPnaC3 C.er
minioC%? print5r$$personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio K2L DM >ig&el
K5L DM 9na K4L DM /erminio ) #"
$//

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Agregar elementos al comien@o del arra&
array$unshift$$arra*3 $valores%
$personas Q arra*$C[uanC3 C1milioC%? arra*5unshift$$personas3 CGiguelC3 CPnaC3 C
.erminioC%? print5r$$personas%? "# 9rra' ( K0L DM >ig&el K1L DM 9na K2L DM /ermi
nio K5L DM F&an K4L DM Bmilio ) #"
Eliminar el 3ltimo elemento de un arra&
array$pop$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%? arra*5pop$$personas%? print5r$$perso
nas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio ) #"
Eliminar el primer elemento de un arra&
array$shift$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%? arra*5shift$$personas%? print5r$$per
sonas%? "# 9rra' (
$/1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
) #"
K0L DM Bmilio K1L DM 9na
Eliminar 5alores duplicados en un arra&
array$uniKue$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC3 C1milioC%? $personas Q arra*5uni;ue$$
personas%? print5r$$personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio K2L DM 9na )
#"
B3sAuedas & (iltros
>ontar la cantidad de 5eces Aue los elementos aparecen en un arra&
array$count$values$$arra*%
$frutas Q arra*$CperaC3 Cman@anaC3 CperaC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3
Cman@anaC3 CmelMnC3 CperaC3 CmandarinaC3 Cnaran>aC3 ClimMnC3 ClimaC3 CpomeloC3
CperaC%? $repeticiones Q arra*5count5values$$frutas%? foreach$$repeticiones as $
frutaQ9$veces% N if$$veces 9 1% N echo SUsted repiti T#frutaU T#!ecesU !ecesS . "
1r(76)V U O "# !sted re+iti? +era 4 )eces
$/6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!sted re+iti? manEana 2 )eces !sted re+iti? mel?n 2 )eces #"
>ontar la cantidad de elementos de un arra&
count$$arra*%
$frutas Q arra*$CperaC3 Cman@anaC3 Cdura@noC%? echo count$$frutas%? "" 5
4btener la suma matem2tica de los 5alores de un arra&
array$sum$$arra*%
$precios Q arra*$,5.!'3 +2.123 ,3 25.143 1,2.('%? $total Q arra*5sum$$precios%?
echo $total? "" 5A4.5
4btener las di(erencias entre dos o m2s arra&s
array$diff$$arra*513 $arra*52]3 $arra*523 h.^%
$frutas51 Q arra*$CperaC3 Cman@anaC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3 Cmand
arinaC3 Cnaran>aC3 ClimMnC3 ClimaC3 CpomeloC%? $frutas52 Q arra*$CperaC3 Cman@an
aC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3 CmandarinaC3 ClimaC3 CpomeloC%? $difer
encias Q arra*5diff$$frutas513 $frutas52%? echo DHas siguientes frutas no est=n
en los 2 arra*s:D . )hr$1'%?
$/G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
foreach$$diferencias as $fruta5no5repetida% N echo D- N$fruta5no5repetidaOD . )h
r$1'%? O "# Las sig&ientes 0r&tas no est%n en los 2 arra's: - naran:a - lim?n #"
,iltrar datos de un arra&D utili@ando una (uncin de retorno
array$filter$$arra*3 $funcion%
$datos Q arra*$253 !2.23 (!.+43 22.,3 ClunaC3 +53 223 ('.'53 CaguaC3 CsolC%? fun
ction retornar5enteros$$dato% N if$is5int$$dato%% N return $dato? O O function r
etornar5otros5datos$$dato% N if$Wis5int$$dato%% N return $dato? O O $enteros Q a
rra*5filter$$datos3 Cretornar5enterosC%? $otros5datos Q arra*5filter$$datos3 Cre
tornar5otros5datosC%? print5r$$enteros%? "# 9rra' ( K0L DM 25 K5L DM H5 K=L DM 5
2 ) #" print5r$$otros5datos%? "# 9rra' ( K1L DM 45.2 K2L DM =4.HQ K5L DM 55.A
$/C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
) #"
K4L KAL KQL KHL
DM DM DM DM
l&na =0.05 ag&a sol
=eri(icar si un arra& contiene una cla5e determinada
array$key$eQists$$clave3 $arra*%
if$Warra*56e*5exists$CpasswordC3 $5#K"-%% N echo C7e e indicar una contraseaaC?
O
4btener todas las cla5es de un arra& o todos los 5alores
array$keys$$arra*% - array$values$$arra*%
$li ro Q arra*$ C-ituloC Q9 CGanual de #.#C3 C"u tituloC Q9 C-ra a>ando con arra
*sC3 CPutorC Q9 C1ugenia IahitC3 C&echaC Q9 C12/1'/2'11C3 %? $claves Q arra*56e*
s$$li ro%? $valores Q arra*5values$$li ro%? print5r$$claves%? "# 9rra' ( K0L DM
1it&lo K1L DM -&btit&lo K2L DM 9&tor K5L DM 3ec,a ) #" print5r$$valores%?
$19

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"# 9rra' ( K0L K1L K2L K5L ) #"
DM DM DM DM
>an&al de ./. 1raba:ando con arra's B&genia Na,it 12"10"2011
=eri(icar si un arra& contiene una 5alor determinada
in$array$$valor3 $arra*%
if$in5arra*$5'3 $punta>e%% N echo CRsted ha o tenido el m=ximo punta>e posi le e
n una respuestaC? O
Buscar un 5alor detrminado en un arra& & obtener su cla5e correspondiente
array$search$$valor3 $arra*%
$personas Q arra*$C[uanC3 CPnaC3 C1milseC3 C7iegoC%? $persona5 uscada Q C1milseC
? $resultado Q arra*5search$$persona5 uscada3 $personas%? var5dump$$resultado%?
"" int(5)
$1$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>oo:ies & -esiones de usuario
I<uH es una coo:ieJ
*na coo:ie es un archi5o de texto planoD Aue se almacena remotamente Len la m2Au
ina del clienteL a tra5Hs del na5egador# >ada coo:ie Larchi5oL es un conjunto de
datos Aue pro5ienen del mismo ser5idor Lm2s precisamenteD del mismo dominioL# B
2sicamenteD cada coo:ie tendr2 asociado a ellaD un nombre Aue la identi(iAue & u
n 5alor# !os datos Aue se almacenan remotamente en el ordenador del clienteD pue
den ser de cualAuier tipo & el objeti5o de estosD es7 Almacenar in(ormacin relati
5a al usuarioV Acceder a esa in(ormacinD para reali@ar seguimientos & acciones pe
rsonali@adas con respecto a cada usuario en particular
'e esta (ormaD podramos pedirle a un usuarioD Aue ingrese su nombre mediante un W
eb ,orm Epor ejemploD ingresa el nombre Nea5ierOFD almacenar ese dato en una coo
:ieD & asD cada 5e@ Aue el usuario ingrese a nuestra aplicacin o -itio WebD buscara
mos esa coo:ieD accederamos a ellaD leeramos los datos & (inalmenteD podramos mostr
arle al usuarioD un mensaje personali@adoD Aue diga NHola ea5ier;O#
$18

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
=ale aclarar entoncesD Aue las coo:ies se pueden crearD leerD modi(icar & elimin
arD tanto por nuestra aplicacin como por el mismo usuarioD si Hste es adem2s de c
uriosoD medianamente a5e@ado#
!as coo:ies no son eternas
As como una coo:ieD posee un nombre & 5alor asociadoD tambiHn puede tener asociad
aD una (echa de caducidad o perodo de 5alide@ # 'e esta (ormaD podemos crear una
coo:ie indicando Aue expire el $8 de (ebrero de 89$/ & otraD Aue lo haga dentro
de 1 das# Pero las coo:iesD pueden desaparecer antes de lo pre5istoD &a Aue al se
r archi5os pertenecientes al usuario & por tantoD almacenados en su propio orden
adorD el usuario podra eliminarlos#
I<uH son las sesiones de usuarioJ
!as sesiones de usuarioD al igual Aue las coo:iesD son una (orma de almacenar in
(ormacin relati5a al usuarioD Aue permiten Aue dicha in(ormacin se propague & mant
enga acti5aD con cada accin del usuario sobre nuestra App o -itio Web# !as sesion
esD tambiHn son almacenadas remotamente mediante coo:iesD pero a la 5e@ son rete
nidas localmente en memoria# A di(erencia de las coo:iesD las sesiones expiran p
asado un perodo de tiempo prestablecidoD de inacti5idad por parte del usuario# >o
mo di(erencias (undamentales
$1?
entre
coo:ies
&

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
sesionesD podemos mencionar Aue7 !as sesiones crean coo:iesD pero las coo:ies no
crean sesionesV !as sesiones expiran autom2ticamente por inacti5idad del usuari
oD tras un perodo de tiempo predeterminadoD mientras Aue las coo:ies expiran en l
a (echa Aue se les indiAue o porAue son eliminadas por el usuarioV
*sos e importancia
>omo bien hemos dicho antesD tanto coo:ies como sesiones se utili@an para person
ali@ar la experiencia del usuario# 'e esta (ormaD podremos saber Aue todos los s
istemas Web Aue restringen su acceso mediante contrasePasD pueden hacerlo gracia
s al uso de coo:ies & sesiones# Por elloD es tan importante tener dominio tanto
de unas como de otras#
!o b2sico
Antes de 5er como implementar el uso de coo:ies & sesiones en una aplicacin WebD
necesitamos conocer cmo lle5ar adelante las acciones b2sicas Aue podemos reali@ar
con las coo:ies & sesiones# Estas acciones son7 crearlasD leerlas D modi(icarla
s & eliminarlas#
>reacinD lecturaD modi(icacin & eliminacin de coo:ies
Para reali@ar acciones con coo:iesD adem2s de un gran n3mero de (uncionesD PHP n
os brinda un arra& superglobal denominado -$B%%[C>D el cual nos permitir2 accede
r en todo momento a los datos del usuario#
$1%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>rear una coo:ie
Para crear una coo:ie utili@aremos la (uncin setcookie'( de PHP# En orden de apar
icinD los par2metros Aue esta (uncin recibeD son los siguientes7 Par2metros obliga
torios7 $# )ombre de la coo:ie# Ejemplo7 username 8# =alor# Ejemplo7 >avier,5 Pa
r2metros opcionales7 ?# "omento en el Aue debe expirar # -i no se indicaD caduca
autom2ticamente# Ejemplo en segundos7 time$% T 2('' Lel eAui5alente a $ horaL %
# 'irectorio en el cu2l es 52lida la coo:ie# -e debe utili@ar C/C para Aue sea 5
2lida en todo el dominio# Ejemplo7 C/C /# 'ominio# Ejemplo7 eugenia ahit.com 1#
-olo se transmite por HTTP-# Ejemplo7 &alse 6# -olo se transmite por HTTP# Ejemp
lo7 -rue# -iempre se recomien@a indicar -8R1D a (in de e5itar Aue la coo:ie pued
a ser accedida mediante ea5a-criptD & por lo tantoD 5ulnerable a ataAues del tip
o S--#
$nom re Q Dnom re * apellidoD? $valor Q D1ugenia IahitD? $expira Q time$% T $2('
' U 2! U 2(5%? "" 1 aSo $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? "" no se
r% )%lida en CCC.e&geniaba,it.com $https Q &PH"1? $http Q -8R1? setcoo6ie$$nom r
e3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?
$1/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!eer una coo:ie
Para leer una coo:ieD haremos uso del arra& superglobal $5)KKgB17
echo D.ola N$5)KKgB1]Dnom re * apellidoD^OWD? "" /ola B&genia Na,it^
"odi(icar una coo:ie
!a (orma correcta de modi(icar una coo:ieD es sobreescribirlaD es decirD 5ol5er
a crearla7
$nom re Q Dnom re5*5apellidoD? -valor & /\uan POreG/+ $expira Q time$% T $2('' U
2! U 2(5%? $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? $https Q &PH"1? $htt
p Q -8R1? setcoo6ie$$nom re3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?
AhoraD la coo:ie NnombreB&BapellidoO tendr2 el 5alor Neuan PHre@O#
Eliminar una coo:ie
Para eliminar una coo:ieD el mejor mHtodo es 5ol5er a crear la coo:ieD con 5alor
SRHH haciendo Aue expire antes de la (echa actual7
$nom re Q Dnom re5*5apellidoD? -valor & 3144+ $expira Q time$% - $2('' U 2! U 2(
5%? "" 1 aSo antes $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? $https Q &PH"
1? $http Q -8R1?
$11

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
setcoo6ie$$nom re3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?
*n ejemplo pr2ctico con >oo:ies
=amos a crear un script sencilloD Aue solicite al usuarioD el idioma en el Aue d
esea leer un artculo & 5amos a guardar su pre(erencia en una coo:ieD a (in de Aue
cada 5e@ Aue 5isite nuestro sitio WebD podamos decidir en AuH idioma le mostrar
emos el artculo# Paso a paso7 $# >rear una carpeta llamada sitio-we -multi-idioma
8# 'entro de ellaD 5amos a crear otra carpeta llamda paginas ?# 'entro de la ca
rpeta paginasD 5amos a crear 8 archi5os7 hola5en.html hola5es.html %# En el arch
i5o hola5en.html 5amos a escribir cualAuier texto en inglHsD & en el archi5o hol
a5es.htmlD cualAuier texto en espaPol AhoraD dentro de la carpeta sitio-we -mult
i-idioma 5amos a crear los siguientes archi5os7 template.html cam iar5idioma.php
funciones.php index.php En los cualesD 5amos a colocar el cdigo Aue se describe
a continuacin#
$16

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Archi5o template.html -er2 nuestra 5ista HT"!D en la cualD mostraremos un (ormul
ario Aue permita al usuario elegir el idioma en el cual 5er la p2gina#
:head9 :meta http-e;uivQD)ontent--*peD contentQDtext/html? charsetQutf-4D/9 :tit
le9Ee "ite:/title9 :/head9 : od*9 :header9 :h19Ee "ite:/h19 :/header9 :nav9 :for
m methodQD#K"-D actionQDcam iar5idioma.phpD idQDfrm5idiomaD9 :la el forQDlangD91
li>a su idioma / choose *our language::/la el9 :select idQDlangD nameQDidiomaD9
:option valueQDesD91spaaol:/option9 :option valueQDenD91nglish:/option9 :/select
9 :input t*peQDsu mitD valueQDKgD/9 :/form9 :/nav9 :article9 *P?JC3?, !F-?KuM se
reemplaGarI el contenido por el del archivo hola$es.html u hola$en.html seg]n e
l idioma elegido por el usuario --# :/article9 :/ od*9 :/html9
Archi5o funciones.php En este archi5o de(ineremos todas las (unciones necesarias
para recibir los datos del (ormularioD crear la coo:ieD renderi@ar el HT"! & mo
strar la p2gina#
:Aphp ^ 5rae los datos del formulario function get5idioma$% N $pagina Q Dpaginas
/hola5es.htmlD? if$isset$$5#K"-]CidiomaC^%% N $idioma Q $5#K"-]CidiomaC^?
$1G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
switch $$idioma% N case CesC: $pagina Q Dpaginas/hola5es.htmlD? rea6? case CenC:
$pagina Q Dpaginas/hola5en.htmlD? rea6? O O return $pagina? O ^ Lodifica el idi
oma elegido _ crea o modifica la cookie function cam iar5idioma$% N $pagina Q ge
t5idioma$%? setcoo6ie$DpaginaD3 $pagina3 time$%T$2(''U2!U2(5%%? header$CHocation
: index.phpC%? O ^ 5rae el contenido de la pIgina seg]n el idioma function get5p
agina$% N if$isset$$5)KKgB1]CpaginaC^%% N $pagina Q $5)KKgB1]CpaginaC^? O else N
$pagina Q Dpaginas/hola5es.htmlD? O return file5get5contents$$pagina%? O ^ Lues
tra la pIgina al usuario function mostrar5pagina$% N $plantilla Q file5get5conte
nts$Dtemplate.htmlD%? $contenido Q get5pagina$%? $html Q str5replace$DN#P/BSPOD3
$contenido3 $plantilla%? echo $html? O A9
Archi5o cam.iar$idioma.php A este archi5o es en5iado el (ormulario & es Auien se
encarga de llamar a la (uncin Aue se ocupa de modi(icar o crear la coo:ie con la
eleccin del idioma del usuario#
:Aphp re;uire5once$Dfunciones.phpD%? cam iar5idioma$%? A9
$1C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Archi5o indeQ.php Este archi5oD reAuerir2 tambiHn de (unciones#php# -er2 el arch
i5o principalD Aue se encargue de llamar a la (uncin mostrar5pagina$%#
:Aphp re;uire5once$Dfunciones.phpD%? mostrar5pagina$%? A9
'escarga los archi5os de este ejemplo desde la Web del cursoD en7 http7++tallerL
deLphp#eugeniabahit#com 4 mira el ejemplo en marcha ingresando en7 http7++taller
LdeLphp#eugeniabahit#com+EjemplosLEnL "archa+sitioL.ebLmultiLidioma+
Trabajando con -esiones
!leg la hora de introducirnos m2s a (ondo con las sesiones para ir (inali@ando co
n la primera parte del curso &D &a adentrarnos en el trabajo con bases de datos#
As Aue M)o perdamos tiempo;
$69

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Primeros pasos con sesiones
Antes de comen@ar a crear sesiones L& manipularlasLD es necesario saberD Aue par
a poder trabajar con ellasD a di(erencia de las coo:iesD es necesario iniciali@a
rlas # Para elloD PHP nos pro5ee de la (uncin session$start'(D la cual debe ser l
lamada siempreD antes de reali@ar cualAuier otra operacin relacionada con sesione
s 7
session5start$%?
A=I-47 Al igual Aue con las coo:iesD PHP tambiHn nos otorga un arra& superglobal
para acceder a las sesionesD llamado -$2>22C%3
4tra particularidad a tener en cuentaD es Aue PHPD genera un identi(icador 3nico
de sesin del usuario D LAue nos permitir2 utili@arlo para identi(icar en cada se
sin & de manera ineAu5oca al usuarioL al cual se puede accederD in5ocando a la (un
cin session$id'(7
session5start$%? echo session5id$%?
>rear una nue5a sesin
"ediante el arra& superglobal -$2>22C%3D podemos crearD leer & modi(icar sesione
sD de manera simple & directa7
$6$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Recuerda que tanto para iniciar una nueva sesin como para reanudar una sesin exist
ente siempre tendrs que hacerlo con session_start() sin excepcin.
session5start$%? $5"1""BKS]CusuarioC^ Q C>avier,5C? "" creo la sesi?n W&s&arioW
!eer una sesin
-i se desea obtener la I' de sesinD habr2 Aue recurrir a la (uncin sessionBstartEF
como se indic anteriormente# Para leer una sesin creada por nosotrosD bastar2 con
in5o5ar al arra& superglobal $5"1""BKS]Cnom re5de5la5sesionC^7
session5start$%? echo $5"1""BKS]CusuarioC^? "" :a)ierA5
"odi(icar la sesin
-i se desea modi(icar la I' de sesin D debe pasarse como par2metro a sessionBidEF
7
session5start$%? session$id'=nuevoCD=(+ echo session5id$%? "" n&e)o7;
En cambioD si se desea modi(icar cualAuier 5ariable de sesinD creada por nosotros
D bastar2 con modi(icar el arra& superglobal $5"1""BKS7
session5start$%? -$2>22C%3;=usuario=< & =@avier$P`Y5=+
$68

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Eliminar una 5ariable de sesin
Para eliminar una 5ariable de sesinD HstaD puede destruirse mediante unset$$5"1""
BKS]Cnom re5de5la5varia le5de5sesionC^:
session5start$%? unset'-$2>22C%3;=usuario=<(+
Pero para destruir la sesin completa del usuario Einclu&endo la I' de sesinF D se
debe recurrir a la (uncin session5destro*$% & eliminar la coo:ie con el nombre de
la sesinD el cual se obtiene mediante session5name$%:
session5start$%? "" rean&do la sesi?n unset$$5"1""BKS%? "" destr&'o todas las )a
riables de sesi?n creadas "" obtengo los +ar%metros de la coo[ie de sesi?n "" lo
s necesitarI +ara +oder destr&irla $datos5coo6ie Q session5get5coo6ie5params$%?
"" sobreescribo la coo[ie de sesi?n -la eliminosetcoo6ie$session5name$%3 SRHH3 t
ime$%-++++++3 $datos5coo6ie]DpathD^3 $datos5coo6ie]DdomainD^3 $datos5coo6ie]Dsec
ureD^3 $datos5coo6ie]Dhttponl*D^%? session5destro*$%? "" destr&'o la sesi?n
*n caso pr2ctico de uso de sesiones
Es el caso de restringir el acceso a ciertas p2ginas de nuestro sitio WebD solo
a usuarios con permiso para hacerlo# >rearemos un programa mu& simpleD solo a mo
do de ejemplo# !o primero Aue haremos L&a Aue no utili@aremos ning3n
$6?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
sistema de registro & administracin de usuariosLD es crear un usuario genHrico co
n contrasePa 3nica # Para e5itar guardar estos datos en texto planoD lo Aue hare
mosD es utili@ar PHPL>!ID para obtener el hash "'/D de la combinacin usuario cont
rasePa 7
php 9 $u Q DpepegrilloD? php 9 $p Q D5italia1+,55D? php 9 echo md5$$u . $p%? 45c
e+2e+!+'c'fe(a(!21f!5c442,de4
En el ejemplo Aue coloAuHD utili@o como usuario genHrico pepegrillo & como contr
asePa $italiaP`Y5$ & con5ierto a ambos Een el mismo pasoF a su correspondiente h
ash "'/ Esin espaciosD ni caracteres adicionales de ning3n tipoF# 'e esta (ormaD
cuando el usuario Auiera ingresar a nuestras p2ginas restringidasD tendr2 Aue u
tili@ar como nombre de usuario pepegrillo & como cla5e 5italia1+,55 !uegoD nosot
ros lo Aue haremosD ser2 hashear los datos Aue ingrese el usuario & compararlos
con nuestro hash original# A continuacinD 5eremos como lograrlo & de Aue (orma ma
ntenerlo logueado en el sistemaD a tra5Hs de sesiones# *na 5e@ creado nuestro ha
sh "'/D crearemos un archi5o settings.php destinado a alDacenar 5ariables+consta
ntes de entorno global#
:Aphp # ;e:aremos 'a iniciada &na sesi?n session5start$%? # a(&6 co+iaremos n&es
tro ,as, >;5 obtenido con ./.-CL7 const .P".5P))1"K Q D45ce+2e+!+'c'fe(a(!21f!5c
442,de4D? # 0orm&lario.,tml ser% el (&e +ida el ingreso de &ser ' +ass al &s&ari
o const #P/BSP5HK/BS Q Dformulario.htmlD? # esta ser% &na +%gina c&al(&iera, con
acceso restringido, a la c&al # redirigir al &s&ario des+&Is de iniciar s& sesi
?n en el sistema const #P/BSP581"-8BS/B7P5#K8571&1)-K Q Dpagina5de5muestra.phpD?
$6%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A9
A continuacinD crearemos el (ormulario HT"!D necesario para Aue el usuario inicie
sesin en el sistema# !o llamaremos formulario.html# Este (ormularioD en5iar2 los
datos por HTTP P4-TD a otro archi5o llamado iniciar.php Aue crearemos luego#
:h19Bngreso al sistema:/h19 :form methodQD#K"-D actionQDiniciar.phpD9 Rsuario: :
input t*peQDtextD nameQDuserD /9: r/9 )lave: :input t*peQDpasswordD nameQDpassD
/9: r/9 :input t*peQDsu mitD valueQDBngresarD /9 :/form9
AhoraD crearemos el archi5o principal de nuestro sistema7 funciones.php AAu almac
enaremos todas las (unciones necesarias para7 Iniciar la sesin 'estruir la sesin E
desconectar al usuarioF =eri(icar si el usuario tiene sesin iniciada
,unciones necesarias
,unciones de acceso al sistema
"# 1raigo los datos recibidos +or /11. .J-1 ' retorno el /9-/ >;5 de ambos #" fu
nction get5post5data$% N $hash Q DD? if$isset$$5#K"-]CuserC^% __ isset$$5#K"-]Cp
assC^%% N $hash Q md5$$5#K"-]CuserC^ . $5#K"-]CpassC^%? O return $hash? O
$6/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
En la (uncin anteriorD primero iniciali@o un hash 5aco# !uego 5eri(ico si user & p
ass han 5enido a tra5Hs de HTTP P4-T con un 5alor declarado# 'e ser asD hasheo am
bos datos Esin riesgosD &a Aue al ci(rarlos con "'/ directamenteD no ha& posibil
idad de Aue se in&ecte cdigo malicioso de ning3n tipoF# ,inalmenteD retorno ese h
ash Esi no 5inieron datosD retornar2 el hash 5acoF#
"# Com+aro ambos ,as,es. -i son idInticos, retorno 8erdadero #" function validar
5user5*5pass$% N $user5hash Q get5post5data$%? $s*stem5hash Q .P".5P))1"K? if$$u
ser5hash QQ $s*stem5hash% N return -rue? O O "# Bsta ser% la 0&nci?n +rinci+al,
(&e ser% llamada tras en)iar el 0orm&lario. -i los datos ingresados coinciden co
n los es+erados, inicio la sesi?n del &s&ario. 3inalmente, rediri:o al &s&ario a
la +%gina restringida +or de0ecto (+osteriormente crearemos &na 0&nci?n (&e se
encarg&e de ello)
#" function login$% N $user5valido Q validar5user5*5pass$%? if$$user5valido% N $
5"1""BKS]Clogin5dateC^ Q time$%? O goto5page$#P/BSP581"-8BS/B7P5#K8571&1)-K%? O
!a (uncin login$% genera una 5ariable de sesin llamada login$date cu&o 5alor es la
marca de tiempo actual Eal momento del logueoF# *tili@aremos luego esa 5ariable
de sesinD para 5eri(icar la inacti5idad del usuario#
$61

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A'=E0TE)>IA7 )tese Aue no se crean otras 5ariables de sesinD ni tampoco se almacen
an datos pri5ados como usuario o cla5eD ni sus hashes "'/#
,unciones para destruir la sesin del usuario
*na sola (uncin ser2 necesario para cumplir este propsito# Esta (uncinD luego ser2
in5ocada por un archi5o al Aue llameremos salir.php EAue luego crearemosF# Esta
(uncinD solo se encargar2 de destruir la sesin del usuario tal cual se indic cuando
hablamos sobre como desconectar a un usuario del sistemaD & (inalmenteD redirig
ir2 al usuario al (ormulario de loginD haciendo uso de una (uncin Aue crearemos m
2s adelante#
# ;estr&ir sesi?n function logout$% N unset$$5"1""BKS%? $datos5coo6ie Q session5
get5coo6ie5params$%? setcoo6ie$session5name$%3 SRHH3 time$%-++++++3 $datos5coo6i
e]DpathD^3 $datos5coo6ie]DdomainD^3 $datos5coo6ie]DsecureD^3 $datos5coo6ie]Dhttp
onl*D^%? goto5page$#P/BSP5HK/BS%? O
,unciones para 5eri(icacin & 5alidacin de sesiones
PrimeroD me encargarH de obtener los datos del 3ltimo acceso del usuario# Para e
soD 5o& a recurrir a la 5ariable de sesin llamada login5date7
"# .rimero )eri0ico (&e la )ariable de sesi?n login_date, existe. ;e ser as6, ob
tengo s& )alor ' lo retorno. -i no existe, retornar% el entero 0
#"
$66

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
function o tener5ultimo5acceso$% N $ultimo5acceso Q '? if$isset$$5"1""BKS]Clogin
5dateC^%% N $ultimo5acceso Q $5"1""BKS]Clogin5dateC^? O return $ultimo5acceso? O
El siguiente pasoD ser2 5eri(icar el tiempo de inacti5idad de la sesin & actuali@
arlo7
"# Bsta 0&nci?n, retornar% el estado de la sesi?n: sesi?n inacti)a, retornar% 3a
lse mientras (&e sesi?n acti)a, retornar% 1r&e. 9l mismo tiem+o, se encarga de a
ct&aliEar la )ariable de sesi?n login_date, c&ando la sesi?n se enc&entre acti)a
#" function sesion5activa$% N $estado5activo Q &alse? $ultimo5acceso Q o tener5u
ltimo5acceso$%? "# BstableEco como l6mite m%ximo de inacti)idad (+ara mantener l
a sesi?n acti)a), media ,ora (o sea, 1Q00 seg&ndos). ;e esta manera, s&mando 1Q0
0 seg&ndos a login_date, esto' de0iniendo c&al es la marca de tiem+o m%s alta, (
&e +&edo +ermitir al &s&ario +ara mantenerle s& sesi?n acti)a.
#" $limite5ultimo5acceso Q $ultimo5acceso T 14''? "# 9(&6 realiEo la com+araci?n
. -i el @ltimo acceso del &s&ario, m%s media ,ora de gracia (&e le otorgo +ara m
antenerle acti)a la sesi?n, es ma'or a la marca de ,ora act&al, signi0ica entonc
es (&e s& sesi?n +&ede seg&ir acti)a. Bntonces, le act&aliEo la marca de tiem+o,
reno)%ndole la sesi?n
#" if$$limite5ultimo5acceso 9 time$%% N $estado5activo Q -rue? # act&aliEo la ma
rca de tiem+o reno)ando la sesi?n $5"1""BKS]Clogin5dateC^ Q time$%? O return $es
tado5activo? O
,inalmenteD crearemos una peAuePa (uncinD Aue llame a la anteriorD & en caso de r
ecibir como resultado Aue la sesin est2
$6G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
inacti5aD desconectar2 al usuario del sistema#
# 8eri0icar sesi?n function validar5sesion$% N if$Wsesion5activa$%% N logout$%?
O O
Esta (uncinD ser2 la Aue in5ocaremos desde todas & cada una de las p2ginasD a las
cuales Auerramos restringir su acceso#
!a (uncin Aue redirige a los usuarios
>omo 3ltima (uncinD crearemos aAuella pendienteD de la cual hemos habladoD Aue se
encargar2 de redirigir a los usuarios a otra p2gina de nuestro sistemaD utili@a
ndo la (uncin header$% de PHP#
# redirigir al &s&ario function goto5page$$pagina% N header$DHocation: $paginaD%
? O
Pasos (inales
>on todo estoD tenemos Nel almaO de nuestro sistema de logueo# Ahora solo nos re
sta crear los archi5os pendientes7 iniciar.php !lamar2 a la (uncin login$%# Es Au
ien recibe los datos desde el (ormulario#
$6C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
:Aphp re;uire5once$Dfunciones.phpD%? login$%? A9
salir.php !lamar2 a la (uncin logout$%# -er2 llamado cada 5e@ Aue el usuario elij
a desconectarse del sistema Etendremos Aue pro5eerle del lin: correspondienteF
:Aphp re;uire5once$Dfunciones.phpD%? logout$%? A9
pagina$de$muestra.php Es solo a modo de ejemplo# Emula a cualAuier p2gina restri
ngida de nuestro sistemaD la cual deber2 in5ocar a la (uncin validar5sesion$%# Es
decirD en esta p2gina Eas como en cualAuier otra p2gina restringidaFD colocaremo
s todo el contenido de acceso pri5adoD &a sea puramente PHPD como HT"!D una me@c
la de ambos o mejor a3nD cdigo PHP Aue in5oAue & renderi@e el HT"!# (odo, a solut
amente todo el contenido de estas pginas restringidas, solo ser visi le al usuario
si tiene la sesin iniciada y activa. +e lo contrario, el contenido estar seguro y
no ser mostrado a usuarios sin sesin iniciada o con sesin inactiva.
$G9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
:Aphp re;uire5once$Dfunciones.phpD%? validar5sesion$%? A9 V^-- contenido de e:em
+lo --M : 9Iienvenido usuario registradoW:/ 9 $:a hrefQDsalir.phpD97esconectarse
:/a9%
'escarga los archi5os de este ejemplo desde la Web del cursoD en7 http7++tallerL
deLphp#eugeniabahit#com 4 mira el ejemplo en marcha ingresando en7 http7++taller
LdeLphp#eugeniabahit#com+EjemplosLEnL "archa+usoLdeLsesiones+paginaBdeBmuestra#p
hp
$G$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Tratamiento & control de errores
En alg3n momentoD mientras ejecut2babamos alg3n cdigo PHPD habremos podido notar
con bastante (recuenciaD Aue PHP nos arrojaba alg3n tipo de mensajeD cuando nues
tro scriptD contena alg3n tipo (alla# Estos mensajes de error pueden ser di5ersos
tipos E(unciones obsoletasD a5isosD ad5ertenciasD errores (atales Lentre otrosL
F & su 5isibilidadD se puede con(igurar tanto desde el archi5o de con(iguracin de
PHP Ephp.iniF como en tiempo de ejecucin D mediante la (uncin ini5set$%# -in emba
rgoD antes de decidir AuH tipos de error deben producir mensajes 5isibles o noD
se debe considerar primeroD en Aue entorno estamos trabajando # >omo hemos habla
do en 5arias ocasionesD por cuestiones de seguridadD cuanto menos in(ormacin sobr
e el comportamiento interno de nuestra aplicacinD le demos al usuarioD m2s a sal5
o estar2# Por lo tantoD como regla generalD debemos ocultar todos los erroresD c
uando la aplicacin estH corriendo en un entorno de produccin #
Tipos de errores
>omo se coment en p2rra(os anterioresD PHP puede emitir distintos tipos de errore
sD Aue 5an desde el a5iso de (unciones
$G8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
obsoletas hasta errores (atales# Estos tipos de erroresD poseen asociadas consta
ntes prede(inidasD Aue podr2n ser pasadas posteriormenteD como segundo par2metro
a la (uncin ini5set$% a (in de con(igurar errores en tiempo de ejecucin# Entre la
s constantes predi(inidas Aue m2s nos ocupanD podemos encontrar las siguientes7
!'N"T(NTE >$> % DE"!R)P!)*N 3rrores fatales en tiempo de eEecucin. Ad!ertencias n
o fatales en tiempo de eEecucin A!isos en tiempo de eEecucin( ,ue indican ,ue el s
cript encontr algo ,ue podr4a ser un error u ocurrir en el curso normal de un scr
ipt Sugerencias de cam%ios al cdigo para ampliar la compati%ilidad con !ersiones
posteriores de : A!isos en tiempo de eEecucin( so%re funciones o%soletas ;odos lo
s anteriores (e-cepto 3WS;R&"( ,ue reci'n es incluido en 3WALL( desde la !ersin ?
.B de : ) )nterrumpe el "cript ") NO NO NO NO ")
>$D? 3C3J >$3%5CB> >$25 CB5 >$D>P >B?5>D >$?44
Estos ni5eles de errorD pueden utili@arse de (orma combinadaD mediante los sigui
entes operadores7
'PER(D'R a A ~ T ")GN)%)!(D' XoY (alternati!a) XyY (concatenacin) Negacin Negacin (
en tiempo de eEecucin) U"'
E+N'T)!E , E+DEPRE!(TED (3WNO;&"3 o 3WD3 R3"A;3D) E+N'T)!E - E+DEPRE!(TED (3WNO;
&"3 y 3WD3 R3"A;3D) E+(LL - .E+N'T)!E (3WALL pero no 3WNO;&"3) E+(LL / E+N'T)!E
(3WALL pero no 3WNO;&"3)
$G?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>on(igurando errores en tiempo de ejecucin
En tiempo de ejecucinD mediante la (uncin ini5set$% de PHPD se pueden establecer c
iertas directi5as de con(iguracinD relati5as a los errores & registro de los mism
os# Entre las directi5as m2s comunes D podemos encontrar7
D)RE!T)0( error$reporting DE"!R)P!)*N 1 E2EMPL' 3sta%lece ,ue tipo de errores so
n reportados
ini5set$Cerror5reportingC3 15PHH _ 1571#81)P-17%?
0(L'R P'R DE%E!T' >$?44 A ~>$3%5CB> "tring P
display$errors
Determina si se de%en mostrar o no los errores en pantalla
ini5set$Cdispla*5errorsC3 C'C%?
track$errors
&ndica si el Fltimo error encontrado( estar2 disponi%le a tra!'s de la !aria%le
$php5errormsg
ini5set$Ctrac65errorsC3 CKnC%?
"tring %ff
"adena a imprimir antes del mensaEe de error error$prepend$string ini5set$Cerror
5prepend5stringC3 C1rror
encontrado:C%?
SRHH
error$append$string
"adena a imprimir despu's del mensaEe de error
ini5set$Cerror5prepend5stringC3 C:hr/9C%?
SRHH
*n ejemplo sencillo pero altamente producti5o
>omo comentamos anteriormenteD cuando nuestra aplicacin corriese en un entorno de
produccinD los errores deberan ocultarse# -in embargoD mientras Aue se estH traba
jando en un entorno de desarrolloD podran estar 5isiblemente acti5os para a&udarn
os a depurar nuestro cdigo#
$G%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
*na (orma simple de lograr estoD es crear un archi5o de con(iguracin para la apli
cacin EAue deba ser importado por todos los archi5os de la aplicacinFD Aue decida
si mostrar o no los erroresD seg3n el 5alor de una constante creada a tal (inD A
ue llameremos #8K7R))BKSD estableciendo su 5alor por de(ecto en &alse Esigni(ica
r2 Aue estamos en entorno de desarrolloF & al subir a produccinD la setearemos en
-rue7
:Aphp const #8K7R))BKS Q &alse? "" en entornos de +rod&cci?n, cambiar a 1r&e if$
W#8K7R))BKS% N ini5set$Cerror5reportingC3 15PHH L 15SK-B)1 L 15"-8B)-%? ini5set$
Cdispla*5errorsC3 C1C%? ini5set$Ctrac65errorsC3 CKnC%? O else N ini5set$Cdispla*
5errorsC3 C'C%? O A9
*tili@ando el smbolo Q para silenciar errores
En PHPD es posible silenciar errores anteponiendo una arroba EQF a la instruccin
Aue podra generar un error# Es una pr2ctica Aue debe utili@arse con sumo cuidado
& siempre Aue se Auiera capturar el error Ea pesar de estar silenciadoFD deber2
establecer track$errors en %n a (in de obtener dicho error mediante la 5ariable
-php$errormsg# =eamos algunos ejemplos7
:Aphp ini5set$Cerror5reportingC3 15PHH L 15SK-B)1 L 15"-8B)-%? ini5set$Cdispla*5
errorsC3 C'C%? ini5set$Ctrac65errorsC3 CKnC%? $archivo Q @fopen$Carchivo5;ue5no5
existe.txtC3 CrC%?
$G/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
if$W$archivo% N echo $php5errormsg? O A9
En el ejemplo anteriorD silenciamos el posible error al intentar abrir un archi5
o mediante fopen$%D pero imprimimos en pantalla el mensaje de error capturadoD m
ediante la 5ariable $php5errormsg obteniendo como resultado7
fopen$archivo5;ue5no5existe.txt%: failed to open stream: So such file or directo
r*
-in embargoD podramos ocultar esta in(ormacin al usuario7
:Aphp ini5set$Cerror5reportingC3 15PHH L 15SK-B)1 L 15"-8B)-%? ini5set$Cdispla*5
errorsC3 C'C%? ini5set$Ctrac65errorsC3 CKnC%? $archivo Q @fopen$Carchivo5;ue5no5
existe.txtC3 CrC%? if$W$archivo% N echo =Ha ocurrido un error en el sistema. Dis
culpe las molestias.=+ O A9
'e esta (ormaD el usuario solo 5er2 el siguiente mensaje7
.a ocurrido un error en el sistema. 7isculpe las molestias.
$G1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Trabajando con Bases de 'atos "&-<!
>on este captuloD llegamos al (inal del curso NPHP para PrincipiantesO# Abarcando
esta 3ltima unidadD &a estaremos en condiciones de crear aplicaciones (uncional
es de alto ni5elD de complejidad mendia# -in dudasD el trabajo con bases de dato
sD es lo m2s esperado por cualAuier programador Aue est2 dando sus primeros paso
sD pero entonces Ipor AuH dejarlo para el (inalJ R la respuesta a esta preguntaD
es mu& simple7 porAue las bases de datos son el NcristalO de una aplicacin# 0epr
esentan la parte m2s 5ulnerable de un sistema in(orm2tico & de su 5ulnerabilidad
D depender2 la estabilidad o inestabilidad de todo el sistema# A lo largo del cu
rsoD hemos adAuirido todas las tHcnicasD pr2cticas & herramientas necesariasD pa
ra saber como (iltrar & securi@ar datos & reciHn ahoraD estamos listos para pode
r comen@ar a trabajar con bases de datosD en absoluta libertad & con(ian@a# M>om
encemos; Una base de datos representa un conjunto de datos pertenecientes a un m
ismo contexto, que son almacenados de forma sistemtica para su posterior uso. ,ar
a comprender me*or el concepto de -ase de +atos, por favor, dirigirse a
http:..es.#i/ipedia.org.#i/i.-ase0de0datos
$G6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Acerca de "&-<!
"&-<! es un ser5idor de Bases de 'atos -<! E-tructured <uer& !anguageF Aue se di
stribu&e en dos 5ersiones7 *na 5ersin P! E-o(t.are !ibreF
4tra 5ersin pri5ati5aD llamada "&-<! AB
En este cursoD utili@aremos la 5ersin estandar licenciada bajo la )* eneral Publi
c !icense E P!F#
Instalacin & con(iguracin de "&-<!
Para instalar "&-<!D por lnea de comandosD escribe7
sudo apt-get install mysKl-server mysKl-client
'urante la instalacinD el sistema te pedir2 Aue ingreses una contrasePa para la a
dministracin de "&-<!# Asigna una contrasePa Aue puedas recordar (2cilmente & man
tenla a sal5o &a Aue deber2s utili@arla (recuentemente# *na 5e@ Aue (inalice la
instalacinD ejecuta el siguiente comando a (in de securi@ar el ser5idor "&-<! Ees
ta con(iguracinD es 52lida tambiHnD para ser5idores de produccinF7
sudo mysKl$secure$installation
A continuacinD el sistema te pedir2 Aue ingreses la contrasePa actual para admini
stracin de "&-<! Ela del usuario root de "&-<!F# Ten en cuenta Aue la contrasePa
no ser2 mostrada mientras escribes7
1nter current password for root $enter for none%:
$GG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
A continuacinD te preguntar2 si deseas modi(icar contrasePa# -al5o Aue desees mod
i(icarlaD ingresa n7
)hange the root passwordA ]X/n^ n
esa
Ahora la preguntaD ser2 si deseas eliminar usuarios annimos# 0esponde Aue s7
8emove anon*mous usersA ]X/n^ N
!uegoD te preguntar2 si desees desabilitar el acceso remoto al usuario root de "
&-<!# Por supuestoD responde Aue s7
7isallow root login remotel*A ]X/n^ N
!a siguiente pregunta ser2 si deseas eliminar la base de datos de prueba & el ac
ceso a ella# TambiHn responde Aue s7
8emove test data ase and access to itA ]X/n^ N
,inalmenteD te preguntar2 si deseas recargar las tablas de pri5ilegios Eesto es
para asegurar Aue todos los cambios reali@ados surjan e(ectoF# EntoncesD respond
e sD por 3ltima 5e@7
8eload privilege ta les nowA ]X/n^ N
IniciarD reiniciar & detener el ser5idor "&-<!
En ocasiones necesitar2s iniciarD reiniciar o detener el ser5idor de bases de da
tosD "&-<!#
$GC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!as opciones disponibles son7
stop start restart detiene el servidor inicia el servidor reinicia el servidor
Para iniciarD reiniciar o detener el ser5idorD deber2s ejecutar el siguiente com
ando D seguido de la opcin deseada7
sudo )etc)init.d)mysKl opcion5deseada
!gicamente reempla@ando opcion por stopD start o restart seg3n si deseas pararD i
niciar o reiniciar el ser5idor#
$C9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Administracin de "&-<!
*na 5e@ Aue comencemos a utili@ar bases de datosD necesitar2s poder acceder a la
s opciones de aministracin de las mismas# Por lo tantoD te recomiendo tener siemp
re a mano este captuloD para poder consultarlo con (recuencia#
>onectarse & desconectarse al ser5idor
Para conectarte deber2s ejecutar el siguiente comando7
m*s;l -u root -p
A continuacinD deber2s ingresar la contrasePa del root de "&-<! Eno es la del roo
t del -4# Es la Aue hemos con(igurado durante la instalacin de "&-<!F# !as -u & p signi(ican usuario & pass.ord respecti5amente# Te aparecer2 un shell interacti
5o para "&-<!7
mysKl#
All podremos escribir los comandos administrar el ser5idor de bases de datos#
necesarios
para
>omandos para administrar "&-<! dede el shell interacti5o
!a siguiente tabla describe los comandos de uso (recuente Aue necesitar2s para a
dministrar el ser5idor de bases de datos desde el shell interacti5o# Es una buen
a ideaD imprimir esta tabla para tenerla siempre a
$C$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
mano 7F
!'M(ND' show data.ases+ use nom.re$de$la$.ase$de$datos+ create data.ase nom.re$d
e$la$d.+ Kuit
DE"!R)P!)*N Muestra todas las %ases de datos creadas en el ser!idor &ndicar ,ue
!as a comen9ar a utili9ar la %ase de datos elegida "rear una nue!a %ase de datos
Salir del s1ell interacti!o
$C8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
-obre el lenguaje -<!
-<! Lsiglas de -tructured <uer& !anguageLD es el lenguaje de consultas a bases d
e datos D Aue nos permitir2 crearD modi(icarD consultar & eliminar tanto bases d
e datos como sus tablas & registrosD desde el shell interacti5o de "&-<! & tambi
Hn desde PHP# >omo todo lenguaje in(orm2tico D posee su propia sintaxis D tipos
de datos & elementos# En este cursoD abordaremos los conceptos b2sicos sobre -<!
Aue nos permitan desarrollar aplicaciones de media complejidadD sin pro(undi@ar
en el lenguaje en sD sino solo en aAuellos aspectos mnimamente necesarios relacio
nados con "&-<! #
Tipos de datos m2s comunes ErecomendadosF
!a siguiente tablaD muestra los tipos de datos m2s comunesD aceptados por 5ersio
nes la 5ersin /#9#? o superiorD de "&-<!#
Tipo de dato 1ntero Sbmero decimal Iooleano &echa &echa * hora &echa * hora auto
m=tica .ora Denominacin C35'3( Especi$icaciones Ejemplo S Q cantidad de d<gitos B
S-$5%
S Q cantidad de d<gitos totales D>BCL?4'38 D( 71)BGPH$1'3 2% 7 Q cantidad de dec
imales R%%4 D?5> D?5>5CL> 5CL>25?LP 5CL> IKKH 7P-1 7P-1-BG1 -BG1"-PG# -BG1
$C?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Pao )adena de longitud fi>a )adena de longitud varia le Ilo;ue de texto de gran
longitud varia le
N>? 'D( BH? '3( U? BH? '3(
7 Q cantidad de d<gitos X1P8$!% $2 o !% S Q longitud de la cadena \ entre ' * 25
5 S Q longitud m=xima de la cadena \ entre ' * (5522 ).P8$2% JP8).P8$1''%
R4%R
IHKI
-int2xis b2sica de las sentencias -<!
*na sentencia -<! Edenominada NAuer&O en la jerga in(orm2ticaFD es una instruccin
escrita en lenguaje -<!# =eremos aAuD el tipo de sentencias m2s habituales#
>rear tablas en una base de datos
-intaxis7
B >?5> 5?R4> nom re5de5la5ta la' nom re5del5campo -B#K57157P-K3 nom re5de5otro5c
ampo -B#K57157P-K (+
Ejemplo7
)81P-1 -PIH1 productos$ producto JP8).P8$125%3 descripcion IHKI3 precio 71)BGPH$
(3 2%3 en5stoc6 IKKH %?
Explicacin7
)81P-1 -PIH1 productos
>rear una nue5a tabla llamada NproductosO
$C%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
producto JP8).P8$125%3
>rear un campo llamado productoD de tipo cadena de texto de longitud 5ariableD c
on una longitud m2xima de $8/ caracteres
descripcion IHKI3
>rear un campo llamado descripcinD de tipo bloAue de texto de gran longitud
precio 71)BGPH$(3 2%3
>rear un campo precio de tipo numHrico de longitud m2xima de 1 digtos de los cual
esD solo 8 pueden ser decimales
en5stoc6 IKKH
>rear un campo llamado NenBstoc:O del tipo booleano
$C/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Insertar datos en una tabla
-intaxis7
C32> 5 C35% nom re5de5la5ta la$campo13 campo23 campo1'..% JPHR1"$dato13 dato23 d
ato1'...%+
Ejemplo7
BS"18- BS-K productos$producto3 precio3 en5stoc6% JPHR1"$CIolsa de dormir para a
lta montaaaC3 22!.(53 -8R1%?
Explicacin7
BS"18- BS-K productos$producto3 precio3 en5stoc6%
Insertar un nue5o registro en los campos productoD precio & enBstoc: de la tabla
productos
JPHR1"$CIolsa de dormir para alta montaaaC3 22!.(53 -8R1%?
>on los 5alores NBolsa de dormir para alta montaPaOD 8?%#1/ & 5erdaderoD respect
i5amente en cada uno de los campos indicados
-eleccionar registros
-intaxis7
2>4>B5 6 %L campo13 campo23 campo1' ta la?
Ejemplo7
"1H1)producto3 precio
$C1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
&8KG
productos?
Explicacin7
"1H1)producto3 precio
-eleccionar los campos producto & precio
&8KG productos?
'e la tabla productos
"odi(icar registros
-intaxis7
1PD?5> 2>5 ta la campo1 Q valor3 campo2 Q valor3 campo1' Q valor?
Ejemplo7
R#7P-1 "1productos en5stoc6 Q &PH"13 precio Q '?
Explicacin7
R#7P-1 productos
Actuali@ar la tabla productos
"1en5stoc6 Q &PH"13
"odi(icar el campo enBstoc: por (also
precio Q '?
$C6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
& el campo precio a 9
Eliminar registros
-intaxis7
D>4>5> 6 %L ta la?
Ejemplo7
71H1-1 &8KG productos?
Explicacin7
71H1-1 &8KG productos?
Eliminar todos los registros de la tabla productos
$CG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>onsultas a5an@adas
-i bien no 5eremos aAu consultas realmente complejasD &a Aue el curso se basa en
el lenguaje de programacin PHP & noD en el lenguaje de consulta -<!D haremos un r
2pido paseoD por las opciones disponibles en -<! para sentencias m2s complejas A
ue las anteriores#
!a cl2usula WHE0E
!as sentencias en -<!D se componen de cl2usulas# R E.181 es una de ellas# !a cl2
usula DH> > nos permite (iltrar registros en una sentencia -<!# Esta cl2usulaD (
unciona de (orma similar a la comparacin de expreciones en PHPD utili@ando los si
guientes operadores de comparcin7
# & 9Q ma*or ;ue igual ;ue ma*or o igual ;ue ! !# :Q menor ;ue distinto ;ue meno
r o igual ;ue
R>5D>>3 nP ?3D n2 C2 3144a5 1>a6?42> C3$valor13 valor23 va...%
entre n1 * n2 es nulo L es verdadero L es falso contiene
Por supuestoD tambien admite operadores lgicos 7
?3D $*% 3%5 $negaciMn% % $o%
$CC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
=eamos algunos ejemplos7 -eleccionar productos donde precio sea menor Aue $9997
"1H1)&8KG DH> > producto3 precio productos precio ! P:::+
Aumentar el $9f del precio de los productosD Aue actualmente se encuentren entre
$/9 & 8997
R#7P-1 "1DH> > productos precio Q $precio U 1.1'% precio R>5D>>3 P5: ?3D 2::+
-eleccionar productos donde enBstoc: no sea (also
"1H1)&8KG DH> > producto3 precio productos en$stock C2 3%5 6?42>+
Eliminar productos cu&os precios sean $99D 899 &+o ?99 & adem2sD enBstoc: sea (a
lso o producto sea nulo7
71H1-1 &8KG DH> > ?3D % productos precio C3'P::8 2::8 3::( 'en$stock C2 6?42> pr
oducto C2 3144(+
"odi(icar enBstoc: a 5erdadero donde precio sea menor Aue /9 & producto no sea n
ulo7
R#7P-1 "1DH> > ?3D productos en5stoc6 Q -8R1 precio ! 5: en$stock C2 3%5 3144+
899

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4rdenando consultas7 la cl2usula 40'E0 BR
Es posible adem2sD ordenar los resultados de una consultaD en (orma ascendente E
P")F o descendente E71")F7
"1H1)producto3 descripcion3 precio productos precio I1-E11S 1 PS7 5' en5stoc6 B"
SK- &PH"1 RN precio D>2B+
&8KG E.181 PS7 % D>
TambiHn es posibleD ordenar los resultados de la consultaD por m2s de un campo7
"1H1)producto3 descripcion3 precio productos precio I1-E11S 1 PS7 5' en5stoc6 B"
SK- &PH"1 RN precio D>2B8 producto ?2B+
&8KG E.181 PS7 % D>
Alias de tablas & campos
4tra posibilidad Aue nos da el lenguaje -<!D es utili@ar alias para el nombre de
los campos & las tablas# Estos alias se asignan mediante la palabra cla5e reser
5adaD ?27
"1H1)producto descripcion precio productos ?2 =3om.re del Producto=8 ?2 Detalles
8 ?2 Cmporte ?2 p
&8KG E.181 PS7
precio I1-E11S 1 PS7 5' en5stoc6 B" SK- &PH"1
89$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
% D>
RN
precio D>2B8 producto ?2B+
)tese Aue los alias extraPos D deben ser simples
Aue contengan caracteres encerrados entre comillas
,unciones del lenguaje -<! de "&-<!
Es posible tambiHnD utili@ar di5ersas (unciones propias del lenguaje -<! L&a sea
estandar o de "&-<!L a (in de poder obtener los datos con cierto (ormato# =erem
os aAuellas de uso m2s (recuente#
>ontar la cantidad de registros7 >4*)TEF
"1H1)&8KG B%135'producto( productos? P" )antidad
-umar totales7 -*"EF
"1H1)&8KG 21L'precio( productos? P" -otal
>oncatenar cadenas7 >4)>ATEF
"1H1)&8KG producto3 B%3B?5'=12D =8 precio8 =.-=( productos? P" #recio
)tese Aue las cadenas de caracteres deben encerrarse entre comillas simples & Aue
el operador de concatenacin para esta (uncinD es la coma#
898

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>on5ertir a min3sculas & ma&3sculas7 !>A-EEF & *>A-EEF
"1H1)&8KG 1B?2>'producto(8 4B?2>'descripcion( productos?
0eempla@ar datos7 0EP! A>EEF
"1H1)&8KG >P4?B>'descripcion8 =Sn=8 =!.r)#=( productos? P" 7escripcion
0eempla@a bgnb por bZbr+Xb
4btener los primeros o 3ltimos caracteres7 !E,TEF & 0I HTEF
"1H1)&8KG 4>65'producto8 5:( productos?
0edonder n3meros7 04*)'EF
"1H1)&8KG %13D'precio8 2( productos?
0etornar2 los precios con 8 decimales
4btener solo la (echa de un campo 'ATETI"E o TI"E-TA"P7 'ATEEF
"1H1)&8KG D?5>'campo$datetime( ta la?
4btener una (echa (ormateada7 'ATEB,40"ATEF
"1H1)&8KG D?5>$6% L?5'campo$fecha8 =bd)bm)bN=( ta la?
Aplican los mismos patrones de (ormato de (echa Aue en PHP
89?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
4btener el registro con el 5alor m2ximo & mnimo7 "ASEF & "I)EF
"1H1)&8KG L?c'precio( productos?
0etorna el producto con el precio m2s caro
"1H1)&8KG
LC3'precio( productos?
0etorna el producto con el precio m2s barato
4ptimi@acin de bases de 'atos
A continuacinD encontrar2s una lista de consejos Aue -IE"P0E debes seguirD al mom
ento de crear nue5as tablas & escribir sentencias -<!#
Todos los registros deben tener un I' 3nico
>uando crees tablasD asgnales un campo id de tipo autonumHrico incremental & esta
blHcelo como ndice primario# >uando agregues registrosD este campo se completar2
autom2ticamenteD con un n3mero incrementalD Aue te ser5ir2 para optimi@ar tus co
nsultas & contar con un campo Aue te permita reconocer el registro como 3nico#
)81P-1 -PIH1 productos$ id C35'PP( 3%5 3144 ?15%$C3B >L>35 P CL? N [>N3 producto
JP8).P8$125% %?
El campo idD ser2 como cualAuier otro & lo podr2s seleccionar en un -E!E>T o uti
li@arlo e cualAuier cl2usula WHE0E#
89%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>rear ndices en las tablas
Todas las tablas deben tener un ndice# El ndice se asigna a uno o m2s camposD & es
utili@ado por -<! para (iltrar registros de (orma m2s r2pida# 'ebes crear ndices
con precaucinD &a Aue de la misma (orma Aue se aceleran las consultasD se retras
a la insercin & actuali@acin de registrosD puesto Aue la base de datosD deber2 act
uali@ar los ndices cada 5e@ Aue se agreguen o modi(iAuen datos# >uando una consul
ta es ejecutadaD "&-<! tratar2 de encontrar primero la respuesta en los campos nd
iceD & lo har2 en el orden Aue los ndices ha&an sido creados# I>u2ndo agregar ndic
esJ >uando 5a&as a utili@ar una combinacin de campos en la cl2usula WHE0E# Por ej
emploD si (iltrar2s a menudoD los datos de la tabla producto por su campo precio
& enBstoc:D Aue precio & enBstoc: sean un ndice de m3ltiples campos7
)81P-1 -PIH1 productos$ id BS-$11% SK- SRHH PR-K5BS)81G1S- #8BGP8X g1X3 producto
JP8).P8$125%3 precio 71)BGPH$1'3 2%3 en5stoc6 IKKH3 descripcion IHKI3 C3D>c'pre
cio8 en$stock( %?
Indica cu2les campos no pueden ser nulos
-<! te da la posibilidad de indicar AuH campos no pueden estar nulos# Indicar Au
e un campo no debe estar nuloD te a&udar2 a no almacenar registros de(ectuosos e
n tu base de datos#
89/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
)81P-1 -PIH1 productos$ id BS-$11% SK- SRHH PR-K5BS)81G1S- #8BGP8X g1X3 producto
JP8).P8$125% 3%5 31443 precio 71)BGPH$1'3 2% 3%5 31443 en5stoc6 IKKH3 descripci
on IHKI 3%5 31443 BS71F$precio3 en5stoc6% %?
*tili@a el motor Inno'B
El motor de bases de datos Inno'BD te permitir2 crear tablas relaciones optimi@a
ndo su rendimiento# Al momento de crear tus tablasD indica Aue utili@ar2s el mot
or Inno'B7
)81P-1 -PIH1 productos$ id BS-$11% SK- SRHH PR-K5BS)81G1S- #8BGP8X g1X3 producto
JP8).P8$125% SK- SRHH3 precio 71)BGPH$1'3 2% SK- SRHH3 en5stoc6 IKKH3 descripci
on IHKI SK- SRHH3 BS71F$precio3 en5stoc6% % >3JC3>&CnnoDR+
4btener ma&or in(ormacin
'escarga el "anual de "&-<! Aprende sobre el lenguaje -<!D gratis en $Te&'ata
891

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Trabajando con "&-<! desde PHP
Antes de comen@arD deseo aclarar seguridadL en nuestros archi5os PHPD una base d
e datosD para reali@ar modi(icacinD insercin & eliminacin bases de datos existentes
# Aue Lpor cuestiones de solo nos conectaremos a consultas de seleccinD de regist
ros en tablas &
)o crearemos tablas ni bases de datos desde nuestros archi5os PHPD sino Aue lo h
aremos desde el administrador de "&-<! por lnea de comandos# A (in de poder traba
jar con los ejemplos de este captuloD comen@aremos creando una nue5a base de dato
sD con la tabla Aue necesitaremos# Ejecuta las siguientes sentenciasD desde el hell interacti5o de "&-<!7
)81P-1 7P-PIP"1 curso5php? R"1 curso5php? )81P-1 -PIH1 usuarios$ id BS-$11% SKSRHH PR-K5BS)81G1S- #8BGP8X g1X3 username JP8).P8$2!% SK- SRHH3 email JP8).P8$1'
'% SK- SRHH3 password JP8).P8$!'% SK- SRHH3 suspendido IKKH3 fecha5registro -BG1
"-PG# 71&PRH- )R881S-5-BG1"-PG#3 BS71F$username3 password3 suspendido% % 1S/BS1Q
Bnno7I?
A=I-47 PHP cuenta con dos tipos de conectores "&-<!7 mysKl & mysKliD disponible
desde la 5ersin /# -i bien m&sAli & m2s potenteD seguro & estable Aue m&sAlD en e
ste captuloD
896

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
5eremos como utili@ar ambos#
Antes de continuarD 5amos a instalar el mdulo de "&-<! para PHP7
sudo apt-get install php5-m*s;l
"&-<! desde PHP con el conector m&sAl
=eremos como utili@ar el conector m*s;lD a solo e(ecto educati5oD pero para nues
tras aplicacionesD utili@aremos m*s;li# Para trabajar con bases de datos desde P
HP con el conector m*s;lD el procedimientoD consiste en los siguientes pasos7 $#
>onectarse a la base de datos 8# -eleccionar la base de datos a utili@ar ?# Eje
cutar una consulta %# >apturar los resultados /# !iberar los resultados 1# >erra
r la conexin
>onectarse a la base de datos
$host Q ClocalhostC? $usuario Q CrootC? $clave Q CcontraseaaC?
89G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$conn Q m*s;l5connect$$host3 $usuario3 $clave% or die$CSo me pude conectar a la
ase de datosC%?
-eleccionar una base de datos
$d Q Ccurso5phpC? ase de datosC%? m*s;l5select5d $$d % or die$CSo pude seleccion
ar la
Ejecutar una consulta simple
$s;l Q D BS"18- BS-K JPHR1" D? $result Q m*s;l5;uer*$$s;l% or die$CSo pude e>ecu
tar la consultaC%? usuarios $username3 email3 password% $C>uanpere@C3 C>pere@@al
gundominio.extC3 C2(ec',ef(1f125!+! ,+a12(,!a+a!aeC%
Ejecutar una consulta de seleccin m3ltiple & capturar sus resultados
$s;l Q D "1H1)- id3 username3 email &8KG usuarios D? $result Q m*s;l5;uer*$$s;l%
or die$CSo pude e>ecutar la consultaC%?
>apturamos el arra& con los resultados
while$$registros]^ Q m*s;l5fetch5arra*$$result%%?
El arra& de5uelto E$registrosF ser2 del tipo multidimensionalD con un (ormato co
mo el siguiente7
$registros Q arra*$
89C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
%?
arra*$Ccampo1CQ9CvalorC3 Ccampo2CQ9CvalorC3 Ccampo,CQ9CvalorC%3 arra*$Ccampo1CQ9
CvalorC3 Ccampo2CQ9CvalorC3 Ccampo,CQ9CvalorC%3
Es decirD Aue ser2 un arra&D conteniendo otro arra& por cada registro encontrado
#
!iberar los resultados
m*s;l5free5result$$result%?
>errar la conexin
m*s;l5close$$conn%?
8$9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Algunos ejemplos concretos
>onsulta de seleccin
d #reparo los datos para conectarme a la 7I $host Q ClocalhostC? $usuario Q Croo
tC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d me conecto a la 7I $conn Q m*s;l5
connect$$host3 $usuario3 $clave% or die$CSo me pude conectar a la ase de datosC%
? d "elecciono la 7I a utili@ar m*s;l5select5d $$d % or die$CSo pude seleccionar
la ase de datosC%?
d #reparo la sentencia "cH $s;l Q D "1H1)- id3 username3 email &8KG usuarios E.1
81 suspendido B" SK- -8R1 D? d 1>ecuto la consulta $result Q m*s;l5;uer*$$s;l% o
r die$CSo pude e>ecutar la consultaC%? d )apturo los resultados while$$registros
]^ Q m*s;l5fetch5arra*$$result%%? d Hi ero los resultados m*s;l5free5result$$res
ult%? d )ierro la conexiMn m*s;l5close$$conn%? d Bmprimo los resultados print5r$
$registros%?
Insertar 5arios registros en un solo paso
d #reparo los datos para conectarme a la 7I $host Q ClocalhostC? $usuario Q Croo
tC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d me conecto a la 7I
8$$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
$conn Q m*s;l5connect$$host3 $usuario3 $clave% or die$CSo me pude conectar a la
ase de datosC%? d "elecciono la 7I a utili@ar m*s;l5select5d $$d % or die$CSo pu
de seleccionar la ase de datosC%?
d #reparo la sentencia "cH $s;l Q D BS"18- BS-K usuarios $username3 email3 passw
ord% JPHR1" $C>avier,5C3 C>avi,5@algundominio.extC3 C2(ec',ef(1f125!+! ,+a12(,!a
+a!aeC%3 $CnoeliaC3 Cnoe@algundominio.extC3 C2(ec',ef(1f125!+! ,+a12(,!a+a!aeC%3
$Cana5P8C3 Canita@algundominio.extC3 C2(ec',ef(1f125!+! ,+a12(,!a+a!aeC%
D? d 1>ecuto la consulta m*s;l5;uer*$$s;l% or die$CSo pude e>ecutar la consultaC
%? d )ierro la conexiMn m*s;l5close$$conn%?
8$8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
"&-<! desde PHP con el conector m&sAli
>omo comentamos anteriormenteD m*s;li es un conector mucho m2s seguro & potente
Aue m*s;l# -i bien la (orma m2s acertada de implementar este conectorD es a tra5
Hs de objetos Ees decirD utili@ando el paradigma de la programacin orientada a ob
jetosFD nos concentraremos solo en estilo por procedimientosD &a Aue HstaD es la
tHcnica de programacin utili@ada en este curso inicial#
=E)TAeA 'E *TI!IhA0 E! >4)E>T40 LN2V4C En el caso de m*s;liD contamos con una gr
an 5entaja al momento de preparar nuestras sentencias -<!7 podemos utili@ar Ncom
odinesOD para indicar al conectorD AuH datos deben ser reempla@ados din2micament
e# 'e esta (ormaD el propio conector se encargar2 de (iltrar los datos din2micos
D obteniendo consultas mucho m2s seguras#
Por consiguienteD para trabajar con el conector m*s;liD seguiremos estos pasos7
$# >onectarse a la base de datos & seleccionar la 'B a utili@ar 8# Preparar la c
onsulta ?# Ejecutar una consulta %# >apturar los resultados /# >errar consulta
8$?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
1# >errar la conexin
Abrir una conexin mediante m&sAli
d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario
Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de dat
os $conn Q m*s;li5connect$$host3 $usuario3 $clave3 $d %?
Preparar la consulta
Preparar una consulta para trabajar mediante m&sAliD reAuerir2 de algunos cuanto
s pasos Aue debemos seguirD cuidada & ordenadamente# PrimeroD preparamos la sent
encia# Pero a di(erencia de la 5e@ anterior Econ m*s;lFD los datos Aue relaciona
dos con los registros E&a sean datos a insertar o coincidencias establecidas en
la cl2usula .hereFD no los pondremos# En su lugarD utili@aremos el comodn "0
$s;l Q D BS"18- BS-K JPHR1" D? usuarios $username3 email3 password% $"8 "8 "%
!uegoD de(iniremos los datos din2micos mediante 5ariables7
$username Q C>uan-pere@C? $email Q C>uan5pere@@algundominio.extC? $password Q C2
(ec',ef(1f125!+! ,+a12(,!a+a!aeC?
8$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
!uegoD le indicamos a m&sAli Aue inicie la preparacin para la consulta7
$pre Q m*s;li5prepare$$conn3 $s;l%?
R (inalmenteD le decimos Aue una los par2metros a la consultaD indic2ndole el ti
po de datos correspondiente7
m*s;li5stmt5 ind5param$$pre3 DsssD3 $username3 $email3 $password%?
El segundo par2metro de la (ucin m*s;li5stmt5 ind5param EsssF indica el tipo de d
atos correspondiente a los par2metros Enuestras 5ariablesF# !a NsO signi(ica str
ing# Tres NsOD signi(ican Aue los tres datos son de tipo string# 4tros tipos de
datos soportados son7
's( string 'i( entero 'd( do le/decimal '.( lo
El eAui5alente para otros tipos de datos no listados arribaD es7
6echas y horas Rooleanos son cadenas de texto. #or lo tanto3 se utili@a es un en
tero $K: &alse3 1: -rue%. Rtili@ar s i
Ejecutar la consulta
m*s;li5stmt5execute$$pre%?
>errar la consulta
m*s;li5stmt5close$$pre%?
8$/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>errar la conexin
m*s;li5close$$conn%?
Ejemplo de insercin completo
d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario
Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de dat
os $conn Q m*s;li5connect$$host3 $usuario3 $clave3 $d %? d #reparo la sentencia
con los comodines A $s;l Q D BS"18- BS-K usuarios $username3 email3 password% JP
HR1" $"8 "8 "% D? d #reparo los datos ;ue vo* a insertar $username Q C>uan-pere@
C? $email Q C>uan5pere@@algundominio.extC? $password Q C2(ec',ef(1f125!+! ,+a12(
,!a+a!aeC? d #reparo la consulta $pre Q m*s;li5prepare$$conn3 $s;l%? d indico lo
s datos a reempla@ar con su tipo m*s;li5stmt5 ind5param$$pre3 DsssD3 $username3
$email3 $password%? d 1>ecuto la consulta m*s;li5stmt5execute$$pre%? d #P"K K#)B
KSPH $"KHK #P8P )KS"RH-P" 71 BS"18)BiS%: d K tener el B7 del registro insertado
$nuevo5id Q m*s;li5insert5id$$conn%? d )ierro la consulta * la conexiMn m*s;li5s
tmt5close$$pre%? m*s;li5close$$conn%?
)tese Aue el ejemplo de insercinD aplica tambiHn a consultas de actuali@acinD modi(
icacin & eliminacin #
8$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
>apturar resultados de una consulta de seleccin
En una consulta de seleccin Edonde necesito capturar los resultados de5ueltosFD d
espuHs de ejecutar la consulta E& antes de cerrarlaFD al igual Aue hicimos con e
l conector m*s;lD 5amos a capturar los resultadosD pero de (orma di(erente# Prim
eroD 5amos a asociar la salida a 5ariables# Esto esD asociar los nombres de los
campos de5ueltos a nombres de 5ariables & se logra as7
m*s;li5stmt5 ind5result$$pre3 $id3 $username3 $email%?
>laramenteD le estamos indicando al conectorD Aue nos re(eriremos a los campos i
dD username e email como 5ariables `idD `username e `email respecti5amente# >omo
a nostros nos interesa almacenar los datos en un arra&D a (in de continuar mant
eniendo nuestra arAuitectura de aislacin del cdigo PHP & HT"!D nue5amenteD 5amos a
iterar sobre los resultadosD para generar un arra& Aue almacene todos los regis
tros de5ueltos7
while$m*s;li5stmt5fetch$$pre%% N $registros]^ Q arra*$CidCQ9$id3 CusernameCQ9$us
ername3 CemailCQ9$email%? O
>omo se puede 5erD la di(erencia es notable# Esta 5e@D tu5imos Aue encargarnos d
e crear el arra& pr2cticamente Na manoO#
8$6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I
Eugenia Bahit
Ejemplo completo de consultas de seleccin
d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario
Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de dat
os $conn Q m*s;li5connect$$host3 $usuario3 $clave3 $d %? d #reparo la sentencia
con los comodines A $s;l Q D BS"18- BS-K usuarios $username3 email3 password% JP
HR1" $"8 "8 "% D? d #reparo los datos ;ue vo* a insertar $username Q C>uan-pere@
C? $email Q C>uan5pere@@algundominio.extC? $password Q C2(ec',ef(1f125!+! ,+a12(
,!a+a!aeC? d #reparo la consulta $pre Q m*s;li5prepare$$conn3 $s;l%? d indico lo
s datos a reempla@ar con su tipo m*s;li5stmt5 ind5param$$pre3 DsssD3 $username3
$email3 $password%? d 1>ecuto la consulta m*s;li5stmt5execute$$pre%? d asocio lo
s nom res de campo a nom res de varia les m*s;li5stmt5 ind5result$$pre3 $id3 $us
ername3 $email%? d )apturo los resultados * los guardo en un arra* while$m*s;li5
stmt5fetch$$pre%% N $registros]^ Q arra*$CidCQ9$id3 CusernameCQ9$username3 Cemai
lCQ9$email%? O d )ierro la consulta * la conexiMn m*s;li5stmt5close$$pre%? m*s;l
i5close$$conn%?
8$G

You might also like