Está en la página 1de 218

Tomo I

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

ndice General
Introduccin a las tecnologas
'i(erencia entre

! A"P ###################### $%

!A"P & !A"P############################################################################## $% )*+!inux & !inux##############################################$% )*################################$/ ,ree -o(t.are ,oundation & el Pro&ecto

In(ormacin complementaria########################################################$/ -itios Web de 0e(erencia###########################################################$/ Bibliogra(a complementaria#####################################################$1 Preparacin b2sica del entorno de desarrollo###############################$1 Instalacin de *buntu )*+!inux en Windo.s##########################$1 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

)ullD 5arBdumpEF e issetEF##########################################################?/ "alas pr2cticas con 5ariablesD Aue a(ectan el uso de memoria ?G 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 EcondicionalesF ########%C


'e(inicin###################################################################################### %C >ondicionales i(D else & else i(#######################################################%C 4peradores lgicos & de comparacin######################################/9 4peradores de comparacin#####################################################/9 'i(erencia entre igualdad e idHntico en la comparacin###########/$ 4peradores lgicos###################################################################/$ >reando condicionales##############################################################/8 Estructuras de control con -.itch#################################################/% I>u2ndo utili@ar i( & cuando s.itchJ#########################################/1

Tipos de 'atos complejos7 "atrices simples & multidimensionales################################################ /G


"atrices en PHP############################################################################ /G -intaxis b2sica##########################################################################/G
%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Imprimir en pantalla con printBr################################################/C Acceso a los tems de un arra&#################################################/C "odi(icando elementos#############################################################19 Agregar elementos####################################################################19

Estructuras de >ontrol Parte II Ebucles IF ###############18


0ecorriendo matrices din2micamente con (oreach#######################18 -intaxis b2sica del constructor (oreach####################################18 *n ejemplo de iteracin compleja con (oreach#########################1? "odi(icando matrices din2micamente con (oreach###################1%

Estructuras de >ontrol Parte III Ebucles IIF #### # # # # # # # # # 16


WhileD un bucle simple##################################################################16 *n ejemplo sencillo###################################################################16 *n ejemplo pr2ctico##################################################################1G 'o .hileD tan simple como .hile pero con una 5entaja################1C *n ejemplo simple####################################################################1C Bucles (orD los m2s complejos de PHP###########################################6$ -intaxis7#################################################################################### 6$ >uriosidades sint2cticas de la 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 usuario ########################## 6G


'e(inicin###################################################################################### 6G 'eclarando ,unciones###################################################################6G -intaxis b2sica##########################################################################6G -obre el nombre de las (unciones#############################################6G -obre los par2metros################################################################6G !lamando a una (uncin################################################################6C
/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

-obre la (inalidad de las (unciones################################################G9 Paso de 5ariables por re(erencia en (unciones##############################G9 "odi(icando 5ariables globales mediante el uso de global###########G$ !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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"o5iendo el puntero dentro del archi5o####################################CG *n contador de 5isitas sencillo#############################################CG M>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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>onstantes################################################################################## $86 'e(inicin cl2sica de constantes en PHP#################################$86 'e(inicin de constantes en PHP /#?#######################################$8G ,inalidad de las constantes#####################################################$8C =ariables 5ariables######################################################################$?9 =ariables superglobales##############################################################$?$

En5o de correo electrnico con PHP ###################### $??


!a (uncin mailEF & su sintaxis#####################################################$?? El par2metro NdestinatarioO7 (ormatos admitidos####################$?? >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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

0edondear un n3mero hacia arriba#############################################$%6 4btener un n3mero entero aleatorio##########################################$%G

,unciones para el manejo de matrices ################### $%G


'i5iendo & uniendo arra&s##########################################################$%G 'i5idir un arra& en matrices m2s peAuePas###########################$%G 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 Aplicaciones 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

*n caso pr2ctico de uso de sesiones##########################################$6? ,unciones necesarias##############################################################$6/ ,unciones de acceso al sistema##########################################$6/ ,unciones para destruir la sesin del usuario#####################$66 ,unciones para 5eri(icacin & 5alidacin de sesiones#########$66 !a (uncin Aue redirige a los usuarios#################################$6C Pasos (inales########################################################################### $6C

Tratamiento & control de errores ########################### $G8


Tipos de errores##########################################################################$G8 >on(igurando errores en tiempo de ejecucin############################$G% *n ejemplo sencillo pero altamente producti5o######################$G% *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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>onsultas a5an@adas##############################################################$CC !a cl2usula WHE0E#############################################################$CC 4rdenando consultas7 la cl2usula 40'E0 BR######################89$ Alias de tablas & campos########################################################89$ ,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 & 0I HTEF ############################################################################################ 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 Aplicaciones 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Introduccin a las tecnologas ! A"P


!A"P son las siglas de cuatro tecnologas libresD Aue con(orman la base de las aplicaciones Web basadas en7 -istema 4perati5o7 )*+!inux

-er5idor Web7 Apache -er5idor de bases de datos7 "&-<! !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 N O 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 !inux

)*+!inux &

!inuxD es un :ernelD es decirD el n3cleo de un -istema 4perati5oD mientras Aue )*+!inuxD el -istema 4perati5o Aue utili@a el Ternel !inux como n3cleo#
$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

El Ternel !inuxD parte (undamental del -istema 4perati5oD (ue desarrollado por !inus Tor5alsD utili@ando como modelo a *)IS# *na de las di(erencias (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 distribuciones )*+!inux D es decirD di(erentes -istemas 4perati5os basados en el Ternel !inuxD entre las cuales se destacan7 'ebianD *buntuD TubuntuD ,edora D entooD -lac:.areD >ent4-D Arch!inuxD AsturixD entre otros cientos#

,ree -o(t.are ,oundation & el Pro&ecto )*


!a ,ree -o(t.are ,oundation D organi@acin sin (ines de lucroD (undada por 0ichard -tallmanD principal precursor del -o(t.are !ibreD es el organismo Aue creD di(unde & promue5eD el -istema 4perati5o )*+!inuxD a tra5Hs del Pro&ecto )* #

In(ormacin complementaria
-itios Web de 0e(erencia
-itio Web de la ,ree -o(t.are ,oundation 7 ...#(s(#org -itio Web del Pro&ecto )*7 ...#gnu#org -itio Web del Ternel !inux7 http7++...#:ernel#org+ -itio Web de la !inux ,oundation 7 http7++...#linux(oundation#org+

$/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Bibliogra(a complementaria
Introduccion al so(t.are libre#pd( E*ni5ersitat 4bierta de >atalun&aF -istema operati5o gnu linux basico#pd( E*ni5ersitat 4bierta de >atalun&aF

Preparacin b2sica del entorno de desarrollo


En este cursoD nos en(ocaremos en tecnologas !A"PD a partir de la distribucin *buntu $9#9% !T- E!ucidF Lo superiorL de )*+!inuxD basada en 'ebian# En caso de RA contar con otra distribucinD 5ersin de *buntu o 'ebianD puedes saltar estos p2rra(os e ir directamente a la instalacin de Apache #

Instalacin de *buntu Windo.s

)*+!inux en

-i eres usuario de Windo.s & deseas conser5ar tu -istema 4perati5o actualD 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 instrucciones descargaD las N-ho. me ho.O *buntu Windo.s InstallerD sigue las de los pasos 8 & ? de la *0! de cuales podr2s 5isuali@ar pulsando el botn de cada uno de los pasos#

$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Instalacin de *buntu )*+!inux como 3nico -istema 4perati5o


Para instalar *buntu como 3nico -istema 4perati5oD sigue los siguientes pasos7 $# ingresa en http7++...#ubuntu#com+do.nload+ubuntu+do.nload 8# En el paso $D 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#

Instalacin de Apache -er5er


Antes de instalar Apache en tu distribucin )*+!inuxD crearemos un !an@ador de la terminal Ellamado Nacceso directoO en Windo.sFD para &a tenerlo Na manoO# Para elloD sigue los siguientes pasos7 $# En el panel superior Edonde
$6

(iguran

los

men3es

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

NAplicacionesD !ugares & -istemaOFD ha@ clic derecho con el ratn luego del men3 N-istemaOD & selecciona la opcin NAPadir al PanelO# 8# A continuacinD ha@ doble 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 terminalD pulsando una 5e@D sobre el cono del lan@adorD Aue acabas de crear# *na 5e@ en la terminalD lo primero Aue haremosD ser2 asegurarnos de tener actuali@ado el sistema operati5o & de esta (ormaD securi@arlo# Para elloD 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)'4sudo7 te con5ierte en super usuario# Wnico usuario Aue tiene permisos para instalar paAuetes en tu sistema operati5o# apt-get7 es distribuciones la utilidad para manejar paAuetes en )*+!inux basadas en 'ebian#

$G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Alternati5amenteD puede utili@ar el comando aptitude en 5e@ de apt-get# update7 opcin de aptLget Aue sincroni@a los archi5os del ndice de paAuetes con los repositorios o(iciales Edicho de otra (ormaD obtiene un ndice de actuali@acionesF

*na 5e@ (inali@ada la actuali@acionesD escribe7


sudo apt-get upgrade

sincroni@acin

del

ndice

de

)ue5amente deber2s ingresar tu contrasePa# PosiblementeD deban instalarse 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)'4install es la opcin de apt-get Aue indica Aue se instalar2 uno o m2s paAuetes

$C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

apache2 es el nombre del paAuete Aue se instalar2

Ra tenemos el -istema 4perati5o & el ser5idor Web instalado# Para asegurarnos de Aue Apache estH (uncionandoD 5amos a escribir el siguiente comando en la 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

sudo /etc/init.d/apache2 restart

se debe utili@ar siempreD tras reali@ar alguna modi(icacin a Apache# !os cambios de con(iguracin de Apache D se reali@an modi(icando el archi5o apache2.conf Aue 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 editor de textos# 0ecargar Apache7
sudo /etc/init.d/apache2 reload

edit7 un

se utili@a generalmenteD cuando un nue5o sitio Web es con(igurado#

It Wor:s;
>uando Apache ha sido instalado e iniciali@adoD podr2s 5er la p2gina de 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 Aplicaciones X Internet X )a5egador Web ,ire(ox # TambiHn puedes abrir escribiendo firefox# ,ire(ox desde la terminal D

Es posible tambiHnD abrir una *0! en ,ire(ox desde la

8$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

terminalD escribiendo7 firefox http://www.google.com (o la URL a la cual desees acceder)

Instalacin de "&-<!
E5er seccin7 PHP & "&-<! m2s adelanteF

Instalacin de PHP
Instalar PHP en *buntu es tan simple Aue solo reAuiere un comando# 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

eugenia@cocochito:~$ php -v PHP 5.3.2-1u untu!.1! with "uhosin-#atch $cli% $ 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 directorio de tu Web !ocal


Por de(ectoD Apache espera Aue los archi5os de tu sitio Web localD se alojen en el directorio /var/www/D pero trabajar en este directorio puede ser mu& incmodoD &a Aue solo podr2s acceder a HlD con permisos de super usuario# Para e5itar este esco&oD tenemos dos (ormas di(erentes de solucionarlo7 4pcin $7 >rear un enlace simblico Ellamado Nacceso directoO en Windo.sFD en la carpeta /var/www/D Aue 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 directorio 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 Aplicaciones 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/nom re5de5tu5usuario# *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(icando el directorio ra@ de tu Web local


En la terminalD na5ega con el comando cd hasta el directorio de Apache donde se almacenan los archi5os de con(iguracin de los sitios Web hospedados7
cd /etc/apache2/sites-availa le/

A continuacinD lista los archi5os de esa carpeta con el comando ls Eele eseF seguido de la opcin -l EeleF Aue te permitir2 listarlos uno debajo del otro Esin la opcin -lD se
8%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

mostraran uno al lado del otroF# =er2s algo como lo Aue sigue7
eugenia@cocochito:~$ cd /etc/apache2/sites-availa le/ eugenia@cocochito:/etc/apache2/sites-availa le$ ls -l total ! -rw-r--r-- 1 root root +(' 2'11-1'-21 22:12 default

El archi5o default es el Aue modi(icaremos# Para modi(icar el archi5o defaultD 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
Document oot /var/www

R modi(cala por7
7ocument8oot /home/tu-usuario/curso-php

A continuacinD el bloAue Aue establece directi5as de con(iguracin especiales para el directorio ra@ de tu Web local# 'icho bloAueD es el Aue comien@a por7
!Directory /var/www/9

0eempla@a allD php/

/var/www/

por /home/tu-usuario/curso-

:7irector* /home/tu-usuario/curso-php/9

uarda los cambios & cierra edit# ,inalmenteD tendremos Aue reiniciar Apache para Aue los cambios se 5ean re(lejados# Para elloD en la terminalD escribe7
8/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

sudo /etc/init.d/apache2 restart

>omo bien comentamos antesD hubiese sido posibleD crear un enlace simblico en /var/www/ Aue apuntara a /home/tuusuario/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 miwe D dentro del directorio /var/www/ & Aue apunte a /home/eugenia/cursophp/ deberamos haber hecho lo siguiente7
cd /var/www/ sudo ln -s /home/eugenia/curso-php/ miwe

Entonces cuando accediHramos hubiHsemos estado 5iendo /home/eugenia/curso-php/#

a los

/var/www/miwe / archi5os de

81

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>onociendo PHP
EtiAuetas de apertura & cierre
>omo se explic anteriormenteD existen dos posibilidades para de(inir Aue un 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A=I-47 Para poder utili@ar S"! Eadem2s de PHPFD se recomienda establecer el 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 com ination. Eith the wide spread use ? of FGH and use of these tags * other languages3 the server can ecome easil* ? confused and end up parsing the wrong code in the wrong context. Iut ecause ? this short cut has een a feature for such a long time3 itCs currentl* still ? supported for ac6wards compati ilit*3 ut we recommend *ou donCt use them. ? 7efault Jalue: Kn ? 7evelopment Jalue: Kff ? #roduction Jalue: Kff ? http://php.net/short-open-tag 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

)tese Aue no existe posibilidad shortBopenBtag en tiempo de ejecucin#

de

modi(icar

>onocer el 5alor actual de shortBopenBtag


Para conocer el 5alor actual de short$open$tagD ejecute el siguiente comando en una terminal7
php -r Cecho phpinfo$%?C L grep short5open5tag

*na (orma resumida de lo anteriorD puede ser tambiHn7


php -i L grep short5open5tag

dnde el par2metro -i da la misma salida Aue phpinfo'( TambiHn puede buscar este 5alorD directamente en el archi5o php#ini7
grep short5open5tag /etc/php5/apache2/php.ini

A=I-47 0eemplace )etc)php5)apache2)php.ini php#ini en su ser5idorD de ser necesario# por la ruta del

Instrucciones & 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 simples D siempre deben (inali@ar con un
8C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

punto & coma EVF mientras Aue las estructuras de control D encerrer2n dichas instrucciones entre lla5es [ \#
:Aphp estructura de control * instrucciMn 1+ instrucciMn 2+ , A9

Identacin en PHP
PHP es un lenguaje Aue no reAuiere de identacin EsangradoF para ser interpretado# Por el contrarioD todo el cdigo (uente PHP puede ser escrito sin identacinD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

estructura de control 1.2 N instrucciMn d? O

estructura de control 2 N instrucciMn e? O A9

Impresin en pantalla
En PHPD existen 5arias (unciones para imprimir contenido en pantalla# !as dos (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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

=ariables & tipos de datos b2sicos


*na 5ariable es elemento destinado a almacenar datos# ]staD puede almacenar 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(inicin 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 5alores7 para asignar 5alor a una 5ariableD se coloca el sigo igual EaF segudio del 5alor# Tipos de datos7 cuando el 5alor de una 5ariableD es una 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

HstosD n3meros enteros o de coma (lotanteF & los booleanos D 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 5ariables7

ejemplo

de

de(inicin

&

asignacin

de

:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51 Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? A9

Es posible adem2sD asignar a una 5ariable el 5alor de otra 5ariable7


:Aphp $nom re5de5producto5por5defecto Q D#roducto alimenticioD? -nom.re$producto & -nom.re$de$producto$por$defecto+ echo $nom re5producto? // imprime: #roducto alimenticio A9

TambiHn es posibleD insertar el 5alor de una 5ariableD dentro de una cadena de texto 7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q /-nom.re$de$producto$por$defecto en oferta/? echo $nom re5producto? // imprime: #roducto en oferta A9

??

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Pero IAuH sucede si se necesita concatenar el 5alor de una 5ariable a una cadena de texto pero sin mediar espaciosJ Por ejemploD si en el caso anteriorD se desea Aue `nombreBproducto sea KProductos en o(ertaK# Estos casosD se resuel5en en5ol5iendo dicha 5ariable entre lla5es7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q D*-nom.re$de$producto$por$defecto,s en ofertaD? echo $nom re5producto? // imprime: #roductos en oferta A9

En PHPD tambiHn es posible concatenar 5ariables mediante el operador de concatenacin KpuntoK E#F7
:Aphp $nom re5de5producto5por5defecto Q D#roductoD? $nom re5producto Q -nom.re$de$producto$por$defecto . / en oferta/? echo $nom re5producto? // imprime: #roducto en oferta A9

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!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51 Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51 Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5producto Q /'-codigo$de$producto( -nom.re$producto. Precio0 12D -precio.-/+ A9

Para modi(icar una 5ariable D reempla@ando su 5alorD solo basta con reasignarle datos7
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51 Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5producto Q D$$codigo5de5producto% $nom re5producto. #recio: R"7 $precio.-D? echo $detalles5del5producto? $detalles5del5producto Q DSo ha* detalles definidosD? print $detalles5del5producto? A9

)ullD var$dump'( e isset'(


)o solo es posible modi(icar el 5alor de una 5ariable# TambiHn es posible7 aF 5aciarla manteniendo su tipo7

?/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

:Aphp $producto Q D)oca-)ola x 135 Hts.D? -producto & //+ A9

bF 5aciarla sin conser5ar su tipo7


:Aphp $producto Q D)oca-)ola x 135 Hts.D? -producto & 3144+ A9

cF oD eliminarla EdestruirlaF por completo7


:Aphp $producto Q D)oca-)ola x 135 Hts.D? unset'-producto(+ A9

En todo momentoD PHP nos permite conocer el tipo & 5alor de una 5ariableD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

var$dump'( imprimir2 los resultados en pantalla Etipo & 5alor de una 5ariableFD pero tambiHnD es posible conocer el tipo de una 5ariable Eno su 5alorFD sin 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

I 3144 o unset'(J I>u2l de los dos usarJ >uando una 5ariable &a no es necesariaD debe priori@arse el uso de unset sobre 3144D &a Aue con unset'(D se libera la
?6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

direccin de la memoria en la cual haba sido escrita dicha 5ariable#

"alas pr2cticas con 5ariablesD Aue a(ectan el uso de memoria


Es posible tambiHnD agregar a una 5ariableD otros datos al (inal de la cadena# Para elloD se utili@a el signo punto E#F antecediendo al signo igualdad EaF7
:Aphp $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio Q 2.,5? $vence Q &alse? $ha*5stoc6 Q -rue? $stoc65en5deposito51 Q 2'? $stoc65en5deposito52, Q 5? $stoc65en5deposito5,2P Q 5!? $detalles5del5producto $detalles5del5producto $detalles5del5producto $detalles5del5producto $detalles5del5producto $detalles5del5producto $detalles5del5producto Q D$D? .& $codigo5de5producto? .& D% D? .& $nom re5producto? .& D #recio: R"7 D? .& $precio? .& D.-D?

echo $detalles5del5producto? A9

Pero esta pr2cticaD reduce el rendimiento de la aplicacinD &a Aue cada instruccinD ser2 almacenada en una direccin de memoria di(erenteD mientras Aue de la (orma anteriorD solo reAuiere una direccin de memoria para su almacenamiento#

?G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4peradores aritmHticos
PHP permite reali@ar operaciones aritmHticas de lo m2s 5ariadas & por consiguienteD utili@ar PHP Kcomo calculadoraK# Para elloD disponemos de los siguientes operadores aritmHticos7 4peradores aritmHticos
Ejemplo
-$a $a T $a $a U $a / $a V $ $ $ $ $

Nombre
Negacin Adicin Sustraccin Multiplicacin Di!isin Mdulo

Resultado
Opuesto de $a. Suma de $a y $b. Diferencia de $a y $b. roducto de $a y $b. "ociente de $a y $b. Resto de $a di!idido por $b.

0e(erencia del manual o(icial de PHP7 http7++...#php#net+manual+es+language#operators#arithmetic#p hp

Haciendo c2lculos con el I=A


:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto 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 Aplicaciones 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 resuelto o (eature objetableJ


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? $ !2 Q 1'? echo $a T $ ?C

)o obstanteD si se intenta reali@ar una operacin aritmHtica con cadenas de textoD Aue adem2s de n3merosD inclu&an otro caracterD PHPD en 5e@ de (allar & a5isarnos del errorD pasar2 por alto la 5ariable con(licti5a7
55eugenia51+,45esP855@m*dream:~$ php -r C$a Q D122D? $ 1' Q 1'? echo -a 7 -.?C

Existe una (uncin para con5ertir el tipo de una 5ariable


%9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

settype'-varia.le8 /nuevo$tipo/(7
55eugenia51+,45esP855@m*dream:~$ php -a Bnteractive shell php 9 $a Q D22 man@anasD? php 9 settype'-a8 /integer/(+ php 9 var5dump$$a%? int$22% php 9

*tili@ando settypeD KpodramosK operaciones aritmHticas seguras7


:Aphp $a Q D22 man@anasD? $ Q 1'? settype'-a8 /integer/(+ echo $a T $ ? # salida: 45 A9

asegurarnos

reali@ar

-in embargo Iprueba cdigoJ


$a Q Dman@anas 22D? $ Q 1'? sett*pe$$a3 DintegerD%? echo $a T $ ?

Aue

sucede

al

ejecutar

este

A=I-47 )o con(es en settype'( para e(ectuar operaciones aritmHticas# Es pre(erible e5itar su uso para estos casos#

%$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

HT"! & PHP en un mismo archi5o


>omo se coment anteriormenteD es posible Kme@clarK cdigo HT"! con PHPD sin 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 colocar cdigo HT"! embebido dentro de 5ariables de PHP
:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? $producto Q D:p9: 9#roducto::/ 9 $$codigo5de5producto% $nom re5producto: r/9 : 9#recio::/ 9 R"7 $precio5neto.- $BJP incluido%:/p9D? A9 :Wdoct*pe html9 :html9 :head9 :title97etalles del producto :Aphp echo $nom re5producto? A9:/title9 :/head9 : od*9 :Aphp echo $producto? A9 :/ od*9 :/html9

%8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

*na buena pr2tica para e5itar lo anterior


:Aphp $alicuota5iva Q 21? $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? $iva Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? A9 :Wdoct*pe html9 :html9 :head9 :title97etalles del producto :Aphp echo $nom re5producto? A9:/title9 :/head9 : od*9 :p9: 9#roducto::/ 9 $:Aphp echo $codigo5de5producto? A9% :Aphp echo $nom re5producto? A9: r/9 : 9#recio::/ 9 R"7 :Aphp echo $precio5neto? A9.- $BJP incluido%:/p9 :/ od*9 :/html9

A=I-47 )tese Aue la instruccin !"&-foo+ "# es una abre5iacin de !"php echo -foo+ "# la cual solo se ejecutar2 de (orma satis(actoria desde la 5ersin /#% de PHPD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>omentando & documentando el cdigo (uente


*na de las pr2cticas m2s recomendadasD consiste en KcomentarK el cdigo (uente# >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 comentarios de una sola lnea D pueden escribirse antecedidos de una doble barra diagonal E++F o una almohadilla EYF7
:Aphp "" al6c&ota del 789 (en +orcenta:e) $alicuota5iva Q 21? "" ;atos del +rod&cto $codigo5de5producto Q 124!? $nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? # +recio sin 789 "" C%lc&los relacionados al 789 $iva Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? # .recio con 789 incl&ido A9

4tra utilidad de comentar el cdigo (uenteD es recomendarnos aAuello Aue nos Aueda por hacer# Para elloD se utili@a la palabra T4'4 Edel inglHs Kto doK Aue en 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$nom re5producto Q DPgua Gineral Ganantial x 5'' mlD? $precio5 ruto Q 2.,5? # +recio sin 789 "" C%lc&los relacionados al 789 $iva Q 2.,5 U 21 / 1''? $precio5neto Q $precio5 ruto T $iva? # .recio con 789 incl&ido # 5%D% calc&lar desc&entos +or cantidad A9

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

#" A9

%/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Inclusin de archi5os en PHP


PHP nos permite insertar cualAuier tipo de archi5os con (ormato de textoD dentro de un archi5o PHP# Entre los tipos de archi5os Aue podemos insertar dentro de un (ichero #phpD se encuentran aAuellos con las siguientes extensiones7 #phpD #txtD #htmD #htmlD 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 8D la ruta local o remota del archi5o a ser incluido# Ejemplos de inclusin 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

re;uire5once$Darchivo.htmD%? A9

Ejemplos de inclusin de archi5os remotos7


:Aphp include$Dhttp://www.miwe .com/archivo.phpAfooQ arD%? include5once$Dhttp://www.miwe .com/archivo.phpD%? re;uire$Dhttp://www.miwe .com/archivo.htmlD%? re;uire5once$Dhttp://www.miwe .com/archivo.txtD%? A9

'i(erencia entre inclusin de archi5os remotos & locales


*na di(erencia (undamentalD entre incluir archi5os remotos & archi5os localesD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

)o obstanteD PHP dispone de una (uncin alternati5a -4!4 para estos casos Einclusin de archi5os remotos &a interpretadosF Aue incluso permite almacenar los datos recibidos en una 5ariable7
$contenido Q file5get5contents$Dhttp://miwe .com/mi5fichero.phpAfooQ15D%?

'i(erencia entre include & reAuire


-i bien las (unciones reAuireEF e includeEF de PHP reali@an una accin similar 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 & reAuire 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Estructuras de >ontrol Parte I EcondicionalesF


'e(inicin
*na estructura de control es un bloAue de cdigo Aue permite tomar decisiones de manera din2mica D sobre cdigo existente#

>ondicionales 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

if $condiciMn P% N // algoritmo si se cumple condiciMn P O else if $condiciMn I% N // algoritmo si se cumple condiciMn I O else N // algoritmo si no se cumplen las condiciones anteriores O

4peradores lgicos & de comparacin


Para e5aluar condicionesD no solo podemos recurrir a si KA es igual a BK# Existen otros operadores Aue nos permiten e5aluar di(erentes condiciones# Estos operadores se denominan operadores lgicos & son aAuellos Aue nos permiten e5aluar m3ltiples condiciones en un mismo proceso D mientras Aue se denominan operadores de comparacin D a aAuellos Aue utili@amos para e5aluar EcompararF la relacin existente enntre elementos#

4peradores de comparacin
Ejemplo
#a $$ #%

Nombre
&gual

Resultado
TRUE si $a es igual a $b despu's de la manipulacin de tipos. TRUE si $a es igual a $b( y son del mismo tipo. TRUE si $a no es igual a $b despu's de la manipulacin de tipos. TRUE si $a no es igual a $b despu's de la manipulacin de tipos. TRUE si $a no es igual a $b( o si no son del mismo tipo. TRUE si $a es estrictamente menor ,ue $b. TRUE si $a es estrictamente mayor ,ue $b.

#a $$$ #% &d'ntico #a )$ #% #a *+ #% #a )$$ #% #a * #% #a + #% #a *$ #% #a +$ #% Diferente Diferente No id'ntico Menor ,ue Mayor ,ue

Menor o igual ,ue TRUE si $a es menor o igual ,ue $b. Mayor o igual ,ue TRUE si $a es mayor o igual ,ue $b.

/9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

'i(erencia entre igualdad e idHntico en la comparacin


A=I-47 )tese Aue la di(erencia principal entre igualdad EaaF e idHntico EaaaFD es Aue el primero con5ierte ambos elementos al mismo tipo Eanulando asD la 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 $ $c $d $e $a $a $a $a Q Q Q Q Q 1'? D1'D? 11? '? &alse? -rue &alse &alse -rue $d $d $d $d QQ $e QQQ $e WQ $e WQQ $e -rue &alse &alse -rue

QQ $ QQQ $ WQ $ WQQ $

4peradores lgicos
Ejemplo
#a and #% #a or #% #a -or #% ) #a #a // #% #a 00 #%

Nombre
And (y) Or (o inclusi!o) .or (o e-clusi!o) Not (no) And (y) Or (o inclusi!o)

Resultado
TRUE si tanto $a como $b son TRUE. TRUE si cual,uiera de $a o $b es TRUE. TRUE si $a o $b es TRUE( pero no am%os. TRUE si $a no es TRUE. TRUE si tanto $a como $b son TRUE. TRUE si cual,uiera de $a o $b es TRUE.

En el manual o(icial de PHP http7++...#php#net+manual+es+language#operators#logical#phpD


/$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

podemos 5er una le&enda Aue dice7 "La razn para tener las dos variaciones 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 condicionales
E5aluando una 3nica condicin7
$a Q 1'? if $$a QQ 1'% N echo DY$a es igual a 1'D? O

Bniciar P en 1' si $P es igual a 1'%3 entonces imprimir CP es igual a 1'C

4 tambiHnD tomar una decisin si la condicin se cumple & otra si no se cumple7


$a Q 1'? if $$a QQ 1'% N echo DY$a es igual a 1'D? O else N echo DY$a SK es igual a 1'D? O

TambiHn podemos conbinar else e i(D para tomar tantas decisiones como condiciones Auieran e5aluarse7

/8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$a Q 15? if $$a QQ 1'% echo DY$a O else if $$a echo DY$a O else if $$a echo DY$a O

N es QQ es QQ es

igual a 1'D? 12% N igual a 12D? 15% N igual a 15D?

R si a lo anterior le agregamos else estaramos cubriendo todas las posibilidades7


$a Q 15? if $$a QQ 1'% echo DY$a O else if $$a echo DY$a O else if $$a echo DY$a O else N echo DY$a O N es QQ es QQ es

igual a 1'D? 12% N igual a 12D? 15% N igual a 15D?

SK es ni 1' ni 12 ni 15D?

A=I-47 -e debe tener especial cuidado en la comparacin de n3meros reales E(lotantesF# =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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Estructuras de control con -.itch


-.itch es una de las estructuras de controlD Aue mejor se disponen para 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 los di(erentes posibles 5alores de la misma7
$numero5dia Q date$CSC%? "# la 0&nci?n nati)a date() de ./., +ermite dar 0ormato a la 0ec,a local , retorna &n n@mero de 1 a A, (&e re+resenta el n@mero de d6a de la semana, siendo 1 L&nes ' A domingo. Bsta 0&nci?n, ser% )ista con 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.+,+ #" $nom re5dia Q CC? switch $$numero5dia% N case 1: $nom re5dia Q DHunesD? rea6? case 2: $nom re5dia Q DGartesD? rea6? case 2: $nom re5dia Q DGiZrcolesD? rea6? case !: $nom re5dia Q D[uevesD? rea6?

/%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

case 5: $nom re5dia Q DJiernesD? rea6? case (: $nom re5dia Q D"= adoD? rea6? case ,: $nom re5dia Q D7omingoD? rea6? default: $nom re Q DSo sa emos ;ue d<a esD? O

El (uncionamiento de s.itch puede resultar complejo de entender en un comien@o# Pero 5a a ir paso a paso# -.itch tiene una sintaxis b2sica Aue se compone de7
switch $$varia le% N case Dposi le valor 1D: "" algoritmo a e:ec&tar si *)ariable DD "+osible )alor 1" rea6? case Dposi le valor 2D: "" algoritmo a e:ec&tar si *)ariable DD "+osible )alor 5" rea6? default: "" algoritmo a e:ec&tar si )alor 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 Aplicaciones 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 $$varia le% N case Dposi le valor 1D: case Dposi le valor 2D: case Dposi le valor 2D: "# algoritmo a e:ec&tar si el )alor de *)ariable es +osible )alor 1, +osible )alor 2 o +osible )alor 5 #" rea6? case Dposi le valor !D: "# 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 utili@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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

/6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Tipos de 'atos complejos7 "atrices simples & multidimensionales


"atrices en PHP
*na matri@ Earra&F es un mapa de datos ordenado Aue asocia Kcla5esK a sus 5alores correspondientes# Es asD Aue estas matricesD nos son de gran utilidad para crear desde diccionarios de datos hasta 2rboles de m3ltiples diccionarios#

-intaxis b2sica
!a sintaxis b2sica se compone de7
arra*$clave Q9 valor3 %?

'onde cla5eD puede ser un entero7


$nom res5de5mu>er Q arra*$' Q9 CPnaC3 1 Q9 C/a rielaC3 2 Q9 C)eciliaC3 %?

4 una cadena de texto 7


$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3 C[avierC Q9 C!+21 \ 12''C3%?

R 5alorD cualAuier tipo de dato7


/G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$datos5de5>uan Q arra*$CapellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,252'C3 C-ra a>oC Q9 C!('!+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %?

!a (orma para declarar un arra&D es simplemente asignarlo a una 5ariableD teniendo en cuentaD Aue un arra&D puede estar inicialmente 5aco7
$mi5arra* Q arra*$%?

Imprimir en pantalla con printBr


Para imprimir una matri@ completa en pantalla D se puede utili@ar la (uncin print$r'-array(7
php 9 $arra* Q arra*$' Q9 CPnaC3 1 Q9 C/a rielaC3 2 Q9 CSoeliaC3%? php 9 print$r'-array(+ Prra* $ ]'^ Q9 Pna ]1^ Q9 /a riela ]2^ Q9 Soelia % php 9

Acceso a los tems de un arra&


Para acceder a un item del arra& D se puede reali@ar haciendo una llamada a su 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A=I-47 !a sintaxis b2sica para acceder -array;indice< o -array;=clave=< a un arra& es

!os 5alores de un arra&D pueden no tener una cla5e explcitamente asociada 7


$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%?

En ese casoD siempre se acceder2 a ellos por su n3mero de ndice7


$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? echo $mi5arra*]2^? "" im+rimir% F&lia

"odi(icando elementos
Para modi(icar un elementoD basta con acceder a Hste & asignare un nue5o 5alor7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? $mi5arra*]2^ Q CFimenaC? echo $mi5arra*]2^? "" im+rimir% Gimena

Agregar elementos
Para agregar un 5alor a un arra& existenteD se asigna Hste a un ndice 5aco7
$mi5arra* Q arra*$CPnaC3 C/a rielaC3 C[uliaC3 CSoeliaC%? $mi5arra*]^ Q C)eciliaC? print5r$$mi5arra*%?

El nue5o 5alorD ser2 agregado al (inal de la lista7

19

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

php 9 print5r$$mi5arra*%? Prra* $ ]'^ Q9 Pna ]1^ Q9 /a riela ]2^ Q9 [ulia ]2^ Q9 Soelia ]!^ Q9 )ecilia %

Pero si se desea asociar dicho 5alor a una cla5e D Hsta debe indicarse7
$telefonos5de5amigos Q arra*$C[uanC Q9 C15 !'1,-252'C3 C[avierC Q9 C!+21 \ 12''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 5aco# El uso de un string 5aco como cla5e D crear2 Eo reempla@ar2F una cla5e con un string 5aco & su 5alorV no es lo mismo Aue usar corchetes 5acos #

=ale aclarar adem2sD Aue si por error intentamos agregar un nue5o elementoD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Estructuras de >ontrol Parte II Ebucles IF


0ecorriendo matrices din2micamente con (oreach
6oreach es un constructor nati5o de PHPD Aue permite reali@ar operaciones iterati5as EcclicasF con matricesD recorriendo uno a uno los elementos de una matri@D comen@ando por el primer elemento#

-intaxis b2sica del constructor (oreach


foreach$$arra* as $valor5del5elemento% N "" algoritmo a realiEar con cada &no de los elementos O

'nde -array ser2 el nombre de la matri@ a ser iterada & -valor$del$elementoD un nombre Aue utili@aremos como identi(icador del elementoD el cual retornar2 su 5alor7
$nom res5propios Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPl ertoC3 C)eciliaC3 C)arlosC3%? foreach$$nom res5propios as $nom re% N echo $nom re . chr$1'%? O "# -alida: 9na F&lia L&isa 9lberto Cecilia Carlos #"

18

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Es posible tambiHnD iterar obteniendo las cla5es de cada elementoD adem2s de su 5alor# Para elloD se utili@a la siguiente sintaxis7
foreach$$arra* as $clave Q9 $valor% N "" algoritmo a e:ec&tar en cada iteraci?n O

*n ejemplo de iteracin compleja con foreach


$datos5de5>uan Q arra*$CPpellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,-252'C3 C-ra a>oC Q9 C!('!-+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %? foreach$$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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A=I-47 !a (uncin is$array'-array( nos permite e5aluar una 5ariable & conocer si su tipo es Karra&K# 'e5uel5e 5 1> si e(ecti5amente es un arra& & 6?42> en caso contrario#

"odi(icando matrices din2micamente 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' ]-ra a>o^ Q9 !('!-+''' % ])asado^ Q9 1 ]#asaporte^ Q9 %

Es decirD Aue ese datoD solo (ue modi(icado en un 2mbito localD el cual aplica 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
1%

el

5alor

por

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

re(erencia# *na asignacin por antecediendo el signo c al 5alor7

re(erenciaD

se

reali@a

$datos5de5>uan Q arra*$CPpellidoC Q9 C#Zre@C3 C&echa de nacimientoC Q9 C22-11-1+,'C3 C-elZfonosC Q9 arra*$C)asaC Q9 C!21'-+'2'C3 CGMvilC Q9 C15 !'1,-252'C3 C-ra a>oC Q9 C!('!-+'''C%3 C)asadoC Q9 -rue3 C#asaporteC Q9 &alse3 %? foreach$$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' ]-ra a>o^ Q9 !('!-+''' % ;Basado< &# 2C ;Pasaporte< &# 3%

!a asignacin por re(erencia D suele ser mu& 3tilD cuando por ejemploD se necesita aplicar una misma (uncinD a todos los elementos de un arra& Epor ejemploD con5ertir a ma&3sculas
1/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

todos los 5aloresD con la (uncin strtoupper'(D nati5a de PHPF7


$nom res Q arra*$CPnaC3 C[uliaC3 CHuisaC3 CPl ertoC3 C)eciliaC3 C)arlosC3%? foreach$$nom res as _$nom re% N $nom re Q strtoupper$$nom re%? O print5r$$nom res%? "# 9rra' ( K0L DM 9 9 K1L DM F!L79 K2L DM L!7-9 K5L DM 9LNB21J K4L DM CBC7L79 K5L DM C92LJ) #"

11

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Estructuras de >ontrol Parte III Ebucles IIF


WhileD un bucle simple
As como foreach puede parecer uno de los bucles m2s complejosD whileD resulta ser el m2s simple de todos# DhileD simplemente e5aluar2 de (orma booleana Etrue o (alseF una expresin de iterati5amenteD hasta Aue la expresin e5aluada retorne 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 ejemplo sencillo
$n Q '? while $$n :Q 5% N echo $n . chr$1'%? $nTT? "" incremento el )alor de *n en 1. B(&i)ale a *n D * O 1P O

!ectura humana7
iniciar S en cero

16

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

mientras ;ue $S sea menor o igual a 5% N imprimir S incrementar S O

*n ejemplo pr2ctico
$*ears Q arra*$%? $*ear Q 1++'? while $$*ear :Q 2'''% N $*ears]^ Q $*ear? $*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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"# 9rra' ( ) #"

'o .hileD tan simple como .hile pero con una 5entaja
El bucle doL.hile esD como indica el ttuloD tan simple como .hile & (unciona de 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 ejemplo simple
$*ears Q arra*$%? $*ear Q 1++'? do * $*ears]^ Q $*ear?

1C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$*earTT? , while $$*ear : 1++'%? print5r$$*ears%? "# 9rra' ( K0L DM 1HH0 ) #" print $*ear? // 1++1

69

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Bucles (orD los m2s complejos de PHP


!os bucles (or son los ciclos iterati5os m2s complejos de los cu2les se dispone en PHP# ]stosD e5al3an ? expresiones en cada iteracinD siguiendo este esAuema7 Primera expresin7 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 expresin7 se ejecuta al (inal de cada iteracin

-intaxis7
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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

for $$i Q 13 $prefi>o Q D)odigo S` '''D? $i :Q !? $sufi>o Q chr$1'%3 $iTT% N echo DN$prefi>oON$iON$sufi>oOD? O "# Codigo Codigo Codigo Codigo #" R R R R 0001 0002 0005 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 Codigo Codigo R 0001 R 0002 R 0005

68

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Codigo #"

R 0004

A=I-47 -i la segunda expresin est2 5aca D el bucle ser2 corrido de (orma inde(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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>uriosidades sint2cticas de la bipolaridad no diagnosticada de PHP


<ueremos a PHP & por eso lo usamos IciertoJ Pero aAuello de Aue Kel amor es 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 Aplicaciones 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 lo 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 N operador sint2cticoOD Aue se utili@a para Nsaltar O 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 ejemplo no Lpr2ctico 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

mi$etiKueta0 echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%? echo DX esta tam iZnWD . chr$1'%? A9

!o anteriorD generar2 la siguiente salida7


eugenia@cocochito:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mostrado N esta tam.iOnF eugenia@cocochito:~/cursophp asico$

-in embargoD al no tener las etiAuetas de(inidasD un identi(icador de cierre &D PHPD ser un lenguaje Aue no reAuiere de identacin para la de(inicin de 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 tam iZn se muestra :/D . chr$1'%? A9

R aAuD la prueba7
eugenia@cocochito:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mostrado mmmm... esta tam.iOn se muestra 0) eugenia@cocochito:~/cursophp asico$

61

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Por lo tantoD utili@ar gotoD puede ser engorroso &a Aue para e5itar lo anteriorD deberan especi(icarse m2s & m2s etiAuetas & m2s & m2s gotos7
:Aphp echo D.ola GundoWD? goto mi5eti;ueta? echo D1sto no se mostrar=3 *a ;ue 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:~/cursophp asico$ php -f file.php Hola LundoF >sto sM serI mostrado eugenia@cocochito:~/cursophp asico$

Puedes 5er m2s sobre gotoD le&endo la documentacin o(icial7 http7++...#php#net+manual+es+controlLstructures#goto#php

66

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

,unciones de(inidas por el usuario


'e(inicin
*na (uncinD es una (orma de agrupar expresiones & sentencias EalgoritmosF Aue realicen determinadas accionesD pero Aue HstasD solo se ejecuten cuando son llamadas Eal igual Aue las (unciones nati5as de PHPF#

'eclarando ,unciones
-intaxis b2sica
!a sintaxis b2sica de una (uncinD es 5erdaderamente sencilla7
function nom re5de5la5funcion'parametros( * "" algoritmo ,

-obre el nombre de las (unciones


Para el nombre de las (uncionesD aplica todo lo dicho para el nombre de 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

function nom re5de5la5funcion'parametroP8 parametro2( * "" algoritmo , function otra5funcion'( * "" algoritmo ,

!os par2metrosD se indican entre los parHntesisD a modo de 5ariablesD a (in de poder utili@arlos como talD dentro de la misma (uncin7
function nom re5de5la5funcion'-parametroP8 -parametro2( * "" algoritmo ,

Adem2sD a cada par2metroD se le puede asignar un 5alor por de(ecto de cualAuier tipo7
function nom re5de5la5funcion'-nom.re8 -edad&258 -seQo&=6=( * "" algoritmo ,

!lamando a una (uncin


*na (uncin no ser2 ejecutada nuncaD hasta Aue no se la llame7
:Aphp function hola5mundo$% N echo D.ola GundoWD . chr$1'%? O A9

)inguna salida ser2 obtenida de lo anteriorD puesto Aue la (uncinD no ha sido llamada7
eugenia@cocochito:~$ php -f file.php eugenia@cocochito:~$

6C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Para llamar a una (uncin D simplemente debe especi(icarse su nombreD en el lugar preciso donde se desea Aue Hsta se ejecute# -iempre deben incluirse los 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 (inalidad de las (unciones


*na (uncinD puede tener cualAuier tipo de algoritmo & cualAuier cantidad de ellos &D utili@ar cualAuiera de las caractersticas 5istas hasta ahora# )o obstante elloD una buena pr2cticaD indica Aue la (inalidad de una (uncinD debe ser reali@ar una 3nica accinD reutili@able & por lo tantoD tan genHrica como sea posible#

Paso de 5ariables por re(erencia en (unciones


Al igual Aue en el bucle (oreachD es posible pasar 5ariables por re(erencia a una (uncin#
G9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Para elloD al de(inirse la (uncinD debe colocarse el signo NcO antecediendo a 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 modificar5varia le5glo al$A-varia.le3 $otro5parametro% N $varia le Q $varia le U $otro5parametro? O "" llamamos a la 0&nci?n +asando como re0erencia la )ariable global modificar5varia le5glo al$-mi$varia.le$glo.al3 2%? "" im+rimimos la )ariable global echo -mi$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 modificar5varia le5glo al$$otro5parametro% N glo.al $mi5varia le5glo al? $mi5varia le5glo al Q $mi5varia le5glo al U $otro5parametro? O "" llamamos a la 0&nci?n modificar5varia le5glo al$2%? "" im+rimimos la )ariable global echo -mi$varia.le$glo.al? "" salida: 20

G$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A=I-4 )tese Aue si la 5ariable global a la cual se hace re(erencia dentro de la (uncinD no ha sido declarada pre5iamenteD glo.al -mi$varia.le crear2 la 5ariable 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$%? $una5varia le 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

echo call$user$func$$funcion%? echo chr$1'%? "" contin&aci?n del algoritmo O llamar5a5otra$=decir$hola=%?

Pasar argumentos en una llamada de retorno


I<uH sucede si la (uncin a la cual se desea llamarD necesita recibir uno o m2s argumentosJ En este casoD tenemos dos opciones7 $F Pasar los argumentos a continuacin del nombre de la (uncin7
call5user5func$Cnom re5de5la5funcionC3 $parametro13 $parametro2%?

Ejemplo7
"" 3&nci?n (&e llamarI con call_&ser_0&nc function sumar5dos5numeros$$a3 $ % N return $a T $ ? O $numero51 Q 5? $numero52 Q 1'? $resultado Q call5user5func$Csumar5dos5numerosC3 $numero513 $numero52%? echo $resultado?

8F 'e(inir un arra& con todos los argumentos necesariosD & hacer la llamada de retorno ampliada7
call5user5func$array$Cnom re5de5la5funcionC3 $arra*5con5argumentos%?

Ejemplo7
G?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"" 3&nci?n (&e llamarI con call_&ser_0&nc_arra' function sumar5dos5numeros$$a3 $ % N return $a T $ ? O $args Q arra*$53 1'%? $resultado Q call$user$func$array$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 D8eci imos 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4btener una lista completa de todos los argumentos


Es posible obtener una matri@ Earra&F con todos los argumentos recibidos# Para 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 (uncin puede ser llamada EcallableF


Cuando decimos callable nos referimos a si la funcin existe y adems, puede ser llamada.
G/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>uando trabajamos con llamadas de retornoD asumimos Aue nuestro scriptD 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 funcion5calla le$% N echo DHlamada correctaD? O function llamar5a5funcion5calla le$$funcion% N if$is$calla.le'$funcion(% N call5user5func$$funcion%? O else N echo DHa funciMn no es calla leD? O O llamar5a5funcion5calla le$Cfuncion5calla leC%? "" salida: Llamada correcta llamar5a5funcion5calla le$Cfuncion5inexistenteC%? "" salida: La 0&nci?n no es calleable

"aterial 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 Aplicaciones 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 llamada 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 calla le5func51$$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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

if$is5calla le$$funcion%% N $result Q call$user$func$array'-funcion8 -argumentos(? O return $result? O "" im+lemenatci?n $args Q arra*$1'3 53 2%? $resultado Q forma51$Ccalla le5func51C3 $args%? echo $resultado?

,orma 87 recibir argumentos $ a $


"" 0&nci?n callable function calla le5func51$$arg13 $arg23 $arg2% N $result Q $$arg1 T $arg2% U $arg2? return $result? O "" 0&nci?n (&e ,ar% la llamada de 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$is5calla le$$funcion%% N $result Q call5user5func5arra*$$funcion3 $args%? O

O O

return $result? // implementaciMn $funcion Q Ccalla le5func51C? $arg1 Q 1'? $arg2 Q 5? $arg2 Q 2? $resultado Q forma52$$funcion3 $arg13 $arg23 $arg2%? echo $resultado?

GG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!lamadas recursi5as
-e denomina llamada recursi5a Eo recursi5idadFD a aAuellas (unciones Aue en su algoritmoD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

mismo sucedera si en 5e@ de un enteroD pasara una cadena como par2metro#

C9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Helpers
En programacinD un helper es una (uncin o conjunto de (unciones genHricasD de uso com3nD destinadas a ser5ir de a&uda a otros procesos dentro de un mismo sistema#

*n helper Aue retorna la (echa actual


"# 2etorna la 0ec,a act&al en 0ormato largo, corto o 7-J (can?nico) 9rg&mentos: *0ormato -- largo, retorna la 0ec,a act&al en 0ormato L&nes, 2 de 9gosto de 2011 corto, retorna la 0ec,a en 0ormato 02"0Q"2011 7-J, retorna la 0ec,a en 0ormaro 2011-0Q-02 #" function get5fecha5actual$$formato% N "" de0ino &n arra' con los +atrones de 0ormato $formato5fecha Q arra*$ DlargoD Q9 Dl3 > YdYe & YdYe XD3 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?

C$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

*n helper Aue modi(ica una 5ariable globalD haciendo una llamada de retorno
"# Llama a la 0&nci?n indicada ' reasigna el )alor de &na )ariable global, 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 set5varia le5glo al$_$varia le3 $funcion3 $argumentosQarra*$%% N "" com+r&ebo (&e *0&ncion sea &na 0&nci?n callable if$is5calla le$$funcion%% N $varia le Q call5user5func5arra*$$funcion3 $argumentos%? O O

C8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Taller de ,unciones
En este tallerD 5eremos comoD utili@ando buenas pr2cticas de programacinD nos a&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 necesarios para el taller 'escarga los archi5os Aue utili@aremos en el tallerD pulsando el siguiente enlace7
http7++tallerLdeLphp#eugeniabahit#com+tallerLdeL (unciones#tar#g@

C?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Trabajando con el -istema de Archi5os


PHP dispone de un conjunto de (unciones nati5asD Aue nos permiten trabajar 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 principales (unciones


'e (orma r2pidaD 5eremos aAu como abrir archi5osD leer su contenidoD manipularloD crear archi5os & escribir en ellos# >omencemos;

Apertura de archi5os
-in dudasD cuando solo se reAuiere abrir un archi5o para leer su contenidoD el 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A=I-47 !os corchetes ^ & _ indican Aue el par2metro es opcional#

fopen abrir2 el archi5o en el modo indicado & creando un puntero en el mismo# Puntero: lugar del el archivo en el cual se coloca el cursor al ser a ierto. Toda 5e@ Aue un archi5o sea abiertoD debe cerrarse a (in de liberarlo de la memoria# Para elloD utili@amos fclose'$cursor5creado5con5fopen(7
$cursor Q fopen$Carchivo.txtC3 CrC%? fclose$$cursor%?

"odos de apertura
!os modos posibles de aperturaD los siguientes7
Modo Descripcin r r7 w Lectura Lectura y escritura Escritura Si e arc1i!o no e-iste( intenta crearlo. Si e-iste( lo so%reescri%e. Lectura y escritura Si e arc1i!o no e-iste( intenta crearlo. Si e-iste( lo so%reescri%e. Escritura Si el arc1i!o no e-iste( intenta crearlo. Lectura y escritura Si e arc1i!o no e-iste( intenta crearlo. Escritura "rea un nue!o arc1i!o para escri%ir en 'l. Si el arc1i!o ya e-iste( falla. Lectura y 3scritura C/ Puntero Al inicio del arc1i!o Al inicio del arc1i!o Al inicio del arc1i!o Al inicio del arc1i!o( trunc2ndolo Al final del arc1i!o Al final del arc1i!o Al inicio del arc1i!o Al inicio del arc1i!o

w7 a a7 Q Q7

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"rea un nuevo arc ivo para escri%ir en 'l y luego poder leerlo. Si el arc1i!o ya e-iste( falla. c c7 Escritura Si e arc1i!o no e-iste( intenta crearlo. Lectura y escritura Si e arc1i!o no e-iste( intenta crearlo. Al inicio del arc1i!o Al 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 abrirlo localmente D 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!ectura de Archi5os
*na 5e@ abierto un archi5oD podremos leer su contenido utili@ando la (uncin de lectura en modo binario seguroD fread'(# *tili@ando la siguiente sintaxis7
fread$$recurso3 $ *tes%?

podremos leer el contenido de un archi5o en modo binario seguroD necesitando de un recurso Eobtenido mediante fopenF e indicando la cantidad de b&tes a leer E$ car2cter a $ b&teF# Para leer el contenido completo del archi5oD podemos a&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)

Escribir en un archi5o
Para escribir en un archi5oD nos 5alemos de la (uncin fwrite'( la cu2l escribir2 en modo binario seguro# -u sintaxis es la siguiente7
fwrite$$recurso3 $contenido5a5escri ir]3 $cantidad5de5 *tes5a5escri ir^%?

El contenidoD puede ser cualAuier 5ariable de tipo string D mientras Aue la cantidad de b&tes a escribirD es opcional# -i se
C6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

indica la cantidad de b&tes D se dejar2 de escribir cuando la cantidad de b&tes se ha&a alcan@ado o cuando la cadena termine Elo Aue suceda primeroF#

$archivo Q Darchivo.txtD? $recurso Q fopen$$archivo3 DaTD%? -nuevo$contenido & /nuevo contenido/+ fwrite'-recurso8 -nuevo$contenido(+ $ *tes Q filesi@e$$archivo%? $contenido Q fread$$recurso3 $ *tes%? fclose$$recurso%?

"o5iendo el puntero dentro del archi5o


>uando tenemos Aue escribir un archi5oD es mu& 3til saber en AuH lugar se 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"" 9ct&aliEar el n@mero de )isitas ' mostrarlo echo contador5de5visitas$%?

M>uidado con los permisos;


>omo es lgico de esperarD para poder crear un archi5o o escribir sobre un archi5o existenteD HsteD debe tener permisos de escritura para el usuario ...Ldata# En un ser5idor WebD tener archi5os o directorios ser5idos con permisos de 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 alternati5a D 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#

Trabajando con directorios


>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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

fopen EAue pro5iene de ,ile4pen FD estHs esperando una (uncin llamada do+enD pero lamentablementeD no existe una (uncin llamada dopenD &a Aue PHPD no tiene 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$Cnom re5del5directorioC%?

>omo nombre de directorioD es posible utili@ar tambiHnD cualAuier ruta absoluta7


$recurso Q opendir$C/var/www/dominio.com/pu lic5html/archivos/pdfC%?

o una ruta relati5a 7


$recurso Q opendir$C../archivos/pdfC%? $otro5recurso Q opendir$Carchivos/pdfC%?

Al igual Aue cuando abrimos un archi5oD cuando abrimos un directorioD es necesario cerrarlo para liberarlo de memoria7
closedir$$recurso%?

Explorando el contenido de un directorio


Explorar el contenido de un directorioD es sumamente sencilloD &a Aue disponemos de una (uncin para hacerlo7 readdir'$recurso(# -in embargoD la exploracin de 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 Aplicaciones 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"" itero solo si readdir J de)&el)e 3alse while$$$elemento Q readdir$$dir%% WQQ &alse% N "" e)ito (&e liste los directorios oc&ltos . ' .. if'-elemento F& /./ 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 K1L K2L K5L )

DM DM DM DM

index.+,+ tem+late.,tml 0&nciones.+,+ 0iles

#"

,iltrando el tipo de elemento


>omo 5imos en el ejemplo anteriorD readdir retorna tanto archi5os como 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

is$link'-elemento( )os indica si el elemento e5aluado es un elace simblico ETrueF o no E,alseF# !tese que en "indo#s, los enlaces sim licos son denominados $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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$contenido Q arra*$C7irectoriosC Q9 $directorios3 CPrchivosC Q9 $archivos3 C1nlaces sim MlicosC Q9 $s*mlin6s%? print5r$$contenido%?

!o anteriorD producir2 la siguiente salida7


eugenia@cocochito:~/ orradores$ php -f file.php Prra* $ ]7irectorios^ Q9 Prra* $ ]'^ Q9 files % ]Prchivos^ Q9 Prra* $ ]'^ Q9 index.php ]1^ Q9 template.html ]2^ Q9 funciones.php % ]1nlaces sim Mlicos^ Q9 Prra* $ % %

)tese Aue alternati5amente a las tres (unciones utili@adas en el ejemplo 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 (unciones Aue necesitar2s con (recuencia


"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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

disponemos de las (unciones necesarias#

>omprobar la existencia de un archi5o o directorio


file$eQists$Carchivo5o5directorioC%

>omprueba si un archi5o o directorio existe ETrueF o no E,alseF7


"" )alidando si &n arc,i)o existe $archivo Q Cruta5a/mi5archivo.txtC? if$file$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 archi5o o directorio es legible


is$reada.le$Carchivo5o5directorioC%

>omprueba si un archi5o o directorio es legible ETrueF o no E,alseF7


"" )alidando si &n arc,i)o es legibe $archivo Q Cruta5a/mi5archivo.txtC? if$is$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 Aplicaciones 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 archi5o o directorio puede escribirse


is$writa.le$Carchivo5o5directorioC%

>omprueba si un archi5o o directorio es legible ETrueF o no E,alseF7


"" )alidando si &n arc,i)o +&ede escribirse $archivo Q Cruta5a/mi5archivo.txtC? if$is$writa.le$$archivo%% N echo D1l archivo N$archivoO puede ser escritoD? O 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 (unciones sobre el sistema de archi5os


"2s (unciones sobre el sistema de archi5osD encontrarse http7++...#php#net+manual+es+re(#(iles&stem#php pueden en

$91

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Procesamiento de texto & manipulacin de strings


En este captuloD 5eremos las principales (unciones & (ormas b2sicasD de procesar texto & manipular strings en PHPD las cuales ser2n la base (undamental de las expresiones & algoritmos integrantes de todo sitio Web & aplicacin#

Ampliando la de(inicin de 5ariables de tipo string


>omo hemos 5isto anteriormenteD una cadena de texto en PHPD puede encerrarse tanto entre comillas simples como entre comillas dobles 7
$var51 Q C1sta es una cadena de textoC? $var52 Q D1sta es otra cadena de textoD?

TambiHn disponemos de la posibilidad de delimitar cadenas de texto de gran 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
$varia le Q !!!CD>35C6CB?D% contenido de heredoc CD>35C6CB?D% +

'onde B71S-B&B)P7K8D podr2 ser cualAuier nombre Aue respete las reglas para nombres de 5ariables & el identi(icador de cierreD no podr2 estar sangrado# =eamos un ejemplo7

$96

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$documento Q !!!3%5?$2%R >$H> >D%B 1s mu* importante seaalar ;ue la l<nea con el identificador de cierre no de e contener ningbn caracter3 excepto posi lemente un punto * coma $?%. 1sto significa en particular ;ue el identificador no de e usar sangr<a3 * ;ue no de en existir ningbn espacio ni ta ulaciMn antes o despuZs del punto * coma. 1s mu* importante darse cuenta ;ue el primer caracter antes del identificador de cierre de e 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 $posi lemente seguido de un punto * coma% tam iZn de e 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 do les $D% de en escaparseD?

generar2 un errorD puesto Aue PHP considerar2 el (inal de la cadena de texto en la segunda comilla doble7
$var Q DHas comillas do les $D

& encontrar2 un error de sintaxis a continuacin7


% de en escaparseD?

$9G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Para solucionar este problemaD ciertos caracteres deben escaparseD mediante el uso de una barra diagonal in5ertida S
$var Q DHas comillas do les $S/% de en escaparseD?

>aracteres de escape
Algunos caracteres de escape pueden representarse como se muestra en la siguiente table7
!aracter \n \r \t \v \e \f \\ \$ \" S= "i#ni$icado a!ance de l4nea (L5 o 6-6A (76) en AS"&&) retorno de carro ("R o 6-6D (78) en AS"&&) ta%ulador 1ori9ontal (:; o 6-6< (<) en AS"&&) ta%ulador !ertical (=; o 6-6> (77) en AS"&&) (desde : ?.@.?) escape (3S" o 6-7> (@A) en AS"&&) (desde : ?.B.6) a!ance de p2gina (55 o 6-6" (7@) en AS"&&) (desde : ?.@.?) %arra in!ertida signo del dlar comillas do%les "omilla simple &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

S*-var,

$9C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

,unciones para manipulacin de strings


A continuacinD se mostrar2n las (unciones de uso m2s (recuente para la manipulacin de cadenas de texto# Para obtener un listado completo de (unciones de stringD 5isita el manual o(icial en http7++...#php#net+manual+es+re(#strings#php

,unciones de escape
addslashes'-cadena( escapa una cadena de texto aPadiendo barras in5ertidas a las comillas doblesD siemplesD barras in5ertidas & b&tes nulos# escapar cadenas de texto Aue deban insertarse en bases de datosD & ha&an sido recibidas mediante 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%^ o tendremos 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%^ o tendremos el importe en $D?

$$9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$doc Q ;uotemeta$$doc%? echo $doc? "# -alida: -i se realiEa el clc&lo T(15T#2T)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 * #"

,unciones de con5ersin
htmlentities'-cadena( con5ierte los caracteres aplicables a entidades HT"!# &sta funcin de e utilizarse siempre que una cadena de texto de a ser impresa en un documento '()L y se desconozca su contenido, para prevenir que cdigo fuente no deseado, sea e*ecutado.
$cadena Q DHas negritas se escri en 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 escri en 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Las negritas se escriben entre los tags VbM ' V"bM mientras (&e el salto de 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 blanco D tambiHn 'isponemos de tres (unciones prede(inidas7

es

posible#

ltrim'-cadena(7 Elimina los espacios en blanco del inicio de la cadena rtrim'-cadena(7 los elimina del (inal de la cadena trim'cadena(7 los elimina del inicio & (inal de la cadena

$$8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

,unciones de (ormato
!a (uncin nl2.r'-cadena( nos permite con5ertir saltos de lnea en su representacin 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 $no5cortar5pala ras(# Esta (uncinD recibir2 $ par2metro obligatorio E`cadenaF & tres par2metros opcionales7 -ancho cantidad de caracteres -salto$de$linea el car2cter o patrn Aue se utili@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 li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit definie as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit cu3 eirmod consectetuer signiferum;ue eu per. Bn usu

$$?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

latine e;uidem dolores. cuo no falli viris intellegam3 ut fugit veritus placerat per.D? $formato Q wordwrap$$texto3 ('3 chr$1'%3 -rue%? echo $formato? "# Lorem i+s&m ad ,is scri+ta blandit +artiendo, e&m 0astidii acc&msan e&ri+idis in, e&m liber ,endrerit an. X&i &t Cisi )ocib&s s&sci+iant&r, (&o dicit ridens 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 con5ertir toda una cadena a ma&3sculas con strtoupper'-cadena(D con5ertir solo 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 min3sculas7

pr2ctico

de

con5ersin

de

ma&3sculas

&

$nom re5*5apellido Q DPnggie Hope@D?

$$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$username Q strtolower$$nom re5*5apellido%? $nom re5visi le Q ucwords$$username%?

'ar a una cadenaD (ormato de moneda D es posible mediante el uso de money$format'-formato8 -cadena(7
setlocale$H)5GKS1-P8X3 Des51".R-&-4D%? $ ruto Q 1,4.!5? $iva Q $ ruto U '.21? $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 Aplicaciones 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 num er5format$$precio3 23 C3C3 C.C%? echo $precio5txt? "" 12.4AQ,4H

,unciones de manipulacin
"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 texto D tomando como punto de di5isinD un caracter o patrnD mediante la (uncin eQplode'-delimitador8 -cadena( & as obtener un arra& con las (racciones de cadena di5ididasD Aue nos permita iterar sobre cada una7
$contactos Q D[uan Pntonio Pvila :avila@mail.com93 8odrigo Gancusso :rmancu@mail.com93 "ilvina 7Claggio :dlaggio@mail.com9 D? $patron Q D3D . chr$1'%? $personas Q explode$$patron3 $contactos%? foreach$$personas as $persona% N echo $persona . chr$1'%? O "# F&an 9ntonio 9)ila Va)ilaZmail.comM 2odrigo >anc&sso Vrmanc&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 li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi lo ortis reformidans

$$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

eu3 legimus senserit definie as an eos. 1u sit tincidunt incorrupte 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 de et li ris consulatu. So mei ferri graeco dicunt3 ad cum veri accommodare. "ed at malis omnes;ue delicata3 usu et iusto @@ril meliore. 7icunt maiorum elo;uentiam cum cu3 sit summo dolor essent te. Se ;uodsi nus;uam legendos has3 ea dicit voluptua elo;uentiam pro3 ad sit ;uas ;ualis;ue. 1os voci us deserunt ;uaestio ei. D? -caracteres & strlen'-mensa@e(+ if$$caracteres 9 1!'% N echo D-u mensa>e es 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
$nom re5*5apellido Q D[uan #.D? $datos Q str$word$count$$nom re5*5apellido3 1%? if$count$$datos% : 2% N echo DN$nom re5*5apellidoO no es un nom re * apellido v=lidoD? O else N foreach$$datos as $dato% N if$strlen$$dato% : 2% N echo D#or 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@arlo por el indicado 7
$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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

reempla@oD tanto cadenas de textoD como matrices7


$email Q D>uanpere@@dominio.comD? $ us;ueda Q arra*$D@D3 D.D%? $reempla@o Q arra*$D ]P-^ D3 D ]7K-^ D%? $mail5no5spam Q str5replace$$ us;ueda3 $reempla@o3 $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 Aplicaciones 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 li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit definie as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit cu3 eirmod consectetuer signiferum;ue eu per. Bn usu 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

*n ejemplo un poco m2s complejoD puede darse con el uso combinado de 5arias (unciones7
$patron Q DdicitD? $inicio5patron Q stripos$$cadena3 $patron%? if$$inicio5patron WQQ &alse% N echo su str$$cadena3 $inicio5patron3 strlen$$cadena%%? O "# dicit ridens inciderint id. X&o m&ndi lobortis re0ormidans e&, legim&s senserit 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 li er hendrerit an. cui ut wisi voci us suscipiantur3 ;uo dicit ridens inciderint id. cuo mundi lo ortis reformidans eu3 legimus senserit definie as an eos. 1u sit tincidunt incorrupte definitionem3 vis mutat affert percipit cu3 eirmod consectetuer signiferum;ue eu per. Bn usu 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

echo $nueva5cadena? "" 9'er recorr6 los alrededores de Nelgrano con mi +rimo

,unciones de encriptacin
Podemos obtener el hash "'/ con la (uncin md5'-cadena(7
$clave Q Dpepe5grillo-1251!D? $hash5clave Q md5$$clave%? echo $hash5clave? "" H1A02eA502=1ba=d0Ab5=aQ0e105Q241

A'=E0TE)>IA )unca utilices 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 utili@a PHPL>!I7 php -r Cecho md5$Dcadena a hashearD%?C

PHP dispone de otras (unciones de ci(radoD para 5arios algoritmos como -HA$ & >0>?8# -in embargo & a pesar de contar con la (uncin de ci(rado "'/D disponemos de una (uncin Aue engloba todo lo anteriorD llamada hash'-algoritmo$cifrado8 -cadena( Aue nos (acilita ci(rar una cadena en 5arios (ormatos # !os posibles algoritmos de ci(rado D pueden obtenerse con la (uncin hash$algos'( la cual retorna un arra& con todos los algoritmos disponibles7

$8$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

php 9 print5r$hash$algos'(%? Prra* $ ]'^ Q9 md2 ]1^ Q9 md! ]2^ Q9 md5 ]2^ Q9 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 Aplicaciones 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

0esumen de las principales (unciones de string


Tipo de $uncin %uncin Descripcin 3scapa una cadena aCadiendo %arras in!ertidas a e C Y y %ytes nulos ACade %arras in!ertidas delante de . Y T U A ] f ^ $ $ % 3limina las %arras in!ertidas de una cadena escapada "on!ierte los caracteres a entidades :;ML &n!ersa a htmlentities "on!ierte a entidades :;ML los siguientes caracteresD _ D C : 9

addslashes
Escape

Kuotemeta stripslashes htmlentities html$entity$decode htmlspecialchars

!onversin

htmlspecialchars$dec &n!ersa a htmlspecialchars ode strip$tags ltrim rtrim trim nl2.r wordwrap strtolower lcfirst strtoupper
3limina todos los tags :;ML y : 3limina espacios en %lanco del comien9o de la cadena 3limina espacios en %lanco del final de la cadena 3limina espacios en %lanco del comien9o y final de la cadena "on!ierte saltos de l4nea en su e,ui!alente :;ML AEusta el anc1o de caracteres de una cadena "on!ierte toda la cadena a minFsculas "on!ierte a minFscula el primer carater de una cadena "on!ierte toda la cadena a mayFsculas "on!ierte el primer car2cter de una cadena a mayFscula "on!ierte el primer car2cter de cada pala%ra de una cadena a mayFsculas 5ormatea un nFmero con el s4m%olo de moneda correspondiente 5ormate un nFmero con el separdor de miles y decimales correspondiente

%ormato

ucfirst ucwords money$format num.er$format

$8%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>Qplode strlen str$word$count str$replace str$ireplace


Manipulacin

Di!ide una cadena generando un array Retorna la longitud de una cadena "uenta la cantidad de pala%ras Reempla9a iterati!amente un patrn Retorna la posicin del patrn %uscado en una cadena Retorna una porcin de la cadena Retorna la cantidad de apariciones de un patrn en la cadena Reempla9a iterati!amente una porcin de la cadena Retorna el 1as1 MD? de una cadena Retorna el 1as1 de una cadena( cifrado con el algoritmo indicado

strpos stripos su.str su.str$count su.str$replace su.str$ireplace md5

!i$rado

hash

$8/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Taller de Archi5os & Procesamiento de ,ormularios


En este tallerD crearemos un libro de 5isitas basado en el sistema de archi5os 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Anexo I7 constantesD 5ariables 5ariables & 5ariables superglobales


'urante el tallerD hemos introducido cuatro nue5os conceptosD de los cualesD trataremos aAuD dos de ellos7 constantes & 5ariables 5ariables # Para el procesamiento del (ormularioD tambiHn hemos utili@ado la 5ariable superglobal -$P%25 de PHP & hablaremos de ello#

>onstantes
PHPD a di(erencia de otros lenguajesD introduce el concepto de constante# *na 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(inicin cl2sica de constantes en PHP


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

$86

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

define$C#8K7R)-KC3 C"hort de define$C.PX5"-K)gC3 &alse%?

aao para niaoC%?

Por con5encinD el nombre de las constantes se de(ine en letras ma&3sculas # )o obstanteD aplican las reglas de nombre para la de(inicin de 5ariables# Este tipo de constanteD puede de(inirse en cualAuier 2mbito de la aplicacin D &a sea dentro de una (uncin como (uera de ella# Para llamar a una constante D re(erencia a ellaD por el nombre7
echo #81)BK? // imprime 25.,4

simplemente

se

hace

Este tipo de constantesD admiten como 5alor D cualAuier tipo de dato simpleD inclusoD una 5ariable7
$nom re Q strip5tags$$5/1-]Cnom re^%? define$CSKGI81C3 $nom re%?

'e(inicin de constantes en PHP /#?


'esde la 5ersin /#? de PHP D se introdujo el uso de la palabra cla5e const para 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

-olo pueden declararse en el 2mbito global 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 redeclaradas V

,inalidad 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

=ariables 5ariables
!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
$nom re5de5varia le Q CprecioC? $$nom re5de5varia le Q 25.,4? echo $nom re5de5varia le? "" im+rime +recio echo $$nom re5de5varia le? "" im+rime 25.AQ

Esto signi(icaD Aue el nombre de la 5ariable Aue almacena el 5alor 8/#6G ser2 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 Dmi5varia leD? $$a Q ,5? echo D1l nom re de Y$Y$a es Y$N$aOD? "" salida: Bl nombre de **a es *mi_)ariable

$?9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

=ariables superglobales
>omo hemos podido 5erD PHP dispone de 5ariables globales a las cuales se accede mediante el uso de la palabra cla5e glo.al# As como existen las 5ariables 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 aplicacin sin necesidad de utili@ar la palabra cla5e glo alD &a Aue son 5ariables internas# A lo largo del superglobales7 cursoD hemos utili@ado dos 5ariables

-$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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

81cR1"-5R8B Aue nos de5uel5e la *0I completa Aue se utili@ para acceder al scriptD entre otros#
$metodo Q -$2> U> ;= >V1>25$L>5H%D=<? $uri Q -$2> U> ;= >V1>25$1 C=<? foreach$$5"18J18 as $claveQ9$valor% N echo DY$5"18J18]C$claveC^ Q $valor: r/9D? O

El (oreach anteriorD generar2 una salida similar a la siguiente Ese resaltan los :e&s m2s usualesF7
$5"18J18]C.--#5.K"-C^ a localhost $5"18J18]C.--#5)KSS1)-BKSC^ Q 6eep-alive $5"18J18]C.--#5)P).15)KS-8KHC^ Q max-ageQ' -$2> U> ;=H55P$12> $?J>35=< Q Go@illa/5.' $F11? Hinux i(4(% PppleEe git/525.11 $g.-GH3 li6e /ec6o% )hrome/1,.'.+(2.,+ "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 we master@localhost -$2> U> ;=2B CP5$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$25 C3J=< Q parametroQvalor -$2> U> ;= >V1>25$1 C=< 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 obtenerse en7

sobre

la

superglobal

$5"18J18

puede

http7++...#php#net+manual+es+reser5ed#5ariables#ser5er#php#

$?8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

En5o de correo electrnico con PHP


PHPD dispone de una (uncin llamada mail'( Aue permite en5iar correos electrnicos tanto en texto plano como HT"!D a tra5Hs del ser5idor WebD utili@ando la librera sendmail EgeneralmenteD instalada por de(ectoF#

!a (uncin mail'( & su sintaxis


!a (uncin mail'( reAuiere Aue mnimamente le sean pasados ? par2mtros7 destinarioD asunto & mensaje7
$destinatario Q Duser@mail.comD? $asunto Q D)orreo electrMnico enviado desde #.#D? $mensa>e Q D1sta es una prue a de env<o.D? mail'-destinatario8 -asunto8 -mensa@e(+

El par2metro NdestinatarioO7 (ormatos admitidos


!a (uncin mail$% admite como destinatarioD una o m2s direcciones de correo electrnicoD debiando mantener alguno de los siguientes (ormatos7 Wnico destinatario7
user@mail.com

=arios destinatarios7
user2@mail.com3 user2@mail.com3 user5@mail.com

$??

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

'estinatario con nombre e eLmail7


[uan #Zre@ :mail@dominio.com9

=arios destinatarios con nombre e eLmail7


[uan #Zre@ :mail@dominio.com93 Pna /Mme@ :mail2@dominio.com9

R lgicamenteD anteriores7

cualAuier

combinacin

de

las

user2@mail.com3 Pna /Mme@ :mail2@dominio.com9

>abeceras adicionales como par2metro extra


AdicionalmenteD pueden sumarse a la (uncin mail$% cabeceras adicionales a ser 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 prue a de env<o.D? $ca $ca $ca $ca eceras5adicionales eceras5adicionales eceras5adicionales eceras5adicionales Q D6rom: Pna Gar<a HMpe@ :anita@mail.com9YrYnD? .Q D eply-to0 8oc<o Brao :rocio@mail.com9YrYnD? . DBc0 Priel 7omingo :ariel@mail.com9YrYnD? .Q DRcc0 "upervisor :admin@mail.com9YrYnD?

mail$$destinatario3 $asunto3 $mensa>e3 -ca.eceras$adicionales%?

>omprobando Aue el eLmail pudo en5iarse


!a (uncin mail$% retornar2 5 1> cuando el en5o del mensaje ha&a podido concretarse# 'e lo contrarioD retornar2 6?42>7
$?%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

if'mail$$destinatario3 $asunto3 $mensa>e3 $ca eceras%( N echo D1l e-mail se ha 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 (uncin en en5os masi5os#

$?/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

En5iando mensajes en (ormato HT"!


Para poder en5iar un mensaje con (ormato HT"! desde PHPD solo ser2 necesarioD 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 -ca.eceras$adicionales $ca eceras5adicionales $ca eceras5adicionales $ca eceras5adicionales $ca eceras5adicionales & .& .Q .Q .Q .Q /LCL>-Uersion0 P.:SrSn/+ /Bontent-type0 teQt)html+ charset&utf-WSrSn/+ D&rom: Pna Gar<a HMpe@ :anita@mail.com9YrYnD? D8epl*-to: 8oc<o Brao :rocio@mail.com9YrYnD? D)c: Priel 7omingo :ariel@mail.com9YrYnD? DIcc: "upervisor :admin@mail.com9YrYnD?

if$mail$$destinatario3 $asunto3 $mensa>e3 $ca eceras5adicionales%% 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

,unciones para el manejo de ,echa & Hora


!a librera de (unciones para la manipulacin de (echas & horas de PHPD es lo su(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

,unciones simples de (echa & hora


4btener la (echa & hora actual en un arra& asociati5o
getdate'( es la (uncin indicada para obtener la in(ormacin relati5a a la (echa & 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

) #"

El arra& asociati5o retornado por getdate'(D como bien se indica en el manual o(icial?D de5ol5er2 las siguientes cla5es7
!lave seconds minutes hours mday wday mon year yday weekday month : Descripcin Ejemplo de valores devueltos Representacion num'rica de los 0 a 59 segundos Representacion num'rica de los minutos 0 a 59 Representacion num'rica de las 1oras 0 a 23 Representacion num'rica del d4a del 1 a 31 mes Representacion num'rica del d4a de la 0 (para Domingo) 1asta 6 (para semana S2%ado) Representacion num'rica de un mes 1 1asta 12 Una representacion num'rica completa 3EemplosD 1999 o 2003 de una aCo( B d4gitos Representacion num'rica del d4a del 0 1asta 365 aCo Una representacin te-tual completa del Sunday 1asta Saturday d4a de la semana Una representacin te-tual completa de January 1asta December un mes( como Ganuary o Marc1 Dependiente del Sistema( Los segundos desde la Hpoca Unit4picamente -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 Aplicaciones 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 Da d D j l (ILI minFscula) N D4a del mes( @ d4gitos con ceros iniciales 01 a 31 Una representacin te-tual de un d4a( tres letras Mon 1asta Sun D4a del mes sin ceros iniciales 1 a 31 Una representacin te-tual completa del d4a de la Sunday 1asta Saturday semana Representacin num'rica &SOJKL67 del d4a de la 1 (para lunes) 1asta7 (para semana (aCadido en : ?.7.6) domingo) 0 (para domingo) Representacin num'rica del d4a de la semana 1asta 6 (para s2%ado) 3l d4a del aCo (comen9ando por 6) 0 1asta 365 NFmero de la semana del aCo &SOJKL67( las semanas comien9an en lunes (aCadido en : B.7.6) Una representacin te-tual completa de un mes( como Ganuary o Marc1 Representacin num'rica de una mes( con ceros iniciales Una representacin te-tual corta de un mes( tres letras Representacin num'rica de un mes( sin ceros iniciales NFmero de d4as del mes dado Si es un aCo %isiesto Una representacin num'rica completa de un aCo( B d4gitos Una representacin de dos d4gitos de un aCo )ora Ante meridiem y ost meridiem en minFsculas Ante meridiem y ost meridiem en mayFsculas 5ormato de 7@ 1oras de una 1ora sin ceros iniciales 5ormato de @B 1oras de una 1ora sin ceros iniciales $?C Descripcin Ejemplo de valores devueltos

! Semana " Me# $ m M n t %&o ' ( y a % , -

3EemploD 42 (la B@M semana del aCo)

January 1asta December 01 1asta 12 Jan 1asta Dec 1 1asta 12 28 1asta 31 1 si es %isiesto( 0 si no. 3EemplosD 1999 o2003 3EemplosD 99 o 03 am o *m %M o +M 1 1asta 12 0 1asta 23

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!ar&cter de formato .

Descripcin

Ejemplo de valores devueltos 01 1asta 12 00 1asta 23 00 1asta 59 00 1asta 59 3EemplosD 234( -M3(%tlant /c5%!ore# 1 si est2 en 1orario de !erano( 0 si no. 3EemploD 80200 3EemploD 802900 3EemplosD :S3( MD3... -43200 1asta 50400

5ormato de 7@ 1oras de una 1ora con ceros iniciales 5ormato de @B 1oras de una 1ora con ceros ) iniciales / Minutos( con ceros iniciales # Segundos( con ceros iniciales 0ona1)orar/a &dentificador de 9ona 1oraria (aCadido en : e ?.7.6) 6 (i Si la fec1a est2 en 1orario de !erano o no mayFscula) Diferencia de la 1ora de NreenOic1 (NM;) en 7 1oras Diferencia con la 1ora de NreenOic1 (NM;) con + dos puntos entre 1oras y minutos (aCadido en : ?.7.8) 3 A%re!iatura de la 9ona 1oraria Pndice de la 9ona 1oraria en segundos. 3l 4ndice para 9onas 1orarias al oeste de U;" siempre es 0 negati!o( y para a,uellas al este de U;" es siempre positi!o. $ec.a5)ora14om*leta c 5ec1a &SO KL67 (aCadido en : ?) r 2 5ec1a con formato R R5" @K@@ Segundos desde la Hpoca Uni- (7 de 3nero del 7<A6 66D66D66 NM;)

@66BJ6@J7@;7?D7<D@7Q66D66 3EemploD 3.u;1211Dec120001 16901907180200

Alternati5amenteD es posible pasar como par2metro a date$% una constante de (ormato prede(inida 7
echo date$7P-158""%? "" 1,&, 15 >ar 2012 1Q:1=:21 -0500

*na lista completa de las constantes de (ormato prede(inidasD puede obtenerse en http7++nc#php#net+manual+es+class#datetime#phpYdatetime#constan ts#t&pes A=I-4

$%9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

)tese Aue la hora tambiHn puede obtenerseD en (ormato hora *)ISD con la (uncin time'(7 http7++nc#php#net+manual+es+(unction#time#php

=alidar una (echa


Podemos 5alidar la 5eracidad de una (echaD mediante el uso de la (uncin checkdate'-mes8 -dia8 -aXo( teniendo en cuenta Aue retornar2 5 1> cuando se trate de una (echa 52lidaD o 6?42> o en caso contrario7
if$checkdate'P28 258 2:PP( QQQ -rue% N echo D&echa v=lidaD? O else N echo D&echa no v=lidaD? O

>2lculo de (echa + hora sencillo


Es posible reali@ar c2lculos sencillos con la (echa & horaD combinando el uso de las (unciones date'( & time'(7
$ho* Q date$CX-m-dC%? $manana Q date$CX-m-dC3 $time$% T $1 U 2! U (' U ('%%%? $a*er Q date$CX-m-dC3 $time$% - $1 U 2! U (' U ('%%%? "# (1 # 24 # =0 # =0) e(&i)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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

tipo *)IS Etimestamp F# >uando la marca de tiempo no es pasada como par2metroD 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 4(!'' php # echo 12214!,42, php # $a Q php # echo 1221+2!22, php # echo 2'12-'2-1( 1 U 2! U (' U (' ? time$%? 12214!,42, T 4(!''? $a? date$CX-m-dC3 $a%?

4tra (orma de obtener la marca de tiempo de una (echa determinada es con la (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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

echo date$CX-m-dC3 $semana5siguiente%?

AunAue esta 3ltima (ormaD no es la m2s acertada#

Ejemplos pr2cticos de c2lculos basados en (echas


I>u2nto tiempo ha pasadoJ
Problema7 El $/ de mar@o de 89$$D )atalia le coment a su madreD Aue comen@ara a 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 -olucin7
"" obtengo la marca de tiem+o +ara el 15"05"2011 $fecha5inicio Q m6time$'3 '3 '3 23 153 2'11%? "" obtengo la marca de tiem+o +ara ,o' $fecha5fin Q m6time$%? "" obtengo la di0erencia timestam+ entre ambas 0ec,as $diferencia Q $$fecha5fin - $fecha5inicio%? "" con)ierto a d6as la di0erencia timestam+ -dias & -diferencia ) '2E 9 Z: 9 Z:(+ # das que pasaron entre dos fechas "" dinero a,orrado x d6a $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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

I<uH edad tiene###J


Problema7 !ucasD naci el 86 de -eptiembre de $C6G I<uH edad tiene ho&J -olucin7
"" obtengo la marca de tiem+o de la 0ec,a de nacimiento $fecha5nacimiento Q 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 -olucin7
"" edad act&al de L&ciana en aSos $edad Q 15? "" +robable aSo de nacimiento de l&ciana $anio Q 'int(date'=N=( - -edad? "" +robable 0ec,a de nacimiento m%s antig&a $pro a le5mas5antigua Q date$Cd/m/C% . $$anio-1%? "" +robable 0ec,a de nacimiento m%s reciente

$%%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

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

$%/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

,unciones matem2ticas
PHP dispone de una gran galera de (unciones matem2ticas prede(inidasD Aue pueden encontrarse en la documentacin o(icial 5isitando http7++...#php#net+manual+es+re(#math#php "uchas de estas (uncionesD nos resultar2n de gran a&udaD con5irtiHndose en (unciones de uso (recuente para nuestros programas# =eremos las mismas a continuacin#

4btener un n3mero ele5ado a la potencia


pow$$ ase3 $potencia%
echo pow$23 2%? "" Q echo pow$53 2%? "" 25

4btener el n3mero m2s alto & el n3mero m2s bajo


maQ$$valores% - min$$valores%
$precios Q arra*$12.,53 !2.+'3 1'(.('3 +3 25.45%? $producto5mas5caro Q max$$precios%? "" 10=.= $producto5mas5 arato Q min$$precios%? "" H

$me>or5oferta Q max$1',.,53 1'+.4!%? "" 10H.Q4 $peor5oferta Q min$1',.,53 1'+.4!%? "" 10A.A5

$%1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

0edondear un n3mero con ) cantidad de decimales


round$$numero3 $decimales%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? "" 1=5.2=5A $iva Q round$$iva3 2%? "" 1=5.2=

0edondear un n3mero hacia abajo


floor$$numero%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? "" 1=5.2=5A $iva Q floor$$iva%? "" 1=5

0edondear un n3mero hacia arriba


ceil$$numero%
$ ruto Q 15,2.+!? $alicuota5iva Q 1'.5? $iva Q $ ruto U $alicuota5iva / 1''? "" 1=5.2=5A $iva Q ceil$$iva%? "" 1==

$%6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4btener un n3mero entero aleatorio


rand$$numero5minimo3 $numero5maximo%
$password Q rand$1+++++3 ++++++%? "" 15Q055

,unciones para el manejo de matrices


En captulos anterioresD cuando hablamos sobre arra&sD pudimos 5er 5arias (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 & uniendo arra&s


'i5idir un arra& en matrices m2s peAuePas
array$chunk$$arra*3 $tamaao]3 $conservar5claves^% oolean

)tese Aue el tercer argumento es opcional# Por de(ectoD arra*5chun6D crear2 nue5as cla5es en los nue5os arra&# Pero si se indica -8R1D conser5er2 estas cla5es#
$%G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3 C8aulC3 C1ste anC3 C7iegoC%? $grupos Q arra*5chun6$$personas3 2%? print5r$$grupos%? "# 9rra' ( K0L DM 9rra' ( K0L DM F&an K1L DM Bmilse K2L DM .edro ) K1L DM 9rra' ( 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 C1ste anC3 C7iegoC%? $grupos Q arra*5chun6$$personas3 2%? foreach$$grupos as $numeroQ9$grupo% N $nom re5arra* Q Dgrupo5N$numeroOD? $$nom re5arra* Q $grupo? O

,inalmenteD obtendramos ? nue5os arra&sD llamados $grupo5'D $grupo51 & $grupo52D respecti5amente#

$%C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4btener la porcin espec(ica de un arra&


array$slice$$arra*3 $desde]3 $hasta^%
$personas Q arra*$C[uanC3 C1milseC3 C#edroC3 C1liseoC3 C8osaC3 CSoeliaC3 C8aulC3 C1ste anC3 C7iegoC%? $primeras525personas Q arra*5slice$$personas3 '3 2%? 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 utili@ando uno para las cla5es & otro para los 5alores
array$com.ine$$arra*5claves3 $arra*5valores%
$comodines Q arra*$CN-B-RHKOC3 CN"RI-B-RHKOC%? $valores Q arra*$CGanual de #.#C3 C-ra a>ando con arra*sC%? $datos Q arra*5com ine$$comodines3 $valores%? print5r$$datos%? "# 9rra' ( K\171!LJ]L DM >an&al de ./. K\-!N171!LJ]L DM 1raba:ando con arra's

$/9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

) #"

>ombinar dos o m2s arra&s


array$merge$$arra*513 $arra*52]3 $mas5arra*s^%
$grupo5a Q arra*$C1liseoC3 CSoemiC3 C"antiagoC%? $grupo5 Q arra*$C7iegoC3 C)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 multidimensionales de manera recursi5a


array$merge$recursive$$arra*513 $arra*52]3 $mas5arra*s^%
$persona5a Q arra*$CSom reCQ9C1liseoC3 C1dadCQ925%? $persona5 Q arra*$CSom reCQ9CGiriamC3 C1dadCQ92,%? $personas Q arra*5merge5recursive$$persona5a3 $persona5 %? print5r$$personas%? "# 9rra' ( K ombreL DM 9rra' ( K0L DM Bliseo K1L DM >iriam ) KBdadL DM 9rra'

$/$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

( K0L DM 25 K1L DM 5A ) ) #"

4rdenando Arra&s por sus 5alores


4rdenar un arra& de menor a ma&or
sort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? sort$$nom res%? print5r$$nom res%? "# 9rra' ( K0L DM 9na K1L DM ;iego K2L DM Bliseo K5L DM oemi ) #"

4rdenar un arra& de ma&or a menor


rsort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? rsort$$nom res%? print5r$$nom res%? "# 9rra' ( K0L DM oemi K1L DM Bliseo K2L DM ;iego

$/8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

K5L DM 9na ) #"

4rdenar un arra& de menor a ma&or manteniendo la relacin con los ndices


asort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? asort$$nom res%? print5r$$nom res%? "# 9rra' ( K2L DM 9na K1L DM ;iego K5L DM Bliseo K0L DM oemi ) #"

4rdenar un arra& de ma&or a menor manteniendo la relacin con los ndices


arsort$$arra*%
$nom res Q arra*$CSoemiC3 C7iegoC3 CPnaC3 C1liseoC%? arsort$$nom res%? print5r$$nom res%? "# 9rra' ( K0L DM oemi K5L DM Bliseo K1L DM ;iego K2L DM 9na ) #"

$/?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4rdenando Arra&s por su cla5e


4rdenar un arra& de menor a ma&or por su cla5e
ksort$$arra*%
$personas Q arra*$ CSom reC Q9 CGiguelC3 CPpellidoC Q9 CGonteroC3 %? 6sort$$personas%? print5r$$personas%? "# 9rra' ( K9+ellidoL DM >ontero K ombreL DM >ig&el ) #"

4rdenar un arra& de ma&or a menor por su cla5e


krsort$$arra*%
$personas Q arra*$ CSom reC Q9 CGiguelC3 CPpellidoC Q9 CGonteroC3 C-alleC Q9 CFHC3 %? 6rsort$$personas%? print5r$$personas%? "# 9rra' ( K1alleL DM GL K ombreL DM >ig&el K9+ellidoL DM >ontero ) #"

$/%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>omparando (unciones de ordenamiento de arra&s


%uncin asort arsort ksort krsort sort rsort 'rdena por !alor !alor cla!e cla!e !alor !alor Mantiene las claves asociadas S& S& S& S& NO NO 'rden de clasi$icacin menor a mayor mayor a menor menor a mayor mayor a menor menor a mayor mayor a menor

Agregar & Eliminar elementos de un arra&


Agregar elementos al (inal del arra&
array$push$$arra*3 $valores%
$personas Q arra*$C[uanC3 C1milioC%? arra*5push$$personas3 CGiguelC3 CPnaC3 C.erminioC%? print5r$$personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio K2L DM >ig&el K5L DM 9na K4L DM /erminio ) #"

$//

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Agregar elementos al comien@o del arra&


array$unshift$$arra*3 $valores%
$personas Q arra*$C[uanC3 C1milioC%? arra*5unshift$$personas3 CGiguelC3 CPnaC3 C.erminioC%? print5r$$personas%? "# 9rra' ( K0L DM >ig&el K1L DM 9na K2L DM /erminio K5L DM F&an K4L DM Bmilio ) #"

Eliminar el 3ltimo elemento de un arra&


array$pop$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%? arra*5pop$$personas%? print5r$$personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio ) #"

Eliminar el primer elemento de un arra&


array$shift$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC%? arra*5shift$$personas%? print5r$$personas%? "# 9rra' (

$/1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

) #"

K0L DM Bmilio K1L DM 9na

Eliminar 5alores duplicados en un arra&


array$uniKue$$arra*%
$personas Q arra*$C[uanC3 C1milioC3 CPnaC3 C1milioC%? $personas Q arra*5uni;ue$$personas%? print5r$$personas%? "# 9rra' ( K0L DM F&an K1L DM Bmilio K2L DM 9na ) #"

B3sAuedas & (iltros


>ontar la cantidad de 5eces Aue los elementos aparecen en un arra&
array$count$values$$arra*%
$frutas Q arra*$CperaC3 Cman@anaC3 CperaC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3 Cman@anaC3 CmelMnC3 CperaC3 CmandarinaC3 Cnaran>aC3 ClimMnC3 ClimaC3 CpomeloC3 CperaC%? $repeticiones Q arra*5count5values$$frutas%? foreach$$repeticiones as $frutaQ9$veces% N if$$veces 9 1% N echo SUsted repiti T#frutaU T#!ecesU !ecesS . "1r(76)V U O "# !sted re+iti? +era 4 )eces

$/6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!sted re+iti? manEana 2 )eces !sted re+iti? mel?n 2 )eces #"

>ontar la cantidad de elementos de un arra&


count$$arra*%
$frutas Q arra*$CperaC3 Cman@anaC3 Cdura@noC%? echo count$$frutas%? "" 5

4btener la suma matem2tica de los 5alores de un arra&


array$sum$$arra*%
$precios Q arra*$,5.!'3 +2.123 ,3 25.143 1,2.('%? $total Q arra*5sum$$precios%? echo $total? "" 5A4.5

4btener las di(erencias entre dos o m2s arra&s


array$diff$$arra*513 $arra*52]3 $arra*523 h.^%
$frutas51 Q arra*$CperaC3 Cman@anaC3 Cdura@noC3 CmelMnC3 Csand<aC3 C6iwiC3 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 Aplicaciones 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 #"

,iltrar datos de un arra&D utili@ando una (uncin de retorno


array$filter$$arra*3 $funcion%
$datos Q arra*$253 !2.23 (!.+43 22.,3 ClunaC3 +53 223 ('.'53 CaguaC3 CsolC%? 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

) #"

K4L KAL KQL KHL

DM DM DM DM

l&na =0.05 ag&a sol

=eri(icar si un arra& contiene una cla5e determinada


array$key$eQists$$clave3 $arra*%
if$Warra*56e*5exists$CpasswordC3 $5#K"-%% N echo C7e e indicar una contraseaaC? O

4btener todas las cla5es de un arra& o todos los 5alores


array$keys$$arra*% - array$values$$arra*%
$li ro Q arra*$ C-ituloC Q9 CGanual de #.#C3 C"u tituloC Q9 C-ra a>ando con arra*sC3 CPutorC Q9 C1ugenia IahitC3 C&echaC Q9 C12/1'/2'11C3 %? $claves Q arra*56e*s$$li ro%? $valores Q arra*5values$$li ro%? print5r$$claves%? "# 9rra' ( K0L DM 1it&lo K1L DM -&btit&lo K2L DM 9&tor K5L DM 3ec,a ) #" print5r$$valores%?

$19

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"# 9rra' ( K0L K1L K2L K5L ) #"

DM DM DM DM

>an&al de ./. 1raba:ando con arra's B&genia Na,it 12"10"2011

=eri(icar si un arra& contiene una 5alor determinada


in$array$$valor3 $arra*%
if$in5arra*$5'3 $punta>e%% N echo CRsted ha o tenido el m=ximo punta>e posi le en una respuestaC? O

Buscar un 5alor detrminado en un arra& & obtener su cla5e correspondiente


array$search$$valor3 $arra*%
$personas Q arra*$C[uanC3 CPnaC3 C1milseC3 C7iegoC%? $persona5 uscada Q C1milseC? $resultado Q arra*5search$$persona5 uscada3 $personas%? var5dump$$resultado%? "" int(5)

$1$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>oo:ies & -esiones de usuario


I<uH es una coo:ieJ
*na coo:ie es un archi5o de texto planoD Aue se almacena remotamente Len la 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 Aplicaciones 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 lo 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 perodo de tiempo prestablecidoD de inacti5idad por parte del usuario# >omo di(erencias (undamentales
$1?

entre

coo:ies

&

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

sesionesD podemos mencionar Aue7 !as sesiones crean coo:iesD pero las coo:ies no crean sesionesV !as sesiones expiran autom2ticamente por inacti5idad del 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 importancia
>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 b2sico
Antes de 5er como implementar el uso de coo:ies & sesiones en una aplicacin WebD necesitamos conocer cmo lle5ar adelante las acciones b2sicas Aue podemos reali@ar con las coo:ies & sesiones# Estas acciones son7 crearlasD leerlas D modi(icarlas & eliminarlas#

>reacinD lecturaD modi(icacin & eliminacin de coo:ies


Para reali@ar acciones con coo:iesD adem2s de un gran n3mero de (uncionesD PHP nos brinda un arra& superglobal denominado -$B%%[C>D el cual nos permitir2 acceder en todo momento a los datos del usuario#

$1%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>rear una coo:ie


Para crear una coo:ie utili@aremos la (uncin setcookie'( de PHP# En orden de 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 %# 'irectorio 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 /# 'ominio# Ejemplo7 eugenia ahit.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--#

$nom re Q Dnom re * apellidoD? $valor Q D1ugenia IahitD? $expira Q time$% T $2('' U 2! U 2(5%? "" 1 aSo $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? "" no ser% )%lida en CCC.e&geniaba,it.com $https Q &PH"1? $http Q -8R1? setcoo6ie$$nom re3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?

$1/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!eer una coo:ie


Para leer una coo:ieD haremos uso del arra& superglobal $5)KKgB17
echo D.ola N$5)KKgB1]Dnom re * apellidoD^OWD? "" /ola B&genia Na,it^

"odi(icar una coo:ie


!a (orma correcta de modi(icar una coo:ieD es sobreescribirlaD es decirD 5ol5er a crearla7
$nom re Q Dnom re5*5apellidoD? -valor & /\uan POreG/+ $expira Q time$% T $2('' U 2! U 2(5%? $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? $https Q &PH"1? $http Q -8R1? setcoo6ie$$nom re3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?

AhoraD la coo:ie NnombreB&BapellidoO tendr2 el 5alor Neuan PHre@O#

Eliminar una coo:ie


Para eliminar una coo:ieD el mejor mHtodo es 5ol5er a crear la coo:ieD con 5alor SRHH haciendo Aue expire antes de la (echa actual7
$nom re Q Dnom re5*5apellidoD? -valor & 3144+ $expira Q time$% - $2('' U 2! U 2(5%? "" 1 aSo antes $dir Q D/D? $dominio Q Ddesa.eugenia ahit.comD? $https Q &PH"1? $http Q -8R1?

$11

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

setcoo6ie$$nom re3 $valor3 $expira3 $dir3 $dominio3 $https3 $http%?

*n ejemplo pr2ctico con >oo:ies


=amos a crear un script sencilloD Aue solicite al usuarioD el idioma en el Aue 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 cam iar5idioma.php funciones.php index.php En los cualesD 5amos a colocar el cdigo Aue se describe a continuacin#

$16

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Archi5o template.html -er2 nuestra 5ista HT"!D en la cualD mostraremos un (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 actionQDcam iar5idioma.phpD idQDfrm5idiomaD9 :la el forQDlangD91li>a su idioma / choose *our language::/la el9 :select idQDlangD nameQDidiomaD9 :option valueQDesD91spaaol:/option9 :option valueQDenD91nglish:/option9 :/select9 :input t*peQDsu mitD valueQDKgD/9 :/form9 :/nav9 :article9 *P?JC3?, !F-?KuM se reemplaGarI el contenido por el del archivo hola$es.html u hola$en.html seg]n 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

switch $$idioma% N case CesC: $pagina Q Dpaginas/hola5es.htmlD? rea6? case CenC: $pagina Q Dpaginas/hola5en.htmlD? rea6? O O return $pagina? O ^ Lodifica el idioma elegido _ crea o modifica la cookie function cam iar5idioma$% 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%? cam iar5idioma$%? A9

$1C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Archi5o indeQ.php Este archi5oD reAuerir2 tambiHn de (unciones#php# -er2 el 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+

Trabajando con -esiones


!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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Primeros pasos con sesiones


Antes de comen@ar a crear sesiones L& manipularlasLD es necesario saberD Aue para poder trabajar con ellasD a di(erencia de las coo:iesD es necesario iniciali@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 sesiones 7

session5start$%?

A=I-47 Al igual Aue con las coo:iesD PHP tambiHn nos otorga un arra& superglobal para acceder a las sesionesD llamado -$2>22C%3

4tra particularidad a tener en cuentaD es Aue PHPD genera un identi(icador 3nico de sesin del usuario D LAue nos permitir2 utili@arlo para identi(icar en cada sesin & de manera ineAu5oca al usuarioL al cual se puede accederD in5ocando a la (uncin session$id'(7
session5start$%? echo session5id$%?

>rear una nue5a sesin


"ediante el arra& superglobal -$2>22C%3D podemos crearD leer & modi(icar sesionesD de manera simple & directa7

$6$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Recuerda que tanto para iniciar una nueva sesin como para reanudar una sesin 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]Cnom re5de5la5sesionC^7
session5start$%? echo $5"1""BKS]CusuarioC^? "" :a)ierA5

"odi(icar la sesin
-i se desea modi(icar la I' de sesin D debe pasarse como par2metro a 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Eliminar una 5ariable de sesin


Para eliminar una 5ariable de sesinD HstaD puede destruirse mediante unset$$5"1""BKS]Cnom re5de5la5varia le5de5sesionC^:
session5start$%? unset'-$2>22C%3;=usuario=<(+

Pero para destruir la sesin completa del usuario Einclu&endo la I' de sesinF D se debe recurrir a la (uncin session5destro*$% & eliminar la coo:ie con el nombre de la sesinD el cual se obtiene mediante session5name$%:
session5start$%? "" rean&do la sesi?n unset$$5"1""BKS%? "" destr&'o todas las )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 eliminosetcoo6ie$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 pr2ctico de uso de sesiones


Es el caso de restringir el acceso a ciertas p2ginas de nuestro sitio WebD solo a usuarios con permiso para hacerlo# >rearemos un programa mu& simpleD solo a modo de ejemplo# !o primero Aue haremos L&a Aue no utili@aremos ning3n
$6?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

sistema de registro & administracin de usuariosLD es crear un usuario genHrico 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 combinacin usuario contrasePa 7
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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A9

A continuacinD crearemos el (ormulario HT"!D necesario para Aue el usuario inicie sesin en el sistema# !o llamaremos formulario.html# Este (ormularioD en5iar2 los datos por HTTP P4-TD a otro archi5o llamado iniciar.php Aue crearemos luego#
:h19Bngreso al sistema:/h19 :form methodQD#K"-D actionQDiniciar.phpD9 Rsuario: :input t*peQDtextD nameQDuserD /9: r/9 )lave: :input t*peQDpasswordD nameQDpassD /9: r/9 :input t*peQDsu mitD valueQDBngresarD /9 :/form9

AhoraD crearemos el archi5o principal de nuestro sistema7 funciones.php AAu almacenaremos todas las (unciones necesarias para7 Iniciar la sesin 'estruir la sesin Edesconectar al usuarioF =eri(icar si el usuario tiene sesin iniciada

,unciones necesarias
,unciones de acceso al sistema
"# 1raigo los datos recibidos +or /11. .J-1 ' retorno el /9-/ >;5 de ambos #" 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

En la (uncin anteriorD primero iniciali@o un hash 5aco# !uego 5eri(ico si user & 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A'=E0TE)>IA7 )tese Aue no se crean otras 5ariables de sesinD ni tampoco se 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

function o tener5ultimo5acceso$% 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 o tener5ultimo5acceso$%? "# 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

inacti5aD desconectar2 al usuario del sistema#


# 8eri0icar sesi?n function validar5sesion$% N if$Wsesion5activa$%% N logout$%? O O

Esta (uncinD ser2 la Aue in5ocaremos desde todas & cada una de las p2ginasD a las cuales Auerramos restringir su acceso#

!a (uncin Aue redirige a los usuarios


>omo 3ltima (uncinD crearemos aAuella pendienteD de la cual hemos habladoD Aue se encargar2 de redirigir a los usuarios a otra p2gina de nuestro sistemaD utili@ando la (uncin header$% de PHP#
# redirigir al &s&ario function goto5page$$pagina% N header$DHocation: $paginaD%? O

Pasos (inales
>on todo estoD tenemos Nel almaO de nuestro sistema de logueo# Ahora solo nos resta crear los archi5os pendientes7 iniciar.php !lamar2 a la (uncin login$%# Es Auien recibe los datos desde el (ormulario#
$6C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

:Aphp re;uire5once$Dfunciones.phpD%? login$%? A9

salir.php !lamar2 a la (uncin logout$%# -er2 llamado cada 5e@ Aue el usuario 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, a solutamente todo el contenido de estas pginas restringidas, solo ser visi le al usuario si tiene la sesin iniciada y activa. +e lo contrario, el contenido estar seguro y no ser mostrado a usuarios sin sesin iniciada o con sesin inactiva.

$G9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

:Aphp re;uire5once$Dfunciones.phpD%? validar5sesion$%? A9 V^-- contenido de e:em+lo --M : 9Iienvenido usuario registradoW:/ 9 $:a hrefQDsalir.phpD97esconectarse:/a9%

'escarga los archi5os de este ejemplo desde la Web del cursoD en7 http7++tallerLdeLphp#eugeniabahit#com 4 mira el ejemplo en marcha ingresando en7 http7++tallerLdeLphp#eugeniabahit#com+EjemplosLEnL "archa+usoLdeLsesiones+paginaBdeBmuestra#php

$G$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Tratamiento & control de errores


En alg3n momentoD mientras ejecut2babamos alg3n cdigo PHPD habremos podido notar con bastante (recuenciaD Aue PHP nos arrojaba alg3n tipo de mensajeD cuando nuestro scriptD contena alg3n tipo (alla# Estos mensajes de error pueden ser di5ersos tipos E(unciones obsoletasD a5isosD ad5ertenciasD errores (atales Lentre otrosLF & su 5isibilidadD se puede con(igurar tanto desde el archi5o de con(iguracin de PHP Ephp.iniF como en tiempo de ejecucin D mediante la (uncin ini5set$%# -in 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 aplicacin 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 Aplicaciones 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 3rrores fatales en tiempo de eEecucin. Ad!ertencias no fatales en tiempo de eEecucin 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 Sugerencias de cam%ios al cdigo para ampliar la compati%ilidad con !ersiones posteriores de : A!isos en tiempo de eEecucin( so%re funciones o%soletas ;odos los anteriores (e-cepto 3WS;R&"( ,ue reci'n es incluido en 3WALL( desde la !ersin ?.B de : ) )nterrumpe el "cript ") NO NO NO NO ")

>$D? 3C3J >$3%5CB> >$25 CB5 >$D>P >B?5>D >$?44

Estos ni5eles de errorD pueden utili@arse de (orma combinadaD mediante los siguientes operadores7
'PER(D'R a A ~ T ")GN)%)!(D' XoY (alternati!a) XyY (concatenacin) Negacin Negacin (en tiempo de eEecucin) U"'
E+N'T)!E , E+DEPRE!(TED (3WNO;&"3 o 3WD3 R3"A;3D) E+N'T)!E - E+DEPRE!(TED (3WNO;&"3 y 3WD3 R3"A;3D) E+(LL - .E+N'T)!E (3WALL pero no 3WNO;&"3) E+(LL / E+N'T)!E (3WALL pero no 3WNO;&"3)

$G?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>on(igurando errores en tiempo de ejecucin


En tiempo de ejecucinD mediante la (uncin ini5set$% de PHPD se pueden establecer ciertas directi5as de con(iguracinD relati5as a los errores & registro de los mismos# Entre las directi5as m2s comunes D podemos encontrar7
D)RE!T)0( error$reporting DE"!R)P!)*N 1 E2EMPL' 3sta%lece ,ue tipo de errores son reportados
ini5set$Cerror5reportingC3 15PHH _ 1571#81)P-17%?

0(L'R P'R DE%E!T' >$?44 A ~>$3%5CB> "tring P

display$errors

Determina si se de%en mostrar o no los errores en pantalla


ini5set$Cdispla*5errorsC3 C'C%?

track$errors

&ndica si el Fltimo error encontrado( estar2 disponi%le a tra!'s de la !aria%le $php5errormsg


ini5set$Ctrac65errorsC3 CKnC%?

"tring %ff

"adena a imprimir antes del mensaEe de error error$prepend$string ini5set$Cerror5prepend5stringC3 C1rror


encontrado:C%?

SRHH

error$append$string

"adena a imprimir despu's del mensaEe de error


ini5set$Cerror5prepend5stringC3 C:hr/9C%?

SRHH

*n ejemplo sencillo pero altamente producti5o


>omo comentamos anteriormenteD cuando nuestra aplicacin corriese en un entorno de produccinD los errores deberan ocultarse# -in embargoD mientras Aue se estH trabajando en un entorno de desarrolloD podran estar 5isiblemente acti5os para a&udarnos a depurar nuestro cdigo#
$G%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

*na (orma simple de lograr estoD es crear un archi5o de con(iguracin para la 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

*tili@ando el smbolo Q para silenciar errores


En PHPD es posible silenciar errores anteponiendo una arroba EQF a la instruccin Aue podra generar un error# Es una pr2ctica Aue debe utili@arse con sumo cuidado & siempre Aue se Auiera capturar el error Ea pesar de estar silenciadoFD deber2 establecer track$errors en %n a (in de obtener dicho error mediante la 5ariable -php$errormsg# =eamos algunos ejemplos7
:Aphp ini5set$Cerror5reportingC3 15PHH L 15SK-B)1 L 15"-8B)-%? ini5set$Cdispla*5errorsC3 C'C%? ini5set$Ctrac65errorsC3 CKnC%? $archivo Q @fopen$Carchivo5;ue5no5existe.txtC3 CrC%?

$G/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

if$W$archivo% N echo $php5errormsg? O A9

En el ejemplo anteriorD silenciamos el posible error al intentar abrir un 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Trabajando con Bases de 'atos "&-<!


>on este captuloD llegamos al (inal del curso NPHP para PrincipiantesO# Abarcando esta 3ltima unidadD &a estaremos en condiciones de crear aplicaciones (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 libertad & 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Acerca de "&-<!
"&-<! es un ser5idor de Bases de 'atos -<! E-tructured <uer& !anguageF Aue se 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 E P!F#

Instalacin & con(iguracin de "&-<!


Para instalar "&-<!D por lnea de comandosD escribe7
sudo apt-get install mysKl-server mysKl-client

'urante la instalacinD el sistema te pedir2 Aue ingreses una contrasePa para la 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

A continuacinD te preguntar2 si deseas modi(icar contrasePa# -al5o Aue desees modi(icarlaD ingresa n7
)hange the root passwordA ]X/n^ n

esa

Ahora la preguntaD ser2 si deseas eliminar usuarios annimos# 0esponde Aue s7


8emove anon*mous usersA ]X/n^ N

!uegoD te preguntar2 si desees desabilitar el acceso remoto al usuario root de "&-<!# Por supuestoD responde Aue s7
7isallow root login remotel*A ]X/n^ N

!a siguiente pregunta ser2 si deseas eliminar la base de datos de prueba & el acceso a ella# TambiHn responde Aue s7
8emove test data ase and access to itA ]X/n^ N

,inalmenteD te preguntar2 si deseas recargar las tablas de pri5ilegios Eesto es para asegurar Aue todos los cambios reali@ados surjan e(ectoF# EntoncesD responde sD por 3ltima 5e@7
8eload privilege ta les nowA ]X/n^ N

IniciarD reiniciar & detener el ser5idor "&-<!


En ocasiones necesitar2s iniciarD reiniciar o detener el ser5idor de bases de datosD "&-<!#

$GC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!as opciones disponibles son7


stop start restart detiene el servidor inicia el servidor reinicia el servidor

Para iniciarD reiniciar o detener el ser5idorD deber2s ejecutar el siguiente comando D seguido de la opcin deseada7
sudo )etc)init.d)mysKl opcion5deseada

!gicamente reempla@ando opcion por stopD start o restart seg3n si deseas pararD iniciar o reiniciar el ser5idor#

$C9

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Administracin de "&-<!
*na 5e@ Aue comencemos a utili@ar bases de datosD necesitar2s poder acceder a 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 administrar el ser5idor de bases de datos#

necesarios

para

>omandos para administrar "&-<! dede el shell interacti5o


!a siguiente tabla describe los comandos de uso (recuente Aue necesitar2s para 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

mano 7F

!'M(ND' show data.ases+ use nom.re$de$la$.ase$de$datos+ create data.ase nom.re$de$la$d.+ Kuit

DE"!R)P!)*N Muestra todas las %ases de datos creadas en el ser!idor &ndicar ,ue !as a comen9ar a utili9ar la %ase de datos elegida "rear una nue!a %ase de datos Salir del s1ell interacti!o

$C8

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

-obre el lenguaje -<!


-<! Lsiglas de -tructured <uer& !anguageLD es el lenguaje de consultas a bases de datos D 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(orm2tico D posee su propia sintaxis D tipos de datos & elementos# En este cursoD abordaremos los conceptos b2sicos sobre -<! Aue nos permitan desarrollar aplicaciones de media complejidadD sin pro(undi@ar en el lenguaje en sD sino solo en aAuellos aspectos mnimamente necesarios 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 1ntero Sbmero decimal Iooleano &echa &echa * hora &echa * hora autom=tica .ora Denominacin C35'3( Especi$icaciones Ejemplo S Q cantidad de d<gitos BS-$5%

S Q cantidad de d<gitos totales D>BCL?4'38 D( 71)BGPH$1'3 2% 7 Q cantidad de decimales R%%4 D?5> D?5>5CL> 5CL>25?LP 5CL> IKKH 7P-1 7P-1-BG1 -BG1"-PG# -BG1

$C?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Pao )adena de longitud fi>a )adena de longitud varia le Ilo;ue de texto de gran longitud varia le

N>? 'D( BH? '3( U? BH? '3(

7 Q cantidad de d<gitos X1P8$!% $2 o !% S Q longitud de la cadena \ entre ' * 255 S Q longitud m=xima de la cadena \ entre ' * (5522 ).P8$2% JP8).P8$1''%

R4%R

IHKI

-int2xis b2sica de las sentencias -<!


*na sentencia -<! Edenominada NAuer&O en la jerga in(orm2ticaFD es una instruccin escrita en lenguaje -<!# =eremos aAuD el tipo de sentencias m2s habituales#

>rear tablas en una base de datos


-intaxis7
B >?5> 5?R4> nom re5de5la5ta la' nom re5del5campo -B#K57157P-K3 nom re5de5otro5campo -B#K57157P-K (+

Ejemplo7
)81P-1 -PIH1 productos$ producto JP8).P8$125%3 descripcion IHKI3 precio 71)BGPH$(3 2%3 en5stoc6 IKKH %?

Explicacin7
)81P-1 -PIH1 productos

>rear una nue5a tabla llamada NproductosO

$C%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

producto JP8).P8$125%3

>rear un campo llamado productoD de tipo cadena de texto de longitud 5ariableD 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Insertar datos en una tabla


-intaxis7
C32> 5 C35% nom re5de5la5ta la$campo13 campo23 campo1'..% JPHR1"$dato13 dato23 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 6 %L campo13 campo23 campo1' ta la?

Ejemplo7
"1H1)producto3 precio

$C1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

&8KG

productos?

Explicacin7
"1H1)producto3 precio

-eleccionar los campos producto & precio


&8KG productos?

'e la tabla productos

"odi(icar registros
-intaxis7
1PD?5> 2>5 ta la campo1 Q valor3 campo2 Q valor3 campo1' Q valor?

Ejemplo7
R#7P-1 "1productos en5stoc6 Q &PH"13 precio Q '?

Explicacin7
R#7P-1 productos

Actuali@ar la tabla productos

"1-

en5stoc6 Q &PH"13

"odi(icar el campo enBstoc: por (also

precio Q '?

$C6

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

& el campo precio a 9

Eliminar registros
-intaxis7
D>4>5> 6 %L ta la?

Ejemplo7
71H1-1 &8KG productos?

Explicacin7
71H1-1 &8KG productos?

Eliminar todos los registros de la tabla productos

$CG

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>onsultas a5an@adas
-i bien no 5eremos aAu consultas realmente complejasD &a Aue el curso se basa en el lenguaje de programacin PHP & noD en el lenguaje de consulta -<!D haremos un 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
# & 9Q ma*or ;ue igual ;ue ma*or o igual ;ue ! !# :Q menor ;ue distinto ;ue menor o igual ;ue

R>5D>>3 nP ?3D n2 C2 3144a5 1>a6?42> C3$valor13 valor23 va...%

entre n1 * n2 es nulo L es verdadero L es falso contiene

Por supuestoD tambien admite operadores lgicos 7


?3D $*% 3%5 $negaciMn% % $o%

$CC

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

=eamos algunos ejemplos7 -eleccionar productos donde precio sea menor Aue $9997
"1H1)&8KG DH> > producto3 precio productos precio ! P:::+

Aumentar el $9f del precio de los productosD Aue actualmente se encuentren entre $/9 & 8997
R#7P-1 "1DH> > productos precio Q $precio U 1.1'% precio R>5D>>3 P5: ?3D 2::+

-eleccionar productos donde enBstoc: no sea (also


"1H1)&8KG DH> > producto3 precio productos en$stock C2 3%5 6?42>+

Eliminar productos cu&os precios sean $99D 899 &+o ?99 & adem2sD enBstoc: sea (also o producto sea nulo7
71H1-1 &8KG DH> > ?3D % productos precio C3'P::8 2::8 3::( '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 "1DH> > ?3D productos en5stoc6 Q -8R1 precio ! 5: en$stock C2 3%5 3144+

899

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4rdenando consultas7 la cl2usula 40'E0 BR


Es posible adem2sD ordenar los resultados de una consultaD en (orma ascendente EP")F o descendente E71")F7
"1H1)producto3 descripcion3 precio productos precio I1-E11S 1 PS7 5' en5stoc6 B" SK- &PH"1 RN precio D>2B+

&8KG E.181 PS7 % D>

TambiHn es posibleD ordenar los resultados de la consultaD por m2s de un campo7


"1H1)producto3 descripcion3 precio productos precio I1-E11S 1 PS7 5' en5stoc6 B" SK- &PH"1 RN precio D>2B8 producto ?2B+

&8KG E.181 PS7 % D>

Alias de tablas & campos


4tra posibilidad Aue nos da el lenguaje -<!D es utili@ar alias para el nombre de los campos & las tablas# Estos alias se asignan mediante la palabra cla5e reser5adaD ?27
"1H1)producto descripcion precio productos ?2 =3om.re del Producto=8 ?2 Detalles8 ?2 Cmporte ?2 p

&8KG E.181 PS7

precio I1-E11S 1 PS7 5' en5stoc6 B" SK- &PH"1

89$

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

% D>

RN

precio D>2B8 producto ?2B+

)tese Aue los alias extraPos D deben ser simples

Aue contengan caracteres encerrados entre comillas

,unciones del lenguaje -<! de "&-<!


Es posible tambiHnD utili@ar di5ersas (unciones propias del lenguaje -<! L&a sea estandar o de "&-<!L a (in de poder obtener los datos con cierto (ormato# =eremos aAuellas de uso m2s (recuente#

>ontar la cantidad de registros7 >4*)TEF


"1H1)&8KG B%135'producto( productos? P" )antidad

-umar totales7 -*"EF


"1H1)&8KG 21L'precio( productos? P" -otal

>oncatenar cadenas7 >4)>ATEF


"1H1)&8KG producto3 B%3B?5'=12D =8 precio8 =.-=( productos? P" #recio

)tese Aue las cadenas de caracteres deben encerrarse entre comillas simples & Aue el operador de concatenacin para esta (uncinD es la coma#

898

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>on5ertir a min3sculas & ma&3sculas7 !>A-EEF & *>A-EEF


"1H1)&8KG 1B?2>'producto(8 4B?2>'descripcion( productos?

0eempla@ar datos7 0EP! A>EEF


"1H1)&8KG >P4?B>'descripcion8 =Sn=8 =!.r)#=( productos? P" 7escripcion

0eempla@a bgnb por bZbr+Xb

4btener los primeros o 3ltimos caracteres7 !E,TEF & 0I HTEF


"1H1)&8KG 4>65'producto8 5:( productos?

0edonder n3meros7 04*)'EF


"1H1)&8KG %13D'precio8 2( productos?

0etornar2 los precios con 8 decimales

4btener solo la (echa de un campo 'ATETI"E o TI"E-TA"P7 'ATEEF


"1H1)&8KG D?5>'campo$datetime( ta la?

4btener una (echa (ormateada7 'ATEB,40"ATEF


"1H1)&8KG D?5>$6% L?5'campo$fecha8 =bd)bm)bN=( ta la?

Aplican los mismos patrones de (ormato de (echa Aue en PHP

89?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

4btener el registro con el 5alor m2ximo & mnimo7 "ASEF & "I)EF
"1H1)&8KG L?c'precio( productos?

0etorna el producto con el precio m2s caro

"1H1)&8KG

LC3'precio( productos?

0etorna el producto con el precio m2s barato

4ptimi@acin de bases de 'atos


A continuacinD encontrar2s una lista de consejos Aue -IE"P0E debes seguirD al momento de crear nue5as tablas & escribir sentencias -<!#

Todos los registros deben tener un I' 3nico


>uando crees tablasD asgnales un campo id de tipo autonumHrico incremental & 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 P CL? 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>rear ndices en las tablas


Todas las tablas deben tener un ndice# El ndice se asigna a uno o m2s camposD & es utili@ado por -<! para (iltrar registros de (orma m2s r2pida# 'ebes crear ndices con precaucinD &a Aue de la misma (orma Aue se aceleran las consultasD se 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( %?

Indica 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

)81P-1 -PIH1 productos$ id BS-$11% SK- SRHH PR-K5BS)81G1S- #8BGP8X g1X3 producto JP8).P8$125% 3%5 31443 precio 71)BGPH$1'3 2% 3%5 31443 en5stoc6 IKKH3 descripcion IHKI 3%5 31443 BS71F$precio3 en5stoc6% %?

*tili@a el motor Inno'B


El motor de bases de datos Inno'BD te permitir2 crear tablas relaciones optimi@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(ormacin


'escarga el "anual de "&-<! Aprende sobre el lenguaje -<!D gratis en $Te&'ata

891

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Trabajando con "&-<! desde PHP


Antes de comen@arD deseo aclarar seguridadL en nuestros archi5os PHPD una base de datosD para reali@ar modi(icacinD insercin & eliminacin bases de datos existentes# Aue Lpor cuestiones de solo nos conectaremos a consultas de seleccinD de registros en tablas &

)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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

5eremos como utili@ar ambos#

Antes de continuarD 5amos a instalar el mdulo de "&-<! para PHP7


sudo apt-get install php5-m*s;l

"&-<! desde PHP con el conector m&sAl


=eremos como utili@ar el conector m*s;lD a solo e(ecto educati5oD pero para 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 la base de datos


$host Q ClocalhostC? $usuario Q CrootC? $clave Q CcontraseaaC?

89G

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$conn Q m*s;l5connect$$host3 $usuario3 $clave% or die$CSo me pude conectar a la ase de datosC%?

-eleccionar una base de datos


$d Q Ccurso5phpC? ase de datosC%? m*s;l5select5d $$d % or die$CSo pude seleccionar la

Ejecutar una consulta simple


$s;l Q D BS"18- BS-K JPHR1" D? $result Q m*s;l5;uer*$$s;l% or die$CSo pude e>ecutar la consultaC%? usuarios $username3 email3 password% $C>uanpere@C3 C>pere@@algundominio.extC3 C2(ec',ef(1f125!+! ,+a12(,!a+a!aeC%

Ejecutar una consulta de seleccin m3ltiple & capturar sus resultados


$s;l Q D "1H1)- id3 username3 email &8KG usuarios D? $result Q m*s;l5;uer*$$s;l% or die$CSo pude e>ecutar la consultaC%?

>apturamos el arra& con los resultados


while$$registros]^ Q m*s;l5fetch5arra*$$result%%?

El arra& de5uelto E$registrosF ser2 del tipo multidimensionalD con un (ormato como el siguiente7
$registros Q arra*$

89C

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

%?

arra*$Ccampo1CQ9CvalorC3 Ccampo2CQ9CvalorC3 Ccampo,CQ9CvalorC%3 arra*$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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Algunos ejemplos concretos


>onsulta de seleccin
d #reparo los datos para conectarme a la 7I $host Q ClocalhostC? $usuario Q 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 Hi ero 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

$conn Q m*s;l5connect$$host3 $usuario3 $clave% or die$CSo me pude conectar a la ase de datosC%? d "elecciono la 7I a utili@ar m*s;l5select5d $$d % or die$CSo 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

"&-<! desde PHP con el conector m&sAli


>omo comentamos anteriormenteD m*s;li es un conector mucho m2s seguro & potente Aue m*s;l# -i bien la (orma m2s acertada de implementar este conectorD es a 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 & seleccionar la 'B a utili@ar 8# Preparar la consulta ?# Ejecutar una consulta %# >apturar los resultados /# >errar consulta
8$?

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

1# >errar la conexin

Abrir una conexin mediante m&sAli


d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de 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 JPHR1" D? usuarios $username3 email3 password% $"8 "8 "%

!uegoD de(iniremos los datos din2micos mediante 5ariables7


$username Q C>uan-pere@C? $email Q C>uan5pere@@algundominio.extC? $password Q C2(ec',ef(1f125!+! ,+a12(,!a+a!aeC?

8$%

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

!uegoD le indicamos a m&sAli Aue inicie la preparacin para la consulta7


$pre Q m*s;li5prepare$$conn3 $s;l%?

R (inalmenteD le decimos Aue una los par2metros a la consultaD indic2ndole el tipo de datos correspondiente7
m*s;li5stmt5 ind5param$$pre3 DsssD3 $username3 $email3 $password%?

El segundo par2metro de la (ucin m*s;li5stmt5 ind5param EsssF indica el tipo de 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( do le/decimal '.( lo

El eAui5alente para otros tipos de datos no listados arribaD es7


6echas y horas Rooleanos son cadenas de texto. #or lo tanto3 se utili@a es un entero $K: &alse3 1: -rue%. Rtili@ar s i

Ejecutar la consulta
m*s;li5stmt5execute$$pre%?

>errar la consulta
m*s;li5stmt5close$$pre%?

8$/

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>errar la conexin
m*s;li5close$$conn%?

Ejemplo de insercin completo


d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de 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;li5stmt5 ind5param$$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 K tener 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 aplica tambiHn a consultas de actuali@acinD modi(icacin & eliminacin #

8$1

Programacin Procedural de Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

>apturar resultados de una consulta de seleccin


En una consulta de seleccin Edonde necesito capturar los resultados de5ueltosFD 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 los nombres de los campos de5ueltos a nombres de 5ariables & se logra as7
m*s;li5stmt5 ind5result$$pre3 $id3 $username3 $email%?

>laramenteD le estamos indicando al conectorD Aue nos re(eriremos a los campos 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 Aplicaciones Web de baja complejidad


PHP Experto Tomo I

Eugenia Bahit

Ejemplo completo de consultas de seleccin


d #reparar las varia les con los datos de conexiMn $host Q ClocalhostC? $usuario Q CrootC? $clave Q CcontraseaaC? $d Q Ccurso5phpC? d )onectarse a la ase de 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;li5stmt5 ind5param$$pre3 DsssD3 $username3 $email3 $password%? d 1>ecuto la consulta m*s;li5stmt5execute$$pre%? d asocio los nom res de campo a nom res de varia les m*s;li5stmt5 ind5result$$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