Está en la página 1de 73

(PHPVersin5.1.2,MySQLversin5.0.

24)

CopyrightCdricSimon,2006

Autor:CdricSimon

SolucionJava.com

Manualdelalumno

Ing.CedricSimonTel:2680974Cel:8882387Email: c e d r i c @ s o l u c i o n j a v a . c o m Web:www.solucionjava.com

Cursodeprogramacin
en
PHPconMySQL

CursodeprogramacinenPHPconMySQL

Pagina2/73

1. ndice
1. ndice...........................................................................................................................................................................2
2. Introduccin al curso.................................................................................................................................................5
2.1. Objetivo de este curso..............................................................................................................................................5
2.2. Manual del alumno..................................................................................................................................................5
2.3. Requisitos para atender a este curso.....................................................................................................................5
3. Introduccin al PHP...................................................................................................................................................6
3.1. Que es el PHP?........................................................................................................................................................6
3.2. Por qu utilizaramos el PHP?.............................................................................................................................6
3.3. Navegadores web......................................................................................................................................................6
4. El protocolo HTTP.....................................................................................................................................................7
4.1. Modelo de consulta / respuesta HTTP..................................................................................................................7
4.2. Detalles de una consulta..........................................................................................................................................7
4.3. Detalles de respuesta................................................................................................................................................8
4.4. Parmetros de consulta...........................................................................................................................................9
4.5. Mtodos de consulta.................................................................................................................................................9
5. Instalacin del PHP..................................................................................................................................................11
5.1. Objetivo del capitulo..............................................................................................................................................11
5.2. Cual versin?..........................................................................................................................................................11
5.3. Instalacin de PHP.................................................................................................................................................11
5.4. Instalacin de Eclipse y del plugin para PHP....................................................................................................12
5.4.1. Inicializacin del plugin para PHP.............................................................................................................12
5.4.2. Configuracin de Apache...........................................................................................................................12
5.5. Instalacin de MySQL...........................................................................................................................................13
6. Primera pgina PHP................................................................................................................................................14
6.1. Objetivo del capitulo..............................................................................................................................................14
6.2. Creacin de un nuevo proyecto web....................................................................................................................14
6.3. Creacin de la pgina de ndice...........................................................................................................................14
7. Utilizacin de los scriptlets.......................................................................................................................................16
7.1. Qu son los scriptlets?.........................................................................................................................................16
7.2. Separacin de instrucciones..................................................................................................................................16
8. Caractersticas del lenguaje PHP.............................................................................................................................17
8.1. Objetivo del capitulo..............................................................................................................................................17
8.2. Lista de Palabras Clave.........................................................................................................................................17
8.3. Sensibilidad.............................................................................................................................................................17
8.4. Identificadores........................................................................................................................................................17
8.5. Declaracin de variables.......................................................................................................................................18
8.6. Tipos simples ( o primitivos).................................................................................................................................18
8.6.1. Boolean.......................................................................................................................................................19
8.6.2. Enteros........................................................................................................................................................19
8.6.3. Nmeros de punto flotante.........................................................................................................................21
8.6.4. Cadenas......................................................................................................................................................21
8.6.5. Matrices......................................................................................................................................................26
8.6.6. Objetos........................................................................................................................................................29
8.6.7. Recurso.......................................................................................................................................................29
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina3/73

8.6.8. NULL.........................................................................................................................................................29
8.7. Constantes...............................................................................................................................................................30
8.7.1. Sintaxis.......................................................................................................................................................30
8.8. Operadores..............................................................................................................................................................30
8.8.1. Principales operadores sobre integer y float...............................................................................................31
8.8.2. Operadores de Comparacin......................................................................................................................31
8.8.3. Operadores de Lgica.................................................................................................................................33
8.8.4. Operador Ternario......................................................................................................................................33
8.9. Manipulacin de Tipos..........................................................................................................................................33
8.9.1. Moldeamiento de Tipos..............................................................................................................................34
8.9.2. Precedencia de Operadores........................................................................................................................35
8.10. Comentarios..........................................................................................................................................................36
9. Decisiones y bucles...................................................................................................................................................37
9.1. Objetivo del capitulo..............................................................................................................................................37
9.2. if ... elseif...else.........................................................................................................................................................37
9.3. Sintaxis Alternativa de Estructuras de Control................................................................................................37
9.4. switch........................................................................................................................................................................38
9.5. while..........................................................................................................................................................................38
9.6. do ... while................................................................................................................................................................39
9.7. for..............................................................................................................................................................................39
9.8. foreach......................................................................................................................................................................40
9.9. break.........................................................................................................................................................................40
9.10. continue..................................................................................................................................................................40
10. Funciones................................................................................................................................................................41
10.1. Funciones definidas por el usuario....................................................................................................................41
10.1.1. Funciones Condicionales..........................................................................................................................41
10.1.2. Funciones dentro de funciones.................................................................................................................41
10.1.3. Parmetros de las funciones.....................................................................................................................42
10.1.4. Devolviendo valores.................................................................................................................................43
10.2. Funciones internas (incorporadas)....................................................................................................................44
10.2.1. Unas de las funciones internas ms interesantes......................................................................................44
10.3. Funciones variables..............................................................................................................................................46
10.3.1. print..........................................................................................................................................................46
10.3.2. echo..........................................................................................................................................................46
10.3.3. require()....................................................................................................................................................46
10.3.4. include()....................................................................................................................................................47
11. Tratamiento de excepciones...................................................................................................................................49
11.1. Objetivo del capitulo............................................................................................................................................49
11.2. Errores de compilacin.......................................................................................................................................49
11.3. Errores de lgica..................................................................................................................................................49
11.4. Errores de ejecucin............................................................................................................................................49
11.4.1. Niveles de error de ejecucin...................................................................................................................49
11.4.2. set_exception_handler..............................................................................................................................51
12. Los formularios.......................................................................................................................................................53
12.1. Creacin del formulario......................................................................................................................................53
12.2. Tratamiento del formulario................................................................................................................................53
12.2.1. import_request_variables.........................................................................................................................55
13. Utilizacin de COOKIES........................................................................................................................................56
13.1. Qu son los COOKIES?....................................................................................................................................56
13.2. Creacin de un COOKIE....................................................................................................................................56
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina4/73

13.3. Recuperacin de informacin de un COOKIE...............................................................................................57


13.4. Borrado de un COOKIE.....................................................................................................................................58
14. Utilizacin de variables de sesin...........................................................................................................................59
14.1. Inicio de sesin......................................................................................................................................................59
14.2. Declaracin de variable de sesin......................................................................................................................59
14.3. Recuperar el valor de un variable de sesin....................................................................................................59
14.4. Invalidar una sesin.............................................................................................................................................59
15. Variables Predefinidas............................................................................................................................................60
15.1. Variables de servidor: $_SERVER...................................................................................................................60
15.2. Variables de entorno: $_ENV............................................................................................................................60
15.3. Cookies HTTP: $_COOKIE...............................................................................................................................60
15.4. Variables HTTP GET: $_GET..........................................................................................................................60
15.5. Variables HTTP POST: $_POST......................................................................................................................60
15.6. Variables de carga de archivos HTTP: $_FILES...........................................................................................60
15.7. Variables de peticin: $_REQUEST.................................................................................................................60
15.8. Variables de sesin: $_SESSION.......................................................................................................................60
15.9. Variables globales: $GLOBALS........................................................................................................................61
15.10. El mensaje de error previo: $php_errormsg.................................................................................................61
16. Conexin a MySQL................................................................................................................................................62
16.1. Objetivo del capitulo............................................................................................................................................62
16.2. Driver ODBC........................................................................................................................................................62
16.3. Driver PHP............................................................................................................................................................62
16.4. Conexin................................................................................................................................................................62
16.5. Ejecucin de instrucciones SQL........................................................................................................................62
16.6. consultas preparadas...........................................................................................................................................63
16.7. Llamado a procedimientos..................................................................................................................................64
16.8. Recuperacin de fotos en la base de datos........................................................................................................65
17. Autenticacin del usuario.......................................................................................................................................67
17.1. Autentificacin HTTP con PHP.........................................................................................................................67
17.1.1. Control de acceso a los recursos web.......................................................................................................67
17.1.2. Verificacin de la informacin del usuario..............................................................................................67
17.1.3. Recuperacin de la informacin del usuario............................................................................................68
17.2. Autenticacin manejada por la aplicacin.......................................................................................................68
18. Ejercicios.................................................................................................................................................................71
19. Esquema de la base de datos..................................................................................................................................73

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina5/73

2. Introduccinalcurso
2.1. Objetivodeestecurso
EnestecursovamosaverellenguajePHPycomoconectarseaunabasededatosdetipoMySQLde
desdePHP.

2.2. Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Este
manualcontieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumno
deberadetomarnotaspersonalesparacompletasestemanual.
EnelCDdecursovienetambienladocumentacinoficialdePHPydeMySQLenformatoHTML
(debajolacarpeta'documentacion').Estadocumentacincompletaestemanual.
EstemanualdelusuariovienetambienenformatoPDFenelCDdelcurso.

2.3. Requisitosparaatenderaestecurso
ElconocimientodellenguajeHTMLesrequeridoparapoderseguirestecurso.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina6/73

3. IntroduccinalPHP
3.1. QueeselPHP?
ElPHPesunlenguajedeprogramacinutilizadoparacrearpginaswebdinmicas.
ElPHPnecesitaqueunservidorwebconcapacidadPHPseainstaladoyfuncionandoparapoder
ejecutarlaspginasPHP.
ElservidorvaacompilarelcdigoPHPytratarloentiemporeal,conlainformacinviniendodel
clienteweb,pararegresarleunapaginawebadaptada,entiemporeal.
Elservidortienetambincapacidaddeseguirelcaminodeunusuario,ascmodeidentificarlo.

3.2. PorquutilizaramoselPHP?
ElPHPsenecesitacuandolapaginawebtienequeadaptarseenfuncindelusuario,ycuandose
necesitaguardarvaloresdesesindelusuario.
Existenotroslenguajequepermiteneso,comoelASPoelJSP,peroelPHPtienecomoaventajeque
esunlenguajefcilaaprender.LosservidoresPHP(comolosservidoresJSP)existenparavarios
sistemasoperativos,entreotrosWindows,Linux,yUnix.
ElPHPesunestndardeprogramacinInternet.

3.3. Navegadoresweb
SilosnavegadorespruebantodosdepoderaplicaralmximolasrecomendacionesdelHTML4.0
existenciertasopciones,adentrooafueradelHMLestndarqueslociertosnavegadoressoportan.
Tambin,unmismocdigonoaparecersiempreigualenunnavegadoreenotro.
ElPHPnoestligadodirectamenteconlosnavegadores,peroelHTMLquegeneraransi.Asqueun
cdigogeneradopodrafuncionarbienenunnavegador,ydarunresultadodiferenteenotro.
Enestecurso,utilizaremoselnavegadorFirefoxdeMozilla.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina7/73

4. ElprotocoloHTTP
ElprotocoloHTTP(HyperTextTransportProtocol)esunprotocoloquedefineendetallecmoun
clienteyunservidordebencomunicarentreellos.ElmodelodecomunicacinHTTPesalabasedel
web.Elprotocoloseaplicaacualquierservidoryclienteweb.Vamosaexaminarlosdetallesms
importantedelprotocoloHTTP.

4.1. Modelodeconsulta/respuestaHTTP
ElHTTPylosprotocolosextendidosbasadossobreelutilizanunmodelodecomunicacinsimple,
peropoderoso.
Demaneratpica,unclienteenvaunaconsultaparaunrecursoaunservidor,yelservidorcontesta
unarespuestaquecorrespondealrecursopreguntado(ocontestaconunmensajedeerror).Elrecurso
puedeserunapginaHTML,ounaaplicacinquecontestaconuncontenidodinmico.

EstemodelosimpleimplicatrescosasqueUstedtienequeserconciente:
1. ElprotocoloHTTPesunprotocolosinestado.Esdecirqueelservidornoguardaningn
informacinacercadelclientedepusedehaberlecontestado,yporesonopuedereconocerque
variasconsultasdeunmismoclientepuedenserrelacionadas.
2. Laaplicacinwebnopuedeentregarunarespuestainmediato,comoenaplicacioneslocales.
Lavelocidaddependedelanchodebandadisponibleydelacargadelservidor.
3. Nohaynadaenelprotocoloqueindicaalservidorcomolaconsultalehallegado,asqueel
servidornopuededistinguirdiferentemtodosdeconsulta.Porejemplo,enservidornopuede
distinguirunaconsultageneradaporunclicenunenlacedelusodelbotn'atrs'del
navegador.Tambin,comoelHTTPessinestado,nosepuedeadentrodelHTTPllamarala
pginaanterior.

4.2. Detallesdeunaconsulta
Existendosmtodosdeconsulta:GETyPOST.GETeslamsutilizada,ylaqueseusopordefecto.
Ejemplodeunaconsulta:
GET /index.html HTTP/1.0
Host: www.gefionsoftware.com
User-Agent : Mozilla/4.5 [en] (WinNT; I)
Accept: image/gif, image/jpeg, image/pjpeg, image/png, */*
Accept-language : en
Accept-charset : iso-8859-1,*,utf-8

LaprimeralneaespecificaqueseusaelmtodoGETysepreguntapararegresarelrecurso
/index.htmlutilizandoelprotocoloHTTP/1.0.Lasotraslneasproveenttulosconinformacin
adicionalalservidorparacumplirconlaconsulta.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina8/73

ElttuloHOSTdicealservidorelnombre(hostname)utilizadoenelURL.Unservidorpuedetener
variosnombres,yesteinformacinpermitedistinguirmltipleservidoresvirtualesutilizandoun
mismoprocesoweb.
ElttuloUser-Agentcontieneinformacinsobreeltipodenavegadorutilizadoparahacerlaconsulta.
Elservidorpuedeutilizaresteinformacinparagenerarrespuestasdiferentesdependiendodel
navegador(IE,Netscape,WAP,PDA,...).
LosttulosAcceptproveeninformacinsobreelidiomayelformatodearchivoqueelnavegador
acepta.

4.3. Detallesderespuesta
Elmensajedelarespuestaparecealdelaconsulta.Elcontienetrespartes:unalneadeestado,unos
ttulosderespuesta,yelcuerpodelarespuesta.
Ejemploderespuesta:
HTTP/1.0 200 OK
Last-Modified: Mon, 19 Dec 2004 20:21:42 GMT
Date: Tue, 12 Jul 2005 13:12:10 GMT
Status: 200
Content-Type: text/html
Servlet-Engine: Tomcat Web Server/3.2
Content-Length: 59
<html>
<body>
<h1>Hello World!</h1>
</body>
</html>

Lalneadeestadoempiezaconelnombredelprotocolo,seguidoporelcdigoderesultadoyuna
brevadescripcindelcdigoderesultado.Aquelcdigoderesultadoes200,quesignificaquesali
conxito.
Elmensajederespuestatienettulos,comoeldeconsulta.Enesteejemplo:
ElttuloLast-Modifieddalafechayhoradecuandoelrecursofuemodificadoporltimavez.El
clientepuedeutilizarestainformacinparamarcarlapginaelsucach,ypedirenelfuturo
solamentelasquefueronmodificadas.
ElttuloContent-Typedicealnavegadorquetipodedatoscontieneelcuerpodelarespuesta.
ElttuloContent-Lengthdicealnavegadoreltamaodelcuerpodelarespuesta.
Unalneavacaseparalosttulosdelcuerpodelarespuesta.Elcuerpodelarespuestacontieneel
cdigoqueserenseadoenelnavegador.AquunasimplepginaHTML.
ElcuerpopuedecontenerpginasHTMLmscomplicadas,uotrotipodecontenido(imagen,sonido,
archivocomprimido,...).Elcuerpopuedetambincontenercdigoquevagenerarotrasconsultasal
servidor,comolainsercindeunaimagen.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina9/73

Interaccinentreunclienteyunservidorweb

4.4. Parmetrosdeconsulta
SepuedenpasarparmetrosdeconsultaadentrodelURL.Poreso,despusdelnombredelapgina,
hayquemencionarunpuntodepregunta'?'yunoavariosparmetrosdeparadospor'&',conel
nombredelparmetro,elsigno'=',yelvalordelparmetro.
Veremosejemplosutilizandolosformularios.

4.5. Mtodosdeconsulta
YahemosvistoelusodelmtodoGET.TambinexisteelmtodoPOST.Ladiferenciaentrelosdos
esqueelmtodoGETpasalosparmetrosadentrodelURL,asquesepuedeguardarfcilmenteen
sulistademarcadores.Tambin,ennavegadorsabequeestemtodonopuededaarelservidor,as
aceptadesometerlaconsultanuevamente(refresca)sinalerta.
ElmtodoPOST,envezdepasarlosparmetrosenelURL,lespasaadentrodelcuerpodela
consulta.Esopermiteenviarconsultadetamaomsgrandeque2000caracteres,ysinquelos
parmetrosaparecenenelURL.
Comolosparmetrosestnguardadosadentrodelcuerpodelaconsulta,laconsultanopuedeser
guardadatanfcilmenteenlosmarcadores,porqueademsdelURL,deberguardarelcuerpodela
consulta.
Tambin,cuandoseprobadeenviardenuevounaencuestoPOST(refresh)elnavegadorgenerauna
alertoporqueesteaccinpuedegeneraraccionesposiblementeirreversiblealniveldelservidor.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina10/73

Ejemplodeformulario:

<form action="/prueba.php" method="POST">


Cuidad: <input name="cuidad" type="text">
Pais: <input name="pais" type="text">
<p>
<input type="SUBMIT">
</form>

EjemplodeconsultaPOSTgeneradaporelformularioarriba:
POST / prueba.php HTTP/1.0
Host: www.businesssoft.com.ni
User-Agent : Mozilla/4.5 [en] (WinNT; I)
Accept: image/gif, image/jpeg, image/pjpeg, image/png, */*
Accept-language : en
Accept-charset : iso-8859-1,*,utf-8
cuidad=Managua&pais=Nicaragua

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina11/73

5. InstalacindelPHP
5.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnotendrunservidorPHPylasherramientasparadesarollarenPHP
instaladosensucomputadora.Esteesunrequisitoparapodercumplirlosejerciciosprcticos.

5.2. Cualversin?
ExistenvariasversionesdePHP.Latlimaversineslaversin5,yvamosautilizarestaversin.

5.3. InstalacindePHP
PHPproveeunpaquetedeinstalacinparaWindows.Elpaquetedeinstalacinprobaradeconfigurar
tambenelservidorweb(IIS/Apache2).Sifalla,ustedtendrqueconfirgurarelservidorweb
manualmente(documentacinincluidaenpaquetedeinstalacin).
BajoLinuxexistendosposibilidadesparainstalarPHP:compilarelpackete,outilizarunapaquete
precompilado(siexisteparasuversindeLinux).
SitiowebdePHP:http://www.php.net
Laversin10.1deSuseLinuxtraelaversin5dePHPensuspaquetesdisponiblesenelCD/DVD.
HayquenotarquePHPnopuedefunccionarsolo,sinoqueeltienequefuncionarconunservidor
Web,comoApacheorIIS.EnestecursovamosautilizarPHP5conApache2.
VamosainstalarlosutilizandoYAST,elprogaramadeinstalacinyconfiguracindeLinux.Hayque
buscarsobrePHPyseleccionarelconectorapache2modphp5,php5,php5mysqli,php5mbstring,y
phpzlib.LosdosltimosestanutilizadosporelsitiowebphpMyAdmin,quepermitemanejarlabase
dedatosMySQL.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina12/73

5.4. InstalacindeEclipseydelpluginparaPHP
ParadisearlaspginasPHP,vamosautilizarlaherramientaEclipseversin3.2,conelpluginpara
PHP.
Estosprogramassonlibresygratuitos,yfuncionanbajoWindowscomobajosLinux.
ParainstalarEclipevamosaabrirunaventanadeconsolayponernoscomoRoot(su).
Primero,Eclipseversin3.2necesitaJavaversin1.5oarriba.SuelJava1.5noestinstaladohay
queinstalarloprimero:
DedesdeelCDrom:
rpm

-iv jdk-1_5_0_07-linux-i586.rpm

AhoraelJavaestadisponibleenensistemabajo/usr/java/jdk1.5.0_07peroelJavapordefectoes
todavialaversion1.4.2queveniaconSuse.Sepuedeverificarejecutandojava -version
Paraquelaversionpordefectosealaversion1.5hayquecambiaralgunosenlacesdebajo
de/etc/alternatives.Paraeso,ejecutadesdeelCD'. modifySuseJDK15.sh'.Sisaleunerrordeque
algunarchivonoexiste,ignorala.
AhorapodemosinstalarEclipseysusplugins:
Comoroot,vamosacopiarelarchivodeinstalacindeEclipseyluegodecomprimirlo.
DedesdeelCDrom:
cp eclipse-SDK-3.2-linux-gtk.tar.gz /opt
cd /opt
tar -xvf eclipse-SDK-3.2-linux-gtk.tar.gz
cd /media/PHP
cp net.sourceforge.phpeclipse_1.1.8.bin.dist.zip /opt/eclipse
cd /opt/eclipse
unzip -o net.sourceforge.phpeclipse_1.1.8.bin.dist.zip
cd /opt/eclipse
chgrp users -R *

VamosacrearlacarpetaqueutilizaremosconEclipse.
md /workspace
chmod 777 -R /workspace/

VamosacopiarelarchivodeinstalacindeEclipseyluegodescomprimirlo.
cp Eclipse.desktop /opt/kde3/share/applnk/Development
cp Eclipse.desktop /usr/share/applications

AhoraEclipseestaenelmenudeaplicaciones(ydedesarrollo).

5.4.1. InicializacindelpluginparaPHP
ParapodermanejarPHPdedesdeEclipse,hayqueconfigurarelplugin.
Debajodelmenu'Window',elegir'Preferences'yelobjetoPHPeclipseWebDevelopment.Seleccionar
PHPexternaltoolsycorregirelcaminohaciaPHP.Ennuestrocaso/usr/bin/php5.

5.4.2. ConfiguracindeApache
ParaqueApachelealaspginasquecreamosenEclipse,tenemosqueconfigurarApache.
Hayqueabrirelarchivo/etc/apache2/httpd.confyalfinaladjuntarlaslneassiguientes:
NameVirtualHost *:80
########## Apache por defecto ##########
<VirtualHost *:80>
ServerName localhost

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina13/73

ServerAdmin cedric@solucionjava.com
AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru))?(/.*)?$ "/usr/share/apache2/manual$1"
<Directory "/usr/share/apache2/manual">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
<Files *.html>
SetHandler type-map
</Files>
SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru)/ prefer-language=$1
RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2
</Directory>
</VirtualHost>
########## PHP (Eclipse workspace) ##########
<VirtualHost *:80>
DocumentRoot /workspace
ServerName alumnoX (remplaza X por el numero de su maquina)
ServerAdmin cedric@solucionjava.com
<Directory "/workspace">
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Ahoratenemosdossitioswebennuestramquino:http://localhostqueapuntaalsitioApacheporde
defecto,yhttp://alumnoXqueapuntaraalacarpetadeEclipse(error403/accesoprohibidopor
defecto).

5.5. InstalacindeMySQL
EnestecursovamosautilizarlabasededatosMySQL,ensuversin5.0.27.Poresolavamosa
instalarya.
ParainstalarMySQLvamosprimeroaentrarcomoelusuarioRoot(ousarsu).
Luegoabrimosunaventanadeconsola,introducemoselCDdelcurso,yvamosainstalarlaversion
deMySQLqueestaenelCDlanzandodesdeelCDlainstruccin:
rpm -iv MySQL-server-5.0.27-0.glibc23.i386.rpm parainstalarelsevidor
rpm -iv MySQL-client-5.0.27-0.glibc23.i386.rpm parainstalarelcliente
EsoinstalloMySQLbajo/usr/bin.
Vamosacrearunacarpeta/mysqlconteniendolosatajoshaciaprogramasdeMySQL.
. createMySQLlinks.sh

Vamosahoraacambiarlaclavedelusuarioroot.Paracambiarlaclave,entraen/mysqlyejecuta:
/usr/bin/mysqladmin -u root password 'SolPHP'.Lanuevaclavesera'SolPHP'.
ParaverificarqueMySQLestabieninstaladoyseinicia,ejecuta'rcmysql

restart'comoRoot.

Yahoravamosacrearlabasededatosdelcurso:
cd /media/PHP
/mysql/mysql -u root -pSolJava
create database curso;
exit;
/mysql/mysql -u root -pSolJava curso < curso.sql

Einstalarunentornodedesarrollo(enPHP!)parapodervisualizarlabasededatos:
cp phpMyAdmin.tar.gz /workspace
cd /workspace
tar -xvf phpMyAdmin.tar.gz

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina14/73

6. PrimerapginaPHP
6.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnoharcreadoyejecutadosuprimercdigoPHP.
Estaprimerapginaservirdebaseparaponerenprcticayprobarlateoraquevamosaverenlos
prximoscaptulos.

6.2. Creacindeunnuevoproyectoweb
AliniciarEclipseelegimoselworkspace'/workspace'.
ParacrearnuestraprimerapginaPHP,necesitamoscrearunsitioweb.Poreso,enEclipse,creamos
unnuevoproyectoPHP,quellamamoscurso,conlosvalorespordefecto.

AliniciarEclipseelegimoselworkspace'/workspace'.

6.3. Creacindelapginadendice
Parapoderprobarelservidor,vamosacrearnuestraprimerapginaPHP.
Poreso,hacemosunclicderechosobrelacarpetacurso,yelegimosnew...PHPFile,yenlaventana
queseabre,mencionamosennombredelarchivo:index.php.
Todaslapginasconextensinphp(.phpenminuscula)sernanalizadasporelservidorPHPy
producirnunapginaHTMLcomosalida.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina15/73

Paraprobarsilapginafunciona,tenemosquellenarlaconalgncdigoPHPy/oHTML.Pordefecto
lapaginaindex,phpquehemoscreadoyaestaabierta.Miramosqueyavieneconalgncdigopre
hecho.
Vamosamodificarelcdigodelamanerasiguiente,yloguardamos:
<?php
/*
* Created on 21/07/2006
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Mi primera P&aacute;gina PHP";
$nrPagina=1;
?>
<title><?PHP echo $titulo; ?></title>
</head>
<body bgcolor="#FFFFFF">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<p>
Este es mi p&aacute;gina en PHP numero <?PHP echo $nrPagina; ?>.
</body>
</html>

Luegomiramoselresultadoconunnavegadorwebeneldomicilio:http://alumnoX/curso/o
http://alumnoX/curso/index.php
Aspodemosverqueenlabarradeaplicacincomoenlaprimeralneadelapginasaleenvalorde
lavariable'titulo'.
1.1

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina16/73

7. Utilizacindelosscriptlets
7.1. Qusonlosscriptlets?
LosscriptletssonlasetiquetasquepermitendedelimitarelcdigoPHP,quetienequeseranalizado
porelservidorPHP,delcdigoHTML,quetienequeserenviadoalclientecomotal.Aselservidor
PHPcombinaelcdigoHTMLconelresultadodelcdigoPHPparaobtenerlapginaHTMLque
serregresadaalclienteyseraledaporelnavegadordelcliente.
ElPHPeslapartedelaprogramacinqueseejecutaalniveldelservidor,encontradelJavaScript,
queseejecutaalladodelcliente.
Parainterpretarunarchivo,elservidorPHPsmplementeleaeltextodelarchivohastaque
encuentraunodeloscarcteresespecialesquedelimitaneliniciodecdigoPHP.Elintrprete
ejecutaentoncestodoelcdigoqueencuentra,hastaqueencuentraunaetiquetadefindecdigo,que
ledicealintrpretequesigaignorandoelcdigosiguiente.Estemecanismopermiteembebercdigo
PHPdentrodeHTML:todoloqueestfueradelasetiquetasPHPsedejatalcomoest,mientras
queelrestoseinterpretacomocdigo.
HaycuatroconjuntosdeetiquetasquepuedenserusadasparadenotarbloquesdecdigoPHP.De
estascuatro,slo2(<?php...?>y<scriptlanguage="php">...</script>)estnsiempredisponibles;el
restopuedenserconfiguradasenelficherodephp.iniparaseronoaceptadasporelintrprete.
LasetiquetassoportadasporPHPson:
1.<?php echo("si quieres servir documentos XHTML o XML, haz como
2.<? echo ("esta es la m&aacute;s simple, una instrucci&oacute;n

aqu&iacute;\n"); ?>

de procesado SGML \n"); ?>


<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"

3.<script

language="php">
echo ("muchos editores (como FrontPage) no
aceptan instrucciones de procesado");
</script>

4.

<% echo ("Opcionalmente, puedes usar las etiquetas ASP"); %>


<%= $variable; # Esto es una abreviatura de "<% echo . . ." %>

Elmtodoprimero,<?php. . .?>,eselmsconveniente,yaquepermiteelusodePHPencdigo
XMLcomoXHTML,yqueestareconocidaporlosentornosdedesarollo.Eselmetodoquevamosa
utilizarenelcurso.

7.2. Separacindeinstrucciones
Lasseparacindeinstruccionessehaceterminandocadadeclaracinconunpuntoycoma.
Laetiquetadefindebloque(?>)implicaelfindeladeclaracin,porlotantolosiguientees
equivalente:
<?php echo "This is a test"; ?>
<?php echo "This is a test" ?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina17/73

8. CaractersticasdellenguajePHP
8.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnosercapazdeentenderelusodevariablesylostipodedatos
utilizadosenPHP.
Elpodrtambinponercomentariosensucdigo,convertirdatosdeuntipoaotro,yhacer
operacionessobrevariables.

8.2. ListadePalabrasClave
EstaspalabrastienenunsignificadoespecialenPHP.Algunasdeellasrepresentancosasquelucen
comofunciones,oalgunassevencomoconstantes,yassucesivamenteperonoloson,enrealidad:
sonconstruccionesdellenguaje.Ustednopuedeusarningunadelassiguientespalabrascomo
constantes,nombresdeclase,nombresdefuncionesomtodos.Usarlascomonombresdevariables
estbien,generalmente,peropuedeconduciraconfusiones.
ListadePalabrasClave:
and
or
__LINE__
array()
class
const
die()
do
empty()
enddeclare
endswitch
endwhile
for
foreach
include()
include_once()
print()
require()
switch
unset()
__FUNCTION__ __CLASS__
interface
implements
protected
abstract
throw
private

xor
as
continue
echo()
endfor
eval()
function
isset()
require_once()
use
__METHOD__
extends
clone
catch

__FILE__
break
declare
else
endforeach
exit()
global
list()
return()
var
final
public
try
this

exception
case
default
elseif
endif
extends
if
new
static
while
php_user_filter

8.3. Sensibilidad
PHPesavecessensiblealasmaysculasylasminsculas,avecesno.As$miVariableesuna
variablediferentede$MiVariableperofalseoFALSEsoniguales.

8.4. Identificadores
Losidentificadoressonlosnombresquesedanparaidentificaralasclases,funciones,variables,
constantesocualquieraetiquetaPHP.
Elnombredeunidentificadortienequecumplirconciertasreglas:
Debetenerunomascaracteres
Elprimercarctertienequeserunaletraoelcarcter_(subrayado).
Lasletrasquepuedenserutilizadasdespusdelprimercarctersoncualquiernmerode
letras,nmerosyrayas.Comoexpresinregularsepodraexpresarcomo:'[azAZ_\x7f\xff]
[azAZ09_\x7f\xff]*'

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina18/73

8.5. Declaracindevariables
Lasvariablespermitenalmacenardatosdeentrada,desalida,ointermedios.
EnPHPlasvariablesserepresentancomounsignodedlarseguidoporelnombredelavariable.El
nombredelavariableessensibleaminsculasymaysculas.
Lasintaxisbsicadedeclaracindevariablees:
$<nombre de variable> = <valor>;
$miNumero=1;

PHP4yarribaofreceotraformadeasignarvaloresalasvariables:asignarporreferencia.Esto
significaquelanuevavariablesimplementereferencia(enotraspalabras,"seconvierteenunalias
de""apuntaa")lavariableoriginal.Loscambiosalanuevavariableafectanalaoriginal,y
viceversa.Estotambinsignificaquenoseproduceunacopiadevalores;portanto,laasignacin
ocurremsrpidamente.Decualquierforma,cualquierincrementodevelocidadsenotarsloenlos
buclescrticoscuandoseasignengrandesmatricesuobjetos.
Paraasignarporreferencia,simplementeseanteponeunsigno"&"alcomienzodelavariablecuyo
valorseestasignando(lavariablefuente).Porejemplo,elsiguientetrozodecdigoproducela
salida'MinombreesBob'dosveces:
<?php
$foo = 'Bob';
// Asigna el valor 'Bob' a $foo
$bar = &$foo;
// Referencia $foo via $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $foo;
// $foo tambien se modifica.
echo $bar;
?>

Algoimportanteatenerencuentaesqueslolasvariablesconnombrepuedenserasignadaspor
referencia.
<?php
$foo = 25;
$bar = &$foo;
$bar = &(24 * 7);

// Esta es una asignacion valida.


// Invalida; referencia una expresion sin nombre.

function test() {
return 25;
}
$bar = &test();

// Invalida.

?>

8.6. Tipossimples(oprimitivos)
PHPsoportaochotiposprimitivos.
Cuatrotiposescalares:
boolean
integer
float(nmerodepuntoflotante,tambinconocidocomo'double')
string
Dostiposcompuestos:
array
object

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina19/73

Yfinalmentedostiposespeciales:
resource
NULL
Eltipodeunavariableusualmentenoesdeclaradoporelprogramador;encambio,esdecididoen
tiempodecompilacinporPHPdependiendodelcontextoenelqueesusadolavariable.

8.6.1. Boolean
Esteeseltipomssimple.Unbooleanexpresaunvalordeverdad.PuedeserTRUEorFALSE.
8.6.1.1. Sintaxis
Paraespecificarunliteralbooleano,usealgunadelaspalabrasclaveTRUEoFALSE.Ambasson
insensiblesamaysculasyminsculas.
<?php
$foo = True; // asignar el valor TRUE a $foo
?>

Usualmenteseusaalgntipodeoperadorquedevuelveunvalorboolean,yluegosteespasadoa
unaestructuradecontrol.
<?php // == es un operador que prueba por igualdad y devuelve un booleano
if ($accion == "mostrar_version") {echo "La versi&oacute;n es 1.23";}
if ($mostrar_separadores == TRUE) { echo "<hr>\n";} // esto no es necesario...
if ($mostrar_separadores) {echo "<hr>\n";} // ...porque se puede escribir simplemente
?>

8.6.1.2. Conversinabooleano
Paraconvertirexplcitamenteunvaloraboolean,useelmoldeamiento(bool)o(boolean).Sin
embargo,enlamayoradecasosnoesnecesariousarelmoldeamiento,yaqueunvalorser
convertidoautomticamentesiunoperador,funcinoestructuradecontrolrequiereunargumento
tipoboolean.
Cuandoserealizanconversionesaboolean,lossiguientesvaloressonconsideradosFALSE:
elbooleanFALSEmismo
elinteger0(cero)
elfloat0.0(cero)
elvalorstringvaco,yelstring"0"
unarrayconceroelementos
unobjectconcerovariablesmiembro(sloenPHP4)
eltipoespecialNULL(incluyendovariablesnodefinidas)
CualquierotrovaloresconsideradoTRUE(incluyendocualquierresource).
Ejemplo:
<?php
var_dump((bool)
var_dump((bool)
var_dump((bool)
var_dump((bool)
var_dump((bool)
var_dump((bool)
var_dump((bool)
var_dump((bool)

"");
1);
-2);
"foo");
2.3e5);
array(12));
array());
"false");

CopyrightCdricSimon,2006

//
//
//
//
//
//
//
//

bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina20/73

8.6.2. Enteros
UnintegeresunnmerodelconjuntoZ={...,2,1,0,1,2,...}.
8.6.2.1. Sintaxis
Losenterospuedenserespecificadosennotacindecimal(base10),hexadecimal(base16)uoctal
(base8),opcionalmenteprecedidosporunsigno(o+).
Siusalanotacinoctal,debeprecederelnmeroconun0(cero),parausarlanotacinhexadecimal,
precedaelnmerocon0x.
Ejemplo:
<?php
$a = 1234;
$a = -123;
$a = 0123;
$a = 0x1A;
?>

//
//
//
//

numero decimal
un numero negativo
numero octal (equivalente al 83 decimal)
numero hexadecimal (equivalente al 26 decimal)

Eltamaodeunenteroesdependientedelaplataforma,aunqueunvalormximode
aproximadamentedosbilloneseselvalorusual(loqueesunvalorde32bitsconsigno).
8.6.2.2. Desbordamientodeenteros
Siespecificaunnmeromsalldeloslmitesdeltipointeger,serinterpretadoensulugarcomo
unfloat.Asimismo,sirealizaunaoperacinqueresultaenunnmeromsalldeloslmitesdeltipo
integer,unfloatesretornadoensulugar.
<?php
$numero_grande = 2147483647;
var_dump($numero_grande);
// salida: int(2147483647)
$numero_grande = 2147483648;
var_dump($numero_grande);
// salida: float(2147483648)
?>

NohayunoperadordedivisindeenterosenPHP.1/2produceelfloat0.5.Puedemoldearelvalora
unenteroparaasegurarsederedondearlohaciaabajo,opuedeusarlafuncinround().
<?php
var_dump(25/7);
// float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>

8.6.2.3. Conversinaentero
Paraconvertirexplcitamenteunvalorainteger,usealgunodelosmoldeamientos(int)o(integer).
Sinembargo,enlamayoradecasosnonecesitausarelmoldeamiento,yaqueunvalorser
convertidoautomticamentesiunoperador,funcinoestructuradecontrolrequiereunargumento
tipointeger.Tambinpuedeconvertirunvaloraenteroconlafuncinintval().
Desdebooleans:FALSEproducir0(cero),yTRUEproducir1(uno).
Desdenmerosdepuntoflotante:Cuandoserealizanconversionesdesdeunflotanteaun
entero,elnmeroserredondeadohaciacero.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina21/73

Sielflotanteseencuentramsalldeloslmitesdelentero(usualmente+/2.15e+9=2^31),el
resultadoesindefinido,yaqueelflotantenotienesuficienteprecisinparadarunresultadoentero
exacto.Noseproducirunaadvertencia,nisiquieraunanoticiaenestecaso!
Aviso:Nuncamoldeeunafraccindesconocidaainteger,yaqueestoenocasionesproduceresultados
inesperados.<?php echo (int) ( (0.1+0.7) * 10 ); // imprime 7! ?>
Desdecadenas:VeaConversindecadenasanmeros
Desdeotrostipos:Atencin:Elcomportamientodeconvertirdesdeenteronoesdefinidoparaotros
tipos.Actualmente,elcomportamientoeselmismoquesielvalorfueraantesconvertidoabooleano.
Sinembargo,noconfeenestecomportamiento,yaquepuedesermodificadosinaviso.

8.6.3. Nmerosdepuntoflotante
Losnmerosdepuntoflotante(tambinconocidoscomo"flotantes","dobles"o"nmerosreales")
puedenserespecificadosusandocualquieradelassiguientessintaxis:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

Eltamaodeunflotantedependedelaplataforma,aunqueunvalorcomnconsisteenunmximo
de~1.8e308conunaprecisindeaproximadamente14dgitosdecimales(loqueesunvalorde64
bitsenformatoIEEE).
8.6.3.1. Precisindelpuntoflotante
Esbastantecomnquealgunasfraccionesdecimalessimplescomo0.1o0.7nopuedanser
convertidasasurepresentacinbinariainternasinperderunpocodeprecisin.Estopuedellevara
resultadosconfusos:porejemplo,floor((0.1+0.7)*10)usualmentedevolver7enlugardelesperado8
yaqueelresultadodelarepresentacininternaesenrealidadalgocomo7.9999999999....
Estoseencuentrarelacionadoalhechodequeesimposibleexpresardeformaexactaalgunas
fraccionesennotacindecimalconunnmerofinitodedgitos.Porejemplo,1/3enformadecimalse
convierteen0.3333333....
Asquenuncaconfeenresultadosdenmerosflotanteshastaelltimodgito,ynuncacompare
nmerosdepuntoflotanteparaconocersisonequivalentes.Sirealmentenecesitaunamejor
precisin,esbuenaideaqueuselasfuncionesmatemticasdeprecisinarbitrariaolasfunciones
gmpensulugar.
8.6.3.2. Conversinaflotante
Paramsinformacinsobrecundoycmosonconvertidaslascadenasaflotantes,vealaseccin
tituladaConversindecadenasanmeros.Paravaloresdeotrostipos,laconversineslamismaque
sielvalorhubiesesidoconvertidoaenteroyluegoaflotante.VealaseccinConversinaenteropara
msinformacin.ApartirdePHP5,unanoticiaesgeneradasiintentaconvertirunobjetoaflotante.

8.6.4. Cadenas
Unvalorstringesunaseriedecaracteres.EnPHP,uncaractereslomismoqueunbyte,esdecir,
hayexactamente256tiposdecaracteresdiferentes.EstoimplicatambinquePHPnotienesoporte
nativodeUnicode.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina22/73

8.6.4.1. Sintaxis
Unliteraldecadenapuedeespecificarseentresformasdiferentes.
comillassimples
comillasdobles
sintaxisheredoc
8.6.4.2. Comillassimples
Laformamssimpledeespecificarunacadenasencillaesrodearladecomillassimples(elcaracter').
Paraespecificarunacomillasencillaliteral,necesitaescaparlaconunabarrainvertida(\),comoen
muchosotroslenguajes.Siunabarrainvertidanecesitaaparecerantesdeunacomillasencillaoal
finaldelacadena,necesitardoblarla.Notequesiintentaescaparcualquierotrocaracter,labarra
invertidaserimpresatambin!Demodoque,porlogeneral,nohaynecesidaddeescaparlabarra
invertidamisma.
Ejemplo:
<?php
echo 'esta es una cadena simple';
echo 'Tambi&eacute;n puede tener saltos de l&iacute;nea embebidos
en las cadenas de esta forma, ya que
es v&aacute;lido';
// Imprime: Arnold dijo una vez: "I'll be back"
echo 'Arnold dijo una vez: "I\'ll be back"';
// Imprime: Ha eliminado C:\*.*?
echo 'Ha eliminado C:\\*.*?';
// Imprime: Ha eliminado C:\*.*?
echo 'Ha eliminado C:\*.*?';
// Imprime: Esto no va a expandirse: \n una nueva linea
echo 'Esto no va a expandirse: \n una nueva linea';
// Imprime: Las variables no se $expanden $tampoco
echo 'Las variables no se $expanden $tampoco';
?>

8.6.4.3. Comillasdobles
Silacadenaseencuentrarodeadadecomillasdobles("),PHPentiendemssecuenciasdeescape
paracaracteresespeciales(caracteresescapados):
Secuencia

Significado

\n

alimentacindelnea(LFo0x0A(10)enASCII)

\r

retornodecarro(CRo0x0D(13)enASCII)

\t

tabulacinhorizontal(HTo0x09(9)enASCII)

\\

barrainvertida

\$

signodedlar

\"

comilladoble

\[07]{1,3}

lasecuenciadecaracteresquecoincideconlaexpresinregularesun
caracterennotacinoctal

\x[09AFaf]{1,2}

lasecuenciadecaracteresquecoincideconlaexpresinregularesun
caracterennotacinhexadecimal

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina23/73

Nuevamente,siintentaescaparcualquierotrocaracter,labarrainvertidaserimpresatambin!
AntesdePHP5.1.1,labarrainvertidaen\{$var}novenaimprimindose.
Perolacaractersticamsimportantedelascadenasentrecomillasdobleseselhechodequelos
nombresdevariablessernexpandidos.
8.6.4.4. Heredoc
Otraformadedelimitarcadenasesmedianteelusodelasintaxisheredoc("<<<").Debeindicarseun
identificadordespusdelasecuencia<<<,luegolacadena,yluegoelmismoidentificadorparacerrar
lacita.
Elidentificadordecierredebecomenzarenlaprimeracolumnadelalnea.Asimismo,el
identificadorusadodebeseguirlasmismasreglasquecualquierotraetiquetaenPHP:debecontener
solocaracteresalfanumricosydesubrayado,ydebeiniciarconuncaracternodgitoodesubrayado.
Aviso
Esmuyimportantenotarquelalneaconelidentificadordecierrenocontengaotroscaracteres,
exceptoquizsporunpuntoycoma(;).Estoquieredecirenespecialqueelidentificadornodebeusar
sangra,ynodebehaberespaciosotabuladoresantesodespusdelpuntoycoma.Esimportante
tambinnotarqueelprimercaracterantesdelidentificadordecierredebeserunsaltodelnea,taly
comolodefinasusistemaoperativo.Estoquieredecir\renMacintosh,porejemplo.
Siestareglaesrotayelidentificadordecierrenoes"limpio",entoncesnoseconsideraun
identificadordecierreyPHPcontinuarenbuscadeuno.Si,entalcaso,noseencuentraun
identificadordecierreapropiado,entoncesunerrordelanalizadorsintcticoresultarconelnmero
delneaapuntandoalfinaldelscript.
Noespermitidousarlasintaxisheredocalinicializarmiembrosdeclase.Useotrotipodesintaxisen
sulugar.
Ejemploinvlido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>

Eltextoheredocsecomportatalcomounacadenaentrecomillasdobles,sinlascomillasdobles.Esto
quieredecirquenonecesitaescapartalescomillasensusbloquesheredoc,peroaunpuedeusarlos
cdigosdeescapelistadosanteriormente.Lasvariablessonexpandidas,aunquedebetenerseel
mismocuidadocuandoseexpresenvariablescomplejasalinteriordeunsegmentoheredoc,aligual
queconotrascadenas.
Ejemplodeusodeunacadenaheredoc
<?php
$cadena = <<<FIN
Ejemplo de una cadena
que se extiende por varias l&iacute;neas
usando la sintaxis heredoc.
FIN;
/* Un ejemplo mas complejo, con variables. */
class foo
{
var $foo;
var $bar;

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina24/73

function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$nombre = 'MiNombre';
echo <<<FIN
Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo.
Ahora, estoy imprimiendo algo de {$foo->bar[1]}.
Esto deber&iacute;a imprimir una letra 'A' may&uacute;scula: \x41
FIN;
?>

8.6.4.5. Procesamientodevariables
Cuandounacadenaesespecificadaencomillasdoblesoalinteriordeunbloqueheredoc,las
variablessoninterpretadasensuinterior.
Existendostiposdesintaxis:unasimpleyunacompleja.Lasintaxissimpleeslamscomny
conveniente.Estaofreceunaformadeinterpretarunavariable,unvalorarray,ounapropiedadde
unobject.
LasintaxiscomplejafueintroducidaenPHP4,ypuedereconocerseporlasllavesquerodeanla
expresin.
Sintaxissimple
Siunsignodedlar($)esencontrado,elanalizadorsintcticotomarambiciosamentetantos
lexemascomoleseaposibleparaformarunnombredevariablevlido.Rodeeelnombredela
variabledellavessideseaespecificarexplcitamenteelfinaldelnombre.
<?php
$cerveza = 'Heineken';
echo "El sabor de varias $cerveza's es excelente"; // funciona, "'" no es un caracter valido para
nombres de variables
echo "Tom&oacute; algunas $cervezas";
// no funciona, 's' es un caracter valido para nombres de
variables
echo "Tom&oacute; algunas ${cerveza}s"; // funciona
echo "Tom&oacute; algunas {$cerveza}s"; // funciona
?>

Paracualquiercosamssofisticada,deberausarselasintaxiscompleja.
Sintaxiscompleja(llaves)
Estanoesllamadacomplejaporquelasintaxisseacompleja,sinoporqueesposibleincluir
expresionescomplejasdeestaforma.
Dehecho,deestaformapuedeincluircualquiervalorqueseapartedelespaciodenombresal
interiordecadenas.Simplementeescribalaexpresinenlamismaformaqueloharasise
encontraraporfueradeunacadena,yluegolaubicaentre{y}.Yaquenoesposibleescapar'{',esta
sintaxisserreconocidanicamentecuandoelcaracter$seencuentrainmediatamentedespusde{.
(Use"{\$"paraobtenerunasecuencialiteral"{$").Algunosejemplosparaaclararelasunto:
<?php
// Mostremos todos los errores
error_reporting(E_ALL);
$genial = 'fant&aacute;stico';
// No funciona, imprime: Esto es { fant&aacute;stico}
echo "Esto es { $genial}";

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina25/73

// Funciona, imprime: Esto es fant&aacute;stico


echo "Esto es {$genial}";
echo "Esto es ${genial}";
// Funciona
echo "Esto funciona: {$matriz[4][3]}";
// Funciona. Cuando se usan matrices multi-dimensionales, use siempre
// llaves alrededor de las matrices al interior de cadenas
echo "Esto funciona: {$matriz['foo'][3]}";
?>

8.6.4.6. Accesoacadenasymodificacinporcaracter
Loscaracteresalinteriordeunacadenapuedenserconsultadosymodificadosalespecificarel
desplazamiento,comenzandoencero,delcaracterdeseadodespusdelacadenaentrellaves.
Algunosejemplosdecadenas
<?php
// Obtener el primer caracter de una cadena
$cadena = 'Esta es una prueba.';
$primer = $cadena{0};
// Obtener el tercer caracter de una cadena
$tercer = $cadena{2};
// Obtener el ultimo caracter de una cadena.
$cadena = 'Esta es tambien una prueba.';
$ultimo = $cadena{strlen($cadena)-1};
// Modificar el ultimo caracter de una cadena
$cadena = 'Observe el mar';
$cadena{strlen($cadena)-1} = 'l';
?>

8.6.4.7. Funcionesyoperadorestiles
Lascadenaspuedenserconcatenadasusandoeloperador'.'(punto).Notequeeloperador'+'(adicin)
nofuncionaparaestepropsito.
Existenbastantesfuncionestilesparalamodificacindecadenas.
VealaseccindefuncionesdecadenaenladocumentacinenelCDdelcursoparaconsultar
funcionesdeusogeneral,olasfuncionesdeexpresionesregularesparabsquedasyreemplazos
avanzados(endossabores:PerlyPOSIXextendido).
ExistentambinfuncionesparacadenastipoURL,yfuncionesparaencriptar/descifrarcadenas
(mcryptymhash).
Finalmente,siaunnohaencontradoloquebusca,veatambinlasfuncionesdetipodecaracter.
8.6.4.8. Conversinacadena
Esposibleconvertirunvaloraunacadenausandoelmoldeamiento(string),olafuncinstrval().La
conversinacadenaserealizaautomticamenteparaustedenelcontextodeunaexpresincuando
senecesitaunacadena.Estoocurrecuandousalasfuncionesecho()oprint(),ocuandocomparael
valordeunavariableconunacadena.ElcontenidodelasseccionesdeladocumentacinenelCDdel
cursosobreTiposyManipulacindeTiposayudanaaclararestehecho.
UnvalorbooleanTRUEesconvertidoalacadena"1",elvalorFALSEserepresentacomo""(una
cadenavaca).Deestaforma,ustedpuedeconvertirdeidayvueltaentrevaloresbooleanosyde
cadena.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina26/73

Unnmerointegerodepuntoflotante(float)esconvertidoaunacadenaquerepresentaelnmero
consusdgitos(incluyendolapartedelexponenteparalosnmerosdepuntoflotante).
Lasmatricessonsiempreconvertidasalacadena"Array",demodoquenopuedevolcarlos
contenidosdeunvalorarrayconecho()oprint()paraverloqueseencuentraensuinterior.Paraver
unelemento,ustedtendraquehaceralgocomoecho$arr['foo'].Veamsadelantealgunosconsejos
sobreelvolcado/vistadelcontenidocompleto.
Losobjetossonconvertidossiemprealacadena"Object".Siquisieraimprimirlosvaloresde
variablesmiembrodeunobjectparaefectosdedepuracin,lealospargrafossiguientes.Siquiere
conocerelnombredeclasedelcualunobjetodadoesinstancia,useget_class().ApartirdePHP5,el
mtodo__toString()esusadosiresultaaplicable.
Losrecursossonsiempreconvertidosacadenasconlaestructura"Resourceid#1"endonde1esel
nmeronicodelvalorresourceasignadoporPHPdurantetiempodeejecucin.Siquisieraobtener
eltipodelrecurso,useget_resource_type().
NULLseconviertesiempreaunacadenavaca.
Comopuedeapreciar,elimprimirmatrices,objetosorecursosnoleofreceinformacintilsobrelos
valoresmismos.Consultelasfuncionesprint_r()yvar_dump()paraconocermejoresformasde
imprimirvaloresparadepuracin.
8.6.4.9. Conversindecadenasanmeros
Cuandounacadenaesevaluadacomounvalornumrico,elvalorresultanteysutiposon
determinadoscomosigue.
Lacadenaserevaluadacomounfloatsicontienecualquiercaracterentre'.','e',o'E'.Deotraforma,
evaluarcomounentero.
Elvaloresdadoporlaporcininicialdelacadena.Silacadenacomienzacondatosnumricos
vlidos,stossernelvalorusado.Delocontrario,elvalorser0(cero).Unsignoopcionales
consideradoundatonumricovlido,seguidoporunoomsdgitos(quepuedencontenerunpunto
decimal),seguidosporunexponenteopcional.Elexponenteesuna'e'o'E'seguidadeunooms
dgitos.
Ejemplo:
<?php
$foo =
$foo =
$foo =
$foo =
$foo =
$foo =
$foo =
$foo =
?>

1 + "10.5";
1 + "-1.3e3";
1 + "bob-1.3e3";
1 + "bob3";
1 + "10 Cerditos";
4 + "10.2 Cerditos";
"10.0 cerdos " + 1;
"10.0 cerdos " + 1.0;

//
//
//
//
//
//
//
//

$foo
$foo
$foo
$foo
$foo
$foo
$foo
$foo

es
es
es
es
es
es
es
es

flotante (11.5)
flotante (-1299)
entero (1)
entero (1)
entero (11)
flotante (14.2)
flotante (11)
flotante (11)

8.6.5. Matrices
UnamatrizenPHPesenrealidadunmapaordenado.Unmapaesuntipodedatosqueasocia
valoresconclaves.Estetipoesoptimizadoenvariasformas,demodoquepuedeusarlocomouna
matrizreal,ounalista(vector),tablaasociativa(casoparticulardeimplementacindeunmapa),
diccionario,coleccin,pila,colayprobablementems.YaquepuedetenerotramatrizPHPcomo
valor,esrealmentefcilsimularrboles.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina27/73

Unaexplicacinsobretalesestructurasdedatosseencuentraporfueradelpropsitodeestemanual,
peroencontraralmenosunejemplodecadaunodeellos.
8.6.5.1. Sintaxis
Especificacinconarray()
Unarraypuedesercreadoporlaconstruccindelenguajearray().statomaunciertonmerode
parejasclave=>valorseparadasconcoma.
array([clave=>]valor
,...
)
//clavepuedeserunintegerostring
//valorpuedesercualquiervalor
<?php
$matriz = array("foo" => "bar", 12 => true);
echo $matriz["foo"]; // bar
echo $matriz[12];
// 1
?>

Unaclavepuedeserunintegerounstring.Siunaclaveeslarepresentacinestndardeuninteger,
serinterpretadacomotal(esdecir,"8"serinterpretadocomo8,mientrasque"08"ser
interpretadocomo"08").Losvaloresflotantesenclaveserntruncadosavalorestipointeger.No
existentiposdiferentesparamatricesindexadasyasociativasenPHP;sloexisteuntipodematriz,
elcualpuedecontenerndicestipoenteroocadena.
UnvalorpuedeserdecualquiertipoenPHP.
<?php
$matriz = array("unamatriz" => array(6 => 5, 13 => 9, "a" => 42));
echo $matriz["unamatriz"][6];
echo $matriz["unamatriz"][13];
echo $matriz["unamatriz"]["a"];
?>

// 5
// 9
// 42

Sinoespecificaunaclaveparaunvalordado,entoncesesusadoelmximodelosndicesenteros,y
lanuevaclaveseresevalormximo+1.Siespecificaunaclavequeyatieneunvalorasignado,se
valorsersobrescrito.
<?php
// Esta matriz es la misma que ...
array(5 => 43, 32, 56, "b" => 12);
// ...esta matriz
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>

AlusarTRUEcomoclave,elvalorserevaluadoalinteger1.AlusarFALSEcomoclave,elvalor
serevaluadoalinteger0.AlusarNULLcomoclave,elvalorserevaluadoaunacadenavaca.El
usodeunacadenavacacomoclavecrear(oreemplazar)unaclaveconlacadenavacaysuvalor;
noeslomismoqueusarcorchetesvacos.
Noesposibleusarmatricesuobjetoscomoclaves.Alhacerloseproducirunaadvertencia:Illegal
offsettype.
8.6.5.2. Creacin/modificacinconsintaxisdecorchetescuadrados
Esposiblemodificarunamatrizexistentealdefinirvaloresexplcitamenteenella.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina28/73

Estoesposiblealasignarvaloresalamatrizalmismotiempoqueseespecificalaclaveentre
corchetes.Tambinesposibleomitirlaclave,agregarunaparejavacadecorchetes("[]")alnombre
delavariableenesecaso.
$matriz[clave] = valor;
$matriz[] = valor;
// clave puede ser un integer o string
// valor puede ser cualquier valor

Si$matriznoexisteaun,stasercreada.Demodoqueestaestambinunaformaalternativade
especificarunamatriz.Paramodificarunciertovalor,simplementeasigneunnuevovaloraun
elementoespecificadoconsuclave.Sidesearemoverunaparejaclave/valor,necesitaeliminarla
medianteunset().
<?php
$matriz = array(5 => 1, 12 => 2);
$matriz[] = 56;
// Esto es igual que $matriz[13] = 56;
// en este punto del script
$matriz["x"] = 42; // Esto agrega un nuevo elemento a la
// matriz con la clave "x"
unset($matriz[5]); // Esto elimina el elemento de la matriz
unset($matriz);
// Esto elimina la matriz completa
?>

8.6.5.3. Funcionestiles
Existeunbuennmerodefuncionestilesparatrabajarconmatrices.Consultelaseccinfunciones
dematrices.
Nota:Lafuncinunset()lepermiteremoverladefinicindeclavesdeunamatriz.Tengaencuenta
quelamatrizNOesreindexada.Sislousa"ndicesenteroscomunes"(comenzandodesdecero,
incrementandoenuno),puedeconseguirelefectodereindexacinusandoarray_values().
<?php
$a = array(1 => 'uno', 2 =>
unset($a[2]);
/* producira una matriz que
$a = array(1 => 'uno', 3
y NO
$a = array(1 => 'uno', 2
*/

'dos', 3 => 'tres');


hubiera sido definida como
=> 'tres');
=>'tres');

$b = array_values($a);
// Ahora $b es array(0 => 'uno', 1 =>'tres')
?>

Laestructuradecontrolforeachexisteespecficamenteparalasmatrices.staproveeunamanera
fcilderecorrerunamatriz.
8.6.5.4. Conversinamatriz
Paracualquieradelostipos:integer,float,string,booleanyresource,siconvierteunvaloraun
array,obtieneunamatrizconunelemento(conndice0),elcualeselvalorescalarconelqueinici.
Siconvierteunobjectaunamatriz,obtienelaspropiedades(variablesmiembro)deeseobjetocomo
loselementosdelamatriz.Lasclavessonlosnombresdelasvariablesmiembro.
SiconvierteunvalorNULLamatriz,obtieneunamatrizvaca.
8.6.5.5. Ordenamientodeunamatriz
Seutilizalafuncion'sort'sobreelarreglo.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina29/73

Ejemplo:
<?php
sort($archivos);
print_r($archivos);
?>

8.6.5.6. Matricesrecursivasymultidimensionales
Dadoqueelvalordeunamatrizpuedesercualquiercosa,tambinpuedeserotramatriz.Deesta
formaesposiblecrearmatricesrecursivasymultidimensionales.
Ejemplo:
<?php
$frutas = array ( "frutas"

=> array ( "a" => "naranja",


"b" => "banano",
"c" => "manzana"
),
"numeros" => array ( 1,
2,
3,
4,
5,
6
),
"hoyos"
=> array (
"primero",
5 => "segundo",
"tercero"
)

);
// Algunos ejemplos que hacen referencia a los valores de la matriz anterior
echo $frutas["hoyos"][5];
// imprime "segundo"
echo $frutas["frutas"]["a"]; // imprime "naranja"
unset($frutas["hoyos"][0]); // elimina "primero"
// Crear una nueva matriz multi-dimensional
$jugos["manzana"]["verde"] = "bien";
?>

8.6.6. Objetos
ExistelaposibilidaddeutilizarobjetosyclasesenPHP.
Enestecursonovamosirendetallesobrelaprogramacinorientadoobjetoporquetomara
demasiadotiempo.Paramsdetalle,verladocumentacindePHPenelCDdelcurso.

8.6.7. Recurso
Unrecursoesunavariableespecial,quecontieneunareferenciaaunrecursoexterno.Losrecursos
soncreadosyusadosporfuncionesespeciales.VealadocumentacinPHPenelCDdelcursoparaun
listadodetodasestasfuncionesylostiposderecursocorrespondientes.

8.6.8. NULL
ElvalorespecialNULLrepresentaqueunavariablenotienevalor.NULLeselnicovalorposible
deltipoNULL.
UnavariableesconsideradacomoNULLsi
sehaasignadolaconstanteNULLalavariable.
nohasidodefinidaconvaloralguno.
hasidoeliminadaconunset().

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina30/73

8.6.8.1. Sintaxis
ExisteunsolovalordetipoNULL,yeseeslapalabraclaveNULL,insensibleamaysculasy
minsculas.
<?php
$var = NULL;
?>

8.7. Constantes
Unaconstanteesunidentificadorparaexpresarunvalorsimple.Comoelnombresugiere,estevalor
nopuedevariardurantelaejecucindelscript.(Lasconstantesespeciales__FILE__y__LINE__son
unaexcepcinaesto,yaqueactualmentenolosoin).Unaconstanteessensibleamaysculaspor
defecto.Porconvencin,losidentificadoresdeconstantessuelendeclararseenmaysculas
Elalcanzedeunaconstanteesglobal,esdecir,esposibleaccederaellassinpreocuparseporel
mbitodealcance.

8.7.1. Sintaxis
Sepuededefinirunaconstanteusandolafuncindefine().Unavezdefinida,nopuedesermodificada
nieliminada.
Solosepuededefinircomoconstantesvaloresescalares(boolean,integer,floatystring).
Paraobtenerelvalordeunaconstantesoloesnecesarioespecificarsunombre.Adiferenciadelas
variables,nosetienequeespecificarelprefijo$.Tambiensepuedeutilizarlafuncinconstant(),
paraobtenerelvalordeunaconstante,enelcasodequequeramosexpresarladeformadinmica
Usalafuncinget_defined_constants()pararobtenerunalistadetodaslasconstantesdefinidas.
Siusasunaconstantetodavianodefinida,PHPasumequeestsrefirindotealnombredela
constanteensi.Selanzarunavisosiestosucede.Usalafuncindefined()paracomprobarla
existenciadedichaconstante.
Estassonlasdiferenciasentreconstantesyvariables:
Lasconstantesnosonprecedidasporunsmbolodedolar($)
Lascontantessolopuedenserdefinidasusandolafuncin()define,nuncaporsimple
asignacin
Lasconstantespuedenserdefinidasyaccedidassintenerencuentalasreglasdealcanzedel
mbito.
Lasconstantesnopuedenserredefinidasoeliminadasdespuesdeestablecerse;y
Lasconstantessolopuedealbergarvaloresescalares
Ejemplo:Definiendoconstantes
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
?>

8.8. Operadores
Losoperadoresseutilizanparahaceroperacionessobrelasvariables.Permitencombinar,modificar,
oevaluarlasvariables.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina31/73

8.8.1. Principalesoperadoressobreintegeryfloat

++

=
==
!=
<
<=
>=
>
+
*
/
%

Negacin(unitario),resta(binario)
Incremento
Decremento
Asignacin
Igualdad
Desigualdad
Menosque
Menosoigualque
Mayoroigualque
Mayorque
Suma
Multiplicacin
Divisin
Modulo

Losoperadoresdeincremento(++)ydecremento()sepuedenutilizarantesodespusdela
variable,pegadoaella.
Siseutilizanantes,lavariableseincrementaodecrementadirectamente.Siseutilizadespus,la
variableseincrementaodecrementajustodespusdehabersidoutilizada.Sepuedenutilizarcon
cadenastambien,peronotieneefectoconboleanos.
Ejemplodedeclaracin:
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debe ser 5: " . $a++ . "<br />\n";
echo "Debe ser 6: " . $a . "<br />\n";
echo
$a =
echo
echo

"<h3>Preincremento</h3>";
5;
"Debe ser 6: " . ++$a . "<br />\n";
"Debe ser 6: " . $a . "<br />\n";

echo
$a =
echo
echo

"<h3>Postdecremento</h3>";
5;
"Debe ser 5: " . $a-- . "<br />\n";
"Debe ser 4: " . $a . "<br />\n";

echo
$a =
echo
echo
?>

"<h3>Predecremento</h3>";
5;
"Debe ser 4: " . --$a . "<br />\n";
"Debe ser 4: " . $a . "<br />\n";

8.8.2. OperadoresdeComparacin
Losoperadoresdecomparacin,comosunombreindica,lepermitencomparardosvalores.Puedeque
tambinseencuentreinteresadoenconsultarlastablasdecomparacindetipos,yaquestas
muestranejemplosdevariostiposdecomparacionesrelacionadascontipos.
OperadoresdeComparacin
Ejemplo

Nombre

Resultado

$a==$b

Igual

TRUEsi$aesiguala$b.

$a===$b

Idntico

TRUEsi$aesiguala$b,ysondelmismotipo.

$a!=$b

Diferente

TRUEsi$anoesiguala$b.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina32/73

Ejemplo

Nombre

Resultado

$a<>$b

Diferente

TRUEsi$anoesiguala$b.

$a!==$b

Noidnticos

TRUEsi$anoesiguala$b,osinosondelmismotipo.

$a<$b

Menorque

TRUEsi$aesescrictamentemenorque$b.

$a>$b

Mayorque

TRUEsi$aesestrictamentemayorque$b.

$a<=$b

Menoroigualque

TRUEsi$aesmenoroigualque$b.

$a>=$b

Mayoroigualque

TRUEsi$aesmayoroigualque$b.

Sicomparaunenteroconunacadena,lacadenaesconvertidaaunnmero.Sicomparadoscadenas
numricas,ellassoncomparadascomoenteros.Estasreglastambinseaplicanalasentencia
switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // nunca se ejecuta ya que "a" ya ha coincidido con 0
echo "a";
break;
}
?>

Paravariostipos,lacomparacinserealizadeacuerdoconlasiguienttabla(enorden).
ComparacinconVariosTipos
TipodelOperando1

TipodelOperando2 Resultado

nullostring

string

ConvertirNULLa"",comparacinnumricaode
lxico

boolonull

cualquiera

Convertirabool,FALSE<TRUE

object

object

Lasclasesinternaspuedendefinirsupropia
comparacin,clasesdiferentessonincomparables,la
mismaclasecomparanpropiedadesenlamisma
formaquelasmatrices(PHP4),PHP5tienesupropia
explicacin

string,resourceo
number

string,resourceo
number

Traducirlascadenasyrecursosanmeros,
matemticausual

array

array

Unamatrizconmenoselementosesmenor,siuna
clavedeloperando1noseencuentraeneloperando2
entonceslasmatricessonincomparables,deotraforma
compararvalorporvalor(veaelsiguienteejemplo)

array

cualquiera

arrayessiempremayor

object

cualquiera

objectessiempremayor

Ejemplo:Transcripcindelacomparacindematricesestndar
<?php
// Las matrices son comparadas de esta forma con los operadores de comparacion estandar
function comparacion_matrices_estandar($op1, $op2)
{
if (count($op1) < count($op2)) {

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina33/73

return -1; // $op1 < $op2


} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $clave => $val) {
if (!array_key_exists($clave, $op2)) {
return null; // incomparable
} elseif ($val < $op2[$clave]) {
return -1;
} elseif ($val > $op2[$clave]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>

8.8.3. OperadoresdeLgica
Losoperadoreslgicossonusadosparaevaluarvariascomparaciones,combinandolosposibles
valoresdeestas.
Operador Nombre Ejemplo

Devuelveciertocuando:

&&

(7>2)&&(2<4)

DevuelveTRUEcuandoambascondicionesson
verdaderas.

and

(7>2)and
(2<4)

DevuelveTRUEcuandoambascondicionesson
verdaderas.

||

(7>2)||(2<4)

DevuelveTRUEcuandoalmenosunadelasdoses
verdadera.

or

(7>2)or(2<4)

DevuelveTRUEcuandoalmenosunadelasdoses
verdadera.

No

!(7>2)

Niegaelvalordelaexpresin.

8.8.4. OperadorTernario
Otrooperadorcondicionaleseloperador"?:"(oternario).
Ejemplo:.Asignacindeunvalorpredeterminado
<?php
// Ejemplo de uso de: el Operador Ternario
$accion = (empty($_POST['accion'])) ? 'predeterminada' : $_POST['accion'];
// La sentencia anterior es identica a este bloque if/else
if (empty($_POST['accion'])) {
$accion = 'predeterminada';
} else {
$accion = $_POST['accion'];
}
?>

Laexpresin(expr1)?(expr2):(expr3)evalaaexpr2siexpr1evalaaTRUE,yexpr3siexpr1
evalaaFALSE.
Nota:Porfavornotequeeloperadorternarioesunasentencia,yquenoevalaaunavariable,sino
alresultadodeunasentencia.Esimportantesaberestosisedeseadevolverunavariablepor
referencia.Lasentenciareturn$var==42?$a:$b;enunafuncinconretornoporreferenciano
funcionarporloquesehamencionadoyunaadvertenciaesgeneradaenversionesposterioresde
PHP.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina34/73

8.9. ManipulacindeTipos
PHPnorequiere(osoporta)ladefinicinexplcitadetiposenladeclaracindevariables;eltipode
unavariableesdeterminadoporelcontextoenelquelavariableesusada.Loquequieredecirquesi
asignaunvalordecadenaalavariable$var,$varseconvierteenunacadena.Siluegoasignaun
valorenteroa$var,staseconvierteenentera.
UnejemplodelaconversinautomticadetiposdePHPeseloperadordeadicin'+'.Sicualquiera
delosoperandosesunflotante,entoncestodoslosoperandossonevaluadoscomoflotantes,yel
resultadoserunflotante.Deotromodo,losoperandosserninterpretadoscomoenteros,yel
resultadosertambinunentero.NotequeesteNOmodificalostiposdelosoperandosmismos;el
nicocambioestenlaformacomolosoperandossonevaluados.
<?php
$foo = "0"; // $foo es una cadena (ASCII 48)
$foo += 2;
// $foo es ahora un entero (2)
$foo = $foo + 1.3; // $foo es ahora un flotante (3.3)
$foo = 5 + "10 Cerditos"; // $foo es entero (15)
$foo = 5 + "10 Cerdos";
// $foo es entero (15)
?>

Silosdosltimosejemploslucenextraos,consulteConversindecadenasanmeros.
Nota:Elcomportamientodeunaconversinautomticaamatriznoseencuentradefinidoenel
momento.
<?php
$a = "1";
$a[0] = "f";
?>

// $a es una cadena
// Que hay de las posiciones de cadena? Que sucede?

YaquePHP(porrazoneshistricas)soportaelusodendicesencadenasmediantedesplazamientos
deposicinusandolamismasintaxisquelaindexacindematrices,elejemploanteriorllevaaun
problema:debera$aconvertirseenunamatrizconunprimerelemento"f",odebera"f"convertirse
enelprimercaracterdelacadena$a?
LasversionesrecientesdePHPinterpretanlasegundaasignacincomounaidentificacinde
desplazamientodecadena,asque$aseconvierteen"f",sinembargoelresultadodeestaconversin
automticadebeconsiderarseindefinido.PHP4introdujolanuevasintaxisdellavesparaaccedera
loscaracteresdeunacadena,useestasintaxisenlugardelaquefuepresentadaanteriormente:
<?php
$a
= "abc"; // $a es una cadena
$a{1} = "f";
// $a es ahora "afc"
?>

8.9.1. MoldeamientodeTipos
ElmoldeamientodetiposenPHPfuncionadeformamuysimilaracomoocurreenC:elnombredel
tipodeseadoesescritoentreparntesisantesdelavariablequedebesermoldeada.
<?php
$foo = 10;
// $foo es un entero
$bar = (boolean) $foo;
// $bar es un booleano
?>

Losmoldeamiontospermitidosson:
(int),(integer)moldeamientoaentero
(bool),(boolean)moldeamientoabooleano
(float),(double),(real)moldeamientoaflotante
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina35/73

(string)moldeamientoacadena
(array)moldeamientoamatriz
(object)moldeamientoaobjeto

Notequelastabulacionesylosespaciossonpermitidosalinteriordelosparntesis,asquelas
siguientesexpresionessonfuncionalmenteequivalentes:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>

Nota:Enlugardemoldearunavariableacadena,puedetambinrodearlavariabledecomillas
dobles.
<?php
$foo = 10;
// $foo es un entero
$cad = "$foo";
// $cad es una cadena
$fst = (string) $foo; // $fst es tambien una cadena
// Esto imprime "son lo mismo"
if ($fst === $cad) {
echo "son lo mismo";
}
?>

8.9.2. PrecedenciadeOperadores
Laprecedenciadeunoperadorindicaqutan"cerca"seagrupandosexpresiones.Porejemplo,enla
expresin1+5*3,larespuestaes16yno18,yaqueeloperadordemultiplicacin("*")tieneuna
mayorprecedenciaqueeloperadordeadicin("+").Losparntesispuedenserusadosparamarcarla
precedencia,siresultanecesario.Porejemplo:(1+5)*3evalaa18.Silaprecedenciadelos
operadoreseslamisma,seutilizaunaasociacindeizquierdaaderecha.
Lasiguientetablalistalaprecedenciadelosoperadores,conaquellosdemayorprecedencialistados
alcomienzodelatabla.Losoperadoresenlamismalneatienenlamismaprecedencia,encuyocaso
suasociatividaddecideelordenparaevaluarlos.
PrecedenciadeOperadores:
Asociatividad

Operadores

InformacinAdicional

noasociativo

new

new

izquierda

array()

noasociativos

++

incremento/decremento

noasociativos

!~(int)(float)(string)(array)(object)@ tipos

izquierda

*/%

aritmtica

izquierda

+.

aritmtica,ycadena

izquierda

<<>>

manejodebits

noasociativos

<<=>>=

comparacin

noasociativos

==!====!==

comparacin

izquierda

&

manejodebits,yreferencias

izquierda

manejodebits

izquierda

manejodebits

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina36/73

Asociatividad

Operadores

InformacinAdicional

izquierda

&&

lgicos

izquierda

||

lgicos

izquierda

?:

ternario

derecha

=+==*=/=.=%=&=|=^=<<=>>=

asignacin

izquierda

and

lgicos

izquierda

xor

lgicos

izquierda

or

lgicos

izquierda

variosusos

Ejemplo:Asociatividad
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>

8.10. Comentarios
EnelcdigoPHPsepuedenmetercomentarios.
Loscomentariosdeunasolalneasesgnalacon//ocon'#'.Loscomentariosdeunaovariaslneas
sesgnalacon/*alinicio,y*/alfinal.
Ejemplos:
/* Este

es un comentario
de varias lneas */
int miNmero2; # Este es una muestra de comentario de una lnea
int miNmero = 1; // Este es una muestra de comentario de una lnea

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina37/73

9. Decisionesybucles
9.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnosercapazdecrearesquemadedecisionesensucdigo,ascomo
crearymanejarbucles.

9.2. if...elseif...else
Elifseutilizaparacrearesquemadedecisiones.Sepuedeutilizarconelelse,peroesfacultativo.
Elif,quesignificasipermiteprobarunaovariascondiciones.Elresultadodecadacondicin
siempreessiono.Lascondicionessiempreestnentreparntesis.
Despusdelifvienelainstruccinqueserrealizadaencasoqueelresultadodela(s)condicin(es)
saleverdadero.
Elelse,quesepuedetraducirporsinosecumplo,lainstruccinqueserrealizadaencasoqueel
resultadodela(s)condicin(es)delifsalifalso.
Sihaymasqueunainstruccinqueejecutartraselifoelelse,hayqueutilizarunbloquede
instrucciones,conteniendolasinstruccionesentre{y}.
Existetambienlainstruccin'elseif'quesignifica'sinosecumplo,sicumple...'ysetratacomoun
'if'.
Ejemplo:
<?php
if ($a > $b) {
print "a es mayor que b";
} elseif ($a == $b) {
print "a es igual que b";
} else {
print "a es mayor que b";
}
?>

9.3. SintaxisAlternativadeEstructurasdeControl
PHPofreceunasintaxisaltenativaparaalgunadesusestructurasdecontrol;asaber,if,while,for,y
switch.Encadacaso,laformabsicadelasintaxisalternativaescambiarabrirllavepordospuntos
(:)ycerrarllaveporendif;,endwhile;,endfor;,orendswitch;,respectivamente.
<?php if ($a==5): ?>
A es igual a 5
<?php endif; ?>

Enelejemplodearriba,elbloqueHTML"Aesigual5"seanidadentrodeunasentenciaifescritaen
lasintaxisalternativa.ElbloqueHTMLsemostrarasolamentesi$afueraiguala5.
Lasintaxisalternativaseaplicaaelseytambinaelseif.Lasiguienteesunaestructuraifconelseif
yelseenelformatoalternativo:
<?php
if ($a == 5):
print "a es igual a 5";
print "...";

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL
elseif ($a
print
print
else:
print
endif;
?>

Pagina38/73

== 6):
"a es igual a 6";
"!!!";
"a no es ni 5 ni 6";

9.4. switch
Elswitchseutilizaparacrearesquemadedecisiones.Elswitchpermitedetenervariasalternativas,
encontradelif...elsequesolotienedosalternativas.
Primerasedeclara,entreparntesis,cualvariablesevaaevaluar.
Siguiendo,paracadaalternativa,semencionalapalabracaseconlavalorcorrespondiendoalavalor
delaalternativa,yelcdigoquehayqueejecutar.Sinoseterminalaalternativaconlapalabra
break,elcdigodelasalternativassiguientesevanaejecutartambin,mismosielvalordela
variableevaluadanocorrespondealcase.
Porfin,lapalabradefaultseutilizaparamencionaraccionesarealizarencasoqueninguna
alternativasaliverdadera.Comoparaelcase,deberaterminarconbreakparaquenoseejecutara
otrocdigosiguiendo.

Sihaymasqueunainstruccinqueejecutartraselcaseoeldefault,hayqueutilizarunbloquede
instrucciones,conteniendolasinstruccionesentre{y}.
Ejemplo:
<?php
$i = 5;
switch ($i) {
case 0:
print "i
break;
case 1:
print "i
case 2:
print "i
break;
default:
print "i
}
?>

es igual a 0";
es igual a 1";
es igual a 2";
no es igual a 0, 1 o 2";

9.5. while
Elwhile...seutilizaparacrearbucles,esdecirrepetirunaaccinportantoquesecumpleauna
condicin.
Lacondicinquehayquecumplirsemencionadetrsdelapalabrawhile,entreparntesis.
Lasaccionesquehayqueejecutarsemencionandetrsdelwhile.Sihaymasqueunainstruccinque
ejecutar,hayqueutilizarunbloquedeinstrucciones,conteniendolasinstruccionesentre{y}.
<?php
/* ejemplo 1 */
$i = 1;
while ($i <= 10) {
print $i++; /* el valor impreso ser&iacute;a
$i antes del incremento
(post-incremento) */
}

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina39/73

/* ejemplo 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>

9.6. do...while
Eldo...whileseutilizaparacrearbucles,esdecirrepetirunaaccinportantoquesecumpleauna
condicin.
Lacondicinquehayquecumplirsemencionadetrsdelapalabrawhile,entreparntesis,y
terminaconpuntocoma';'.
Lasaccionesquehayqueejecutarsemencionandetrsdeldo.Sihaymasqueunainstruccinque
ejecutar,hayqueutilizarunbloquedeinstrucciones,conteniendolasinstruccionesentre{y}.
Laclusuladosepuedemencionarantesdelaclusulawhile.Enestecaso,elcdigodelaclusulado
seejecutaraunaprimeravezantesdeverificarlacondicindelwhile,yserepetirhastaquela
condicinseafalsa.
Ejemplo:
<?php
$i=10;
do {

print "Por aqui paso siempre!";


} while($i<5);
?>

9.7. for
Elforseutilizaparacrearbuclesunnmerofijodeveces.
Lacondicinquehayquecumplirsemencionadetrsdelapalabrafor,entreparntesis,ytiene
tresdiferentepartes,separadaspor;.Cadaparteesopcional,peroel;tienequesermencionado
mismosilaparteestavaca.
Laprimerapartesirveadeclararunvariable(usualmenteunint)y/oasignarleunvalororiginal.
Lasegundapartecontienelacondicindeejecucin.Usualmentelavariableinicializada>o<que
otrointovalorfija.
Laterceraparteseutilizaparamencionarelincrementoodecrementoeventual.
Lasaccionesquehayqueejecutarsemencionandetrsdelfor.Sihaymasqueunainstruccinque
ejecutar,hayqueutilizarunbloquedeinstrucciones,conteniendolasinstruccionesentre{y}.
Ejemplo:
<?php
for ($i = 1; $i <= 10; $i++) {
print $i;
}
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina40/73

9.8. foreach
PHP4yadelanteincluyeunaconstruccinforeach,talcomoperlyalgunosotroslenguajes.Esto
simplementedaunmodofcildeiterarsobrematrices.foreachfuncionasolamenteconmatricesy
devolverunerrorsiseintentautilizarconotrotipodedatosvariablesnoinicializadas.Haydos
sintaxis;lasegundaesunaextensinmenor,perotildelaprimera:
foreach(expresion_array as $value) sentencia
foreach(expresion_array as $key => $value) sentencia

Laprimeraformarecorreelarraydadoporexpresion_array.Encadaiteracin,elvalordelelemento
actualseasignaa$valueyelpunterointernodelarrayseavanzaenunaunidad(asenelsiguiente
paso,seestarmirandoelelementosiguiente).
Lasegundamanerahacelomismo,salvoquelaclavedelelementoactualserasignadaalavariable
$keyencadaiteracin.
Ejemplo:
<?php
$arr = array("one", "two", "three");
foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
foreach( $arr as $key => $value ) {
echo "Key: $key; Valor: $value<br>\n";
}
?>

9.9. break
Lainstruccinbreakpermitedesalirdeunabucleodeabandonarlassentenciasdeejecucindeun
switch.
Ejemplo:
<?php
$ii = 5;
for ($i = 0; $i < 10; $i++) {
if ($i>$ii) break;
echo $i;
}
?>

9.10. continue
Lainstruccincontinuesolosepuedeusarenbucles,ypermitedesaltardirectamentealabucle
siguiente,sinejecutarelrestodelcdigodelabuclecorriente.
Ejemplo:
<?php
$ii = 5;
for ($i = 0; $i < 10; $i++) {
if ($i==$ii) continue;
echo $i;
}
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina41/73

10. Funciones
10.1. Funcionesdefinidasporelusuario
Unafuncinsepuededefinirconlasiguientesintaxis:
Psuedocdigoparademostrarelusodefunciones
<?php
function foo ($arg_1, $arg_2, ..., $arg_n)
{
echo "Funci&oacute;n de ejemplo.\n";
return $retval;
}
?>

CualquierinstruccinvlidadePHPpuedeaparecerenelcuerpodelafuncin,inclusootras
funionesydefinicionesdeclases.

10.1.1. FuncionesCondicionales
EnPHP3,lasfuncionesdebendefinirseantesdequesereferencien.EnPHP4noexistetal
requerimiento.Exceptocuandounafuncinesdefinidacondicionalmentecomoenlosejemplos
siguientes.
Cuandounafuncinesdefinidacondicionalmentecomosepuedeverenestosdosejemplos,su
definicindebeserprocesadaantesqueseallamada.
Ejemplo:
<?php
$makefoo = true;
/* We can't call foo() from here
since it doesn't exist yet,
but we can call bar() */
bar();
if ($makefoo) {
function foo ()
{
echo "I don't exist until program execution reaches me.\n";
}
}
/* Now we can safely call foo()
since $makefoo evaluated to true */
if ($makefoo) foo();
function bar()
{
echo "I exist immediately upon program start.\n";
}
?>

10.1.2. Funcionesdentrodefunciones
<?php
function foo()
{
function bar()
{
echo "I don't exist until foo() is called.\n";
}
}

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina42/73

/* We can't call bar() yet


since it doesn't exist. */
foo();
/* Now we can call bar(),
foo()'s processesing has
made it accessible. */
bar();
?>

PHPnosoportalaredefinicindefuncionespreviamentedeclaradas.
Nota:Losnombresdefuncionessepuedenllamarconmayusculasominusculas,aunqueesuna
buenacostumbreelllamaralasfuncionestalycomoaparecenensudefinicin.

10.1.3. Parmetrosdelasfunciones
Lainformacinpuedesuministrarsealasfuncionesmediantelalistadeparmetros,unalistade
variablesy/oconstantesseparadasporcomas.
PHPsoportapasarparmetrosporvalor(elcomportamientopordefecto),porreferencia,y
parmetrospordefecto.ListasdelongitudvariabledeparmetrossloestnsoportadasenPHP4y
posteriores.
10.1.3.1. Pasarparmetrosporreferencia
Pordefecto,losparmetrosdeunafuncinsepasanporvalor(demaneraquesicambiaselvalordel
argumentodentrodelafuncin,nosevemodificadofueradeella).Sideseaspermitiraunafuncin
modificarsusparmetros,debespasarlosporreferencia.
Siquieresqueunparmetrodeunafuncinsiempresepaseporreferencia,puedesanteponerun
ampersand(&)alnombredelparmetroenladefinicindelafuncin:
Ejemplopasandoparmetrosdefuncionesporreferencia
<?php
function add_some_extra(&$string)
{
$string .= ' y algo m&aacute;s.';
}
$str = 'Esto es una cadena, ';
add_some_extra($str);
echo $str;
// Saca 'Esto es una cadena, y algo m&aacute;s.'
?>

10.1.3.2. Parmetrospordefecto
UnafuncinpuededefinirvalorespordefectoparalosparmetrosescalaresestiloC++:
Ejemplodeusodeparmetrospordefectoenfunciones
<?php
function makecoffee ($type = "cappucino")
{
return "Hacer una taza de $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");
?>

Lasalidadelfragmentoanteriores:
Hacer una taza de cappucino.
Hacer una taza de espresso.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina43/73

Elvalorpordefectotienequeserunaexpresinconstante,ynounavariable,miembrodeunaclase
llamadaaunafuncin.
Destacarquecuandoseusanparmetrospordefecto,estostienenqueestaraladerechadecualquier
parmetrosinvalorpordefecto;deotramaneralascosasnofuncionarndelaformaesperada.
Consideraelsiguientefragmentodecdigo:
Ejemplodeusoincorrectodeparmetrospordefectoenfunciones
<?php
function makeyogurt ($type = "acidophilus", $flavour)
{
return "Haciendo un bol de $type $flavour.\n";
}
echo makeyogurt ("mora");
esperada
?>

// No funcionar&aacute; de la manera

Lasalidadelejemploanteriores:
Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Haciendo un bol de mora.

Ejemplodeusocorrectodeparmetrospordefectoenfunciones
<?php
function makeyogurt ($flavour, $type = "acidophilus")
{
return "Haciendo un bol de $type $flavour.\n";
}
echo makeyogurt ("mora");
?>

// funciona como se esperaba

Lasalidadeesteejemploes:
Haciendo un bol de acidophilus mora.

10.1.3.3. Listadelongitudvariabledeparmetros
PHP4soportalaslistasdelongitudvariabledeparmetrosenlasfuncionesdefinidasporelusuario.
Esrealmentefcil,usandolasfuncionesfunc_num_args(),func_get_arg(),yfunc_get_args().Verla
documentacinenelCDdelcursoparamsdetalles.
Nonecesitadeningunasintaxisespecial,ylaslistasdeparmetrospuedenserescritasenla
llamadaalafuncinysecomportarndelamaneraesperada.

10.1.4. Devolviendovalores
Losvaloresseretornanusandolainstruccinopcionalreturn.Puededevolversecualquiertipode
valor,incluyendolistasyobjetos.
Ejemplodeusodereturn()
<?php
function square ($num)
{
return $num * $num;
}
echo square (4);
// saca '16'.
?>

Nopuedesdevolvermltiplesvaloresdesdeunafuncin,perounefectosimilarsepuedeconseguir
devolviendounalista.
Ejemploretornandounamatrizparaobtenermltiplesvalores
<?php
function small_numbers()

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina44/73

{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>

Pararetornarunareferenciadesdeunafuncin,setienequeusareloperadordereferencias&tanto
enladeclaracindelafuncincomoenlaasignacindelvalorderetornoaunavariable;
Ejemploretornandounareferenciadesdeunafuncin
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>

10.2. Funcionesinternas(incorporadas)
PHPtieneincorporadasmuchasfuncionesyconstrucciones.
ExistentambinfuncionesquerequierenextensionesespecficasdePHPparaquenofallenconun
errorfataldeltipo"undefinedfunction".Porejemplo,parausarfuncionesimage,talcomo
imagecreatetruecolor(),senecesitacompilarPHPconsoporteparaGD.Oparausarmysql_connect()
senecesitacompilarPHPconsoporteparaMySQL.
ExistenmuchasfuncionesenelncleodePHPqueseincluyenencadaversiondePHP,comolas
funcionesstringyvariable.Unallamadaalafuncinphpinfo()get_loaded_extensions()mostrar
queextensionesestncargadasentuversindePHP.Tenertambienencuentaquemuchas
extensionesseencuentranactivadaspordefectoyqueelmanualdePHPseencuentradivididoen
partes,segnestasextensiones.Vealoscaptulosconfiguracin,instalacinyloscapitulossobre
cadaextensinenladocumentacinenelCDdelcurso,paraobtenerinformacinsobrecomo
configurarvuestroPHP.
Laexplicacindecomoleereintrerpretarunprototipodefuncinseencuentraenlaseccindela
documentacinenelCDdelcursotituladacomoleerladefinicindeunafuncin.Esimportante
entenderquedevuelveunafuncinsilafuncintrabajadirectamenteenelvalorentregadoala
misma.Porejemplo,str_replace()devuelveunacadenamodificadamientrasqueusort()trabaja
directamenteenelvalorentregadoalamisma.Cadapginadelmanualcontieneinformacin
especficasobrelasdiferentesfuncionesexistentes,parametrosqueutilizan,valoresdevueltos,
cambiosdecomportamiento,etc.Esimportanteconocerestasdiferenciasparapoderescribir
correctamentecdigoPHP.

10.2.1. Unasdelasfuncionesinternasmsinteresantes
10.2.1.1. phpinfo()
<?php
phpinfo();
?>

DevuelvelaconfiguracincorrientedelservidorPHP.Muyintersanteparaeldesarollador.Cuidado
enproduccinquetambienpodraserinteresanteparahackers...
10.2.1.2. printf
<?php
printf(cadena formato, variable1, variable2...);
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina45/73

Lacadenadeformateoindicacmosehanderepresentarlasvaloresqueposteriormentele
indicaremos.Laprincipalventajaesqueademsdepoderformatearlosvaloresdesalida,nos
permiteintercalartextoentreellos.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
printf("El numero dos con diferentes formatos: %d %f %.2f",2,2,2);
?>
</body>
</html>

EjecutarejemploVercdigofuente
Lacadenadeformatopuedeincluirunaseriadecarcteresespecialesqueindicancomoformatear
lasvariablesqueseincluyenenlainstruccin.
Elemento

Tipodevariable

%s

Cadenadecarcteres.

%d

Nmerosindecimales.

%f

Nmerocondecimales.

%c

CarcterASCII.

Aunqueexistenotrostipos,estossonlosmsimportantes.
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$var="texto";
$num=3;
printf("Puede fcimente intercalar <b>%s</b> con nmeros <b>%d</b> <br>",$var,$num);
printf("<TABLE BORDER=1 CELLPADDING=20>");
for ($i=0;$i<10;$i++)
{
printf("<tr><td>%10.d</td></tr>",$i);
}
printf("</table>");
?>
</body>
</html>

10.2.1.3. print_r
print_r()despliegainformacinsobreunavariableenunaformaqueesaptaparasulecturapor
humanos.Siseleentregaunavariabletipostring,integerofloat,elvalormismoserimpreso.Sise
leentregaunarray,losvaloressernpresentadosenunformatoquemuestralasclavesylos
elementos.
Recuerdequeprint_r()desplazarelapuntadordelamatrizalfinal.Usereset()parallevarlode
vueltaalcomienzo.
Ejemplo:
<?php
$a = array ('a' => 'manzana', 'b' => 'banano', 'c' => array ('x', 'y', 'z'));
print_r ($a);
?>

Elresultadodelejemploseria:
Array
(
[a] => manzana

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina46/73

[b] => banano


[c] => Array
(
[0] => x
[1] => y
[2] => z
)
)

Siquisieracapturarlasalidadeprint_r(),useelparmetrodevolver.Siesteparmetrorecibeel
valorTRUE,print_r()devolversusalida,enlugardeimprimirla(cosaquehacepordefecto).
Ejemplodelparmetrodevolver
<?php
$b = array ('m' => 'mono', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$resultados = print_r($b, true); // $resultados contiene ahora la salida de print_r
?>

10.3. Funcionesvariables
PHPsoportaelconceptodefuncionesvariable,estosignificaquesiunavariabletieneunos
parntesisaadidosalfinal,PHPbuscarunafuncinconelmismonombrequelaevaluacindela
variable,eintentarejecutarla.Entreotrascosas,estotepermiteimplementarretrollamadas
(callbacks),tablasdefuncionesydems.
Lasfuncionesvariblesnofuncionarnconconstruccionesdellenguaje,talcomoecho(), print(),
unset(), isset(), empty(), include(), require()yderivados.Senecesitarusarunafuncinpropia
parautilizarcualquieradeestosconstructorescomofuncionesvariables.

10.3.1. print
printMuestraunacadena

Descripcin:int

print ( string cadena )

Muestraelvalordecadenaporlasalidadefinida.Siempredevuelveelvalor1.
print()noesrealmenteunafuncin(esunasentenciadellenguaje)demodoquenoserequiereeluso
delosparntesis.

10.3.2. echo
echoMuestraunaomscadenas

Descripcin:void

echo ( string arg1 [, string ...] )

Muestratodossusparmetrosporlasalidadefinida.
echo()noesrealmenteunafuncin(esunasentenciadellenguaje)demodoquenoserequiereeluso
delosparntesis.Dehecho,siseindicamsdeunparmetro,nosepuedenincluirlosparntesis.
Ejemplosdeecho()
<?php
echo "Hola Mundo";
// Se pueden usar variables dentro de una sentencia echo
$saludo = "que tal";
$despedida = "hasta luego";
echo "hola, $saludo"; // hola, que tal
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina47/73

10.3.3. require()
Lasentenciarequire()incluyeyevaluaelarchivoespecificado.
require()yinclude()sonidnticasentodoslosaspectosexceptoenelmododeactuaranteunerror.
include()produceunWarningmientrasquerequire()produceunErrorFatal.
Verinclude()paramsdetalles.

10.3.4. include()
Lasentenciainclude()incluyeyevalaelarchivoespecificado.
Estadocumentacintambinseaplicaalafuncinrequire().
require()yinclude()sonidnticasentodoslosaspectosexceptoenelmododeactuaranteunerror.
include()produceunWarningmientrasquerequire()produceunErrorFatal.Enotraspalabras,no
dudeenutilizarrequire()siquierequeunficheronoencontradocuelgueelprocesamientodela
pgina.include()nosecomportadeestamanera,elscriptseguirfuncionandodetodasmaneras.
Asegurarsequeinclude_pathesteconfiguradobien.
Cuandounficheroesincluido,elcdigoquecontieneheredalavariablescopedelalineaendondeel
includeocurre.Cualquiervariabledisponibleenesalineaenelficherodesdedondesehacela
inclusinestardisponibleenelficheroincluidoapartirdeesemomento.
Ejemplobsicodelafuncininclude()
vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>

Silainclusinocurredentrodeunafuncinenelficherodondeseincluye,todoelcdigocontenidoen
elficheroincluidosecomportarcomosihubiesesidodefinidodentrodeestafuncin.
Ejemploincluyendodesdefunciones
<?php
function foo()
{
global $color;
include 'vars.php';
echo "A $color $fruit";
}
/* vars.php is in the scope of foo() so
*
* $fruit is NOT available outside of this *
* scope. $color is because we declared it *
* as global.
*/
foo();
// A green apple
echo "A $color $fruit";
// A green
?>

Cuandounficheroesincluido,elintrpretesaledelmodoPHPyentraenmodoHTMLalprincipio
delarchivoreferenciado,yvuelvedenuevoalmodoPHPalfinal.Porestarazn,cualquiercdigo

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina48/73

dentrodelarchivoreferenciadoquedebieraserejecutadocomocdigoPHPdebeserencerradodentro
deetiquetasvlidasdecomienzoyfindePHP.
Yaqueinclude()yrequire()soncontructoresespecialesdellenguaje,sedebendeincluirdentrodel
bloquedeunasentencia,siestndentrodeunbloquecondicional.
Ejemplodeinclude()ybloquescondicionales
<?php
// This is WRONG and will not work as desired.
if ($condition)
include $file;
else
include $other;
// This is CORRECT.
if ($condition) {
include $file;
} else {
include $other;
}
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina49/73

11. Tratamientodeexcepciones
ExistentrescategorasdeerroresenPHP.Loserroresdecompilacin,loserroresdeejecucin,ylos
erroresdelgica.Loserroresdeejecucinsonlasquesepuedenatraparenelcdigoytratar
directamente.

11.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnosercapazidentificarlostiposdeerroresquesepuedenencontrar
enuncdigoenPHP,ytratarlosconxito.

11.2. Erroresdecompilacin
Loserroresdecompilacinsonlaserroresdesintaxis.Alcompilarelcdigo,PHPdetectaloserrores
quenorespetanlasintaxisdelPHP,asunpuntocomafaltandoalfindeunalnea,parentisis
abiertaynocerrada,etc...
EstaserroresnopermitenquesecrearaelHTMLdesalida,porqueestecdigonopuedeser
compilado(analizado)porelservidorPHP.Ningunerrorestenviadaalcliente,perolapginaPHP
estblanca.

11.3. Erroresdelgica
Loserroresdelgicasonerroresdebidoaundiseoincorrectodelcdigo.Porejemplo,unbucleque
nuncatermina,unafaltadeortografaenuntexto,unaformuladeclculoequivocada,...

11.4. Erroresdeejecucin
PHP5tieneunmodelodeexcepcionessimilaraldeotroslenguajesdeprogramacin.Unaexcepcin
puedeserlanzada,intentadaocapturadaenPHP.Unbloquedeintento(try)debeincluirporlo
menosunbloquedecaptura(catch).Losbloquesdecapturamltiplespuedenserusadospara
capturardiferentestiposdeclases;laejecucincontinuardespusdelltimobloquedecaptura
definido.Lasexcepcionespuedenserlanzadasdentrodebloquesdecaptura.
Cuandoeslanzadaunaexcepcin,lasiguientelneadecdigonoserejecutadayPHPintentar
encontrarelprimerbloquedecapturadeexcepciones.Siunaexcepcinnoescapturadasedespliega
unerrorfataldePHPconunmensajedequelaexcepcinnofuecapturada,amenosqueexistaun
manejadordeerroresdefinidocomoset_exception_handler().

11.4.1. Nivelesdeerrordeejecucin
Existenvariosnivelesdeerror.Sepuededefiniralniveldelservidor(php.ini)cual(es)nivel(es)de
errorsevanareportar.EnPHP5pordefectosereportentodaslaserroresmenoslasdetipo
NOTICE.Unotroparametroindicasielerrorreportadodesermostrado(sino,saleunapgina
blancaenvezdelapginanormal).
Pordefecto,loserroresestnescondidasalusuario(pginablanca),porrazndeseguridad.Sepuede
modificarlaconfiguracindelservidor(php.ini)paraqueseenseanlaserroresenlaspginasa
dondeocurren.Enproduccinnoestaaconsejadodeensearerrores,quepodrandarinformacina
uneventual'hacker'.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina50/73

ErroresyRegistro
Valor

Constante

Descripcin

Nota

E_ERROR(integer)

Erroresfatalesentiempodeejecucin.Estos
indicanerroresdelosquenoesposible
recuperarse,talescomoproblemasdeasignacin
dememoria.Sedetienelaejecucindelscript.

E_WARNING(integer)

Advertenciasentiempodeejecucin(erroresno
fatales).Laejecucindelscriptnoseinterrumpe.

E_PARSE(integer)

Erroresdeintrpreteentiempodecompilacin.
Estotipodeerroresdeberansergenerados
nicamenteporelinterprete.

E_NOTICE(integer)

Anotacionesentiempodeejecucin.Indicanqueel
scriptsehatopadoconalgoquepuedeindicarla
presenciadeunerror,peroquetambinpodra
ocurrirenelcursonormaldelaejecucindeun
script.

16

E_CORE_ERROR
(integer)

Erroresfatalesqueocurrenduranteelarranque
apartirde
inicialdePHP.EscomounE_ERROR,exceptoque PHP4
esgeneradoporelncleodePHP.

32

E_CORE_WARNING
(integer)

Advertencias(erroresnofatales)queocurren
duranteelarranqueinicialdePHP.Escomoun
E_WARNING,exceptoqueesgeneradoporel
ncleodePHP.

64

E_COMPILE_ERROR
(integer)

Erroresfatalesentiempodecompilacin.Escomo apartirde
unE_ERROR,exceptoqueesgeneradoporel
PHP4
MotordeScriptingdeZend.

128

E_COMPILE_WARNIN
G(integer)

Advertenciasentiempodecompilacin(erroresno apartirde
fatales).EscomounE_WARNING,exceptoquees PHP4
generadoporelMotordeScriptingdeZend.

256

E_USER_ERROR
(integer)

Mensajedeerrorgeneradoporelusuario.Escomo apartirde
unE_ERROR,exceptoqueesgeneradodesde
PHP4
cdigoPHPusandolafuncintrigger_error().

512

E_USER_WARNING
(integer)

Mensajedeadvertenciageneradoporelusuario.
apartirde
EscomounE_WARNING,exceptoqueesgenerado PHP4
desdecdigoPHPusandolafuncin
trigger_error().

1024

E_USER_NOTICE
(integer)

Anotacingeneradaporelusuario.Escomoun
apartirde
E_NOTICE,exceptoqueesgeneradodesdecdigo PHP4
PHPusandolafuncintrigger_error().

2047

E_ALL(integer)

Todosloserroresyadvertencias,enlamedidaen
queseansoportados,exceptoporelnivel
E_STRICT.

2048

E_STRICT(integer)

Noticiasdetiempodeejecucin.Habiliteestevalor apartirde
parahacerquePHPsugieracambiosensucdigo PHP5
quevelarnporlamejorinteroperabilidadypor
mantenerlacompatibilidaddesucdigo.

CopyrightCdricSimon,2006

Versin1.1

apartirde
PHP4

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina51/73

LanzandounaExcepcin
<?php
try {
$error = 'Always throw this error';
throw new Exception($error);
// Code following an exception is not executed.
echo 'Never executed';
} catch (Exception $e) {
echo 'Caught exception: ',
}

$e->getMessage(), "\n";

// Continue execution
echo 'Hello World';
?>

11.4.2. set_exception_handler
set_exception_handlerDefineunafuncindegestindeexcepcionesdefinidaporelusuario

11.4.2.1. Descripcin:
string set_exception_handler ( callback gestor_excepciones )

Estableceelgestordeexcepcionespredeterminadosiunaexcepcinnoescapturadaalinteriordeun
bloquetry/catch.Laejecucinsedetendrdespusdequegestor_excepcionesesllamado.
Elgestor_excepcionesdebedefinirseantesdellamarset_exception_handler().Estafuncindebe
aceptarunparmetro,queserelobjetodeexcepcinquehasidoarrojado.
11.4.2.2. Listadeparmetros
gestor_excepciones:Nombredelafuncinaserllamadacuandoocurreunaexcepcinnocapturada.
11.4.2.3. Valoresretornados
Devuelveelnombredelgestordeexcepcionespreviamentedefinido,oNULLencasodeerror.Sino
sehabadefinidoungestorpreviamente,sedevuelveNULLtambin.
Ejemplodeset_exception_handler()
<?php
function gestor_excepciones($excepcion) {
echo "Excepcion no capturada: " , $excepcion->getMessage(), "\n";
}
set_exception_handler('gestor_excepciones');
throw new Exception('Excepcion No Capturada');
echo "No es ejecutado\n";
?>

11.4.2.4. Pginadeerrorpersonalizada
Ustedpuedemandaraunapginadeerrorpersonalizadautilizandoset_exception_handler()para
mandaraotropgina,porejemplounapginadeerror.
Enlapginadeorigen:
<?php
function gestor_excepciones($num_err, $mens_err, $nombre_archivo, $num_linea, $vars) {
/* Redireccionar a una pagina diferente en el directorio actual de la peticion */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$redirect="error.php?page=".basename($_SERVER['PHP_SELF'])."&error=".$mens_err."&linea=".
$num_linea;
header("Location: http://$host$uri/$redirect");
exit;
}
// establecer el gestor de errores definido
$gestor_errores_actual = set_error_handler("gestor_excepciones");
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina52/73

error.php
<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta name="GENERATOR" content="PHPEclipse 1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Error</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966" alink="#FFCC99">
<h2>Error en la pgina :
<?php
print $_GET["page"];
?> a la linea
<?php
print $_GET["linea"];
?></h2>
<hr>
Error:
<?php
$error= $_GET["error"];;
print $error;
?>
</body>
</html>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina53/73

12. Losformularios
12.1. Creacindelformulario
LosformulariosestncreadossimplementeenHTML.ElPHPsepuedeutilizaradentrodel
formulariopara,porejemplo,asignarvalorespordefectoodesactivarciertoscampossegnla
informacindisponible(variabledesesin,uotroformulario).
Esmuyimportantequecadacampodelformulariotengaunnombre(parmetroNAMEdelcampo).
ParaelparmetroMETHOD,lesaconsejosiempreutilizarPOST,porqueestemetodonotienelimitede
tamaodelosdatosenviados,yestamenosfacildetravesiarporelusuario.

12.2. Tratamientodelformulario
Cuandoelformularioestenviado,lapginaPHPalacualseenvopuederecuperarelcontenidode
cadacampoutilizando$_GET,$_POST,o$_REQUESTconenparametroelnombredelparametrodela
consultaquequeremosrecuperar.
$_GETsolorecuperavaloresenviadasporelmetodoGET, $_POSTporelmetodoPOST,y$_REQUESTpor

cualquiermetodo.

Siprobamosdesacarelvalordeuncampoquenoexiste,segeneraunerrordenivelNOTICE.
Paramsfacilidad,sepuedenguardarlosvaloresenvariables.
Ejemplo:
formulario.php(quesepodratambinllamarformulario.htmlporquenollevacdigoPHP)
<html>
<head>
<title>Test formulario</title>
</head>
<body bgcolor="#CCDDAA">
<h1>Formulario de prueba</h1>
<hr>
<p>
<form name="formulario" action="resultadoFormulario.php" method=POST>
<table border=0>
<tr>
<th>Su nombre:</th><td><input type=text name="nombre" size=30></td>
<th>Su apellido:</th><td><input type=text name="apellido" size=30></td>
</tr>
<tr>
<th>Su direccin:</th><td colspan=3><input type=text name="domicilio" size=100></td>
</tr>
<tr>
<th>Su pais:</th><td><select name="pais">
<option>Blgica
<option selected>Nicaragua
<option>Otro
</select></td>
</tr>
<tr>
<th>Su no de tel:</th><td><input type=text name="tel" size=30></td>
<th>Su no celucar:</th><td><input type=text name="cel" size=30></td>
</tr>
<tr>
<th>Su nota:</th><td colspan=3><textarea name="nota" cols=75 rows=5></textarea></td>
</tr>
<tr>
<th></th><td><button type=reset>Resetiar</td>
<th></th><td><button type=submit>Enviar</td>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina54/73

</tr>
</table>
</form>
</body>
</html>

resultadoFormulario.php:
<html>
<head>
<?php
$nombre=$_POST["nombre"];
$apellido=$_POST["apellido"];
$omicilio=$_POST["domicilio"];
$pais=$_POST["pais"];
if ($pais==null) $pais="Otro";
$tel=$_POST["tel"];
$cel=$_POST["cel"];
$nota=$_POST["nota"];
?>
<title>Resultado de formulario</title>
</head>
<body bgcolor="#CCDDAA">
<h1>Resultado de su formulario</h1>
<p>
<p>
Estimado/a seor(a) <big><?php print $apellido ?></big>,<br>
<br>
Le/a informamos que su formulario fue transmitido con xito.
<p>
<?php
if ($pais!="Otro")
{
?>
Notamos que Usted vive en <big><?php print $pais ?></big>, por favor elige su cuidad:<br>
<form name="formulario" action="resultadoFormulario2.php" method=POST>
<select name="cuidad">
<?php
if ($pais=="Nicaragua")
{
?>
<option>Managua
<option>Leon
<option>Granada
<option>Otro
<?php
} // Nicaragua
if ($pais=="Blgica")
{
?>
<option>Bruselas
<option>Namur
<option>Arlon
<option>Otro
<?php
} // Belgica
?>
</select>
<input type=hidden name="nombre" value="<?php print $nombre ?>">
<input type=hidden name="apellido" value="<?php print $apellido ?>">
<input type=hidden name="domicilio" value="<?php print $domicilio ?>">
<input type=hidden name="pais" value="<?php print $pais ?>">
<input type=hidden name="cel" value="<?php print $cel ?>">
<input type=hidden name="tel" value="<?php print $tel ?>">
<input type=hidden name="nota" value="<?php print $nota ?>">
<button type=submit>Enviar</button>
</form>
<?php
} // <>otro pais
?>
<hr>
<h3>Enlaces</h3>
<a href="index.php">Regresar al indice</a><br>
<a href="formulario.php">Regresar al formulario</a>
</body>
</html>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina55/73

12.2.1. import_request_variables
import_request_variables -- Importar variables GET/POST/Cookie en el contexto global

12.2.1.1. Descripcin
bool import_request_variables ( string tipos [, string prefijo] )

ImportalasvariablesGET/POST/Cookieenelcontextoglobal.Estilsiustedhadeshabilitado
register_globals,perodeseaveralgunasvariablesenelcontextoglobal.
Usandoelparmetrotipos,esposibleindicarculesvariablesdepeticindebenimportarse.Puede
usarloscaracteres'G','P'y'C'respectivamenteparaindicarGET,POSTyCookie.Estoscaracteres
nosonsensiblesamaysculasominsculas,asquepuedeusarcualquiercombinacinde'g','p'y'c'.
POSTincluyelainformacindearchivoscargadosmediantePOST.Notequeelordendelasletras
tieneimportancia,yaquecuandousa"gp",lasvariablesPOSTsobrescribirnlasvariablesGETcon
elmismonombre.CualquierotraletradiferenteaGPCesdescartada.
Elparmetroprefijoesusadocomoprefijoparanombresdevariables,queescolocadoantesdetodos
losnombresdevariablesimportadosenelcontextoglobal.DemodoquesitieneunvalorGET
llamado"userid",yusaelprefijo"pref_",entoncesobtendrunavariablegloballlamada
$pref_userid.
resultadoFormulario2.php:
<html>
<head>
<?php
// Esto importara las variables POST con el prefijo "v_"
import_request_variables("P", "v_");
?>
<title>Resultado de formulario</title>
</head>
<body bgcolor="#CCDDAA">
<h1>Resultado final de su formulario</h1>
Su nombre : <?php print $v_nombre ?><br>
Su apellido : <?php print $v_apellido ?><br>
Su domicilio : <?php print $v_domicilio ?><br>
Su cuidad : <?php print $v_cuidad ?><br>
Su pais : <?php print $v_pais ?><br>
Su celular : <?php print $v_cel ?><br>
Su telefono : <?php print $v_tel ?><br>
Su nota : <?php print $v_nota ?><br>
<p>
<hr>
<h3>Enlaces</h3>
<a href="index.php">Regresar al indice</a><br>
<a href="formulario.php">Regresar al formulario</a>
</body>
</html>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina56/73

13. UtilizacindeCOOKIES
13.1. QusonlosCOOKIES?
LosCOOKIESsonvariablequeseguardanenpequeosarchivosdetextoenlacomputadoradel
clienteyquepermitenguardarciertasinformacioneselcliente.Esopermiteporejemploguardarel
nombredelclientepararecuperarlolaprximavezqueelclienteseconecta.
Alcontrariodelavariabledesesinqueseborranalterminarlasesin,sepuededefinireltiempo
queelCOOKIEestavlido.Pordefecto,estvalidosolamenteporlasesincorriente(comolas
variablesdesesin),perosepuedecambiarlavalordesutiempodevencimientoparapoder
recuperarlomstarde,enlaprximaconexin.

13.2. CreacindeunCOOKIE
ElcdigodecreacindeunCOOKIEtienequeirdeprimero,anteslaetiqueta<HTML>ydecualquier
otrocdigo(PHP,...).
Seutilizalafuncinsetcookie()paracrearomodificaruncookie.
Losparmetrosdesetcookie() explicados:
Parmetro

Descripcin

Ejemplos

nombre

Elnombredelacookie.

'nombre_cookie'esllamadacomo
$_COOKIE['nombre_cookie']

valor

Elvalordelacookie.Estevalores
Asumiendoquenombrees'nombre_cookie',
almacenadoenelequipodelcliente;no estevaloresrecuperadopormediode
almeceneinformacinsensible.
$_COOKIE['nombre_cookie']

expirar

Lahoraenlaqueexpiralacookie.
Estevaloresunamarcadetiempo
Unixasqueeselnmerodesegundos
recorridosdesdeelepoch.Enotras
palabras,esprobablequeestevalor
seadefinidoconlafuncintime()ms
elnmerodesegundosantesdeque
ustedquieraqueexpire.Oesposible
usarmktime().

ruta

Larutaenelservidorenlaqueestar Sisedefinecomo'/',lacookieestar
disponiblelacookie.
disponibleeneldominiocompleto.Sise
definecomo'/foo/',lacookieestardisponible
nicamentealinteriordeldirectorio/foo/y
todossussubdirectoriosendominiocomo/foo/
bar/.Elvalorpredeterminadoeseldirectorio
actualenelquesedefinelacookie.

dominio

Eldominioenelquelacookieest
disponible.

CopyrightCdricSimon,2006

time()+60*60*24*30definirquelacookie
expireen30das.Sinosedefine,lacookie
expiraralfinaldelasesin(cuandoel
navegadorseacerrado).

Paralograrquelacookieestdisponibleen
todoslossubdominiosdeexample.com
entoncesesnecesariodefinirestevalorcomo
'.example.com'.Elcaracter.noesrequerido
perohacealacookiecompatibleconms

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Parmetro

Descripcin

Pagina57/73

Ejemplos
navegadores.Definirsuvalorcomo
www.example.comharquelacookieest
disponiblenicamenteenelsubdominio
www.Refirasealacomparacindesufijos
enlaespecificacinparamsdetalles.

segura

Indicaquelacookiedeberaser
0o1
transmitidanicamentesobreuna
conexinHTTPSsegura.Cuandosu
valoresTRUE,lacookieserdefinida
nicamentesiexisteunaconexin
segura.Elvalorpredeterminadoes
FALSE.

Ejemplo:setCookie.php
<?php
$valor = 'algo desde algun lugar';
setcookie("CookieDePrueba", $valor, time()+3600);
setcookie("Prueba", "Hola", time()+3600);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Creacin de un Cookie</title>
</head>
<body bgcolor="#FFFFFF">
<h1>Cookie creada.</h1>
<hr>
Nombre = CookieDePrueba<br>
Valor = <?php echo $valor ?>
<hr>
<a href="getCookie.php">Leer Cookie</a><br>
</body>
</html>

13.3. RecuperacindeinformacindeunCOOKIE
Unavezsehandefinidolascookies,ellaspuedenseraccesadasenlasiguientecargadepginacon
lasmatrices$_COOKIEo$HTTP_COOKIE_VARS.Losvaloresdecookiestambinexistenen
$_REQUEST.
Ejemplo:getCookie.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Leer variable de sesin</title>
</head>
<body bgcolor="#FFFFFF">
<h1>Lista de Cookies disponibles:</h1>
<hr>
<p>
<?php
print("Imprime una cookie individual : <font color=blue>");
echo $_COOKIE["CookieDePrueba"]."</font><br>";
print("Otra forma de depurar/probar es ver todas las cookies : <font color=blue>");
print_r($_COOKIE);
print("</font><br>");
print("Esto importara las variables Cookie con el prefijo 'v_' : <font color=blue>");
import_request_variables("C", "v_");
print($v_Prueba."</font><br>");

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina58/73

?>
<table border="1">
<tr><th align=left>Nombre del Cookie</th><th align=left>Valor</th></tr>
<?php
foreach ($_COOKIE as $key => $value)
print("<tr><td>".$key."</td><td><font color=blue>".$value."</td></tr>");
?>
</table>
<hr>
<a href="setCookie.php">Crear un Cookie</a><br>
<a href="invalidCookie.php">Borrar un Cookie</a><br>
</body>
</html>

13.4. BorradodeunCOOKIE
ParaborrarunCOOKIE,hayqueseguirlamismasintaxisqueparacrearlo,soloqueelvalorsea
unacadenavaca.
Ejemplo:invalidCookie.php

<?php
setcookie("CookieDePrueba", "", time()+3600);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF">
<h1>Su Cookie ha sido borrada.</h1>
<hr>
<a href="getCookie.php">Leer Cookie</a><br>
</body>
</html>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina59/73

14. Utilizacindevariablesdesesin
Lasvariablesdesesinsonvariablesquesepuedenatribuiraunclienteconectado,yquesern
disponibleporeltiempoqueduralasesin:Lasesinexpiracuandosecierraennavegador,onose
navegaenelsitioporunciertotiempo(dependedelaconfiguracindelservidorysepuedemodificar
enelcdigoPHP),ocuandoseinvalidalasesinexplcitamenteenelcdigoPHP.
Cadaclienteconectadopodrastenersuspropiasvaloresquesequedaranguardadasenlamemoria
delservidor.

14.1. Iniciodesesin
EnPHP,amenosqueelparametrosession_autostartseapuestoa1enlaconfiguracindelservidor,
PHPpordefectonoabresessionporcadausuarioconectado.Hayqueexplicitamenteabriruna
sesinenelcdigoPHP.
<?php
session_start(); // recupera la sesion existente o abre una nueva sesion si no existe ya
?>

14.2. Declaracindevariabledesesin
Paradeclaraocambiarelvalordeunavariabledesesin,asignandounvalora
$_SESSION['miVariable'] = miValor.
Porejemplo:$_SESSION['nombre']=Cedric;crealavariabledesesinnombreconelvalorCedric.Si
lavariableyaexiste,sololecambiaelvalor.

14.3. Recuperarelvalordeunvariabledesesin
Pararecuperarelvalordeunvariabledesesin,seutilizatambien$_SESSION['miVariable'].
Porejemplo:$nombre=$_SESSION['nombre'];regresaraelvalordelavariabledesesinllamada
'nombre',queennuestrocasoseraCedric,segnelejemplodearriba.
Silavariablenoexiste,regresaraunerrordenivelNOTICE.

14.4. Invalidarunasesin
Parainvalidarunasesin,seutilizasession_destroy().
Porejemplo:session.destroy

CopyrightCdricSimon,2006

()vaainvalidarlasesincorrientedelusuario.

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina60/73

15. VariablesPredefinidas
EnPHPhayunsinnmerodevariablesqueestnpredefinidasydisponiblededesdecualquier
parte.Paralosdetallesdecadavariable,verladocumentacindisponibleenelCDdelcurso.

15.1. Variablesdeservidor:$_SERVER
$_SERVEResunamatrizquecontieneinformacintalcomocabeceras,rutasyubicacionesde
scripts.Lasentradasdeestamatrizsoncreadasporelservidorweb.Noexistengarantasdeque
cadaservidorvayaaproveeralgunodeestosvalores;puedequelosservidoresomitanalgunos,o
proveanotrosquenoselistanaqu.

15.2. Variablesdeentorno:$_ENV
EstasvariablessonimportadasenelespaciodenombresglobaldePHPdesdeelentornobajoelque
estsiendoejecutadoelintrpretePHP.Muchassonentregadasporelintrpretedecomandosbajo
elquePHPestcorriendoydiferentessistemassuelentenerdiferentestiposdeintrpretesde
comandos,unalistadefinitivaesimposible.Porfavorconsulteladocumentacindesuintrpretede
comandosporunalistadevariblesdeentornoqueresultandefinidas.

15.3. CookiesHTTP:$_COOKIE
UnamatrizasociativadevariablespasadasalscriptactualatravsdecookiesHTTP.Global
automticamenteencualquiercontexto.

15.4. VariablesHTTPGET:$_GET
UnamatrizasociativadevariablespasadasalscriptactualatravsdelmtodoHTTPGET.Global
automticamenteencualquiercontexto.

15.5. VariablesHTTPPOST:$_POST
UnamatrizasociativadevariablespasadasalscriptactualatravsdelmtodoHTTPPOST.Global
automticamenteencualquiercontexto.

15.6. VariablesdecargadearchivosHTTP:$_FILES
UnamatrizasociativadeelementoscargadosalscriptactualatravsdelmtodoHTTPPOST.
Globalautomticamenteencualquiercontexto.

15.7. Variablesdepeticin:$_REQUEST

Unamatrizasociativaqueconsisteenloscontenidosde$_GET,$_POST,y$_COOKIE.

15.8. Variablesdesesin:$_SESSION

Unamatrizasociativaquecontienelasvariablesdesesindisponiblesenelscriptactual.Consulte
ladocumentacinsobreFuncionesdeSesinparamsinformacinsobrecmoesusadastamatriz.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina61/73

15.9. Variablesglobales:$GLOBALS

Unamatrizasociativaquecontienereferenciasatodaslasvariablesqueestndefinidas
actualmenteenelcontextoglobaldelscript.Losnombresdelasvariablessonlasclavesdelamatriz.

15.10. Elmensajedeerrorprevio:$php_errormsg

$php_errormsgesunavariablequecontieneeltextodelltimomensajedeerrorgeneradoporPHP.
Estavariablesoloestardisponiblesdentrodelcontextoenelqueelerrorocurri,ysolosilaopcin
deconfiguracintrack_errorsesthabilitada(pordefectoestdefinidacomooff).

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina62/73

16. ConexinaMySQL
Cuandosedesarrollaunaaplicacin,muchasvecessenecesitaconectaraunabasededatos.PHP
permiteconectarsealasmayorasdelasbasededatos,portantoqueexisteundriverODBComejor,
undriverPHP.

16.1. Objetivodelcapitulo
Alfindeestecapitulo,elalumnosercapazdecrearunaconexinaunabasededatosyejecutar
instruccionesenlabasededatos.EstecapitulonoesunainiciacinalSQLnialmanejodebasede
datos.

16.2. DriverODBC
UndriverODBC(OpenDatabaseConnectivity)permiteutilizarundrivergenricoparaconectarse
aunebasededatos.AsPHPseconectaaldriverODBC,yeldriverODBCseconectaalabasede
datos.Eselmediomsfcildeconectarseaunabasededatos,peroesmuchomenoseficientequeun
driverPHP.

16.3. DriverPHP
PHPproveedriversconfuncionespredefinidasparalamayoradelasbasesdedatos.
ParaMySQL,existendosdriversdiferentes:mysqlymysqli.ElsegundosoloestadisponibleenPHP
versiones4.1.3yarriba,yesunaversinmejoradadedeldrivermysql.Permiteentreotrosllamara
procedimientos,prepararconsultas,etc...
Enestecurso,bienquehemosinstaladolosdosdrivers,solovamosautilizarmysqli.
Conelfindeayudaradepurarelprograma,cuandofallaunaconsultaSQLoqueseprobade
conectar,depuesdelainstruccinseutiliza'or die ('Mensaje de depuracion')'.Encasodeerror
aparaceraelmensajededepuracinenlapginaPHPdelnavegador.

16.4. Conexin
ParaconectarsealabasededatosMySQLcommysqli,hayquellamaramysqli_connectcon4
parametros:elservidorMySQL,elnombredeusuario,laclave,ylabasededatosdeseada.
Ejemplo:
<?php
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysqli_error());
?>

16.5. EjecucindeinstruccionesSQL
ParapoderejecutarinstruccionesSQLenlabasededatos,hayqueserconectadoalaabasede
datos.
Unavezconectado,hayquecrearlainstruccin,ejecutarla,yeventualmenterecogerelresultado.
Dependiendodesilainstruccindeberaderegresardatos,ono,sevautilizarunalistade
resultadososolamenteejecutarlainstruccin.
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina63/73

Ejemplo:mysql.php
<?php
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysqli_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Conectarse a MySQL";
?>
<title><?PHP echo $titulo; ?></title>
</head>
<body bgcolor="#FFFFFF">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<p>
Lista de paises</p>
<table border="1">
<tr><th>Pais</th></tr>
<?php
$result = mysqli_query($db,"select * from country order by country") or die('consulta 1
fall&oacute;: ' . mysqli_error());
while ($myrow = mysqli_fetch_array($result)) {
print("<tr><td>".$myrow["country"]."</td></tr>");
}
mysqli_free_result($result); // Liberar conjunto de resultados
mysqli_close($db);
?>
</table>
</body>
</html>

16.6. consultaspreparadas
Paraevitarproblemasconjuegosdecarcterocaracteresespeciales,esmejorutilizarutilizar
consultaspreparadas.
Ejemplodeconsultapreparada:
<?php
$action = $_POST["action"];
$no_country = $_POST["no_country"];
$country = $_POST["country"];
$currency = $_POST["currency"];
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysqli_error());
if ($action=="insert" && $country!=null)
{
/* Preparar la consulta */
$stmt = mysqli_prepare($db, "insert into country (country, currency) values(?,?)") or
die('consulta 1 fall&oacute;: ' . mysqli_error());
/* ligar los parametros */
mysqli_stmt_bind_param($stmt, "ss", $country,$currency);
/* executar la consulta */
mysqli_stmt_execute($stmt);
/* cerrar la consulta */
mysqli_stmt_close($stmt);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Conectarse a MySQL";
?>
<title><?PHP echo $titulo; ?></title>
</head>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina64/73

<body bgcolor="#FFFFFF">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<form action="mysql2.php" name="form1" method="post">
<p>Lista de paises (limitar al pais numero:
<input type="text" name="no_country" size="4" maxlength="4" onchange="form1.submit();" value="<?
php print $no_country ?>">)
</form></p>
<table border="1">
<tr><th>No</th><th>Pais</th><th>Moneda</th></tr>
<?php
if ($no_country!=null && intval($no_country)>0){
/* Preparar la consulta */
$stmt = mysqli_prepare($db, "SELECT country,currency FROM country WHERE no_country=?") or
die('consulta 2 fall&oacute;: ' . mysqli_error());
/* ligar los parametros */
mysqli_stmt_bind_param($stmt, "s", $no_country);
/* executar la consulta */
mysqli_stmt_execute($stmt);
/* ligar los campos del resultado */
mysqli_stmt_bind_result($stmt, $country2, $currency2);
/* captar el valor */
mysqli_stmt_fetch($stmt);
printf("<tr><td>%f</td><td>%s</td><td>%s</td></tr>",$no_country,$country2,$currency2);
/* cerrar la consulta */
mysqli_stmt_close($stmt);
}
else {
$result = mysqli_query($db,"select * from country order by country") or die('consulta 3
fall&oacute;: ' . mysqli_error());
while ($myrow = mysqli_fetch_array($result)) {
print("<tr><td>".$myrow["no_country"]."</td><td>".$myrow["country"]."</td><td>".
$myrow["currency"]."</td></tr>");
}
mysqli_free_result($result); // Liberar conjunto de resultados
}
mysqli_close($db);
?>
<form action="mysql2.php" name="form" method="post">
<tr>
<td><input type="submit" value="Adjuntar"></td>
<td><input type="hidden" name="action" value="insert">
<input type="text" name="country" size="10" maxlength="10"></td>
<td><input type="text" name="currency" size="8" maxlength="10"></td>
</tr>
</form>
</table>
</body>
</html>

16.7. Llamadoaprocedimientos
DePHPsepuedentambinllamaraprocedimientosyfuncionesdelabasededatos.
Ejemplo:mysql3.php
<?php
$action = $_POST["action"];
$no_country = $_POST["no_country"];
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysqli_error());
if ($action=="delete" && intval($no_country)>0)
{
/* Preparar la consulta */
$stmt = mysqli_prepare($db, "CALL country_d (?)") or die('consulta 1 fall&oacute;: ' .
mysqli_error());
/* ligar los parametros */

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina65/73

mysqli_stmt_bind_param($stmt, "i", $no_country);


/* executar la consulta */
mysqli_stmt_execute($stmt);
/* cerrar la consulta */
mysqli_stmt_close($stmt);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Conectarse a MySQL";
?>
<title><?PHP echo $titulo; ?></title>
</head>
<body bgcolor="#FFFFFF">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<p>Lista de paises</p>
<table border="1">
<tr><th>No</th><th>Pais</th><th>Moneda</th></tr>
<?php
$fromNr=0;
$result = mysqli_query($db,"select * from country order by country") or die('consulta 2
fall&oacute;: ' . mysqli_error());
while ($myrow = mysqli_fetch_array($result)) {
print("<form action=\"mysql3.php\" name=\"form$fromNr\" method=\"post\">");
print("<input type=\"hidden\" name=\"action\" value=\"delete\">");
print("<input type=\"hidden\" name=\"no_country\" value=\"".$myrow["no_country"]."\">");
print("<tr><td>".$myrow["no_country"]."</td><td>".$myrow["country"]."</td><td>".
$myrow["currency"]."</td>");
print("<td><input type=\"submit\" value=\"Borrar\"></td>");
print("</form></tr>");
$fromNr++;
}
mysqli_free_result($result); // Liberar conjunto de resultados
mysqli_close($db);
?>
</table>
</body>
</html>

16.8. Recuperacindefotosenlabasededatos
PHPpermiterecuperararchivosbinariodelabasededatosyenviarlosalnavegador.Unarchivo
binariopuedeserunafoto,unarchivodetexto,unarchivoaudio,...
Ejemploderecuperacindeimagenenlabasededatos:imagen.php
<?php
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysql_error());
$id = $_GET["no_photo"];
$sql = "select data, photo_filename, photo_caption, photo_filesize from photo_gallery where
photo_id = $id";
$result= mysqli_query($db,$sql) or die('consulta 1 fall&oacute;: ' . mysqli_error());
while ($myrow = mysqli_fetch_array($result)) {
$data = $myrow["data"];
$photo_filename = $myrow["photo_filename"];
$photo_filetype = $myrow["photo_filetype"];
$photo_caption = $myrow["photo_caption"];
$photo_filesize = $myrow["photo_filesize"];
}
mysqli_free_result($result); // Liberar conjunto de resultados
header("Content-type: $photo_filetype");
header("Content-length: $photo_filesize");
header("Content-Disposition: attachment; filename=$photo_filename");
header("Content-Description: PHP Generated Data");
echo $data;
// Cerrar la conexion

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina66/73

mysqli_close($db);
exit;
?>

Ejemplodepginautilizandolafoto:index_imagen.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Mi primera Pgina PHP con foto extraida de la BD";
$nrPagina=1;
?>
<title><?PHP echo $titulo; ?></title>
</head>
<body bgcolor="#FFFFFF">
<img src="imagen.php?no_photo=1" align="right">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<p>
Este es mi pgina en PHP numero <?PHP echo $nrPagina; ?>.
</p>
</body>
</html>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina67/73

17. Autenticacindelusuario
17.1. AutentificacinHTTPconPHP
PHPproveeunmecanismodeautenticacinintegrado.
LascaracterticasdeautentificacinHTTPenPHPsoloestndisponiblescuandoseestejecutando
comounmduloenApacheyhastaahoranoloestanenlaversinCGI.EnunscriptPHPcomo
mdulodeApache,sepuedeusarlafuncinheader()paraenviarunmensajede"Autentificacin
requerida"alnavegadorclientehaciendoquemuestreunaventanadeentradaemergentecon
nombredeusuarioycontrasea.
EjemplodeautentificacinHTTP
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

EjemplodeautentificacinHTTPforzandounareentrada
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
}
else {
echo "<p>Welcome: {$_SERVER['PHP_AUTH_USER']}<br>";
echo "Old: {$_REQUEST['OldAuth']}";
echo "<form action='{$_SERVER['PHP_SELF']}' METHOD='POST'>\n";
echo "<input type='hidden' name='SeenBefore' value='1'>\n";
echo "<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}'>\n";
echo "<input type='submit' value='Re Authenticate'>\n";
echo "</form></p>\n";
}
?>

17.1.1. Controldeaccesoalosrecursosweb
PHPnoproveecontroldeaccesointegrado.Elcontroldeaccesosetienequeprogramarenelcdigo
PHP.

17.1.2. Verificacindelainformacindelusuario
PHPnoproveemecanismopredefinidoparaverificarlainformacindelusuario.Laverificacinse
tienequeprogramarenelcdigoPHP.

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina68/73

17.1.3. Recuperacindelainformacindelusuario
Unavezqueelusuarioharellenadoelnombreylacontrasea,laURLquecontieneelscriptPHP
serllamadadenuevoconlasvariablespredefinidasPHP_AUTH_USER,PHP_AUTH_PW,y
AUTH_TYPEasignadasconelnombredeusuario,lacontraseayeltipodeautentificacin
respectivamente.Estasvariablespredefinidassepuedenencontrarenlasmatrices$_SERVERy
$HTTP_SERVER_VARS.Sloautentificacin"Bsica"estsoportadaenestemomento.

17.2. Autenticacinmanejadaporlaaplicacin
PHPsoloproveeunaautenticacinmuypobre,conlacualhaytodavaqueescribirlamayoradel
cdigo.
Porestarazn,sepuedeutilizarunmecanismodeseguridadmanejadocompletamenteporla
aplicacin,queser,porejemplo,ligadoaunabasededatosdeusuariosyutilizaraunformulariode
registromassimptico.
Laimplementacindeunmecanismodeautenticacindeusuarioycontrolderecursosnecesitalo
siguiente:
1. Registrodeusuario
2. Pginadeautenticacin
3. Mecanismodeautenticacin,llamadoporlapginadeautenticacin
4. Informacindelusuarioguardadaalniveldelasesin,comopruebadequeelusuarioest
autenticado
5. Verificacindelavalidezdelainformacindesesinencadapginaconaccesorestringido.
Almomentoqueseverificasunombredeusuarioysunombre,seleasignaunaovariasvariablesde
sesin.Enlapginasprotegidas,severificasilavariabledesesinexisteparaesteusuario.Siesno
existe,esqueelusuarioprobodellagaralapginaconunURLdirecto,sinautenticarse.
Tambin,sielnombredelusuarioesunadelasvariablesdesesin,sepuederecuperardedesde
cualquierapginaPHPdespusdelaautenticacin.
Ejemplodepaginadeentrada:login.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login</title>
<script language="javascript">
if (top.frames.length!=0)
top.location=self.document.location;
</script>
</head>
<body onload="document.form.login.focus();" style="background:#77aaff;">
<script type="text/javascript" src="scripts.js"></script>
<script type="text/javascript">
function validate_form(myform)
{
var check_result = "OK";
clearall();
if (isNull(myform.login,"Su nombre de usuario","ES"))
{
check_result = "NOK";
}
if (isNull(myform.password,"Su clave","ES"))
{
check_result = "NOK";
}
if (check_result == "NOK")
return(false);
else

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina69/73

return(true);
}
function clearall()
{
document.form.login.style.backgroundColor ="#CBEDE3";
document.form.password.style.backgroundColor ="#CBEDE3";
}
</script>
<table width="100%" height="100%" border="0"><tr><td>
<p align="center">
<br><u><b><big>LOGIN</big></b></u>
<br><br>
</p>
<form name="form" action="check_login.php" method="POST" onsubmit="return
(validate_form(form));">
<table border="1" align="center">
<th>Su nombre de usuario</th>
<td><input name="login" type="text" size="30" maxlength="30" Autocomplete="off"></td></tr>
<th>Su clave</th>
<td><input name="password" type="password" size="30" maxlength="30"
onfocus="this.value='';" Autocomplete="off"></td></tr>
</table><p align="center">
<input type="submit" class=noprint name="submitbt" value="Entrar">&nbsp;&nbsp;&nbsp;
<input name="userAgent" type="hidden"> <script
type="text/javascript">form.userAgent.value=(navigator.userAgent);</script>
<input name="screen" type="hidden"> <script
type="text/javascript">form.screen.value=screen.width+" x "+screen.height;</script>
</form>
<p align="center">
<script language="javascript" type="text/javascript" >
if (screen.width<1000) {
document.writeln("Mejor visto con resoluci&oacute;n de pantalla de 1024 x 768 o arriba.
");
document.writeln("<i>Su resoluci&oacute;n de pantalla es de "+screen.width+" x
"+screen.height+".</i><br>");
}
</script></p>
<h2 align="center">
<font color="Blue">
<script language="javascript" type="text/javascript" >
document.writeln("</font><font color=#77aaff>");
</script>
&iexcl;Usted necesita de tener el <big><font color="Red">
<script language="javascript" type="text/javascript" >
document.writeln("</font><font color=#77aaff>");
</script>
Javascript</font></big> encendido<br>en las opciones de su navegador<br>para entrar y utilizar
esta aplicacion web!</font><br>
<font color="Blue">
<script language="javascript" type="text/javascript" >
document.writeln("</font><font color=#77aaff>");
</script>Para m&aacute;s informaci&oacute;n pregunta a su administrador de sistema.</h2>
</td></tr>
<tr><td colspan="2" align="center" style="background-color:#3366CC;">
<a href="mailto:cedric@olucionjava.com" Style="color : White;" title="Este obra esta protegida
por la ley de propiedad intelectual. Para mas informacion, clic aqui para enviar un email a autor
de esta obra."><font size="1">
&copy; Copyright Ing. Cedric Simon, 2006</font></a></font></td>
</tr>
</table>
</body>
</html>

Ejemplodeverificacindeusuario:check_login.php
<?php
session_start();
$login = $_POST["login"];
$password = $_POST["password"];
$noUser=-2;
$db =mysqli_connect("localhost","root","SolJava","curso") or die('No se pudo conectar a la BD:
' . mysql_error());
$result = mysqli_query($db,"select * from usuario where upper(usuario)=upper('".$login."')".
" AND DECODE(clave,'SolJava')='".$password."' AND activo=1") or
die('consulta 1 fallo: ' . mysql_error());
if ($myrow = mysqli_fetch_array($result)) {
$noUser=$myrow["no_usuario"];

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina70/73

$_SESSION['noUser']=$noUser;
$uname=$myrow["fname"]." ".$myrow["lname"];
$_SESSION['uname']=$uname;
$result = mysqli_query($db,"update usuario set bad_try=0 where no_usuario=".$noUser) or
die('consulta 2 fallo: ' . mysql_error());
$redirect="index_secure.php";
// Liberar conjunto de resultados
mysqli_free_result($result);
} else {
$result = mysqli_query($db,"update usuario set bad_try=bad_try+1 where upper(usuario)=upper('".
$login."')") or die('consulta 3 fallo: ' . mysql_error());
$redirect="login.php?nok=badpassword";
}
// Cerrar la conexion
mysqli_close($db);
/* Redireccionar a una pagina diferente en el directorio actual de la peticion */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
header("Location: http://$host$uri/$redirect");
exit;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>title</title>
</head>
<body>
</body>
</html>

Ejemplodepginasegura:index_secure.php
<?php require("cabecera_segura.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php
$titulo="Mi primera Pgina PHP segura";
$nrPagina=1;
?>
<title><?PHP echo $titulo; ?></title>
</head>
<body bgcolor="#FFFFFF">
<h1><?PHP echo $titulo; ?></h1>
<hr>
<p>
Este es mi pgina en PHP segura y usted esta identificado como <font color=blue><?PHP echo
$uname; ?></font>.
</p>
</body>
</html>

ycabecera_segura.php
<?php
session_start();
if (!session_is_registered('uname')) {
/* Redireccionar a una pagina diferente en el directorio actual de la peticion */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$redirect="login.php";
header("Location: http://$host$uri/$redirect");
exit;
} else {
$noUser=$_SESSION['noUser'];
$uname=$_SESSION['uname'];
//$db =mysqli_connect("localhost","root","SolJava","nicacert") or die('No se pudo conectar a la
BD: ' . mysqli_error());
$db =mysql_connect("localhost","root","SolJava") or die('No se pudo conectar a la BD: ' .
mysql_error());
mysql_select_db("relihco_nicacert",$db) or die('No se pudo conectar (2) a la BD: ' .
mysql_error());
}
?>

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina71/73

18. Ejercicios
Estosejercicioslepermitirnpracticarlamateriaaprendidaenestecurso.Lasrespuestasdelos
ejerciciosseencuentranenelCDdelcurso(archivoEjerciciosPHP.zip).Existenvariasposibilidades
dellegaralresultadodeseado.EnlasrespuestasenelCDencontrarasunaovariasposibilidades.
LasrespuestasenelCDnosonexhaustivas...
Elobjetivoesquelograshacertodoslosejerciciossinayuda(nidelmanual,nideladocumentacin,
nideotrocdigoexistente).Elobjetivonoesdecopiarypegaruncdigoparaterminarelejerciciosi
nodeconfirmarqueentendistebieneintegrastelamateria.
Estosejerciciossonunabuenapreparacinparaelexamen,peronosonsuficientes.Tienesque
repasarlateoraypracticarmasparapreparartebienalexamendePHP.
Nota:losejerciciosenelCDseconectanalabasededatos'curso'en'localhost',conelusuario'curso'
ylaclave'SolJava'.
1.
2.
3.
4.

Declaraunentero,incrementarlo,decrementarlo,haceroperacionesconel.
Probarlaprioridaddeoperadores
Probarlaconversinentretipossimples.
Declararunaconstanteeimprimirsuvalor.Probardecambiarsuvalorluegoyverqueesloque
pasa.
5. Adjuntarcomentarioenunsucdigodetresmanerasdiferentes.
6. Crearunarregloconteniendolosnmerosde1a10,eimprimirlosnmeros5y10utilizandoel
arreglo.
7. Crearunarregloconnombre,apellido,yfechadenacimientode3empleados.Imprimirelnombre
ylafechadenacimientodeltercerempleado.
8. Declararuneenteroyasignarleunvalor.Sielvalor<5imprimir"Pequeo",sinoimprimir
"Grande".
9. Declararuneenteroyasignarleunvalor.Sielvalor=1imprimir"Uno",=2imprimir"Dos",=3
imprimir"3",sinoimprimir"Niuno,nidos,nitres",utilizandoif...elseif...else...
10.Declararuneenteroyasignarleunvalor.Sielvalor=1imprimir"Uno",=2imprimir"Dos",=3
imprimir"3",sinoimprimir"Niuno,nidos,nitres",utilizandoswitch.
11.Declararunentero=0.Mientraselentero<5,imprimirsuvaloryincrementarlodeuno,
utilizandowhile.
12.Declararunentero=10.Mientraselentero>5,imprimirsuvalorydecrementarlodeuno,pero
imprimeporlomenosunavezsuvalor,utilizandodo...while.
13.Crearunabuclequeseejecuta10vecesutilizandounenteroquevade10a19incrementndose.
Imprimirencadabucleelvalordelentero,menoscuandoesiguala15.Utilizandofor.
14.CrearunapginaJSPdelloscualeselcolordelfondoestbasadoellassegundasdelahoradel
sistemaalmomentodelaaperturadelapgina:silahoratieneentre0y14segundos,fondo
blanco,15y29,coloramarillo,30y44,azulclaro,y45y59,verde(sinrefrescoautomtico).
15.IncluirunarchivotextooHTMLexternoenunapginaPHP.
16.Crearunafuncindeadjunta10alnmeropasadoenparametroydevuelveelresultado.
17.Crearunafuncinquedevuelvelosminutosdelahoracorrientemas10minutos.
18.Crearunafuncinpasandoleunparmetroporreferencia.Cambiarelvalordelparmetroenla
funcinperonodevolvernada.Verificarquelavariablereferenciadahasidocambiadatambin.
19.Crearunformulariodeinscripcinaunconcurso(nombre,apellido,email),ydespusdehaber
tratadosucontenido,ensearenotrapginaelcontenidodelformulariollenado,enformatode
tabla.
20.AdjuntaralapaginaPHPtratandoelformulariohechoenelpuntoanteriorunasverificaciones
alniveldelservidor(lostrescamposnopuedenservaco,elemaildebecontenerun@),yencaso
CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina72/73

deerror(campovaco,etc...)regresaralformulariooriginalenseandoloscamposconerroresy
recuperandolosvaloresentradasporelusuario.
21.Crearunformulariodeentradaalsitio,yrecuperarelnombredeusuarioenunavariablede
sesinymencionarsunombreenotraspginasrelacionadasdelmismositio.
22.Crearunapginaparasalir(destruir)desusesin
23.Utilizaruncookiepararecordarelnombredeusuario,yproponerelultimonombredeusuario
pordefectoellapginaderegistro.
24.Crearlaopcindeborrarelcookieyinvalidarlasesinalmismotiempo
25.Crearunapginaqueenseatodoslasvariablespredefinidasdetipo$_SERVER(claveyvalor
decadauna).Lomismoparalasotrasvariablespredefinidas($_SESSION,$_GLOBALS,
$_POST...)
26.Crearyprobarunapginadeerrorpersonalizada.
27.Crearunapaginaquepermiteverlalistadeempleadosyfiltrarlosporpais(job_country).
28.Crearunapginaquelistalosempleados(tablaemployee),ypermitecrear,modificar,oborrar
empleados.
29.Crearunapaginawebconteniendoimgenesquevienendeunabasededatos.
30.CrearsitioutilizandolosmtodosdeautenticacinHTTPdePHP(usuariosyclavesenarchivo
texto).

Ejerciciofinal(noseencuentraenelCDdelcurso):
Crearunaaplicacinwebque:
1) Traetodosucontenidodeunabasededatos:Textos,etiquetas,imgenes,...
2) Tienetrespartes:
i. unapublica:bienvenida,informacionesgenerales,paginaderegistro,listade
productosinprecio.
ii. unaconautenticacinporlaaplicacin(usuariosenlabasededatos):listade
productosconprecio,manejodeusuariosyposibilidaddecompraenlnea.
iii. Utilizarpaginadeerrorpersonalizadaentodaslaspaginas
3) Unavezautenticado,elnombredelusuariodebeaparecerentodaslaspantallas.
4) Manejodeunsistemadecompraenlnea:elusuariopuedellenarunalistade
compras,verlascomprasanterioresqueelhizo...

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

CursodeprogramacinenPHPconMySQL

Pagina73/73

19. Esquemadelabasededatos

CopyrightCdricSimon,2006

Versin1.1

Reproduccinprohibida

También podría gustarte