manual de php - walter carnero · sencillo y directo con el que podrías empezar es php. otra de...
TRANSCRIPT
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 1 de 142
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 2 de 142
Introducción:ManualdePHP
EnestemanualdePHPcubrimostodoslosaspectosesencialesdellenguajeparacomenzareldesarrollodeaplicacioneswebdelladodelservidor.
ConoceráslosprincipiosbásicosdelaprogramaciónenPHPcomosusintaxis,estructurasdecontrol,etc.Ademásexplorarásunnutridoconjuntodecaracterísticasyfuncionalidades,lasnecesariasparadesarrollarlamayoríadelasaplicaciones,comoelaccesoalabasededatos,elsistemadearchivos,etc.
EsunmanualdePHPdeprincipioafin,asequibletantoparaprogramadorescomoparapersonassinexperienciaenlaprogramación,queasientalosfundamentosbásicosdeestepopularlenguaje,elmásextendidoparaeldesarrollodeaplicacioneswebdelladodelservidor.
Encuentrasestemanualonlineen:http://desarrolloweb.com/manuales/manual-php.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 3 de 142
Autoresdelmanual
Lassiguientespersonashanparticipadocomoautoresescribiendoartículosdeestemanual.
MiguelAngelAlvarez
MiguelesfundadordeDesarrolloWeb.comylaplataformadeformaciónonlineEscuelaIT.Comenzóenelmundodeldesarrollowebenelaño1997,transformandosuhobbyensutrabajo.
RubénAlvarez
RubénesdoctorenquímicayprogramadoraficionadoconexperienciaenPHP.
BrianHernández
Desarrolladordeappsmultiplataforma.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 4 de 142
QuéesPHP
CapítulosintroductoriosdondehablaremossobreloslenguajesdedesarrollodelladodelservidorengeneralparaexplicarPHPenparticularyqueseentiendacuálessumododefuncionamientoylostiposdecosasquesepuedenhacerconestelenguaje.
IntroducciónalaprogramaciónenPHP
ExplicamossomeramentequéeselPHP,suscaracterísticasprincipalesylosmotivosporlosqueesellenguajedeprogramacióndelladodelservidormásextendidodelaweb.
PHPesellenguajedeladoservidormásextendidoenlaweb.Nacidoen1994,setratadeunlenguajedecreaciónrelativamentereciente,aunqueconlarapidezconlaqueevolucionaInternetparezcaquehaexistidotodalavida.Esunlenguajequehatenidounagranaceptaciónenlacomunidaddedesarrolladores,debidoalapotenciaysimplicidadquelocaracterizan,asícomoalsoportegeneralizadoenlamayoríadelosservidoresdehosting,hastalosmássimplesyeconómicos.
LafacilidaddePHPsebasaenquepermiteembeberpequeñosfragmentosdecódigodentrodeloqueseríaunapáginacomúncreadaconHTML.EsosscriptsPHPnospermitenrealizardeterminadasaccionesdeunaformafácilyeficaz,pudiendorealizartodotipodetareas,delasmássimplesalasmáscomplejas.EstacombinacióndePHPdentrodelmarcodeundocumentoHTMLesloquepermiteadesarrolladoressinprácticamentenadadeexperienciacrearcomportamientosatractivosdeunamanerasencilla,unadelasclavesdeléxitodellenguaje.Enresumen,conPHPescribimosscriptsdentrodelcódigoHTML.ComoyaestamosfamiliarizadosconHTML,empezaradesarrollarconPHPesprácticamenteinmediato.Porotraparte,yesaquídonderesidesumayorinterés,PHPofreceunsinfíndefuncionesparalaexplotacióndetodotipoderecursos,entrelosquedestacanlasbasesdedatos,alasquepodremosaccederdeunamanerallana,sincomplicaciones.
PHPesloquesedenominaunatecnologíadelladodelservidor,queahorasesueleenglobardentrodeltérmino"Backend".ExistendiversoscompetidoresdePHPenelmundoBackendytodostienensuscosasbuenasymalas.Resultaríamuyarriesgadodecirqueunatecnologíaounlenguajeseamejoropeorqueotro,perosípodemosdecirquePHPesellenguajepreferidoporelmayornúmerodeprogramadoresdedicadoseneláreaBackend.ComocompetidoresdePHPpodríamosmencionarASP.NET(oASPtradicional),NodeJS,Ruby,Java,Pythonyunlargoetc.Sinembargo,ennuestraopinión,siloquequieresesdesarrollarpáginasweb,elmássencilloydirectoconelquepodríasempezaresPHP.
OtradelasclavesdeléxitodePHPesquelamayoríadelosCMSmáspopulares(WordPress,Joomla!,Drupal)ylossistemasdecomercioelectrónico(Prestashop,Woocommerce,
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 5 de 142
Magento),asícomootroscientosdeherramientas,estándesarrolladosenPHP.Porlotanto,usarPHPessinónimodesercapazdeintroducirteenmuchasherramientasgratuitasydecódigoabiertopararealizarcualquiercosaenelámbitodelaweb.
Nota:Enotroartículomásdetalladopodrásencontrardiversosmotivos,yunvídeo,porlosquedecantarteporaprenderPHPcomolenguajeparaeldesarrollobackend.
AlgunosaspectosfundamentalesdePHP
PHP,aunquemultiplataforma,fueconcebidoinicialmenteparaentornosLinuxyesenestesistemaoperativodondesepuedenaprovecharmejorsusprestaciones.LamayoríadelosservidoresdeInternetyloshostingsoportanPHPsobresistemasoperativosLinux,aunquesinembargo,puedesejecutarPHPencualquierotrosistema,obteniendoelmismosoporteylosresultadosidénticos.EstopermitequepuedasdesarrollarPHPencualquierordenador,independientementedesiusasWindows,LinuxoMac.
ElestilodeprogramaciónconPHPestotalmentelibre.Puedesusartantoprogramaciónestructurada(funciones)comoProgramaciónOrientadaaObjetos(clasesyobjetos).Inclusoalgunascaracterísticasdelaprogramaciónfuncionalestánsiendoincorporadasactualmente.EsporelloquecualquiertipodeprogramadorpuedesentirsecómodoconPHP.
PHPpresentaunafilosofíadecódigoabierto.Existenmultituddeherramientas,librerías,frameworksgratuitosquellevanPHPaunnuevonivel.Ademáselpropionúcleodellenguajetieneunadelasmásnutridascantidadesdefuncionesparahacertodotipodeoperaciones.Nonecesitasinvertirnada,dedinero,paradisponerdeunlenguajepoderosoylosmejorescomplementosparaacelerartutrabajo.
Referenciasinteresantesparacomplementarestemanual
EstemanualdePHPestádestinadoaaquellosquequierencomenzardeceroelaprendizajedeestelenguajeyquebuscanenéllaaplicacióndirectaasuproyectodesitiooalamejoradesuweb.Loscapítulossonextremadamentesimples,buscandoseraccesiblesalamayoríadelaspersonas.MástardesilodeseaspodrásseguirlalecturadeotrosmanualesdentrodeDesarrolloWeb.comparaampliartusconocimientosendistintasáreas.
Laformaenlaquehemosredactadoestemanuallohaceaccesibleacualquierpersonanofamiliarizadaconlaprogramación.AunquesiestucasoaquíenDesarrolloWeb.comtienesunexcelentecursodeprogramaciónenvídeo,enunaseriedeclasesqueimpartimosen2015.Aprenderástodoslosconceptosinicialesquedebesconocerparaafrontarelestudiodecualquierlenguaje,comovariables,tiposdedatos,estructurasdecontrol,funciones,etc.
Siellectorsabeprogramarperotienepocaexperiencia,esposiblequeendeterminadosmomentospuedaverseunpocodesorientado.Nuestroconsejoenesecasoesnoobsesionarseconintentarentendertodoantesdepasaralsiguientecapítulo.Solotratadeasimilaralgunosconceptosypracticarparairobteniendosoltura.Siemprepuedesvolveratrásencuantounadudasurjaocuandohayamosolvidadoalgúndetalle.Nuncavienemalleervariasveceslo
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 6 de 142
mismohastaquequedebiengrabadoyasimilado.
Antesdecomenzaraleerestemanualestambiénaconsejable,haberleídopreviamenteelmanualsobremanualsobrepáginasdinámicas,enelcualseexplicaagrandesrasgosquéeslaprogramacióndelladodelservidoryportantoquéesPHP.EstoesinteresanteporquePHPesunpocoparticularconrespectoalenguajestradicionales,yaqueparaqueseejecutenecesitamosunservidoryunclientequetienequesolicitarunapáginaaeseservidor.Esoesalgosobreloqueincidiremosenvariospuntosdelmanualyenmultituddeejemplos,perosisetieneclarodeantemanoelflujodevidadeunapáginaweb,desdequesesolicitamedianteelaccesoaunaURLdesdeelnavegador,hastaqueelservidorlaenvíaalcliente,serámuchomejor.
MásadelantetevendrábienconocerelTallerdePHP,destinadoaanalizardemaneraprácticalamásvariadagamadeutilidades.OtrareferenciaalacualharemosalusióneseltutorialdeSQLquenosserádegranayudaparaeltratamientodebasesdedatosyaMySQL,delquepodremosaprendermuchascosasenelTallerdeMySQL.
Paratodosloslectores,peroaunmásparalaspersonasmásinexpertasyconmásdificultadesdeaprendizaje,tenemosademásunarecomendaciónquepuedeayudarlesmucho.SetratadelVideotutorialdePHPqueestamospublicandocondiversosvídeosqueexplicancongrandetallelaprogramaciónenPHP.
Esperamosqueestemanualresultedevuestroagradoyquecorrespondaanuestrasexpectativas:ElpoderacercarPHPatodosaquellosamantesdeldesarrollodewebsquequierendarelpasohacialaswebs"profesionales".
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen26/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
BrevehistoriadePHP
AlgunosapuntesdelahistoriadePHPquepuedanserinteresantesparaellectorqueseaproximaaPHPporprimeravez.
Comolamayoríadelsoftwarelibre,PHPpertenecealacomunidad.Unagrancantidaddepersonashaayudadoalolargodesuvidaacreartantoelnúcleodellenguajecomolaenormecantidaddelibreríasquedispone.Sinembargo,debemosatribuirsucreaciónoriginalmenteaRasmusLerdorf,creadordellenguajeen1994.
PHPnaciócomounCGIescritoenCquepermitíalainterpretacióndeunnúmerolimitadodecomandos.ElsistemafuedenominadoPersonalHomePageToolsyadquiriórelativoéxitograciasaqueotraspersonaspidieronaRasmusquelespermitieseutilizarsusprogramasensuspropiaspáginas.DadalaaceptacióndelprimerPHPydemaneraadicional,sucreadordiseñóunsistemaparaprocesarformulariosalqueleatribuyóelnombredeFI(FormInterpreter)yelconjuntodeestasdosherramientas,seríalaprimeraversióncompactadel
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 7 de 142
lenguaje:PHP/FI.
Lasiguientegrancontribuciónallenguajeserealizóamediadosdel97cuandosevolvióaprogramarelanalizadorsintáctico,seincluyeronnuevasfuncionalidadescomoelsoporteanuevosprotocolosdeInternetyelsoportealagranmayoríadelasbasesdedatoscomerciales.TodasestasmejorassentaronlasbasesdePHPversión3.Apesarqueporaquelentoncesellenguajeteníaunlargocaminopordelanteparaconvertirseenunaherramientaindispensable,integrabaunanutridacantidaddefuncionalidades"decasa",demodoquesucomunidaddeprogramadoresfuecreciendo,atraídaporsuutilidadylafacilidadparacomenzaradesarrollarwebs.
PHPensuversión4incorporócomonovedadelmotor"Zend",desarrolladoconmayormeditaciónparacubrirlasnecesidadesdeaquelmomentoysolucionaralgunosinconvenientesdelaanteriorversión.Algunasmejorasdeestanuevaversiónsonsurapidez-graciasaqueprimerosecompilayluegoseejecuta,mientrasqueantesseejecutabamientrasseinterpretabaelcódigo-,sumayorindependenciadelservidorweb-creandoversionesdePHPnativasparamásplataformas-yunAPImáselaboradoyconmásfunciones.
Sinembargo,lamadurezdefinitivadePHPllegóconlaversión5,quepermaneciódurantemásde11añosenelmercadoyadíadehoytodavíaseencuentraenmantenimiento.Laprincipalnovedaddelaversión5fueunamejoradaintegracióndelparadigmadelaProgramaciónOrientadaaObjetos.
Nota:SibienenlaversióndePHP4yasecontabaconherramientasparaprogramarconobjetos,éstaseranmuyrudimentariasynorespondíanalasnecesidadesdelosdesarroladores,asícomotampocoeranequiparablesenpotenciayposibilidadesaotroslenguajes.PHP,ensuintencióndeservirtantoaprogramadoresexperimentadoscomoadesarrolladoresqueempiezandesdecero,todavíaincorporalaposibilidaddedesarrollarconosinprogramaciónorientadaaobjetos.
DurantetodoslosañosdevidadePHP5hubomuchoscambios.Multituddeherramientasseagregaronallenguaje,permitiendohacercosasqueeranaltamentedemandadasporlosdesarrolladoresyqueotroslenguajesmásnuevoshabíanincorporadodesalida.Unodelosejemplosmásclarosfueelautoloaddeclases,loquepermitiólaincorporacióndelgestordepaquetesComposer.
Sinembargo,11añosconlamismaversiónsugeríaqueellenguajesehabíaestancadoyPHPfueperdiendoadeptos,aunqueentérminosestadísticos,númerodedesarrolladoresydemandalaboral,susuperioridadsiguesiendoabrumadora.EntretodoesetiempovariassituacioneshicieronquenosellegaraapresentarPHP6yfinalmentelacomunidaddecidiósaltaresenúmerodeversiónylanzardirectamentePHP7.
PHP7adíadehoyesunarealidad.Lasmejorasencuantoarendimientosonmuynotablesyhasituadodenuevoellenguajeentrelosmáspoderosos.Estádisponibleencantidaddeservidores,perosinembargosuadopcióntodavíanoestotal.ElmotivoesquePHPtienecantidaddelibreríasysoftwarequenohasidototalmenteactualizadooquearrojaerroresalejecutarsebajoesanuevaversión.Enlospróximosmesesoañoslasituacióncambiará,porque
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 8 de 142
PHP7esmuydeseableparacualquierproyecto.
ServidoresconPHP
GráficadelnúmerodedominiosydireccionesIPqueutilizanPHP.EstadísticadeNetcraft.
Aunqueestaimagenesalgoantigua,nosindicaqueelnúmerodeservidoresqueutilizanPHPsehadisparado,loquedemuestraquePHPesunatecnologíamuypopular.Estoesdebido,entreotrasrazones,aquePHPeselcomplementoidealparaqueeltándemLinux-Apacheseacompatibleconlaprogramacióndelladodelservidordesitiosweb.Graciasalaaceptaciónquehalogrado,ylosgrandesesfuerzosrealizadosporunacrecientecomunidaddecolaboradoresparaimplementarlodelamaneramásóptima,podemosasegurarqueellenguajeseconvertiráenunestándarquecompartiráloséxitosauguradosalconjuntodesistemasdesarrolladosencódigoabierto.
Adíadehoy,pocasherramientasdeentrelasmásusadasparaeldesarrollodesitiosoaplicacioneswebnoestánrealizadasconPHP.WordPress,Drupal,Magento,Prestashop,etc.sonejemplosdeello.Esatendencianoparadecrecer,peroademásahoraletenemosquesumarunacantidadenormedeframeworkscomoSymfony,LaraveloZend,quehanpermitidoconvertiraPHPenunlenguajetodavíamáspoderoso,productivoycapazdeimplementarlasmejoresprácticasparalasaluddelosproyectos.
ComunidaddePHP
TambiénlacomunidaddedesarrolladoresqueusaPHPhaevolucionadomucho.Muchosdelosprofesionalesquevienenusandoestelenguajealolargodelosañoshancrecido,profesionalynaturalmente,alladodePHP.PodemosdecirquePHPhasidoysiguesiendoelcausantedesuéxitoosustentoprofesional.
Esamadurezdelosdesarrolladorestambiénhasidoimportanteparaellenguaje.EnsusinicioslacomunidaderaatraídaaPHPporsucantidaddeutilidadesylafacilidadconlaquecomenzaratrabajar.Sinembargo,laspersonasnosepreocupabantantoconaspectoscomolaseguridadolamantenibilidaddelasaplicaciones.HoylacomunidadesconscientedelaimportanciadeplataformasrobustasyescalablesyellohapermitidoquePHPhayadadounvuelcoprofesional.MuchadeesatransformaciónseladebemosalosmencionadosframeworksyalacapacidaddePHPdeabsorberytraerparasilomejordeotroslenguajes.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 9 de 142
EnelManualdePHPaprenderásadartusprimerospasosconellenguaje,peroqueremosquenotequedesahíysigasesforzándoteparaaprendermásymás.EnDesarrolloWeb.comtienescantidaddematerialparaseguircreciendo,comoelmanualdelaprogramaciónorientadaaobjetosdePHP5,elManualdeComposerodeframeworkscomoLaravel.Serrigurosocontutrabajoycómousasellenguajeeselmejorfavorqueharásalacomunidadyatimismocomoprofesional.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen26/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
TareasprincipalesdellenguajePHP
MencionamoslosprincipalesgruposdefuncionesintegradasenellenguajePHP,anivelgeneral,yloqueellasnosofrecen.
PHPnospermitehacerdetodo.Enunprincipiodiseñadopararealizarpocomásqueuncontadoryunlibrodevisitas,PHPhaexperimentadoenpocotiempounaverdaderarevolucióny,apartirdesusfunciones,enestosmomentossepuedenrealizarunamultituddetareasútilesparaeldesarrollodelweb.
EnesteartículovamosaexponerunapequeñísimamuestradelascosasquePHPteofreceparaeldesarrollodeaplicacionesweb,peronopiensesquesonlasúnicas.SimplementelashemosseleccionadoporserlastareasqueresultanmáshabitualesencualquiertipodeproyectosyquehansidoresueltasenPHPtradicionalmentedeunamanerasencillayalalcancedecualquierpersona,inclusosindemasiadosconocimientosdeprogramación.
Además,todaslasfuncionalidadesrecogidasenelpresenteartículopermitenhacerseunaideadeltipodecosasqueaprenderásenelManualdePHPbásico.
Funcionesdecorreoelectrónico
Podemosconunafacilidadasombrosaenviarune-mailaunapersonaolistaparametrizandotodaunaseriedeaspectostalescomoele-maildeprocedencia,asunto,personaaresponder...
Otrasfuncionesmenosfrecuentesperodeindudableutilidadparagestionarcorreoselectrónicossonincluidasensulibrería.
Gestióndebasesdedatos
Resultadifícilconcebirunsitioactual,potenteyricoencontenidoquenoesgestionadoporunabasededatos.EllenguajePHPofreceinterfacesparaelaccesoalamayoríadelasbasesdedatoscomercialesyporODBCatodaslasbasesdedatosposiblesensistemasMicrosoft,apartirdelascualespodremoseditarelcontenidodenuestrositioconabsolutasencillez.
Gestióndearchivos
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 10 de 142
Crear,borrar,mover,modificar...cualquiertipodeoperaciónmásomenosrazonablequesenospuedaocurrirpuedeserrealizadaapartirdeunaamplialibreríadefuncionesparalagestióndearchivosporPHP.TambiénpodemostransferirarchivosporFTPapartirdesentenciasennuestrocódigo,protocoloparaelcualPHPhaprevistotambiéngrancantidaddefunciones.
Tratamientodeimágenes
EvidentementeresultamuchomássencilloutilizarPhotoshopparaunaeltratamientodeimágenespero...¿Ysitenemosquetratarmilesdeimágenesenviadaspornuestrosinternautas?
Laverdadesquepuederesultarmuytediosouniformarentamañoyformatomilesdeimágenesrecibidasdíatrasdía.TodoestopuedesertambiénautomatizadoeficazmentemediantePHP.
Tambiénpuedeparecerútilelcrearbotonesdinámicos,esdecir,botonesenlosqueutilizamoselmismodiseñoysolocambiamoseltexto.Podremosporejemplocrearunbotónhaciendounaúnicallamadaaunafunciónenlaqueintroducimoselestilodelbotónyeltextoaintroducirobteniendoautomáticamenteelbotóndeseado.
Apartirdelalibreríadefuncionesgraficaspodemoshacerestoymuchomás.
Ymuchomás...
MuchasotrasfuncionespensadasparaInternet(tratamientodecookies,accesosrestringidos,comercioelectrónico...)oparapropósitogeneral(funcionesmatemáticas,explotacióndecadenas,defechas,correcciónortográfica,compresióndearchivos...)sonrealizadasporestelenguaje.Aestainmensalibreríacabeahoraañadirtodaslasfuncionespersonalesqueunovacreandopornecesidadespropiasyqueluegosonreutilizadasenotrossitiosytodasaquellasintercambiadasuobtenidasenforosositiosespecializados.
Comopuedeverse,lasposibilidadesquesenospresentansonsorprendentementevastas.Loúnicoquesenecesitaesunpocodeganasdeaprenderyalgodepacienciaennuestrosprimerospasos.Elresultadopuedesermuysatisfactorio.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 11 de 142
CómoinstalarPHPyMySQL
EnlossiguientescapítulosvamosaexplicarcómocreartuentornodetrabajoparaempezaratrabajarconPHP.ExplicaremosdiversosmodosqueexistenparainstalarPHPylabasededatosMySQL,complementohabitualenlasaplicacioneswebconPHP.Comenzaremosconunrepasogeneralatodaslasalternativasposiblesparacreareseentornodetrabajo,condistintosnivelesdecomplejidadyadaptadosadistintosperfilesdedesarrolladoresynecesidadesdeequiposdetrabajo.Luegoiremosalapartemáspráctica,queconsisteeninstalarprogramasquenosfacilitanlainstalación,conunúnicopaso,detodaslasherramientasnecesariasparaejecutarPHPenunordenador,sinnecesidaddeentrarenningunaconfiguraciónenlamayoríadeloscasos.
GuíadefinitivaparacreartuentornodedesarrolloparaPHP
GuíacompletaparalacreacióndetuentornodedesarrolloconPHPparasistemasWindows,LinuxyMac,tantoparapersonasqueseiniciancomoparadesarrolladoresexperimentados.
HallovidomuchodesdequeredactamosnuestroManualdePHPbásico.Alolargodetodosestosañoshacambiadomuchonuestramaneradetrabajarconestelenguajeytambiénlasherramientasdisponiblesparasermásproductivosytrabajarenentornosmásprofesionales.
EnesteartículopretendemosnosoloactualizarnuestraguíadePHP,sinotambiénofrecerunavistadepájarodetodaslasopcionesdisponiblesenlaactualidadparainstalarPHPyMySQLmásunservidorwebdondepoderejecutarlossitiosquevayamosdesarrollando.Ademásqueremosclasificarlasdistintasmanerassegúnsudificultad,demodoqueanalizaremostantolosentornosmásbásicosysencillosdeusar,comolosmásavanzadosyprofesionales.
EnesteartículonopretendodarunaguíapasoporpasoparainstalarPHP,algoqueyasehaexplicadoenotrosartículosyapublicadosenDesarrolloWeb.com,sinoaclararlasdistintasalternativasdecreacióndetuentornodedesarrollo,básico,intermedioyavanzado.Deestemodoelinteresadopodrátenerunabuenaideadecómopuedecrearsuentornodedesarrolloparacomenzarycuálesseríanlossiguientespasosyposibilidadessiquiereincrementarlasprestaciones,enunentornomásproductivooprofesional.Cadaunadelasposibilidadesdeinstalaciónseacompañarádeenlacesareferenciasconguíasespecíficasparaconseguirunarápidaysencillaconfiguración.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 12 de 142
QuéprogramasnecesitasinstalarparatrabajarconPHP
Antesquenada,paraayudaralosusuariosmásinexpertos,convieneaclararqueprogramasnecesitasparapoderempezaradesarrollarconPHP.Sonpocos:
PHP,elpropiolenguaje.Unabasededatos,quesueleserMySQLperoquepodríasercualquierotra.Esimportanteporquecualquierproyectobásicosueleapoyarseparasudesarrolloenunsistemagestordebasededatosdondealmacenarlainformación.Unservidorweb,quepuedesercomúnmenteApacheoNginx.Esimportanteporqueparaquesepuedaservirunaweb,elnavegadortienequeaccederaunservidor.Además,PHPlomásnormalesqueseinstalecomomódulodeunservidorweb,demodoquelaspáginasgeneradasporelservidorsepuedanprocesarmediantePHP.
ComoservidorweblaalternativamáscomúncondiferenciaesApache,aunquesepodríaejecutarPHPsobreotraseriedeservidoresweb.ElpropioApacheesmultiplatadorma,igualquePHP,ylotenemosdisponibleenLinux,MacoWindows.Ademásdeserlasoluciónmáshabitual,Apacheestambiénlaquetienemásopcionesavanzadas.AunquehoylaalternativaNginxnosofreceunservidorligeroyrápido,preferidopormuchaspersonas.EnentornosWindowstambiénpodríasinstalarPHPsobreunIIS,aunqueesaalternativaesmenoscomún.
Noobstante,nodebesmarearteportantasposibilidadesencuantoaservidores,yaqueelfuncionamientodePHPesindependientedelservidordondeseestéejecutando.Tengasunouotro,elprocesadoyresultadodeejecucióndePHPseráelmismo.
Quétipodeentornosdedesarrollopodemosusar
UnavezaclaradoslosdistintosprogramasquenecesitasyantesdeentrareneldetallesobrecómoinstalarPHPquierodescribirbrevementelasposibilidadesdeinstalacióndePHP.Ensiguientespuntosdeesteartículoentraremosendetalleconcadapunto,peroantesqueremosqueseconozcantodos.
Nota:Ahoraobservarásqueteindicovariasalternativas.NoquieroconellodespistaryparecerquecomenzarconPHPesdifícil,sinoofrecerunpocodeculturageneralyclarificarcuálesseríanlossiguientespasossiahondasenelmundodePHP.Sitodoestoteparece"hablarenchino",notepreocupes,quédateconlaopción"instaladorestodo-en-uno"yverásquetienesPHPfuncionandoentuordenadoren5o10minutos.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 13 de 142
Instaladorestodo-en-uno
Lomáscómodo,rápidoydirectoesinstalartodoslosprogramasnecesariosdeunaúnicavez,atravésdeunodelosmuchospaquetesdeinstalaciónqueluegomencionaremos.Estaalternativaeslamásrecomendadaparalamayoríadelaspersonasqueempiezanysonmuyútilesporquepermitencontar,enunúnicopaso,contodoloquenecesitasparatrabajarNosoloteinstalarátodoslosprogramasmencionadosantes,sinoqueademáslosconfiguraráncorrectamenteparatrabajarentreellos.
ConestosinstaladorestodoenunopodrásenminutostenerPHP,ApacheyMySQLycomenzaradesarrollarsincomplicaciones.SiestásempezandoconPHPyquieresaprenderadesarrollareslaopciónmásinteresante.
Instalacióndetodoslosprogramasporseparado
SoloparalosusuariosdeLinuxmirecomendaciónseríainstalartodoloquenecesitasporseparado,pormediodeloscorrespondientesrepositorios.EsmuysencilloysitrabajasenLinuxsegurosabesdeloqueestoyhablando.ExistenTodo-en-unoparaLinuxperonoeslamaneranaturaldetrabajarenestesistema.
Virtualización
Paralosusuariosmásavanzadosexistelaposibilidaddevirtualizar.BásicamenteconsisteeninstalarentuordenadorunamáquinavirtualyejecutartusaplicacionesdesarrolladasconPHPenesamáquinavirtualizada(guest)ynoentusistemareal(host).
Lavirtualizaciónesmuyútilporquenospermitetrabajarenunentornodedesarrolloqueserálomásparecidoalentornodeproducción(aqueldondevasaponertuaplicaciónwebenfuncionamiento).Eselentornomásprofesionalynosahorradeterminadascomplicacioneshabitualesqueenumeramosacontinuación.
1. AunquePHPfuncionaigualencualquiersistemacuandoestásdesarrollando,puedestenerdiversosmódulosinstaladosqueigualnoseencuentranenelentornodeproducción,oviceversa.Esopuedehacerquetuspáginasfuncionenenunsitioynoenotro.
2. Paraequiposdetrabajo,dondecadaunodesarrollaconunsistemaoperativoyconprogramasdediversostipos,trabajarconunavirtualizaciónpermitiríaatodoelequipoejecutelaaplicaciónenelmismoentornovirtualizado,conlasmismaslibrerías,servidores,mismasversiones,etc.Esoahorralaposiblidaddequeunaaplicaciónnofuncioneaundesarrolladorysíaotro.
3. Finalmente,altrabajarconunentornovirtualizadoteobligasatrabajarconundominioreal,noaccederásatuproyectoconlocalhostycadaproyectopodrátenersuspropiasconfiguraciones,sinqueunosinterfieranenotros.Alpasardeunproyectoaotrosimplementeapagarásunamáquinavirtualyencenderásotra,seránindependientesynocorreselriesgoque,alcambiarconfiguracionesparaunproyecto,dejedefuncionarelotro.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 14 de 142
Lavirtualizaciónlaconsideromuyútilcuandosedesarrollanaplicacionesrealmentecomplejas,dondetienesgrannúmerodedependencias,peroagregadificultadparaempezar.Esmuyimportantecuandosetrabajaenequipo,sobretodoamedidaquecreceelnúmerodedesarrolladores.PeronolarecomendaríaparaunapersonaqueestáempezandoconPHP,aunquesímepareceimportantequeseconozcaqueexisteesaposibilidad.
Editoresonline
Noquieroperderlaoportunidaddenombrarotraalternativainteresanteenlaactualidad,siloquequieresesprobarPHPotrabajardesdecualquierordenadorynodependerdellevartedeunlugaraotrotucódigoylainstalacióndeservidores.
LoseditoresonlinepermitencomenzarausarPHPsintenerqueinstalarnadayprogramarsinsalirtedelpropionavegador.Estánmuybien,porquepermitenaprovechartodaslasventajasdelanubeyademás,comoenlavirtualización,trabajarconentornosmásreales,similaresalosqueusaríasenproducción
Loseditoresonlinetienenhabitualmenteentornosdedesarrolloyalistosparatrabajarynonecesitasinstalarnada,simplementehacerlogineneleditoronlineycomenzarausarlo.Peroadecirverdadpuedenserunpocosofisticadosparaquienesestáncomenzando,yaquelamayoríaestánenfocadosadesarrolladoresconalgodeexperiencia.Sierescomoyo,quetodalaofimáticatelahasllevadoalanube,apreciaráslaposibilidaddetrabajarconeditoresonline,yaquepodrásdelmismomodotrabajarremotamenteencualquierordenador,oinclusoeneltablet,sobreelmismoproyecto.Aunque,adecirverdad,aunqueloheintentado,nohellegadonuncaausarlosparaningúnproyecto.
ReferenciasparainstalacióndetuentornodetrabajoconPHP
Ahoraqueyatedebenquedarclaraslasposibilidades,quieroponeralgunasreferenciasparaquepuedassabercómocomenzarrealmenteentutareadeponerapuntotuordenadorparatrabajarconPHP.
InstaladorestodoenunoparaWindows
ParaWindowsyorecomiendoXampp,quemepareceelmáscompletoytambiénelmásusado,porloquesitienescualquiernecesidaddeconfiguraciónavanzadaesmásprobablequeencuentresdocumentaciónyayudasdeotraspersonasquehayantenidoesamismanecesidadoproblema.EncuentramásinformacióndeXampp.AunquesinotefuncionaporcualquiermotivohayotrasalternativascomoWamp.Nosonlosúnicosdelmercado,perocreoquesílosmásimportantesyrecomendables.
InstaladorestodoenunoparaMac
EnelcasodeMacelqueesmásusadocondiferenciaesMamp,queresultamuyinteresante.Laversióngratuitaesmuysencilla,perotieneloquenecesitasparacomenzar.Laversióndepagoesmuyavanzadaytieneunasprestacionesmuyelevadasyconfiguracionesrealmenteútilesquepuedeshaceragolpederatón.SideverdadtededicasprofesionalmenteaPHPcreo
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 15 de 142
queteinteresatenerlaversiónprofesional.AprendemássobreMamp.
InstalarenPHPenLinux
Comodecíaantes,sitrabajasenLinuxterecomiendoinstalarPHP,aunqueseaparacomenzar,pormediodelosrepositoriosdetudistro.EsmuysencilloytienesunaguíapasoapasoaquíparainstalarPHPenUbuntu(odistrosbasadasenDebiancomoelpropioDebianoMint).
Entornospormediodevirtualización
SideseasexplorarestaposibilidadterecomendamoscomenzarconVagrant,queeslaalternativamássencilladecrearentornosdedesarrolloquepuedescompartirfácilmenteconelrestodelequipo,paraquetodostrabajensobreunavirtualizaciónidéntica.Esgratuitayademásexistendiversasherramientasrelacionadasquenospermitencrearvirtualizacionespormediodeasistentesmuysencillosdeusar.
Editoresonline
ExistenvariosperocreoqueunabuenaalternativaparacomenzaraexplorarlosesCloud9.Puedesencontrarmásinformacióndecloud9aquí.
Conclusión
EsperoqueconestaseriedeposibilidadestehayamosaclaradoelcaminosobrecuálessonlasopcionesparatrabajarconPHP.Esperoquetantasalternativasnohayanservidopaadespistar,sinoparacubrirunamplioespectrosobreelquepuedasdecidir.
AcontinuaciónenelManualdePHPencontrarásmásinformacióndetalladasobrecadaunadeestasalternativasprincipales.Noscentraremosenaquellasquenospermtieninstalartodoslosprogramascómodamenteconunaúnicainstalación,yenLinuxlaalternativadeinstalarlossoftwaresporseparado,yaqueesmásrecomendable.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen31/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/guia-crear-entorno-desarrollo-php.html
InstalarPHPfácilmenteenWindows
CómoinstalarPHPensencillospasosenunordenadorconWindows.En5minutostendrásunainstalaciónrápidaysencilladePHPconXamppoWampServer.
EnesteartículovamosaabordarunpardeprogramasparalainstalaciónsencilladePHPenunsistemaoperativoWindows,conlaquepuedescreartuentornodedesarrollofácilmentey
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 16 de 142
empezaradesarrollarPHPenpocosminutos.
Usaremosprogramasdeinstalaciónautomática,quenospermitencontarconPHP,MySQLyelservidorwebApache,enunsolopasoyademásconfiguradoscorrectamenteparaquenotengamosquepreocuparnospornada,solocomenzaradesarrollar.Enelmercadoexistenvariasalternativaspararealizarestoynosotroscomentaremosunpardeellas,quesonlasmástradicionalesparaWindows:XamppyWamp.Existenotras,quevanapareciendo(ytambiéndesapareciendo),porloquepreferimoscontaroslasqueanosotrosnoshanfuncionadobiensiempreysonproyectosconbastantebuenasaludhastalafecha.
Tenencuentasoloqueestasinstalacionessonindicadasparatuordenadorpersonal,aqueldondevasadesarrollarconPHP.ParaelservidordondepondrástuaplicaciónPHPenfuncionamientonoseríanindicadas.Ademásque,aunquePHPfuncioneperfectamentesobreWindows,losservidoresdePHPenproducciónsuelenejecutarsesobreelsistemaLinux.
InstalarPHPenWindowsConXampp
AntesdeXampp,uotrasherramientassimilares,instalarPHPenWindowseraunatareamedianamentecompleja,querequeríavariospasos.HayqueinstalarelservidorwebApache,luegoelpropioPHP,configurarlosparatrabajarjuntos,etc.Adicionalmente,tendrásqueinstalarunmotordebasededatoscomoMySQLocualquierotrosistemagestorqueprefierasusar.Sinembargo,situobjetivoesdisponerdePHPenelordenadordondevasadesarrollaraplicacionesweb,esmuchomásrecomendableusaruninstaladorrápido.
NuestropreferidoyelqueterecomendamosenprincipioesXampp,aunquenoeselúnicoycadadesarrolladorpuedetenerunaopinióndistinta.Puedesobtenerestepaquetedesdesupropiapáginaweb:https://www.apachefriends.org/es/index.html
EstamossegurosquecualquierpersonaquesepainstalarunprogramaenWindowssabrátambiéninstalarPHPconXampp,puesesunsencilloprogramaconunasistentequetienesqueseguirpasoporpaso,comocualquierotroinstalador.Teofrecepocasopcionesdeconfiguraciónynuestroconsejoesquealprincipiolasaceptestodaslasquetevienendemanerapredeterminada(almenosparapersonasqueestánempezando).
Nota:LaúnicapartequequizáscambiaríadeXamppescuandotedicelosmódulosquequieresinstalar.Sisabesquealgonovasanecesitarpuedessimplementequitarlo,paraahorrarespacioendisco,peroporlodemás,siempreconvieneiralasopcionespordefecto.Loquenocambiaríaeslarutadelacarpetadondeestaránlosarchivosdelaweb,tudocumentroot.SialgunavezquierespersonalizarcosasdetuXamppybuscastutorialesmásavanzadosenInternet,generalmenteteguiarándandoporhechoqueeldocumentrooteselquesehamarcadopordefecto.
ParaexplicarotrosdetallesdeXamppterecomendamoslalecturadelartículodedescripcióndeXampp,queesantiguoperobastanteactualizado,yaquenohancambiadoprácticamentenada.
EnDesarrolloWeb.comencontrarástambiénotrosartículosdedicadosacosasmásavanzadas
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 17 de 142
arealizarconXampp,comoeselcasodecreardominiospersonalizadosparalossitiosquetengasendesarrollo,loquetepermiteentrarmedianteundominiodeInternet(comoacualquierotrositioweb)enlugardedesdelocalhost.Esoesbuenoporqueasípodrásejecutartusaplicacionesconunentornomásrealyparecidoacomoestaránpublicadasunavezlaspongasenproducción.Siteinteresasabermás,consultaelartículoConfigurarvirtualhostenApacheparaWindows.AdemástenemosunvideotutorialdeXamppquetambiéntepuedeserdeutilidad
Nota:Amododeadvertencia,yaqueesunerrormuyrecurrenteyaunqueyalohemostratadoenotrasocasionesenDesarrolloWeb...Apacheusaelpuerto80parafuncionar.Siesepuertoestáocupadoporotroprograma,yaseaSkypeoIISocualquierotroprograma,nosepodráarrancar.LasoluciónseríacambiarelpuertodondeApachefuncionaomejor,cambiarlaconfiguraciónodetenereseotroprogramaquecauseinterferencias.ElpropioXamppcuandoloejecutastieneunasencillaherramientaparadetectarlospuertosabiertosdondepuedesverquéprogramaeselquetieneocupadoelpuerto80,siesquehasencontradoesteproblemaentuequipo.
LasiguienteimagentemuestralaherramientadegestióndepuertosdeXamppalaquehacemosreferencia:
InstalarPHPfácilmenteenWindowsconWamp
ParalosquenohaninstaladonuncaPHPhayquecomentarquenotenganmiedoparanadaallenguaje,queesmuysencilloyagradecido.NocabetampocotenermiedodelainstalaciónoconfiguracióndePHP,porqueenesteartículovamosaexplicarunmododerealizarlaen5minutosysinnecesidaddeconocimientosiniciales.
OspasounasnotasrápidassobreelprocesodeinstalacióndePHPenWindowspormediodeunprogramaquesellamaWampServer2,queosfacilitarálatarea.PodráscomenzaratrabajarconPHPen5minutos!!
Nota:VolvemosainsistirquenuestropreferidoesXampp,queestámuchomásactualizado.NoencuentrounmotivoparainstalarWampquenoseaqueelpropioXamppteestédandoproblemasentusistema,encuyocasopuedesprobarconWampcomoalternativa.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 18 de 142
LoprimeroesentrarenlapáginadeWampServer,queeslasiguiente:http://www.wampserver.com/en/
Comohabíacomentado,WampServeresunprogramaqueinstalaenunsólopasoApache+PHP+MySQLylosconfiguraparatrabajarjuntos.
HabríaquehacerladescargadelaúltimaversióndeWampServeren:http://www.wampserver.com/en/download.php
Enlapáginadedescargateespecificaclaramentelalistadeprogramasquevaainstalar,asícomolasversionesdelosmismos.EnelmomentodeescribiresteartículoibanporlaversiónWampServer2.0,queinstalaestalistadeprogramas:
Apache2.2.8PHP+PECLSQLitemanagerMySQL5.0.51bPhpmyadmin
Nota:LalistadeprogramasoversionesdeloslenguajesqueteofreceWamppuedevariarduranteeltiempoacriteriodelosmantenedoresdelsoftware.
Unavezdescargadoelprograma,loejecutamospararealizarlainstalacióndeWampServer2.Lainstalaciónsebasaenunasistentenormalquenossolicitarávariosdatostípicosdeinstalaciones,comoqueaceptemoslostérminosdelalicencia.LuegonossaldrálaventanaparaacabarquemarcaremosqueejecuteWampServerinmediatamente.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 19 de 142
Sitodohafuncionado,en1minutomáspodremoscomprobarsiPHP5estáfuncionandoennuestroordenador.Sólotendríamosqueencenderlosservicios.ParaelloWampServertieneunpaneldecontrolqueseaccededesdeuniconodeprogramaresidentedelabarradetareas.Tieneunaformarara,comouncuentakilómetros.Loveremosenestaimagen:
Pulsamoseliconoconelratón(botónizquierdo,clicnormal)yveremosabajodeltodounainstrucciónquepone“PutOnline”,quepondrátodoslosserviciosenfuncionamiento.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 20 de 142
Ahora,paracomprobarquelosserviciosfuncionansólonosquedaabrirunnavegador.VamosaescribirlasiguientedirecciónURLenlabarradedirecciones:
http://localhost
EntoncesnostienequesalirlapáginadeiniciodelservidorApacheconPHP5,personalizadaporWamp,queesalgocomoesto:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 21 de 142
Sinonosalenadapuedequehayahabidounproblemaounerroraliniciarlosservicios,generalmenteelApache,queutilizaelpuerto80queavecesestáocupadoporotroprogramacomoSkypeoIIS.LeelaFAQ:NofuncionaelWampServer2.
AhorapodremoscolocarennuestroservidortodaslaspáginasPHPquequeramosprobarolosproyectosquehayamoscreadoanteriormente.Eldirectoriodondegeneralmenteselocalizalaraízdepublicaciónes:C:/wamp/www
EnesacarpetapodríamossubircualquierarchivoPHP4oPHP5ydeberíaejecutarseperfectamente.OtracosaquepuedefallaresquelosiniciosdebloquesdecódigoPHPquedebéisutilizarsoncon“<?php”ynosólocon“<?”,queestádeshabilitadopordefecto.
OsaseguroqueleeresteartículoosllevarámástiempoqueinstalarPHP5envuestroordenador.ConWampServer2esmuyfácil.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen31/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/instalar-php-5.html
InstalarLamp,Apache-MySQL-PHP,enLinux
Cómoinstalartodoslosprogramasquenecesitasparacomenzaradesarrollar
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 22 de 142
conPHPenentornosLinux:Apache,PHPyMySQL,loqueseconocecomoLamp.ParaDistribucionesbasadasenDebiancomoUbuntuoLinuxMint.
EnDesarrolloWeb.comhemosexplicadoendiversosartículoscómoinstalartodoslosprogramasnecesariosparaempezaratrabajarconPHPenlocalsobresistemasWindows,puestradicionalmentehemosorientadonuestrostutorialesalosusuariosdedichosistema.Sinembargo,nodebemosdeolvidarnosdelosusuariosdecualquieradelosotrossistemasoperativosyenesteartículoletocaaGNU/Linux.
Dehecho,sisemepermitelaapreciación,aunquePHPesmultiplataforma,suentornomásnaturalparaejecuciónesLinux,yaquelamayoríadelosservidoresPHPcorrenbajoesesistemaoperativo.Porello,paralosquesomosdesarrolladoresyqueademásnosinteresaaprenderunpocodeadministracióndeservidores,nonosvendríanadamaltenernuestroPHPejecutandobajounainstalacióndeLinux.Además,setratadealgorealmentesencillo.
Nota:ExistenotrostutorialesdiversosenDesarrolloWeb.comquepuedeninteresartesiloquequieresesinstalarPHPenotrossistemasoperativos.
DebehaberdecenasdemanerasdeinstalarApache,PHPyMySQLsobreGNU/LinuxyenInternetencontraremosunagrancantidaddeinformaciónaesterespecto.Nosotrosvamosadestacarunaacontinuaciónquenoshafuncionadosiemprebien,conalgunosdetallesadicionalesquenospuedenfacilitardiversaslaboresdedesarrolloennuestrossistemas.Además,complementaremoslainformacióncomentandolospasosparainstalarotraherramientafundamental,comoeselPhpMyAdmin.
Instalarlospaquetesporlíneadecomandosconapt-get
VamosainstalartodoslospaquetesnecesariosparapodertrabajarconPHPyloharemossobrelíneadecomandos,queesunmétodoquedifícilmentepodráfallarnos.Paraelloutilizaremoselcomandoapt-getdesistemasbasadosenDebian.
Nota:YoestoytrabajandosobreUbuntu,porellovoyautilizaruncomandoquevienedesistemasDebianparaladescargadepaquetesqueeselapt-get.Esecomando,comodecía,estádisponibleenlasdistrosDebian,perotambiénenaquellasbasadasenDebian,comoUbuntuoLinuxMint.Ubuntueseltercersistemaoperativomásutilizado,creadoporCanonical,yMintseríaelcuartoenimportanciaanivelmundial.SiutilizasotrosistemaGNU/LinuxquenoestébasadoenDebian,estainformaciónquizásnoteservirádemucho.
ConvienedecirqueestarecetalahemosobtenidodelsitiowebHowtoForge.Yolahetraducidolibrementeylahecomplementadoconexplicacionesadicionalesyalgunospasosextraqueheconsideradodeinterés.
Comounprimerpaso,podemoslanzaruncomandoparaobtenerlosprivilegiosderootparalaadministraciónatravésdelalíneadecomandos.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 23 de 142
sudo su
Nospedirálaclavedenuestrousuario,queeslamismaclavequeusamosalarrancarelequipo.
Paso1:InstalacióndeMySQL
AhorainstalaremosMySQL,paraloqueejecutamoselsiguientecomando:
apt-get install mysql-server mysql-client
DuranteelprocesodeinstalacióntendrásqueintroducirlaclavequedeseasconfiguraralusuariorootdeMySQL.
Paso2:InstalarApache
AhoratocainstalarelservidorwebApache,ensuversión2.ParainstalarApache2lanzamoselsiguientecomando:
apt-get install apache2
Enestepunto,unavezinstaladoApache,puedeshacerunaprimeracomprobación,quenospermitirásabersielservidorwebestáfuncionadocorrectamente.ParaelloabreunnavegadorcualquieraeintroducelaURLdelocalhostolaIPlocaldetuordenador:
http://localhost
Obien:
http://192.168.0.55 (sustituye esa IP por la IP de tu máquina)
Nota:SinosabescuálestuIPderedlocal,tienesatudisposiciónenLinuxelcomandoifconfig.
AlaccederacualquieradeesasdosURLdeberíasalirteelmensajedeApachediciendoqueestáfuncionado(Itworks!).
Paratuinformación,eldirectoriopredeterminadodondeseguardanlosdocumentosdelservidorwebenApachees/var/wwwyelficherodeconfiguracióndelservidorestáen/etc/apache2/apache2.conf.Otrasconfiguracionesestánalmacenadasenotrossubdirectorios
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 24 de 142
de/etc/apache2como/etc/apache2/mods-enabledparalosmóduloshabilitados,/etc/apache2/sites-enabledparalos"virtualhosts"y/etc/apache2/conf.dparalasconfiguracionesglobalesqueafectaránatodoslosvirtualhost.
Nota:ExisteenDesarrolloWeb.comunmanualsobrelainstalacióndeApacheenWindows,quenoteayudarámuchosiestásenLinux,peroquetienemuchainformaciónsobrelaconfiguracióndeApache.Teservirádeayudapuestoquelamayoríadelosarchivosdeconfiguraciónfuncionanexactamenteigualylasvariablesdeconfiguraciónsonexactamentelasmismas.
Paso3:InstalarPHP
ElsiguientepasoesInstalarPHP.Laversiónactualenelmomentodeescribiresteartículoesla5,queseinstalaríaconelsiguientecomando.
apt-get install php5 libapache2-mod-php5
DespuésdelainstalacióndePHP5comomódulodeApache,debemosreiniciarelservidorwebyparaellolanzamosesteotrocomando.
/etc/init.d/apache2 restart
Comopuedesver,hacemosun"restart",perotambiénpodríashacerprimeroun"stop"yluegoun"start".
Llegadoestepunto,podemoscrearyaundocumentowebquenossirvaparacomprobarsiPHPestácorrectamenteinstaladoennuestrosistemayparaellopodemosutilizarlalíneadecomandosyeleditorqueprefieras.AalgunaspersonaslesgustaeleditorllamadoVi,peroyosoydelosqueprefiereotrosmássencilloscomoelJoe.
Nota:ParaconocermásacercadelprogramaJoe,puedesvisitarlaFAQ:¿SabéisdeunaalternativaaVi?
Encualquiercaso,tendrásquecrearunarchivoenlarutapordefectodepublicacióndelApache,queyadijimoses/var/www.Puedesllamarlecomodesees,porejemploinfo.php,enelquecolocaráslassiguienteslíneasdecódigo.
<?php
phpinfo();
?>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 25 de 142
EsafuncióndePHPphpinfo()temostrarámuchainformaciónútilsobrelainstalacióndePHPquetienesentumáquina,comomódulosincluidosydiferentesconfiguracionesenfuncionamiento.
Nota:paracrearelarchivoPHPtambiénpuedesutilizareleditorgráficoquedesees,queteseráinclusomáscómodoquecualquierprogramaquetrabajeconelterminal.Elúnicodetalleesaplicarlelospermisosnecesariosalacarpeta/var/wwwparaqueseapropiedaddetuusuarioypuedasciertascosasconella.Tenencuentaqueponersecomousuariodueñodelacarpetaserecomiendasolositiosquenoesténenproducción.Loharíasconelcomando:
sudo chown -R $USER:$USER /var/www
Silodeseas,tambiénpuedeshacerelcomando:
echo $USER
Paraverelnombredelusuarioenelqueestásyelquevasaponercomoduelodelacarpeta/var/www.
Unavezcreadoelarchivodetextoinfo.phpconelcódigoindicado,podemosaccederaéldesdeunnavegadorconunaURLcomoesta:
http://localhost/info.php
Tambiénpuedessustituir"localhost"portudirecciónIPderedlocal.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 26 de 142
SivestodaunaseriedeinformacióndetuinstalaciónPHP,comoenlaimagenanterior,esquehaspodidoinstalarPHPencorrectascondiciones.
Paso4:InstalarmóduloPHP5-mysqlyotrasextensionesPHPnecesarias
Sihacesscrollhaciaabajoenlapáginadelphpinfo()podrásverellistadodemódulosPHPquetienesdisponibles.PuedequenotengastodoslosquenecesitasyenconcretopodrásobservarquenotieneshabilitadoelmódulodeMySQL,porloquepodrásinstalarlo.
Sihaceselcomando:
apt-cache search php5
PodrásencontrarellistadodeextensionesdePHPdisponiblesenlosrepositorios,puedeselegiraquellosquedeseeseinstalarlosconlalínea:
apt-get install php5-mysql php5-curl php5-gd php-pear php5-imagick php5-sqlite php5-tidy php5-xmlrpc php5-xsl
Acontinuacióndebesreiniciarelservidorparaqueloscambiostenganefecto.
/etc/init.d/apache2 restart
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 27 de 142
Sirefrescaslapáginadelphpinfo()podrásencontrarlosnuevosmódulosinstalados.
Paso5opcional:InstalarPhpMyAdmin
SeguramenteagradeceráscontarconunacopiadePhpMyAdminparagestionartusbasesdedatosMySQL.Paraellopuedesinvocarelcomando:
apt-get install phpmyadmin
Verásacontinuaciónunaseriedepreguntas,comotuservidorweb.UnavezinstaladopuedesaccederalgestorpormediodeunaURLcomoesta:
http://localhost/phpmyadmin/
Conclusión
ConesteprocesotendrásatudisposicióntodoslosmaterialesparacomenzaradesarrollarconPHPentuLinux.
Simplementeseñalarundetalleimportante,queyaseapuntóderefilón,peroquequieroremarcar.EsposiblequeenestainstalacióndeApacheyPHPquierasdesarrollarsitioswebyutilizarparaprogramardichossitiosuneditorparaprogramadoresconinterfazgráficacomoKomodoEditoEclipse.Enestecasorecuerdaque,paraeditarocreararchivosenlacarpeta/var/wwwdesdeesosprogramas,tendrásqueponertuusuariocomodueñodelacarpeta,conchown.Esoseexplicóenunanotaanterior.
Referencia:ParaoptimizarlaconfiguracióndetuApacheenLinuxdeunamaneramuyprácticaparatuservidordedesarrollo,teaconsejamoslalecturadelartículoConfiguracióndeApacheenLinuxconcarpetasexternas.
Demomentoestodo!Esperoquetesirva!
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen19/04/2012Disponibleonlineenhttp://desarrolloweb.com/articulos/instalar-php-apache-mysql-linux.html
InstalarPHPenMacconMamp
InstalarPHPconApacheyMySQLenunordenadorMacOSXusandoelpaquetetodoenunoMamp.PrimerospasosyconfiguracionesdeMamp.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 28 de 142
UnodelostemasmásrecurrentesdentrodeDesarrolloWeb.comeslainstalacióndePHP.TenemosdecenasdeartículosyFAQscreadasalolargodelosyacasi15añosdehistoriadeestesitioweb.Sinembargo,nuncahabíamosabordadolainstalacióndePHPsobreMacOSX,tutorializadaypasoapasocomonosgustasiempreofrecertelainformación.
Ahorapues,vamosconunadelaspendenciasparacompletarlosprimerospasosparalosqueseintroducenenPHPqueyateofrecemosatravésdelManualdePHPBásico.Parasimplificarlascosasyhaceroslavidamásfácilatodos,abordaremosesteasuntoatravésdeunodeesosinstaladorestodo-en-unoquenosayudanatenerenpocosinstantesinstaladosyconfiguradostodoslospaquetesdesoftwarenecesariosparapoderejecutarPHPennuestroordenador.
EnMacseusatradicionalmenteelsistemallamadoMamp,queeselqueosvamosaenseñarenesteartículo,sinembargo,tampocoeselúnico.Lociertoesquetodoslos"maqueros"queconozcousanMamp,perolaverdadesquesisedeseatambiénsepuedeencontrarversionesparaOSXdepaquetespopularescomoXampp.
Realmente,parainstalarelMamppocotetememosquedecir.SiyaeresusuariodeMacdesdehacetiemponoencontrarásproblemaalguno,yaqueeselprocesoquehasusadoendecenasdeprogramasquetendrásinstaladosentumáquina.Porelloyparadarleunpocomásdeutilidadaestetexto,teexplicaremostambiéncuálessonlosprimerospasosylasconfiguracionesbásicasquepuedesquererhacercuandoempiecesausarMamp.Alfinaldeestetextoencontrarástambiénunvídeoquehegrabadoparaexplicarestasmismascosasperodemaneravisual.
MampoMampPro
Comodecimossiempre,paratrabajarconPHPlomáscómodoestenerenlocalunservidorweb,dondecrearástuspáginasdurantelaetapadedesarrollo.LuegolaspáginaslassubirásaunservidorwebdeInternetparaqueesténdisponiblesparatodoelmundoyacualquierhora.Portanto,paratrabajarconPHPnecesitarásdetreselementosbásicos.Apachequeesunservidorweb,elmódulodePHP(paraqueApacheseacapazdeinterpretaryejecutarpáginasconPHP),yMySQL(unabasededatosconlaqueconstruirtusaplicaciones).
EstostresprogramaslostienesenMampparainstalartodoenunoydemanerasencilla.Ademástelosentreganconfiguradosperfectamenteparaquepuedascomenzarausarlosenelinstante.Tantolaversión"Mamp"comosuhermanomayor"MampPro"contienenestostresingredientesbásicos,portanto,cualquieradelasdosserásuficiente.Mamp(asecas)esgratuito,porloquerepresentalamejoropciónparacomenzar.¿EntoncesquémásconsigositengoMampPro?
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 29 de 142
RealmentepocaspersonasqueconozcousanMampPro,peronuestrocompañerodelacomunidaddeDesarrolloWeb.comyprofesordeEscuelaIT@micromanteusaelMampPro,porquetienealgunacosillaqueaéllevienebienprofesionalmente.ElprecioesmásquerazonableytienevariasmejorasinteresantescomoconfiguracióndelservidordeemailparaenvíodecorreodesdepáginasPHP,posibilidaddeelegirentremuchasversionesdePHP,accesoalservidoratravésdeturedlocal,etc.Perolaquemásmehallamadolaatenciónporsuutilidadyporqueesalgoqueaveceshaceramanotedaalgúnqueotroproblemillaeslaposibilidaddeusarloquesellaman"virtualhost".
Nota:SieresnuevoenPHPseguramentenotediganadaesodel"virutalhost".Enesecasonotepreocupes,peroparalosquequieransaberaquémerefieroescrearunaespeciedeservidorindependienteparacadaunodelossitiosquequierasalojar(paracadaproyectodecadacliente).Deesemodopuedesaccederalproyectoconunnombrededominioalgocomomicliente.example.com,loqueteofreceunentornobastantemásparecidoacomotendráspublicadoelsitiounavezestéenelservidorremotoydominiodefinitivo.Además,alserhostindependientestieneslaoportunidaddeconfigurarcosastambiéndemaneraindependiente,sinqueafecteaotrosproyectosquetengasentumismoordenador.
PrimerospasosconMamp
LaversiónbásicadeMampesmuysencilla,perohayunaspocascosasquepuedessaberparafacilitarteunpocomássuuso.
Encenderyapagarlosservicios:
DesdelaventanadeadministracióndeMamppuedesencenderyapagarlosservicios(ApacheyMySQL).Hayunsencillobotónparaestatareaquenotendrásproblemasenlocalizardesdelaventanaprincipal.Solotenencuentaqueelservidorwebsoloestarádisponible(asícomotodaslaspáginasquecuelguesdeél)cuandoelservidorestéencendido.Unproblematípicodenopoderaccederaunapáginaentuservidoresquetehayasolvidadodeiniciarlosservicios.
Puerto:
ElMampconfigurademanerapredeterminadaApacheparaescucharenunpuertodeterminado,pordefectoel8888.Esporelloquelarutadetuservidorenlocales:
http://localhost:8888
Lapalabra"localhost"esunaliasdetuordenadorlocalyluegocon":8888"indicaselpuertodondetuservidorwebestáconfigurado.EstepuertolopuedescambiartambiéndesdelainterfazdeadministracióndelMamp.
Nota:generalmentelosservidoreswebtrabajanconelpuerto80.Enesoscasosnoesnecesarioindicarelpuerto,porquetunavegadorlousarádemanerapredeterminadaparaaccederalossitiosweb.Soloenelcasoqueelservidorwebestéconfiguradoenunpuertodiferente,esnecesarioindicarloenlaURL.Osea,http://localhosteslomismoqueescribir
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 30 de 142
http://localhost:80\.MampconfiguraApacheenotropuertoparaquenotengasincompatibilidadesconotrasaplicacionesquepuedanestarusandotambiénesemismopuerto.
Directoriodepublicación:
Otradelascosasquedebesaprenderesalocalizareseldirectorio"raíz"depublicacióndetuservidorweb.EsmuyfácildelocalizarenlainstalaciónbásicadeMamp.Simplementevasa"Preferencias/Apache"yloencontrarás.Demanerapredeterminadaestáentudiscoduro,directorio"aplicaciones/MAMP/htdocs".Silodeseaspuedescambiarlo,parasituarloenotracarpetadiferente,peronoterecomiendohacerloanoserqueyatengasunpoquitodeexperiencia.
Loimportantedeldirectoriodepublicaciónesqueesellugardondevasacolocartodoslosarchivosquequieresqueesténdisponiblesatravésdetuservidorweb.EnesacarpetapodrásmetertantopáginasHTMLcomoPHP,archivosCSS,imágenes,JS,etc.Osea,todoloquehayaentuproyectooencadaunodelosproyectosquetendrásenelservidor.Paraaccederaestosarchivosbastaconescribirlarutadetuservidorhttp://localhost:8888yluegolarutaparaaccederaesearchivodesdeeldirectorioraízdepublicación.
http://localhost:8888/directorio/archivo.php
Creoqueconestosconceptosinicialestienessuficienteparacomenzarsintemoraliartemásdelacuenta.RecuerdaqueenDesarrolloWeb.comtienesmuchasotrasayudasparaprofundizarenPHPenlasecciónPHPaFondo.
VídeodeinstalacióndeMamp
EnelsiguientevídeopuedesvercomounnovatocomoyoenlossistemasOSXinstalaMampen3minutos.Ademásteexplicarélascosasmásimportantesquedebessaberparanoliarteentusprimerospasosusandotuservidorweblocal.
Paraverestevídeoesnecesariovisitarelartículooriginalen:http://desarrolloweb.com/articulos/instalar-php-mac-mamp.html
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen18/08/2014Disponibleonlineenhttp://desarrolloweb.com/articulos/instalar-php-mac-mamp.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 31 de 142
PrimerospasosconellenguajePHP
Empezamosatrabajarconellenguajedeprogramación.EnlossiguientescapítulosdelManualdePHPexplicaremoslasgeneralidadessobreellenguaje,comosusintaxis,lasvariablesquepodemoscrearysustiposdedatos,lasvariablesdelsistemaqueestándisponiblessobreelservidor,operadores,etc.
IntroducciónalasintaxisPHP
ExplicamoslaspautasprincipalesaseguirparaincluirPHPenelcódigodenuestrapágina,laformadeintroducircomentarios.
DespuésdevarioscapítulosdelManualdePHPenlosquehemosintroducidoellenguaje,suscaracterísticasycómoinstalarnuestroentornodetrabajo,estamossegurosquetendrásmuchasganasdecomenzaravercódigo.Asíquevamosconello!
EnestecapítulovamosaexplicarlasintaxisbásicaycómoenunapáginaHTMLpodemosmezclarelcódigodellenguajedemarcación(HTML)conelcódigodelladodelservidor(PHP).Verásqueesbiensencillo,motivoporelcualalosdesarrolladoresqueyasabenHTMLlesresultamuysencillocomenzarconPHP.AdemásveremosalgunascosasbásicasyconsejosinteresantesparaquetucódigoPHPsepuedaejecutarperfectamenteencualquiertipodeservidor.
AperturaycierredelcódigoPHP
PHPseescribedentrodelapropiapáginaweb,juntoconelcódigoHTMLy,comoparacualquierotrotipodelenguajeincluidoenuncódigoHTML,enPHPnecesitamosespecificarcuálessonlaspartesdelcódigoescritasenestelenguaje.Estosehace,comoenotroscasos,delimitandonuestrocódigoporetiquetasdeaperturaycierre.Podemosutilizardistintosmodelosdeetiquetasenfuncióndenuestraspreferenciasycostumbres.Hayquetenersinembargoencuentaquenonecesariamentetodasestánconfiguradasinicialmente,algodeloquehablaremosenseguida.
EstossonlosmodosdeabrirycerrarlasetiquetasquedelimitanelcódigoPHP:
<? y ?>
<?php y ?>
ElmododefuncionamientodeunapáginaPHP,agrandesrasgos,nodifieredelclásicoparaunapáginadinámicadeladoservidor:ElservidorvaareconocerlaextensióncorrespondientealapáginaPHP(Generalmente.php,peropodríaconfigurarseelservidorparaquebusque
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 32 de 142
códigoPHPenotrasextensionesdearchivo...)paraejecutarlosbloquesdescriptsPHP.
Elservidor,antesdeenviarlapáginaalnavegadorseencargarádeinterpretaryejecutartodoaquelloqueseencuentreentrelasetiquetascorrespondientesallenguajePHP.Elresto,loenviarasinmásyaque,asumiráquesetratadecódigoHTMLabsolutamentecomprensibleporelnavegador.
Nota:EnPHP7seeliminaronotrosestilosdeaperturaycierredelcódigoPHP:<%y%>,asícomo<script language="php">.
EnPHPlaaperturadelcódigoconeltagensuversióncorta(<?)noseencuentrasiempreactivadopordefecto.EsalgoquedependedelservidorydelaversióndePHPqueestéinstaladaenél.ParaevitarproblemasdebidosalaplataformadondeseejecutaPHPnoterecomendamosutilizarlo.Noobstante,sitieneslaoportunidaddealterarlaconfiguracióndellenguajePHP(mediantelaedicióndelarchivophp.inicorrespondiente,delquehablaremosenotromomento),podríasdefinirquetambiénseinterpreteesaetiquetamedianteladirectiva"short-open-tags".
Usode;paradelimitarsentencias
OtracaracterísticageneraldelosscriptsenPHPeslaformadesepararlasdistintasinstrucciones.Parahacerlo,hayqueacabarcadainstrucciónconunpuntoycoma";".Paralaultimaexpresión,laquevaantesdelcierredeetiqueta,esteformalismonoesnecesario.
<?php echo 'código PHP' ?>
Aunquelasentencia"echo"anterior(quesirveparaescribirdesdePHPsalidaenlapropiapágina)noacabaen";"elcódigoesperfectamenteválido,porqueinmediatamentedespuéstenemoselcierredelscriptPHP.
ComentariosenPHP
Incluimostambiénenestecapitulolasintaxisdecomentarios,quefuncionanmuysimilaresalosdeotroslenguajescomoJava,CoJavascript.
Nota:Uncomentario,paraaquellosquenolosepan,esunafraseopalabraquenosotrosincluimosenelcódigoparacomprenderlomásfácilmentealvolverloaleeruntiempodespuésyque,porsupuesto,elordenadortienequeignoraryaquenovadirigidoasuejecución,sinoanosotrosmismosuotrosdesarrolladoresquepuedanleeresecódigomásadelante.Loscomentariostienenunagranutilidadyaqueesmuyfácilolvidarsedelfuncionamientodeunscriptprogramadountiempoatrásyresultamuyútilsiqueremoshacerrápidamentecomprensiblenuestrocódigoaotrapersona.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 33 de 142
Puesbien,laformadeincluirestoscomentariosesvariabledependiendosiqueremosescribirunalíneaomás.Veamosestoconunprimerejemplodescript:
<?php
$mensaje="Tengo hambre!!"; //Comentario de una linea
echo $mensaje; #Este comentario también es de una linea
/*En este caso
mi comentario ocupa
varias lineas, lo ves? */
?>
Siusamosdoblebarra(//)oelsímbolo#podemosintroducircomentariosdeunalínea.Mediante/y/creamoscomentariosmultilínea.Porsupuesto,nadanosimpidedeusarestosúltimosenunasolalínea.
Noospreocupéissinocomprendéiseltextoentrelasetiquetas,todollegará.OsadelantamosquelasvariablesenPHPsedefinenanteponiendounsímbolodedólar($)yquelainstrucciónechosirveparasacarenpantallaloquehayescritoacontinuación.
Recordamosquetodoeltextoinsertadoenformadecomentarioescompletamenteignoradoporelservidor.Resultaimportanteacostumbrarseadejarcomentarios,esalgoqueseagradececoneltiempo.
EjemplocompletodeunapáginaPHP
AhoraveamosuncódigocompletodeloquepodríaserunapáginaPHP.VerásquecomenzamosconunapáginabásicaescritaconHTMLenlaquehemosinsertadouncódigoPHP.Elcódigodemomentoeslodemenos,loimportanteesvercómoseintegraelcódigoPHPenunapáginaHTML.
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Primera página PHP</title>
</head>
<body>
<h1>Esto es HTML</h1>
<?php
echo '<p>Esto viene de PHP</p>';
?>
</body>
</html>
ParapoderprobarestapáginaPHPdeberíasnombrarlaconextensión".php".Podríaseralgocomo"pag1.php"o"index.php".Luegotendrásquecolocarlaeneldirectoriodepublicacióndetuservidor("documentroot"eninglés),cuyodependedecuálseaelservidorqueestésusandoparapodercomenzarconPHP.Normalmenteesacarpetasellamaalgocomo"httpdocs",
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 34 de 142
"httpd","htdocs","www",etc.Luego,teniendoelservidorApache(oelservidorquetengasentucaso)encendido,tendrásqueaccederalapáginaatravésde"http://localhost/pag1.php".Aunqueestodependemuchodecómotengasconfiguradotuentornodetrabajo.EnlosartículosdeinstalacióndePHPseofrecenmásdetallessobrecómopuedesconfigurarelentornodetrabajoycuálesseríanlosdirectoriosymodosdeaccesoatusarchivosPHPdesdecadatipodeservidor.
Nota:Otracosaquenosgustaríamencionar,aunquepuedaresultaruntantoavanzada,esqueenlaprácticaesinteresanteseguirunaseriedebuenasprácticas,comolaseparacióndelcódigoporresponsabilidadesoelusodesistemasdetemplates.Quizásesdemasiadoprontoparamencionarlo,perolociertoesqueelhechodePHPpermitirnosmezclarelcódigoHTMLconelcódigoPHPpuedeproduciralalargaproyectosconundifícilmantenimiento.Ahoranoeselmomentodepreocuparteporello,siesqueestásempezandoconPHP,peroesbuenoquelotengasencuentaparamásadelanteyqueconsultes,aquíenDesarrolloWeb.comartículosymanualesmásavanzadosdondeteexplicamoscómocodificardemodoqueteaseguresquetuproyectoseráordenadoyllegodebuenasprácticas.Siempreestábientenerunamiradacríticaennuestrotrabajoafindeexploraraquellasprácticasyherramientasquenospermitansermejoresprofesionales.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen29/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
VariablesenPHP
Tiposdevariables,característicasgeneralesyaspectosespecíficosdePHPdeestoselementosbásicosdelaprogramación.
LasvariablessonunodelosprimerostemasquetenemosqueconocerenPHPyenlamayoríadeloslenguajesdeprogramación.AsíqueacontinuaciónvamosatrataresteasuntodentrodelManualdePHP,explicandotambiénlostiposdedatosquepodremosencontrarenellenguaje.
AnteriormenteenDesarrolloWeb.com,enelmanualdepáginasdinámicas,yahabíamosintroducidoelconceptodevariable.Noobstantepodemosentenderunavariablecomoundatoalmacenadoenunareferencia.Técnicamenteunavariableapuntaaunaposicióndelamemoria,dondesealmacenaundato.Lasvariablesseutilizanenloslenguajesdeprogramaciónparadarleunnombreaesedato,aesaposicióndelamemoria,demaneraquesepuedaentenderosaberloquecontiene.Alfinal,esosdatosalmacenadossonlosqueseutilizanparaconseguirlosresultadosdelosprogramas.
Porsuparte,untipodedatoseslacaracterísticadeundatoalmacenado.Esdecir,siesdeunaformaconcreta,numérica,alfanumérica,etc.Todosloslenguajestipandealgunamaneralosdatos,aunquealgunossonmáspermisivosqueotrosalahoraderealizaroperacionesconvariablesdedistintostipos.
Nota:Sitienescualquierdudasobreloquesonlasvariablesolostiposdedatosterecomendamosasistiralagrabacióndeestaexcelenteclasedondeteloexplicandeunamaneradetallada.Variablesytiposenloslenguajesdeprogramación.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 35 de 142
$enelnombredelasvariables
Enelcapítuloanterioryacomentábamosque,paraPHP,lasvariableserandefinidascomenzandosiempreporelsímbolodólar($).Esquizásunadelascaracterísticasmásfuertesdellenguaje.AlvereldólaralprincipiodelnombredecualquiervariablepodrásrápidamentededucirquetalcódigoestáescritoenPHP.
Lasvariablessiempredeberíantenerunnombredescriptivosobreloqueellasvanaalmacenar.Portanto,alnombredeunavariableenPHPlecolocaremoselsímbolo$.
<?php $total = 300 ?>
TiposdedatosenPHP
Dependiendodelainformaciónquecontenga,unavariablepuedeserconsideradadeunouotrotipo:
Variablesnuméricas
Estetipodevariablesalmacenacifras,números,quepuedentenerdosclasificacionesdistintas:
Enteros$entero=2002;NumerossindecimalesReales$real=3.14159;Numerosconosindecimal
Variablesalfanuméricas
Estetipodedatosalmacenatextoscompuestos,cadenasdecaracteres,quepuedencontenerletras,símbolosynúmerosocifras.
CadenasAlmacenanvariablesalfanuméricas$cadena="Holaamigo";
Boleanas
Estetipodevariablesalmacenaunvalorlógico,quepuedevalerverdaderoofalso.Esmuycomúnenlaprogramaciónestetipodevariablesboleanas.
Boleanoverdadero$verdadero=true;Boleanofalso$falso=false;
Matrices,tablasoarrays
Esuntipodedatosenelque,enlugardetenerundato,podemosalmacenarunconjuntodeellos,alosqueaccedemosatravésdeíndices.Cadaunadelascasillasdeunarrayolosdatosdenuestramatrizasuvezalmancenaninformacionesnuméricasy/oalfanuméricas,pudiendo
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 36 de 142
mezclartiposdevariablesdemaneraarbitrariaentresusdistintascasillas.
ArraysSonlasvariablesqueguardanlastablas$sentido[1]="ver";$sentido[2]="tocar";$sentido[3]="oir";$sentido[4]="gusto";$sentido[5]="oler";
MásadelanteencontraráscapítulosenterosdedicadosalosarraysenPHP.
Objetos
Setratadeconjuntosdevariablesyfuncionesasociadas.Presentanunacomplejidadmayorquelasvariablesvistashastaahoraperosuutilidadesmásqueinteresante.Entraremoscondetalleenlosobjetosmásadelante,yaquesucomplejidadhacedifícilexplicarlasahora.
PHPtienetipadodinámico
Adiferenciadeotroslenguajes,PHPposeeunagranflexibilidadalahoradeoperarconvariables.Enefecto,cuandodefinimosunavariableasignándoleunvalor,elordenadorleatribuyeuntipo.Siporejemplodefinimosunavariableentrecomillas,lavariableseráconsideradadetipocadena:
$variable="5"; //esto es una cadena
Sinembargo,sipedimosennuestroscriptrealizarunaoperaciónmatemáticaconestavariable,noobtendremosunmensajedeerrorsinoquelavariablecadenaseráasimiladaanumérica(PHPharátodoloposibleporinterpretarnuestraoperación,aunquetécnicamentenotengamuchosentidohacerdeterminadasoperaciones):
<?
$cadena="5"; //esto es una cadena
$entero=3; //esto es un entero
echo $cadena+$entero
?>
Estescriptdarácomoresultado"8".Lavariablecadenahasidoasimiladaenentero(aunquesutiposiguesiendocadena)parapoderrealizarlaoperaciónmatemática.Delmismomodo,podemosoperarentrevariablestipoenteroyreal.Nodebemospreocuparnosdenada,PHPseencargadurantelaejecucióndeinterpretareltipodevariablenecesarioparaelbuenfuncionamientodelprograma.
Nota:LoslenguajescomoPHPquepermitenmayorflexibilidadenlostiposdelasvariablessedicenquetienentipadodinámico.Enellosunavariablepuedetenerdistintostiposalolargodesuvida,esdecir,amedidaqueelprogramaseejecutaunavariablepodrácambiardetipo.Generalmenteduranteelprocesamientodelprogramasevainfiriendolostiposdelasvariables,entiempodeejecución,segúneltipodedatosdelvalorqueseleasignaolasoperacionesqueserealizansobreellas.Otramaneradereferirseaestetipodelenguajesdeprogramaciónes"débilmentetipados",aunqueestasegundadenominaciónesmenoscorrecta,porquepuedeinduciraunacomprensiónerrónea,yaque
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 37 de 142
enlarealidadlasvariablessiempretienentipos,aunqueestospuedanvariarconeltiempo.
PHPessensiblealasmayúsculasyminúsculas
PHPentiendedemaneradistintalasmayúsculasyminúsculas.Enelcasodelnombrequeledamosaunavariable,noeslomismoescribirlaconmayúsculaominúscula,omezclandomayúsculasyminúsculasdedistintamanera.Portanto,hayquetenermuchocuidadoalahoradeescribirlosnombresdevariables,ynocambiarmayúsculasporminúsculas,yaquePHPentenderádosvariablesdistintasaunquenosotrospodamosintentarreferirnosalamisma.Cuandoestamosempezandoquizásseaunbuenconsejotrabajarasignandonombresalasvariablessiempreenminúsculas,paraevitarestetipodemalentendidosavecesmuydifícilesdelocalizar.
Enelcasoquetengamosunavariableconunnombrecompuestodevariaspalabras,enPHPesunaprácticacomúncolocarlavariabletodaenminúsculaysepararlaspalabrasporguionesbajos.
<?php $mi_variable_bonita = "me gusta PHP" ?>
Variablesasignadasporreferencia
EnPHPtambiénpodemosasignarvariablesporreferencia,aunqueadecirverdadnoesunacaracerísticaqueseusemucho.Enesecasonoselesasignaunvalor,sinootravariable,detalmodoquelasdosvariablescompartenespacioenmemoriaparaelmismodato.
Lanotaciónparaasignarporreferenciaescolocarun"&"antesdelnombredelavariable.
<?php
$foo = 'Bob'; // Asigna el valor 'Bob' a $foo
$bar = &$foo; // Referencia $foo vía $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $foo; // $foo también se modifica.
echo $bar;
?>
Estodarácomoresultadolavisualizacióndosvecesdelstring"MinombreesBob".Algocomo:
MinombreesBobMinombreesBob
Nota:TenemosunvideotutorialquenoshabladelasvariablesPHP
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen30/10/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 38 de 142
CambiodeltipodelasvariablesenPHP
FormasenqueunavariabledePHPpuedevervariadosutipo.
EnelartículoanteriordelManualdePHPcomenzamosaexplicarcómosetrabajaconvariablesenestelenguaje.YacomentamosquePHPtieneuntipadodinámico,perohayalgunascosasquepuedesnecesitarhacereneldíaadíayquedebessaberparacubrirelconocimientofundamentaldevariablesytiposdedatosenPHP.
PHPnorequierequeindiquemoseltipoquevaacontenerunavariable,sinoquelodeducedelvalorqueasignemosalavariable.Asimismo,seencargadeactualizarautomáticamenteeltipodelavariablecadavezqueleasignamosunnuevovalor.Estoesbásicamenteloquesellama"tipadodinámico"o"tipadodébil",característicanosólodePHP,sinodemuchosotroslenguajescomoJavascript.
Porello,paracambiareltipodeunavariablesimplementeleasignamosunvalorconunnuevotipo.
$cadena = 'esto es una cadena';
$cadena = 34 //La variable $cadena cambió de tipo
Nota:SeexcluyenenestecasoelcambiodevariablesatipoArrayporquelasintaxispuederesultarambiguaalexpresaresecódigo,esdecir,puededarseelcasodequeunalíneadecódigopuedasignificardoscosas.
$a = "1";
//$a es una cadena
$a[0] = "f";
//¿Estamos editando el índice de la cadena o forzando a array?
Enesteartículoveremosdostiposposiblesdealteracióndeltipodevariables,másalládelpropioquehacePHPconelcomportamientoderivadodesutipadodinámico.Aestaoperaciónselaconocehabitualmentecomo"Forzado".
Forzado
Variareltipodedatosquecontieneunavariableconeltiempoesunacosaquenosiempreesaconsejable,porquesinotenemoscertezadesiunavariablecontieneundatodeuntipouotro,aveceslosresultadosobtenidospuedennoserlosesperados.
Paraevitarproblemasenmuchasocasionespuedevenirbienrealizarelforzadodeunavariableauntipoenconcreto,demaneraexplícita,loquenospermitirásaberquecuandollegaelflujodelprogramaaunpuntodado,aquellavariabletendráeltipodedatosesperado.EnPHPexistendiversasmanerasdeforzarunavariableauntipo.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 39 de 142
Establecereltipoconsettype()
Podemosforzarunavariableparaquecambiedetipoconlafunciónsettype().
settype($variable,"nuevo_tipo");
lafunciónsetType()actualizaeltipode$variablea"nuevo_tipo"ydevuelveunboleanoindicandosihuboéxitoonoenlaconversión.
Entre"nuevo_tipo"tenemos:
"integer""double""string""array""object"
Castingdevariables
Hayotramaneraderealizarunforzado,paraqueunavariablesecomportecomountipodeterminado.AhoravamosaverotromecanismodeforzadoqueessimilaraldeotroslenguajescomoCoJava.
$variable = "23";
$variable = (int) $variable;
Losforzadospermitidosson:
(int),(integer)-fuerzaaentero(integer)(real),(double),(float)-fuerzaanúmerocondecimales(comaflotante)(string)-fuerzaacadena(string)(array)-fuerzaaarray(array)(object)-fuerzaaobjeto(object)(unser)-fuerzaanull(binary)-fuerzaa"binarystring"
Conclusión
SiestáscomenzandoconPHPylaprogramaciónengeneral,quizásestetemadelcambiodetipoyelforzadopuedeparecerunainformaciónuntantoavanzadaosinunaaplicaciónclara.Siesasínotepreocupesdemasiadoporahora,perotenpresentequetúcomoprogramadorerescapazdecambiarlostiposdelasvariables,paraquetusprogramashaganexactamenteloquetúdeseas.
CuandohayunaincongruenciadetiposPHPsiempreintentahacerlomásadecuadoconelcódigoqueejecuta,peronosiemprelasoluciónqueéltomaeslaquetúpudieraspensar.En
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 40 de 142
esoscasos,elforzadoserárealmenteimportante.Sindudacuandotengasmásexperienciaconellenguajeestassituacionesiránapareciendo.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen01/12/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ÁmbitodelasvariablesenPHP
ExplicamoscondetalleelámbitodeexistenciadeunavariableenPHPydistinguimosentrevariablesglobalesylocales.
Encualquierlenguajedeprogramaciónlasvariablestienenunámbito,queesellugarolugaresdondetienenvalidez.Elámbitovaríaenfuncióndedondesehayancreadoesasvariables,pudiendoserglobalesolocales.
EnPHP,todaslasvariablescreadasenlapágina,fueradefunciones,sonvariablesglobalesalapágina.Porsuparte,lasvariablescreadasdentrodeunafunciónsonvariableslocalesaesafunción.
Lasvariablesglobalessepuedenaccederencualquierlugardelapágina,mientrasquelasvariableslocalessólotienenvalidezdentrodelafuncióndondehansidocreadas.Demodoqueunavariablegloballapodemosaccederdentrodecualquierpartedelcódigo,mientrasquesiintentamosaccederaunavariablelocalfueradelafuncióndondefuecreada,nosencontraremosconqueesavariablenotienecontenidoalguno.
Ahorabien,siintentamosaccederaunavariableglobaldentrodeunafunción,enprincipiotambiénnosencontraremosconquenosetieneaccesoasuvalor.EstoesasíenPHPpormotivosdeclaridaddelcódigo,paraevitarquesepuedaprestaraconfusiónelhechodeusardentrodeunafunciónunavariablequenohasidodeclaradaporningúnsitiocercano.
Nota:talvezresultendesconocidoslosconceptossobrefunciones,quesetratanmásadelanteenestemanual:funcionesenPHP
Entonces,siqueremosutilizarunavariableglobalalapáginadentrodeunafunción,tenemosqueespecificardealgunamaneraqueesavariablequevamosautilizaresunaglobal.ExistenenPHPunpardemanerasdeutilizarvariablesglobalesalapáginadentrodeunafunción.Sonlassiguientes:
MatrizGLOBALS
ExisteunarrayenPHPllamado$GLOBALS,queguardaunareferenciaatodaslasvariablescreadasdemaneraglobalalapágina.Esunamatrizoarrayasociativo,delosqueenlugarde
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 41 de 142
índicesnuméricosutilizaníndicesdetexto,dondecadaíndiceeselnombrequehemosdadoalavariableycadavaloreselcontenidodecadavariable.
Supongamosquetenemosestadeclaracióndevariablesglobalesalapágina,esdecir,fueradecualquierfunción:
$mivariable = "pepe";
$otravariable = 1234;
Siqueremosaccederaesasvariablesdentrodeunafunciónutilizandoelarray$GLOBALStendríamosestecódigo:
function mifuncion(){
//estoy dentro de la función, para aceder a las variables utilizo $GLOBALS
echo $GLOBALS["mivariable"];
echo $GLOBALS["otravariable"];
}
Comosepuedever,seaccedealcontenidodelasvariablesglobalesconelarray$GLOBALS,utilizandocomoíndicesdelamatrizlosnombresdevariablesquedeseamosmostrar.
Estoimprimiríaporpantallaeltexto"pepe1234",elvalordelasdosvariablesunodetrásdelotro.
Declaracióndeusodevariablesglobalesdentrodeunafunción
Otracosaquepodemoshacerparaaccederavariablesglobalesdentrodeunafunciónesespecificaralcomienzodedichafunciónlalistadevariablesquevamosautilizardentro.Paraespecificaresasvariablesutilizamoslapalabra"global"seguidadelalistadevariablesquesevanautilizardelentornoglobal.
function mifuncion(){
global $mivariable, $otravariable;
//con esa línea dentro de la función, declaramos el uso de variables globales
echo $mivariable;
echo $otravariable;
}
Comovemos,con"global"seespecificaquevamosautilizarunasvariablesquefuerondeclaradascomoglobalesalapágina.Unavezhechoesto,yapodemosaccederaesasvariablesglobalescomosiestuvierandeclaradasdentrodelafunción.
Cualquieralteraciónquehagamosalasvariablesdentrodelafunciónpermanecerácuandosehayasalidodelafunción,tantosiaccedemosatravésdelarray$GLOBALSodeclarandocon"global"elusodeesasvariables.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 42 de 142
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen25/04/2006Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
VariablesdesistemaenPHP
Quésonyparaquésirvenestasvariablesdelservidor.Comentamosalgunasdelasmásútiles.
EnlosanterioresartículosdelManualdePHPhemosabordadoeltemadelasvariables.Hastaahorahemosexplicadocómocrearnuestraspropiasvariablesyalmacenarvalores,perosihablamosdevariablesenPHPnopodemosdejardemencionaralasvariablesdesistema.
ParaentenderlasvariablesdesistematienesqueapreciarquePHPesunlenguajequeseejecutaenelservidor,bajodemandadeuncliente.Portanto,laejecucióndePHPseproducedentrodeunmarcomuyconcreto,dondeintervienenvariosactores,principalmenteelcliente(generalmenteelusuarioqueentrausandosunavegador)yelservidor(dondeseejecutaelcódigoPHP,quebásicamentedebeproducirlasalidaqueseenviaráalcliente).
AhoraquehasasimiladolanaturalezadePHPcomolenguajedeladoservidor,debesdeentenderqueenesemarcoexistendiversasinformacionesquepuedenserútilesalahoradeejecutaraplicacionesweb.DentrodeunapáginaPHPtendremosportantoaccesoatodaunaseriedevariablesquenosinformansobrenuestroservidorysobreelclientequehasolicitadounadeterminadapágina.Aestasinformaciones,quepodemosrecogerenformadevariables,lesllamamos"variablesdesistema".
Nota:Lainformacióndeestasvariablesesatribuidaporelservidoryenningúncasonosesposiblemodificarsusvaloresdirectamentemedianteelscript.Parahacerloesnecesarioinfluirdirectamentesobrelapropiedadquedefinen.
$_SERVER
Lamayoríadelasvariablesdesistemalaspodemosrecibirapartirdeunarraydenominado$_SERVER.
Nota:$_SERVEResunarrayasociativo,cuyosíndicessoncadenasdetextoynonúmeros.AúnnohemosabordadoeltemadearraysenPHP,peroloveremoscondetallamásadelante.
Técnicamente$_SERVERseconocecomouna"variablesuperglobal",delaquehablaremosenestemismoartículounpocodespués.Existenmultituddedatosasociadosalarray$_SERVER,algunossinutilidadaparenteyotrosrealmenteinteresantesyconunaaplicacióndirectapara
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 43 de 142
nuestrasaplicacionesweb.Aquíosenumeramosalgunasdeestasvariablesylainformaciónquenosaportan:
$_SERVER["HTTP_USER_AGENT"]Nosinformaprincipalmentesobreelsistemaoperativoytipoyversióndenavegadorutilizadoporelinternauta.Suprincipalutilidadradicaenque,apartirdeestainformación,podemosredireccionarnuestrosusuarioshaciapáginasoptimizadasparasunavegadororealizarcualquierotrotipodeacciónenelcontextodeunnavegadordeterminado.$_SERVER["HTTP_ACCEPT_LANGUAGE"]Nosdevuelvelaolasabreviacionesdelalenguaconsideradacomoprincipalporelnavegador.Estalenguaolenguasprincipalespuedenserelegidasenelmenúdeopcionesdelnavegador.Estavariableresultatambiénextremadamenteútilparaenviaralinternautaalaspáginasescritasensulengua,siesqueexisten.$_SERVER["HTTP_REFERER"]NosindicalaURLdesdelacualelinternautahatenidoaccesoalapágina.Muyinteresanteparagenerarbotonesde"Atrás"dinámicosoparacrearnuestrospropiossistemasdeestadísticasdevisitas.$_SERVER["PHP_SELF"]NosdevuelveunacadenaconlaURLdelscriptqueestásiendoejecutado.Muyinteresanteparacrearbotonespararecargarlapágina.$_SERVER["HTTP_GET_VARS"]SetratadeunarrayquealmacenalosnombresycontenidosdelasvariablesenviadasalscriptporURLoporformulariosGET.$_SERVER["HTTP_POST_VARS"]SetratadeunarrayquealmacenalosnombresycontenidosdelasvariablesenviadasalscriptpormediodeunformularioPOST.$_SERVER["HTTP_COOKIE_VARS"]Setratadeunarrayquealmacenalosnombresycontenidosdelascookies.Veremosquésonmásadelante.$_SERVER["PHP_AUTH_USER"]Almacenalavariableusuariocuandoseefectúalaentradaapáginasdeaccesorestringido.Combinadocon$_SERVER["PHP_AUTH_PW"]resultaidealparacontrolarelaccesoalaspáginasinternasdelsitio.$_SERVER["PHP_AUTH_PW"]Almacenalavariablepasswordcuandoseefectúalaentradaapáginasdeaccesorestringido.Combinadocon$_SERVER["PHP_AUTH_USER"]resultaidealparacontrolarelaccesoalaspáginasinternasdelsitio.$_SERVER["REMOTE_ADDR"]MuestraladirecciónIPdelvisitante.$_SERVER["DOCUMENT_ROOT"]Nosdevuelveelpathfísicoenelqueseencuentraalojadalapáginaenelservidor.$_SERVER["PHPSESSID"]Guardaelidentificadordesesióndelusuario.Veremosmásadelanteenquéconsistenlassesiones.
Notodasestasvariablesestándisponiblesenlatotalidaddeservidoresoendeterminadasversionesdeunmismoservidor.además,algunasdeellashandeserpreviamenteactivadasodefinidaspormediodealgúnacontecimiento.Así,porejemplo,lavariable$HTTP_REFERERnotendráunvalordefinido,amenosqueelinternautaaccedaalscriptapartirdeunenlacedesdeotrapágina.
Siquieresvercuáleselconjuntocompletodelasvariablesdelsistemaquedisponesdentrode$_SERVERentuentorno,essuficienteconescribiryejecutarunapáginaPHPquecontengaestecódigo:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 44 de 142
<?php
var_dump($_SERVER);
?>
Esorealizaráunlistadodetodoelcontenidodelarrayasociativo$_SERVERylomostrarácomosalidaenlapáginaweb.
Variablessuperglobales
ApartirdePHP4.1.0,sedisponedeunconjuntodevariablesdetipoarrayquemantieneninformacióndelsistema,llamadas"superglobales"porquesedefinenautomáticamenteenunámbitoglobalyalasquesepuedeaccederdesdecualquierpuntodelcódigoPHP.
Nota:EstasvariablesyaexistíananteriormenteenPHP,aunqueseaccedíandesdeotrosarrays.SileesartículosantiguosdePHP,oyaconocesPHPdesdehacemuchotiempo,tepuedeaclararquealgunasdeestasvariablessuperglobalesseaccedíanaccedíanantespormediodelosarraysdeltipo$HTTP_*_VARS.Porejemplo$_GETantesera$HTTP_GET_VARSo$_POSTeraantes$HTTP_POST_VARS.Laformaantiguadereferenciaalasvariablessuperglobalestodavíasepuedeactivarenalgunosservidores,desdeelphp.iniconladirectivaregister_long_arrays.
LalistadeestasvariablessuperglobalesdePHPeslasiguiente:
$GLOBALS
Contieneunareferenciaacadavariabledisponibleenelespectrodelasvariablesdelscript.Lasllavesdeestamatriz(índicesdelarray)sonlosnombresdelasvariablesglobales.$GLOBALSexistedesePHP3.
$_SERVER
Variablesdefinidasporelservidorwebódirectamenterelacionadasconelentornoendonelscriptseestaejecutando.Esequivalentealoqueantesseconocíacomo$HTTP_SERVER_VARS.Sonlasvariablesdesistemaquehemosexplicadoantesenesteartículo.
$_GET
VariablesproporcionadasalscriptpormediodeHTTPGET.Esequivalentealoqueantesseconocíacomo$HTTP_GET_VARS.
$_POST
VariablesproporcionadasalscriptpormediodeHTTPPOST.Esequivalentealoqueantesseconocíacomo$HTTP_POST_VARS.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 45 de 142
$_COOKIE
VariablesproporcionadasalscriptpormediodeHTTPcookies.Esequivalentealoqueantesseconocíacomo$HTTP_COOKIE_VARS.
$_FILES
VariablesproporcionadasalscriptpormediodelasubidadeficherosviaHTTP.Esequivalentealoqueantesseconocíacomo$HTTP_POST_FILES.
$_ENV
Variablesproporcionadasalscriptpormediodelentorno.Esequivalentealoqueantesseconocíacomo$HTTP_ENV_VARS.
$_REQUEST
Variablesproporcionadasalscriptpormediodecualquiermecanismodeentradadelusuario.Lapresenciayelordenenqueaparecenlasvariablesenestamatrizesdefinidoporladirectivadeconfiguraciónvariables_order.EstamatriznotieneunanálogoenversionesanterioresaPHP4.1.0.
Nota:Comoen$_REQUESTsepuedenmezclarvariablesquepuedenvenirdevarioslugares,nosuelesermuyrecomendableusarla,porquenospuedeninyectardatosdediversasmaneras.Silosdatossabemosquenosllegandeunformulariolosuyoesusar$_POST,quenosaseguraqueningunaentradaporotrolugarnoscontaminaráeseconjuntodevariables.Solopodríasconfiaren$_REQUESTsilaoperaciónquequieresrealizaresrealmentepococríticaparalaseguridaddetuaplicación.
$_SESSION
Variablesregistradasenlasesióndelscript.Esequivalentealoqueantesseconocíacomo$HTTP_SESSION_VARS.VeatambiénlasecciónFuncionesparaelmanejodesessionesparamásinformación.
Conclusión
Demomentodejamosesteconocimientoenelaire.Abordaremoscadaunadeestasvariablessuperglobalesenelfuturo,endiversaspartesdelmanual.Porejemplo$_SESSIONloveremoscuandohablemosdelasesiónenPHP,$_POSTcuandoseexpliqueelenvíodeformularios,etc.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 46 de 142
Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
OperadoresenPHP
Listadescriptivadelosoperadoresmásfrecuentementeutilizados
ParaavanzarnuestroconocimientoenellenguajePHPtenemosquedetenernosaexplicarlosoperadores,quesonlossímbolosquenospermitenexpresartodotipodeoperacionesentredatos.
Cuandoseestudiaunlenguajedeprogramación,aprenderlosoperadoresesalgoquegeneralmenterealizassobrelamarcha,esdecir,amedidaquevashaciendoejemplosvasaplicandooperadoresysumemorizaciónesalgoquesurgedemaneranatural,sintenerquerealizarmuchosesfuerzos.
Esportanto,queenelManualdePHPnosvamosadeteneracomentarcuálessonlosoperadoresenPHP,perolasprácticasvendránpocoapocoalolargodesucesivosartículos.Nopretendasmemorizarlostodos,simplementetenlosencuentayvuelveaquímásadelantepararefrescarelconocimiento.
TambiénadvertimosquelosoperadoresenPHPsonmásricosdeloquesevaaverenesteartículo,esdecir,existenmásoperadoresquenovamosaincluirenesteartículo.Sinembargo,hayqueaclararqueenel99.9%delasocasionesqueusasoperadoresseránsiemprelosquevamosaconoceracontinuación.
Quésonoperadores
Unoperadornospermiterealizarunaoperaciónentreunoomásvalores.Eloperadortomaesosvaloresdeentradaylosrelacionaentresi,realizandounaoperaciónyaplicandootrovalorcomoresultado.Paraentendernos,operadoressonlossímbolosqueusamosenlasmatemáticasparaexpresarcuentasconnúmeros,comolossímbolosquenosindicanciertasoperaciones:suma,resta,multiplicación,división...
Enunlenguajedeprogramaciónlosvaloresquevamosarelacionarmedianteoperadorespuedenestarcontenidosenvariables,oescritosenelpropiocódigo.Losoperadorestomanesosvaloresylosmodificangenerandonuevosvalores.Avecessonconocidasoperacionesmatemáticas,peroavecessonoperacioneslógicasodeasignación,porponervariosejemplos.
OperadoresenPHPportiposdeoperaciones
Enloscapítulosanterioresyahemosutilizadoennuestrosejemplosalgunosoperadores.Ahoralesvamosaponernombres,agrupadosatendiendoaltipodeoperaciónquerealizan.
Operadoresaritméticos
Nospermitenrealizaroperacionesnuméricasconnuestrasvariables.Sonlosmásfácilesdeasimilar,porquegeneralmentetodosconocemosesasoperaciones.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 47 de 142
+Suma-Resta*Multiplicación/División%Módulo(restodeladivisión)**Exponenciación(2**3,elevar2laatercerapotencia)
Nota:Eloperadoraritméticoquepuederesultarmásdesconocidoparaloslectoreseseloperador%.Explicamosconmayordetenimientosufuncionamientoyunejemploenelqueesútileneltaller:ListasdeelementosconcoloresalternosenPHP.
Operadoresdeasignación
Losoperadoresdeasignaciónsonlosmáshabitualesynospermitentraspasarvaloresenvariables.Asignareselprocesoporelcualcolocamosunvalorenunavariable.
=Asignación
Enelpasadoyahabíamoscreadovariablesyasignadovalores,porloquelodebesdereconocer.Lousamosasí:
$valor = 'Esto es lo que se va a asignar a la variable';
Además,enlaasignaciónpodríadarseelcasoqueelvaloraasignarfueseelresultadoderealizarunaoperación.
$a = 23;
$b = 3;
$c = $a - $b;
Nota:Despuésdelaejecucióndeesecódigo¿Cuálseráelvalordelavariable$c?.Seguroquededuceselvalor20.Siesasíestásenlocierto.Elresultadodelaoperaciónde$a(quevale23)menos$b(quevale3)esiguala20,queseasignatodoseguidoalavariable$c.Loquehasvistocomovaloraasignara$c($a-$b)esloqueseconocecomounaexpresión.Antesdeasignarserealizaelcómputodelaexpresiónyluegoseasignaelvalor.
Comohaspodidover,asignaresunaoperaciónbiensimple,loqueestáaladerechadeloperadorseasignaalavariablequeestáalaizquierda.Notienemás.Sinembargo,PHPincluyeunaseriedeoperadoresdeasignaciónconunaoperaciónasociada,quenospermitenrealizaresaoperaciónyunaasignaciónenunúnicopaso.
+=Sumayasignación
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 48 de 142
-=Restayasignación*=Multiplicaciónyasignación/=Divisiónyasignación%=Móduloyasignación.=Concatenaciónyasignación
$x = 5;
$x += 5; //$x valdrá 10
$cadena = "Hola ";
$cadena .= "mundo"; //$cadena ahora vale "hola mundo"
Nota:Miramásabajo"operacionessobrecadenas"paraentenderlaconcatenación.
Operadoresdecomparación
Seutilizanprincipalmenteennuestrascondicionesparacomparardosvariablesyverificarsicumpleonolapropiedaddeloperador.
==Compruebasisoniguales!=Compruebasisondistintos===Compruebasisonigualesydeexactamenteelmismotipo!==Compruebasisondistintosodedistintotipo<>Diferente(igualque!=)<Menorqué,compruebasiunvaloresmenorqueotro>Mayórqué<=< code=""> Menor o igual>=Mayoroigual<=>Comparadordeorden.(PHP7)??unooelotro(PHP7)
Enesteconjuntodeoperadoresdecomparaciónencontramosvariosoperadoresnuevos,incorporadosenPHP7.Losestudiaremosaparte.Perolosquemásseutilizansonlosotros,querealmentesonbastantesencillosdeaprender,aunqueparaverejemplosinteresantestenemosqueentenderlasestructurasdecontrol.
Vamosaadelantarnosunpoco,presentandoaquíuncódigoenelqueusamoslaestructuradecontrolcondicionaldePHP,quenosserviráparacompararvaloresdadosenunaexpresiónyhacercosascuandocumplaonociertacondición.
$a = 20;
$b = 30;
if($a < $b) {
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 49 de 142
echo '$a es menor que $b';
}
Ejecutandoesecódigoobtendremoslasalida"$aesmenorque$b",porquelaoperacióndecomparaciónserealizóysuresultadofueafirmativo.
Esinteresante,aunqueincidiremosmásadelante,laexistenciadelosoperadores===y!==quenosolocompruebansialgoesigualaotracosa,sinoqueademástienenencuentalostiposdelasvariables.Miraprimeroestecódigo:
$a = 20;
$b = "20";
if($a == $b) {
echo '$a es igual que $b'; // (sin tener en cuenta los tipos)
}
ComoresultadodeejecuciónPHPnosdirá"$aesigualque$b".Estoesporquelaoperacióndecomparaciónrealizadaconeloperador==notieneencuentalostiposdelasvariables.ParaPHP20y"20"eslomismo.Sinembargo,ahoramiraelsiguientecódigo:
$a = 20;
$b = "20";
if($a === $b) {
echo '$a es igual que $b, y del mismo tipo';
} else {
echo '$a es distinto que $b, o de distinto tipo';
}
Alejecutaresecódigoobtendremoslasalida"$aesdistintoque$b,odedistintotipo".Porquealusareloperador===síleestamospidiendoaPHPquetengaencuentalostiposparadecirnossialgoesigualaotracosa.
Nota:Puedessabermássobrelaestructura"if"enelartículosobrelaestructuracondicionaldePHP.
Operadoreslógicos
Losoperadoreslógicossirvenpararealizaroperacioneslógicas,valgalaredundancia.Sonoperacionesquealfinalvanadevolverun"sí"oun"no",positivoonegativo.Seusanencombinaciónconlosoperadoresdecomparacióncuandolaexpresióndelacondiciónlorequiere.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 50 de 142
andOperaciónlógica"y",seráverdaderosiambossonverdaderos.orOperaciónlógica"o",seráverdaderosiunodeellosesverdaderoxorOperaciónlógica"xor",seráverdaderosiunodeellosesverdadero,peronoambos.!Operacióndenegación,sieraverdaderopasaafalsoyviceversa.&&Operaciónlógica"y"||Operaciónlógica"o"
Losoperadoreslógicostambiénseusangeneralmenteenexpresionesquevasausarparaevaluarenestructurasdecontrol.Suoperacióntienesentidogeneralmentecuandotrabajamosconvaloresboleanos(síono)oexpresionesqueunavezevaluadasproducenvaloresboleanos.
$a = true;
$b = false;
if($a && $b) {
echo '$a y $b son los dos verdaderos';
} else {
echo 'o uno de $a o $b son falsos, o los dos son falsos';
}
Esecódigonosdiráque"ounode$ao$bsonfalsos,olosdossonfalsos".
Nota:PuedeparecercuriosoqueenPHPhayadosoperadoresquesirvenparalaoperaciónlógica"y"ydosparalaexpresiónlógica"o".Dehechoesbastanteextraño.Elmotivoesquecadaoperadortieneunaprecendenciadeoperadoresdistinta.
Operadoresdeincremento
Sirvenparaaumentarodisminuirenunaunidadelvalordeunavariable.Sonatajosparahacerunaoperacióntípicaenlosrecorridosdebucles,deaumentarodisminuirunvalorqueusamosparallevarlacuentadelasiteracionesrealizadas.
++$aPre-incremento$a++Post-incremento--$aPre-decremento$a--Post-decremento
Estosoperadoressoninteresantes,porquerealizandoscosas,igualquelosoperadoresdeasignacióncombinadaquevimosantes.Porunladoundecrementooincrementoyporotroladosedevuelvenellosmismoscomoresultadodeloperador.Locuriosoesqueexistenlos"pre"ylos"post"yesquefuncionandemaneraunpocodistinta.
Cuandotenemosunpre-incrementoopre-decremento,primeroserealizaelincremento/decrementoyluegosedevuelveesevalor.Conelpost-incrementoopost-decremento,primerosedevuelveelvalororiginalyluegoserealizaelincremento/decremento.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 51 de 142
Paraacabardeentenderloesmejorexaminarestecódigo:
$a = 3;
$b = ++$a;
echo "\$a vale $a y \$b vale $b"; //$a vale 4 y $b vale 4
$a = 3;
$b = $a++;
echo "\$a vale $a y \$b vale $b"; //$a vale 4 y $b vale 3
Enestecódigocomosalidaobtenemoscosasdistintasporelpre-incrementoyelpost-incremento.Lasalidaapareceallado,enelcomentario.Analízaloypodrásentendercómoesposible.
Operadoresdecadenas
Cuandotrabajamosconcadenasdecaracterestenemosunoperadorespecialqueeseldelaconcatenación.Sirveparaunirunacadenaalaotra.
.Concatenación
$saludo = "Hola ";
$nombre = "DesarrolloWeb.com";
$saludoCompleto = $saludo . $nombre; // vale "Hola DesarrolloWeb.com"
Precedenciadeoperadores
Cuandoseaprendeunleguajedeprogramacióndebemosprestaratenciónespecialalapredecenciadeoperadores,queesbásicamenteunconjuntodereglasyordenporelqueseiránevaluandolosoperadorescuandotrabajamosconexpresionesqueincluyenvariosdeellos.
Igualqueenlasmatemáticas,enocasiones,sihacemoslasoperacionesenunordenuotro,losvaloresfinalespuedentambiéntenercambios.Enlenguajesdeprogramación,dependiendodelordenenelqueseapliquenesosoperadores,lasexpresionespuedendarpiearesultadosdistintos.
Porejemplo,tomalaexpresión:2 * 3 + 10
Siseresuelveprimerolasumasería2*13=26.Siseresuelveprimerolamultiplicaciónsería6+10=16.
¿cuáldeesasdosopcionesserálaquePHPdaporválida?Laprecedenciadeoperadoressirveparaaclararesadudayquelosprogramadoressepanaprioricómoellenguajevaaresolverlasexpresiones,siendocapacesdeescribirlasdemodoquelasoluciónsealaqueellosesperaban.
Sinembargo,nosiemprelapredecenciadellenguajeeslaquenosotrosdeseamosquese
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 52 de 142
aplique.Parafacilitarlascosasexistenlosparéntesis,quenospermitendefinirnuestrasexpresionesmarcandoquéoperadoresdebenresolverseantes.Dichodeotromodo,siemprequeusemosparéntesisestaremosobligandoalcompiladoraresolverantesdeterminadasoperaciones,apesardelaprecedenciaqueéltengadefinidademanerapredeterminada.
Laexpresióndeantes,escritadeestemodo:(2 * 3) + 10notendríalugaradistintasinterpretaciones.Obviamente,debemosconocerlaprecedenciadeoperadoresparanodarlugaracasosdondeelintérpretedePHPpuedaobtenerresultadosnoesperados.Osino,estaremosobligadosausarsiempreparéntesis,produciendoexpresionesdecomplejidadsuperioralanecesaria.
Nota:Tambiénpuededarseelcasoque,aunquesepamosbienlapredecencia,colocarunosparéntesispuedeayudaralalegibilidaddelcódigo,dadoquecualquierlectorhumano,alverlosparéntesissabráinmediatamentequeesepedazodeexpresiónseevaluaráantes.
TerecomendamosleerladocumentacióndePHPparaaprendermássobrelaprecedenciayconsultarlatablacompleta,queesunpocolargacomoparareflejarlaaquí.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen12/12/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/operadores-php.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 53 de 142
Arraysycadenas
NosdetenemosparavercómosonlosarraysenPHP,laestructuradedatosmásesencialqueexiste.AdemásaprenderemosatrabajarconcadenasenPHP.
TablasoArraysenPHP
Creacióndetablaspormediodevariablestipoarray.UtilidaddelosarraysenlenguajesdeprogramaciónengeneralyenPHPenparticular,juntoconalgunasfuncionesrelacionadas.
Untipodevariablequeyahemosdescritoperopuedeserrelativamentecomplicadoaasimilar,conrespectoalamayoría,sonlosarrays.EnésteyotraseriedeartículosdelManualdePHPvamosaabordarquésonlosArraysycómousarlosenellenguajePHP.
Comohaspodidoentenderantes,unavariablegeneralmentealmacenaundato,yaseadetipocadena,numérico,etc.Bueno,puesunarrayescomounavariablecapazdealmacenarunconjuntodedatos.Tambiénlospodemosconocerconelnombrede"arreglo","tabla"o"matriz".
Dadoqueenarraysomoscapacesdealmacenarvarioselementos,esnecesarioelusodeuníndiceparapoderreferirnosacadaunodeellos.Eseíndiceavecesseconocecomo"clave".ExistenenPHParraysconíndicesnuméricos(losarraysmáscomunes)yconíndicesalfanuméricos(tambiénllamadosarraysasociativos,muyútiles,peromenoscomunes),queveremostambiénenesteartículo.
Arrayscomunes,índicesnuméricos
Encapítulosanterioresponíamoselejemplodeunarrayllamadosentidoqueconteníalosdistintossentidosdelserhumano:
$sentido[1]="ver";
$sentido[2]="tocar";
$sentido[3]="oir";
$sentido[4]="gustar";
$sentido[5]="oler";
Enestecasoestearraycatalogasuselementos,comúnmentellamadosvalores,pornúmeros.Losnúmerosdel1al5sonporlotantolasclavesylossentidos("tocar","oir"...)sonlosvaloresasociados.
Arraysasociativos
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 54 de 142
Silodeseamos,esposibleemplearnombres(cadenas)paraclasificarloselementosdelarray.Loúnicoquedeberemoshaceresentrecomillarlasllavesalfanuméricasyentoncestendremosunarrayasociativo:
$moneda["espana"]="Peseta";
$moneda["francia"]="Franco";
$moneda["usa"]="Dolar";
Otraformadedefiniridénticamenteestemismoarrayyquenospuedeayudarparalacreacióndearraysmáscomplejoseslasiguientesintaxis:
<?
$moneda=array("espana"=> "Peseta","francia" => "Franco","usa" => "Dolar");
?>
Arraysmultidimensionales
Unaformamuypracticadealmacenardatosesmediantelacreacióndearraysmultidimensionales(tablasomatricesconmásdeunadimensión).Pongamoselejemplosiguiente:Queremosalmacenardentrodeunamismatablaelnombre,monedaylenguahabladaencadapaís.Parahacerlopodemosemplearunarrayllamadopaísquevendrádefinidoporestastrescaracterísticas(claves).Paracrearlo,deberíamosescribirunaexpresióndelmismotipoquelavistaanteriormenteenlaquemeteremosunaarraydentrodelotro.Esteprocesodeincluirunainstrucciondentrodeotrasellamaanidaryesmuycorrienteenprogramación:
<?
$pais=array
(
"espana" =>array
(
"nombre"=>"España",
"lengua"=>"Castellano",
"moneda"=>"Peseta"
),
"francia" =>array
(
"nombre"=>"Francia",
"lengua"=>"Francés",
"moneda"=>"Franco"
)
);
echo $pais["espana"]["moneda"] //Saca en pantalla: "Peseta"
?>
Antesdeentrareneldetalledeestepequeñoscript,comentemosalgunospuntosreferentesalasintaxis.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 55 de 142
Comopuedeverse,enestasecuenciadescript,nohemosintroducidopuntoycoma";"alfinaldecadalínea.Estoessimplementedebidoaqueloquehemosescritopuedeserconsideradocomounasolainstrucción.Enrealidad,somosnosotrosquienesdecidimoscortarlaenvariaslíneaspara,así,facilitarsulectura.Laverdaderainstrucciónacabaríaunavezdefinidocompletamenteelarrayyesprecisamenteahídondehemoscolocadoelúnicopuntoycoma.Porotraparte,podéisobservarcómohemosjugadoconeltabuladorparaseparardelladoizquierdo(indentar)unaslíneasmásqueotras.Estotambiénlohacemosporcuestionesdeclaridad,yaquenospermiteverquépartesdelcódigoestánincluidasdentrodeotras.Esimportanteacostumbrarseaescribirdeestaformadelmismomodoqueaintroducirloscomentariosyaquelaclaridaddelosscriptsesfundamentalalahoradedepurarlos.Unpocodeesfuerzoalahoradecrearlospuedeahorrarnosmuchashorasalahoradecorregirlosomodificarlosmesesmástarde.
Pasandoyaalcomentariodelprograma,comopodéisver,éstenospermitealmacenartablasy,apartirdeunasimplepetición,visualizarlasundeterminadovalorenpantalla.
Lautilidaddelosarraysenlenguajesdeprogramaciónesenorme.Conellosseresuelventodotipodenecesidades:contarconestructurasdedatosquenospermitanrealizardeterminadostiposdeaccionesyrealizaralgoritmoscapacesderesolverdeunamaneraelegantelamásvariadagamadeprocedimientos.
FuncionesdeArrayenPHP
PHPincluyeunnutridoconjuntodefuncionesparatrabajarconArrays.Enellasnospodemosapoyarpararealizartodaunaseriedeoperacionestípicascomoordenarelementosporordenalfabéticodirectooinverso,porclaves,contarelnumerodeelementosquecomponenelarrayademásdepodermovernospordentrodeélhaciadelanteoatrás.
MuchassonlasfuncionespropuestasporPHPparaeltratamientodearrays,novamosaentraraquíenunadescripcióndelasmismas.Sóloincluiremosestapequeñatablaquepuedesercomplementada,sinecesario,conladocumentaciónqueyahemosmencionado.
Degranutilidadestambiénelbucleforeachquerecorredeformasecuencialelarraydeprincipioafin.
ParacomplementarestainformaciónresultarádegraninteréselartículoTrabajocontablasoarraysenPHPyparalosqueprefieranlaformaciónenvídeo,recomendamosverlosvideotutorialessobrelosarraysenPHP.Másadelante,cuandoleassobrelasestructurasde
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 56 de 142
controlenelManualdePHP,tambiénencontrarásdiversosejemplosderecorridosaarrays.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen12/12/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/arrays-en-php.html
TrabajocontablasoarraysenPHP
Vemosalgunasdelasfuncionestípicasdeltrabajoconarraysatravésdeunapequeñaexplicaciónyuncódigodeejemplodeuso.
Enelartículoanterior,sobreArraysenPHP,explicamoscómoeralasintaxisparalacreacióndeestetipodeestructurasdedatosenPHP.Ahoraqueyasabescómocreararrays,tantoconíndicesnuméricoscomoconíndicesasociativos,vamosavervariosejemplosdetrabajoenPHPqueilustraránunpocoelfuncionamientodealgunasdelasfuncionesdearrays(arreglos,vectores,matricesotablasencastellano).
EsteartículoademásteserviráparaconoceryaprenderausaralgunasdelasfuncionesmásútilesquetraeconsigoPHPparaeltrabajoymanipulacióndearrays.Tenemosqueadvertirque,siestáscomenzandoconPHPleyendoelManualdePHPdeDesarrolloWeb.com,algunosdelosejemplosverásquetienencódigoconelementosdellenguajequenohemostocadotodavía,comolasestructurasdecontrolparahacerbuclesconlosquerecorrerloselementosdeunarreglo.Esperamosquenotedespiste.Recuerdaquemásadelanteenestemanualpodrásencontrarexplicacionessobretodoello.Dichoeso,vamossinmásaintroducirnosenmateriaconvariosejemplosinteresantes.
Losejemplosquepodrásencontrarestándivididosendossecciones,aumentarelnúmerodeposicionesdeunarrayoreducirelnúmerodecasillasdisponibles.
Reducireltamañodeunarray
Conlassiguientesfuncionesconsiguesquitarelementosenunarray.Veremoscómoretirarcasillasdearraysdetresmanerasdistintas,perorecuerdaquetienesmuchasmásalternativassileesladocumentacióndefuncionesparatrabajoconArrays.
array_slice()
Paradisminuirelnúmerodecasillasdeunarreglotenemosvariasfunciones.Entreellas,array_slice()lautilizamoscuandoqueremosrecortaralgunascasillasdelarreglo,sabiendolosíndicesdelascasillasquedeseamosconservar.
Recibetresparámetros.Elarray,elíndicedelprimerelementoyelnúmerodeelementosatomar,siendoesteúltimoparámetroopcional.
Enelejemplosiguientetenemosunarrayconcuatronombrespropios.Enlaprimeraejecucióndearray_slice()estamosindicandoquedeseamostomartodosloselementosdesdeelíndice0
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 57 de 142
(elprincipio)hastaunnúmerototalde3elementos.
Elsegundoarray_slice()indicaquesetomentodosloselementosapartirdelíndice1(segundacasilla).
<?php
$entrada = array ("Miguel", "Pepe", "Juan", "Julio", "Pablo");
//modifico el tamaño
$salida = array_slice ($entrada, 0, 3);
//muestro el array
foreach ($salida as $actual)
echo $actual . "<br>";
echo "<p>";
//modifico otra vez
$salida = array_slice ($salida, 1);
//muestro el array
foreach ($salida as $actual)
echo $actual . "<br>";
?>
Tendrácomosalida:
MiguelPepeJuan
PepeJuan
array_shift()
Estafunciónextraeelelprimerelementodelarrayylodevuelve.Además,acortalalongituddelarrayeliminandoelelementoqueestabaenlaprimeracasilla.Siemprehacelomismo,portanto,norecibirámásqueelarrayalquesedeseaeliminarlaprimeraposición.
Enelcódigosiguientesetieneelmismovectorconnombrespropiosyseejecutadosveceslafunciónarray_shift()eliminandounelementoencadaocasión.Seimprimenlosvaloresquedevuelvelafunciónyloselementosdelarrayresultantedeeliminarlaprimeracasilla.
<?php
$entrada = array ("Miguel", "Pepe", "Juan", "Julio", "Pablo");
//quito la primera casilla
$salida = array_shift ($entrada);
//muestro el array
echo "La función devuelve: " . $salida . "<br>";
foreach ($entrada as $actual)
echo $actual . "<br>";
echo "<p>";
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 58 de 142
//quito la primera casilla, que ahora sería la segunda del array original
$salida = array_shift ($entrada);
echo "La función devuelve: " . $salida . "<br>";
//muestro el array
foreach ($entrada as $actual)
echo $actual . "<br>";
?>
Dacomoresultado:
Lafuncióndevuelve:MiguelPepeJuanJulioPablo
Lafuncióndevuelve:PepeJuanJulioPablo
unset()
Seutilizaparadestruirunavariabledada.Enelcasodelosarreglos,sepuedeutilizarparaeliminarunacasilladeunarrayasociativo(losquenotieneníndicesnuméricossinoquesuíndiceesunacadenadecaracteres).
Veamoselsiguientecódigoparaconocercómodefinirunarrayasociativoyeliminarluegounadesuscasillas.
<?php
$estadios_futbol = array("Barcelona"=> "Nou Camp","Real Madrid" => "Santiago Bernabeu","Valencia" => "Mestalla","Real Sociedad" => "Anoeta");
//mostramos los estadios
foreach ($estadios_futbol as $indice=>$actual)
echo $indice . " -- " . $actual . "<br>";
echo "<p>";
//eliminamos el estadio asociado al real madrid
unset ($estadios_futbol["Real Madrid"]);
//mostramos los estadios otra vez
foreach ($estadios_futbol as $indice=>$actual)
echo $indice . " -- " . $actual . "<br>";
?>
Lasalidaserálasiguiente:
Barcelona--NouCampRealMadrid--SantiagoBernabeuValencia--MestallaRealSociedad--Anoeta
Barcelona--NouCampValencia--MestallaRealSociedad--Anoeta
Aumentareltamañodeunarray
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 59 de 142
Tenemostambiénanuestradisposiciónvariasfuncionesquenospuedenayudaraaumentarelnúmerodecasillasdeunarreglo.
array_push()
Insertaalfinaldelarrayunaseriedecasillasqueseleindiquenporparámetro.Portanto,elnúmerodecasillasdelarrayaumentaráentantoselementoscomosehayanindicadoenelparámetrodelafunción.Devuelveelnúmerodecasillasdelarrayresultante.
Veamosestecódigodondesecreaunarregloyseañadenluegotresnuevosvalores.
<?php
$tabla = array ("Lagartija", "Araña", "Perro", "Gato", "Ratón");
//aumentamos el tamaño del array
array_push($tabla, "Gorrión", "Paloma", "Oso");
foreach ($tabla as $actual)
echo $actual . "<br>";
?>
Dacomoresultadoestasalida:
LagartijaArañaPerroGatoRatónGorriónPalomaOso
array_merge()
Ahoravamosavercómounirdosarraysutilizandolafunciónarray_merge().Aéstaselepasandosomásarraysporparámetroydevuelveunarreglocontodosloscamposdelosvectorespasados.
Enestecódigodeejemplocreamostresarraysyluegolosunimosconlafunciónarray_merge()
<?php
$tabla = array ("Lagartija", "Araña", "Perro", "Gato", "Ratón");
$tabla2 = array ("12","34","45","52","12");
$tabla3 = array ("Sauce","Pino","Naranjo","Chopo","Perro","34");
//aumentamos el tamaño del array
$resultado = array_merge($tabla, $tabla2, $tabla3);
foreach ($resultado as $actual)
echo $actual . "<br>";
?>
Dacomoresultado:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 60 de 142
LagartijaArañaPerroGatoRatón1234455212SaucePinoNaranjoChopoPerro34
Unaúltimacosa.Tambiénpuedenintroducirsenuevascasillasenunarregloporlosmétodoshabitualesdeasignarlasnuevasposicionesenelarrayalascasillasquenecesitemos.
Enarraysnormalesseharíaasí:
$tabla = array ("Sauce","Pino","Naranjo");
$tabla[3]="Algarrobo";
Enarraysasociativos:
$estadios_futbol = array("Valencia" => "Mestalla","Real Sociedad" => "Anoeta");
$estadios_futbol["Barcelona"]= "Nou Camp";
Veremosmásadelanteotrasposibilidadesdeltrabajoconarrays.
Referencia:eneltallerdePHPtenemosartículossobreeltrabajoconarraysenPHP.Entreotrosencontrarásunoquetratauntemadefrecuenteconsulta:losdistintostiposdeordenacióndearraysenPHP:OrdenararraysconPHP
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen09/10/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/funciones-para-trabajo-arrays-php.html
CadenasostringsenPHP
AspectosrelevantesdelascadenasostringsenPHP,untipodevariablesmuyutilizado.Listadecaracteresprotegidos.
Unodelostiposdedatosmáscorrientesenlamayoríadeloslenguajessonlosstrings.Tambiénpodremosconocerlasconelnombredecadenaso"cadenasdecaracteres".Nosonmásqueinformaciónquecontienetexto,concaracteresalfanuméricos,cualquiermezcladecaracteresalfabéticos,símbolosycaracteresnuméricos.
Pordecirloconotraspalabras,engeneral,cuandoguardamoscualquiertextoenunavariable,loqueestamosguardandotécnicamentesoncadenasostrings.Esuntipodedatosmuyimportante,yaquemuchadelainformaciónconlaquetenemosquetrabajarenlasaplicacionesestexto.
Paraasignaraunavariableuncontenidodetipocadena,loescribiremosentrecomillas,valiendotantolascomillasdoblescomolascomillassimples.Encódigodalugarasentenciasdeestetipo:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 61 de 142
$cadena="Esta es la información de mi variable de tipo string";
SiqueremosmostrarenpantallaelvalordeunavariableobienunmensajecualquierausaremoslainstrucciónechocomoyalohemosvistoenejemplosdiversoshastaelmomentoenelManualdePHP:
echo $cadena; //sacaría "Esta es la información de mi variable"
Nota:EnPHPexistendiversosmecanismosparaproducirsalida(escribirtextoenlapáginaweb).Lainstrucción"echo"eselmássencilloqueexiste,válidocuandoestásdentrodecódigoPHP.
Alasentenciaecholepodemospasarnosolounavariabledetipocadena,puesenrealidadsacaporpantallacualquiercosa:Sinoesunacadenaharáloquepuedaparaproducirunasalidaadecuada.Inclusopodemospasarleunliteraldecadena:
echo "Esta es la información de mi variable"; //daría el mismo resultado
Nota:enlenguajesdeprogramaciónengeneral,un"literal"serefiereaundatoescritotalcualenelcódigo.Unliteraldetipocadenaseescribeentrecomillas,perounliteralnuméricoseescribesinlascomillas.
Literalesdecadenaconcomillasdoblesocomillassimples
AlgocaracterísticodePHPesquepermiteusartantocomillassimplescomocomillasdoblesy,dependiendodecómolohayamoshechoPHPinterpretarálascadenasdemaneradistinta.EsalgoquedebemosdeaprendercuantoantesaltrabajarenPHP,porquesino,puedequenosdealgunosproblemasosurjansituacionesenlasqueelresultadodeunprogramanoseaelqueseesperaba.
Cadenasconcomillasdobles
SiusamoscomillasdoblesparadelimitarcadenasdePHPharemosqueellenguajesecomportedeunamaneramás"inteligente".Lomásdestacadoesquelasvariablesquecoloquemosdentrodelascadenassesustituiránporlosvalores.Esmejorverloconuncódigo.
$sitioweb = "DesarrolloWeb";
$cadena = "Bienvenidos a $sitioweb";
echo $cadena;
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 62 de 142
Esecódigoproducirácomosalida"BienvenidosaDesarrolloWeb".Esdecir,PHPinterpolaráenlavariable$cadenaelvalordelavariable$sitioweb,sustituyendo$sitiowebporsucorrespondientevalor:"DesarrolloWeb".
Dentrodelascadenasdelimitadasporcomillasdobleshayunagrancantidaddecaracteresdeescape,medianteloscualespodemoscolocarencadenasdecaracterescosascomosaltosdelínea,tabuladoresosímbolos"[[--body--]]quot;quenoseríanconsideradoscomoiniciodelnombredeunavariable.Luegodaremosmásdetallesobreesto.
Cadenasconcomillassimples
Cuandoencierrasunliteraldecadenaconcomillassimpleslacosacambiabastante.Lomásdestacableesqueningunadetusvariablessesustituiráporsuvalor.Puedesverloenelsiguientecódigofuente:
$sitioweb = 'DesarrolloWeb';
$cadena = 'Bienvenidos a $sitioweb';
echo $cadena;
Estecódigofuenteesprácticamenteigualqueelanterior,conlasalvedadqueestamosusandocadenasdelimitadasporcomillassimples.Lasalidaessensiblementedistinta,enestecasonosmostraría"Bienvenidosa$sitioweb",dadoquenorealizalainterpolacióndelavariable.
Comopuedesver,dentrodeunacadenaindicadaconcomillassimplesnopuedesinsertarvaloresdevariablesdemaneratansencilla,sinoquetendríasqueromperlacadenayconcatenarconlavariable.Enseguidahablaremosdecómoconcatenarounircadenas,peroparaquequedeyaelejemplo,paraconseguirelresultadodelscriptequivalenteperoconcomillasdobles,tendríasqueescribiralgocomoesto:
$sitioweb = 'DesarrolloWeb';
$cadena = 'Bienvenidos a ' . $sitioweb;
echo $cadena;
¿Quéusar,comillassimplesodobles?
Larespuestaesbiensencilla.Porlogeneralserecomiendausarcomillassimples,puestoqueaPHPlecostarámenosusarlas,dadoquenointentarásustituirvaloresdevariablesdentrodeellas.Solosiquieresbeneficiartedelasventajasdelainterpolaciónsencilladevariablesseríarecomendableusarlascadenasconcomillasdobles,dadoquegenerarásuncódigomuchomássencillodeleerporloshumanosydemantenerdurantelavidadelaaplicación.
Concatenacióndecadenas
Podemosyuxtaponeroconcatenarvariascadenasutilizandoeloperadordeconcatenacióndestrings,quetieneelsímbolopunto".":
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 63 de 142
$cadena1="Perro";
$cadena2=" muerde";
$cadena3=$cadena1.$cadena2;
echo $cadena3; //El resultado es: "Perro muerde"
Aunqueyalohemosdicho,usandocomillasdoblespodríascolocaresasvariablesdentrodenuestracadena.Dejamosaquíotroejemplo:
$a=55;
$mensaje="Tengo $a años";
echo $mensaje; //El resultado es: "Tengo 55 años"
Lapreguntaquenospodemosplantearahoraes...¿Cómohagoentoncesparaqueenvezdelvalor"55"mesalgaeltexto"$a"?Enotraspalabras,cómosehaceparaqueelsímbolo$nodefinaunavariablesinoqueseatomadotalcual.Estapreguntaestantomásinteresantecuantoqueenalgunosdescriptsestesímbolodebeserutilizadoporunasimplerazóncomercial(pagoendólaresporejemplo)ysiloescribimostalcual,elordenadorvaapensarqueloquevienedetrásesunavariablesiendoquenoloes.
Caracteresdeescape
Paraincluirelsímbolo$,lacontrabarrayotroscaracteresutilizadosporellenguajedentrodelascadenasynoconfundirlosseusanloscaracteresdeescape.
Parainsertaruncaracterdeescapetenemosqueindicarlocomenzandoconelsímbolodelacontrabarra(barrainvertida)yluegoeldelcaracterdeescapequedeseemosusar.
Loscaracteresdeescapedisponiblesdependendeltipodeliteraldecadenaqueestemosusando.Enelcasodelascadenasconcomillasdoblessepermitenmuchosmáscaracteresdeescape.Losencuentrasenlasiguientetabla:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 64 de 142
Estoscambiosdelíneaytabulacionestienenúnicamenteefectoenelcódigoynoeneltextoejecutadoporelnavegador.Enotraspalabras,siqueremosquenuestrotextoejecutadocambie
delíneahemosdeintroducirunecho "<br>"yno .
Nota:Elcaracterdeescapedesaltodelínea sólocambiadelíneaenelcódigoHTMLcreadoyenviadoalnavegadorcuandolapáginaesejecutadaenelservidor.EsesaltodelíneanotienevalorenelHTML,porloquesolamenteloveríasalexaminarelcódigofuenteproducidoalejecutarelscript.
Enelcasodelascadenasexpresadasconcomillassimpleshaymuchosmenoscaracteresdeescape.Primeroporquenosonnecesarios(comoelsímbolo$,quenopuedeserconfundidoconeliniciodeunavariable,yaquenolastieneencuenta)ysegundoporquesimplementenoseencuentrandisponibles.
Acontinuaciónpuedesverlatabladecaracteresdeescapepermitidosenunacadenaencerradamediantecomillassimples:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 65 de 142
Sintaxiscomplejadelasllaves
Otracosaútilquenosconvieneaprendercuandotrabajamosconcadenaseslaposibilidaddeinterpolarvalorescomplejosdevariablesuntantoespeciales.EnladocumentacióndePHPlellamanaestola"sintaxiscompleja",peronoconvieneasustarseporqueenrealidadesbiensimple.
Miraelsiguientecódigo:
$array = array(1, 2, 40, 55);
$cadena = "La posición tres contiene el dato $array[2]";
echo $cadena; //escribe La posición tres contiene el dato 55
Aquínosurgeningúnproblemaalexpandirelvalordelaposición3delarrayenlacadena,usando(esosí)comillasdobles.Inclusoaunqueelarraynecesiteuníndice,PHPsabequeloquetienequemostrarahíesunacasilladelarray.Peroahoraobservaelsiguientecódigo:
$array = array('uno' => 1, 'dos' => 2, 'tres' => 40, 'cuatro' => 55);
$cadena = "La posición 'tres' contiene el dato $array['tres']"; //esto produce un error!!
EnestecasonuestroscriptproduciráunerroralserinterpretadoporPHP,puestoqueunarrayconíndicealfanumérico(arrayasociativo)noescapazdeprocesarlobiencuandoloescribimosdentrodeunacadena.
Parasalvarestasituaciónentranenjuegolamencionadasintaxiscomplejadelasllaves.SimplementevamosaescribirelarrayaasociativoquedeseamosquePHPsustituyaencerradoentrellaves.AsíPHPloreconoceráperfectamente.
$array = array('uno' => 1, 'dos' => 2, 'tres' => 40, 'cuatro' => 55);
$cadena = "La posición 'tres' contiene el dato {$array['tres']}"; //Ahora funciona bien
echo $cadena; //escribe La posición 'tres' contiene el dato 40
Quizásenunprimermomentoestasintaxisdelasllavesnoteparezcamuyútil,peroteaseguramosqueentudíaadíaconPHPlavasausarbastante,porquemuchasvecesenPHPtienesdatosquetevienendearraysasociativos,odeotrostiposdeestructurasquenoseinterpolancorrectamentecuandoestásescribiendovaloresdentrodecadenas(siempreconcomillasdobles).
Aunquenohemostratadotodavíacómoserecibendatosquetellegandeformularios,podemosadelantaraquíuncódigosencillo.Imaginaqueestásrecbiendounformularioytienesuncampollamado"teléfono"eneseformulario.Enlapáginaquerecibeseseformulario,tellegacomo$_POST['telefono'].Siquierescolocareseteléfonodentrodeunacadenapodríasusaruncódigocomoeste:
$telefonoPrefijo = "(+34) {$_POST['telefono']}";
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 66 de 142
Funcionesdecadenas
Lascadenaspuedenasimismosertratadaspormediodefuncionesdetodotipo.PHPesunlenguajemuyricoenestesentido,queincluyemuchasposiblesaccionesquepodemosrealizarsobreellascontansoloejecutarunafunción:Dividirlasenpalabras,eliminarespaciossobrantes,localizarsecuencias,remplazarcaracteresespecialesporsucorrespondienteenHTML,etc.
PorejemploaquípuedesverelusodeunafunciónbastanteútilalprogramarenPHPyproducirsalidaenHTML,enlaquecambiamostodosloscaracteresespecialesdelasentidadesHTML(útilparaevitarqueseinyectecódigoHTMLaldocumentoquenoqueremosqueaparezcaformateado,sinoescritoenlapáginaconsusetiquetasytodo).
$cadenaOriginal = '<b>Me gusta PHP</b>';
$cadenaRetocada = htmlspecialchars($cadenaOriginal);
echo $cadenaRetocada; //escribe <b>Me gusta PHP</b>
Másadelanteveremosalgunosnuevosejemplosdefuncionesdecadenas.Perocomosiemprerecomendamos,recuerdamantenerteinformadotambiénconladocumentación:funcionesdestring.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen14/12/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/cadenas-strings-php.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 67 de 142
FuncionesenPHP
Lasfuncionessonesencialesparapoderrealizarcódigodecalidad,tantoenPHPcomoenmuchosotroslenguajesdeprogramación.EnestoscapítulosdelManualdePHPaprenderemosadefinirfunciones,trabajarconparámetrosyretornarvalores.
FuncionesenPHP
Utilidaddelasfunciones,creaciónyalmacenamientoenarchivos.Ejemploprácticodecreacióndefunción.
Ennuestromanualdepáginasdinámicasvimoselconceptodefunción.Vimosquelafunciónpodríaserdefinidacomounconjuntodeinstruccionesquepodemosinvocarlasvecesquehagafalta.Yasabemosportantoquelasfuncionespuedenrecibirparámetros,quesoncomovariablesdentrodelafunciónalasqueseleasignavaloresenelmomentodesuinvocación.Lasfuncionespuedenservirpararealizartareassencillasocomplejasycomoprogramadoresesunodelasprimerasherramientasquedebemosdeconocerparapoderestructurarelcódigodeunprograma.
PHPbasasueficaciaprincipalmenteensuenormebibliotecadefunciones.Unagranlibreríaquecrececonstantemente,amedidaquenuevasversionesvansurgiendoysevanincorporandonuevasáreasdetrabajodentrodellenguaje.LasfuncionesdePHPnospermitenrealizardeunamanerasencillatareashabitualesyalahoradedesarrollarunaaplicación,peroademásnosotrospodemoshacernuevasfuncionespararesolvertodotipodetareasmásespecíficasdenuestraaplicación.
LasfuncionesintegradasenPHPsonmuyfácilesdeutilizaryalolargodetodoelManualdePHPBásicoyotrosmanualesdeDesarrolloWeb.comiremosrepasandolasmásusadas.Paraaccederatodaslasutilidadesquehaydetrásdeunafuncióntansólohemosderealizarlallamada(oinvocación)delaformaapropiadayespecificarlosparámetrosnecesariosparaquelafunciónrealicesutarea.
Nota:DespuésdelallegadadePHP5,enelmomentoenelquePHPpasóaserunlenguajeconunaorientaciónaobjetospotente,lasfuncionesdelabibliotecadellenguajetienenenmuchoscasosalternativasenbaseaclasesyobjetos.Nosotroscomoprogramadorespodemosescogertrabajarconfuncionescorrientesoconmétodosdeobjetosyclases,peroengenerallafuncionalidadalaquellegaremosesexactamentelamisma.
CrearnuestraspropiasfuncionesenPHP
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 68 de 142
Loquepuedeparecerligeramentemáscomplicado,peroqueconunmínimodeexperienciaresultarámuysencilloysinlugaradudasmuypráctico,escrearnuestraspropiasfunciones.Deunaformageneral,podríamoscrearnuestraspropiasfuncionesparaconectarnosaunabasededatosocrearlosencabezadosoetiquetasmetadeundocumentoHTML.Paraunaaplicacióndecomercioelectrónicopodríamoscrearporejemplofuncionesdecambiodeunamonedaaotraodecalculodelosimpuestosaañadiralpreciodearticulo.Endefinitiva,esinteresantecrearfuncionesparalamayoríadeaccionesmásomenossistemáticasquerealizamosennuestrosprogramas.
Aquídaremoselejemplodecreacióndeunafunciónque,llamadaalcomienzodenuestroscript,noscreaelencabezadodenuestrodocumentoHTMLycolocaeltituloquequeremosalapágina:
<?
function hacer_encabezado($titulo) {
$encabezado="<html><head>t<title>$titulo</title></head>";
echo $encabezado;
}
?>
Estafunciónpodríaserllamadaalprincipiodetodasnuestraspáginasdelasiguienteforma:
$titulo="Mi web";
hacer_encabezado($titulo);
Deestaformaautomatizamoselprocesodecreacióndenuestrodocumento.Podríamosporejemploincluirenlafunciónotrasvariablesquenosayudasenaconstruirlasetiquetasmetaydeestaforma,conunesfuerzomínimo,crearíamoslosencabezadospersonalizadosparacadaunadenuestraspáginas.Deestemismomodonosesposiblecrearcierresdedocumentoointerfacesdelawebcomopodríanserbarrasdenavegación,formulariosdelogin,etc.
Comohaspodidocomprobar,paracrearunafuncióndebemosdeclararla.Paraellousamoslapalabrafunctionseguidadelnombredelafunción.Luegounosparéntesisdondepodemosindicarlosparámetrosqueseesperarecibirensuinvocaciónyfinalmenteelbloquedecódigodelafunciónpropiamentedicha,encerradoentrellaves.Enlossiguientesartículosseguiremoshablandodeloscomponentesdeunafunciónyviendodiversosejemplos,asíquenodebesdepreocupartesitodavíanolovesdemasiadoclaro.
Estructurarelcódigodeunaaplicaciónconnuestraspropiaslibreríasdefunciones
Porsupuesto,lafunciónhadeserdefinidaparapoderserutilizada,yaquenoseencuentraintegradaenPHPsinoquelahemoscreadonosotros.Sipensamosqueenunaaplicaciónwebcompletapodemostenercientosdefuncionesdefinidaspornosotrosmismosquizásteasustequetengasdemasiadocódigodefuncionesquedebenserdefinidasantesdeserusadas.Peroestoenrealidadnoponeningunapega,yaquepuedenserincluidasdesdeunarchivoexterno.Dehechoesmuycomúnquetengamosarchivosdondesolocolocamoselcódigodelasfunciones,almacenandodefinicionesdelasfuncionesquevayamoscreandopararealizarun
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 69 de 142
sitioweb.
Estosarchivosenlosqueseguardanlasfuncionessellamancomúnmentelibrerías.Laformadeincluirlosennuestroscriptesapartirdelainstrucciónrequireoinclude:
require("ruta/a/libreria.php");
Osiprefiereslaalternativadelinclude:
include("ruta/a/libreria.php");
Nota:Tantorequire()comoinclude()hacenelmismotrabajo,detraersecódigoquehayenarchivosdiferentesdentrodelservidor,paraquepodamosutilizarloalcrearunapágina.Ladiferenciafundamentalentrerequireeincludeesquelaprimerarequiereforzosamentealgoylaotrano.Esdecir,sihacemosunrequire()deunarchivoyéstenoseencuentradisponibleporcualquiermotivo,PHPpararálaejecucióndelcódigoydevolveráun"Errorfatal".Siporelcontrariohacemosuninclude()yelarchivoquetratamosdetraernoseencuentradisponible,entoncesloquePHPnosmostraráesunaseñakdeadvertencia,un"warning",perotratarádeseguirejecutandoelprograma.
Enresumen,cuandousasarchivosconcódigodefunciones(librerías)ylosincluyesparausarlosdesdeotraspáginasdelaaplicación,lacosaquedaríaasí:
Tendríamosunarchivolibreria.phpcomosigue
<?
//función de encabezado y colocación del titulo
function hacer_encabezado($titulo)
{
$encabezado="<html>n<head>nt<title>$titulo</title>n</head>n";
echo $encabezado;
}
?>
Porotrapartetendríamosnuestroscriptprincipalpágina.php(porejemplo):
<?
include("libreria.php");
$titulo="Mi Web";
hacer_encabezado($titulo);
?>
<body>
El cuerpo de la página
</body>
</html>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 70 de 142
Podemosmetertodaslasfuncionesquevayamosencontrandodentrodeunmismoarchivoperoresultamuchísimomásventajosoirclasificándolasendistintosarchivosportemática:Funcionesdeconexiónabasesdedatos,funcionescomerciales,funcionesgenerales,etc.Estonosayudaraapoderlocalizarlasantesparacorregirlasomodificarlas,nospermitetambiéncargarúnicamenteeltipodefunciónquenecesitamosparaelscriptsinrecargarésteenexcesoademásdereutilizaralgunasdenuestraslibreríasparavariossitioswebsdistintos.
Tambiénpuederesultarmuyprácticoelutilizarunanomenclaturasistemáticaalahoradenombrarlas:Lasfuncionescomercialespodríanserllamadascom_loquesea,lasdebasesdedatosbd_loquesea,lasdetratamientodearchivosfile_loquesea.Estonospermitiráreconocerlasenseguidacuandoleamoselscriptsintenerquerecurriranuestraoxidadamemoriaparadescubrirsuutilidad.
Noobstante,antesdelanzarnosacrearnuestrapropiafunción,merecelapenaecharunvistazoaladocumentaciónparaversidichafunciónyaexisteopodemosaprovecharnosdealgunadelasexistentesparaaligerarnuestrotrabajo.Así,porejemplo,existeunafunciónllamadaheaderquecreaunencabezadoHTMLconfigurablelocualnosevitatenerquecrearlanosotrosmismos.
Nota:Comopuedeverse,latareadelprogramadorpuedeenalgunoscasosparecersealadeuncoleccionista.Hayqueserpacienteymetódicoyalfinal,abasedetrabajopropio,intercambiodecódigoydedicaciónpodemosllegarposeernuestropequeñotesorodefunciones,capacesdealigerarnuestrotrabajodiario.
Dehecho,másadelantesisiguesaprendiendoPHPprofesionalmenteencontrarásqueexistenlosframeworks,quesonenciertomodocomobibliotecasadicionalesdefuncionesquepuedesusarpararesolvermuchasmáscosas,adicionalesalasqueelpropiolenguajeyateofrece.Losframeworksademásayudanalosprogramadoresaestructurarsucódigoyausardiversospatronesdediseñodesoftwarequefacilitanlacreacióndeproyectosdefácilmantenimientoycapacesdecrecersinvolverseinmanejables.EnDesarrolloWeb.comtenemosvariosmanualesdeframeworksPHP.
Comoreferencia,sideseaspuedesrepasartodoslosconceptosanterioressobrelasfunciones,asícomodiversasotrascosasinteresantes,tedejamosenlacehaciaelVideotutorialsobrelasfuncionesenPHP.
Ejemplodefunción
VamosaverunejemplodecreacióndefuncionesenPHP.Setratadehacerunafunciónquerecibeuntextoyloescribeenlapáginaconcadacarácterseparadopor"-".Esdecir,sirecibe"hola"debeescribir"h-o-l-a"enlapáginaweb.
Nota:Paracomprenderesteejemplonecesitamosconocerelbuclefor,queseexplicaenelcapítuloControldelflujoenPHP:BuclesII.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 71 de 142
Lamaneraderealizarestafunciónserárecorrerelstring,caracteracaracter,paraimprimircadaunodeloscaracteres,seguidodeelsigno"-".Recorreremoselstringconunbuclefor,desdeelcarater0hastaelnúmerodecaracterestotaldelacadena.
ElnúmerodecaracteresdeunacadenaseobtieneconlafunciónpredefinidaenPHPstrlen(),querecibeelstringentreparéntesisydevuelveelnúmerodeloscaracteresquetenga.
<html>
<head>
<title>funcion 1</title>
</head>
<body>
<?
function escribe_separa($cadena){
for ($i=0;$i<strlen($cadena);$i++){
echo $cadena[$i];
if ($i<strlen($cadena)-1)
echo "-";
}
}
escribe_separa ("hola");
echo "<p>";
escribe_separa ("Texto más largo, a ver lo que hace");
?>
</body>
</html>
Lafunciónquehemoscreadosellamaescribe_separayrecibecomoparámetrolacadenaquehayqueescribirconelseparador"-".Elbuclefornossirvepararecorrerlacadena,desdeelprimeralúltimocarácter.Luego,dentrodelbucle,seimprimecadacarácterseparadodelsigno"-".Elifquehaydentrodelbucleforcompruebaqueelactualnoseaelúltimocarácter,porqueenesecasonohabríaqueescribirelsigno"-"(queremosconseguir"h-o-l-a"ysinoestuvieraelifobtendríamos"h-o-l-a-").
Conclusión
EsperamosqueestaprimeraintroducciónalasfuncionesenPHPtehayasidoaclaradora.Enlospróximosartículosveremosnuevascosasimportantesparadominarlas,comoelpasodeparámetrosenlasfuncionesylosvaloresderetorno.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen04/01/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 72 de 142
PasodeparámetrosenfuncionesPHP
EstecapítuloexplicatodoslosdetallesrelativosalpasodeparámetrosenlasfuncionesPHP.
EnelartículoanteriordelManualdePHPyacomenzamosaexplicarlasfuncionesenPHP.Comohemosvisto,crearnuestraspropiasfuncionesnoescomplicado,perotenemosqueaprenderdiversascosasnuevasparaextraertodasupotencia.
AhoravamosaexplicaralgunosdetallesadicionalessobreladefiniciónyusodefuncionesenPHP,paraampliarlainformaciónanterior.Enconcreto,hablaremossobrelosparámetrosenlasfunciones,yaquehaymuchomásquedecirparaabarcartodaslasposibilidadesdePHP:elpasodeparámetrosporvalor,pasoporreferencia,losvalorespredeterminados,etc.AdemásenesteartículoveremosnuevosejemplosdefuncionesquenossirvanparairpracticandoconnuevosejemplosenPHP.
Pasodeparámetros
Losparámetrossonlosdatosquerecibenlasfuncionesyqueutilizanpararealizarlasoperacionesdeesafunción.Unafunciónpuederecibircualquiernúmerodeparámetros,inclusoninguno.
Silafunciónqueestamosconstruyendononecesitarecibirningúnparámetro,aldeclararla,simplementeindicamoslosparéntesisvacíosenlacabecera.Porejemploenlasiguientefunciónmostramoslafechadeldíadehoy.ParaellonosapoyamosenotrafunciónincluidaenPHP:date().
function fecha_hoy() {
echo date('d/m/Y');
}
Laintencióndelaanteriorfunciónesmostrarlafechadeldíaactual.Comosiempremostraráeldíadehoy,nonecesitopasarleningúnparámetro,siempreharálomismo.Lasfuncionesquenorequierenparámetrosselasinvocaindicandolosparéntesisvacíos.
fecha_hoy();
Nota:Siquieressabermássobrelafuncióndate()yotrasmanerasdecrearfechasenPHP,terecomendamoselartículoCrearyconvertirfechasenPHP
Enelcasoquequeramos,onecesitemos,recibirparámetrosparaimplementarunafunción,alahoradedefinirla,enlacabecera,sedefinenlosparámetrosquevaarecibir.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 73 de 142
function f1 ($parametro1, $parametro2)
Asídefinimosunafunciónllamadaf1querecibedosparámetros.Comosepuedeobservar,nosetienequedefinireltipodedatosdecadaparámetro.Esdecir,lafunciónnecesitaráqueleenviemosdosdatos,peronoleimportaráqueseandeuntipouotro.
Losparámetrostienenvalidezdurantelaejecucióndelafunción.Sedicequetienenunámbitolocalalafuncióndondeseestánrecibiendo.Cuandolafunciónsetermina,losparámetrosdejandeexistir.
Losparámetrossepasanporvalor
ElpasodeparámetrosenPHPserealizaporvalor."Porvalor"esunamaneratípicadepasarparámetrosenfunciones,quieredecirqueelcambiodeundatodeunparámetronoactualizaeldatodelavariablequesepasóalafunción.Porejemplo,cuandoinvocamosunafunciónpasandounavariablecomoparámetro,apesardequecambiemoselvalordelparámetrodentrodelafunción,lavariableoriginalnoseveafectadaporesecambio.Puedequeseveamejorconunejemplo:
function porvalor ($parametro1){
$parametro1="hola";
echo "<br>" . $parametro1; //imprime "hola"
}
$mivariable = "esto no cambia";
porvalor ($mivariable);
echo "<br>" . $mivariable; //imprime "esto no cambia"
Estapáginatendrácomoresultado:
holaestonocambia
Pasodeparámetrosporreferencia
Encontraposiciónalpasodeparámetrosporvalor,estáelpasodeparámetrosporreferencia.Enesteúltimocaso,elcambiodelvalordeunparámetrodentrodeunafunciónsíafectaalvalordelavariableoriginal.
Podemospasarlosparámetrosporreferenciasi,enladeclaracióndelafunción,colocamosun"&"antesdelparámetro.
function porreferencia(&$cadena) {
$cadena = 'Si cambia';
}
$str = 'Esto es una cadena';
porreferencia ($str);
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 74 de 142
echo $str; // Imprime 'Si cambia'
Estescriptmostraráporpantalla'Sicambia'.
Parámetrospordefecto
Podemosdefinirvalorespordefectoparalosparámetros.Losvalorespordefectosirvenparaquelosparámetroscontenganundatopredefinido,conelqueseinicializaránsinoselepasaningúnvalorenlallamadadelafunción.Losvalorespordefectosedefinenasignandoundatoalparámetroaldeclararloenlafunción.
function pordefecto ($parametro1="pepe";$parametro2=3)
Paraladefinicióndefunciónanterior,$parametro1tienecomovalorpordefecto"pepe",mientrasque$parametro2tiene3comovalorpordefecto.
Sillamamosalafunciónsinindicarvaloresalosparámetros,estostomaránlosvaloresasignadospordefecto:
pordefecto () // $parametro1 vale "pepe" y $parametro2 vale 3
Sillamamosalafunciónindicandounvalor,esteserátenidoencuentaparaelprimerparámetro.
pordefecto ("hola") // $parametro1 vale "hola" y $parametro2 vale 3
Tenencuentaque,enelcasoquequierasusarparámetrosconvalorespordefecto,estásobligadoaqueéstossedeclarenalfinalenlalistadeparámetrosdelacabeceradelafunción.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen04/01/2017Disponibleonlineenhttp://desarrolloweb.com/articulos/parametros-funciones-php.html
RetornodevaloresenfuncionesPHP
CómodevolvervaloresenfuncionesPHP,conlapalabrareturn.ExplicamosvariasformasderealizarloconnuevosejemplosparaaprenderatrabajarconfuncionesenPHP.
ParaseguiraprendiendosobrefuncionesenelManualdePHPnecesitamosabordarcondetalleelasuntodeladevolucióndevaloresenfunciones.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 75 de 142
AlgoquequerráshacerenPHP,yenlaprogramaciónengeneral,escrearfuncionesque,unavezejecutadas,nosentreguenunvalorcomoresultado.Esalgomuyhabitualyqueimplicavariascuestionesquevamosaabordarenelpresenteartículo.
Lasfuncionespueden,ono,retornarvalores.Esdecir,noesobligadoquelasfuncionesretornenvaloralguno,solosetratadeunaposibilidad,queencontrarásdemuchautilidadeneldesarrolloengeneral.Dehecho,nuestrosanterioresejemplosdefuncionesnohabíanretornadoningúnvaloryyahabíamosvistoquerealizabantareasbastanteútiles.
Palabra"return"
Pararetornarvaloresenfuncionesseutilizalapalabra"return",indicandoacontinuacióneldatoovariablequetienenqueretornar.
function suma($valor1, $valor2) {
return $valor1 + $valor2;
}
Laanteriorfunciónrealizaunaoperacióndesumaentredosvaloresenviadosporparámetro.Parainvocarladebemosenviarlelosdosvaloresquedebesumar.Cuandoseejecutelafunciónrecibiremosunvalorcomodevoluciónypodremoshacercualquiercosaconél.Porejemplo,enelsiguientecódigoestamosinvocandoalafunciónsuma,enviandodosvaloresnuméricosyalmacenandoelvalordedevoluciónenunavariablellamada"$resultado".
$resultado = suma(3, 6);
Unafunciónpuedeperfectamentetenermúltiplespalabrasreturnensucódigo.Sinembargo,aunqueestoocurra,debemostenerencuentaqueunafunciónsólopodrádevolverunúnicovalor.Entreotrascosasestoocurriráporque,cuandoseusaelreturn,seterminalaejecucióndelafuncióndevolviendoeldatoindicado.
Observaelsiguientecódigodefunción.Realizaunaoperacióndedivisión.Recuerdaquelaoperaciónmatemáticadedividiralgoentreceronoestápermitida,yaqueelresultadosería"infinito"yesevalordesvordaríaalamáquina.Entonces,antesderealizarlaoperacióndedivisiónvamosahacerunacomprobaciónquenoseintentedividirentrecero.
function division($valor1, $valor2) {
if($valor2 == 0) {
return 'No puedo dividir por cero!!';
} else {
return $valor1 / $valor2;
}
}
Nota:Enelcódigoanteriorhemosusadolaestructuradecontrol"if"queveremosmás
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 76 de 142
adelante,enenartículoControldelflujoenPHP:CondicionesIF
Aunquetodavíanohemosexplicadoquéhaceun"if",simplementeesunaoperacióncondicional.Compruebaunaexpresiónyhaceunacosauotradependiendodeloquevalga.Enresumen,seevaluasi$valor2tieneeldato0(cero)yenesecasosedevuelveunmensaje"Nopuedodividirporcero!!".Encasoque$valor2nofueraunvalordecero,entoncesrealizalaoperacióndedivisiónysedevuelveelresultado.
Apreciarásqueenelcódigodelafunciónanterioraparecendosreturn,quizásnoteresulteextraño,porquesolamenteunodeellosseejecutará,dadalaconstruccióndelIF.Noobstante,debessaberqueunreturnsiempredetieneenesepuntolaejecuciondelafunción.Esdecir,despuésdeejecutarunreturnnoseejecutaráningunaotralíneadecódigosiguiente.
Paraquequedeclaro,ahoramiraestaotrafunción.
function cuadrado($valor) {
return $valor * $valor;
echo 'Esto nunca se ejecutará!!';
}
Debidoalreturn,elcódigoconlasentencia"echo"nuncasellegaráaejecutar.Asíquenoapareceránuncaelmensajeporpantalla,porqueelreturndelalíneaanteriorpararásiemprelaejecucióndelafunción.
Paraacabarestepuntoqueremosvolversobrelafunciónanteriorllamada"division".Dadoloaprendidodelascaracterísticasdelreturn,aunquenuestrocódigofueraligeramentedistinto,tambiéntendríamoselmismoresultado.Observaelsiguientecódigo:
function division($valor1, $valor2) {
if($valor2 == 0) {
return 'No puedo dividir por cero!!';
}
return $valor1 / $valor2;
}
Aunquenohemosusadolaconstrucción"else"(miramásadelanteelcapítulodondehablamosdelosif)elsegundoreturnsoloseejecutarási$valor2esdistintodecero,porquesifueraigualacerosehabríasalidodelafuncióndebidoalprimerreturn.Estedetallequizáscuestaunpocodeveralprincipiodelaexperienciacomoprogramador,peroesbastantesencilloenrealidad.Enresumen,puedesconfiarquelaejecucióndeunafunciónsiempresedetendrádespuésdeproducirseunreturn.
EjemplodefunciónIVA
Vamosaverunnuevoejemploparailustrarelfuncionamientodeunafunciónunpocomásavanzada,queutilizapartedelosnuevosconceptosintroducidosenesteartículoyelanterior
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 77 de 142
sobrepasodeparámetros.
SetratadehacerunafunciónquecalculaelIVAyquerecibedosparámetros.Unoelvalorsobreelquesecalculayelotroelporcentajeaaplicar.SinoseindicaelporcentajedeIVAseentiendequeesel21%.
<html>
<head>
<title>ejemplo IVA</title>
</head>
<body>
<?
function iva($base,$porcentaje=21){
return $base * $porcentaje /100;
}
echo iva(1000) . "<br>";
echo iva(1000,7) . "<br>";
echo iva(10,0) . "<br>";
?>
</body>
</html>
Sisehanentendidobienlosconceptos,esteejemplonopuederesultardifícil.Lafunciónrecibeunparámetrollamado$porcentajecon21comovalorpordefecto.Devuelveelporcentajedadoaplicadoalabasetambiénindicadaporparámetro.
Asípues,enlaprimeraejecucióndelafunción,comonoseindicaelporcentaje,semostraráel21%de1000.Enlasegunda,semuestrael7%demilyenlatercera,el0%de10.
Retornarmúltiplesvaloresenunafunción
Lodichoanteriormentesobreque"unafuncióndevuelveunúnicovalor"puederesultarcortanteparalaspersonasqueestáncomenzandoenlaprogramación,alverqueellopuedesignificarunagranlimitaciónalahoradeescribirfunciones.Noobstante,conlasherramientasconlasquesecuentaenlaprogramaciónéstonoesasí.
Siqueremoshacerquesepuedandevolvervariosvaloresdistintospodríamosquerecurrirauntrucoqueconsisteendevolverunarray.
function numeros_pequenos()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
Conelarraydevueltopodremoshacercualquiercosa.Accederasuscasillasporseparado,
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 78 de 142
recorrerlo,etc.PeroenelcódigoanteriorhemoshechadomanodeunafunciónincorporadaenPHP,nuevaparati,llamadalist().Éstaseusaparaasignarunalistadevariablesenunasolaoperación.Despuésdeesaoperación,$zerovaldrá0,$onevaldrá1y$twovaldrá2.
Hayquedecirqueademásdearrays,cuandolascosassecomplicantambiénpodemosdevolverobjetosyesonosayudaráaretornarenlasfuncionestodotipodeestructurascomplejas,convariosdatos,solodevolviendounobjeto.Másadelantetambiénhablaremossobreobjetos,asíquehabrátiempodeverejemplos.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen04/01/2016Disponibleonlineenhttp://desarrolloweb.com/articulos/retorno-valores-return-php.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 79 de 142
EstructurasdecontrolenPHP
VemosunaaunalasdistintasestructurasdecontroldelflujodelosprogramasdisponiblesenellenguajedeprogramaciónPHP:condicionalesybucles.
ControldelflujoenPHP:CondicionesIF
Presentamosunadelasherramientasprincipalesusadasparacontrolarelflujodenuestrosscripts:LoscondicionalesIF.
Laprogramaciónexigeenmuchasocasioneslarepeticióndeaccionessucesivasolaeleccióndeunadeterminadasecuenciaynodeotradependiendodelascondicionesespecíficasdelaejecución.
Comoejemplo,podríamoshaceralusiónaunscriptqueejecuteunasecuenciadiferenteenfuncióndeldíadelasemanaenelquenosencontramos.
Estetipodeaccionespuedenserllevadasacabograciasaunapaletadeinstruccionespresentesenlamayoríadeloslenguajes.EnestecapítulodescribiremossomeramentealgunasdeellaspropuestasporPHPyqueresultandeevidenteutilidad.
Paraevitarelcomplicareltexto,noslimitaremosaintroducirlasmásimportantesdejandodeladootrascuantasquepodránserfácilmenteasimilablesapartirdeejemplosprácticos.
Lascondicionesif
Cuandoqueremosqueelprograma,llegadoaunciertopunto,tomeuncaminoconcretoendeterminadoscasosyotrodiferentesilascondicionesdeejecucióndifieren,nosservimosdelconjuntodeinstruccionesif,elseyelseif.Laestructuradebasedeestetipodeinstruccioneseslasiguiente:
if (condición)
{
Instrucción 1;
Instrucción 2;
...
}
else
{
Instrucción A;
Instrucción B;
...
}
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 80 de 142
Llegadosaestepunto,elprogramaverificaráelcumplimientoonodelacondición.Silacondiciónesciertalasinstrucciones1y2seránejecutadas.Delocontrario(else),lasinstruccionesAyBseránllevadasacabo.
Estaestructuradebasepuedecomplicarseunpocomássitenemoscuentaquenonecesariamentetodoesblancoonegroyquemuchasposibilidadespuedendarse.Esporelloqueotrascondicionespuedenplantearsedentrodelacondiciónprincipal.Hablamosporlotantodecondicionesanidadasquetendríanunaestructuradelsiguientetipo:
if (condición1)
{
Instrucción 1;
Instrucción 2;
...
}
else
{
if (condición2)
{
Instrucción A;
Instrucción B;
...
}
else
{
Instrucción X
...
}
}
Deestemodopodríamosintroducirtantascondicionescomoqueramosdentrodeunacondiciónprincipal.
Degranayudaeslainstrucciónelseifquepermiteenunasolalíneaintroducirunacondiciónadicional.Estetipodeinstrucciónsimpificaligeramentelasintaxisqueacabamosdever:
if (condición1)
{
Instrucción 1;
Instrucción 2;
...
}
elseif (condición2)
{
Instrucción A;
Instrucción B;
...
}
else
{
Instrucción X
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 81 de 142
...
}
Elusodeestaherramientaresultaráclaroconunpocodepráctica.Pongamosunejemplosencillodeutilizacióndecondiciones.Elsiguienteprogramapermitiríadetectarlalenguaempleadaporelnavegadoryvisualizarunmensajeendichalengua.
<HTML>
<HEAD>
<TITLE>Detector de Lengua</TITLE>
</HEAD>
<BODY>
<?
//Antes de nada introducimos mensajes en forma de variables
$espanol="Hola";
$ingles="Hello";
$frances="Bonjour";
//Ahora leemos del navegador cuál es su lengua oficial
$idioma=substr($HTTP_ACCEPT_LANGUAGE,0,2);
//Formulamos las posibilidades que se pueden dar
if ($idioma == "es")
{echo "$espanol";}
elseif ($idioma=="fr")
{echo "$frances";}
else
{echo "$ingles";}
?>
</BODY>
</HTML>
Ejecutarscript
Parapoderverelfuncionamientodeestescriptesnecesariocambiarelidiomapreferidolocualpuedeserrealizadoapartirdelmenúdeopcionesdelnavegador.
Paraleerlalenguaaceptadaporelnavegadorloquehacemosesdefinirunavariable($idioma)y,mediantelafunciónsubstr,recogemoslasdosprimerasletrasdelcódigocorrespondientealidiomaaceptadoporelnavegador($HTTP_ACCEPT_LANGUAGE).
Latercerapartedescriptseencargadeversielnavegadorestáenespañol(es),francés(fr)oencualquierotroidiomaquenoseaningunodeestosdosydeimprimirelmensajequeprocedaencadacaso.
Anotarque,cuandosetratadecompararvariables,ponemosundobleigual"=="enlugardeunsimple"=".Esteúltimoquedareservadoexclusivamenteparaasignarvaloresavariables
Referencia:Hemospublicadounvídeoparamostrarlacreaciónyelfuncionamientode
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 82 de 142
lasestructurasIF:Estructurasdecontrol,Vídeo1:condicionalif
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ControldelflujoenPHP:BuclesI
Estructurayfuncionamientodelosbucleswhileydo/while.
Losordenadores,comocualquiermáquina,estándiseñadospararealizartareasrepetitivas.Esporelloquenuestrosprogramaspuedenaprovecharsedeesteprincipiopararealizarunadeterminadasecuenciadeinstruccionesunciertonúmerodeveces.Paraello,utilizamoslasestructurasllamadasenbuclequenosayudana,usandounaspocaslíneas,realizarunatareaincluidadentrodelbucleunciertonumerodevecesdefinidopornosotrosmismos.
PHPproponevariostiposdebuclecadaunoconcaracterísticasespecificas:
Buclewhile
Sindudaelbuclemásutilizadoyelmássencillo.Lousamosparaejecutarlasinstruccionescontenidasensuinteriorsiempreycuandolacondicióndefinidaseaverdadera.Laestructurasintácticaeslasiguiente.
while (condición)
{
instruccion1;
instruccion2;
...
}
Unejemplosencilloesestebuclequeaumentaeltamañodelafuenteenunaunidadacadanuevavueltaporelbucle:
<?
$size=1;
While ($size<=6)
{
echo"<font size=$size>Tamaño $size</font><br>n";
$size++;
}
?>
Ejecutarscript
Amododeexplicación,diremosque,antesdenada,hemosdedefinirelvalordelavariablequevamosaevaluarenlacondición.Algoabsolutamenteobvioperofácildeolvidar.Eneste
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 83 de 142
casolehemosatribuidounvalorde1quecorrespondealaletramáspequeña.
Elpasosiguienteescrearelbucleenelqueimponemoslacondiciónquelavariablenoexcedaelvalorde6.
LainstrucciónaejecutarseráimprimirennuestrodocumentouncódigoHTMLenelquelaetiquetafontyelmensajequecontienevaríanamedidaque$sizecambiasuvalor.
Elsiguientepasoesincrementarenunaunidadelvalorde$size.Estosepuedehacerconunaexpresióncomolamostradaenelbucle($size++)queenrealidadessinónimade:
$size=$size+1
Veremosotrasdeestasabreviacionesmásadelante.
OtroejemplodelbubleWhile
Elbuclewhilesesueleutilizacuandonosesabeexactamentecuantasiteracionessedebenrealizarantesdeacabar.Vamosautilizarloenotroejemplo,enelquehayquerecorrerunacadenahastaencontraruncarácterdado.Siloencuentra,escribirsuposición.Sino,escribirquenosehaencontrado.
Nota:Parahaceresteejercicionecesitamosconocerlafuncióndecadenastrlen(),queobtienelalongituddelacadenaqueselepaseporparámetro.
int strlen (string cad)
Devuelveunenteroigualalalongituddelacadena.
<?
$cadena = "hola a todo el mundo";
//recorro la cadena hasta encontrar una "m"
$i=0;
while ($cadena[$i]!="m" && $i< strlen($cadena)){
$i++;
}
if ($i==strlen($cadena))
echo "No se encuentra...";
else
echo "Está en la posición $i";
?>
Enesteejemplosedefineunacadenaconelvalor"holaatodoelmundo".Posteriormentese
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 84 de 142
recorreesacadenahastaelfinaldelacadenaohastaencontrarelcaracter"m",utilizandounavariable$iquellevalacuentadeloscaracteresrecorridos.
Alfinaldelbuclewhile,sisesalióporqueseencontróelcaracter"m",lavariable$ivaldráunnúmeromenorquelalongituddelacadema.Sisesalióporllegaralfinaldelacadena,lavariable$ivaldrálomismoquelalongitudencaracteresdeesacadena.Enelcondicionalsimplementesecompruebasi$ivaleonolomismoquelalongituddelacadena,mostrandolosmensajesadecuadosencadacaso.
Podemosverelejemploenfuncionamiento.
Bucledo/while
Estetipodebuclenodifiereenexcesodelanterior.Lasintaxiseslasiguiente:
do
{
instruccion1;
instruccion2;
...
}
while (condición)
Ladiferenciaconrespectoalosbucleswhileesqueestetipodebucleevalúalacondiciónalfinalconloque,inclusosiendofalsadesdeelprincipio,ésteseejecutaalmenosunavez.
Referencia:ParaunaayudaprácticasobreestosbuclesverelsiguientevideotutorialEstructurasdecontrol,Vídeo2:buclesfor,whileydo-while.Además,lasexplicacionessobreestructurasdecontrolsecomplementanconelvideotutorialdeSwitchylasinstruccionesbreakycontinue.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ControldelflujoenPHP:BuclesII
Estructurayfuncionamientodelosbuclesforyforeach.Explicamoscomosalirdeunbucle:Breakycontinue
EsteeselsegundoartículosobrelosbuclesenPHPquepublicamosenelManualdePHP.Elanteriorartículoexplicóacercadelosbucleswhileydo-while.Asípues,ahoravamosadedicarnosalosotrostiposdebucles,quesonelbuclefor,paraiterarunnúmerodadodeveces,foreach,útilpararecorrerarrays,asícomolassentenciasbreakycontinue.
Buclefor
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 85 de 142
PHPestáprovistodeotrostiposdebuclequetambiénresultanmuyprácticosendeterminadassituaciones.Elmáspopulardeelloseselbucleforque,comoparaloscasosanteriores,seencargadeejecutarlasinstruccionesentrellaves.Ladiferenciaconlosanterioresradicaencómoseplantealacondicióndefinalizacióndelbucle.Paraaclararsufuncionamientovamosaexpresarelejemplodebuclewhilevistoenelcapítuloanteriorenformadebuclefor:
<?
For ($size=1;$size<=6;$size++)
{
echo"<font size=$size>Tamaño $size</font><br>n";
}
?>
Ejecutarscript
Lasexpresionesdentrodelparéntesisdefinenrespectivamente:
Inicializacióndelavariable.Validaparalaprimeravueltadelbucle.Condicióndeevaluaciónacadavuelta.Siescierta,elbuclecontinua.Acciónarealizaralfinaldecadavueltadebucle.
Bucleforeach
Estebucle,implementadoenlasversionesdePHP4,nosayudaarecorrerlosvaloresdeunarraylocualpuederesultarmuyútilporejemploparaefectuarunalecturarápidadelmismo.Recordamosqueunarrayesunavariablequeguardaunconjuntodeelementos(valores)catalogadosporclaves.
Laestructurageneraleslasiguiente:
Foreach ($array as $clave=>$valor)
{
instruccion1;
instruccion2;
…;
}
Unejemploprácticoeslalecturadeunarraylocualpodríahacersedelsiguientemodo:
<?
$moneda=array("España"=> "Peseta","Francia" => "Franco","USA" => "Dolar");
Foreach ($moneda as $clave=>$valor)
{
echo "Pais: $clave Moneda: $valor<br>";
}
?>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 86 de 142
Ejecutarscript
Estescriptseencargaríademostrarnosporpantallaelcontenidodelarray$moneda.Noresultaríamalaideacrearunafunciónpropiabasadaenestebuclequenospermitiesevisualizararraysmonodimensionalesyalmacenarlaennuestralibrería.Estafunciónpodríaserdefinidadeestaforma:
Function mostrar_array ($array)
{
Foreach ($array as $clave=>$valor)
{echo "$clave=>$valor<br>";}
}
Breakycontinue
Estasdosinstruccionesseintroducendentrodelaestructuraynossirvenrespectivamenteparaescapardelbucleosaltaralaiteraciónsiguiente.Puedenresultarnosmuyprácticasenalgunassituaciones.
Duranteunaiteracióndeunbuclepodemossaltardirectamentealasiguienteiteración,sinseguirconlaactual,conlainstruccióncontinue.
Tambiénpodemosdetenercompletamentelasrepeticionesdecualquierbucleconbreak,loquepararálaejecucióndelaiteraciónactualydelassiguientesquepudierahaber.
Referencia:Sideseasverlaconstruccióndeunbucleforyotrostiposdebucles,envídeoterecomendamoselsiguientevideotutorialEstructurasdecontrol,Vídeo2:buclesfor,whileydo-while.
Además,sideseasaprenderlaestructuradecontrolswitchylasinstruccionesbreakycontinue,asícomoverotroejemplodeforeach,terecomendamosverlosVideotutorialesdeestructurasdecontrolenPHPII.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 87 de 142
Aplicacionesweb:pasodevariablesymemoriadeestados
EnlossiguientescapítulosveremosdiversasmanerasqueexistenenPHPparaconseguirqueunconjuntodepáginasyscriptssecomportencomounaaplicaciónweb.Veremoscómopasardatosdeunaspáginasaotras,porPOSTyGET,cómomemorizardatosasociadosaunusuarioalolargodetodalasesiónycómomemorizardatosencookies,queperduraránentrevariassesiones.
PasarvariablesporlaURLconPHP
VeremoscómotransferirvariablesdeunapáginaaotrapormediodelaURL,enPHP.
Buclesycondicionessonmuyútilesparaprocesarlosdatosdentrodeunmismoscript.Sinembargo,enunsitioInternet,laspáginasvistasylosscriptsutilizadossonnumerosos.Muyamenudonecesitamosquenuestrosdistintosscriptsesténconectadosunosconotrosyquesesirvandevariablescomunes.Porotrolado,elusuariointeraccionapormediodeformularioscuyoscamposhandeserprocesadosparapoderdarunarespuesta.TodoestetipodefactoresdinámicoshandesereficazmentereguladosporunlenguajecomoPHP.
Esposiblequeyaoshayáispercatadodequelasvariablesdeunscripttienenunavalidezexclusivaparaelscriptyquenosresultaimposibleconservarsuvalorcuandoejecutamosotroarchivodistintoaunqueambosesténenlazados.Existenvariasformasdeenviarlasvariablesdeunapáginaaotrademaneraaquelapáginadestinoreconozcaelvalorasignadoporelscriptdeorigen:
PasarvariablesporURL
Parapasarlasvariablesdeunapáginaaotralopodemoshacerintroduciendodichavariabledentrodelenlacehipertextodelapáginadestino.Lasintaxisseríalasiguiente:
<a href="destino.php?variable1=valor1&variable2=valor2&...">Mi enlace</a>
Podéisobservarqueestasvariablesnoposeenelsímbolo$delante.EstoesdebidoaqueenrealidadestemododepasarvariablesnoesespecíficodePHPsinoqueesutilizadoporotroslenguajes.
Ahoranuestravariablepertenecetambiénalentornodelapáginadestino.phpyestálistaparasuexplotación.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 88 de 142
Nota:Nosiempresedefinenautomáticamentelasvariablesrecibidasporparámetroenlaspáginasweb,dependedeunavariabledeconfiguracióndePHP:register_globals,quetienequeestaractivadaparaqueasísea.Vercomentariosdelartículoalfinaldelapáginaparamásinformación.
Paraaclararposiblesdudas,veamosestoenformadeejemplo.Tendremospuesdospáginas,origen.html(noesnecesariodarleextensiónPHPpuestoquenohayningúntipodecódigo)ydestino.php:
<HTML>
<HEAD>
<TITLE>origen.html</TITLE>
</HEAD>
<BODY>
<a href="destino.php?saludo=hola&texto=Esto es una variable texto">Paso variables saludo y texto a la página destino.php</a>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>destino.php</TITLE>
</HEAD>
<BODY>
<?
echo "Variable $saludo: $saludo <br>n";
echo "Variable $texto: $texto <br>n"
?>
</BODY>
</HTML>
Ejecutarejemplo
$HTTP_GET_VARS
Recordamosqueesposiblerecopilarenunavariabletipoarrayelconjuntodevariablesquehansidoenviadasalscriptporestemétodoapartirdelavariabledesistema$HTTP_GET_VARS,queesunarrayasociativo.Utilizándoloquedaríaasí:
<?
echo "Variable $saludo: $HTTP_GET_VARS["saludo"] <br>n";
echo "Variable $texto: $HTTP_GET_VARS["texto"] <br>n"
?>
Nota:Aunquepodamosrecogervariablesconestearrayasociativooutilizardirectamentelasvariablesquesedefinenennuestrapágina,resultamásseguroutilizar$HTTP_GET_VARSpordosrazones,laprimeraqueasínosaseguramosqueesavarible
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 89 de 142
vienerealmentedelaURLylasegunda,queasínuestrocódigoserámásclarocuandolovolvamosaleer,porquequedaráespecificadoqueesavariableestamosrecibiéndolaporlaURL.
$_GET
Apartirdelaversión4.1.0dePHPsehaintroducidoelarrayasociativo$_GET,queesidénticoa$HTTP_GET_VARS,aunqueunpocomáscortodeescribir.
CaracteresespecialesenURLysucodificaciónconPHP
Hayalgunoscaracteresrarosquenosepuedenpasar,talcual,porlaURL.Porejemplo,unaURLnopuedecontenerespaciosenblanco,porloquesiintentasenviarunavariableporURLconunvalorquetieneunespacioenblanco,tedaráproblemas.Porejemplo,elsigno"*"nopuedefigurartampocoenunaURL.Asípues,tenemosquehaceralgoparaconvetiresoscaracteres,demodoquenodenproblemasenlaURL.
LasoluciónenPHPessencilla,simplementedebemoscodificarlavariablequetienecaracteresconflictivosaformatoURL.Paraelloutilizamoslafunciónurlenconde(),quevieneenlalibreríadefuncionesdePHP.PodemosencontrarmásinformaciónsobreestoenlaFAQ:ProblemasconvariablespasadasenlaURLenalgunoscaracteres.
Referencia:Silodeseas,puedescomplementarestainformaciónconunosexplicativosvideotutorialessobreelpasodevariablesporGETenPHP.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Procesarvariablesdeformularios.POSTenPHP
VeremoscómotransferirvariablesconPHP,deunapáginaaotrapormediodeformularios,loqueseconocehabitualmenteporPOST.
Estetipodetransferenciaesdegranutilidadyaquenospermiteinteraccionardirectamenteconelusuario.
ElprocesoessimilaralexplicadoparalasURLs.Primeramente,presentamosunaprimerapáginaconelformularioclásicoarellenarylasvariablessonrecogidasenunasegundapáginaquelasprocesa:
Nota:Nosiempresedefinenautomáticamentelasvariablesrecibidasporelformularioenlaspáginasweb,dependedeunavariabledeconfiguracióndePHP:register_globals,quetienequeestaractivadaparaqueasísea.Vercomentariosdelartículoalfinaldelapáginaparamásinformación.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 90 de 142
<HTML>
<HEAD>
<TITLE>formulario.html</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="destino2.php">
Nombre<br>
<INPUT TYPE="TEXT" NAME="nombre"><br>
Apellidos<br>
<INPUT TYPE="TEXT" NAME="apellidos"><br>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>destino2.php</TITLE>
</HEAD>
<BODY>
<?
echo "Variable $nombre: $nombre <br>n";
echo "Variable $apellidos: $apellidos <br>n"
?>
</BODY>
</HTML>
Ejecutarejemplo
$HTTP_POST_VARS
Recordamosqueesposiblerecopilarenunavariabletipoarrayelconjuntodevariablesquehansidoenviadasalscriptporestemétodoapartirdelavariabledesistema$HTTP_POST_VARS.
echo "Variable $nombre: " . $HTTP_POST_VARS["nombre"] . "<br>n";
Nota:Aunquepodamosrecogervariablesconestearrayasociativooutilizardirectamentelasvariablesquesedefinenennuestrapágina,resultamásseguroutilizar$HTTP_POST_VARSpordosrazones,laprimeraqueasínosaseguramosqueesavariblevienerealmentedeunformularioylasegunda,queasínuestrocódigoserámásclarocuandolovolvamosaleer,porquequedaráespecificadoqueesavariableestamosrecibiéndolaporunformulario.
$_POST
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 91 de 142
ApartirdePHP4.1.0sepuedenrecogerlasvariablesdeformularioutilizandotambiénelarrayasociativo$_POST,queeselmismoque$HTTP_POST_VARS,peromáscortodeescribir.
Ejemploderestriccióndeaccesoporedad
Paracontinuaraportandoejemplosalusodeformulariosvamosarealizarunapáginaquemuestrasolicitalaedaddelvisitantey,dependiendodedichaedad,permitaonovisualizarelcontenidodelaweb.Alosmayoresde18añosselespermiteverlapáginayalosmenoresno.
Elejemploesmuysencilloynovaldríatalcualestáparautilizarloamododeunaverdaderarestriccióndeacceso.Únicamentenossirveparasabercómoobtenerdatosdeunformularioycomotratarlospararealizarunauotraacción,dependiendodesuvalor.
Lapáginadelformulario,quehemosllamadoedad.phptendríaestaforma:
<html>
<head>
<title>Restringir por edad</title>
</head>
<body>
<form action="edad2.php" method="post">
Escribe tu edad: <input type="text" name="edad" size="2">
<input type="submit" value="Entrar">
</form>
</body>
</html>
EstaesunapáginasinningúncódigoPHP,simplementetieneunformulario.Fijémonosenelactiondelformulario,queestádirigidohaciaunapáginallamadaedad2.php,queeslaquerecibiráeldatodelaedadymostraráuncontenidouotrodependiendodeesevalor.Sucódigoeselsiguiente:
<html>
<head>
<title>Restringir por edad</title>
</head>
<body>
<?
$edad = $_POST["edad"];
echo "Tu edad: $edad<p>";
if ($edad < 18) {
echo "No puedes entrar";
}else{
echo "Bienvenido";
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 92 de 142
}
?>
</body>
</html>
Esperamosqueesteotrocódigotampocoresulteextraño.Simplementeserecibelaedad,utilizandoelarray$_POST.Luegosemuestralaedadyseejecutaunaexpresióncondicionalenfuncióndequelaedadseamenorque18.Encasopositivo(edadmenorque18),semuestraunmensajequeinformadequenosedejaaccederalpágina.Encasonegativo(mayoroiguala18)semuestraunmensajedebienvenida.
Podemosverelejemploenfuncionamiento.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ConceptosdeprogramaciónenPHPporlapráctica
Vídeoenelqueaclaramosypracticamosconconceptosbásicosdeprogramacióncomovariables,estructurasdecontrol,bucles,etc.
Enestevídeoexplicamosalgunosconceptosdeprogramaciónbásicos,orientadosapersonasquenosabenprogramaciónoquetienenpocaexperienciaprogramando.EslaterceradeunaseriedetresclasesgratuitasimpartidasenDesarrolloWeb.comparaacercarsealmundodelaprogramaciónconPHP.
Elobjetivoesconcretarenlíneasdecódigo,ydesdeunpuntodevistapráctico,algunosdelosconceptosvistosdurantelasdosprimerasclasesdePHPparano-programadores,comosonlasvariables,estructurasdecontrolparalatomadedecisiónyparahacerbuclesorepeticiones.Además,queremosrealizaralgúnejemploprácticoquenosayudeademostrarloútilqueesPHPparatareasdeldíaadíadelosdesarrolladores,comoeselenvíoyrecepcióndeunformulario.
PretendemosacercarelmundodePHPparapersonasquenotienenconocimientosdeprogramacióndeunamanerarápidaydarreferenciasparaseguiraprendiendo,asícomopresentartambiénlasegundaconvocatoriadelCursodePHPqueestamosorganizandoenEscuelaIT.
Enesteartículoencontrarásloscódigosdelosejerciciosrealizadosenclaseyalfinaldeltodo,elvídeodelapropiaclase,juntoconelturnodepreguntasquenosrealizaronlosestudiantes.
ComenzamoslaclaseexplicandocómoarrancarunservidorwebparapoderprogramarconPHPenlocal,porsialguientodavíaandaperdidoconeseasunto,ycómocolocararchivosdentrodelservidorparapoderaccederaellosdesde"localhost".Apartirdeellorealizamosdosejemplos:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 93 de 142
ConceptosbásicosparalaprogramaciónconPHP
Amododeprimerospasos,ydeintroducciónalmundodelaprogramaciónydellenguajePHP,enesteejemplosemostraronencódigoconceptosbásicosdelaprogramación.
1. Comentarios2. Variablesytipos3. Operadores,aritméticos,decadena,comparación,asignación4. Estructurasdecontrolparatomadedecisiones5. Bucles
Ellistadodecódigoqueserealizóendirectoeselsiguiente:
<!DOCTYPE html>
<html>
<head>
<title>Ej 1 de PHP</title>
</head>
<body>
<h1>Estoy en PHP!!</h1>
<?php
//codigo PHP
//echo "Hola mundo!!";
// variables
$mivariable = 2323;
$v2 = "texto";
//hacer algo con ellas
echo $v2;
echo "<br>";
//operaciones
// 1+4
// "hola" . "mundo"
// $v3 = "pepe";
/*
Esto es un comentario
de muchas
líneas
*/
$contador = 5 + 5;
$contador = $contador + 10;
echo $contador;
// estructuras de control
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 94 de 142
$edad = 34;
if($edad < 18){
echo "Si es menor de 18";
}
// repeticiones o bucles
while($contador < 100){
// todo esto se repetirá
echo "contador vale " . $contador;
echo "<br>";
$contador = $contador + 7;
}
?>
</body>
</html>
Ejemploprácticodeenvíoyrecepcióndeunformulario
EnunsegundoejercicioprácticodeestaclasedePHPsemostrólofácilqueesenviardatosdesdeunformularioaunapáginawebyrecibirlosparaprocesaryrealizaraccionesdiferentessegúnsusvalores.
SeexplicóqueunformulariosehaceenHTML,talcomoestamosacostumbradosahacersiyahemosrealizadopáginaswebenalgunaocasión.ElcódigodelapáginaconelformularioHTMLquerealizamoseselsiguiente:
<!DOCTYPE html>
<html>
<head>
<title>Formulario</title>
</head>
<body>
<h1>Ejemplo con formularios</h1>
<form method="post" action="recibe-formulario.php">
Nombre: <input type="text" name="nombre" value="Escribe tu nombre">
<br>
Edad: <input type="text" name="edad" value="">
<br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
TodalapartedePHPsequedasimplementeenlarecepcióndelosdatosdeeseformularioysuprocesamiento,queenesteejemploserealizóenunapáginayarchivoaparte.Elprocesamientoqueseimplementóesmuysencillo,simplementeparadarnoscuentadequebásicamenteconPHPpodemosaccederalosdatosdelformulariodeunamaneramuysencilla,
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 95 de 142
atravésdelosarrays$_POSTymencionandosus"hermanos"$_GETo$_REQUEST.
Elejemploesmuysimple,aunquepocoapocofuimoscomplicandounpocoparaintroducirdiversosmétodosdeintegrarcódigoPHPenunapáginaHTML,porloqueellistadoacontinuaciónpuedeparecerunpococomplejoenunprimervistazo,aunqueenlaclaseseexplicatodoperfectamenteypasoapaso.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>recibo datos del form</title>
</head>
<body>
<?php
//recibo
$nombre_usuario = $_POST["nombre"];
$edad_usuario = $_POST["edad"];
//valido los datos
//echo "Hola " . $nombre_usuario . " tu edad es " . $edad_usuario;
// toma de decisión en función de la edad
if($edad_usuario >= 18){
?>
<div style="color: blue;">
<b>
<?php
echo "Hola $nombre_usuario, como tu edad es $edad_usuario, puedes ver este contenido!!";
?>
</b></div>
<?php
}else{
//parte negativa
echo '<span style="color: red;">';
echo "Lo siento $nombre_usuario, no puedes ver esta página!!! Adiós!";
echo "</span>";
}
?>
</body>
</html>
VídeocompletodelaterceraclasedePHPparano-programadores
Acontinuaciónpuedesverelvídeocompletodelaclaseenelqueserealizanlosejemplosdecódigoanteriores,pasoporpaso,alolargode90minutos.Esperamosqueossirvaparaaclarar
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 96 de 142
muchosconceptosytambiénqueosresulteentretenido.
RecuerdaquepuedesseguiraprendiendoPHPconnosotrosdemaneraautodidactaconlosmanualesgratuitosdeDesarrolloWeb.comenlasecciónPHPafondoyquesiteinteresaaprenderdemaneraintensiva,guiadaypersonalizada,conclasesenvivodurantelaspróximassemanas,puedesapuntarteconnosotrosalCursocompletodePHP.
Paraverestevídeoesnecesariovisitarelartículooriginalen:http://desarrolloweb.com/articulos/conceptos-programacion-php-practica.html
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen10/09/2013Disponibleonlineenhttp://desarrolloweb.com/articulos/conceptos-programacion-php-practica.html
Autollamadadepáginas
PáginasquesellamanasimismaspasandodatosporPOSToGET:formulariosreentrantesyvariablespasadasporURLalamismapágina.
Alincluirunformularioenunapáginasedebeindicar,atravésdelatributoaction,elnombredelarchivoPHPalqueenviaremoslosdatosescritosenelformulario.Deestemodo,paraunesquemadeenvíodedatosporformulario,puedenparticipardospáginas:unaquecontieneelformularioyotraquerecibelosdatosdedichoformulario.
LomismoocurrecuandoenviamosvariablesporunaURL.Tenemosunapáginaquecontendráelenlaceyotrapáginaquerecibiráytrataráesosdatosparamostrarunosresultados.
Enelpresenteartículovamosavercómosepuedeenviaryrecibirdatosdeunformularioconunaúnicapágina.Asimismo,veremoscomoenlamismapáginapodemostenerenlacesconpasodevariablesporURLyademás,podemosrecogerytrataresosdatosconlamismapágina.Aesteefectopodemosllamarte"autollamadadepáginas",tambiénselesuelellamarcomo"Formulariosreentrantes"otérminossimilares.Esmuyinteresanteconocerelmododefuncionamientodeestosscripts,porqueseránmuyhabitualesennuestraspáginasPHPyayudanmuchoatenerloscódigosordenados.
Enamboscasos,paraformulariosoenvíodedatosporlaURL,sedebeseguirunesquemacomoeste:
ComprobarsirecibodatosporURLoporformularioSinorecibodatos
Muestroelformularioolosenlacesquepasanvariables.Sirecibodatos
EntoncestengoqueprocesarelformularioolasvariablesdelaURL
Paraunformulario
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 97 de 142
Veamosacontinuacióncomoseríaelcódigodeunformularioreentrante.
<html>
<head>
<title>Me llamo a mi mismo...</title>
</head>
<body>
<?
if (!$_POST){
?>
<form action="auto-llamada.php" method="post">
Nombre: <input type="text" name="nombre" size="30">
<br>
Empresa: <input type="text" name="empresa" size="30">
<br>
Telefono: <input type="text" name="telefono" size=14 value="+34 " >
<br>
<input type="submit" value="Enviar">
</form>
<?
}else{
echo "<br>Su nombre: " . $_POST["nombre"];
echo "<br>Su empresa: " . $_POST["empresa"];
echo "<br>Su Teléfono: " . $_POST["telefono"];
}
?>
</body>
</html>
Enelejemplo,elprimerpasoesconocersiseestánrecibiendoonodatosporunformulario.Paraellosecompruebaconunenunciadoifsiexisteonounavariable$_POST.
Enconcretoif(!$_POST)querríadeciralgocomo"Sinoexistendatosvenidosdeunformulario".Encasodequenoexistan,muestroelformulario.Encasodequesíexistan,recojolosdatosylosimprimoenlapágina.
Sepuedeverelejemploenfuncionamientoenunapáginaaparte.
ParapasodevariablesporURL
Laideaeslamisma.ComprobarconunenunciadoifsiserecibenonodatosdesdeunaURL.Veamoselcódigoacontinuación.Setratadeunapáginaquemuestraunaseriedeenlacesparaverlastablasdemultiplicardeel1hastael10.Cadaunodelosenlacesmuestraunatablademultiplicar.Pulsandoelprimerenlacepodemosverlatabladel1,pulsandoelsegundolatabladel2,etc.
Recordemosquelapáginasellamaasimisma.Paracomprenderlamásfácilmenteseráinteresanteverlaenfuncionamiento.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 98 de 142
<html>
<head> <title>Tablas de multiplicar</title>
</head>
<body>
<?
if (!$_GET){
for ($i=1;$i<=10;$i++){
echo "<br><a href='ver_tabla.php?tabla=$i'>Ver la tabla del $i</a>\n";
}
} else {
$tabla=$_GET["tabla"];
?>
<table align=center border=1 cellpadding="1">
<?
for ($i=0;$i<=10;$i++){
echo "<tr><td>$tabla X $i</td><td>=</td><td>" . $tabla * $i . "</td></tr>\n";
}
?>
</table>
<?
}
?>
</body>
</html>
Estecódigoesunpocomáscomplicado,porquehaceunpocomásdecosasqueelanterior,peroparaelasuntoquenosocupaqueeslaautollamadadepáginas,todosigueigualdesimple.
HayquefijarseenelifquecompruebasiserecibenonodatosporURL:if(!$_GET),quequerríadeciralgocomo"SinoserecibenvariablesporlaURL".
Encasopositivo(noserecibendatosporURL)semuestranlosenlacesparavercadaunadelastablasyencasodequesíserecibandatos,semuestralatablademultiplicardelnúmeroqueseestárecibiendoenlaURL.
Parahacerparamostrarlosenlacesylastablasdemultiplicarseutilizanbuclesfor,queesperamosquenoresultendesconocidosparaellector.PuedeconocersealgomássobrelosbuclesforenControldelflujoenPHP:BuclesII.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen24/04/2004Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
UtilizacióndelascookiesenPHP
AprendemossobrelascookiesenPHP.Explicamosenquéconsistenestas
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 99 de 142
célebresgalletasydescribimossuempleoyutilidad.
Sindudaestetérminoresultarafamiliarparamuchos.Algunoslohabránleídouoídoperonosabendequésetrata.Otrossinembargosabránquelascookiessonunasinformacionesalmacenadasporunsitiowebeneldiscodurodelusuario.Estainformaciónesalmacenadaenunarchivotipotextoqueseguardacuandoelnavegadoraccedealsitioweb.
Referencia:UnaexplicacióndelascookiesmásdetalladasepuedeencontrarenelartículoQuésonlascookies,publicadoenDesarrolloWeb.com.
Esposible,porsupuesto,verestosarchivos.ParaabrirloshayqueiraldirectorioC:WindowsCookiesparalosusuariosdeIE4+oaC:...NetscapeUsersdefaultuserparausuariosdeNetscape.Comopodréiscomprobar,enlamayoríadeloscasoslainformaciónquesepuedeobteneresindescifrable.
Lautilidadprincipaldelascookiesesladepoderidentificaralnavegadorunavezéstevisitaelsitioporsegundavezyasí,enfuncióndelperfildelclientedadoensuprimeravisita,elsitiopuedeadaptarsedinámicamenteasuspreferencias(lenguautilizada,coloresdepantalla,formulariosrellenadostotaloparcialmente,redirecciónadeterminadaspáginas...).
ParacrearcookiesconPHP,modificarogenerarunanuevacookielopodemoshacerapartirdelafunciónSetCookie:
setcookie("nombre_de_la_cookie",valor,expiracion);
Pongamosunejemplosencillo.Imaginemosquequeremosintroducirenunavariablecookieelnombredelvisitante.Elnombrehapodidoserpreviamenterecogidoporunformulariotalycomohemosvisto:
setcookie("persona",$nombre,time()+86400*365);
Deestemodohemoscreadounacookiephpllamadapersonaquetienecomovalorelcontenidodelavariable$nombreytendráunaduraciónde1añoapartirdesucreación(eltiempotime()actualensegundossumadoaunañoensegundos).
EsimportantequelacreacióndelacookieseapreviaalaaperturadeldocumentoHTML.Enotraspalabras,lasllamadasalafunciónsetcookie()debensercolocadasantesdelaetiquetaHTML.
Porotraparte,esinteresanteseñalarqueelhechodequedefinirunacookieyaexistenteimplicaelborradodelaantigua.Delmismomodo,elcrearunaprimeracookieconllevalageneraciónautomáticadelarchivotexto.
Parautilizarelvalordelacookieennuestrosscriptstansólotendremosquellamarlavariable
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 100 de 142
quedefinelacookie.¡Realmentesencillo!
HayquetenercuidadosinembargodenodefinirvariablesennuestroscriptconelmismonombrequelascookiespuestoquePHPprivilegiaráelcontenidodelavariablelocalconrespectoalacookieynodaráunmensajedeerror.Estonospuedeconduciraerroresrealmentedifícilesdedetectar.
Recordamosqueesposiblerecopilarenunavariabletipoarrayelconjuntodecookiesalmacenadaseneldiscodurodelinternautamediantelavariabledeservidor$HTTP_COOKIE_VARS
Lascookiessonunaherramientafantásticaparapersonalizarnuestrapáginaperohayquesercautosyaque,porunaparte,notodoslosnavegadoreslasaceptanyporotra,sepuededeliberadamenteimpediralnavegadorlacreacióndecookies.Esporelloqueresultanuncomplementoynounafuentedevariablesinfalibleparanuestrositio.Comohaspodidover,lasCookiessonmuysencillasdeutilizarenPHP.
Puedesprofundizarmásenlacreacióndecookiesenelsiguientearticulo:CookiesenPHP.Además,tambiénterecomendamosverelVideotutorialsobrelasCookiesenPHP.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
CookiesenPHP
ExplicacionescompletassobrecookiesenPHP,contodoslosparámetrosdelafunciónsetcookie()yelarray$_COOKIE
EnesteartículodelManualdePHPvamosademostrarosquelascookiesenPHPsonmuyfácilesdeutilizar.Yaempezamosaexplicaralgunasclavesinteresantessobreesteasuntoenelartículoutilizacióndecookies,anteriorentregadeltemariodeDesarrolloWeb.comsobrelaprogramaciónenPHP.
Enelpresenteartículovamosamostrarotrosdetallesqueconvienesaberparatrabajarconlascookies.Tantolosprocesosdecreacióncomolosdelectura,perosobretodovamosarealizarunestudiocompletosobrelosdiferentesparámetrosquetenemosdisponiblesalahoradellamaralafunciónsetcookie(),quesirveparadardealtalasgalletitasenelnavegadordelusuarioquevisitanuestraweb.
CrearcookiesenPHP
EnPHPlascookiessecontrolanpormediodeunafunción,quenossirveparagenerarlasyguardarlasenelnavegadordelusuario.Eslafunciónsetcookie(),querecibevariosparámetros,entreellos,elnombredelacookie,elvalorylacaducidad.Elúnicoparámetroobligatorioeselprimero,elnombredelacookie,losdemássonopcionales.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 101 de 142
Veamoslalistaenteradeparámetrosdesetcookie()consusexplicaciones:
Nombre
Unstringconelnombrequequeremosdarlealacookieaguardar.Puedesercualquieraquedeseemos.
Valor
Unacadenadecaracteresqueeselvalorquevaatenerlacookie.
Caducidad
Esuntimestampconelvalordelafechaenlaquecaducarálacookie.Lonormalesutilizarlafuncióntime(),quegeneraeltimestampactualysumarleelnúmerodesegundosquequedamosquedurelacookie.Porejemplo,time()+(606024*365)haríaquelacookieduraseunañoenelsistemadelusuario.
Ruta
Elcaminoorutadondelacookiesepodráutilizardentrodeldominio.Pordefecto,lacookiesepodráutilizareneldirectoriodondesehacreadoysussubdirectorios.Siindicamos"/"lacookietendrávalidezdentrodetodoeldominio.
Dominio
Eselsubdominiodondesepodráaccederalacookie.Lascookiessólosepuedengeneraryutilizarparaeldominiodelapáginadondeestácolocadoelscript,peropodemoshacerlovisibleparatodoslossubdominiosdeldominiodelawebpormediode".midominio.com".
Seguro
Esunboleanoque,siestrue,indicaquelacookiesólopuedesertransmitidaporshttp(httpseguro).
Sólohttp
Estoesotroboleanoquesirveparaindicarquelacookiesólopuedeseraccedidapormediodelascabecerasdelhttp,loquelaharíainalcanzableparalenguajesdescriptenelclientecomoJavascript.EsteparámetrofueañadidoenPHP5.2.0
Lafunctionsetcookie()dePHPgenerayenvíalacookiealnavegadorydevuelveunboleano,siestrueindicaquesepudoincluirenelnavegadordelusuarioysiesfalseindicaquenohapodidocolocarlaenelsistema.Peroestevalornoindicaqueluegoelvisitantelahayaaceptadoono,puestoqueelnavegadorpuedehaberloconfiguradoparanoaceptarcookiesy
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 102 de 142
estonolopuededetectarsetcookie()directamente.
Porejemplo,estasseríandiferentesllamadasasetcookie():
setcookie("migalleta", "mivalor");
setcookie("cookie2", "mivalor2", time() + 3600);
setcookie("otracookie", "valorfinal", time() + 3600, "/", ".midominio.com");
Peroatenciónenunasunto:Paraenviarunacookiealnavegadorsedebehacerantesdehaberenviadolascabecerasdelhttpalcliente,esdecir,antesdehaberescritocualquiertextoenlapágina.Sino,PHPpodrálanzarunerrordeheadersalreadysent(cabecerasyaenviadas).
RecuperarcookiesconPHP
Porotraparte,pararecibirlascookiesqueelnavegadordelusuariopuedatenercreadasenelsistemaseutilizaelarrayasociativo$_COOKIE.EnestearrayestántodaslascookiesquetienedisponiblelapáginaPHPeneldominioyeldirectoriodondeestácolocado.
Pormediodelnombredelacookieaccedemosasuvalor:
$_COOKIE["migalleta"];
$_COOKIE["cookie2"];
ParaverunejemplodeusodecookiesPHPaccederaltallerdePHPEstilosCSSdistintosaunapáginaconPHPycookiesoalVideotutorialsobrelasCookiesenPHP.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen19/12/2007Disponibleonlineenhttp://desarrolloweb.com/articulos/cookies-en-php.html
SesionesI
Nosintroducimosalconceptodesesiónyaprendemossumanejoyfuncionamiento.
Enlosprogramasquehemosvistohastaahora,hemosutilizadovariablesquesóloexistíanenelarchivoqueeraejecutado.Cuandocargábamosotrapáginadistinta,losvaloresdeestasvariablesseperdíanamenosquenostomásemoslamolestiadepasarlosporlaURLoinscribirlosenlascookiesoenunformularioparasuposteriorexplotación.Estosmétodos,aunqueútiles,nosontodoloprácticosquepodríanendeterminadoscasosenlosquelavariablequequeremosconservarhadeserutilizadaenvariosscriptsdiferentesydistanteslosunosdelosotros.
Podríamospensarqueeseproblemapuedequedarresueltoconlascookiesyaquesetratade
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 103 de 142
variablesquepuedenserinvocadasencualquiermomento.Elproblema,yalohemosdicho,esquelascookiesnosonaceptadasniporlatotalidaddelosusuariosniporlatotalidaddelosnavegadoreslocualimplicaqueunaaplicaciónquesesirvieradelascookiesparapasarvariablesdeunarchivoaotronosería100%infalible.Esimportanteavecespensaren"lainmensaminoría",sobretodoenaplicacionesdecomercioelectrónicodondedebemoscaptarlamayorcantidaddeclientesposiblesynuestrosscriptsdebenestarpreparadosantecualquiereventualdeficienciadelnavegadordelcliente.
Nosresultapuesnecesarioelpoderdeclararciertasvariablesquepuedanserreutilizadastantasvecescomoqueramosdentrodeunamismasesión.Imaginemosunsitiomultilingüeenelquecadavezquequeremosimprimirunmensajeencualquierpáginanecesitamossaberenquéidiomadebehacerse.Podríamosintroducirunscriptidentificadordelalenguadelnavegadorencadaunodelosarchivosobiendeclararunavariablequefuesevalidaparatodalasesiónyquetuviesecomovalorelidiomareconocidoenunprimermomento.
Pensemostambiénenuncarritodelacompradeunatiendavirtualdondeelclientevanavegandoporlaspáginasdelsitioyañadiendolosartículosquequierecomprarauncarrito.Estecarritopodríaserperfectamenteunavariabledetipoarray(tabla)quealmacenaparacadareferencialacantidaddeartículoscontenidosenelcarrito.Estavariabledeberíaserobviamenteconservadacontinuamentealolargodetodoslosscripts.
Estetipodesituacionessonsolventadasapartirdelasvariablesdesesión.Unasesiónesconsideradacomoelintervalodetiempoempleadoporunusuarioenrecorrernuestraspáginashastaqueabandonanuestrositioodejadeactuarsobreélduranteuntiempoprolongadoobien,sencillamente,cierraelnavegador.
PHPnospermitealmacenarvariablesllamadasdesesiónque,unavezdefinidas,podránserutilizadasduranteestelapsodetiempoporcualquieradelosscriptsdenuestrositio.Estasvariablesseránespecificasdelusuariodemodoquevariasvariablessesióndelmismotipocondistintosvalorespuedenestarcoexistiendoparacadaunadelassesionesqueestánteniendolugarsimultáneamente.Estassesionestienenademássupropioidentificadordesesiónqueseráúnicoyespecífico.
AlgunasmejorasreferentesalempleodesesioneshansidointroducidasconPHP4.Esaestanuevaversiónalaqueharemosreferenciaalahoradeexplicarlasfuncionesdisponiblesylaformadeoperar.ParalosprogramadoresdePHP3ladiferenciamayoresqueestánobligadosagestionarellosmismoslassesionesdefinirsuspropiosidentificadoresdesesión.
VeamosenelsiguientecapítulolaformadeplasmarestanecesidadtécnicaennuestrosscriptsapartirdelasfuncionesquegestionanlassesionesenPHP.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
SesionesenPHPII
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 104 de 142
DescribimoslosmetodosdetrabajoconsesionesenPHP,inicializarsesión,crearvariablesdesesiónorecuperarlas.
Lassesiones,enaplicacioneswebrealizadasconPHPyeneldesarrollodepáginaswebengeneral,nossirvenparaalmacenarinformaciónquesememorizarádurantetodalavisitadeunusuarioaunapáginaweb.Dichodeotraforma,unusuariopuedevervariaspáginasdurantesupasoporunsitiowebyconsesionespodemosalmacenarvariablesquepodremosaccederencualquieradeesaspáginas.
Digamosquelassesionessonunamaneradeguardarinformación,específicaparacadausuario,durantetodasuvisita.Cadausuarioqueentraenunsitioabreunasesión,queesindependientedelasesióndeotrosusuarios.Enlasesióndeunusuariopodemosalmacenartodotipodedatos,comosunombre,productosdeunhipotéticocarritodelacompra,preferenciasdevisualizaciónotrabajo,páginasporlasquehapasado,etc.Todasestasinformacionesseguardanenloquedenominamosvariablesdesesión.
PHPdisponedeunmétodobastantecómododeguardardatosenvariablesdesesión,ydeunjuegodefuncionesparaeltrabajoconsesionesyvariablesdesesión.Loveremosenesteartículo.
ParacadausuarioPHPinternamentegeneraunidentificadordesesiónúnico,quesirveparasaberlasvariablesdesesiónquepertenecenacadausuario.ParaconservarelidentificadordesesióndurantetodalavisitadeunusuarioaunapáginaPHPalmacenalavariabledesesiónenunacookie,obienlapropagaatravésdelaURL.Estosepuedeconfigurardesdeelarchivophp.ini.
TrabajoconsesionesenPHP
Cuandoqueremosutilizarvariablesdesesiónenunapáginatenemosqueiniciarlasesiónconlasiguientefunción:
session_start()
Iniciaunasesiónparaelusuarioocontinúalasesiónquepudieratenerabiertaenotraspáginas.Alhacersession_start()PHPinternamenterecibeelidentificadordesesiónalmacenadoenlacookieoelqueseenvíeatravésdelaURL.Sinoexistetalidentificadorsesesión,simplementelocrea.
Nota:Sienelphp.inisehadefinidolavariablesession.auto_start=1seinicializaautomáticamentelasesiónencadapáginaquevisitaunusuario,sinquesetengaquehacerelsession_start()
Unavezinicializadalasesiónconsession_start()podemosapartirdeahorautilizarvariablesdesesión,esdecir,almacenardatosparaeseusuario,queseconservendurantetodasuvisitaorecuperardatosalmacenadosenpáginasquehayapodidovisitar.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 105 de 142
Lasesiónsetienequeinicializarantesdeescribircualquiertextoenlapágina.Estoesimportanteydenohacerloasícorremoselriesgoderecibirunerror,porquealiniciarlasesiónsedebenleerlascookiesdelusuario,algoquenosepuedehacersiyasehanenviadolascabecerasdelHTTP.
Nota:siseintentaabrirunasesióndespuésdehaberenviadotextodelapáginaalclienteseobtendráelsiguientemensaje:Warning:session_start():Cannotsendsessioncachelimiter-headersalreadysent(outputstartedat…)
Unaveziniciadalasesiónpodemosutilizarvariablesdesesiónatravésde$_SESSION,queesunarrayasociativo,dondeseaccedeacadavariableapartirdesunombre,deestemodo:
$_SESSION["nombre_de_variable"]
Nota:$_SESSIONesunavariableglobalqueexisteapartirdePHP4.1.0.Lonormalesquepodamosaccederaesavariablenormalmente,perosinuestraversióndePHPnoestáactualizadapodemosintentarlocon$HTTP_SESSION_VARS,queestambiénunarrayasociativo,aunquenoesdeámbitoglobal.Si$HTTP_SESSION_VARStampocofuncionatendremosqueregistrarcadavariableporseparadoconlafunciónsession_register(),enviándoporparámetrolosnombresdelasvariablesdesesiónquedeseautilizardesdePHP.
Existenotrasdosconfiguracionesdelphp.iniqueafectanaltrabajoconvariablesdesesión,quesontrack_varsyregister_globals.Pordefectotrack_varsestáactivadoyregister_globalsestádesactivado.Esteeselcasonormalyelquesuponemostendráelservidordondeprogrames,perosiesasvariablescambianpodríacambiaralgunacosita,comoquelasvariablessetenganqueregistrarexplícitamenteconsession_register().
Ejemplodecódigoparadefinirunavariabledesesión
<?
session_start();
?>
<html>
<head>
<title>Generar variable de sesión</title>
</head>
<body>
<?
$_SESSION["mivariabledesesion"] = "Hola este es el valor de la variable de sesión";
?>
</body>
</html>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 106 de 142
Comosepuedever,esimportanteinicializarlasesiónantesdehacerotracosaenlapágina.LuegopodremosdefinirvariablesdesesiónenculquierlugardelcódigoPHPdelapágina.
Paraleerunavariabledesesiónsehaceatravésdelmismoarrayasociativo$_SESSION.Estansencillocomoharíamosparautilizarcualquierotravariable,loúnicoesquetenemosquehaberinicializadolasesiónpreviamente.Yporsupuesto,quelavariablequedeseamosaccederexistapreviamente.
<?
session_start();
?>
<html>
<head>
<title>Leo variable se sesión</title>
</head>
<body>
Muestro esa variable:
<?
echo $_SESSION["mivariabledesesion"];
?>
</body>
</html>
Comosepuedever,aliniciodelcódigohemosinicializadolasesiónyluegoencualquierpartedelcódigopodríamosaccederalasvariablesdesesiónquetuviésemoscreadas.
Nota:siintentamosaccederaunavariabledesesióncon$_SESSIONquenohasidocreadaobtendremosotromensajedeerror:Notice:Undefinedindex:mivariabledesesion,queeselmismoquesiintentamosaccederacualquierelementodeunarrayquenoexiste.
MássobresesionesenPHP
LasiguienteinformaciónsobresesionesdePHPtambiénpuedeserdeútillectura.Noobstanteloexpresadohastaaquíesunainformaciónmuchomásactualizada.Enlaspróximaslíneasseexplicanmecanismosparasesionesperotodoslosquesecomentan,aunquesonválidos,nosonactualesportratarsedeexplicacionesparaversionesdePHPmásantiguas.
Hemosdichoenelcapítuloanteriorquelavariablesdesesiónsediferenciandelasvariablesclásicasenqueéstasresidenenelservidor,sonespecificasdeunsolousuariodefinidoporunidentificadorypuedenserutilizadasenlaglobalidaddenuestraspáginas.
Parainiciarunasesiónpodemoshacerlodedosformasdistintas:
-Declaramosabiertamentelaaperturadesesiónpormediodelafunción_sessionstart().Estafuncióncreaunanuevasesiónparaunnuevovisitanteobienrecuperalaqueestásiendollevadaacabo.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 107 de 142
-Declaramosunavariabledesesiónpormediodelafunción_sessionregister('variable').Estafunción,ademásdecrearorecuperarlasesiónparalapáginaenlaqueseincluyetambiénsirveparaintroducirunanuevavariabledetiposesión.
Lassesioneshandeseriniciadasalprincipiodenuestroscript.Antesdeabrircualquieretiquetaodeimprimircualquiercosa.Encasocontrariorecibiremosunerror.
Conlovisto,vamosaproponerelejemploclásicodeutilizacióndeunasesión:uncontador.Estecontadordeberáaumentardeunaunidadcadavezquerecargamoslapáginaoapretamosalenlace:
<?
session_register('contador');
?>
<HTML>
<HEAD>
<TITLE>contador.php</TITLE>
</HEAD>
<BODY>
<?
If (isset($contador)==0)
{$contador=0;}
++$contador;
echo "<a href="contador.php">Has recargado esta página $contador veces</a>";
?>
</BODY>
</HTML>
Ejecutarscript
Lacondicióniftieneencuentalaposibilidaddequelavariable$contadornohayasidotodavíainicializada.Lafunciónissetseencargadedarunvalorcerocuandounavariablenohasidoinicializada.
Otrasfuncionesútilesparalagestióndesesionesson:
Paraaprendermássobrelassesiones,concretamenteparaverunaaplicaciónquegestionauncarritodecomprapormediodevariablessesiónvisitanuestroarticulodeltallerdePHP.
Sibuscasmásfuncionesoinformaciónadicionalsobrelassesiones,consultaelmanualoficialdePHP.
EsteartículoesobradeRubénAlvarez
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 108 de 142
Fuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 109 de 142
BasesdedatosenPHP
EntramosenunadelaspartesmásinteresantesdelmanualdePHP,conloscapítulosquetratanlasbasesdedatos.TrabajaremosconMySQLymostraremoscómohacertodaslasoperacionestípicasconunabasededatos,comoaccesoaregistros,inserción,modificaciónyborrado.
TrabajarconbasesdedatosenPHP
Interésdelempleodebasesdedatosconpáginasdinámicas.PresentacióndellenguajeSQLydelabaseMySQL.Pasospreviosalosejemplos.
Unadelasprincipalesventajasquepresentaeltrabajarconpáginasdinámicasdelladodelservidoreselpodertrabajarconcontenidosqueestánalojadosenbasesdedatos.Deestaforma,podemosorganizarlos,actualizarlosybuscarlosdeunamaneramuchomássimple.
EllenguajePHP,yahemosdicho,ofreceinterfacesparaelaccesoalamayoríadelasbasesdedatosexistentes.Podrásencontrarbasesdedatosdecódigoabierto,comoMySQL,comercialesporpietariascomoOracleyademástienelibreríasparaaccesoadatosporODBC,loquenospermitecomunicarcontodaslasbasesdedatosposiblesensistemasMicrosoft,comoAccessoSQLServer.Graciasalosjuegosdefuncionesexistentesparacadasistemagestordebasededatos,podremosrealizarcualquieracciónconlosdatosquenecesitemosparaeldesarrollodelamásvariadagamadeaplicaciónweb.
Estainteracciónserealiza,porunlado,apartirdelasfuncionesquePHPnosproponeparacadatipodebasededatosy,porotroestableciendoundiálogoapartirdeunidiomauniversal:SQL(StructuredQueryLanguage)elcualescomúnatodaslasbasesdedatos.Estelenguajeresulta,comoveremoseneltutorialdeSQL,muypotenteyfácildeaprender.AlolargodelmanualdePHPnoslimitaremosalautilizaciónlasinstruccionesSQLbásicas,queseránaprendidasamedidaqueexplicamoslasdiferentesformasdeactuarsobreunabasededatos,dejandoparaeltutorialdeSQLlosaspectosmásavanzadosdeeselenguajedeaccesoadatos.
ComobaseejemplodeestoscapítuloshemoselegidoMySQL,sindudalabasededatosmásextendidaencombinaciónconPHP.Sugratuidad,eficienciaysimplicidadlahanhechounabuenacandidata.Noobstante,encasodeutilizarcualquierotrabasecompatibleconPHP,lascorreccionesallevaracaboconrespectoanuestrosejemplosnosonexcesivamentegrandesylalecturadeesoscapítulosseguirásiendodegranutilidad.
Nota:YahemosexplicadoencapítulosanterioreslainstalacióndeMySQL,alavezquehemospresentadoloscomandosbásicosquenospuedenpermitirabordarlaconunarelativafacilidad.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 110 de 142
Configurarlabasededatosquevamosautilizarparalosejemplosdeestemanual
UnavezinstaladoMySQLyantesdepodercomenzarconnuestrosejemplos,seránecesariollevaracabolassiguientesoperaciones:
-IntroducidosdentrodeMySQL,crearemoslabasededatosejemploconlasiguientesentencia:
create database ejemplo;
-Seleccionaremoslabaseejemplocomolabaseautilizar:
use ejemplo
-Crearemosacontinuaciónlatablaclientesapartirdelasiguientesentencia:
create table clientes (
nombre varchar(100),
telefono varchar(100)
);
Ahorayadisponemosdenuestratablavacía.Sóloquedacomenzarallenarlaconlosdatosqueiremosinsertando.
Elconjuntodescriptsutilizadosparaelbloquedebasesdedatospuedeserdescargadoaquí.
GuióndeartículosrelativosalasbasesdedatosenPHP
Alolargodelmanualofreceremosvariosartículos,enlosquetrataremoscadaunodelosaccesosalabasededatosmástípicos,comoselecciones,actualizacionesoinserciones,siguiendoelsiguienteguión:
InserciónderegistrosSelecciónderegistrosActualizaciónderegistrosBorradoderegistros
ParacompletartodoaquelloquedebessabersobreelaccesoabasesdedatosenPHPencontrarásmultituddeartículosprácticosenelTallerdePHP,comosonlaRecepciónelúltimoIDdeunainserciónconPHPyMySQL,laPaginaciónderesultadosconPHPyMySQL,ProgramarunbuscadorconPHPyMySQL,etc.
Además,paralosqueprefieranverlotodopasoapasoenvivo,contamosconunvideotutorialsobrelasbasesdedatosenPHPqueteayudaráaentendermejorcómotrabajarconlasbases
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 111 de 142
dedatosenPHP.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
IntroduccióndenuevosregistrosconPHP
Formasencilladeintroducirnuevoselementosenunatabladebasededatos.RealizamosunInsertconPHP.
Unavezcreadalatablaclientesennuestrabasededatosejemplo,elpasosiguienteseallenarlaconregistros.Paraellovamosaveresteartículo,enelqueserecibendatosdesdeunformularioyluegoseinsertanconPHPenlabasededatos,enlatablaadecuada.
Losdatosdelregistropuedenserrecogidos,porejemplo,apartirdeunformulario.AquíosproponemosunsimpledocumentoHTMLquerecogelosdatosylosenvíaaunapáginaPHPqueseencargadeprocesarlos:
<HTML>
<HEAD>
<TITLE>Insertar.html</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Insertar un registro</h1>
<br>
<FORM METHOD="POST" ACTION="insertar.php">
Nombre<br>
<INPUT TYPE="TEXT" NAME="nombre"><br>
Teléfono<br>
<INPUT TYPE="TEXT" NAME="telefono"><br>
<INPUT TYPE="SUBMIT" value="Insertar">
</FORM>
</div>
</BODY>
</HTML>
Llegadosalapáginadestinodelformulario(insertar.php),loprimeroquehabráquehaceresestablecerunvínculoentreelprogramaylabasededatos.Estaconexiónsellevaacaboconlafunción_mysqlconnect.Acontinuación,deberemosgenerarunaordendeinsercióndelregistroenlenguajeSQL.Estaordenseráejecutadapormediodelafunción_mysql_dbquery.EnestafunciónespecificaremosprimeramentelabasededatossobrelaquequeremosactuaryacontinuaciónintroduciremoslasentenciaSQL:
<HTML>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 112 de 142
<HEAD>
<TITLE>Insertar.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
//Ejecucion de la sentencia SQL
mysql_query("insert into clientes (nombre,telefono) values ('$nombre','$telefono')");
?>
<h1><div align="center">Registro Insertado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>
</BODY>
</HTML>
Ejecutarejemplo
Losparámetrosuserypasswordsondefinidosporelcreadordelabase.Esconvenienteenunprincipio,alcrearnuestrasbases,trabajarsinellosconlocualdejaremoslascadenascorrespondientesvacias:"".
Ademásdelapropiainserción,elprogramaavisadelaintroduccióndelregistroyofreceunenlacehaciaunapáginadelecturalacualserácomentadaacontinuación.
NoentraremosenladescripcióndelaordenSQL,paracomprendermásacercadecómointroducirregistros,refererirsealtutorialdeSQL.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
SelecciónylecturaderegistrosconPHP
UtilizamoselcomandoSelectdeSQLparacrearunaseleccióndenuestratablaymostrartodoslosdatosenpantallapormediodeunbucle.ConPHP.
Dentrodeunabasededatos,organizadaportablas,laseleccióndeunatablaenteraodeunciertonumeroderegistrosresultaunaoperaciónrutinaria.
AquíosmostramosunaformabastanteclásicademostrarenpantallaapartirdeunbuclelosregistrosseleccionadosporunasentenciaSQL:
<HTML>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 113 de 142
<HEAD>
<TITLE>lectura.php</TITLE>
</HEAD>
<BODY>
<h1><div align="center">Lectura de la tabla</div></h1>
<br>
<br>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
//Ejecutamos la sentencia SQL
$result=mysql_query("select * from clientes");
?>
<table align="center">
<tr>
<th>Nombre</th>
<th>Teléfono</th>
</tr>
<?
//Mostramos los registros
while ($row=mysql_fetch_array($result))
{
echo '<tr><td>'.$row["nombre"].'</td>';
echo '<td>'.$row["telefono"].'</td></tr>';
}
mysql_free_result($result)
?>
</table>
<div align="center">
<a href="insertar.html">Añadir un nuevo registro</a><br>
<a href="actualizar1.php">Actualizar un registro existente</a><br>
<a href="borrar1.php">Borrar un registro</a><br>
</div>
</BODY>
</HTML>
Ejecutarscript
Lospasosarealizarson,enunprincipio,losvistosparalainsercióndeunregistro:Conexiónalabaseyejecucióndelasentencia.Estavez,lainformacióndedichaejecuciónseráalmacenadaenunavariable($result).
Elsiguientepasoseráplasmarenpantallalainformaciónrecogidaen$result.Estoloharemosmediantelafunción_mysql_fetcharrayquedevuelveunavariablearrayconloscontenidosdeunregistroalavezqueseposicionasobreelsiguiente.Elbuclewhilenospermiteleereimprimirsecuencialmentecadaunodelosregistros.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 114 de 142
Lafunción_mysql_freeresultseencargadeliberarlamemoriautilizadaparallevaracabolaconsulta.Aunquenoesnecesariasuutilización,resultaaltamenteaconsejable.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ActualizacióndeunregistrodelabasededatosconPHP
Explicamoscómomodificaroactualizarunregistroexistenteenunatabladeunabasededatos,conPHP.Esdecir,hacerunupdateparaunregistrodeunatabla,desdePHP.
Paramostrarcómoseactualizaunregistropresenteennuestrabasededatos,vamosahacerloapartirdeuncasounpocomáscomplejoparaqueempecemosafamiliarizarnosconestasoperaciones.Realizaremosunpardescriptsquepermitancambiarelnumerodeteléfonodelasdistintaspersonaspresentesennuestrabase.Elnombredeestaspersonas,asícomoelnuevonumerodeteléfono,seránrecogidospormediodeunformulario.
ElarchivodelformulariovaaserestavezunscriptPHPenelqueefectuaremosunallamadaanuestrabasededatosparaconstruirunmenúdesplegabledondeaparezcantodoslosnombres.Lacosaquedaríaasí:
<HTML>
<HEAD>
<TITLE>Actualizar1.php</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Actualizar un registro</h1>
<br>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
echo '<FORM METHOD="POST" ACTION="actualizar2.php">Nombre<br>';
//Creamos la sentencia SQL y la ejecutamos
$sSQL="Select nombre From clientes Order By nombre";
$result=mysql_query($sSQL);
echo '<select name="nombre">';
//Generamos el menu desplegable
while ($row=mysql_fetch_array($result))
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 115 de 142
{echo '<option>'.$row["nombre"];}
?>
</select>
<br>
Teléfono<br>
<INPUT TYPE="TEXT" NAME="telefono"><br>
<INPUT TYPE="SUBMIT" value="Actualizar">
</FORM>
</div>
</BODY>
</HTML>
Lamaneradeoperarparaconstruirelmenúdesplegableeslamismaqueparavisualizarlatabla.Denuevoempleamosunbuclewhileencombinaciónconlafunción_mysql_fetcharrayloquenospermitemostrarcadaunadelasopciones.
Elscriptdeactualizaciónserámuyparecidoaldeinserción:
Nota:ParaquiendeseeunareferenciacompletasobrecómosehacenlassentenciasUPDATEenellenguajeSQL,recomendamosleerelartículoActualizaciónderegistrosconUPDATEenSQL.
<HTML>
<HEAD>
<TITLE>Actualizar2.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
//Creamos la sentencia SQL y la ejecutamos
$sSQL="Update Clientes Set telefono='$telefono' Where nombre='$nombre'";
mysql_query($sSQL);
?>
<h1><div align="center">Registro Actualizado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>
</BODY>
</HTML>
Comohabéispodidocomprobar,laoperaciónUPDATEnotienedemasiadacomplejidad.Sinembargo,paraafianzarestosconocimientosrecomendamosverelvídeosobrelaactualizaciónderegistrosenMySQLconPHP.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 116 de 142
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
BorradodeunregistroconPHP
Aprendemosaeliminarregistrosdeunatabladebasededatos,conunejemploprácticoenPHP.
Otradelasoperacioneselementalesquesepuedenrealizarsobreunabasededatosesborrarunregistro.Parahacerlo,SQLnosproponesentenciasdeltipoDelete.Veámosloconunejemploaplicadoanuestraagenda.
Cabeseñalarqueprimerodebemosseleccionarelregistroquesedeseaborraryluegorealizarelborradopropiamentedicho.Paraellocrearemosunmenúdesplegabledinámico,dondesepodráseleccionarelelementoquesedeseaborrar.LuegosepasaráaunapáginaPHPunareferenciaalelementoseleccionado,paraborrarlodelabasededatos.
<HTML>
<HEAD>
<TITLE>Borrar1.php</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Borrar un registro</h1>
<br>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
echo '<FORM METHOD="POST" ACTION="borrar2.php">Nombre<br>';
//Creamos la sentencia SQL y la ejecutamos
$sSQL="Select nombre From clientes Order By nombre";
$result=mysql_query($sSQL);
echo '<select name="nombre">';
//Mostramos los registros en forma de menú desplegable
while ($row=mysql_fetch_array($result))
{echo '<option>'.$row["nombre"];}
mysql_free_result($result)
?>
</select>
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 117 de 142
<br>
<INPUT TYPE="SUBMIT" value="Borrar">
</FORM>
</div>
</BODY>
</HTML>
ElsiguientepasoeshacerefectivalaoperaciónapartirdelaejecucióndelasentenciaSQLqueconstruimosapartirdelosdatosdelformulario:
<HTML>
<HEAD>
<TITLE>Borrar2.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");
//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
//Creamos la sentencia SQL y la ejecutamos
$sSQL="Delete From Clientes Where nombre='$nombre'";
mysql_query($sSQL);
?>
<h1><div align="center">Registro Borrado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>
</BODY>
</HTML>
Nota:Varioscomentariospreguntanporelarchivolectura.phpqueestáenlazadoenelcódigodelejemplo.TenemosquedecirqueesearchivosecomentóenelartículodelaSelecciónylecturaderegistrosdelabasededatospormediodePHP.
ConestecapítulocerramoselbloquedeaccesosabasesdedatosconPHP.ParamasinformaciónrelacionadapodéisreferirosaltallerdePHPdondepodréisencontraralgúnqueotroartículointeresantealrespecto.Asimismo,paralosqueprefieranelvídeocomomaterialdidáctico,recomendamosverelVideotutorialsobrelasbasesdedatosconPHP.
EsteartículoesobradeRubénAlvarezFuepublicadoporprimeravezen01/01/2001Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 118 de 142
ActualizacióndefuncionesPHPparaaccesoaMySQL
LasnuevasversionesdePHPofrecenjuegosdefuncionesMySQLdiferentesdelostradicionales,queimplementandiversasmejorasenlagestióndebasesdedatos.
PHPestáenconstanteevoluciónypruebadeellosonlasnovedadesquevenimosacomentarenesteartículo.SetratadelasnuevasfuncionesdeaccesoabasesdedatosMySQLqueestándisponiblesdesdePHP5,connombresdiferentesalasfuncionesdisponiblesenelpasadoyquetambiéntienenalgunoscambiosenelmododetrabajar.LasnuevasfuncionesestáncreadasparadarrespuestaadiversasmejorasqueelsistemagestordebasesdedatosMySQLhaincorporadorecientemente.
Esteesuntemafundamental,sobretodoparalaspersonasqueconocenPHPdesdehacetiempo,quecomoyo,estábamosacostumbradosausarunjuegodefuncionesqueadíadehoyseencuentraobsoletoyquenoserecomiendautilizar.Realmente,enelmomentodeescribiresteartículolasfuncionesdeMySQLantiguastodavía,sepuedenusar,perolaprevisiónesqueseeliminenenPHP5.5,porloqueresultaimprescindibleactualizarnuestrosconocimientos.
Afortunadamente,esbastantesencilloelpasoalasnuevasfuncionesdeMySQL,puestoqueelesquemadefuncionamientoesprácticamenteelmismo,asícomolosnuevosnombresdefunciones,quetienenmuypocasvariaciones.Porlotanto,sitehasleídoelManualdePHPdeDesarrolloWeb.comyhasaprendidoconnosotrosatrabajarconlasbasesdedatos,notendrásrealmentemuchosproblemasenaprenderlasnovedadesquepasoarelataracontinuación.
DostiposdefuncionesparaaccesoalasbasesdedatosMySQL
UnadelasnovedadesquePHPnosofreceenlasrecientesfuncionesdePHPeslaincorporacióndedostiposaproximacionesaltrabajoconMySQL,queahorasepuedehacerporprocedimientos(funcionesnormalesdetodalavida)yporobjetos.
Nota:AntessólopodíamosaccederaMySQLporfuncionescomunes,peroahoratambiénpodemosaccederpormediodeclasesyobjetosdeprogramaciónorientadaaobjetos(POO).LaincorporaciónenelAPIdemétodosbasadosenPOOhacepatentequePHPestáteniendomuypresenteesteparadigmadedesarrollodentrodesunúcleoyquelatendenciaenlasnuevasversionesdePHPseráladepotenciarloaunmás.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 119 de 142
Funcionesbasadasenprocedimientos
ComovenimoshaciendotodalavidaconPHP.Funcionesnormalesycorrientes,querecibenparámetrosyquedevuelvenvalores.
FuncionesbasadasenPOO
Realmentesonconstructoresparaobtenerobjetosymétodosalosquepodemosaccederdentrodeesosobjetospararealizarlasoperacionesconlabasededatos.
Hayqueaclararqueambasaproximacionessonperfectamenteválidasyquenocambianlascosasquesepuedenhacerdesdeunauotra.Portanto,decantarnosporunouotromodonoimplicaráningunaventajaenfuncionalidad,nitansiquieraderendimiento.Dehecho,ambosmodosdetrabajosonel"mismoperrocondistintocollar".Portanto,estanválidaunaeleccióncomolaotraynuestrapreferenciaserámásbienporgustosocostumbresalahoradedesarrollar.
Nota:LoquenoserecomiendaesenunmismoproyectocambiardeunoaotroestilodeaccesoabasededatosMySQLdemaneraarbitraria.Debemostenerencuentaquerealmenteesarecomendaciónnoesdebidoaquenotevayaafuncionartuprograma,opuedasteneralgúnproblemadeterminado,sinomásbienesunacuestióndeestiloyclaridadalahorademantenerelcódigodetuproyecto.
AccesoaMySQLconfuncionesporprocedimientos
EnelmencionadoManualdePHPvenimosofreciendoejemplosparaaccesoabasededatosconfuncionesdetodalavida.Poreso,enesteartículovamosamostrarlasdiferenciasqueexistenconrespectoalasfuncionesantiguas,usandotambiéncódigoporprocedimientos.Sinembargo,comoverásacontinuación,lasfuncionessonprácticamentelasmismasalasqueseleshaagregadouna"i".Porejemplo,mysql_connect()pasaasermysqli_connect().Losparámetrossonlosmismosenmuchoscasos,omuyparecidos.
Nota:esteartículonoesuntutorialdeaccesoabasesdedatosconPHP,paraesoyadisponemosdelmanualdePHPenDesarrolloWeb.com.RealmentesetratadeunaseriedeguíasparapoderreciclarnuestrosconocimientosconelPHPdeversionesanteriores.
Conexiónconlabasededatos:mysqli_connect()
Ahoraindicamostambiénlabasededatosalaquequeremosconectarnos.Yatención,porqueloquenosdevuelvelafunciónnoesunlinkoidentificadordelaconexiónconlabasededatos,sinounobjeto.PeroaunquenosepasPOO,notepreocupesporestedetalle,puespoconos
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 120 de 142
importaalosdesarrolladores,dadoquevamosausareseobjetocomosifuerasimplementeelidentificadordelaconexión,osea,vamosausarlocomohacíamosanteriormenteenPHP.
$conexion = mysqli_connect("localhost", "usuario", "clave", "mi_bbdd");
Cerrarlaconexión:mysqli_close()
Tenemosquepasarlecomoparámetrosiempreelobjetoqueobtuvimosaliniciarlaconexión.
mysqli_close($conexion);
Ejecutarunaconsulta:mysqli_query()
Estafunciónesexactamenteigual,aunqueenestecasorecibeobligatoriamentecomoprimerparámetroelobjetodeconexiónalabasededatosquerecibimosalconectarnos.ElsegundoparámetroeslasentenciaSQLquesedeseaejecutarenMySQL.
$resultado = mysqli_query($conexion, "select * from cliente");
Otroaspectointeresanteesquenosdevuelveunvalorquepuedeser,obienunbooleanoparasabersilaconsultaseejecutóconéxito,comoenelcasodeun"insert"o"delete",obienunobjetoresultadoconunconjuntoderegistrosenelcasodeun"select".
Extraerunregistrodelconjuntoderesultados:mysqli_fetch_array()
Estafunciónesexactamenteigual,recibeelconjuntoderesultadosdelquequeremossacarunregistro.Devuelveenestecasoun"array",peroestáigualmentemysqli_fetch_object()quedevolveríaunobjeto.
$fila = mysqli_fetch_array($resultado);
Contarelnúmerodefilasdeunresultado:mysqli_num_rows()
Tambiénesexactamenteigual,simplementelepasamoselobjetoconjuntoderegistrosdelquequeremossaberelnúmerodefilasoregistrosquecontiene.
$fila = mysqli_num_rows($resultado)
Conclusión
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 121 de 142
Engeneral,comoestáspudiendocomprobar,elsistemanovaríamuchodeloqueyaconocesenelpasado.Cambiannombresdefuncionesmínimamenteyalgúnparámetrosueltoaquíyallí.
CreoqueelpasoparausarlasnuevasfuncionesMySQLestanrápidoquenotienesentidoseguirusandolasfuncionesantiguasyademásenbreveelcambioseráobligadoporquelosaccesosantiguosquehacíamosaMySQLdejarándefuncionar.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen11/03/2013Disponibleonlineenhttp://desarrolloweb.com/articulos/actualizacion-funciones-php-mysql.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 122 de 142
Subirunaaplicaciónwebalservidor
Unavezquehemosterminadounaaplicaciónwebenlocal,tenemosqueponerlaenproducciónenunservidordeInternet.Mostramoscómosubirtodaslaspáginasaunservidoryalgunasdelasposiblestareasquenostocarárealizarparasubirtambiénlabasededatos.
SubirunaaplicaciónPHPalservidor
VamosavercómosubirunaaplicaciónhechaenlocalaunservidordeInternet.Empezamosofreciendounaseriedepautasparasubirlosarchivos.
Enelpasadomesolicitaronqueescribiesesobreuntemaquehastaahoranohabíamostocadomásquederefilón,queconsisteenlapuestaenmarchadeunaaplicación,programadaenlocal,anuestroservidordehosting,esdecir,enelpasodesubirtodoslosarchivosPHPylabasededatosanuestroespacioenelservidorwebcontratadoenunproveedordealojamiento.
Eltemaesperoqueresultefamiliaramuchasdelaspersonasqueleennuestrosartículos,yaqueprobablementehayantenidoquepasarporesaetapaenalgunaocasión,aunquepretendodaralgunasclavesytruquillosquepuedenayudaratodos,tenganonoexperienciaenesteasunto.
Subirlosarchivos
Nuestroservidorwebdebetenerundirectorioparalapublicacióndelaspáginasweb.Eseseríaellugardondehayquesubirlosarchivos.php.
Dependiendodelproveedorconelquetrabajemos,eldirectoriodepublicaciónpuedevariar.Generalmente,cuandocontratamosunalojamiento,nosproporcionanunacuentadeFTPconlaqueconectarnosalservidorwebytransferirlosarchivosdenuestrositio,ademásdeunosdatosparalaconexión,queseránelnombredelservidoryelusuarioycontraseñaparaelaccesoalFTP.
Referencia:porsialguiennosabeloqueeselFTP,hablamosmássobreelloenelmanualdePublicarenInternet,concretamenteenelartículoSubirlosarchivosalservidor.
AlconectarnosalservidorconlosdatosdelFTP,quedebenserproporcionadospornuestroproveedor,accederemosaundirectorio.Estedirectoriopodríasereldepublicación,aunquegeneralmentenoesasí,sinoquesueleserunsubdirectoriollamado"HTML"o"docs"oalgosimilar,quecuelgadeldirectoriodeinicioennuestraconexiónFTP.Comodecía,estedirectoriopuedetenernombresdistintosenproveedoresdistintos,aunque,encualquiercaso,
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 123 de 142
conunasimplepreguntaanuestroproveedorresolveremosesaduda.
Losarchivossedebensubiraldirectoriodepublicación,oacualquiersubdirectoriodeeste.Endefinitiva,lostendremosquealojarporahídentroyparaaccederaellosbastaríaconescribirelnombredeldominiooURLdenuestroalojamiento,seguidodelnombredelarchivo.Situviésemosunarchivollamadohola.phpynuestroalojamientosehacontratadoparaeldominiowww.midominio.com,deberíamossubiresearchivoaldirectoriodepublicaciónyaccederíamosalarchivoescribiendo:
http://www.midominio.com/hola.php
SicreamossubdirectoriosdentrodeldirectoriodepublicaciónpodremosaccederaellosescribiendoelnombredeldominiooURLdenuestroalojamiento,seguidodelnombredeldirectorioyelnombredelarchivo.Porejemplo,sicreamosunsubdirectoriollamadopaginasytenemosdentrounarchivollamadopag1.php,podríamosaccederaéldelasiguientemanera.
http://www.midominio.com/paginas/pag1.php
Referencia:hayotroconceptointeresantequedeberíamosconocerllegadosaestepunto,queesel"documentopordefecto".ÉstenoesmásqueelarchivoqueseenvíaalnavegadorsienlaURLaccedidanoseespecificabaningúnarchivo.Suelellamarseindex.htmloindex.php(oindex.aspsinuestroservidorsoportaprogramaciónenASP),aunquepuedevariardeunproveedoraotro.HablamosmássobreeldocumentopordefectoennuestromanualdePublicarenInternet.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen10/06/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
ColocarlosarchivosPHPfueradeldirectoriodepublicación
Algunoscasosenlosquecolocararchivosfueradeldirectoriodepublicacióntienesentidoyutilidad.
Pordeciralgomássobreeltemadecolocarlosarchivos,queríaseñalarquecualquiercosaquepongamosfueradeldirectoriodepublicaciónnopodráseraccedidaatravésdelnavegador.Esdecir,sicreamosundirectorioquesellamefunciones_phpenelmismonivelqueeldirectoriodepublicación(fueradeldirectoriodepublicación)nopodremosaccederconelexploradoralosarchivosquecoloquemosdentrodeningunadelasmaneras.EstoesasíporquelaURLdeiniciodenuestroalojamientocorrespondeconesedirectorioynopodemosmovernoshaciadebajodeesedirectorioconlasURLs,quesonlamaneradeespecificaralnavegadorlosrecursosalosquesequiereacceder.
Nota:YaseexplicóloqueeraeldirectoriodepublicaciónenelcapítuloanteriorsobreSubirarchivosPHPalservidor.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 124 de 142
NoseríaposiblesalirdeldirectoriodepublicaciónconunaURLcomoesta,pormuchoqueutilicemoseloperador..(quesirveparaaccederaldirectoriopadre).
http://www.midominio.com/../funciones_php/archivo_inalcanzable.php
Sinembargo,colocaralgunoscontenidosfueradeldirectoriodepublicaciónpuedesermuyútil.Porejemplo,podríamoscolocarallícopiasdeseguridaddealgunosarchivosodocumentosquesimplementequeremosguardarenelservidorparaaccederaellosdesdecualquierparteyconnuestroprogramadeFTP.
Hayotrautilidadmásinteresantesobrecolocararchivosfueradeldirectoriodepublicación.Setratadequemuchasvecesutilizamosennuestrosprogramastrozosdecódigorepetidamente,porejemplo,paraabrirycerrarbasesdedatos,paramostrarlacabeceradenuestroportal,paracomprobarqueunemailescritoenunformularioescorrecto,etc.EsmuyútilsepararestostrozosdecódigoenunarchivoaparteyllamaraestearchivoconlasfuncionesPHPinclude()orequire().Así,siundíamodificamoslacabeceradenuestroportal,sólolotendremosquemodificarenunarchivo,o,sicambialabasededatosqueutilizamossólotendríamosquemodificarelarchivoquehacelaconexiónalabasededatosunavez,enlugardeircambiándoloentodaslaspáginasPHPqueabríanlasbasesdedatos.
Estosarchivosnosonpáginasindependientes,sinotrozos.Seguramente,silosejecutamosporseparadonomostraríanningúnresultadoválido,inclusopodríandarmensajesdeerror.Porestarazónmerecelapenacolocarlosenunlugardondenadiepuedateneracceso:fueradeldirectoriodepublicación.ConPHPsiquepodremosaccederaesedirectorioparaincluiresosarchivos.SolamentedeberíamosutilizarlasfuncionesPHPinclude()orequire()indicandolarutaparaaccederalosarchivos.
Enelcasodequetengamosunapáginallamadahola.phpeneldirectoriodepublicaciónyunarchivo,quesellamaabre_base_datos.php,eneldirectoriofunciones_php,queestáfueradeldirectoriodepublicación,siquisiéramosacceder(desdehola.php)alarchivoqueabrelabasededatosloharíamosasí.
include("../funciones_php/abre_base_datos.php")
DesdePHPsíquepodemosaccederalosarchivosqueseencuentranfueradeldirectoriodepublicación.Paraelloespecificamoslarutaadecuada,enlaqueutilizamoseloperador..parabajaraldirectoriopadre.
Nadamásquedecirsobrelacolocacióndelosarchivos:unavezsituadoseneldirectoriodepublicaciónsepodráaccederaellosconnuestronavegadorysedeberíanejecutarperfectamente.Aunquecabeseñalarque,tantoPHPcomoelservidordondetrabajemos,puedentenerconfiguracionesdistintasypuedequealgúndetalledelaprogramacióndenuestraspáginasnofuncionecorrectamente.
Porejemplo,nuestroPHPpuededeclararonoautomáticamentelasvariablesquelleganatravésdeunformulario.Sienlocalsiqueestabaconfiguradoparahacerestoyenremotono,deberíamoslocalizarloslugaresdonderecogemoslasvariablesyutilizarlasvariablesde
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 125 de 142
entornocorrectas(mirarartículosobreProcesarvariablesdeformulariosyloscomentariosalpieparasabermásdeestaposiblefuentedeerrores).
Aunqueestenoesuncasohabitual,podemosponernosencontactoconnuestroproveedordealojamientoparaversipuedenayudarnosconfigurandoelsistemaoindicandolospasosaseguirparasolventarennuestrosscriptselasunto.
Comentario:elsiguientescriptcalculaelniveldedirectoriodelosscriptsquequeremosincluirenlapáginaactual.
// Hallamos el nivel de directorio en que está ubicada la página
1\. Se hace un recuento de los caracteres que contiene el nombre del script
actual.
-
$Chars = count_chars($PHP_SELF,1);
-
2\. Exploramos la tabla de los caracteres devueltos buscando el carácter ('/'
Código 47 ) de directorio (carpeta) que devuelve Apache.
-
foreach ($Chars as $Char=>$nChars){
if ($Char==47) {$n=$nChars;break;}
}
-
3\. Generamos una cadena de n-1 veces con la subcandena "../" que nos da el
nivel de directorio en que se encuentra el script.
-
if ($n==0) $PathString=""; else $PathString=str_pad("",($n-1)*3,"../");
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen10/06/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
SubirunabasededatosalsevidordeInternet
ElsegundopasoparasubirunaaplicaciónPHPalservidorconsisteencolocarlabasededatosenel
Apartedelosarchivosdelapágina,debemossubirlabasededatosconlaquetenemosquetrabajar.LasbasesdedatosconlasquetrabajaPHPsonmuyvariadasyendistintoscasospodemosutilizarunauotra,porloquelosmodosdesubirlabasededatostambiénpuedenvariar.
Nota:Esteartículoylossucesivos,quetratansobresubirunabasededatosMySQLalservidor,seenglobantantodentrodelManualdePHPcomodelTallerdeMySQL.Porello,seráimportantedisponerdeconocimientosdeambastecnologíasparaentenderyaprovecharestasexplicaciones.
EsmuycorrientequenuestroproveedordehostingofrezcajuntoconPHPlabasededatos
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 126 de 142
MySQL,asíquelasnotasparasubiresabasededatosalservidordeesteartículovanencaminadasaofrecersolucionesparaesabasededatos.
LabasededatosMySQLnosepuedesubirporFTP,comoquesehacíaconlosarchivosdelcódigoPHP.Parasubirlatendremosqueutilizarotrosmecanismos.Voyadistinguirentretrescasosdistintosenlosquenospodríamosencontrarenestemomento:
1. Labasededatosquepretendemossubirestávacía.Tansólohemoscreadolastablas,peronohemosintroducidodatosenellaso,alosumo,tienenalgúndatoquehemosintroducidodepruebas.
2. LabasededatosquequeremossubirestácompletayesunabasededatosMySQL.Enestecasotenemoscreadalabasededatosenlocalycontodalainformacióndentroy,porsupuesto,queremosqueesainformaciónquedetambiénenlabasededatosremota.
3. Labasededatosestácompleta(comoelcasoanterior),peronoesunabasededatosMySQL.Enestecasoestaríamoshaciendounamigracióndelabasededatosdeunsistemagestoraotro.
Veremoslostrescasosporseparadoenadelante,aunque,antesdeello,vamosamostrarunasherramientasquenosservirándemuchaayudaparalaadministracióndecualquierbasededatosremota.
LasherramientasenconcretoserelatanenelmanualTallerdeMySQL,sonlassiguientes:
PhpMyAdmin.UnaaplicacióncreadaenPHPquepodemosinstalarennuestroespaciodealojamientoparaadministrarlabasededatos.MysqlControlCenter(enadelanteMyCC).UnaaplicaciónWindowsquepermitecontectarseamúltiplesbasesdedatosMySQL,queseencuentrenenlocaloenremoto.Access.TambiénpermiteadministrarunabasededatosMySQLconectadaenlocaloenremoto.Enestecasoseutilizaunainterfazquemuchosyaconocen,comoesAccess,paraadministrarunabasededatosquenadatienequevercondichoprograma.
Enlostrescasosloquenospermiterealizarelsoftwaredeadministraciónsontareassobrelabasededatosdetodotipo,comopuedensercreartablas,modificarlas,insertardatos,borrarlos,editarlos.Modificaroborrartablasocamposdelasmismas,etc.
Laeleccióndeunaherramietaodeotrapasaporlosrecursosquenospermitanutilizarennuestroproveedor.Básicamente,loquenospuededecantaraunaopciónuotra,essipermitenonoconectardemaneraremotalabasededatosMySQL.Conozcoalojamientosdondesepermiteesaconexiónremotaydondeno.
SinopermitenconectarnosremotamentenosdecantaremosporPhpMyAdmin,puesesunaaplicaciónPHPqueseconectaenlocalyalaqueseaccededesdeunapáginawebyesolopermitentodoslosproveedores,inclusohaymuchosquetieneninstaladoyaestesoftwareparaadministrarlasbasesdedatos.
Encasodequesínospermitanconectarnosremotamenteconlabasededatos,eligiremosMyCCoAccess,quesonaplicacionesWindowsmuchomáspotentesyrápidasquelasqueutilizaninterfazweb,comoPhpMyAdmin.EspreferibleutilizarMyCCporqueestá
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 127 de 142
especialmentedesarrolladoparaconectaryoperarconbasesdedatosMySQL.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen26/06/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
SubirbasededatosMySQLvacíaalservidor
Labasededatosquepretendemossubirestávacía.Tansólohemoscreadolastablas,peronohemosintroducidodatosenellaso,alosumo,tienenalgúndatoquehemosintroducidodepruebas.
Esmuynormalquehayamosdiseñadounabasededatosparanuestroproyectodesde0,definiendolasdistintasentidadesdenuestromodelodedatos,juntoconsuscamposysustipos.
Enestoscasoslomásprobableesquelabasededatosestévacía,obiencontengadatosquehayamosintroducidoamododepruebayquenoqueramosconservarcuandosubamoslaaplicaciónaInternet.
Laopciónmásinteresanteentoncespodríasercrearotravezlastablasquetenemosenlocalenlabasededatosremota.Paraellotenemosdosposibilidades:
Sitenemospocastablasybastantesencillas:LaspodemoscrearenremotoconalgunaherramientacomoPhpMyAdminoMyCC.
Sitienemuchastablasy/omuycomplicadas:Larecomendaciónseríahacerunbackupdelaestructuraenlocalyrestaurarlaenremoto.Estonosevitarátenerquevolveracreartodaslastablasydefinirtodossuscamposysustipos.Puedeserunpocomáscomplicadoperosindudanosahorrarátiempo.
ParahacerelbackupdelaestructuraenlocalpodemosutilizaralgunaherramientacomoPhpMyAdmin,obienutilizarelcomandomysqldumpdesdelíneadecomandosdeMS-DOS.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 128 de 142
HerramientadebackupdePhpMyAdmin.Estámarcadalaopcióndeextraersolamentelaestructuradelastablas.Simarcamosademáslacasilla"Send",nuestronavegadorsedescargaráelbackupenunficherodetexto.Sinolopulsamossimplementesevisualizará.
Loquetenemosquehacerenestecasoesunbackupdelaestructuradelabasededatos,esdecir,los"createtables"osentenciasSQLparacrearlastablas.Seríaunmontóndesentenciasconestaforma:
# --------------------------------------------------------
#
# Table structure for table 'comentario'
#
CREATE TABLE comentario (
id_comentario int(5) unsigned NOT NULL auto_increment,
id_articulo int(4) DEFAULT '0' NOT NULL,
comentario text NOT NULL,
fecha int(14) unsigned DEFAULT '0' NOT NULL,
revisado tinyint(1) DEFAULT '0' NOT NULL,
nombre_comentario varchar(100) DEFAULT 'Nombre no especificado' NOT NULL,
email_comentario varchar(100) DEFAULT 'Email sin especificar' NOT NULL,
tipo tinyint(1) unsigned DEFAULT '1' NOT NULL,
PRIMARY KEY (id_comentario)
);
PararestaurarestassentenciastenemosopcionestantodentrodePhpMyAdmincomodeMyCC.EnamboscasosloquetenemosquehaceresejecutarestassentenciasenelservidorMySQLremoto.EnPhpMyAdmintenemosuncampoparaintroducirsentenciasSQLytambiénotrocampoparaseleccionarunarchivodetextocontodaslassentenciasSQL,paraejecutarlasunadetrásdeotra.EnMyCCtenemosunbotónquenospermiteabrirunaconsoladondeintroducirunaovariassentenciasSQLyejecutarlas.
HerramientadebackupyrestauracióndePhpMyAdmin
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 129 de 142
BotónparaintroducirsentenciasSQLenMyCC
Repetimos,estosólonosserviráparasubirlaestructuradelabasededatosynolosdatosquecontenga.Sideseamossubirtambiénlainformacióndelabasededatosentoncesdebemosutilizarotrasestrategias,relatadaspróximamente.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen26/06/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
SubirunabasededatosMySQLconlaestructuraylosdatos
ComotransferirunabasededatosMySQLquetenemosenlocalanuestroservidorremoto,incluyendotantolaestructuradelastablascomosusdatos.
Silabasededatosquedeseamossubirestállenadeinformaciónydeseamosqueseconserveunavezsubidalabasededatosaremoto,tenemosquerealizarunbackupdelabasededatosyrestaurarloenremoto.
Nota:EstasrecomendacionesestánpensadasparasubirunabasededatosMySQLquepodamostenerenlocalaunabasededatosMySQLquehayamoscontratadoenremoto.SilabaseorigennoesMySQLestaríamoshablandodeunamigracióndebasesdedatos,peroestoloveremosenunartículomásadelante.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 130 de 142
Enestecasoelprocedimientoseríamuyparecidoaldesubirunabasededatosvacía,relatadoanteriormente,conlasalvedaddequeahoradebemosextraernosololaestructuradelabasededatos,sinotambiénlosregistrosquecontiene.
Paraellopodemosutilizarmysqldump,segúnserelataenesteartículo,obienPhpMyAdmin,seleccionandolaopciónqueindicaqueelbackupcontengalaestructuraylosdatos(Structureanddataenversioneseninglés).
LaestructuraylosdatosvendránenunficherodetextoconunaseriedesentenciasSQLparacrearlastablasylosinsertnecesariosparaintroducircadaunodelosdatos.
Pararestaurarlabasededatosloharemostalcomoseharelatadoparaelcasodequelabasededatosestuvieravacía,conlaayudadeunainstalacióndePhpMyAdminenremotoounMyCCqueseconectealabasededatoscontratadaenelservidordeInternet.
Sitenemosproblemasparasubirelficherodebackupdelabasededatosesposiblequeennuestroproveedordealojamientonospuedaayudarasubirelficheroyrestaurarlo.Comoelproveedordisponedelosservidoresensuspropiasinstalaciones,tienemuchasmásposibilidadesquenosotrosparatrabajarconlasbasesdedatos,sintemoraquelaslentascomunicacionesporInternetarrojenerroresenlarestauracióndelosdatos.
Sinuestroproveedornopuedeayudarnos,seguramentedispongaynosindiquealgúnmecanismopararealizarlatareasinlugaraerrores.Puedeocurrinosconalgúnproveedorquenosdigaqueseencargadetodoperonosexijaelpagodelashorasdetrabajodelinformáticoquevaarestaurarelbackupdelabasededatos.Sinoponefacilidadesnisiquieraenestoposiblementeseamejorirpidiéndolesquenosdevuelvaneldineroinvertidoporquesuservicionoseríamuybueno.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen23/07/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
MigrarunabasededatosaMySQL
IndicacionesútilesparamigrarunabasededatosaMySQL,esdecir,cuandotenemosquesubirunabasededatoslocalencualquiergestoraunabasededatosremotaenMySQL.
Elúltimocasoenelquenospodemosencontraralahoradesubirunabasededatosanuestroproveedordealojamientoesquelabasededatoslatengamoscreadaenlocal,peroenunsistemagestordistintodelquevamosautilizarenremoto.EnremotosuponemossiemprequevamosautilizarlabasededatosMySQL.EnlocalpodríamosdisponerdeunabasededatosAccess,SQLServerodeotrosistemadebasededatos.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 131 de 142
Elprocesodelamigraciónpuedeserbastantecomplejoy,comohaytantasbasesdedatosdistintas,difícildedarunarecetaquefuncioneentodosloscasos.Además,apartedeladificultaddetransferirlainformaciónentrelosdossistemasgestoresdebasededatos,tambiénnosinfluirámuchoenlacomplejidaddelproblemaeltipodelosdatosdelastablasqueestamosutilizando.Porejemplo,lasfechas,loscamposnuméricoscondecimalesolosboleanospuedendarproblemasalpasardeunsistemaaotroporquepuedenalmacenarsedemanerasdistintaso,enelcasodelosnúmeros,conunaprecisióndistinta.
RecomendacionesparamigrardeAccessaMySQL
SinuestrabasededatosanteriorestabaconstruidaenAccesslotenemosbastantefácil,graciasaqueMySQLdisponedeundriverODBCparasistemasWindows,quenospermiteconectarAccessconelpropioMySQLypasarinformaciónfácilmente.
EstetemaestárelatadoenelartículoExportardatosdeMySQLaAccess,aunquehayqueindicarquesideseamoshacerunaexportacióndesdeAccessenlocalaMySQLenremotopuedehaberproblemasporquenotodoslosalojadorespermitenlasconexionesenremotoconlabasededatos.Sinotenemosdisponibleunaconexiónenremotoconnuestroservidordebasesdedatosvamosatenerquecambiarlaestrategiaunpoco.
LaideaenesteúltimocasoesinstalarMySQLenlocalyrealizarlamigracióndesdeAccessenlocalaMySQLenlocalyluegopodríamoshacerunbackupdelabasededatoslocalysubirlaaremoto,talycomoseharelatadoantes.
RecomendacionesparamigrardesdeSQLServeraMySQL
Laverdadesquenohetenidoestecasonunca,perohayquedecirqueAccesstambiénnospuedeayudarenestecaso.AccesspermiteseleccionarunabasededatosSQLServerytrabajardesdelapropiainterfazdeAccess.LaideaesqueAccesstambiénpermitetrabajarconMySQLyposiblementehaciendounpuenteentreestosdossistemasgestorespodemosexportardatosdeSQLServeraMySQL.
LoqueesseguroqueutilizandoelpropioAccessdepuentepodríamosrealizareltrabajo.PrimeroexportandodeSQLServeraAcessyluegodesdeAccessaMySQL.
Otrasbasesdedatosuotrastécnicas
SilabasededatosorigendisponedeundriverODBCnohabrá(enteoría)problemaparaconectarlaconAccess,demanerasimilaracomoseconectaconMySQL.EntoncespodríamosutilizarAccessparaexportarlosdatos,porquedesdeallísepodríanaccederalosdossistemasgestoresdebasesdedatos.
SinotenemosAccess,olabasededatosoriginalnotienedriverODBC,obiennonosfuncionacorrectamenteelprocesoynosabemoscómoarreglarlo,otraposibilidadesexportarlosdatosaficherosdetexto,separadosporcomasoalgoparecido.Muchasbasesdedatostienenherramientasparaexportarlosdatosdelastablasaficherosdetexto,loscualessepuedenluegointroducirennuestrosistemagestordestino(MySQL)conlaayudadealgunaherramientacomoPhpMyAdmin.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 132 de 142
Paraello,enlapáginadepropiedadesdelatablaencontraremosunaopciónparahacerelbackupdelatablayparaintroducirficherosdetextodentrodeunatabla(Inserttextfilesintotableeninglés).
Accediendoaeseenlacepodremosverunformulariodondeintroducirlascaracterísticasdelficherodetexto,comoelcarácterutilizadocomoseparadordecampos,oelterminadordelíneas,etc,juntoconelpropioarchivoconlosdatos,yPhpMyAdminseencargarádetodoeltrabajodeincluiresosdatosenlatabla.
Comosehabrásupuesto,esnecesariotenercreadalatablaenremotoparaquepodamosintroducirlelosdatosdelficherodetexto.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 133 de 142
Cambiosdeunformatodedatosaotro
Todalamigracióntienequetenerencuentamuyespecialmente,comoyaseseñaló,lasmanerasquetengacadabasededatosdeguardarlainformación,esdecir,delformatodesustiposdedatos.Tenemosquecontarsiempreconlaposiblenecesidaddetransformaralgunosdatoscomopuedenserloscamposboleanos,fechas,camposmemo(textoconlongitudindeterminada),etc,quepuedenalmacenarsedemanerasdistintasencadaunodelossistemasgestores,origenydestino.
Enalgunoscasosposiblementetengamosquerealizaralgúnscriptquerealiceloscambiosnecesariosenlosdatos.Porejemplopuedeserparalocalizarlosvaloresboleanosguardadoscomotrue/falseavaloresenteros0/1,queescomoseguardaenMySQL.Tambiénlasfechaspuedensufrircambiosdeformato,mientrasqueenAccessaparecenencastellano(dd/mm/aaaa)enMySQLaparecenenelformatoaaaa-mm-dd.PHPpuedeayudarnosenlatareadehacerestescript,tambiénVisualBasicScriptparaAccesspuedehacerestastareascomplejasyelpropiolenguajeSQL,abasedesentenciasdirigidascontralabasededatos,puedeservirparaalgunasaccionessencillas.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen23/07/2003Disponibleonlineenhttp://desarrolloweb.com/articulos/12.php
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 134 de 142
EpílogosalManualdePHP
DiversosartículosquefinalizanestemanualdePHPyofrecenintroduccionesadiversosasuntosquesoninteresantesparaconocersobreestelenguajedeprogramación.Introduccionesaalgunasherramientasespecialmenteútiles,quepuedenayudarnosadesarrollarpáginasweb.
SeguridaddeproyectosPHP
Cómoevitarquenuestrosproyectoswebseanatacadosfácilmente.
Debidoalosavancesennuestromediotecnológico,nosencontramosconsituacionesquenosamarganlaexistencia,comoporejemplo:cuandonuestraswebssecaen,ingresodevirusanuestroPC,spamennuestroscorreos,etc.
Eltérminoseempezóautilizarenelaño2000porLuisvonAhn,ManuelBlumyNicholasJ.HopperdelaCarnegieMellonUniversity,yJohnLangforddeIBM.
ElsistemaCaptchatienelassiguientescaracterísticaspordefinición:
Soncompletamenteautomatizados,esdecir,noesnecesarioningúntipodemantenimientonideintervenciónhumanaparasurealización.Estosuponegrandesbeneficiosencuantoafiabilidadycoste.
Elalgoritmoutilizadoespúblico.Deestaforma,larupturadeuncaptchapasaaserunproblemadeinteligenciaartificialynolarupturadeunalgoritmosecreto.
Pueshabiendovistounpocoloqueescaptcha“CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart(PruebadeTuringpúblicayautomáticaparadiferenciaramáquinasyhumanos).
Enesteescenario,podríamosencontrarnoscondossituacionesbiendiferentes:
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 135 de 142
Tenerunsitiomontadoytenerqueprotegerlo.Programarunsitiodesdecero.
Escapedelasentradas.Paramuchoslamaneraidealdeprotegerunsite.Comoyahemosvistoenalgunodeloscasos,nonosesútil.Losmáshabitualessonelusode:
addslashes()/stripslashes()htmlentities($string,ENT_QUOTES)htmlspecialchars()mysql_real_string()
Teniendoactivadaslasmagic_quotes_gpcennuestrophp.ini,quenospondrápordefectounslashentodoslosstrings(evitandolostediosos"addslashes()").Entodocaso,elusodedichoselementosnospodrásalvardemuchosdelosataques.
Evitar,salvoencasosnecesarios,quelosformulariosPOSTsellamendesdeotrodominioquenoseaeldelpropioservidor.Enestecaso,nosevitaremosqueunatacanteavezadoutiliceunscriptatalefectoparairbloqueandonuestroservidoryllenándolodedatosinútiles.
Vamosaver,¿quéclasedeconfiguraciónseríalaóptimaparaqueunsistemaPHPfueramássegurocontratodotipodeataques?
Estasdirectivasserían:
Openbase_dirEstadirectivabienconfiguradaevitarálosataques"trasversaldirectories",debidoaquelimitaejecucióndeficherosalentornoqueescojamos.
Allow_furl_openoffEsimportantequeestadirectivaestéenOFFparaevitar"RemoteFileInclusion",yaquelainhabilitacióndeestadirectivanopermitiráalaaplicaciónhacerincluderemotos.
Register_globalsoffComoyahemosexplicado,quizálamásmaléfica(yobsoleta)formadequenuestrosatacantesdesplieguentodosupotencialesmedianteestadirectivaactivada.Esdecir,cualquierparámetroquenosvengaporPOSToGETpuedeserunavariablepotencialmentepeligrosaennuestroaplicativo.Así,cualquierparámetroexternosetratarádeformacuidadacon$_GET['param'],$_POST['param'],$_FILES['param']paraestablecerquétipodevariablessonexternasycuálesno.
Noserecomienda,anoserquesetengamuyclaroquéseestáhaciendo,elusode$_REQUEST,puesahípuedeentrar'cualquiercosa'quenosvengaexternamente,yfácilmentepodríanintroducirnosvaloresnoesperados.
Safe_modeonEstadirectivaactivadaevitarálaejecucióndealgunoscomandospotencialmentedañinosennuestrosistema,ademásdelchequeodeciertasfuncionesquepuedanconsiderarsedelicadas.Unalistadedichasfuncionespuedeencontrarseaquí:
php.net/manual/en/features.safe-mode.functions.php
Especialatenciónmerecentambiénlasdirectivas“safe_mode*”quecomponenlafamilia.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 136 de 142
safemode:safe_mode_gidsafe_mode_include_dirsafe_mode_exec_dirsafe_mode_allowed_env_varssafe_mode_protected_env_vars
Porúltimo,unasfuncionesque,segúnlacasuísticadenuestroaplicativopudieraevitarnosalgúnsustoporlaejecucióndecomandossensiblesquenoqueremos(ynodebemos)utilizar:
disable_functions<lista de funciones>disable_classes<lista de clases>
EscaneodepuertosUnamaneradeevitarataquesatodosistemaoperativo,yaseamediantewebomediantecualquierotrotipodevulnerabilidad,seríamediantelaejecucióndecódigoremotooinyeccióndecódigonodeseadoenserviciosquepuedantenerrelaciónconnuestrosistema.
Paraelloserecomiendaejecutarunescaneodepuertosdenuestramáquina(noúnicamentepuerto80-httpo443-SSL)paraaveriguarlasposiblesvulnerabilidadesoexploitsquepuedanafectaranuestrosistemayservidorweb:
Losmásconocidossonnmapynessus.Elfuncionamientodenmappuedellegarasersencillo,aunquetieneundesplieguedeopcionesque,abuenseguro,muchagenteencontraráinteresante.
Unaejecucióndeesteprogramapuededarlugaraunresultadocomoeste:
StartingNmap4.53(http://insecure.org)at2008060312:05CESTInterestingportson192.168.1.1:Notshown:1711closedportsPORTSTATESERVICE21/tcpopenftp23/tcpopentelnet80/tcpopenhttpMACAddress:00:02:CF:81:6F:89(ZyGateCommunications)
Nessus,encambio,nosofreceráunaherramientacliente/servidorqueutilizaráunabasededatosconlasvulnerabilidadesqueestadísticamentehanpodidoocasionar“desastres”ynosavisamedianteesteescaneo.
Lainterfaz,además,esbastantemásamigableynosmostraráunasestadísticasdelosprocesosejecutados.
Escaneodevulnerabilidadesweb
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 137 de 142
Másenconsonanciaconelobjetivodeesteartículo,estánlosescaneosdevulnerabilidadespropiamenteweb.Estosescaneossepuedenbasarenvariaspremisas,empleandosistemasdeconocimiento,funcionesheurísticaseinclusotécnicasfuzz,queveremosmásadelante.Unabuenacombinacióndeestoselementospuededarnosmuchaspistasalahoradeprotegernuestrositeyllegardondenosotrosnoalcanzamos.Empecemosporlosescaneadoresautomáticosmásempleadosypopulares.
Acunetix
Acunetix,quegozadeunaversiónFreeEdition(sóloparaHTMLInjection),peroconunagranvariantedesistemasdeinyección,unabasededatosampliayunainterfazmuyamigable.Losprocesosporlosquepuede“atacarse”puedenservariosylosperfilesdeataque–sisetienelaversióndepago–delosmásvariopintos,muchosdeellosyaloshemosvistoaquí.
SSS(ShadowSecurityScanner)
Similaralanteriorencuantoasistemaweb,quizánotancompleto,peroqueofrecetambiénelsondeodeotrosprotocoloscomoFTP,NetBios,módulosdeApachedelquesetenganconstanciaquehayvulnerabilidades.
TécnicasFuzz
Sellamafuzzingalasdiferentestécnicasdetesteodeaplicativosquegenerandatossecuencialesyaleatoriosparaobtenerasílasvulnerabilidadesdelavictima.Estesistemapuedesermuypotente,puescombinalaaleatoriedadenlosataquesconataquesbasadosenformatosheurísticos.Unalistadeestospotentesescaneadoresdevulnerabilidadespuedenencontrarseen:
www.infosecinstitute.com/blog/2005/12/fuzzers-ultimate-list.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 138 de 142
UnejemplolopodemostenerejecutandoelWebFuzzer,conlicenciaGPL,escritoenC:
/gunzip.altervista.org/g.php?f=projects#webfuzzer
PHPIDS
PHP-IDSesunsistemabasadoenPHPqueactúacomoIDS(IntrusionDetectSystem)yqueseaplicaatodosnuestrosarchivosbuscandoalgúntipodeinyecciónovulnerabilidad.PuededetectardesdeXSS,SQLInjection,RFIyataquesLDAPInjectionytieneinclusohastamódulosespecializadosparadistintostiposdeCMS.
MódulosApache
Deentreellos,existenmuchosquenospuedenayudaranuestrocometido,aunquenoscentraremosenlossiguientes:
Mod_rewriteFamososobretodoparaelusodeURL-Friendly,puesreescribelaentradatransformándolaenotras“Humanreadibility”.Personalmenterecomiendoelusodemod_security,debidoaquemod_rewritetienelógicaslimitacionesalnoserunmódulodiseñadoatalefecto.
Conclusión
Noesuncasotrivialtenerqueprotegerunsiteweb,tantosiyaestáhechocomosilotenemosquedesarrollardenuevo.Laúnicaformadeobstaculizarelejerciciodeestosatacantesseráconocercuálessonsustécnicas,mantenerseactualizadoregularmentedelasvulnerabilidadesdenuestroentorno(SistemaOperativo,Lenguaje,basededatosymódulosylibreríasasociados),encasodeserunprogramaconocido(comounWordPress,Joomla!,PostNuke)mantenersealertaalosbugsque,altruistamente,algunosatacantespublicanenwebs.
Además,conunsistemaIDSquenospuedaircomunicandoquépasaconnuestroslogs,laevolucióndeestosmismosylaconstanteevaluacióndelasvulnerabilidadesdenuestrosistema,juntoconunescaneoautomático,técnicasfuzzyunaprogramaciónsólida,yalgúnmódulodestinadoalaseguridadharándenuestroservidorwebunafortaleza(casi)inexpugnable.
EsteartículoesobradeBrianHernándezFuepublicadoporprimeravezen13/06/2013Disponibleonlineenhttp://desarrolloweb.com/articulos/seguridad-proyectos-php.html
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 139 de 142
Problemadelerror404OKenPHP
Tenemosqueasegurarnosqueelerror404,depáginanoencontrada,seacorrectamenteenviadoalnavegadorparaquenolellegueunHTTP/1.x404OK.
HayvecesqueconPHPqueremosenviarunerror404depáginanoencontrada,paraavisaralnavegadorqueunapáginanoexiste.Essencilloenviarporlascabecerasdelhttpunerror404,perohayqueasegurarsequeelcódigodeerrorestébienenviadoparanodarinformacionesambiguasalosclientesqueseconectenalservidor.
Estoesimportanteporqueelcódigo404tambiénsirvealosbuscadoresomotoresdebúsqueda,parainformarqueunapáginanoexiste.Sidamosinformacionesambiguasalosbuscadorespuedequeredundenegativamenteenlaclasificacióndenuestrositio.
Elproblemaquequeremoscomentarahoraeseltípicoerror"404OK".Estoesunaambigüedad:404espáginanoencontradayOKquieredecirquetodohaidobien.Perosinoencontrólapágina¿CómoesquedecimosqueOK?EsoesalgoquesepuedeevitarenviandoelerrorcorrectamenteenlacabeceradelHTTP.
Paraenviaruncódigodeerror404porlascabecerasdelHTTPconPHPtenemosquehacerlosiguiente:
<?
header("HTTP/1.0 404 Not Found");
?>
Conlafunciónheader()dePHPenviamosinformaciónenlacabecerasdelhttp.Enestecasohemosenviadounacabecera404NotFound.Atención,porquelafunciónheader()debeinvocarseantesdehaberescritonadaenlapágina,osea,antesdehaberenviadoningunainformaciónalnavegador.
Perodependiendodelaconfiguracióndenuestroservidorestopuedefuncionarono.
Lamejormaneradesaberquéestamosenviandoporlascabecerasdelhttpesutilizarunprogramaquenosmuestrelascabecerasquesegenerantantoenelclientecomoenelservidor.Existenvariosprogramasquenospodríanservir,peronosotrosvamosarecomendaraquíunaextensióndeFirefoxquehemoscomentadoyaenotroartículo:VercabecerasHTTPconLiveHttpHeaders.
Veremosqueenalgunasocasionesenviandoestacabeceraelnavegadorrecibeuncódigodeerrorcomoeste:
HTTP/1.x404OK
Esoesalgoquetenemosqueevitar,porqueesambiguo.Lacabeceradeseablesería:
HTTP/1.x404NotFound
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 140 de 142
Puesbien,cuandolacabeceraquegeneramosesHTTP/1.x404OKtenemosquehacerlosiguienteparaconseguireldeseadoHTTP/1.x404NotFound.
<?
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
?>
Primeroleindicamoslacabeceradelhttpcomo404yluegolanzamosotracabeceraindicandoqueelestatusquetienequeenviares"NotFound".Estodeberíafuncionarentodosloscasos.Esposiblequeconunasoladelasdoscabecerasenviadasnosenvíeyaelerror404NotFound,dependedelaconfiguracióndenuestroservidorquenecesitemosunauotra.Perosiindicamoslasdosenlaspruebasquehehechoconvariosservidoressiempreherecibidoelcódigodeerrorcorrecto.
InsistoenquelobuenoesqueveamosquécabecerasdelHTTPestamosenviandoconunproductocomoLiveHttpHeaders.AsípodremosestarsegurosdequécabecerastenemosqueenviaryquécódigoPHPeselcorrectoennuestrocaso.
PorqueenalgunosservidoresPHPsienviamossóloestacabecera:
<?
header("Status: 404 Not Found");
?>
Nosenvíaalnavegadorelcódigo:
HTTP/1.x200OK
Porejemplo,enestecasoestodavíapeor,porquenosotroshabíamosqueridoenviarunerror404yenrealidadloquehallegadoalnavegadoresun200OKquequieredecirpáginaencontradaycorrecta.
Endefinitiva,cabeestudiardetalladamenteesteasuntoparaasegurarnosqueestamosenviandolacabeceracorrectayelerror404esclaro.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen16/08/2007Disponibleonlineenhttp://desarrolloweb.com/articulos/problema-error-404-php.html
LibreríasJSONparaPHP
InformaciónsobrelasdistintaslibreríasyopcionesparautilizarlanotacióndeobjetosJavascriptJSONenprogramasrealizadosconellenguajePHP.
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 141 de 142
JSONesunanotaciónJavascriptparaescribirobjetosquesehahechobastantepopularenelmundodeldesarrollodewebsyqueseutilizaendiversoslenguajesdeprogramación,componentes(habitualmenteAjax),etc.Suéxitosedebeaqueesunaexcelenteformaparaalmacenarinformaciónquedeseamoscompartirentredistintoscomponentesolenguajesdelasaplicacionesweb.SitrabajamosconAjaxyalgunodelosframeworksJavascriptexistentes,yahabremosnotadoestaposibilidadyposiblementeyaestemosutilizandoJSONounanotaciónsimilar.
JSON,cuyassiglassignificanJavaScriptObjectNotation(enespañolNotacióndeObjetosdeJavaScript),esunformatoligero,fácildeescribirocodificar,asícomotambiénesfácildeleerporlossereshumanos.DesdeJavascriptpodemosprocesardirectamentecualquierobjetoJSONyexistenlibreríasparalamayoríadeloslenguajesdeprogramaciónquetienenfuncionesparainterpretaresteformato.Porellosehaadoptadouniversalmente.ParamásinformaciónpodemosvisitarelsitiowebdeJSONenhttp://www.json.org/.
EstoquieredecirqueconJSONpodemoscomunicardatosfácilmenteentrescriptsJavascriptyscriptsPHP.Porejemplo,pensemosenunavalidacióndeformularioquesedeseahacerconAjax.LosdatosdelformulariosepuedenenviaraPHPpormediodePOSTyluegopodríamosdesdePHPenviaraJavascriptelresultadodevalidaresosdatosenelservidor.Comolavalidaciónpuedeserpositivaonegativa,asícomopuedetenermásomenoscódigosdeerroryaccionesarealizardependiendodelainformaciónprocesada,elscriptPHPtienequemandarunarespuestamásomenoselaboradaalscriptJavascriptyunaposibilidadesenviaresosdatosdesdePHPutilizandolanotaciónJSON.
DisponibilidaddelasfuncionesJSONenPHP
PHPdisponedevariasfuncionesparahacerdistintostratamientosconnotacióndeobjetosJSON,quepermiteconvertirunobjetoPHP,ocualquierotrotipodevariable,aunstringconnotaciónJSON,asícomocrearunobjetoPHPapartirdeunstringcodificadoconJSON.
EnPHP,comodecíamos,esposibleproduciryconsumirdatoscargadosconnotaciónJSON,pormediodeunasfuncionesdelasquedisponeellenguaje,queexistendemanerapredeterminadaenlosservidoresmodernosdePHPyquesepuedenutilizartambiéneninstalacionesantiguasdePHP,aunqueconalgúntrabajodeinstalaciónadicional.
ApartirdePHP5.2lasfuncionesJSONestándisponiblessiempre,perosiutilizamosporejemploPHP4tendríamosqueinstalarlasmanualmente.Paraelloexistenvariospaquetesdelibrerías,queprovienendediversasfuentes,quetienenfuncionesparatratarconJSONdesdePHP.
PaqueteJSONdePECLEstepaquete,delrepositoriodelibreríasPHPPECL,escompatibleconPHP4.3.0osuperior.EnversionessuperioresaPHP5.2estádisponiblepordefecto.Enversionesanterioresdellenguajesetendríaqueinstalardemaneraseparada.
LibreríaJSON-PHPEsunalibreríadefuncionesqueseconocetambiénconelnombrede"Services_JSON".OriginariamenteescritaporMichalMigurski,enlaactualidadseencuentradisponibledentrodelframeworkPHPPEAR:http://pear.php.net/package/Services_JSON
JSONLibenZendFrameworkEsunalibreríadefuncionesparatratamientoconJSON
Manual de PHP
http://desarrolloweb.com/manuales/manual-php.html Página 142 de 142
queformapartedelframeworkPHPZend.
XML-RPCparaPHPPormediodeunaextensiónparalalibreríaphp-xmlrpc,tambiénsepuedetratarconnotacióndeobjetosJSON.
Lasparticularidadesdecadasistemasonligeramentedistintas.Cabedecirquelamásinteresanteseríalaprimera,queformapartedePECL,puestoqueestáescritaenCyportantoserámásrápidadeejecutarse,alformarpartedeloscomponentesnativosdePHP.ComodecimossólopodremosdisponerdeellaapartirdePHP5.2,peroenservidoresantiguostendríamosqueinstalarlaaparte,loqueamenudoserácomplicado,oinclusoimposibleparasitioswebenproducciónyenunalojamientocompartido.
Asíque,sinuestroservidorPHPnodisponedelasfuncionesJSONporestarpocoactualizado,noscostarámuchomenosesfuerzoydoloresdecabezautilizarotralibreríadistintaalabásicadePECL.Enestecaso,porlafacilidaddeinstalación,serecomendaríalautilizacióndelalibreríaquevieneenPEAR,quesepuededescargardelpropiositiodePEAR,enlaURLhttp://pear.php.net/package/Services_JSON
Nota:HemospublicadoenDesarrolloWeb.comenpasadosartículosalgunasreferenciasútilesparainstalarPEARyutilizaralgunoscomponentesdeesteframeworkPHP.esteframeworkPHP.
Existeunartículomuyinteresante,aunqueeninglés,quecomparalasdiversaslibreríasexistentesparausarJSONdesdePHP,quecontienediversasinformacionestécnicas,requisitosyunanálisisdeldesempeñodecadauna.
EnelpróximoartículoexplicaremoscómoutilizarlasfuncionesJSONenPHPpormediodelasfuncionesnativasdellenguaje.
EsteartículoesobradeMiguelAngelAlvarezFuepublicadoporprimeravezen22/09/2009Disponibleonlineenhttp://desarrolloweb.com/articulos/librerias-json-php.html