Está en la página 1de 218

Tomo I

Programacin Procedural de Apli caciones Web de baja complejidad


PHP Experto Tomo I Eugenia Bahit
ndice General
Introduccin a las tecnologas !A"P###################### $%
!A"P & !A"P############################################################################## $%
'i(erencia entre )*+!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
Instalacin de *buntu )*+!inux como 3nico -istema 4perati5o
################################################################################################## $6
Instalacin 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###############################8C
Instrucciones & estructuras###########################################################8C
Identacin en PHP######################################################################### ?9
Impresin en pantalla###################################################################?$
=ariables & tipos de datos b2sicos################################################?8
?
Programacin Procedural de Apli caciones 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
4peradores 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 pr2tica para e5itar lo anterior#################################%?
>omentando & documentando el cdigo (uente############################%%
Inclusin de archi5os en PHP########################################################%1
'i(erencia entre inclusin de archi5os remotos & locales##########%6
'i(erencia entre include & reAuire#############################################%G
Include & reAuire KBonceK##########################################################%G
Estructuras de >ontrol Parte I Econdici onalesF ########%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 complej os7 "atrices simples &
multidimensionales################################################ /G
"atrices en PHP############################################################################ /G
-intaxis b2sica########################################################################## /G
%
Programacin Procedural de Apli caciones 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 bipolaridad no diagnosticada de PHP
###################################################################################################### 6%
otoD si lo usas### es tu eleccin;##############################################6/
*n ejemplo noLpr2ctico para entender goto#############################6/
,unciones de(inidas por el usuari o###### # # # # # # # # # # # # # # # # # # # # 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 Apli caciones 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$
!lamadas de retorno#####################################################################G8
Pasar argumentos en una llamada de retorno##########################G?
Argumentos no conocidos#########################################################G%
>onocer la cantidad de argumentos#####################################G%
4btener una lista completa de todos los argumentos###########G/
4btener un argumento espec(ico#########################################G/
-aber si una (uncin puede ser llamada EcallableF####################G/
"aterial de lectura adicional#####################################################G1
'i(erentes (ormas de recoger argumentos 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 actual#######################################C$
*n helper Aue modi(ica una 5ariable 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%
Apertura 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"o5iendo el puntero dentro del archi5o####################################CG
*n contador de 5isitas sencillo#############################################CG
M>uidado 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/
>omprobar si un archi5o o directorio puede escribirse###########$91
"2s (unciones sobre el sistema de archi5os###########################$91
Procesamiento de texto & manipulacin de strings# #$96
Ampliando la de(inicin de 5ariables de tipo string#####################$96
Escapando 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
,unciones de (ormato##############################################################$$?
,unciones de manipulacin#####################################################$$1
"anipulando subcadenas en cadenas################################$$C
,unciones de encriptacin######################################################$8$
0esumen de las principales (unciones de string#########################$8%
Taller de Archi5os & Procesamiento de ,ormularios#####################$81
Anexo I7 constantesD 5ariables 5ariables & 5ariables
superglobales###################################################### $86
6
Programacin Procedural de Apli caciones 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####################$??
>abeceras adicionales como par2metro extra########################$?%
>omprobando Aue 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 (echa & hora actual con (ormato en una cadena de
texto####################################################################################### $?G
=alidar una (echa####################################################################$%$
>2lculo de (echa + hora sencillo##############################################$%$
Ejemplos pr2cticos de c2lculos basados en (echas#####################$%?
I>u2nto tiempo ha pasadoJ####################################################$%?
I<uH edad tiene###J#################################################################$%%
IEn AuH (echa naci###J###########################################################$%%
,unciones matem2ticas################################### # # # # # $%1
4btener un n3mero ele5ado a la potencia##################################$%1
4btener el n3mero m2s alto & el n3mero m2s bajo####################$%1
0edondear un n3mero con ) cantidad de decimales##################$%6
0edondear un n3mero hacia abajo#############################################$%6
G
Programacin Procedural de Apli caciones 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
4btener la porcin espec(ica de un arra&##############################$/9
>ombinar dos arra&sD utili@ando uno para las cla5es & otro para
los 5alores############################################################################### $/9
>ombinar dos o m2s arra&s####################################################$/$
>ombinar dos o m2s arra&s multidimensionales de manera
recursi5a################################################################################# $/$
4rdenando Arra&s por sus 5alores##############################################$/8
4rdenar un arra& de 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 manteniendo 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 elementos al (inal del arra&#######################################$//
Agregar elementos al comien@o del arra&###############################$/1
Eliminar el 3ltimo elemento de un arra&#################################$/1
Eliminar el primer elemento de un arra&################################$/1
Eliminar 5alores duplicados en un arra&#################################$/6
B3sAuedas & (iltros######################################################################$/6
C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>ontar la cantidad de 5eces Aue los elementos aparecen en un
arra&####################################################################################### $/6
>ontar la cantidad de elementos de un arra&#########################$/G
4btener la suma matem2tica de los 5alores de un arra&#######$/G
4btener las di(erencias entre dos o m2s arra&s######################$/G
,iltrar datos de un arra&D utili@ando una (uncin de retorno# # #$/C
=eri(icar si un arra& contiene una cla5e determinada#############$19
4btener todas las cla5es de un arra& o todos los 5alores#######$19
=eri(icar si un arra& contiene una 5alor determinada#############$1$
Buscar 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 & eliminacin 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 una 5ariable de sesin##############################################$6?
$9
Programacin Procedural de Apli caciones 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%
*tili@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 lenguaje -<!#################################################################$C?
Tipos de datos m2s comunes ErecomendadosF#######################$C?
-int2xis b2sica de las sentencias -<!#####################################$C%
>rear tablas en una base de datos#####################################$C%
Insertar datos en una tabla#################################################$C1
-eleccionar registros###########################################################$C1
"odi(icar registros###############################################################$C6
Eliminar registros################################################################$CG
$$
Programacin Procedural de Apli caciones 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$
,unciones del lenguaje -<! de "&-<!####################################898
>ontar la cantidad de registros7 >4*)TEF###########################898
-umar totales7 -*"EF##########################################################898
>oncatenar cadenas7 >4)>ATEF##########################################898
>on5ertir a min3sculas & ma&3sculas7 !>A-EEF & *>A-EEF# 89?
0eempla@ar datos7 0EP!A>EEF############################################89?
4btener los primeros o 3ltimos caracteres7 !E,TEF & 0IHTEF
############################################################################################ 89?
0edonder n3meros7 04*)'EF#############################################89?
4btener solo la (echa de un campo 'ATETI"E o TI"E-TA"P7
'ATEEF################################################################################# 89?
4btener una (echa (ormateada7 'ATEB,40"ATEF################89?
4btener el registro con el 5alor m2ximo & mnimo7 "ASEF &
"I)EF################################################################################### 89%
4ptimi@acin de bases de 'atos#################################################89%
Todos los registros deben tener un I' 3nico############################89%
>rear ndices en las tablas######################################################89/
Indica cu2les campos 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
>onectarse a la base de datos################################################89G
-eleccionar una base de datos###############################################89C
Ejecutar una consulta simple##################################################89C
$8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Ejecutar una consulta de seleccin m3ltiple & capturar sus
resultados############################################################################### 89C
>apturamos el arra& con los resultados##############################89C
!iberar los resultados##########################################################8$9
>errar la conexin###################################################################8$9
Algunos ejemplos concretos####################################################8$$
>onsulta de seleccin#########################################################8$$
Insertar 5arios registros en un solo paso############################8$$
"&-<! desde PHP con el conector m&sAli###################################8$?
Abrir una conexin mediante m&sAli#######################################8$%
Preparar la consulta################################################################8$%
Ejecutar la consulta################################################################8$/
>errar 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!A"P son las siglas de cuatro tecnologas libresD Aue
con(orman la base de las aplicaciones Web basadas en7
-istema 4perati5o 7 )*+!inux
-er5idor Web 7 Apache
-er5idor de bases de datos 7 "&-<!
!enguaje de programacin hbrido 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 las tecnologas !A"PD suprimen la NO
del comien@oD cometiendo el gra5e error de llamarlas
simplemente !A"P# 'e la misma (ormaD en una gran cantidad
de casosD la documentacin se re(iere al -istema 4perati5o
)*+!inuxD como N!inuxOD suprimiendo las 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 )*+!i nux &
!inux
!inuxD es un :ernelD es decirD el n3cleo de un -istema
4perati5oD mientras Aue )*+!i nuxD el -istema 4perati5o
Aue utili@a el Ternel !inux como n3cleo#
$%
Programacin Procedural de Apli caciones 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 (undamentales 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
distribuci ones )*+!inuxD es decirD di(erentes -istemas
4perati5os basados en el Ternel !inuxD entre las cuales se
destacan7 'ebianD *buntuD TubuntuD ,edoraD entooD
-lac:.areD >ent4-D Arch!inuxD AsturixD entre otros
cientos#
,ree -o(t.are ,oundation & el
Pro&ecto )*
!a ,ree -o(t.are ,oundationD organi@acin sin (ines de
lucroD (undada por 0ichard -tallmanD principal precursor del
-o(t.are !ibreD es el organismo Aue creD di(unde & promue5eD
el -istema 4perati5o )*+!inuxD a tra5Hs del Pro&ecto )*#
In(ormaci n compl ementari a
-i ti os Web de 0e(erenci a
-itio Web de la ,ree -o(t.are ,oundation7 ...#(s(#org
-itio Web del Pro&ecto )*7 ...#gnu#org
-itio Web del Ternel !inux7 http7++...#:ernel#org+
-itio Web de la !inux ,oundati on7
http7++...#linux(oundation#org+
$/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Bibl iogra( a compl ementari a
Introduccion al so(t.are libre#pd( E*ni5ersitat 4bierta de
>atalun&aF
-istema operati5o gnu linux basico#pd( E*ni5ersitat 4bierta de
>atalun&aF
Preparacin b2si ca del entorno
de desarrol lo
En este cursoD nos en(ocaremos en tecnologas !A"PD a partir
de la distribucin *buntu $9#9% !T- E!ucidF Lo superiorL
de )*+!inuxD basada en 'ebian#
En caso de RA contar con otra distri bucinD 5ersin de
*buntu o 'ebianD puedes saltar estos p2rra(os e ir
di rectamente a la instalacin de Apache#
Instalaci n de *buntu )*+!i nux en
Wi ndo.s
-i eres usuario de Windo.s & deseas conser5ar tu -istema
4perati5o actualD puedes descargar *buntu Windo.s
Installer desde el sitio Web o(icial de >anonical Eempresa Aue
desarrolla & mantiene *buntuF en la siguiente *0!7
http7++...#ubuntu#com+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 ordenador con *buntu o "- Windo.sU seg3n elijas#
Para instalar *buntu Windo.s InstallerD sigue las
instrucciones de los pasos 8 & ? de la *0! de
descargaD las cuales podr2s 5isuali@ar pulsando el botn
N-ho. me ho.O de cada uno de los pasos#
$1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Instalaci n de *buntu )*+!i nux como
3nico -i stema 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 selecciona la 5ersin de *buntu Aue
deseas descargar# Para procesadores de un solo
n3cleoD selecciona la 5ersin $9#9% !T-# Para
procesadores m2s modernosD puedes seleccionar la
3ltima 5ersin E5ersin Aue aparece seleccionada por
de(ecto en el desplegable 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: seg3n 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 continuacinD salta al paso % del sitio de descarga Eel
? es solo para probar *buntu sin instalarloFV pulsa el
botn Nsho. me ho.O & sigue las instrucciones para
instalar *buntu en tu ordenador#
Instalaci n 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 elloD
sigue los siguientes pasos7
$# En el panel superior Edonde (iguran los men3es
$6
Programacin Procedural de Apli caciones 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 Panel O#
8# A continuacinD ha@ doble clic 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 Terminal
>omando7 gnomeLterminal
>omentario7 Abrir terminal en modo gr2(ico
%# Pulsa el botn NAceptarO# =er2s ahoraD el smbolo de la
terminal en tu panel superior#
*na 5e@ creado el lan@adorD 5amos a continuar instalando
Apache# Para elloD abre una terminal D 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 escribe el siguiente comando7
sudo apt-get update
'eber2s ingresar tu contrasePa# "ientras la escribasD no se
mostrar2 ning3n car2cter en la pantalla Eni siAuiera asteriscosF#
-4B0E !4- >4"A)'4-
sudo7 te con5ierte en super usuario# Wnico usuario Aue tiene
permisos para instalar paAuetes en tu sistema operati5o#
apt-get7 es la utilidad para manejar paAuetes en
distribuciones )*+!inux basadas en 'ebian#
$G
Programacin Procedural de Apli caciones 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 repositorios o(iciales Edicho de
otra (ormaD obtiene un ndice de actuali@acionesF
*na 5e@ (inali@ada la sincroni@acin del ndice de
actuali@acionesD escribe7
sudo apt-get upgrade
)ue5amente deber2s ingresar tu contrasePa# PosiblementeD
deban instalarse actuali@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 pre5iamenteD los comandos sudo apt-get
update & luego sudo apt-get upgrade#
*na 5e@ actuali@ado el sistema operati5oD procederemos a
instalar Apache# Para elloD escribe el siguiente comando7
sudo apt-get install apache2
-4B0E !4- >4"A)'4-
install es la opcin de apt-get Aue indica Aue se instalar2
uno o m2s paAuetes
$C
Programacin Procedural de Apli caciones 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 terminal7
sudo /etc/init.d/apache2 start
TIP7
Al escribir comandosD nombres de archi5os &+o directorios en
la terminalD pulsando la tecla de tabulacinD se
autocompletan#
>uando al pulsar la tecla de tabulacinD un pitido es
emitidoD puede signi(icar una de dos cosas7 aF Aue el
comandoD 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
5arias 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 Apli caciones 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 cambi os de con(iguracin de ApacheD se reali@an
modi(icando el archi5o apache2.conf Aue se encuentra en el
directorio /etc/apache2/#
Este archi5oD solo puede modi(icarseD accediendo a HlD como
super usuario7
sudo gedit /etc/apache2/apache2.conf
el comando geditD abrir2 el archi5o con la aplicacin edit7 un
editor de textos#
0ecargar Apache7
sudo /etc/init.d/apache2 reload
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 bien5enidaD ingresando la *0! http7++localhost o
http7++$86#9#9#$ en tu na5egador de Internet#
Para abrir el na5egador de Internet D 5e a Apl icaciones
X Internet X )a5egador Web ,ire(ox#
TambiHn puedes abrir ,ire(ox desde la terminal D
escribiendo firefox#
Es posible tambiHnD abrir una *0! en ,ire(ox desde la
8$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
terminal D escribiendo7
firefox http://www.google.com
(o la URL a la cual desees acceder)
Instalaci n de "&-<!
E5er seccin7 PHP & "&-<! m2s adelanteF
Instalaci n de PHP
Instalar PHP en *buntu es tan simple Aue solo reAuiere un
comando# Apro5echaremos esta simplicidadD para Nmatar dos
p2jaros de un tiroOD e instalarD adem2s de PHPD 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
eugenia@cocochito:~$ php -v
PHP 5.3.2-1uuntu!.1! with "uhosin-#atch $cli% $uilt: &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 di rectori o 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
redireccione 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 apuntando 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 perjuicio de elloD aprenderemos sobre
como lle5ar adelante la opcin $#
>rear el di rectorio para tu Web local
Abre una terminal & escribe el comando cd ~ Aue te lle5ar2
directamente a la home de tu usuario & a continuacin escribe
el comando pwd Aue te indica en Aue directorio te encuentras
8?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
actualmente# 0ecuerda Aue el comando cd sir5e para mo5erte
desde la terminalD por 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/nomre5de5tu5usuario#
*na 5e@ allD crearemos un directorio llamado 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(i cando el directori o ra@ de tu Web
l ocal
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-availale/
A continuacinD lista los archi5os de esa carpeta con el
comando ls Eele eseF seguido de la opcin -l EeleF Aue te
permitir2 listarlos uno debajo del otro Esin la opcin -lD se
8%
Programacin Procedural de Apli caciones 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-availale/
eugenia@cocochito:/etc/apache2/sites-availale$ 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 necesitamos 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
Documentoot /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 /var/www/ por /home/tu-usuario/curso-
php/
: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 Apli caciones 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 /var/www/ Aue apuntara a /home/tu-
usuario/curso-php/#
'e haber optado por esta alternati5aD 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 crear 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 apuntarD & nombreBdelBenlaceBsimbolico el
NaliasO para ese s&mlin:#
Para crear un enlace simblicoD llamado miweD dentro del
directorio /var/www/ & Aue apunte a /home/eugenia/curso-
php/ deberamos haber hecho lo siguiente7
cd /var/www/
sudo ln -s /home/eugenia/curso-php/ miwe
Entonces cuando accediHramos a /var/www/miwe/
hubiHsemos estado 5iendo los archi5os de
/home/eugenia/curso-php/#
81
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
EtiAuetas de apertura & ci erre
>omo se explic anteriormenteD existen dos posibilidades para
de(inir Aue un archi5o 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 independientemente 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 5entajas7
$# Permite la utili@acin de S"! en el ser5idor# El lenguaje
S"! utili@a como etiAuetas de apertura & cierreD ZJ & JX#
Alternati5amenteD permite tambiHn ZJxml & JX# Por lo
tantoD utili@ando ZJphp se permite ejecutar cdigo S"!
como tal#
8# E5ita tener Aue embeber
$
cdigo S"! dentro de PHP
?# Es una (orma de de(inir un lenguaje 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 & mantenimiento de aplicaciones#
86
Programacin Procedural de Apli caciones 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 5alor de short$open$tag en %ffD en el archi5o
php#iniD puesto Aue el 5alor por de(ecto 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# *tili@arlaD reAuiere de con(igurar el archi5o
php#iniD estableciendo el 5alor de short$open$tag a %n#
? -his directive determines whether or not #.# will recogni@e code etween
? :A and A9 tags as #.# source which should e processed as such. BtCs een
? recommended for several *ears that *ou not use the short tag Dshort cutD
and
? instead to use the full :Aphp and A9 tag comination. 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 ac6wards compatiilit*3 ut we recommend *ou donCt use them.
? 7efault Jalue: Kn
? 7evelopment Jalue: Kff
? #roduction Jalue: Kff
? http://php.net/short-open-tag
short$open$tag & %n
Puede leer m2s in(ormacin sobre shortBopenBtag en
http7++...#php#net+manual+es+ini#core#phpYini#shortLopenLtag
A=I-47
8G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
)tese Aue no existe posibilidad de modi(icar
shortBopenBtag en tiempo de ejecucin#
>onocer el 5al or 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 5alorD directamente en el archi5o
php#ini7
grep short5open5tag /etc/php5/apache2/php.ini
A=I-47
0eemplace )etc)php5)apache2)php.ini por la ruta del
php#ini en su ser5idorD de ser necesario#
Instrucci ones & estructuras
Existen dos tipos de instrucciones en PHP7 aAuellas
instrucciones Aue se ejecutan en una 3nica lnea & las
estructuras de control Aue almacenan dichas instrucciones#
!as instrucciones simplesD siempre deben (inali@ar con un
8C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
punto & coma EVF mientras Aue las estructuras de control D
encerrer2n dichas instrucciones entre lla5es [ \#
:Aphp
estructura de control *
instrucciMn 1+
instrucciMn 2+
,
A9
Identaci n 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 aunAue 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 %
espacios 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
instrucciMn ?
estructura de control 1.1.1 N
instrucciMn c?
O
O
?9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
estructura de control 1.2 N
instrucciMn d?
O
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 (unciones 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
=ariabl es & ti pos de datos
b2sicos
*na 5ariable es elemento destinado a almacenar
datos# ]staD puede almacenar datos 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(inici n de una 5ariable7 !as 5ariables en PHP se de(inen
anteponiendo 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@ar por car2cter al(abHtico o guin
bajo EBF
El nombre puede estar con(ormado por ma&3sculasD
min3sculasD guiones bajos EBF & n3meros
Asignacin de 5al ores7 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
cadena 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
HstosD n3meros enteros o de coma (lotanteF & los booleanosD
no reAuieren ser entreLcomillados#
A=I-47
Para los n3meros de coma (lotante se utili@a el punto E#F & )4
la coma EDF
=eamos un ejemplo de de(inici n & asignaci n de
5ariables7
:Aphp
$codigo5de5producto Q 124!?
$nomre5producto 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
$nomre5de5producto5por5defecto Q D#roducto alimenticioD?
-nom.re$producto & -nom.re$de$producto$por$defecto+
echo $nomre5producto? // imprime: #roducto alimenticio
A9
TambiHn es posibleD insertar el 5alor de una 5ariableD
dentro de una cadena de texto7
:Aphp
$nomre5de5producto5por5defecto Q D#roductoD?
$nomre5producto Q /-nom.re$de$producto$por$defecto en oferta/?
echo $nomre5producto? // imprime: #roducto en oferta
A9
??
Programacin Procedural de Apli caciones 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 desea Aue
`nombreBproducto sea KProductos en o(ertaK# Estos casosD se
resuel5en en5ol5iendo dicha 5ariable entre lla5es7
:Aphp
$nomre5de5producto5por5defecto Q D#roductoD?
$nomre5producto Q D*-nom.re$de$producto$por$defecto,s en ofertaD?
echo $nomre5producto? // imprime: #roductos en oferta
A9
En PHPD tambiHn es posible concatenar 5ariables mediante
el operador de concatenacin KpuntoK E#F7
:Aphp
$nomre5de5producto5por5defecto Q D#roductoD?
$nomre5producto Q -nom.re$de$producto$por$defecto . / en oferta/?
echo $nomre5producto? // imprime: #roducto en oferta
A9
AunAue esta 3ltima pr2cticaD debe utili@arse responsablementeD
puesto Aue en determinadas ocasiones puede resultar di(cil de
leer & desci(rar la salida (inal Aue tendr27
:Aphp
$codigo5de5producto Q 124!?
$nomre5producto 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!?
$detalles5del5producto 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
:Aphp
$codigo5de5producto Q 124!?
$nomre5producto 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!?
$detalles5del5producto Q /'-codigo$de$producto( -nom.re$producto. Precio0 12D
-precio.-/+
A9
Para modi(icar una 5ariableD reempla@ando su 5alorD solo
basta con reasignarle datos7
:Aphp
$codigo5de5producto Q 124!?
$nomre5producto 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!?
$detalles5del5producto Q D$$codigo5de5producto% $nomre5producto. #recio: R"7
$precio.-D?
echo $detalles5del5producto?
$detalles5del5producto Q DSo ha* detalles definidosD?
print $detalles5del5producto?
A9
)ul lD var$dump'( e isset'(
)o solo es posible modi(icar el 5alor de una 5ariable# TambiHn
es posible7
aF 5aciarla manteniendo su tipo7
?/
Programacin Procedural de Apli caciones 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 Edestrui rlaF 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 mediante 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%?
var$dump'-producto(+
"#
$enerar% &n error, 'a (&e la )ariable *+rod&cto ,a sido destr&ida
-alida:
./. otice: !nde0ined )ariable: +rod&cto ...
!LL
#"
A9
?1
Programacin Procedural de Apli caciones 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 imprimirlo 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 dispones de la
(uncin isset'(# Esta (uncinD de5ol5er2 5rue si ha sido
de(inida & no es 3144# '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 isset'-producto(+
# retorna 3alse
unset$$producto%?
echo isset'-producto(+
# retorna 3alse
A9
I3144 o unset'(J I>u2l de l os 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
direccin de la memoria en la cual haba sido escrita dicha
5ariable#
"al as pr2cticas con 5ari abl esD Aue
a(ectan el uso de memoria
Es posible tambiHnD agregar a una 5ariableD otros datos al
(inal de la cadena# Para elloD se utili@a el signo punto E#F
antecediendo al signo igualdad EaF7
:Aphp
$codigo5de5producto Q 124!?
$nomre5producto 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!?
$detalles5del5producto Q D$D?
$detalles5del5producto .& $codigo5de5producto?
$detalles5del5producto .& D% D?
$detalles5del5producto .& $nomre5producto?
$detalles5del5producto .& D #recio: R"7 D?
$detalles5del5producto .& $precio?
$detalles5del5producto .& 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
anteriorD solo reAuiere una direccin de memoria para su
almacenamiento#
?G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
4peradores aritmHti cos
PHP permite reali@ar operaciones aritmHticas de lo m2s
5ariadas & por consiguienteD utili@ar PHP Kcomo calculadoraK#
Para elloD disponemos de los siguientes operadores aritmHticos7
4peradores aritmHticos
Ejemplo Nombre Resultado
-$a
Negacin Opuesto de $a.
$a T $
Adicin Suma de $a y $b.
$a - $
Sustraccin Diferencia de $a y $b.
$a U $
Multiplicacin roducto de $a y $b.
$a / $
Di!isin "ociente de $a y $b.
$a V $
Mdulo Resto de $a di!idido por $b.
0e(erencia del manual o(icial de PHP7
http7++...#php#net+manual+es+language#operators#arithmetic#p
hp
Haciendo c2l culos con el I=A
:Aphp
$alicuota5iva Q 21?
$codigo5de5producto Q 124!?
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5?
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto T $iva?
A9
Estandari@acin de cdigo
*tili@a nombres descripti5os para las 5ariablesV
-i el nombre es compuestoD separa cada palabra por un
?C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
guin bajoV
Escribe los nombres de 5ariables en min3sculasV
>uando debas asignar m3ltiples 5alores a una 5ariableD
utili@a una sola instruccin toda 5e@ Aue sea posibleV
*tili@a comillas dobles para encerrar las cadenas de textoD
en 5e@ de comillas simplesV
*tili@a espacios en blanco antes & despuHs de un operador
aritmHtico para (acilitar la lecturaV
sett&pe Iun bug no resuel to o (eature
objetabl eJ
PHPD asume Aue un n3mero encerrado entre comillas es
lgicamenteD una cadena de texto7
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 de los n3merosD sea de tipo string7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q D22D? $ Q 1'? echo $a T $?C
!2
)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 & a5isarnos del errorD pasar2 por
alto la 5ariable con(licti5a7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q D122D? $ Q 1'? echo -a 7 -.?C
1'
Existe una (uncin para con5ertir el tipo de una 5ariable
%9
Programacin Procedural de Apli caciones 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@anasD?
php 9 settype'-a8 /integer/(+
php 9 var5dump$$a%?
int$22%
php 9
*tili@ando settypeD KpodramosK asegurarnos reali@ar
operaciones aritmHticas seguras7
:Aphp
$a Q D22 man@anasD?
$ Q 1'?
settype'-a8 /integer/(+
echo $a T $?
# salida: 45
A9
-in embargo Iprueba Aue sucede al ejecutar este
cdigoJ
$a Q Dman@anas 22D?
$ Q 1'?
sett*pe$$a3 DintegerD%?
echo $a T $?
A=I-47
)o con(es en settype'( para e(ectuar operaciones
aritmHticas# Es pre(erible e5itar su uso para estos casos#
%$
Programacin Procedural de Apli caciones 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 necesidad 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 HsteD es el mejor
mHtodo# Puesto Aue nos aseguraD la ma&or legibilidad posible#
=amos a 5er un ejemplo de aAuello Aue no debe hacerse &
sugerir una mejor pr2ctica#
*na mala pr2ctica7 col ocar cdigo HT"!
embebido dentro de 5ariables de PHP
:Aphp
$alicuota5iva Q 21?
$codigo5de5producto Q 124!?
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5?
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto T $iva?
$producto Q D:p9:9#roducto::/9 $$codigo5de5producto% $nomre5producto:r/9
:9#recio::/9 R"7 $precio5neto.- $BJP incluido%:/p9D?
A9
:Wdoct*pe html9
:html9
:head9
:title97etalles del producto :Aphp echo $nomre5producto? A9:/title9
:/head9
:od*9
:Aphp echo $producto? A9
:/od*9
:/html9
%8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
*na buena pr2ti ca para e5itar l o anteri or
:Aphp
$alicuota5iva Q 21?
$codigo5de5producto Q 124!?
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5?
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto T $iva?
A9
:Wdoct*pe html9
:html9
:head9
:title97etalles del producto :Aphp echo $nomre5producto? A9:/title9
:/head9
:od*9
:p9:9#roducto::/9 $:Aphp echo $codigo5de5producto? A9%
:Aphp echo $nomre5producto? 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 aunAue el 5alor de
short$open$tag sea %ff# En 5ersiones anterioresD se debe
utili@ar !"php echo -foo+ "# o en su de(ectoD establecer en
%nD el 5alor de short$open$tag en php.ini
%?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>omentando & documentando el
cdi go (uente
*na de las pr2cticas m2s recomendadasD consiste en
KcomentarK el cdigo (uente# >omentar el cdigoD signi(ica
Kescribir re(erencias sobre el cdigo (uente Aue nos a&uden a
entenderloK#
En PHPD existen dos tipos de comentarios7
$# !os comentarios de una sola lnea
8# !os comentarios de 5arias lneas Eo docstringsF
!os comentari os de una sola lneaD 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!?
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5? # +recio sin 789
"" C%lc&los relacionados al 789
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto 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 espaPol 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5? # +recio sin 789
"" C%lc&los relacionados al 789
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto T $iva? # .recio con 789 incl&ido
# 5%D% calc&lar desc&entos +or cantidad
A9
En cambioD los comentari os de 5arias l neas 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!?
$nomre5producto Q DPgua Gineral Ganantial x 5'' mlD?
$precio5ruto Q 2.,5? # +recio sin 789
"" C%lc&los relacionados al 789
$iva Q 2.,5 U 21 / 1''?
$precio5neto Q $precio5ruto 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Inclusi n 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 un
(ichero #phpD se encuentran aAuellos con las siguientes
extensiones7 #phpD #txtD #htmD #html D entre otros con (ormato
de texto#
Para insertar archi5osD PHP dispone de cuatro (unciones7
$# include7
http7++...#php#net+manual+es+(unction#include#php
8# includeBonce7
http7++...#php#net+manual+es+(unction#includeLonce#php
?# reAuire7
http7++...#php#net+manual+es+(unction#reAuire#php &
%# reAuireBonce7
http7++...#php#net+manual+es+(unction#reAuireLonce#php
Estas cuatro (uncionesD necesitan recibir como par2metro
8
D la
ruta local o remota del archi5o a ser incluido#
Ejempl os de inclusi n de archi5os locales7
:Aphp
include$Darchivo.phpD%?
include5once$Darchivo.txtD%?
re;uire$Darchivo.htmlD%?
8 "2s adelanteD cuando hablemos de (uncionesD 5eremos detenidamente AuH es &
para AuH sir5e un par2metro# Por el momentoD cuando hablemos de par2metroD
entenderemos Aue se trata de un K5alorK Aue debemos pasar+en5iar a una
(uncin#
%1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
re;uire5once$Darchivo.htmD%?
A9
Ejempl os de inclusi n de archi5os remotos7
:Aphp
include$Dhttp://www.miwe.com/archivo.phpAfooQarD%?
include5once$Dhttp://www.miwe.com/archivo.phpD%?
re;uire$Dhttp://www.miwe.com/archivo.htmlD%?
re;uire5once$Dhttp://www.miwe.com/archivo.txtD%?
A9
'i(erenci a entre incl usin de archi 5os
remotos & l ocal es
*na di(erencia (undamentalD entre incluir archi5os remotos &
archi5os localesD es Aue los archi5os PHP remotosD ser2n
interpretados pre5iamente en el ser5idor de origen & Kser5idosK
al ser5idor de destino Eel Aue los inclu&eFD &a interpretados# -in
embargoD cuando un archi5o PHP local es incluidoD no ser2
pre5iamente interpretadoD sino Aue de esoD se encargar2 el
archi5o Aue lo inclu&#
Es decirD Aue si Aueremos incluir el archi5o miB(ichero#php &a
interpretado con(orme el 5alor del par2metro K(ooKD si
utili@amos7
include$Dmi5fichero.phpAfooQ15D%?
PHP arrojar2 un errorD &a Aue buscar2 un archi5o llamado
miB(ichero#phpJ(ooa$/ en 5e@ de interpretarlo#
-in embargoD podremos incluir remotamente para Aue se nos
de5uel5a el archi5o interpretadoD mediante7
include$Dhttp://miwe.com/mi5fichero.phpAfooQ15D%?
%6
Programacin Procedural de Apli caciones 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 recibidos en una
5ariable7
$contenido Q file5get5contents$Dhttp://miwe.com/mi5fichero.phpAfooQ15D%?
'i(erenci a entre incl ude & reAuire
-i bien las (unciones reAuireEF e includeEF de PHP reali@an una
accin similar Eimportar un archi5oFD no son iguales#
includeEF intenta importar al archi5o indicado & 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
archi5o indicadoD arroja un error & (inali@a sin permitir Aue
el resto del script contin3e ejecut2ndose#
Include & reAui re KBonceK
!a 3nica di(erencia Aue existe entre include e includeBonce &
reAuire & reAuireBonceD es Aue si el archi5o indicado con
KBonceK &a ha sido incluido no 5ol5er2 a importarse#
%G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'e(i ni ci n
*na estructura de control es un bloAue de cdigo Aue
permite tomar decisiones de manera din2micaD sobre
cdigo existente#
>ondi ci onal es i(D else & else i (
El condicional i(D al igual Aue otras estructuras de controlD
permite tomar decisionesD 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 necesariamente el condicional debe cumplir la estructura
anterior# A 5eces solo es necesario e5aluar una 3nica condicin
& tomar una decisin -4!4 sobre la base de si esta condicin
se cumple7
si 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 Apli caciones 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 l gi cos & de comparaci n
Para e5aluar condicionesD no solo podemos recurrir a si KA es
igual a BK# Existen otros operadores Aue nos permiten e5aluar
di(erentes condiciones# Estos operadores se denominan
operadores l gicos & son aAuellos Aue nos permiten
e5aluar m3ltiples condiciones en un mismo procesoD
mientras Aue se denominan operadores de comparacinD a
aAuellos Aue utili@amos para e5aluar EcompararF la
relacin existente enntre elementos#
4peradores de comparacin
Ejemplo Nombre Resultado
#a $$ #% &gual TRUE si $a es igual a $b despu's de la manipulacin de tipos.
#a $$$ #% &d'ntico TRUE si $a es igual a $b( y son del mismo tipo.
#a )$ #% Diferente
TRUE si $a no es igual a $b despu's de la manipulacin de
tipos.
#a *+ #% Diferente
TRUE si $a no es igual a $b despu's de la manipulacin de
tipos.
#a )$$ #% No id'ntico TRUE si $a no es igual a $b( o si no son del mismo tipo.
#a * #% Menor ,ue TRUE si $a es estrictamente menor ,ue $b.
#a + #% Mayor ,ue TRUE si $a es estrictamente mayor ,ue $b.
#a *$ #% Menor o igual ,ue TRUE si $a es menor o igual ,ue $b.
#a +$ #% Mayor o igual ,ue TRUE si $a es mayor o igual ,ue $b.
/9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'i(erenci a entre igualdad e idHnti co en
l a 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 comparacin de
tiposD & arrojando Aue $9 ser2 igual Aue K$9KFD mientras Aue
el segundoD compara adem2s si ambos elementos
pertenecen al mismo tipo#
!o anteriorD tambiHn aplica a ;a & ;aa# =eamos algunos
ejemplos7
$a Q 1'?
$ Q D1'D?
$c Q 11?
$d Q '?
$e Q &alse?
$a QQ $ -rue $d QQ $e -rue
$a QQQ $ &alse $d QQQ $e &alse
$a WQ $ &alse $d WQ $e &alse
$a WQQ $ -rue $d WQQ $e -rue
4peradores l gi cos
Ejemplo Nombre Resultado
#a and #% And (y) TRUE si tanto $a como $b son TRUE.
#a or #% Or (o inclusi!o) TRUE si cual,uiera de $a o $b es TRUE.
#a -or #% .or (o e-clusi!o) TRUE si $a o $b es TRUE( pero no am%os.
) #a Not (no) TRUE si $a no es TRUE.
#a // #% And (y) TRUE si tanto $a como $b son TRUE.
#a 00 #% Or (o inclusi!o) TRUE si cual,uiera de $a o $b es TRUE.
En el manual o(icial de PHP
http7++...#php#net+manual+es+language#operators#logical#phpD
/$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
podemos 5er una le&enda Aue dice7
"La razn para tener las dos
variaciones diferentes de los
operadores "and" y "or" es que ellos
operan con precedencias diferentes."
!o ciertoD es Aue tanto el operador and como el operador cc
poseen una precedencia i@Auierda Ees decirD Aue la condicin
es e5aluada de i@Auierda a derechaF & lo mismo sucede con or
& dd#
>reando condi ci onal es
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 igual a 1'D?
O
TambiHn podemos conbinar else e i(D para tomar tantas
decisiones como condiciones Auieran e5aluarse7
/8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$a Q 15?
if $$a QQ 1'% N
echo DY$a es igual a 1'D?
O else if $$a QQ 12% N
echo DY$a es igual a 12D?
O else if $$a QQ 15% N
echo DY$a es igual a 15D?
O
R si a lo anterior le agregamos else estaramos cubriendo todas
las posibilidades7
$a Q 15?
if $$a QQ 1'% N
echo DY$a es igual a 1'D?
O else if $$a QQ 12% N
echo DY$a es igual a 12D?
O else if $$a QQ 15% N
echo DY$a es igual a 15D?
O else N
echo DY$a SK es ni 1' ni 12 ni 15D?
O
A=I-47
-e debe tener especial cuidado en la comparacin
de n3meros reales E(l otantesF# =eremos esto con
detenimiento m2s adelante# Para ma&or in(ormacinD 5isitar
la documentacin o(icial en7
http7++...#php#net+manual+es+language#t&pes#(loat#phpYlanguage
#t&pes#(loat#comparison
/?
Programacin Procedural de Apli caciones 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 programar 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(erenci2ndose notablemente por su
aplicacin en la pr2cticaD &a Aue es 5erdaderamente 3til en
aAuellos casos donde la utili@acin de else i( resulte
redundante#
B2sicamenteD con -.itchD lo Aue hacemos es e5aluar una
3nica expresin o 5ariableD & tomar di5ersas
decisiones en base a l os di(erentes posibles 5al ores 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 detenimiento, m%s adelante.
.ara ma'or in0ormaci?n, )isitar la doc&mentaci?n o0icial en
,tt+:""CCC.+,+.net"man&al"es"0&nction.date.+,+
#"
$nomre5dia Q CC?
switch $$numero5dia% N
case 1:
$nomre5dia Q DHunesD?
rea6?
case 2:
$nomre5dia Q DGartesD?
rea6?
case 2:
$nomre5dia Q DGiZrcolesD?
rea6?
case !:
$nomre5dia Q D[uevesD?
rea6?
/%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
case 5:
$nomre5dia Q DJiernesD?
rea6?
case (:
$nomre5dia Q D"=adoD?
rea6?
case ,:
$nomre5dia Q D7omingoD?
rea6?
default:
$nomre Q DSo saemos ;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 $$variale% N
case Dposile valor 1D:
"" algoritmo a e:ec&tar si *)ariable DD "+osible )alor 1"
rea6?
case Dposile valor 2D:
"" algoritmo a e:ec&tar si *)ariable DD "+osible )alor 5"
rea6?
default:
"" algoritmo a e:ec&tar si )alor no ,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 algoritmo 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!a palabra cla5e reser5ada de(aultD contendr2 el algoritmo a
ser ejecutadoD cuando 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 $$variale% N
case Dposile valor 1D:
case Dposile valor 2D:
case Dposile 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 Dposile valor !D:
"# algoritmo a e:ec&tar si el )alor de *)ariable es
+osible )alor 4
#"
rea6?
default:
"" algoritmo a e:ec&tar si )alor no ,a sido contem+lado en
"" ning@no de los

case
anteriores
O
I>u2ndo util i@ar i( & cuando s.itchJ
-i bien el uso de una u otra estructuraD depender2 de la
desicin de cada programadorD 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 un 3nico elemento o expresinD se
ma&ormente Econ ciertas excepcionesFD se utili@ar2 s.itch & se
optar2 por i(D cuando el uso de s.itch no sea posible#
/1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
/6
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"atri ces en PHP
*na matri@ Earra&F es un mapa de datos ordenado Aue asocia
Kcla5esK a sus 5alores correspondientes# Es asD Aue estas
matricesD nos son de gran utilidad para crear desde
diccionarios de datos hasta 2rboles de m3ltiples diccionarios#
-i ntaxi s b2sica
!a sintaxis b2sica se compone de7
arra*$clave Q9 valor3 %?
'onde cla5eD puede ser un entero7
$nomres5de5mu>er Q arra*$' Q9 CPnaC3 1 Q9 C/arielaC3 2 Q9 C)eciliaC3 %?
4 una cadena de texto7
$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3
C[avierC Q9 C!+21 \ 12''C3%?
R 5al orD cualAuier tipo de dato7
/G
Programacin Procedural de Apli caciones 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-raa>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 teniendo en cuentaD Aue un arra&D puede estar
inicialmente 5aco7
$mi5arra* Q arra*$%?
Imprimir en pantal la con printBr
Para imprimir una matri@ completa en pantallaD se puede
utili@ar la (uncin print$r'-array(7
php 9 $arra* Q arra*$' Q9 CPnaC3 1 Q9 C/arielaC3 2 Q9 CSoeliaC3%?
php 9 print$r'-array(+
Prra*
$
]'^ Q9 Pna
]1^ Q9 /ariela
]2^ Q9 Soelia
%
php 9
Acceso a l os tems de un arra&
Para acceder a un item del arra&D se puede reali@ar
haciendo una llamada a su cla5eD o por su n3mero de ndice
En3mero de almacenamiento internoFD siendo : EceroF 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
A=I-47
!a sintaxis b2sica para acceder a un arra& es
-array;indice< o -array;=clave=<
!os 5alores de un arra&D pueden no tener una cla5e
explcitamente asociada7
$mi5arra* Q arra*$CPnaC3 C/arielaC3 C[uliaC3 CSoeliaC%?
En ese casoD siempre se acceder2 a ellos por su n3mero de
ndice7
$mi5arra* Q arra*$CPnaC3 C/arielaC3 C[uliaC3 CSoeliaC%?
echo $mi5arra*]2^? "" im+rimir% F&lia
"odi(i cando el ementos
Para modi(icar un elementoD basta con acceder a Hste &
asignare un nue5o 5alor7
$mi5arra* Q arra*$CPnaC3 C/arielaC3 C[uliaC3 CSoeliaC%?
$mi5arra*]2^ Q CFimenaC?
echo $mi5arra*]2^? "" im+rimir% Gimena
Agregar el ementos
Para agregar un 5alor a un arra& existenteD se asigna Hste a un
ndice 5aco7
$mi5arra* Q arra*$CPnaC3 C/arielaC3 C[uliaC3 CSoeliaC%?
$mi5arra*]^ Q C)eciliaC?
print5r$$mi5arra*%?
El nue5o 5alorD ser2 agregado al (inal de la lista7
19
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
php 9 print5r$$mi5arra*%?
Prra*
$
]'^ Q9 Pna
]1^ Q9 /ariela
]2^ Q9 [ulia
]2^ Q9 Soelia
]!^ Q9 )ecilia
%
Pero si se desea asociar dicho 5alor a una cla5eD Hsta
debe indicarse7
$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3
C[avierC Q9 C!+21 \ 12''C3%?
$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 e5aluado 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 5ac o#
El uso de un string 5ac o como cla5eD 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 usando como cla5e o como ndiceD alguna
cla5e o ndice existenteD estaramos "4'I,I>A)'4 dicho
elemento en 5e@ de estar agregando uno nue5o#
1$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
0ecorriendo matrices
din2mi camente con (oreach
6oreach es un constructor nati5o de PHPD Aue permite reali@ar
operaciones iterati5as EcclicasF con matricesD recorriendo uno
a uno los elementos de una matri@D comen@ando por el primer
elemento#
-i ntaxi s 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 nombre Aue utili@aremos como
identi(icador del elementoD el cual retornar2 su 5alor7
$nomres5propios Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPlertoC3 C)eciliaC3
C)arlosC3%?
foreach$$nomres5propios as $nomre% N
echo $nomre . chr$1'%?
O
"#
-alida:
9na
F&lia
L&isa
9lberto
Cecilia
Carlos
#"
18
Programacin Procedural de Apli caciones 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 ej emplo de iteraci n compl ej a 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-raa>oC Q9 C!('!-+'''C%3
C)asadoC Q9 -rue3
C#asaporteC Q9 &alse3
%?
foreach$$datos5de5>uan as $titulo Q9 $dato% N
if$Wis5arra*$$dato%% N
if$$dato QQQ -rue% N
$dato Q C"BC?
O else if $$dato QQQ &alse% N
$dato Q CSKC?
O
echo DN$tituloO: N$datoOD . chr$1'%?
O else N
foreach$$dato as $tipo5telefono Q9 $numero% N
echo D-elZfono N$tipo5telefonoO: N$numeroOD . chr$1'%?
O
O
O
"# 9+ellido: .reE
3ec,a de nacimiento: 25-11-1HA0
1elI0ono Casa: 4510-H050
1elI0ono >?)il: 15 401A-2550
1elI0ono 1raba:o: 4=04-H000
Casado: -7
.asa+orte: J
#"
1?
Programacin Procedural de Apli caciones 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 su tipo es Karra&K# 'e5uel5e 51> si
e(ecti5amente es un arra& & 6?42> en caso contrario#
"odi(i cando matrices di n2mi camente
con (oreach
En el ejemplo anteriorD e5al3abamos si el dato recibido era True
o ,alseD asignando un nue5o 5alor a Hste E-I para True & )4
para ,alseF#
PeroD si tras (inali@ar el bucleD hiciHramos un print$r'( a
-datos$de$@uanD el 5alor de la cla5e KcasadoK 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'
]-raa>o^ Q9 !('!-+'''
%
])asado^ Q9 1
]#asaporte^ Q9
%
Es decirD Aue ese datoD solo (ue modi(icado en un 2mbito localD
el cual aplica solo a esa estructura de control#
Pero IAuH sucede si Aueremos modi(icar globalmente los
5alores de los elementos de una matri@J
PHPD nos (acilita esa opcinD asignando el 5al or por
1%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
re(erencia# *na asignacin por re(erenciaD se reali@a
antecediendo el signo c al 5alor7
$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-raa>oC Q9 C!('!-+'''C%3
C)asadoC Q9 -rue3
C#asaporteC Q9 &alse3
%?
foreach$$datos5de5>uan as $titulo Q9 A-dato% N
if$Wis5arra*$$dato%% N
if$$dato QQQ -rue% N
$dato Q C"BC?
O else if $$dato QQQ &alse% N
$dato Q CSKC?
O
echo DN$tituloO: N$datoOD . chr$1'%?
O else N
foreach$$dato as $tipo5telefono Q9 $numero% N
echo D-elZfono 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'
]-raa>o^ Q9 !('!-+'''
%
;Basado< &# 2C
;Pasaporte< &# 3%
%
!a asignacin por re(erenciaD suele ser mu& 3tilD cuando por
ejemploD se necesita aplicar una misma (uncinD a todos los
elementos de un arra& Epor ejemploD con5ertir a ma&3sculas
1/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
todos los 5aloresD con la (uncin strtoupper'(D nati5a de PHPF7
$nomres Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPlertoC3 C)eciliaC3 C)arlosC3%?
foreach$$nomres as _$nomre% N
$nomre Q strtoupper$$nomre%?
O
print5r$$nomres%?
"#
9rra'
(
K0L DM 99
K1L DM F!L79
K2L DM L!7-9
K5L DM 9LNB21J
K4L DM CBC7L79
K5L DM C92LJ-
)
#"
11
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Whil eD un bucl e si mple
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 6alseD & 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 ej emplo senci l lo
$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 Apli caciones 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 ej emplo pr2ctico
$*ears Q arra*$%?
$*ear Q 1++'?
while $$*ear :Q 2'''% N
$*ears]^ Q $*ear?
$*earTT?
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 expresin 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"#
9rra'
(
)
#"
'o .hileD tan si mple como .hil e
pero con una 5entaj a
El bucle doL.hile esD como indica el ttuloD tan simple como
.hile & (unciona de manera pr2cticamente idHntica# !a 3nica
di(erenciaD el algoritmo iterati5o se ejecutar2 s o sD una 5e@ al
comien@o & luegoD e5aluar2 la expresinD & 5ol5er2 a ejecutar 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+resi?n sea )erdadera
#"
O while $$expresion%?
!ectura humana7
hacer N
esto3 la primera * ve@ * luego hacerlo...
O mientras ;ue $esta condiciMn se cumpla%?
*n ej emplo simple
$*ears Q arra*$%?
$*ear Q 1++'?
do *
$*ears]^ Q $*ear?
1C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$*earTT?
, while $$*ear : 1++'%?
print5r$$*ears%?
"#
9rra'
(
K0L DM 1HH0
)
#"
print $*ear?
// 1++1
69
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Bucles (orD los m2s complej os 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
Primera expresi n7 se ejecuta incondicionalmente al
comien@o del bucleV
-egunda expresin7 se e5al3a como 5erdadera o (alsa
al inicio de cada iteracin# El bucle contin3aD solo si es
5erdadera#
Tercera expresi n7 se ejecuta al (inal de cada iteracin
-i ntaxi s7
for $expresion1? expresion2? expresion2% N
// algoritmo ;ue se e>ecuta cuando expresion2 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 deber2n ir separadas por una
coma7
6$
Programacin Procedural de Apli caciones 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
echo DN$prefi>oON$iON$sufi>oOD?
O
"#
Codigo R 0001
Codigo R 0002
Codigo R 0005
Codigo R 0004
#"
A=I-47
Al utili@ar expresiones m3ltiplesD se debe tener en cuentaD
Aue las expresiones 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
$iTT% 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 R 0001
Codigo R 0002
Codigo R 0005
68
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Codigo R 0004
#"
A=I-47
-i la segunda expresin est2 5acaD el bucle ser2 corrido
de (orma inde(inidaD moti5o por el cualD debe utili@arse en
alg3n puntoD la expresin brea: E5ista en s.itchF# 'e lo
contrarioD podra producirse un desbordamiento de la
memoria# EstoD es debido a Aue PHPD considera la expresin
5aca como True Eal igual Aue >F#
6?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>uriosidades si nt2cticas de la
bipol aridad no diagnosti cada de
PHP
<ueremos a PHP & por eso lo usamos IciertoJ Pero aAuello de
Aue Kel amor es ciegoKD 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 (ormas7 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 if $$#.# QQ Dest= en su fase depresivaD%:
echo /%hF 3oF De.iste utiliGar elseif sin 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 as< 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
R tal cual lo imaginasD e(ecti5amenteD con (or & (oreachD PHP
puede ser NbipolarO# 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 l o usas### es tu eleccin;
-i todo lo anteriorD te dej la (rase Nno Auera saber tantoOD
rondando en tu cabe@aD sabr2s disculparmeD pero debo
contarte tambiHn sobre goto EaunAue entre nosD a 5eces puede
ser 3tilF#
goto es un NoperadorO al Aue podramos llamar Noperador
sint2cticoOD Aue se uti li@a para NsaltarO a una @ona
espec(ica del programa# El punto 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 podra 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 ej emplo noLpr2cti co para entender
goto
:Aphp
echo D.ola GundoWD?
goto mi5eti;ueta?
echo D1sto no se mostrar=3 *a ;ue goto lo saltar=D?
6/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
mi$etiKueta0
echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%?

echo DX esta tamiZnWD . chr$1'%?
A9
!o anteriorD generar2 la siguiente salida7
eugenia@cocochito:~/cursophpasico$ php -f file.php
Hola LundoF
>sto sM serI mostrado
N esta tam.iOnF
eugenia@cocochito:~/cursophpasico$
-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 estructurasD todo el cdigo
escrito debajo de una etiAuetaD ser2 ejecutado cuando goto sea
llamado7
:Aphp
echo D.ola GundoWD?
goto mi5eti;ueta?
echo D1sto no se mostrar=3 *a ;ue goto lo saltar=D?

mi5eti;ueta:
echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%?
otra$etiKueta0
echo Dmmmm... esta tamiZn se muestra :/D . chr$1'%?
A9
R aAuD la prueba7
eugenia@cocochito:~/cursophpasico$ php -f file.php
Hola LundoF
>sto sM serI mostrado
mmmm... esta tam.iOn se muestra 0)
eugenia@cocochito:~/cursophpasico$
61
Programacin Procedural de Apli caciones 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 goto lo saltar=D?
mi5eti;ueta:
echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%?
goto 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:~/cursophpasico$ php -f file.php
Hola LundoF
>sto sM serI mostrado
eugenia@cocochito:~/cursophpasico$
Puedes 5er m2s sobre gotoD le&endo la documentacin o(icial7
http7++...#php#net+manual+es+controlLstructures#goto#php
66
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'e(i ni ci n
*na (uncinD es una (orma de agrupar expresiones & sentencias
EalgoritmosF Aue realicen determinadas accionesD pero Aue
HstasD solo se ejecuten cuando son llamadas Eal igual Aue las
(unciones nati5as de PHPF#
'eclarando ,unci ones
-i ntaxi s b2sica
!a sintaxis b2sica de una (uncinD es 5erdaderamente sencilla7
function nomre5de5la5funcion'parametros( *
"" algoritmo
,
-obre el nombre de las (unci ones
Para el nombre de las (uncionesD aplica todo lo dicho para el
nombre de 5ariables#
-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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
function nomre5de5la5funcion'parametroP8 parametro2( *
"" algoritmo
,
function otra5funcion'( *
"" algoritmo
,
!os par2metrosD se indican entre los parHntesisD a modo de
5ariablesD a (in de poder utili@arlos como talD dentro de la
misma (uncin7
function nomre5de5la5funcion'-parametroP8 -parametro2( *
"" algoritmo
,
Adem2sD a cada par2metroD se le puede asignar un 5alor por
de(ecto de cualAuier tipo7
function nomre5de5la5funcion'-nom.re8 -edad&258 -seQo&=6=( *
"" algoritmo
,
!lamando a una (unci n
*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 llamada7
eugenia@cocochito:~$ php -f file.php
eugenia@cocochito:~$
6C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Para llamar a una (uncinD simplemente debe especi(icarse
su nombreD en el lugar preciso donde se desea Aue Hsta se
ejecute# -iempre deben incluirse los parHntesis 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 (i nal idad de las
(unci ones
*na (uncinD puede tener cualAuier tipo de algoritmo &
cualAuier cantidad de ellos &D utili@ar cualAuiera de las
caractersticas 5istas hasta ahora#
)o obstante elloD una buena pr2cticaD indica Aue la
(inal idad de una (unci nD debe ser reali@ar una 3nica
accinD reuti li@able & por lo tantoD tan genHrica como
sea posible#
Paso de 5ari abl es por re(erenci a
en (unci ones
Al igual Aue en el bucle (oreachD es posible pasar 5ariables por
re(erencia a una (uncin#
G9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Para elloD al de(inirse la (uncinD debe colocarse el signo NcO
antecediendo a aAuellos par2metros Aue hagan re(erencia a
una 5ariable global7
"" de0inimos &na )ariable de %mbito global
-mi$varia.le$glo.al Q 1'?
"" de0inimos &na 0&nci?n (&e modi0icar% la )ariable global
function modificar5variale5gloal$A-varia.le3 $otro5parametro% N
$variale Q $variale U $otro5parametro?
O
"" llamamos a la 0&nci?n +asando como re0erencia la )ariable global
modificar5variale5gloal$-mi$varia.le$glo.al3 2%?
"" im+rimimos la )ariable global
echo -mi$varia.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 necesidad 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
NglobalO# El siguiente ejemploD es sinnimo del anterior7
"" de0inimos &na )ariable de %mbito global
-mi$varia.le$glo.al Q 1'?
"" de0inimos la 0&nci?n (&e ,ar% re0erencia a la )ariable global
function modificar5variale5gloal$$otro5parametro% N
glo.al $mi5variale5gloal?
$mi5variale5gloal Q $mi5variale5gloal U $otro5parametro?
O
"" llamamos a la 0&nci?n
modificar5variale5gloal$2%?
"" im+rimimos la )ariable global
echo -mi$varia.le$glo.al? "" salida: 20
G$
Programacin Procedural de Apli caciones 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 global
`miB5ariable#
!lamadas de retorno
En PHPD es posible Eal igual Aue en la gran ma&ora de los
lenguajes de programacinFD 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$%?
$una5variale Q otra5funcion5mas$$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 este tipo de accionesD se
las denomina llamadas de retorno#
En una llamada de retornoD el nombre de la (uncin a la
cual se desea llamarD es pasado como una cadena de
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 GundoWD?
O
"" 3&nci?n (&e ,ar% la llamada de retorno
function llamar5a5otra$$funcion% N
G8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
echo call$user$func$$funcion%?
echo chr$1'%?
"" contin&aci?n del algoritmo
O
llamar5a5otra$=decir$hola=%?
Pasar argumentos en una l lamada de
retorno
I<uH sucede si la (uncin a la cual se desea llamarD necesita
recibir uno o m2s argumentosJ En este casoD tenemos dos
opciones7
$F Pasar los argumentos a continuacin del nombre de
la (uncin7
call5user5func$Cnomre5de5la5funcionC3 $parametro13 $parametro2%?
Ejemplo7
"" 3&nci?n (&e llamarI con call_&ser_0&nc
function sumar5dos5numeros$$a3 $% N
return $a T $?
O
$numero51 Q 5?
$numero52 Q 1'?
$resultado Q call5user5func$Csumar5dos5numerosC3
$numero513
$numero52%?
echo $resultado?
8F 'e(i nir un arra& con todos los argumentos
necesari osD & hacer la llamada de retorno ampliada7
call5user5func$array$Cnomre5de5la5funcionC3 $arra*5con5argumentos%?
Ejemplo7
G?
Programacin Procedural de Apli caciones 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$Csumar5dos5numerosC3 $args%?
echo $resultado?
Argumentos no conocidos
>uando dentro de una (uncinD reali@amos una llamada de
retornoD as como la (uncin puede desconocer el nombre de
aAuella a la cual deber2 llamarD tambiHn es probable Aue si esa
(uncin reAuiere de argumentosD se descono@ca tambiHn la
cantidad de argumentos#
Para resol5er este planteoD contamos con 5arias (unciones
nati5as Aue 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 recibidos en una (uncin7
function foo$% N
$cantidad5de5argumentos Q func$num$args'(?
echo D8eciimos N$cantidad5de5argumentosO argumentosD?
O
foo$Cargumento 1C3 Cotro5argumentoC%?
>omo podemos notarD la (uncin foo$% en realidadD no
esperaba ning3n argumento# -in embargoD al hacer la llamada
a foo$%D hemos pasado dos argumentos#
G%
Programacin Procedural de Apli caciones 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 elloD disponemos de la (uncin func$get$args7
function foo$% N
$argumentos Q func$get$args'(?
print5r$$argumentos%?
"#
2etornar% &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 disponemos de la (uncin
func$get$arg'index(D donde indexD ser2 el n3mero de ndice
del argumento en la matri@7
function foo2$% N
echo func$get$arg'P(?
"" salida: otro arg&mento
O
foo2$Cargumento 1C3 Cotro argumentoC%?
-aber si una (unci n puede ser ll amada
Ecall ableF
Cuando decimos callable nos
referimos a si la funcin existe y
adems, puede ser llamada.
G/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>uando trabajamos con llamadas de retornoD asumimos Aue
nuestro scriptD desconoce 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 funcion5callale$% N
echo DHlamada correctaD?
O
function llamar5a5funcion5callale$$funcion% N
if$is$calla.le'$funcion(% N
call5user5func$$funcion%?
O else N
echo DHa funciMn no es callaleD?
O
O
llamar5a5funcion5callale$Cfuncion5callaleC%?
"" salida: Llamada correcta
llamar5a5funcion5callale$Cfuncion5inexistenteC%?
"" salida: La 0&nci?n no es calleable
"ateri al de lectura adicional
-obre callBuserB(unc
http7++...#php#net+manual+es+(unction#callLuserL(unc#php
-obre callBuserB(uncBarra&
http7++...#php#net+manual+es+(unction#callLuserL(uncL
arra&#php
-obre (uncBnumBargs
G1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
http7++...#php#net+manual+es+(unction#(uncLnumL
args#php
-obre (uncBgetBargs
http7++...#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 isBcallable Aue solo
comprueba si la (uncin existe o noD pero no 5eri(ica Aue
HstaD pueda ser llamadaF
http7++...#php#net+manual+es+(unction#(unctionL
exists#php
'i(erentes (ormas de recoger
argumentos para hacer una l lamada de
retorno
=eremos aAuD dos (ormas de crear (unciones para hacer
llamadas de retorno Aue reAuieran de argumentos#
,orma $7 recibir argumentos en un arra&
"" 0&nci?n callable
function callale5func51$$arg13 $arg23 $arg2% N
$result Q $$arg1 T $arg2% U $arg2?
return $result?
O
"" 0&nci?n (&e ,ar% la llamada de retorno
function forma51$$funcion3 $argumentosQarra*$%% N
$result Q SRHH?

G6
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
if$is5callale$$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 forma51$Ccallale5func51C3 $args%?
echo $resultado?
,orma 87 recibir argumentos $ a $
"" 0&nci?n callable
function callale5func51$$arg13 $arg23 $arg2% N
$result Q $$arg1 T $arg2% U $arg2?
return $result?
O
"" 0&nci?n (&e ,ar% la llamada de retorno
function forma52$% N
$num5args Q func5num5args$%?
$args Q func5get5args$%?
$result 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 func5get5arg$'%?

"" elimino el nombre de la 0&nci?n de los arg&mentos
arra*5shift$$args%? "" elimino el 6ndice 0

"" )eri0ico (&e sea &na 0&nci?n callable ' la llamo
if$is5callale$$funcion%% N
$result Q call5user5func5arra*$$funcion3 $args%?
O
O

return $result?
O
// implementaciMn
$funcion Q Ccallale5func51C?
$arg1 Q 1'?
$arg2 Q 5?
$arg2 Q 2?
$resultado Q forma52$$funcion3 $arg13 $arg23 $arg2%?
echo $resultado?
GG
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!lamadas recursi 5as
-e denomina llamada recursi5a Eo recursi5idadFD a
aAuellas (unci ones Aue en su algori tmoD 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
iteraciones in(initasD deben extremarse las medidas precauti5as
necesarias & solo utili@arse cuando sea estrictamente necesario
& no exista una (orma alternati5a 5iableD Aue resuel5a el
problemaD e5itando la recursi5idad#
PHP admite las llamadas recursi5asD 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 tomar2 el 5alor de $a de(inido por de(ecto
E'F# Ejecutar2 entonces el ifD se llamar2 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 directamente# !o
GC
Programacin Procedural de Apli caciones 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 Apli caciones 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
DcortoD Q9 Dd/m/XD3
DB"KD Q9 DX-m-dD3
%?

"" inicialiEo la )ariable *0ec,a
$fecha Q SRHH?

"" com+r&ebo (&e *0ormato sea &n 0ormato )%lido
if$arra*56e*5exists$$formato3 $formato5fecha%% N
"" si el 0ormato es )%lido, reasigno el )alor a *0ec,a
$fecha Q date$$formato5fecha]$formato^%?
O

"" retorno la 0ec,a 0ormateada
return $fecha?
O
C$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
*n helper Aue modi(ica una 5ari abl e
globalD haciendo una l lamada de retorno
"#
Llama a la 0&nci?n indicada ' reasigna el )alor de &na )ariable
global, 0ormateado +or la 0&nci?n indicada

9rg&mentos:
*)ariable -- )ariable global a ser modi0icada
*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 +or *0&ncion
#"
function set5variale5gloal$_$variale3 $funcion3 $argumentosQarra*$%% N
"" com+r&ebo (&e *0&ncion sea &na 0&nci?n callable
if$is5callale$$funcion%% N
$variale Q call5user5func5arra*$$funcion3 $argumentos%?
O
O
C8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Tall er de ,unci ones
En este tallerD 5eremos comoD utili@ando buenas
pr2cticas de programacinD nos a&udaremos 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 necesari os 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
PHP dispone de un conjunto de (unciones nati5asD Aue nos
permiten trabajar holgadamente todo el sistema de archi5osD
como si lo manej2remos desde el propio sistema 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 reAuieran manipular tanto archi5os como
directorios#
0ecorrido r2pido por las
pri ncipales (unci ones
'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 modo 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 permiteD
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 Apli caciones 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#
Puntero: lugar del el archivo en el
cual se coloca el cursor al ser aierto.
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 Puntero
r
Lectura Al inicio del arc1i!o
r7
Lectura y escritura Al inicio del arc1i!o
w
Escritura
Si e arc1i!o no e-iste( intenta crearlo. Si e-iste( lo
so%reescri%e.
Al inicio del arc1i!o
w7
Lectura y escritura
Si e arc1i!o no e-iste( intenta crearlo. Si e-iste( lo
so%reescri%e.
Al inicio del arc1i!o(
trunc2ndolo
a
Escritura
Si el arc1i!o no e-iste( intenta crearlo.
Al final del arc1i!o
a7
Lectura y escritura
Si e arc1i!o no e-iste( intenta crearlo.
Al final del arc1i!o
Q
Escritura
"rea un nue!o arc1i!o para escri%ir en 'l. Si el arc1i!o
ya e-iste( falla.
Al inicio del arc1i!o
Q7
Lectura y 3scritura Al inicio del arc1i!o
C/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"rea un nuevo arcivo para escri%ir en 'l y luego poder
leerlo. Si el arc1i!o ya e-iste( falla.
c
Escritura
Si e arc1i!o no e-iste( intenta crearlo.
Al inicio del arc1i!o
c7
Lectura y escritura
Si e arc1i!o no e-iste( intenta crearlo.
Al inicio 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 abrirl o l ocalmenteD deberamos indicar7
)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 necesario#
C1
Programacin Procedural de Apli caciones 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 lectura en modo binario seguroD
fread'(#
*tili@ando la siguiente sintaxis7
fread$$recurso3 $*tes%?
podremos leer el conteni do 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&udarnos de la (uncin filesiGe'-archivo(D donde
$archivoD ser2 la ruta completa al archi5o 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)
Escribi r 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 $contenido5a5escriir]3 $cantidad5de5*tes5a5escriir^%?
El contenidoD puede ser cualAuier 5ariable de tipo stringD
mientras Aue la cantidad de b&tes a escribirD es opcional# -i se
C6
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
indica la canti dad de b&tesD 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 archi 5o
>uando tenemos Aue escribir un archi5oD es mu& 3til saber en
AuH lugar se encuentra 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 con
fseek'-recurso8 -.yte(#
*n contador de 5isitas sencillo
function contador5de5visitas$% N
$archivo Q Dcontador.txtD?
$recurso Q fopen$$archivo3 DrTD%?
$*tes5totales Q filesi@e$$archivo%?
$contador Q fread$$recurso3 $*tes5totales%?
$nuevo5contenido Q $contador T 1?
$posicion5actual Q ftell$$recurso%?
if$$posicion5actual QQ $*tes5totales% N
"" me m&e)o al b'te 0 +ara sobreescribir el arc,i)o
fsee6$$recurso3 '%?
O
fwrite$$recurso3 $nuevo5contenido%?
fclose$$recurso%?

return $nuevo5contenido?
O
CG
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"" 9ct&aliEar el n@mero de )isitas ' mostrarlo
echo contador5de5visitas$%?
M>ui dado con los permi sos;
>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 escrituraD es una puerta Aue se est2 abriendo
hasta para el m2s no5ato de los delincuentes in(orm2ticos Aue
transitan por la red#
!a mejor alternati5aD es tener un directorio )4 -E0=I'4
con permisos de escritura Ees decirD un directorio con permisos
de escrituraD (uera del directorio de publicacin WebF#
En este casoD bastar2 con utili@ar como ruta del archi5oD la ruta
absoluta#
Trabaj ando con di rectori os
>omo hemos comentado antesD PHP permite trabajar el
sistema de archi5osD como podramos 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 primero un recurso Egestor de directorioF# Para
elloD al igual Aue fopen abre un archi5oD tenemos una (uncin
para abrir los directorios#
Tal 5e@D tomando como base lgica el nombre de la (uncin
CC
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
fopen EAue pro5iene de ,ile4penFD estHs esperando una
(uncin llamada do+enD pero lamentablementeD no existe una
(uncin llamada dopenD &a Aue PHPD no tiene estandari@ado el
estilo para nombres de (unciones# A di(erencia de lo Aue
esperamosD para abrir un directorioD la (uncin Aue debemos
utili@arD se denomina opendir#
$recurso Q opendir$Cnomre5del5directorioC%?
>omo nombre de directorioD es posible utili@ar tambiHnD
cualAuier ruta absoluta7
$recurso Q opendir$C/var/www/dominio.com/pulic5html/archivos/pdfC%?
o una ruta relati5a7
$recurso Q opendir$C../archivos/pdfC%?
$otro5recurso Q opendir$Carchivos/pdfC%?
Al igual Aue cuando abrimos un archi5oD cuando abrimos un
directorioD es necesario cerrarlo para liberarlo de memoria7
closedir$$recurso%?
Explorando el contenido de un directori o
Explorar el contenido de un directorioD es sumamente sencilloD
&a Aue disponemos de una (uncin para hacerlo7
readdir'$recurso(# -in embargoD la exploracin de directorios
puede ser complejaD debido a Aue7
readdir no de5uel5e el contenido completo 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
readdir retorna el nombre del elemento Earchi5o o
directorioF pero en caso de errorD 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 retorno#
En sistemas basados en *)ISD todo directorio contiene a
la 5e@ dos subdirectorios ocultos cu&os nombres son .
EpuntoF & .. Edoble puntoFD Aue deben ser 5alidados
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+rimo 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.+,+
..
0iles
.
#"
)tese Aue en el ejemplo anteriorD se est2n listando los dos
directorios ocultos tpicos 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 Apli caciones 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& /./ and -elemento F& /../( *
"" agrego cada elemento en el arra' *contenido
$contenido]^ Q $elemento?
,
O
"" cierro el directorio
closedir$$dir%?
"" im+rimo la salida
print5r$$contenido%?
"# -alida:
9rra'
(
K0L DM index.+,+
K1L DM tem+late.,tml
K2L DM 0&nciones.+,+
K5L DM 0iles
)
#"
,il trando el tipo de el emento
>omo 5imos en el ejemplo anteriorD readdir retorna tanto
archi5os como directorios# Es posible (iltrar el tipo de elementoD
para poder manipularlos de (orma m2s apropiada# Para ello
disponemos de cuatro (unciones mu& 3tiles7
is$dir'-elemento(
)os indica si el elemento e5aluado es un directorio ETrueF
o no E,alseF
is$file'-elemento(
)os indica si el elemento e5aluado es un archi5o ETrueF o
no E,alseF#
$98
Programacin Procedural de Apli caciones 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
simlicos son denominados $accesos
directos%.
filetype'-elemento(
)os retorna el tipo de elemento siendo los 5alores 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 Hxito 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 arra*$%?
$s*mlin6s Q arra*$%?
while$$$elemento Q readdir$$dir%% WQQ &alse% N
if$$elemento 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$$path5elemento%% N
$s*mlin6s]^ Q $elemento?
O
O
O
closedir$$dir%?
$9?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$contenido Q arra*$C7irectoriosC Q9 $directorios3
CPrchivosC Q9 $archivos3
C1nlaces simMlicosC 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 simMlicos^ Q9 Prra*
$
%
%
)tese Aue alternati5amente a las tres (unciones utili@adas en
el ejemplo Eis5fileD is5dir e is5lin6F se podra comprobar
mediante filet*pe$$path5elemento%# -in embargoD la (orma
segura de chec:ear el tipo de elementoD es con las (unciones
usadas en el cdigo anterior#
4tras (unci ones Aue necesi tar2s
con (recuenci a
"uchas 5ecesD ser2 necesario saber si el directorio o archi5os
Aue intentamos abrirD existeD conocer si puede ser ledo &+o
escrito#
Estas acciones ser2n mu& (recuentesD & para resol5er el dilemaD
$9%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
disponemos de las (unciones necesarias#
>omprobar l a exi stenci a de un archi 5o o
di rectori o
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$eQists$$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 existe
$directorio Q Cruta/a/mi/carpetaC?
if$file$eQists$$directorio%% N
echo D1l directorio N$directorioO existeD?
O else N
echo D1l directorio N$directorioO no pudo locali@arseD?
O
>omprobar si un archi 5o o di rectorio es
l egible
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$reada.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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"" a,ora, )eri0icando si &n directorio es legible
$directorio Q Cruta/a/mi/carpetaC?
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 archi 5o o di rectorio
puede escri birse
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 else 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 (unci ones sobre el si stema de
archi 5os
"2s (unciones sobre el sistema de archi5osD pueden
encontrarse en
http7++...#php#net+manual+es+re(#(iles&stem#php
$91
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
En este captuloD 5eremos las principales (unciones & (ormas
b2sicasD de procesar texto & manipular strings en PHPD las
cuales ser2n la base (undamental de las expresiones &
algoritmos integrantes de todo sitio Web & aplicacin#
Ampliando la de(ini ci n de
5ariabl es de tipo string
>omo hemos 5isto anteriormenteD una cadena de texto en PHPD
puede encerrarse tanto entre comi llas simples como entre
comi llas dobles7
$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 extensinD mediante heredoc Edel inglHs Nhere
documentO L documento aAuFD tpica de una gran parte de
lenguajes de programacin & shells de -istemas 4perati5os
basados *)ISD cu&a sintaxis es7
$variale Q !!!CD>35C6CB?D%
contenido de heredoc
CD>35C6CB?D%+
'onde B71S-B&B)P7K8D podr2 ser cualAuier nombre Aue
respete las reglas para nombres de 5ariables & el identi(icador
de cierreD no podr2 estar sangrado#
=eamos un ejemplo7
$96
Programacin Procedural de Apli caciones 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 dee
contener ningbn caracter3 excepto posilemente un punto * coma $?%. 1sto
significa en particular ;ue el identificador no dee usar sangr<a3 * ;ue no
deen existir ningbn espacio ni taulaciMn antes o despuZs del punto * coma.
1s mu* importante darse cuenta ;ue el primer caracter antes del identificador
de cierre dee ser un salto de l<nea definida por el sistema operativo local.
1n los sistemas RSBF ser<a Yn3 al igual ;ue en Gac K" F. 1l delimitador de
cierre $posilemente seguido de un punto * coma% tamiZn dee ser seguido 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 * #.# continuar= uscando uno.
"i no se encuentra ningbn identificador de cierre antes del final 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 extensiones#
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 comillas doblesD se
desea imprimir el literal de comillas dobles#
Hacer esto7
$var Q DHas comillas doles $D% deen escaparseD?
generar2 un errorD puesto Aue PHP considerar2 el (inal de la
cadena de texto en la segunda comilla doble7
$var Q DHas comillas doles $D
& encontrar2 un error de sintaxis a continuacin7
% deen escaparseD?
$9G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Para solucionar este problemaD ciertos caracteres deben
escaparseD mediante el uso de una barra diagonal
in5ertida S
$var Q DHas comillas doles $S/% deen escaparseD?
>aracteres de escape
Algunos caracteres de escape pueden representarse como se
muestra en la siguiente table7
!aracter "i#ni$icado
\n
a!ance de l4nea (L5 o 6-6A (76) en AS"&&)
\r
retorno de carro ("R o 6-6D (78) en AS"&&)
\t
ta%ulador 1ori9ontal (:; o 6-6< (<) en AS"&&)
\v
ta%ulador !ertical (=; o 6-6> (77) en AS"&&) (desde : ?.@.?)
\e
escape (3S" o 6-7> (@A) en AS"&&) (desde : ?.B.6)
\f
a!ance de p2gina (55 o 6-6" (7@) en AS"&&) (desde : ?.@.?)
\\
%arra in!ertida
\$
signo del dlar
\"
comillas do%les
S=
"omilla simple
S*-var,
&mprimir las lla!es alrededor del contenido de #!ar
$a Q ".ola Gundo"?
$ Q "Xo digo YN$aO"?
echo $? // salida: Xo digo N.ola GundoO
$9C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
,unci ones para mani pul acin 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 5isita el
manual o(icial en http7++...#php#net+manual+es+re(#strings#php
,unci ones 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 HTTP P4-T#
Kuotemeta'-cadena( escapa una cadena de texto aPadiendo
barras in5ertidas a los siguientes caracteres7 . S 7 9 " ; T <
' - (
$doc Q D"i se reali@a el c=lculo $15U2%T]$12T5%U$!.2T'.!5%^ otendremos el
importe 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 cadena espadaD mediante
stripslashes'-cadena(
$doc Q D"i se reali@a el c=lculo $15U2%T]$12T5%U$!.2T'.!5%^ otendremos el
importe en $D?
$$9
Programacin Procedural de Apli caciones 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)TOTKT(12TO5T)T#T(4T.5TO0T.45T)TL obtendremos
el im+orte en T*
#"
echo stripslashes$$doc%?
"#
-alida:
-i se realiEa el c%lc&lo (15#2)OK(12O5)#(4.5O0.45)L obtendremos el im+orte en
*
#"
,unci ones de con5ersin
htmlentities'-cadena( con5ierte los caracteres aplicables a
entidades HT"!#
&sta funcin dee utilizarse siempre
que una cadena de texto dea ser
impresa en un documento '()L y se
desconozca su contenido, para
prevenir que cdigo fuente no deseado,
sea e*ecutado.
$cadena Q DHas negritas se escrien entre los tags :9 * :/9 mientras ;ue el
salto de linea se representa con :r/9D?
$cadena Q htmlentities$$cadena%?
echo $cadena?
"#
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 escrien entre los tags _lt?_gt? * _lt?/_gt?
mientras ;ue el salto de linea se representa con _lt?r/_gt?D?
$cadena Q html$entity$decode$$cadena%?
echo $cadena?
"#
$$$
Programacin Procedural de Apli caciones 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
linea se re+resenta con Vbr"M
#"
>uando solo se deseen con5ertir a entidades HT"!D caracteres
especiales tales como 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
(uncin 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
languageQC>avascriptC9alert$CholaC%?:/script9
:Aphp
echo $caracteres5permitidos?
A9D?
$resultado Q strip5tags$$cadena3 $caracteres5permitidos%?
echo $resultado?
"" salida: /ola VbM>&ndoV"bMalert(W,olaW)P
Eliminar espacios en blancoD tambiHn es posible#
'isponemos de tres (unciones prede(inidas7
ltrim'-cadena(7 Elimina los espacios en blanco del inicio de la
cadena
rtrim'-cadena(7 los elimina del (inal de la cadena
trim'cadena(7 los elimina del inicio & (inal de la cadena
$$8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
,unci ones de (ormato
!a (uncin nl2.r'-cadena( nos permite con5ertir saltos de
l nea en su representacin HT"! E:r /9F7
$cadena Q D1sto es
una cadena
de textoD?
$resultado Q nl2.r$$cadena%?
echo $resultado?
"#
salida:
Bsto esVbr "M
&na cadena Vbr "M
de texto
#"
$cadena Q D1sto esYnuna 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@ando la (uncin wordwrap'-cadena3
$ancho3 $salto5de5linea3 $no5cortar5palaras(#
Esta (uncinD recibir2 $ par2metro obligatorio E`cadenaF & tres
par2metros opcionales7
-ancho cantidad de caracteres
-salto$de$linea el car2cter o patrn Aue se utili@ar2 para
crear el salto de lnea# Ejemplo7 Yn o :r/9#
-no$cortar$pala.ras si se establece 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
euripidis in3 eum lier hendrerit an. cui ut wisi vocius suscipiantur3 ;uo
dicit ridens inciderint id. cuo mundi loortis reformidans eu3 legimus
senserit definieas an eos. 1u sit tincidunt incorrupte definitionem3 vis
mutat affert percipit cu3 eirmod consectetuer signiferum;ue eu per. Bn usu
$$?
Programacin Procedural de Apli caciones 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 inciderint 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 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.
#"
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'-cadena(7
$usuario Q DPn/gieD?
echo strtolower$$usuario%? "" anggie
echo lcfirst$$usuario%? "" an$gie
Pero tambiHn podemos Auerer con5erti r toda una cadena a
ma&3sculas con strtoupper'-cadena(D con5erti r sol o el
primer car2cter de la cadena ucfirst'-cadena( o
con5ertir el primer car2cter de cada palabra
ucwords'-cadena(7
$cadena Q Dhola mundoD?
echo strtoupper$$cadena%? "" /JL9 >!;J
echo ucfirst$$cadena%? "" /ola m&ndo
echo ucwords$$cadena%? "" /ola >&ndo
*n ejemplo pr2ctico de con5ersin de ma&3sculas &
min3sculas7
$nomre5*5apellido Q DPnggie Hope@D?
$$%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$username Q strtolower$$nomre5*5apellido%?
$nomre5visile Q ucwords$$username%?
'ar a una cadenaD (ormato de monedaD 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?
$neto 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 $ruto5txt . 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 salida de los datos con el smbolo monetario
correspondiente al idioma & pas#
Para comprender mejor los posibles patrones de (ormato Aue
pueden ser utili@ados con mone*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 preciso (ormatear un 5alor numHricoD estableciendo
decimales & separadores de decimales & miles# >ontamos para
$$/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
ello con la (uncin num.er$format$$numero3 $decimales3
$separador5decimales3 $separador5miles% Aue retorna el
n3mero (ormateado como cadena de texto7
$precio Q 12!,4.!+2?
$precio5txt Q numer5format$$precio3 23 C3C3 C.C%?
echo $precio5txt? "" 12.4AQ,4H
,unci ones de manipul acin
"uchas 5ecesD puede ser mu& 3tilD manipular una cadena de
textoD de (orma talD Aue nos permite operar con di(erentes
datos# Por ejemploD es posible di5idir una cadena de textoD
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&Zmail.comM
-il)ina ;Wlaggio VdlaggioZmail.comM
#"
Podemos contar la cantidad de caracteres de una cadena
de textoD mediante la (uncin strlen'-cadena(7
$mensa>e Q DHorem ipsum ad his scripta landit partiendo3 eum fastidii
accumsan euripidis in3 eum lier hendrerit an. cui ut wisi vocius
suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi loortis reformidans
$$1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
eu3 legimus senserit definieas an eos. 1u sit tincidunt incorrupte
definitionem3 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 placerat per. Bus id vidit volumus mandamus3 vide veritus
democritum te nec3 ei eos deet liris 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 voluptua elo;uentiam pro3 ad sit ;uas
;ualis;ue. 1os vocius deserunt ;uaestio ei. D?
-caracteres & strlen'-mensa@e(+
if$$caracteres 9 1!'% N
echo D-u mensa>e es demasiado largo. "olo se admiten 1!' caracteres.D?
O
>ontar la cantidad de palabras en una cadena de textoD e
inclusoD iterar sobre cada palabraD puede ser algo realmente
3til# !a (uncin str$word$count'-cadena8 -formato( nos
a&udar2 a hacerlo7
$nomre5*5apellido Q D[uan #.D?
$datos Q str$word$count$$nomre5*5apellido3 1%?
if$count$$datos% : 2% N
echo DN$nomre5*5apellidoO no es un nomre * apellido v=lidoD?
O else N
foreach$$datos as $dato% N
if$strlen$$dato% : 2% N
echo D#or favor3 no utilices iniciales.D?
O
O
O
4tra (uncin Aue podremos utili@ar mu& a menudoD es
str$replace'-.usKueda8 -reemplaGo8 -cadena( Aue nos
permite buscar un determinado car2cter o patrn &
reempla@arl o por el indicado7
$email Q D>uanpere@@dominio.comD?
$mail5no5spam Q str5replace$D@D3 D ]P-^ D3 $email%?
echo $mail5no5spam? "" :&an+ereE K91L dominio.com
Esta (uncinD admite como par2metros de b3sAueda &
$$6
Programacin Procedural de Apli caciones 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 $email%?
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? "" ale: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
cedana7
$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 utili@arse stripos$$cadena3 $patron%#
Es importante tener en cuentaD Aue tanto strpos como striposD
$$G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
retornar2n ,alse cuando el patrn de b3sAueda no sea
encontrado# Por la tantoD toda 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
# INCORRECTO
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 dentro 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 euripidis in3 eum lier hendrerit an. cui ut wisi vocius
suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi loortis reformidans
eu3 legimus senserit definieas an eos. 1u sit tincidunt incorrupte
definitionem3 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 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
*n ejemplo un poco m2s complejoD puede darse con el uso
combinado de 5arias (unciones7
$patron Q DdicitD?
$inicio5patron Q stripos$$cadena3 $patron%?
if$$inicio5patron WQQ &alse% N
echo sustr$$cadena3 $inicio5patron3 strlen$$cadena%%?
O
"#
dicit ridens inciderint 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 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 euripidis in3 eum lier hendrerit an. cui ut wisi vocius
suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi loortis reformidans
eu3 legimus senserit definieas an eos. 1u sit tincidunt incorrupte
definitionem3 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 placerat per.D?
$patron Q DutD?
$apariciones Q su.str$count$$cadena3 $patron%?
echo $apariciones? "" 5
Es posible tambiHnD reempla@ar una subcadena dentro de una
cadena con su.str$replace'-cadena8 -reemplaGo8
-inicio8 -longitud(7
$cadena Q DP*er recorr< las calles de Hiniers con mi primoD?
$patron Q Dlas calles de HiniersD?
$ini Q stripos$$cadena3 $patron%?
$nueva5cadena Q su.str$replace$$cadena3 Dlos alrededores de IelgranoD3
$ini3 strlen$$patron%%?
$89
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
echo $nueva5cadena?
"" 9'er recorr6 los alrededores de Nelgrano con mi +rimo
,unci ones de encriptaci n
Podemos obtener el hash "'/ con la (uncin md5'-cadena(7
$clave Q Dpepe5grillo-1251!D?
$hash5clave Q md5$$clave%?
echo $hash5clave? "" H1A02eA502=1ba=d0Ab5=aQ0e105Q241
A'=E0TE)>IA
)unca util ices con5ersores "'/ online# Estos
con5ersoresD suelen almacenar 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 uti li@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 5ari os (ormatos#
!os posibles algoritmos de ci(radoD pueden obtenerse con
la (uncin hash$algos'( la cual retorna un arra& con todos los
algoritmos disponibles7
$8$
Programacin Procedural de Apli caciones 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 shaP
]!^ Q9 sha22!
]5^ Q9 sha25(
](^ Q9 sha24!
],^ Q9 sha5P2
]4^ Q9 ripemd124
]+^ Q9 ripemd1('
]1'^ Q9 ripemd25(
]11^ Q9 ripemd22'
]12^ Q9 whirlpool
]12^ Q9 tiger12432
]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 adler22
]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 haval22!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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
foreach$hash5algos$% as $hash% N
$hash5clave Q hash'-hash8 -clave(+
$hashes]$hash^ Q $hash5clave?
O
$8?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
0esumen de las pri ncipales
(unci ones de stri ng
Tipo de $uncin %uncin Descripcin
Escape
addslashes
3scapa una cadena aCadiendo %arras in!ertidas a
e C Y y %ytes nulos
Kuotemeta
ACade %arras in!ertidas delante de . Y T U A ]
f ^ $ $ %
stripslashes
3limina las %arras in!ertidas de una cadena
escapada
!onversin
htmlentities "on!ierte los caracteres a entidades :;ML
html$entity$decode &n!ersa a htmlentities
htmlspecialchars
"on!ierte a entidades :;ML los siguientes
caracteresD _ D C : 9
htmlspecialchars$dec
ode
&n!ersa a htmlspecialchars
strip$tags 3limina todos los tags :;ML y :
ltrim
3limina espacios en %lanco del comien9o de la
cadena
rtrim 3limina espacios en %lanco del final de la cadena
trim
3limina espacios en %lanco del comien9o y final de
la cadena
%ormato
nl2.r "on!ierte saltos de l4nea en su e,ui!alente :;ML
wordwrap AEusta el anc1o de caracteres de una cadena
strtolower "on!ierte toda la cadena a minFsculas
lcfirst
"on!ierte a minFscula el primer carater de una
cadena
strtoupper "on!ierte toda la cadena a mayFsculas
ucfirst
"on!ierte el primer car2cter de una cadena a
mayFscula
ucwords
"on!ierte el primer car2cter de cada pala%ra de
una cadena a mayFsculas
money$format
5ormatea un nFmero con el s4m%olo de moneda
correspondiente
num.er$format
5ormate un nFmero con el separdor de miles y
decimales correspondiente

$8%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Manipulacin
>Qplode Di!ide una cadena generando un array
strlen Retorna la longitud de una cadena
str$word$count "uenta la cantidad de pala%ras
str$replace
str$ireplace
Reempla9a iterati!amente un patrn
strpos
stripos
Retorna la posicin del patrn %uscado en una
cadena
su.str Retorna una porcin de la cadena
su.str$count
Retorna la cantidad de apariciones de un patrn
en la cadena
su.str$replace
su.str$ireplace
Reempla9a iterati!amente una porcin de la
cadena
!i$rado
md5 Retorna el 1as1 MD? de una cadena
hash
Retorna el 1as1 de una cadena( cifrado con el
algoritmo indicado
$8/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Taller de Archi5os &
Procesamiento de
,ormul arios
En este tallerD crearemos un libro de 5isitas basado en el
sistema de archi5os Esin 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++tallerLdeLphp#eugeniabahit#com+tallerLdeLarchi5osL
&L.eb(orms#tar#g@
$81
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'urante el tallerD hemos introducido cuatro nue5os conceptosD
de los cualesD trataremos aAuD dos de ellos7 constantes &
5ariables 5ariables#
Para el procesamiento del (ormularioD tambiHn hemos utili@ado
la 5ariable supergl obal -$P%25 de PHP & hablaremos de ello#
>onstantes
PHPD a di(erencia de otros lenguajesD introduce el concepto de
constante# *na constanteD 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 simples EaunAue estoD es un punto
discutibleF como una cadena de textoD un enteroD un
(lotanteD etc#
*na 5e@ de(inidos no pueden modi(icarse#
'e(i ni cin cl 2sica 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
define$C#8K7R)-KC3 C"hort de aao para niaoC%?
define$C.PX5"-K)gC3 &alse%?
Por con5encinD el nombre de las constantes se de(ine
en letras ma&3sculas# )o obstanteD aplican las reglas de
nombre para la de(inicin de 5ariables#
Este tipo de constanteD puede de(inirse en cualAuier
2mbito de la aplicaci nD &a sea dentro de una (uncin como
(uera de ella#
Para llamar a una constanteD simplemente se hace
re(erencia a ellaD por el nombre7
echo #81)BK? // imprime 25.,4
Este tipo de constantesD admiten como 5alorD cualAuier tipo
de dato simpleD inclusoD una 5ariable7
$nomre Q strip5tags$$5/1-]Cnomre^%?
define$CSKGI81C3 $nomre%?
'e(i ni cin de constantes en PHP /#?
'esde la 5ersin /#? de PHPD se introdujo el uso de la
palabra cla5e const para de(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 constante7
$8G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
-olo pueden declararse en el 2mbito gl obal de la
aplicacinV
Admiten cualAuier tipo de dato simpleD pero no admiten
5ariablesV
El 5alor de estas constantesD no puede (ormarse
din2micamente Ees NconstanteO en todo sentidoFV
)o pueden ser redeclaradasV
,inali dad de las constantes
-i bien en los ejemplos anterioresD hemos utili@ado un precio &
producto para demostrar como de(inir constantesD la (inalidad
de HstasD debe ser de(inir datos no 5ariables inherentes
al n3cleo de una aplicacin# Para 5er un uso pr2ctico &
precisoD re(erirse al taller de archi5os & .eb (orms#
$8C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
=ariabl es 5ari ables
!eer la (rase N5ariables 5ariablesO no solo parece redundanteD
sino adem2sD inexacto & 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 (icar sus
nombre7
$nomre5de5variale Q CprecioC?
$$nomre5de5variale Q 25.,4?
echo $nomre5de5variale? "" im+rime +recio
echo $$nomre5de5variale? "" im+rime 25.AQ
Esto signi(icaD Aue el nombre de la 5ariable Aue almacena el
5alor 8/#6G ser2 NprecioO# Es decirD Aue estamos creando una
5ariableD cu&o nombre es din2mico & por tantoD desconocemosD
pero podemos acceder a ellaD &a Aue el nombre otorgadoD es el
5alor de otra 5ariable7
$a Q Dmi5varialeD?
$$a Q ,5?
echo D1l nomre de Y$Y$a es Y$N$aOD?
"" salida: Bl nombre de **a es *mi_)ariable

$?9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
=ariabl es supergl obal es
>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 globalesD tambiHn podemos
encontrar 5ariables superglobales#
Estas 5ariables superglobalesD suelen ser arra&s asociati5os
desde los cuales PHPD de (orma nati5aD nos (acilita su acceso
desde cualAuier parte de la aplicaci n sin necesidad de
utili@ar la palabra cla5e gloalD &a Aue son 5ariables internas#
A lo largo del cursoD hemos utili@ado dos 5ariables
superglobales7
-$J>5 *n arra& asociati5o tipo cla5e aX 5alorD de los
par2metros pasados al script mediante el mHtodo HTTP ETD es
decirD par2metros pasados por *0!#
-$P%25 Al igual Aue el anteriorD es un arra& asociati5o (ormado
por cla5e aX 5alorD pero Aue almacena los datos pasados al
scriptD mediante el mHtodo HTTP P4-TD generalmenteD 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 5ariable 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
81cR1"-5R8B Aue nos de5uel5e la *0I completa Aue se utili@
para acceder al scriptD entre otros#
$metodo Q -$2>U>;=>V1>25$L>5H%D=<?
$uri Q -$2>U>;=>V1>25$1C=<?
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"18J18]C.--#5)P).15)KS-8KHC^ Q max-ageQ'
-$2>U>;=H55P$12>$?J>35=< Q Go@illa/5.' $F11? Hinux i(4(% PppleEegit/525.11
$g.-GH3 li6e /ec6o% )hrome/1,.'.+(2.,+ "afari/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"18J185P7GBSC^ Q wemaster@localhost
-$2>U>;=2BCP5$6C4>3?L>=< Q /var/www/euge/file.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>;=V1>N$25C3J=< Q parametroQvalor
-$2>U>;=>V1>25$1C=< Q /euge/file.phpAparametroQvalor
$5"18J18]C")8B#-5SPG1C^ Q /euge/file.php
$5"18J18]C#.#5"1H&C^ Q /euge/file.php
$5"18J18]C81cR1"-5-BG1C^ Q 1221,,2!'1
"2s in(ormacin sobre la superglobal $5"18J18 puede
obtenerse en7
http7++...#php#net+manual+es+reser5ed#5ariables#ser5er#php#
$?8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
PHPD dispone de una (uncin llamada mail'( Aue permite
en5iar correos electrnicos tanto en texto plano como HT"!D a
tra5Hs del ser5idor WebD utili@ando la librera sendmail
EgeneralmenteD instalada por de(ectoF#
!a (unci n 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 pruea de env<o.D?
mail'-destinatario8 -asunto8 -mensa@e(+
El par2metro Ndesti natarioO7 (ormatos
admitidos
!a (uncin mail$% admite como destinatarioD una o m2s
direcciones de correo electrnicoD debiando mantener alguno
de los siguientes (ormatos7
Wnico destinatari o7
user@mail.com
=arios destinatarios7
user2@mail.com3 user2@mail.com3 user5@mail.com
$??
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'estinatario con nombre e eLmai l7
[uan #Zre@ :mail@dominio.com9
=arios destinatarios con nombre e eLmail7
[uan #Zre@ :mail@dominio.com93 Pna /Mme@ :mail2@dominio.com9
R l gicamenteD cualAuier combinacin de las
anteriores7
user2@mail.com3 Pna /Mme@ :mail2@dominio.com9
>abeceras adi ci onal es como par2metro
extra
AdicionalmenteD pueden sumarse a la (uncin mail$%
cabeceras adicionales a ser en5iadas# Estas cabecerasD pueden
utili@arse para agregar destinatarios con cocopiaD 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 pruea de env<o.D?
$caeceras5adicionales Q D6rom: Pna Gar<a HMpe@ :anita@mail.com9YrYnD?
$caeceras5adicionales .Q Deply-to0 8oc<o Brao :rocio@mail.com9YrYnD?
$caeceras5adicionales . DBc0 Priel 7omingo :ariel@mail.com9YrYnD?
$caeceras5adicionales .Q DRcc0 "upervisor :admin@mail.com9YrYnD?
mail$$destinatario3 $asunto3 $mensa>e3 -ca.eceras$adicionales%?
>omprobando Aue el eLmail pudo
en5iarse
!a (uncin mail$% retornar2 51> cuando el en5o del mensaje
ha&a podido concretarse# 'e lo contrarioD retornar2 6?42>7
$?%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
if'mail$$destinatario3 $asunto3 $mensa>e3 $caeceras%( N
echo D1l e-mail se ha enviado 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 (unci n en en5os
masi5os#
$?/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
En5i ando mensajes en (ormato
HT"!
Para poder en5iar un mensaje con (ormato HT"! desde PHPD
solo ser2 necesarioD agregar 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 li.er hendrerit an. Vui ut wisi voci.us suscipiantur8 !.#Kuo dicit
ridens inciderint id!).#. Vuo mundi lo.ortis reformidans eu8 legimus senserit
definie.as an eos. >u sit tincidunt incorrupte definitionem8 vis mutat affert
percipit cu8 eirmod consectetuer signiferumKue eu per. Cn usu latine eKuidem
dolores. Vuo no falli viris intellegam8 ut fugit veritus placerat per.!)p#/+
-ca.eceras$adicionales & /LCL>-Uersion0 P.:SrSn/+
-ca.eceras$adicionales .& /Bontent-type0 teQt)html+ charset&utf-WSrSn/+
$caeceras5adicionales .Q D&rom: Pna Gar<a HMpe@ :anita@mail.com9YrYnD?
$caeceras5adicionales .Q D8epl*-to: 8oc<o Brao :rocio@mail.com9YrYnD?
$caeceras5adicionales .Q D)c: Priel 7omingo :ariel@mail.com9YrYnD?
$caeceras5adicionales .Q DIcc: "upervisor :admin@mail.com9YrYnD?
if$mail$$destinatario3 $asunto3 $mensa>e3 $caeceras5adicionales%% N
echo D1l e-mail 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 contenido almacenado en una 5ariable# Por
lo tantoD puede utili@arse un sistema de plantillas HT"!D con
file5get5contents$%D (ormatearse & manipularse el
contenido e inclusoD reempla@ar datos din2micamente a
tra5Hs de un (ormulario#
$?1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!a librera de (unciones para la manipulacin de (echas & horas
de PHPD es lo su(icientemente ampliaD para permitirnos un
control absoluto en el manejo de las mismas#
=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 5isitando la
documentacin o(icial en
http7++nc#php#net+manual+es+re(#datetime#php
,unci ones simples de (echa &
hora
4btener l a (echa & hora actual en un
arra& asoci ati 5o
getdate'( es la (uncin indicada para obtener la in(ormacin
relati5a a la (echa & hora 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 Apli caciones 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 Descripcin Ejemplo de valores devueltos
seconds
Representacion num'rica de los
segundos
0 a 59
minutes
Representacion num'rica de los minutos 0 a 59
hours
Representacion num'rica de las 1oras 0 a 23
mday
Representacion num'rica del d4a del
mes
1 a 31
wday
Representacion num'rica del d4a de la
semana
0 (para Domingo) 1asta 6 (para
S2%ado)
mon
Representacion num'rica de un mes 1 1asta 12
year
Una representacion num'rica completa
de una aCo( B d4gitos
3EemplosD 1999 o 2003
yday
Representacion num'rica del d4a del
aCo
0 1asta 365
weekday
Una representacin te-tual completa del
d4a de la semana
Sunday 1asta Saturday
month
Una representacin te-tual completa de
un mes( como Ganuary o Marc1
January 1asta December
:
Los segundos desde la Hpoca Uni-
Dependiente del Sistema(
t4picamente -2147483648 1asta
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 datos relacionados a la (echa &
hora actualD con un (ormato espec(ico# Este (ormatoD 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
return5alues
$?G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
'entro del par2metro tipo stringD algunos de los (ormatos
combinables de los cuales disponemosD son los siguientes7
!ar&cter de
formato
Descripcin
Ejemplo de valores
devueltos
Da
d D4a del mes( @ d4gitos con ceros iniciales 01 a 31
D Una representacin te-tual de un d4a( tres letras Mon 1asta Sun
j D4a del mes sin ceros iniciales 1 a 31
l (ILI
minFscula)
Una representacin te-tual completa del d4a de la
semana
Sunday 1asta Saturday
N
Representacin num'rica &SOJKL67 del d4a de la
semana (aCadido en : ?.7.6)
1 (para lunes) 1asta7 (para
domingo)
Representacin num'rica del d4a de la semana
0 (para domingo)
1asta 6 (para s2%ado)
! 3l d4a del aCo (comen9ando por 6) 0 1asta 365
Semana
"
NFmero de la semana del aCo &SOJKL67( las
semanas comien9an en lunes (aCadido en :
B.7.6)
3EemploD 42 (la B@M semana
del aCo)
Me#
$
Una representacin te-tual completa de un mes(
como Ganuary o Marc1
January 1asta December
m
Representacin num'rica de una mes( con ceros
iniciales
01 1asta 12
M
Una representacin te-tual corta de un mes( tres
letras
Jan 1asta Dec
n
Representacin num'rica de un mes( sin ceros
iniciales
1 1asta 12
t NFmero de d4as del mes dado 28 1asta 31
%&o
' Si es un aCo %isiesto 1 si es %isiesto( 0 si no.
(
Una representacin num'rica completa de un aCo(
B d4gitos
3EemplosD 1999 o2003
y Una representacin de dos d4gitos de un aCo 3EemplosD 99 o 03
)ora
a Ante meridiem y ost meridiem en minFsculas am o *m
% Ante meridiem y ost meridiem en mayFsculas %M o +M
,
5ormato de 7@ 1oras de una 1ora sin ceros
iniciales
1 1asta 12
-
5ormato de @B 1oras de una 1ora sin ceros
iniciales
0 1asta 23
$?C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!ar&cter de
formato
Descripcin
Ejemplo de valores
devueltos
.
5ormato de 7@ 1oras de una 1ora con ceros
iniciales
01 1asta 12
)
5ormato de @B 1oras de una 1ora con ceros
iniciales
00 1asta 23
/ Minutos( con ceros iniciales 00 1asta 59
# Segundos( con ceros iniciales 00 1asta 59
0ona )orar/a
e
&dentificador de 9ona 1oraria (aCadido en :
?.7.6)
3EemplosD 234( -M3(%tlant
/c5%!ore#
6 (i
mayFscula)
Si la fec1a est2 en 1orario de !erano o no
1 si est2 en 1orario de
!erano( 0 si no.
7
Diferencia de la 1ora de NreenOic1 (NM;) en
1oras
3EemploD 80200
+
Diferencia con la 1ora de NreenOic1 (NM;) con
dos puntos entre 1oras y minutos (aCadido en :
?.7.8)
3EemploD 802900
3 A%re!iatura de la 9ona 1oraria 3EemplosD :S3( MD3...
0
Pndice de la 9ona 1oraria en segundos. 3l 4ndice
para 9onas 1orarias al oeste de U;" siempre es
negati!o( y para a,uellas al este de U;" es
siempre positi!o.
-43200 1asta 50400
$ec.a5)ora 4om*leta
c 5ec1a &SO KL67 (aCadido en : ?) @66BJ6@J7@;7?D7<D@7Q66D66
r 5ec1a con formato R R5" @K@@
3EemploD 3.u; 21 Dec 2000
16901907 80200
2
Segundos desde la Hpoca Uni- (7 de 3nero del
7<A6 66D66D66 NM;)
Alternati5amenteD es posible pasar como par2metro a date$%
una constante de (ormato prede(ini da7
echo date$7P-158""%?
"" 1,&, 15 >ar 2012 1Q:1=:21 -0500
*na lista completa de las constantes de (ormato
prede(ini dasD puede obtenerse en
http7++nc#php#net+manual+es+class#datetime#phpYdatetime#constan
ts#t&pes
A=I-4
$%9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
)tese Aue la hora tambiHn puede obtenerseD en (ormato
hora *)ISD con la (uncin time'(7
http7++nc#php#net+manual+es+(unction#time#php
=al idar una (echa
Podemos 5alidar la 5eracidad de una (echaD mediante el uso de
la (uncin checkdate'-mes8 -dia8 -aXo( teniendo en cuenta
Aue retornar2 51> 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
>2lcul o de (echa + hora senci l lo
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)ale 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 (maSana)
#"
!o anteriorD es posible gracias a Aue la (uncin date'( puede
recibir opcionalmente como par2metroD una marca de tiempo
$%$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
tipo *)IS EtimestampF# >uando la marca de tiempo no es
pasada como par2metroD date$% 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 mediante otra marca de tiempoD
ser2 posible obtener el timestamp deseadoD Aue permitir2 ser
(ormateado con date$%#
php # echo 1 U 2! U (' U (' ?
4(!''
php # echo time$%?
12214!,42,
php # $a Q 12214!,42, T 4(!''?
php # echo $a?
1221+2!22,
php # echo date$CX-m-dC3 $a%?
2'12-'2-1(

4tra (orma de obtener la marca de tiempo de una (echa
determinada es con la (uncin mktime'(7
php # echo m6time$%?
12214!42((
-i m6time$% no recibe par2metrosD retornar2 la marca de
tiempo de la (echa & hora actual# 'e lo contrarioD deber2 recibir
los par2metros correspondientes a horaD minutoD segundoD
mesD da & aPo#
echo mktime':8 :8 :8 P28 258 2:PP(+
"" obtiene la marca de tiem+o del 25 de diciembre de 2011
Por lo tantoD podramos reali@ar c2lculosD utili@ando m6time$%
como se muestra a continuacin7
$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 Apli caciones 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#
Ejempl os pr2cticos de c2l culos
basados en (echas
I>u2nto ti empo ha pasadoJ
Problema7
El $/ de mar@o de 89$$D )atalia le coment a su madreD Aue
comen@ara a ahorrar dinero para comprar un nue5o ordenador
& Aue a tal (inD todos los das guardara en una caja de @apatosD
`8D6/# I>u2nto dinero habr2 ahorrado )atalia a la (echa de
ho&J
-oluci n7
"" 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
$dinero 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 Apli caciones 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
-oluci n7
"" obtengo la marca de tiem+o de la 0ec,a de nacimiento
$fecha5nacimiento Q m6time$'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
-oluci n7
"" 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
$proale5mas5antigua Q date$Cd/m/C% . $$anio-1%?
"" +robable 0ec,a de nacimiento m%s reciente
$%%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$proale5mas5reciente Q date$Cd/m/C% . $anio?
echo !!!>%5
Huciana tiene ;ue haer nacido despuZs del -pro.a.le$mas$antigua * antes
o durante el -pro.a.le$mas$reciente .
>%5+
$%/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
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
con5irtiHndose en (unciones de uso (recuente para
nuestros programas# =eremos las mismas a continuacin#
4btener un n3mero ele5ado a la
potenci a
pow$$ase3 $potencia%
echo pow$23 2%? "" Q
echo pow$53 2%? "" 25
4btener el n3mero m2s al to & el
n3mero m2s bajo
maQ$$valores% - min$$valores%
$precios Q arra*$12.,53 !2.+'3 1'(.('3 +3 25.45%?
$producto5mas5caro Q max$$precios%? "" 10=.=
$producto5mas5arato 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
0edondear un n3mero con )
canti dad 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 haci a
abaj o
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 haci a
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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
4btener un n3mero entero
al eatori o
rand$$numero5minimo3 $numero5maximo%
$password Q rand$1+++++3 ++++++%? "" 15Q055
En captulos anterioresD cuando hablamos sobre arra&sD
pudimos 5er 5arias (unciones 3tiles para manejar estos tipos
m2s complejos# A lo largo de los talleres & ejercicios 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 detallada# )o obstanteD una lista
completa puede obtenerse en
http7++...#php#net+manual+es+re(#arra&#php
'i5iendo & uni endo arra&s
'i5idi r un arra& en matri ces m2s
peAuePas
array$chunk$$arra*3 $tamaao]3 oolean
$conservar5claves^%
)tese Aue el tercer argumento es opcional# Por de(ectoD
arra*5chun6D crear2 nue5as cla5es en los nue5os arra&# Pero si
se indica -8R1D conser5er2 estas cla5es#
$%G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3
C8aulC3 C1steanC3 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'
(
K0L DM Bliseo
K1L DM 2osa
K2L DM oelia
)
K2L DM 9rra'
(
K0L DM 2a&l
K1L DM Bsteban
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 C1steanC3 C7iegoC%?
$grupos Q arra*5chun6$$personas3 2%?
foreach$$grupos as $numeroQ9$grupo% N
$nomre5arra* Q Dgrupo5N$numeroOD?
$$nomre5arra* Q $grupo?
O
,inalmenteD obtendramos ? nue5os arra&sD llamados $grupo5'D
$grupo51 & $grupo52D respecti5amente#
$%C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
4btener l a porci n espec(ica de un
arra&
array$slice$$arra*3 $desde]3 $hasta^%
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3
C8aulC3 C1steanC3 C7iegoC%?
$primeras525personas Q arra*5slice$$personas3 '3 2%?
print5r$$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 util i@ando uno para
l as cla5es & otro para los 5al ores
array$com.ine$$arra*5claves3 $arra*5valores%
$comodines Q arra*$CN-B-RHKOC3 CN"RI-B-RHKOC%?
$valores Q arra*$CGanual de #.#C3 C-raa>ando con arra*sC%?
$datos Q arra*5comine$$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 Apli caciones 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)eciliaC3 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
mul tidimensionales de manera recursi5a
array$merge$recursive$$arra*513 $arra*52]3
$mas5arra*s^%
$persona5a Q arra*$CSomreCQ9C1liseoC3 C1dadCQ925%?
$persona5 Q arra*$CSomreCQ9CGiriamC3 C1dadCQ92,%?
$personas Q arra*5merge5recursive$$persona5a3 $persona5%?
print5r$$personas%?
"#
9rra'
(
KombreL DM 9rra'
(
K0L DM Bliseo
K1L DM >iriam
)
KBdadL DM 9rra'
$/$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
(
K0L DM 25
K1L DM 5A
)
)
#"
4rdenando Arra&s por sus
5al ores
4rdenar un arra& de menor a ma&or
sort$$arra*%
$nomres Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%?
sort$$nomres%?
print5r$$nomres%?
"#
9rra'
(
K0L DM 9na
K1L DM ;iego
K2L DM Bliseo
K5L DM oemi
)
#"
4rdenar un arra& de ma&or a menor
rsort$$arra*%
$nomres Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%?
rsort$$nomres%?
print5r$$nomres%?
"#
9rra'
(
K0L DM oemi
K1L DM Bliseo
K2L DM ;iego
$/8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
K5L DM 9na
)
#"
4rdenar un arra& de menor a ma&or
manteni endo la rel acin con l os ndices
asort$$arra*%
$nomres Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%?
asort$$nomres%?
print5r$$nomres%?
"#
9rra'
(
K2L DM 9na
K1L DM ;iego
K5L DM Bliseo
K0L DM oemi
)
#"
4rdenar un arra& de ma&or a menor
manteni endo la rel acin con l os ndices
arsort$$arra*%
$nomres Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%?
arsort$$nomres%?
print5r$$nomres%?
"#
9rra'
(
K0L DM oemi
K5L DM Bliseo
K1L DM ;iego
K2L DM 9na
)
#"
$/?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
4rdenando Arra&s por su cl a5e
4rdenar un arra& de menor a ma&or por
su cl a5e
ksort$$arra*%
$personas Q arra*$
CSomreC Q9 CGiguelC3
CPpellidoC Q9 CGonteroC3
%?
6sort$$personas%?
print5r$$personas%?
"#
9rra'
(
K9+ellidoL DM >ontero
KombreL DM >ig&el
)
#"
4rdenar un arra& de ma&or a menor por
su cl a5e
krsort$$arra*%
$personas Q arra*$
CSomreC Q9 CGiguelC3
CPpellidoC Q9 CGonteroC3
C-alleC Q9 CFHC3
%?
6rsort$$personas%?
print5r$$personas%?
"#
9rra'
(
K1alleL DM GL
KombreL DM >ig&el
K9+ellidoL DM >ontero
)
#"
$/%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>omparando (unci ones de
ordenamiento de arra&s
%uncin 'rdena por
Mantiene las claves
asociadas
'rden de clasi$icacin
asort
!alor S& menor a mayor
arsort
!alor S& mayor a menor
ksort
cla!e S& menor a mayor
krsort
cla!e S& mayor a menor
sort
!alor NO menor a mayor
rsort
!alor NO mayor a menor
Agregar & Eli minar elementos de
un arra&
Agregar el ementos al (inal del arra&
array$push$$arra*3 $valores%
$personas Q arra*$C[uanC3 C1milioC%?
arra*5push$$personas3 CGiguelC3 CPnaC3 C.erminioC%?
print5r$$personas%?
"#
9rra'
(
K0L DM F&an
K1L DM Bmilio
K2L DM >ig&el
K5L DM 9na
K4L DM /erminio
)
#"
$//
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Agregar el ementos 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 /erminio
K5L DM F&an
K4L DM Bmilio
)
#"
Eli mi nar el 3ltimo elemento de un arra&
array$pop$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%?
arra*5pop$$personas%?
print5r$$personas%?
"#
9rra'
(
K0L DM F&an
K1L DM Bmilio
)
#"
Eli mi nar el pri mer elemento de un arra&
array$shift$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%?
arra*5shift$$personas%?
print5r$$personas%?
"#
9rra'
(
$/1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
K0L DM Bmilio
K1L DM 9na
)
#"
Eli mi nar 5alores dupli cados 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 & (il tros
>ontar l a cantidad de 5eces Aue l os
el ementos 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!sted re+iti? manEana 2 )eces
!sted re+iti? mel?n 2 )eces
#"
>ontar l a cantidad de elementos de un
arra&
count$$arra*%
$frutas Q arra*$CperaC3 Cman@anaC3 Cdura@noC%?
echo count$$frutas%? "" 5
4btener l a suma matem2tica de l os
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 l as di (erenci as 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
CmandarinaC3 Cnaran>aC3 ClimMnC3 ClimaC3 CpomeloC%?
$frutas52 Q arra*$CperaC3 Cman@anaC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3
CmandarinaC3 ClimaC3 CpomeloC%?
$diferencias Q arra*5diff$$frutas513 $frutas52%?
echo DHas siguientes frutas no est=n en los 2 arra*s:D . )hr$1'%?
$/G
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
foreach$$diferencias as $fruta5no5repetida% N
echo D- N$fruta5no5repetidaOD . )hr$1'%?
O
"#
Las sig&ientes 0r&tas no est%n en los 2 arra's:
- naran:a
- lim?n
#"
,il trar datos de un arra&D uti l i@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%?
function retornar5enteros$$dato% N
if$is5int$$dato%% N
return $dato?
O
O
function retornar5otros5datos$$dato% N
if$Wis5int$$dato%% N
return $dato?
O
O
$enteros Q arra*5filter$$datos3 Cretornar5enterosC%?
$otros5datos Q arra*5filter$$datos3 Cretornar5otros5datosC%?
print5r$$enteros%?
"#
9rra'
(
K0L DM 25
K5L DM H5
K=L DM 52
)
#"
print5r$$otros5datos%?
"#
9rra'
(
K1L DM 45.2
K2L DM =4.HQ
K5L DM 55.A
$/C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
K4L DM l&na
KAL DM =0.05
KQL DM ag&a
KHL DM sol
)
#"
=eri (icar si un arra& conti ene una cl a5e
determi nada
array$key$eQists$$clave3 $arra*%
if$Warra*56e*5exists$CpasswordC3 $5#K"-%% N
echo C7ee indicar una contraseaaC?
O
4btener todas las cl a5es de un arra& o
todos los 5alores
array$keys$$arra*% - array$values$$arra*%
$liro Q arra*$
C-ituloC Q9 CGanual de #.#C3
C"utituloC Q9 C-raa>ando con arra*sC3
CPutorC Q9 C1ugenia IahitC3
C&echaC Q9 C12/1'/2'11C3
%?
$claves Q arra*56e*s$$liro%?
$valores Q arra*5values$$liro%?
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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"#
9rra'
(
K0L DM >an&al de ./.
K1L DM 1raba:ando con arra's
K2L DM B&genia Na,it
K5L DM 12"10"2011
)
#"
=eri (icar si un arra& conti ene una 5al or
determi nada
in$array$$valor3 $arra*%
if$in5arra*$5'3 $punta>e%% N
echo CRsted ha otenido el m=ximo punta>e posile en una respuestaC?
O
Buscar un 5alor detrmi nado en un arra&
& obtener su cl a5e correspondiente
array$search$$valor3 $arra*%
$personas Q arra*$C[uanC3 CPnaC3 C1milseC3 C7iegoC%?
$persona5uscada Q C1milseC?
$resultado Q arra*5search$$persona5uscada3 $personas%?
var5dump$$resultado%? "" int(5)
$1$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
I<uH es una coo:ieJ
*na coo:ie es un archi5o de texto planoD Aue se
almacena remotamente Len la m2Auina 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#
B2sicamenteD cada coo:ie tendr2 asociado a ellaD un nombre
Aue la identi(iAue & un 5alor#
!os datos Aue se almacenan remotamente en el ordenador del
clienteD pueden ser de cualAuier tipo & el objeti5o de estosD es7
Almacenar in(ormacin relati5a al usuarioV
Acceder a esa in(ormacinD para reali@ar seguimientos &
acciones personali@adas con respecto a cada usuario en
particular
'e esta (ormaD podramos pedirle a un usuarioD Aue ingrese su
nombre mediante un Web ,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 buscaramos esa coo:ieD accederamos a ellaD leeramos
los datos & (inalmenteD podramos mostrarle al usuarioD un
mensaje personali@adoD Aue diga NHola ea5ier;O#
$18
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
=ale aclarar entoncesD Aue las coo:ies se pueden crearD leerD
modi(icar & eliminarD tanto por nuestra aplicacin como por
el mismo usuarioD si Hste es adem2s de curiosoD medianamente
a5e@ado#
!as coo:ies no son eternas
As como una coo:ieD posee un nombre & 5alor asociadoD
tambiHn puede tener asociadaD 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 l o
pre5istoD &a Aue al ser archi5os pertenecientes al usuario &
por tantoD almacenados en su propio ordenadorD 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 & mantenga acti5aD con cada
accin del usuario sobre nuestra App o -itio Web#
!as sesionesD tambiHn son almacenadas remotamente
mediante coo:iesD pero a la 5e@ son retenidas localmente en
memoria#
A di(erencia de las coo:iesD las sesiones expiran pasado
un per odo de tiempo prestableci doD de inacti5idad por
parte del usuari o#
>omo di (erencias (undamentales entre coo:ies &
$1?
Programacin Procedural de Apli caciones 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 usuarioD tras un perodo de tiempo predeterminadoD
mientras Aue las coo:ies expiran en la (echa Aue se les
indiAue o porAue son eliminadas por el usuarioV
*sos e i mportancia
>omo bien hemos dicho antesD tanto coo:ies como sesiones se
utili@an para personali@ar la experiencia del usuario# 'e esta
(ormaD podremos saber Aue todos los sistemas Web Aue
restringen su acceso mediante contrasePasD pueden hacerlo
gracias al uso de coo:ies & sesiones# Por elloD es tan importante
tener dominio tanto de unas como de otras#
!o b2si co
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 leerlasD
modi(icarlas & eliminarlas#
>reaci nD lecturaD modi(icacin &
el iminacin de coo:ies
Para reali@ar acciones con coo:iesD adem2s de un gran n3mero
de (uncionesD PHP nos brinda un arra& supergl obal
denominado -$B%%[C>D el cual nos permitir2 acceder en todo
momento a los datos del usuario#
$1%
Programacin Procedural de Apli caciones 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 aparicinD los par2metros Aue esta (uncin
recibeD son los siguientes7
Par2metros obligatorios7
$# )ombre de la coo:ie# Ejemplo7 username
8# =alor# Ejemplo7 >avier,5
Par2metros opcionales7
?# "omento en el Aue debe expirar# -i no se indicaD
caduca autom2ticamente# Ejemplo en segundos7 time$%
T 2('' Lel eAui5alente a $ horaL
%# 'irectori o en el cu2l es 52lida la coo:ie# -e debe utili@ar
C/C para Aue sea 52lida en todo el dominio# Ejemplo7
C/C
/# 'omini o# Ejemplo7 eugeniaahit.com
1# -olo se transmite por HTTP-# Ejemplo7 &alse
6# -olo se transmite por HTTP# Ejemplo7 -rue# -iempre se
recomien@a indicar -8R1D a (in de e5itar Aue la coo:ie
pueda ser accedida mediante ea5a-criptD & por lo tantoD
5ulnerable a ataAues del tipo S--#
$nomre Q Dnomre * apellidoD?
$valor Q D1ugenia IahitD?
$expira Q time$% T $2('' U 2! U 2(5%? "" 1 aSo
$dir Q D/D?
$dominio Q Ddesa.eugeniaahit.comD? "" no ser% )%lida en CCC.e&geniaba,it.com
$https Q &PH"1?
$http Q -8R1?
setcoo6ie$$nomre3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?
$1/
Programacin Procedural de Apli caciones 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]Dnomre * 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
$nomre Q Dnomre5*5apellidoD?
-valor & /\uan POreG/+
$expira Q time$% T $2('' U 2! U 2(5%?
$dir Q D/D?
$dominio Q Ddesa.eugeniaahit.comD?
$https Q &PH"1?
$http Q -8R1?
setcoo6ie$$nomre3 $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
$nomre Q Dnomre5*5apellidoD?
-valor & 3144+
$expira Q time$% - $2('' U 2! U 2(5%? "" 1 aSo antes
$dir Q D/D?
$dominio Q Ddesa.eugeniaahit.comD?
$https Q &PH"1?
$http Q -8R1?
$11
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
setcoo6ie$$nomre3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?
*n ej emplo pr2ctico con >oo:ies
=amos a crear un script sencilloD Aue solicite al usuarioD el
idioma en el Aue desea 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
mostraremos 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 carpeta paginasD 5amos a crear 8 archi5os7
hola5en.html
hola5es.html
%# En el archi5o hola5en.html 5amos a escribir cualAuier
texto en inglHsD & en el archi5o hola5es.htmlD cualAuier
texto en espaPol
AhoraD dentro de la carpeta sitio-we-multi-idioma
5amos a crear los siguientes archi5os7
template.html
camiar5idioma.php
funciones.php
index.php
En los cualesD 5amos a colocar el cdigo Aue se describe
a continuacin#
$16
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Archi5o template.html
-er2 nuestra 5ista HT"!D en la cualD mostraremos un (ormulario
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
:title9Ee "ite:/title9
:/head9
:od*9
:header9
:h19Ee "ite:/h19
:/header9
:nav9
:form methodQD#K"-D actionQDcamiar5idioma.phpD idQDfrm5idiomaD9
:lael forQDlangD91li>a su idioma / choose *our language::/lael9
:select idQDlangD nameQDidiomaD9
:option valueQDesD91spaaol:/option9
:option valueQDenD91nglish:/option9
:/select9
:input t*peQDsumitD 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 el 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"! & mostrar 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 Apli caciones 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 idioma elegido _ crea o modifica la cookie
function camiar5idioma$% N
$pagina Q get5idioma$%?
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 get5pagina$% 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
^ Luestra la pIgina al usuario
function mostrar5pagina$% N
$plantilla Q file5get5contents$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%?
camiar5idioma$%?
A9
$1C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Archi5o indeQ.php
Este archi5oD reAuerir2 tambiHn de (unciones#php# -er2 el
archi5o 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++tallerLdeLphp#eugeniabahit#com
4 mira el ejemplo en marcha ingresando en7
http7++tallerLdeLphp#eugeniabahit#com+EjemplosLEnL
"archa+sitioL.ebLmultiLidioma+
Trabaj ando con -esi ones
!leg la hora de introducirnos m2s a (ondo con las sesiones
para ir (inali@ando con 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Pri meros pasos con sesi ones
Antes de comen@ar a crear sesiones L& manipularlasLD es
necesario saberD Aue para poder trabajar con ellasD a di(erencia
de las coo:iesD es necesario inicial i@arlas# Para elloD PHP nos
pro5ee de la (uncin session$start'(D la cual debe ser
llamada siempreD antes de reali@ar cualAuier otra
operacin relacionada con sesiones7
session5start$%?
A=I-47
Al igual Aue con las coo:iesD PHP tambiHn nos otorga un
arra& supergl obal 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 usuari oD LAue nos
permitir2 utili@arlo para identi(icar en cada sesin & de manera
ineAu5oca al usuarioL al cual se puede accederD in5ocando a la
(uncin session$id'(7
session5start$%?
echo session5id$%?
>rear una nue5a sesi n
"ediante el arra& supergl obal -$2>22C%3D podemos crearD
leer & modi(icar sesionesD de manera simple & directa7
$6$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Recuerda que tanto para iniciar una
nueva sesin como para reanudar una
sesin existente 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]Cnomre5de5la5sesionC^7
session5start$%?
echo $5"1""BKS]CusuarioC^? "" :a)ierA5
"odi(i car l a sesi n
-i se desea modi(icar la I' de sesinD debe pasarse como
par2metro a sessionBidEF7
session5start$%?
session$id'=nuevoCD=(+
echo session5id$%? "" n&e)o7;
En cambioD si se desea modi(icar cualAuier 5ariable de
sesinD creada por nosotrosD bastar2 con modi(icar el arra&
superglobal $5"1""BKS7
session5start$%?
-$2>22C%3;=usuario=< & =@avier$P`Y5=+
$68
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Eli mi nar una 5ari abl e de sesin
Para eliminar una 5ariable de sesinD HstaD puede destruirse
mediante
unset$$5"1""BKS]Cnomre5de5la5variale5de5sesionC^:
session5start$%?
unset'-$2>22C%3;=usuario=<(+
Pero para destruir la sesin completa del usuario
Einclu&endo la I' de sesinFD 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 )ariables de sesi?n creadas
"" obtengo los +ar%metros de la coo[ie de sesi?n
"" los necesitarI +ara +oder destr&irla
$datos5coo6ie Q session5get5coo6ie5params$%?
"" sobreescribo la coo[ie de sesi?n -la elimino-
setcoo6ie$session5name$%3 SRHH3 time$%-++++++3 $datos5coo6ie]DpathD^3
$datos5coo6ie]DdomainD^3 $datos5coo6ie]DsecureD^3
$datos5coo6ie]Dhttponl*D^%?
session5destro*$%? "" destr&'o la sesi?n
*n caso pr2cti co de uso de
sesi ones
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 modo de ejemplo#
!o primero Aue haremos L&a Aue no utili@aremos ning3n
$6?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
sistema de registro & administracin de usuariosLD es crear un
usuario genHrico con contrasePa 3nica# Para e5itar
guardar estos datos en texto planoD lo Aue haremosD es utili@ar
PHPL>!ID para obtener el hash "'/D de la combinaci n
usuario contrasePa7
php 9 $u Q DpepegrilloD?
php 9 $p Q D5italia1+,55D?
php 9 echo md5$$u . $p%?
45ce+2e+!+'c'fe(a(!21f!5c442,de4
En el ejemplo Aue coloAuHD utili@o como usuario genHrico
pepegrillo & como contrasePa $italiaP`Y5$ & con5ierto a
ambos Een el mismo pasoF a su correspondiente hash "'/ Esin
espaciosD ni caracteres adicionales de ning3n tipoF#
'e esta (ormaD cuando el usuario Auiera ingresar a nuestras
p2ginas restringidasD tendr2 Aue utili@ar como nombre de
usuario pepegrillo & como cla5e 5italia1+,55
!uegoD nosotros lo Aue haremosD ser2 hashear los datos Aue
ingrese el usuario & compararlos con nuestro hash original# A
continuacinD 5eremos como lograrlo & de Aue (orma
mantenerlo logueado en el sistemaD a tra5Hs de sesiones#
*na 5e@ creado nuestro hash "'/D crearemos un archi5o
settings.php destinado a alDacenar 5ariables+constantes de
entorno global#
:Aphp
# ;e:aremos 'a iniciada &na sesi?n
session5start$%?
# a(&6 co+iaremos n&estro ,as, >;5 obtenido con ./.-CL7
const .P".5P))1"K Q D45ce+2e+!+'c'fe(a(!21f!5c442,de4D?
# 0orm&lario.,tml ser% el (&e +ida el ingreso de &ser ' +ass al &s&ario
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 Apli caciones 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*peQDsumitD valueQDBngresarD /9
:/form9
AhoraD crearemos el archi5o principal de nuestro sistema7
funciones.php
AAu almacenaremos todas las (unciones necesarias para7
Iniciar la sesin
'estruir la sesin Edesconectar al usuarioF
=eri(icar si el usuario tiene sesin iniciada
,unci ones necesarias
,unciones de acceso al sistema
"#
1raigo los datos recibidos +or /11. .J-1
' retorno el /9-/ >;5 de ambos
#"
function get5post5data$% N
$hash Q DD?
if$isset$$5#K"-]CuserC^% __ isset$$5#K"-]CpassC^%% N
$hash Q md5$$5#K"-]CuserC^ . $5#K"-]CpassC^%?
O
return $hash?
O
$6/
Programacin Procedural de Apli caciones 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 & pass han 5enido a tra5Hs de HTTP P4-T con
un 5alor declarado# 'e ser asD hasheo ambos datos Esin
riesgosD &a Aue al ci(rarlos con "'/ directamenteD no ha&
posibilidad de Aue se in&ecte cdigo malicioso de ning3n tipoF#
,inalmenteD retorno ese hash Esi no 5inieron datosD retornar2 el
hash 5acoF#
"#
Com+aro ambos ,as,es. -i son idInticos, retorno 8erdadero
#"
function validar5user5*5pass$% N
$user5hash Q get5post5data$%?
$s*stem5hash Q .P".5P))1"K?
if$$user5hash 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 con 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 Apli caciones 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 almacenan 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 redirigir2 al usuario al
(ormulario de loginD haciendo uso de una (uncin Aue
crearemos m2s adelante#
# ;estr&ir sesi?n
function logout$% N
unset$$5"1""BKS%?
$datos5coo6ie Q session5get5coo6ie5params$%?
setcoo6ie$session5name$%3 SRHH3 time$%-++++++3 $datos5coo6ie]DpathD^3
$datos5coo6ie]DdomainD^3 $datos5coo6ie]DsecureD^3
$datos5coo6ie]Dhttponl*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 esoD 5o& a recurrir a la 5ariable de sesin
llamada login5date7
"#
.rimero )eri0ico (&e la )ariable de sesi?n login_date, existe. ;e ser
as6, obtengo s& )alor ' lo retorno.
-i no existe, retornar% el entero 0
#"
$66
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
function otener5ultimo5acceso$% N
$ultimo5acceso Q '?
if$isset$$5"1""BKS]Clogin5dateC^%% 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% 3alse mientras (&e sesi?n acti)a,
retornar% 1r&e.
9l mismo tiem+o, se encarga de act&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 otener5ultimo5acceso$%?
"#
BstableEco como l6mite m%ximo de inacti)idad (+ara mantener la
sesi?n acti)a), media ,ora (o sea, 1Q00 seg&ndos).
;e esta manera, s&mando 1Q00 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 mantenerle acti)a
la sesi?n, es ma'or a la marca de ,ora act&al, signi0ica entonces
(&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 marca de tiem+o reno)ando la sesi?n
$5"1""BKS]Clogin5dateC^ Q time$%?
O
return $estado5activo?
O
,inalmenteD crearemos una peAuePa (uncinD Aue llame a la
anteriorD & en caso de recibir como resultado Aue la sesin est2
$6G
Programacin Procedural de Apli caciones 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
restringi r 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@ando la (uncin header$%
de PHP#
# redirigir al &s&ario
function goto5page$$pagina% N
header$DHocation: $paginaD%?
O
Pasos (inal es
>on todo estoD tenemos Nel almaO de nuestro sistema de
logueo# Ahora solo nos resta crear los archi5os pendientes7
iniciar.php
!lamar2 a la (uncin login$%# Es Auien recibe los datos desde
el (ormulario#
$6C
Programacin Procedural de Apli caciones 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 elija 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
restringida de nuestro sistemaD la cual deber2 in5ocar a la
(uncin validar5sesion$%# Es decirD en esta p2gina Eas como
en cualAuier otra p2gina restringidaFD colocaremos todo el
contenido de acceso pri5adoD &a sea puramente PHPD como
HT"!D una me@cla de ambos o mejor a3nD cdigo PHP Aue
in5oAue & renderi@e el HT"!#
(odo, asolutamente todo el contenido
de estas pginas restringidas, solo ser
visile 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 Apli caciones 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++tallerLdeLphp#eugeniabahit#com
4 mira el ejemplo en marcha ingresando en7
http7++tallerLdeLphp#eugeniabahit#com+EjemplosLEnL
"archa+usoLdeLsesiones+paginaBdeBmuestra#php
$G$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
En alg3n momentoD mientras ejecut2babamos alg3n cdigo
PHPD habremos podido notar con bastante (recuenciaD Aue PHP
nos arrojaba alg3n tipo de mensajeD cuando nuestro scriptD
contena alg3n tipo (alla#
Estos mensajes de error pueden ser di5ersos tipos E(unciones
obsoletasD a5isosD ad5ertenciasD errores (atales Lentre
otrosLF & su 5isibili dadD se puede con(igurar tanto desde
el archi5o de con(iguracin de PHP Ephp.iniF como en
tiempo de ejecuci nD mediante la (uncin ini5set$%#
-in embargoD antes de decidir AuH tipos de error deben
producir mensajes 5isibles o noD se debe considerar
primeroD en Aue entorno estamos trabajando#
>omo hemos hablado en 5arias ocasionesD por cuestiones de
seguridadD cuanto menos in(ormacin sobre el comportamiento
interno de nuestra aplicacinD le demos al usuarioD m2s a sal5o
estar2# Por lo tantoD como regla generalD debemos ocultar
todos los erroresD cuando la aplicaci n estH corriendo
en un entorno de produccin#
Tipos de errores
>omo se coment en p2rra(os anterioresD PHP puede emitir
distintos tipos de erroresD Aue 5an desde el a5iso de (unciones
$G8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
obsoletas hasta errores (atales#
Estos tipos de erroresD poseen asociadas constantes
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 las constantes predi(inidas Aue m2s nos ocupanD
podemos encontrar las siguientes7
!'N"T(NTE DE"!R)P!)*N
)nterrumpe el
"cript
>$>%
3rrores fatales en tiempo de eEecucin. ")
>$D?3C3J
Ad!ertencias no fatales en tiempo de eEecucin NO
>$3%5CB>
A!isos en tiempo de eEecucin( ,ue indican ,ue el
script encontr algo ,ue podr4a ser un error u ocurrir en
el curso normal de un script
NO
>$25CB5
Sugerencias de cam%ios al cdigo para ampliar la
compati%ilidad con !ersiones posteriores de :
NO
>$D>P>B?5>D
A!isos en tiempo de eEecucin( so%re funciones
o%soletas
NO
>$?44
;odos los anteriores (e-cepto 3WS;R&"( ,ue reci'n es
incluido en 3WALL( desde la !ersin ?.B de :)
")
Estos ni5eles de errorD pueden utili@arse de (orma combinadaD
mediante los siguientes operadores7
'PER(D'R ")GN)%)!(D' U"'
a
XoY (alternati!a)
E+N'T)!E , E+DEPRE!(TED
(3WNO;&"3 o 3WD3R3"A;3D)
A
XyY (concatenacin)
E+N'T)!E - E+DEPRE!(TED
(3WNO;&"3 y 3WD3R3"A;3D)
~
Negacin
E+(LL - .E+N'T)!E
(3WALL pero no 3WNO;&"3)
T
Negacin (en tiempo de eEecucin)
E+(LL / E+N'T)!E
(3WALL pero no 3WNO;&"3)
$G?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>on(igurando errores en ti empo
de ej ecuci n
En tiempo de ejecucinD mediante la (uncin ini5set$% de
PHPD se pueden establecer ciertas directi5as de con(iguracinD
relati5as a los errores & registro de los mismos#
Entre las di recti5as m2s comunesD podemos encontrar7
D)RE!T)0( DE"!R)P!)*N 1 E2EMPL'
0(L'R P'R
DE%E!T'
error$reporting
3sta%lece ,ue tipo de errores son reportados
ini5set$Cerror5reportingC3 15PHH _
1571#81)P-17%?
>$?44 A
~>$3%5CB>
display$errors
Determina si se de%en mostrar o no los errores
en pantalla
ini5set$Cdispla*5errorsC3 C'C%?
"tring P
track$errors
&ndica si el Fltimo error encontrado( estar2
disponi%le a tra!'s de la !aria%le
$php5errormsg
ini5set$Ctrac65errorsC3 CKnC%?
"tring %ff
error$prepend$string
"adena a imprimir antes del mensaEe de error
ini5set$Cerror5prepend5stringC3 C1rror
encontrado:C%?
SRHH
error$append$string
"adena a imprimir despu's del mensaEe de
error
ini5set$Cerror5prepend5stringC3
C:hr/9C%?
SRHH
*n ej emplo senci l lo pero al tamente
producti5o
>omo comentamos anteriormenteD cuando nuestra aplicacin
corriese en un entorno de produccinD los errores deberan
ocultarse# -in embargoD mientras Aue se estH trabajando en un
entorno de desarrolloD podran estar 5isiblemente acti5os para
a&udarnos a depurar nuestro cdigo#
$G%
Programacin Procedural de Apli caciones 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 aplicacin 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
Aue llameremos #8K7R))BKSD estableciendo su 5alor por
de(ecto en &alse Esigni(icar2 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
*til i@ando el s mbol o Q para
sil enciar 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*5errorsC3 C'C%?
ini5set$Ctrac65errorsC3 CKnC%?
$archivo Q @fopen$Carchivo5;ue5no5existe.txtC3 CrC%?
$G/
Programacin Procedural de Apli caciones 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 archi5o mediante fopen$%D pero imprimimos en
pantalla el mensaje de error capturadoD mediante la 5ariable
$php5errormsg obteniendo como resultado7
fopen$archivo5;ue5no5existe.txt%: failed to open stream: So such file or
director*
-in embargoD podramos ocultar esta in(ormacin al usuario7
:Aphp
ini5set$Cerror5reportingC3 15PHH L 15SK-B)1 L 15"-8B)-%?
ini5set$Cdispla*5errorsC3 C'C%?
ini5set$Ctrac65errorsC3 CKnC%?
$archivo Q @fopen$Carchivo5;ue5no5existe.txtC3 CrC%?
if$W$archivo% N
echo =Ha ocurrido un error en el sistema. Disculpe 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>on este captuloD llegamos al (inal del curso NPHP para
PrincipiantesO# Abarcando esta 3ltima unidadD &a estaremos
en condiciones de crear aplicaciones (uncionales de alto ni5elD
de complejidad mendia#
-in dudasD el trabajo con bases de datosD es lo m2s esperado
por cualAuier programador Aue est2 dando sus primeros pasosD
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# 0epresentan la parte m2s
5ulnerable de un sistema in(orm2tico & de su 5ulnerabilidadD
depender2 la estabilidad o inestabilidad de todo el sistema#
A lo largo del cursoD hemos adAuirido todas las tHcnicasD
pr2cticas & herramientas necesariasD para saber como (iltrar &
securi@ar datos & reciHn ahoraD estamos listos para poder
comen@ar a trabajar con bases de datosD en absoluta
li bertad & con(ian@a#
M>omencemos;
Una base de datos representa un
conjunto de datos pertenecientes a
un mismo contexto, que son
almacenados de forma sistemtica
para su posterior uso. ,ara
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 Apli caciones 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 distribu&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 Public !icense EP!F#
Instalaci n & con(i guracin 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 administracin de "&-<!# Asigna una
contrasePa Aue puedas recordar (2cilmente & mantenla 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 "&-<! Eesta
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 administracin 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
A continuacinD te preguntar2 si deseas modi(icar esa
contrasePa# -al5o Aue desees modi(icarlaD ingresa n7
)hange the root passwordA ]X/n^ n
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 acceso a ella# TambiHn responde Aue s7
8emove test dataase 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 responde sD por 3ltima
5e@7
8eload privilege tales nowA ]X/n^ N
Ini ci arD rei niciar & detener el ser5idor
"&-<!
En ocasiones necesitar2s iniciarD reiniciar o detener el ser5idor
de bases de datosD "&-<!#
$GC
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
!as opciones disponibles son7
stop detiene el servidor
start inicia el servidor
restart reinicia el servidor
Para iniciarD reiniciar o detener el ser5idorD deber2s ejecutar
el siguiente comandoD seguido de la opcin deseada7
sudo )etc)init.d)mysKl opcion5deseada
!gicamente reempla@ando opcion por stopD start o restart
seg3n si deseas pararD iniciar o reiniciar el ser5idor#
$C9
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Admi nistraci n de "&-<!
*na 5e@ Aue comencemos a utili@ar bases de datosD
necesitar2s poder acceder a las opciones de aministracin de
las mismas# Por lo tantoD te recomiendo tener siempre 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 root 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 interacti5o para "&-<!7
mysKl#
All podremos escribir los comandos necesarios para
administrar el ser5idor de bases de datos#
>omandos para administrar "&-<! dede el shell
interacti5o
!a siguiente tabla describe los comandos de uso (recuente Aue
necesitar2s para administrar el ser5idor de bases de datos
desde el shell interacti5o#
Es una buena ideaD imprimir esta tabla para tenerla siempre a
$C$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
mano 7F
!'M(ND' DE"!R)P!)*N
show data.ases+
Muestra todas las %ases de datos creadas en el
ser!idor
use nom.re$de$la$.ase$de$datos+
&ndicar ,ue !as a comen9ar a utili9ar la %ase de
datos elegida
create data.ase
nom.re$de$la$d.+
"rear una nue!a %ase de datos
Kuit
Salir del s1ell interacti!o
$C8
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
-obre el l enguaje -<!
-<! Lsiglas de -tructured <uer& !anguageLD es el lenguaje de
consultas a bases de datosD Aue nos permitir2 crearD
modi(icarD consultar & eliminar tanto bases de datos como sus
tablas & registrosD desde el shell interacti5o de "&-<! &
tambiHn desde PHP#
>omo todo lenguaje in(orm2ticoD posee su propia sintaxisD
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 necesari os
relacionados con "&-<!#
Tipos de datos m2s comunes
ErecomendadosF
!a siguiente tablaD muestra los tipos de datos m2s comunesD
aceptados por 5ersiones la 5ersin /#9#? o superiorD de "&-<!#
Tipo de dato Denominacin Especi$icaciones Ejemplo
1ntero C35'3( S Q cantidad de d<gitos BS-$5%
Sbmero decimal D>BCL?4'38 D(
S Q cantidad de d<gitos
totales
7 Q cantidad de
decimales
71)BGPH$1'3 2%
Iooleano R%%4 IKKH
&echa D?5> 7P-1
&echa * hora D?5>5CL> 7P-1-BG1
&echa * hora
autom=tica
5CL>25?LP -BG1"-PG#
.ora 5CL> -BG1
$C?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Pao N>?'D(
7 Q cantidad de d<gitos
$2 o !%
X1P8$!%
)adena de
longitud fi>a
BH?'3(
S Q longitud de la
cadena \ entre ' * 255
).P8$2%
)adena de
longitud
variale
U?BH?'3(
S Q longitud m=xima de
la cadena \ entre ' *
(5522
JP8).P8$1''%
Ilo;ue de
texto de gran
longitud
variale
R4%R IHKI
-i nt2xi s b2sica de l as sentenci as -<!
*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> nomre5de5la5tala'
nomre5del5campo -B#K57157P-K3
nomre5de5otro5campo -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 Apli caciones 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 con 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 cualesD solo 8 pueden ser decimales
en5stoc6 IKKH
>rear un campo llamado NenBstoc:O del tipo booleano
$C/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Insertar datos en una tabla
-intaxis7
C32>5 C35%
nomre5de5la5tala$campo13 campo23 campo1'..%
JPHR1"$dato13 dato23 dato1'...%+
Ejemplo7
BS"18- BS-K
productos$producto3 precio3 en5stoc6%
JPHR1"$CIolsa de dormir para alta 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 respecti5amente en cada uno de los campos
indicados
-eleccionar registros
-intaxis7
2>4>B5 campo13 campo23 campo1'
6%L tala?
Ejemplo7
"1H1)- producto3 precio
$C1
Programacin Procedural de Apli caciones 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> tala
2>5 campo1 Q valor3
campo2 Q valor3
campo1' Q valor?
Ejemplo7
R#7P-1 productos
"1- en5stoc6 Q &PH"13
precio Q '?
Explicacin7
R#7P-1 productos
Actuali@ar la tabla productos
"1- en5stoc6 Q &PH"13
"odi(icar el campo enBstoc: por (also
precio Q '?
$C6
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
& el campo precio a 9
Eliminar registros
-intaxis7
D>4>5> 6%L tala?
Ejemplo7
71H1-1 &8KG productos?
Explicacin7
71H1-1 &8KG productos?
Eliminar todos los registros de la tabla productos
$CG
Programacin Procedural de Apli caciones 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 r2pido paseoD por las
opciones disponibles en -<! para sentencias m2s complejas
Aue las anteriores#
!a cl2usula WHE0E
!as sentencias en -<!D se componen de cl2usulas# R E.181 es
una de ellas# !a cl2usula DH>> nos permite (iltrar registros
en una sentencia -<!#
Esta cl2usulaD (unciona de (orma similar a la comparacin de
expreciones en PHPD utili@ando los siguientes operadores de
comparcin7
# ma*or ;ue ! menor ;ue
& igual ;ue !# distinto ;ue
9Q ma*or o igual ;ue :Q menor o igual ;ue
R>5D>>3 nP ?3D n2 entre n1 * n2
C2 3144a51>a6?42> es nulo L es verdadero L es falso
C3$valor13 valor23 va...% contiene
Por supuestoD tambien admite operadores l gicos7
?3D $*% 3%5 $negaciMn% % $o%
$CC
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
=eamos algunos ejemplos7
-eleccionar productos donde precio sea menor Aue $9997
"1H1)- producto3
precio
&8KG productos
DH>> precio ! P:::+
Aumentar el $9f del precio de los productosD Aue actualmente
se encuentren entre $/9 & 8997
R#7P-1 productos
"1- precio Q $precio U 1.1'%
DH>> precio R>5D>>3 P5: ?3D 2::+
-eleccionar productos donde enBstoc: no sea (also
"1H1)- producto3
precio
&8KG productos
DH>> en$stock C2 3%5 6?42>+
Eliminar productos cu&os precios sean $99D 899 &+o ?99 &
adem2sD enBstoc: sea (also o producto sea nulo7
71H1-1
&8KG productos
DH>> precio C3'P::8 2::8 3::(
?3D 'en$stock C2 6?42>
% producto C2 3144(+
"odi(icar enBstoc: a 5erdadero donde precio sea menor Aue /9
& producto no sea nulo7
R#7P-1 productos
"1- en5stoc6 Q -8R1
DH>> precio ! 5:
?3D en$stock C2 3%5 3144+
899
Programacin Procedural de Apli caciones 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 EP")F o descendente E71")F7
"1H1)- producto3
descripcion3
precio
&8KG productos
E.181 precio I1-E11S 1 PS7 5'
PS7 en5stoc6 B" SK- &PH"1
%D> RN precio D>2B+
TambiHn es posibleD ordenar los resultados de la consultaD por
m2s de un campo7
"1H1)- producto3
descripcion3
precio
&8KG productos
E.181 precio I1-E11S 1 PS7 5'
PS7 en5stoc6 B" SK- &PH"1
%D> RN precio D>2B8
producto ?2B+
Al ias de tabl as & 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 reser5adaD ?27
"1H1)- producto ?2 =3om.re del Producto=8
descripcion ?2 Detalles8
precio ?2 Cmporte
&8KG productos ?2 p
E.181 precio I1-E11S 1 PS7 5'
PS7 en5stoc6 B" SK- &PH"1
89$
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
%D> RN precio D>2B8
producto ?2B+
)tese Aue los alias Aue contengan caracteres
extraPosD deben ser encerrados entre comillas
simples
,unci ones del lenguaj e -<! 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# =eremos aAuellas de uso
m2s (recuente#
>ontar la cantidad de registros7 >4*)TEF
"1H1)- B%135'producto( P" )antidad
&8KG productos?
-umar totales7 -*"EF
"1H1)- 21L'precio( P" -otal
&8KG productos?
>oncatenar cadenas7 >4)>ATEF
"1H1)- producto3
B%3B?5'=12D =8 precio8 =.-=( P" #recio
&8KG productos?
)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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>on5ertir a min3sculas & ma&3sculas7 !>A-EEF &
*>A-EEF
"1H1)- 1B?2>'producto(8
4B?2>'descripcion(
&8KG productos?
0eempla@ar datos7 0EP!A>EEF
"1H1)- >P4?B>'descripcion8 =Sn=8 =!.r)#=( P" 7escripcion
&8KG productos?
0eempla@a bgnb por bZbr+Xb
4btener los primeros o 3ltimos caracteres7 !E,TEF
& 0IHTEF
"1H1)- 4>65'producto8 5:(
&8KG productos?
0edonder n3meros7 04*)'EF
"1H1)- %13D'precio8 2(
&8KG productos?
0etornar2 los precios con 8 decimales
4btener solo la (echa de un campo 'ATETI"E o
TI"E-TA"P7 'ATEEF
"1H1)- D?5>'campo$datetime(
&8KG tala?
4btener una (echa (ormateada7 'ATEB,40"ATEF
"1H1)- D?5>$6%L?5'campo$fecha8 =bd)bm)bN=(
&8KG tala?
Aplican los mismos patrones de (ormato de (echa Aue en PHP
89?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
4btener el registro con el 5alor m2ximo & mnimo7
"ASEF & "I)EF
"1H1)- L?c'precio(
&8KG productos?
0etorna el producto con el precio m2s caro
"1H1)- LC3'precio(
&8KG productos?
0etorna el producto con el precio m2s barato
4pti mi @aci n de bases de 'atos
A continuacinD encontrar2s una lista de consejos Aue -IE"P0E
debes seguirD al momento de crear nue5as tablas & escribir
sentencias -<!#
Todos l os registros deben tener un I'
3nico
>uando crees tablasD asgnales un campo id de tipo
autonumHrico incremental & establHcelo como ndice primario#
>uando agregues registrosD este campo se completar2
autom2ticamenteD con un n3mero incrementalD Aue te ser5ir2
para optimi@ar tus consultas & 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 PCL?N [>N3
producto JP8).P8$125%
%?
El campo idD ser2 como cualAuier otro & lo podr2s seleccionar
en un -E!E>T o utili@arlo e cualAuier cl2usula WHE0E#
89%
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>rear ndices en l as 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
retrasa la insercin & actuali@acin de registrosD puesto Aue la
base de datosD deber2 actuali@ar los ndices cada 5e@ Aue se
agreguen o modi(iAuen datos#
>uando una consulta es ejecutadaD "&-<! tratar2 de encontrar
primero la respuesta en los campos ndiceD & lo har2 en el
orden Aue los ndices ha&an sido creados#
I>u2ndo agregar ndicesJ >uando 5a&as a utili@ar una
combinacin de campos en la cl2usula WHE0E# Por ejemploD 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'precio8 en$stock(
%?
Indi ca cu2les campos no pueden ser
nulos
-<! te da la posibilidad de indicar AuH campos no pueden estar
nulos# Indicar Aue un campo no debe estar nuloD te a&udar2 a
no almacenar registros de(ectuosos en tu base de datos#
89/
Programacin Procedural de Apli caciones 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
descripcion IHKI 3%5 31443
BS71F$precio3 en5stoc6%
%?
*til i @a el motor Inno'B
El motor de bases de datos Inno'BD te permitir2 crear tablas
relaciones optimi@ando su rendimiento# Al momento de crear
tus tablasD indica Aue utili@ar2s el motor 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
descripcion IHKI SK- SRHH3
BS71F$precio3 en5stoc6%
% >3JC3>&CnnoDR+
4btener ma&or in(ormaci n
'escarga el "anual de "&-<!
Aprende sobre el lenguaje -<! D gratis en $Te&'ata
891
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Antes de comen@arD deseo aclarar Aue Lpor cuestiones de
seguridadL en nuestros archi5os PHPD solo nos conectaremos a
una base de datosD para reali@ar consultas de seleccinD
modi(icacinD insercin & eliminacin de registros en tablas &
bases de datos existentes#
)o crearemos tablas ni bases de datos desde nuestros archi5os
PHPD sino Aue lo haremos desde el administrador de "&-<! por
lnea de comandos#
A (in de poder trabajar con los ejemplos de este captuloD
comen@aremos creando una nue5a base de datosD 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% SK- SRHH 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/BS1QBnno7I?
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 este captuloD
896
Programacin Procedural de Apli caciones 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 nuestras aplicacionesD utili@aremos
m*s;li#
Para trabajar con bases de datos desde PHP 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
?# Ejecutar una consulta
%# >apturar los resultados
/# !iberar los resultados
1# >errar la conexin
>onectarse a l a base de datos
$host Q ClocalhostC?
$usuario Q CrootC?
$clave Q CcontraseaaC?
89G
Programacin Procedural de Apli caciones 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?
m*s;l5select5d$$d% or die$CSo pude seleccionar la ase de datosC%?
Ejecutar una consulta simple
$s;l Q D
BS"18- BS-K usuarios
$username3 email3 password%
JPHR1" $C>uanpere@C3
C>pere@@algundominio.extC3
C2(ec',ef(1f125!+!,+a12(,!a+a!aeC%
D?
$result Q m*s;l5;uer*$$s;l% or die$CSo pude e>ecutar la consultaC%?
Ejecutar una consulta de sel eccin
m3l tiple & 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 como el siguiente7
$registros Q arra*$
89C
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
arra*$Ccampo1CQ9CvalorC3 Ccampo2CQ9CvalorC3 Ccampo,CQ9CvalorC%3
arra*$Ccampo1CQ9CvalorC3 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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Algunos ej empl os concretos
>onsulta de seleccin
d #reparo los datos para conectarme a la 7I
$host Q ClocalhostC?
$usuario Q CrootC?
$clave Q CcontraseaaC?
$d Q Ccurso5phpC?
d me conecto a la 7I
$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 pude seleccionar la ase de datosC%?
d #reparo la sentencia "cH
$s;l Q D
"1H1)- id3 username3 email
&8KG usuarios
E.181 suspendido B" SK- -8R1
D?
d 1>ecuto la consulta
$result Q m*s;l5;uer*$$s;l% or die$CSo pude e>ecutar la consultaC%?
d )apturo los resultados
while$$registros]^ Q m*s;l5fetch5arra*$$result%%?
d Hiero los resultados
m*s;l5free5result$$result%?
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 CrootC?
$clave Q CcontraseaaC?
$d Q Ccurso5phpC?
d me conecto a la 7I
8$$
Programacin Procedural de Apli caciones 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 pude seleccionar la ase de datosC%?
d #reparo la sentencia "cH
$s;l Q D
BS"18- BS-K usuarios $username3 email3 password%
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 Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
"&-<! desde PHP con el
conector m&sAl i
>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 tra5Hs de objetos
Ees decirD utili@ando el paradigma de la programacin orientada
a objetosFD 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 gran 5entaja al
momento de preparar nuestras sentencias -<!7 podemos
utili@ar NcomodinesOD para indicar al conectorD AuH datos
deben ser reempla@ados din2micamente# 'e esta (ormaD el
propio conector se encargar2 de (iltrar los datos
din2micosD obteniendo consultas mucho m2s
seguras#
Por consiguienteD para trabajar con el conector m*s;liD
seguiremos estos pasos7
$# >onectarse a la base de datos & selecci onar la 'B
a util i@ar
8# Preparar la consulta
?# Ejecutar una consulta
%# >apturar los resultados
/# >errar consulta
8$?
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
1# >errar la conexin
Abrir una conexi n medi ante m&sAli
d #reparar las variales con los datos de conexiMn
$host Q ClocalhostC?
$usuario Q CrootC?
$clave Q CcontraseaaC?
$d Q Ccurso5phpC?
d )onectarse a la ase de datos
$conn Q m*s;li5connect$$host3 $usuario3 $clave3 $d%?
Preparar la consulta
Preparar una consulta para trabajar mediante m&sAliD reAuerir2
de algunos cuantos pasos Aue debemos seguirD cuidada &
ordenadamente#
PrimeroD preparamos la sentencia# Pero a di(erencia de la 5e@
anterior Econ m*s;lFD los datos Aue relacionados 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 usuarios $username3 email3 password%
JPHR1" $"8 "8 "%
D?
!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 Apli caciones 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 tipo de datos correspondiente7
m*s;li5stmt5ind5param$$pre3 DsssD3 $username3 $email3 $password%?
El segundo par2metro de la (ucin m*s;li5stmt5ind5param
EsssF indica el tipo de datos correspondiente a los par2metros
Enuestras 5ariablesF# !a NsO signi(ica string# Tres NsOD signi(ican
Aue los tres datos son de tipo string#
4tros tipos de datos soportados son7
's( string 'i( entero 'd( dole/decimal '.( lo
El eAui5alente para otros tipos de datos no listados arribaD es7
6echas y horas son cadenas de texto. #or lo tanto3 se utili@a s
Rooleanos es un entero $K: &alse3 1: -rue%. Rtili@ar i
Ejecutar l a consulta
m*s;li5stmt5execute$$pre%?
>errar la consulta
m*s;li5stmt5close$$pre%?
8$/
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>errar la conexin
m*s;li5close$$conn%?
Ejempl o de i nsercin completo
d #reparar las variales con los datos de conexiMn
$host Q ClocalhostC?
$usuario Q CrootC?
$clave Q CcontraseaaC?
$d Q Ccurso5phpC?
d )onectarse a la ase de datos
$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%
JPHR1" $"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 los datos a reempla@ar con su tipo
m*s;li5stmt5ind5param$$pre3 DsssD3 $username3 $email3 $password%?
d 1>ecuto la consulta
m*s;li5stmt5execute$$pre%?
d #P"K K#)BKSPH $"KHK #P8P )KS"RH-P" 71 BS"18)BiS%:
d Ktener el B7 del registro insertado
$nuevo5id Q m*s;li5insert5id$$conn%?
d )ierro la consulta * la conexiMn
m*s;li5stmt5close$$pre%?
m*s;li5close$$conn%?
)tese Aue el ejemplo de insercinD apl ica tambiHn a
consultas de actuali@acinD modi (icacin &
eliminacin#
8$1
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
>apturar resultados de una consulta de
sel eccin
En una consulta de seleccin Edonde necesito capturar los
resultados de5ueltosFD despuHs de ejecutar la consulta E& antes
de cerrarlaFD al igual Aue hicimos con el conector m*s;lD 5amos
a capturar los resultadosD pero de (orma di(erente#
PrimeroD 5amos a asociar la salida a 5ariables# Esto esD asociar
l os nombres de los campos de5ueltos a nombres de
5ariables & se logra as7
m*s;li5stmt5ind5result$$pre3 $id3 $username3 $email%?
>laramenteD le estamos indicando al conectorD Aue nos
re(eriremos a los campos idD 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 manteniendo nuestra arAuitectura de aislacin
del cdigo PHP & HT"!D nue5amenteD 5amos a iterar sobre los
resultadosD para generar un arra& Aue almacene todos los
registros de5ueltos7
while$m*s;li5stmt5fetch$$pre%% N
$registros]^ Q arra*$CidCQ9$id3
CusernameCQ9$username3
CemailCQ9$email%?
O
>omo se puede 5erD la di(erencia es notable# Esta 5e@D tu5imos
Aue encargarnos de crear el arra& pr2cticamente Na manoO#
8$6
Programacin Procedural de Apli caciones Web de baja complejidad
PHP Experto Tomo I Eugenia Bahit
Ejempl o compl eto de consul tas de
sel eccin
d #reparar las variales con los datos de conexiMn
$host Q ClocalhostC?
$usuario Q CrootC?
$clave Q CcontraseaaC?
$d Q Ccurso5phpC?
d )onectarse a la ase de datos
$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%
JPHR1" $"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 los datos a reempla@ar con su tipo
m*s;li5stmt5ind5param$$pre3 DsssD3 $username3 $email3 $password%?
d 1>ecuto la consulta
m*s;li5stmt5execute$$pre%?
d asocio los nomres de campo a nomres de variales
m*s;li5stmt5ind5result$$pre3 $id3 $username3 $email%?
d )apturo los resultados * los guardo en un arra*
while$m*s;li5stmt5fetch$$pre%% N
$registros]^ Q arra*$CidCQ9$id3
CusernameCQ9$username3
CemailCQ9$email%?
O
d )ierro la consulta * la conexiMn
m*s;li5stmt5close$$pre%?
m*s;li5close$$conn%?
8$G

También podría gustarte