Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programador PHP
Programador PHP
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
?
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
Eugenia Bahit
Imprimir en pantalla con printBr################################################/C Acceso a los tems de un arra&#################################################/C "odi(icando elementos#############################################################19 Agregar elementos####################################################################19
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?
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
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##############################################################$?$
Eugenia Bahit
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$
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
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
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
$?
Eugenia Bahit
-er5idor Web7 Apache -er5idor de bases de datos7 "&-<! !enguaje de programacin hbrido EmultiparadigmaF & de alto ni5el7 PHP
)*+!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#
$%
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#
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+
$/
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
)*+!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
Eugenia Bahit
(iguran
los
men3es
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
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
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
Eugenia Bahit
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#
Apagar Apache7
sudo /etc/init.d/apache2 stop
0einiciar Apache7
89
Eugenia Bahit
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
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
8$
Eugenia Bahit
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
88
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
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
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%
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
/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/
Eugenia Bahit
>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
a los
/var/www/miwe / archi5os de
81
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
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
8G
Eugenia Bahit
de
modi(icar
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
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
Eugenia Bahit
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
?$
Eugenia Bahit
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
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
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
??
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
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
?/
Eugenia Bahit
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
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
Eugenia Bahit
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
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.
Estandari@acin de cdigo *tili@a nombres descripti5os para las 5ariablesV -i el nombre es compuestoD separa cada palabra por un
?C
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
-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
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
asegurarnos
reali@ar
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#
%$
Eugenia Bahit
*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
Eugenia Bahit
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
%?
Eugenia Bahit
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!?
%%
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
%/
Eugenia Bahit
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
Eugenia Bahit
re;uire5once$Darchivo.htmD%? A9
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
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%?
%G
Eugenia Bahit
)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
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 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
Eugenia Bahit
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.
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
TambiHn podemos conbinar else e i(D para tomar tantas decisiones como condiciones Auieran e5aluarse7
/8
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
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
/?
Eugenia Bahit
/%
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#
//
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
Eugenia Bahit
/6
Eugenia Bahit
-intaxis b2sica
!a sintaxis b2sica se compone de7
arra*$clave Q9 valor3 %?
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*$%?
/C
Eugenia Bahit
"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*%?
19
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$
Eugenia Bahit
'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
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
1?
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#
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
Eugenia Bahit
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/
Eugenia Bahit
11
Eugenia Bahit
*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
Eugenia Bahit
*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
Eugenia Bahit
'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
Eugenia Bahit
$*earTT? , while $$*ear : 1++'%? print5r$$*ears%? "# 9rra' ( K0L DM 1HH0 ) #" print $*ear? // 1++1
69
Eugenia Bahit
-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$
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#
68
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?
Eugenia Bahit
6%
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+
6/
Eugenia Bahit
mi$etiKueta0 echo chr$1'% . D1sto s< ser= mostradoD . chr$1'%? echo DX esta tam iZnWD . chr$1'%? A9
-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
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
66
Eugenia Bahit
'eclarando ,unciones
-intaxis b2sica
!a sintaxis b2sica de una (uncinD es 5erdaderamente sencilla7
function nom re5de5la5funcion'parametros( * "" algoritmo ,
6G
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 ,
)inguna salida ser2 obtenida de lo anteriorD puesto Aue la (uncinD no ha sido llamada7
eugenia@cocochito:~$ php -f file.php eugenia@cocochito:~$
6C
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
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
"" 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$
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
Eugenia Bahit
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?
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#
>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%
Eugenia Bahit
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
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
G6
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?
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
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
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
Eugenia Bahit
C9
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#
C$
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
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?
Eugenia Bahit
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%
Eugenia Bahit
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
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
*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%?
C1
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
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%?
CG
Eugenia Bahit
>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
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%?
Al igual Aue cuando abrimos un archi5oD cuando abrimos un directorioD es necesario cerrarlo para liberarlo de memoria7
closedir$$recurso%?
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$
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<os . ' .. 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
#"
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?
Eugenia Bahit
$contenido Q arra*$C7irectoriosC Q9 $directorios3 CPrchivosC Q9 $archivos3 C1nlaces sim MlicosC Q9 $s*mlin6s%? print5r$$contenido%?
)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#
Eugenia Bahit
$9/
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
$91
Eugenia Bahit
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
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+
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
$9G
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
Eugenia Bahit
,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
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? "#
$$$
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(#
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
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
$$?
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
&
$$%
Eugenia Bahit
'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
$$/
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
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
Eugenia Bahit
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
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
$$C
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
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$
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 %
$88
Eugenia Bahit
$8?
Eugenia Bahit
addslashes
Escape
!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
$8%
Eugenia Bahit
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
!i$rado
hash
$8/
Eugenia Bahit
$81
Eugenia Bahit
>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#
$86
Eugenia Bahit
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%?
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
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
$8C
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
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
$?$
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
sobre
la
superglobal
$5"18J18
puede
http7++...#php#net+manual+es+reser5ed#5ariables#ser5er#php#
$?8
Eugenia Bahit
=arios destinatarios7
user2@mail.com3 user2@mail.com3 user5@mail.com
$??
Eugenia Bahit
R lgicamenteD anteriores7
cualAuier
combinacin
de
las
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#
$?/
Eugenia Bahit
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
Eugenia Bahit
$?6
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
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
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
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;)
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
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
!o anteriorD es posible gracias a Aue la (uncin date'( puede recibir opcionalmente como par2metroD una marca de tiempo
$%$
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
Eugenia Bahit
$%?
Eugenia Bahit
$%%
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+
$%/
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#
$me>or5oferta Q max$1',.,53 1'+.4!%? "" 10H.Q4 $peor5oferta Q min$1',.,53 1'+.4!%? "" 10A.A5
$%1
Eugenia Bahit
$%6
Eugenia Bahit
)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
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
Eugenia Bahit
>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
Eugenia Bahit
) #"
$/$
Eugenia Bahit
$/8
Eugenia Bahit
$/?
Eugenia Bahit
$/%
Eugenia Bahit
$//
Eugenia Bahit
$/1
Eugenia Bahit
) #"
$/6
Eugenia Bahit
$/G
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 #"
$/C
Eugenia Bahit
) #"
DM DM DM DM
$19
Eugenia Bahit
DM DM DM DM
$1$
Eugenia Bahit
'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
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#
entre
coo:ies
&
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#
$1%
Eugenia Bahit
$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/
Eugenia Bahit
$11
Eugenia Bahit
$16
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
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
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+
$69
Eugenia Bahit
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$%?
$6$
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
"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
Eugenia Bahit
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
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%
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/
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)
!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
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 "'/#
#"
$66
Eugenia Bahit
#" 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
Eugenia Bahit
Esta (uncinD ser2 la Aue in5ocaremos desde todas & cada una de las p2ginasD a las cuales Auerramos restringir su acceso#
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
Eugenia Bahit
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
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$
Eugenia Bahit
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
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 ")
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?
Eugenia Bahit
display$errors
track$errors
"tring %ff
SRHH
error$append$string
SRHH
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
$G/
Eugenia Bahit
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*
$G1
Eugenia Bahit
$G6
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
En este cursoD utili@aremos la 5ersin estandar licenciada bajo la )* eneral Public !icense E P!F#
'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
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
!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
$GC
Eugenia Bahit
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
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#
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#
necesarios
para
Eugenia Bahit
mano 7F
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
Eugenia Bahit
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?
Eugenia Bahit
Pao )adena de longitud fi>a )adena de longitud varia le Ilo;ue de texto de gran longitud varia le
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
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
$C%
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 precio de tipo numHrico de longitud m2xima de 1 digtos de los cualesD solo 8 pueden ser decimales
en5stoc6 IKKH
$C/
Eugenia Bahit
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
>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
Eugenia Bahit
&8KG
productos?
Explicacin7
"1H1)producto3 precio
"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
"1-
en5stoc6 Q &PH"13
precio Q '?
$C6
Eugenia Bahit
Eliminar registros
-intaxis7
D>4>5> 6 %L ta la?
Ejemplo7
71H1-1 &8KG productos?
Explicacin7
71H1-1 &8KG productos?
$CG
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
$CC
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::+
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
Eugenia Bahit
89$
Eugenia Bahit
% D>
RN
)tese Aue las cadenas de caracteres deben encerrarse entre comillas simples & Aue el operador de concatenacin para esta (uncinD es la coma#
898
Eugenia Bahit
89?
Eugenia Bahit
4btener el registro con el 5alor m2ximo & mnimo7 "ASEF & "I)EF
"1H1)&8KG L?c'precio( productos?
"1H1)&8KG
LC3'precio( productos?
El campo idD ser2 como cualAuier otro & lo podr2s seleccionar en un -E!E>T o utili@arlo e cualAuier cl2usula WHE0E#
89%
Eugenia Bahit
89/
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% %?
891
Eugenia Bahit
)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
Eugenia Bahit
89G
Eugenia Bahit
El arra& de5uelto E$registrosF ser2 del tipo multidimensionalD con un (ormato como el siguiente7
$registros Q arra*$
89C
Eugenia Bahit
%?
Es decirD Aue ser2 un arra&D conteniendo otro arra& por cada registro encontrado#
>errar la conexin
m*s;l5close$$conn%?
8$9
Eugenia Bahit
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%?
8$$
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
Eugenia Bahit
=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$?
Eugenia Bahit
1# >errar la conexin
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 "%
8$%
Eugenia Bahit
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
Ejecutar la consulta
m*s;li5stmt5execute$$pre%?
>errar la consulta
m*s;li5stmt5close$$pre%?
8$/
Eugenia Bahit
>errar la conexin
m*s;li5close$$conn%?
)tese Aue el ejemplo de insercinD aplica tambiHn a consultas de actuali@acinD modi(icacin & eliminacin #
8$1
Eugenia Bahit
>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
Eugenia Bahit
8$G