1

PHP, Guía 11

"ac!#tad: In$enier%a Esc!e#a: &omp!taci'n Asi$nat!ra: P(P

Tema:

Acceso a Base de Datos con MySQL - Parte II

Objetivo Especi ico
• •

Ampliar los conceptos vistos. Aplicar funciones avanzadas de acceso a base de datos

Introd!ccion Teorica
PDO (PHP Data Objects). Capa de Abstracción de acceso a Bases de Datos (Primera parte)
PDO (PHP Data Objects) es una extensión nativa de PHP5 consiste en una interface uniforme para acceder a varias bases de datos. PDO provee una capa de abstracción de acceso a bases de datos (!D) "ue permite al desarrollador abstraerse de la !D de una aplicación. As# si en al$una fase de desarrollo del pro%ecto se necesita cambiar de !D esto no afectar#a la ló$ica de la aplicación. Actualmente los siguientes drivers implementan la Inter ace PDO! "ombre del Driver Base de Datos soportadas PDO&D!'(! )ree*D+ , -icrosoft +.' +erver , +%base PDO&)(/0!(/D )irebird,(nterbase 1 PDO&(!(!- D!2 PDO&(3)O/-(4 (!- (nformix D%namic +erver PDO&-5+.' -%+.' 6.x,7.x,5.x PDO&O8( Oracle 8all (nterface PDO&OD!8 OD!8 v6 ((!- D!2 unixOD!8 and 9in62 OD!8) PDO&P:+.' Post$re+.' PDO&+.'(*0 +.'ite 6 and +.'ite 2 PDO&7D 7D Acceso a bases de datos en PHP# con PDO 'a extensión p;p&pdo para el trabajo con bases de datos esta compuesta por tres clases< PDO! /epresenta una conexión entre PHP % un servidor de bases de datos. PDO$tatement! /epresenta una instrucción preparada % despu=s "ue la instrucción es ejecutada una resultset. PDO%&ception! /epresenta un error lanzado por PDO. 'a clase PDO +inopsis
PDO { __construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

PHP, Guía 11
bool beginTransaction ( void ) bool commit ( void ) mixed errorCode ( void ) array errorInfo ( void ) int exec ( string $statement ) mixed getAttribute ( int $attribute ) array getAvailableDrivers ( void ) string lastInsertId ([ string $name = NULL ] ) PDOStatement prepare ( string $statement [, array $driver_options = array() ]) PDOStatement query ( string $statement ) string quote ( string $string [, int $parameter_type = PDO P!"!#$S%" ] ) bool rollBac ( void ) bool setAttribute ( int $attribute , mixed $value ) &

2

()todos • PDO<<begin*ransaction > (nicializa una transacción. • PDO<<commit > 8ommits una transacción. • PDO<<&&construct > 8rea una instancia PDO "ue representa una conexión a una base de datos. • PDO<<errorCode > /ecupera el +.'+*A*0 asociado con la ?ltima operación en la base de datos. • PDO<<errorIn o > /ecupera información extendida del error asociado con la ultima operación en la base de datos. • PDO<<e&ec > 0jecuta una instrucción +.' % retorna el n?mero de filas afectadas. • PDO<<getAttribute > /ecupera un atributo de conexión a base de dato. • PDO<<getAvailableDrivers > /etorna un arra% (arre$lo) de los drivers disponibles en la extensión PDO. • PDO<<lastInsertId > /etorna el (D (identificador) de la ?ltima fila insertada o secuencia de valores. • PDO<<prepare > Prepara una instrucción para ejecución % retorna un objeto de tipo PDO $tatement. • PDO<<+uer, > 0jecuta una instrucción +.' retornando un resul set como un objeto de tipo PDO+tatement. • PDO<<+uote > .uotes (Pone entre comillas simples un strin$) para uso en una "uer% (consulta). • PDO<<rollBac- > /olls bac@ una transacción. • PDO<<setAttribute > -odifica un atributo. 'a clase PDO$tatement +inopsis
PDOStatement im'lements %raversable { bool bindColumn ( mixed $column , mixed ($param [, int $type [, int $maxlen [, mixed $driverdata ]]] ) bool bindParam ( mixed $parameter , mixed ($variable [, int $data_type [, int $length [, mixed $driver_options ]]] ) bool bind!alue ( mixed $parameter , mixed $value [, int $data_type ] ) bool closeCursor ( void ) int columnCount ( void ) bool debugDumpParams ( void ) string errorCode ( void ) array errorInfo ( void ) bool execute ([ array $input_parameters = array() ] ) mixed fetc" ([ int $fetch_style = PDO )*%+,$-O%, [, int $cursor_orientation = PDO )*%+,$O".$N*/% [, int $cursor_offset = 0 ]]] ) array fetc"All ([ int $fetch_style = PDO )*%+,$-O%, [, int $column_index [, array $ctor_args = array() ]]] ) string fetc"Column ([ int $column_number = 0 ] ) mixed fetc"Ob#ect ([ string $class_name [, array 12tor$args ]] ) mixed getAttribute ( int $attribute ) array getColumn$eta ( int $column )

• PDO$tatement. 0ste parAmetro es opcional para al$unos PDO drivers. • PDO$tatement./set4etc1(ode > -odifica el valor por defecto para recuperar datos de la base de datos para la instrucción actual. • PDO$tatement. 2. 8onectar con el servidor de bases de datos. • PDO$tatement. username< 0l nombre de usuario. 0nviar la instrucción +. • PDO+tatementBCclose8ursor > 8ierra el cursor ./getAttribute > /ecupera una atributo. pass9ord< 'a contraseHa.3 PHP. 6./debugDumpParams > Dump un commando +./bind0alue > +ustitu%e un valor como parAmetro./bindColumn > +ustitu%e el valor de una columna de la base de datos a una variable PHP.'. • PDO$tatement. • PDO$tatement./ etc1Column > /etorna una ?nica columna de la si$uiente fila de un result set. Guía 11 bool next%o&set ( void ) int ro&Count ( void ) bool setAttribute ( int $attribute . • PDO$tatement. • PDO$tatement. mixed $value ) bool set'etc"$ode ( int $mode ) & ()todos • PDO$tatement. 0ste parAmetro es opcional para al$unos PDO drivers . • PDO$tatement./e&ecute > 0jecuta una instrucción preparada. • PDO$tatement./bindParam > +ustitu%e el valor de un parAmetro (ar$umento) a el nombre de variable especificada. • PDO$tatement. • PDO$tatement. • PDO$tatement. ./columnCount > /etorna el numero de columnas en el result set./errorIn o > /ecupera información de error extendida asociada con la ultima operación realizada en la base de datos.abilitando la instrucción a ser ejecutada otra vez. driver&options< Ina llaveJCvalor del arre$lo de opciones con driver de conexión especifico. • PDO$tatement./ etc1Object > /ecupera la si$uiente fila % la retorna como un objeto.' preparado. A continuación vemos los m=todos concretos con los "ue realizaremos estas operaciones< 5./ etc1All > /etorna un arra% conteniendo todas las filas del resul set. • PDO$tatement. • PDO$tatement./getColumn(eta > /etorna metadatos de una columna en un resul set.'+*A*0 asociado con la ?ltima operación realizada en la base de datos./ne&t2o3set > Avanza a la si$uiente /o9set en un multiBro9set. Conectar con el servidor de bases de datos (Crear el objeto PDO)! Descripción PDO<<&&construct ( strin$ Edsn F strin$ Eusername F strin$ Epass9ord F arra% Edriver&options GGG ) 'ista de par6metros D3+< (Data +ource 3ame) contiene la información re"uerida para conectarse a la base de datos. • PDO$tatement./errorCode > /ecupera el +./ etc1 > /ecupera la si$uiente fila de una result set. 'os pasos bAsicos para interactuar con una base de datos desde PHP son los si$uientes< D./setAttribute > -odifica un atributo. Obtener % procesar los resultados.' a la base de datos./ro3Count > /etorna el numero de filas afectadas por la ?ltima instrucción +.

Obtener . Descripción mixed PDO+tatement<<fetc. string 12lassname . %nviar la instrucción $:' a la base de datos! Descripción PDOStatement PDO PDOStatement PDO 34ery ( string 1statement ) 34ery ( string 1statement .() retorna un objeto PDO+tatement. %rrores7%&cepciones PDO!!88construct() dispara un PDO0xception si el intento de conexión a la base de datos falla.. ctor&ar$s< 0lementos de este arre$lo son pasados al constructor. 0alores retornados PDO!!+uer. array 12torargs ) string 1statement . int 1PDO )*%+. int 1PDO )*%+.$.@A<0<0<.PHP.$+OLU#N . 0alores retornados /etorna una instancia de la clase re"uerida con el nombre de las propiedades correspondiente a los nombres de las columnas o false in caso de un error.'.$+L!SS. int 1PDO )*%+.N%O . ob5e2t 1ob5e2t ) 4 PDOStatement PDO 34ery ( PDOStatement PDO 34ery ( 'ista de par6metros (nstrucción +. 9. int 12olno ) string 1statement . . procesar los resultados. Guía 11 0alores retornados 0n caso de =xito retorna un objeto PDO.< +onexi=n a la base de datos:9 1dsn=>mys3l dbname=dbtest?8ost=.>? . %jemplo completo 67'8' 9:.Object (F strin$ Eclass&name F arra% Ector&ar$s GG ) 'ista de par6metros class&name< 3ombre de la clase a crear por defecto utiliza std8lass.

N+"*#*N%.N+"*#*N%=@>)? 9: . 14ser.5 PHP.Fnoti2iaF<FtextoF )"O# Fnoti2iaF O"D*" -H Fnoti2iaF<Ftit4loF>)? 9: O< Obtener y 'ro2esar los res4ltados :9 1noti2ia = 1res4lsetDECet28Ob5e2t()? e28o 1noti2iaDEtit4lo? e28o 1noti2iaDEtexto? 7E %<%(P'O 5 'a cone&ión Para todos los ejemplos utilizar= -%+. 1'assBord)? & 2at28(PDO*x2e'tion 1e) { e28o >+onne2tion Cailed ><1eDEget#essage()? & 9: +rea2i=n de la base de datos noti2ias :9 1db8DE34ery(>+"*!%* D!%!-!S* Fnoti2iasF D*)!UL% +.NS*"% .N%O Fnoti2iaF (Ftit4loF. 14s4ario.S%S Fnoti2iaF( FidF int(. 4ser. >root>. +OLL!%* latin. .#!"H I*H (FidF) ) *NJ.aremos uso de prepare execute % fetc. Guía 11 14ser=>db4ser>? 1'assBord=>db'ass>? try { 1db8=neB PDO(1dsn.' pero tambi=n podria utilizar cual"uier otra de las bases de datos soportadas adaptando un poco el códi$o "ue si$ue< 1db = ne& PDO(>driver 8ost=servidor?dbname=bd>. 'ass)? 5 el ejemplo prActico< 1db = ne& PDO(>mys3l 8ost=lo2al8ost?dbname='r4ebas>..nsertando datos en la tabla noti2ias :9 1db8DE34ery(L.PG>. P".!"!+%*" S*% latin. FtextoF) M!LU*S (>P.) NO% NULL !U%O$.!"S*%=4tCK !U%O$.pKL //Nos conectamos 1db = ne& PDO(>mys3l 8ost=> < 1servidor < >?dbname=> < 1bd.p. FtextoF var28ar(G00) NO% NULL. >>)? A. re"uire Kconexion.N*=.) NO% */.nnoDD*)!UL% +..ora en Edb tenemos una instancia de PDO&-%+. Ftit4loF var28ar(G0) NO% NULL.' Primera consulta Para la primer consulta . >*s 4n leng4a5e orientado a ob5etos<>)L)? 9: @< *nviar la instr422i=n SNL a la base de datos :9 1res4lset=1db8DE34ery(>S*L*+% Fnoti2iaF<Ftit4loF.$sBedis8$2i>)? 1db8DE34ery(>US* Fnoti2iasF>)? 9: +rea2i=n la tabla noti2ias :9 1db8DE34ery(>+"*!%* %!-L* .

8on las funciones -%+.*"* id$item = id>)? //!on dicho nombre(clave) agregamos el valor del par&metro 12ons4ltaDEbindParam(> id>.ora bien si no conf#an intenten in%ectar +.N%O items (item) M!LU*S ( item)>)? 1insertaDEbindParam(> item>.PHP.] < >6br 9E>? & //!erramos la conexión a la ve" #ue destruimos nuestra instancia de P$% 1db = null? 6 8omo verAs no es nada complicado % es mu% similar a lo "ue nos acostumbramos a . 0ste es un ejemplo< //Preparamos la consulta marcando donde ir&n los parametros con ' 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P.)%) id$item = >@> O% id$item = >Q> Otra manera de .NS*"% .*"* id$item = 7 O" id$item = 7>)? //Ejecutamos la consulta incluyendo los par&metros en el mismo orden en el #ue deben incluirse 12ons4ltaDEexe24te(array(@.)%) id$item = >R> A.' tambi=n deb#amos validar estrictamente los parAmetros de entrada para evitar in%ecciones +. 1id)? //* ejecutamos la consulta 12ons4ltaDEexe24te()? ()*)CT : '%O$ items +.' concatenando al$una sentencia en la variable Eid % verAn los resultados Altas= Bajas . 0n este caso PDO lo . (odi icaciones 0l mecanismo si$ue siendo el mismo "ue en las consultas anteriores preparar la consulta a$re$ar los parAmetros % ejecutar. Guía 11 12ontrasenia)? //Preparamos la consulta para dejarla lista para su ejecución 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? //Ejecutamos la consulta 12ons4ltaDEexe24te()? // ecorremos el set de resultados mostrando la información B8ile(1Cila = 12ons4ltaDECet28()) { e28o 1Cila[0] < > > < 1Cila[.acer lo mismo< 1id = R? //Esta ve" utili"amos un nombre(clave para cada par&metro 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P. Q))? 0l ejemplo anterior $enerarA una consulta de la si$uiente manera< ()*)CT : '%O$ items +.'. alta 1item = 1$POS%[>item>]? 1inserta = 1dbDE're'are(>.arA por nosotros siempre % cuando utilicemos al$una de las varias formas "ue nos provee para realizar consultas parametrizadas. 1item)? 1insertaDEexe24te()? .acer con las clAsicas funciones m%s"l.

!"(. 'a I/' de conexión a la base de datos se forma as#< db 8ost=8ostname?dbname=dbname Meamos un ejemplo< try { 12onn=neB PDO(Lmys3l 8ost=lo2al8ost?dbname=mydbL)? & 2at28 (PDO*x2e'tion 1e) { e28o 1eDEget#essage()? & 0n caso de error saltar#a una excepción PDO0xception. L@000D0KD . Para cerrar la conexión< 1db=n4ll? Consultas Para realizar consultas a la base de datos tenemos los si$uientes m=todos< .N%O releases (version. name M!"+. 1item)? 1a2t4aliSaDEbindParam(> id>.#!"H I*H. date D!%* NO% NULL )? .NS*"% .*"* id$item = 1borraDEbindParam(> id>.' para -%+. L@00@D0AD . LSargeL. name. date) M!LU*S (L@<@L. AcA estA el script +.'< +"*!%* %!-L* releases( id . LPotatoL. date) M!LU*S (LO<0L. date) M!LU*S (LO<. 1id)? 1borraDEexe24te()? modi icación 1item = 1$POS%[>item>]? 1id = 1$POS%[>id>]? 1a2t4aliSa = 1dbDE're'are(>UPD!%* items S*% item = 1a2t4aliSaDEbindParam(> item>.*"* id$item = id>)? Mamos a crear una tabla "ue vamos a usar despu=s para .GL)? . Para establecer la conexión a la base de datos tenemos "ue crear un nuevo objeto PDO pasAndole como parAmetro al constructor la I/' de conexión a la base de datos. 1id)? 1a2t4aliSaDEexe24te()? %<%(P'O 9 *abla de ejemplo id>)? item P.L. version M!"+.N+"*#*N% P". name.NS*"% . Guía 11 1id = 1$J*%[>id>]? 1borra = 1dbDE're'are(>D*L*%* )"O# items P.7 Baja PHP.TL)? .0) NO% NULL.!"(.acer al$unas pruebas con PDO. L@00GD0RD 0RL)? Cone&ión a la base de datos PDO nos ofrece una interfaz orientada a objetos bastante sencilla de utilizar.N%O releases (version.NS*"% .N% NO% NULL !U%O$.00) NULL. LPoodyL. name.N%O releases (version.

p1p para ver todo el potencial de PDO. date)L? 1stmt = 12onnDE're'are(1s3l)? 1stmtDEbindParam(> name>. date) M!LU*S ( version.acer consultas crear prepared statements % utilizar transacciones todo a trav=s de una capa de abstracción "ue permite "ue nuestro códi$o sea portable.*"* id E @L? 1aCCe2ted"oBs=12onnDEexe2(1s3l)? e28o L"egistros modiCi2ados 1aCCe2ted"oBsL? Prepared statements Para usar prepared statements tenemos los m=todos prepare() bindParam() % execute() "ue se usan de la si$uiente manera< 1s3l=L. +irve para consultas del tipo +0'08*.N%O releases (version.acerla utilizamos el m=todo roll!ac@()< 12onnDErollba2U()? Conclusiones Mimos como PDO nos permite conectarnos a la base de datos . L@00AD0QD0KL)? 1stmtDEexe24te()? *ransacciones Para iniciar una transacción utilizamos el m=todo be$in*ransaction()< 12onnDEbegin%ransa2tion()? Despu=s podemos . name. LQ<0L)? 1stmtDEbindParam(> date>. 1s3l=LUPD!%* releases P. +irve para consultas "ue no tienen "ue devolver un resultado sino "ue la cantidad de re$istros afectados (como las consultas D0'0*0 o IPDA*0) o nada (como las consultas DD').NS*"% .pdo.p1p.acer todas las consultas "ue "ueramos % aceptar la transacción con el m=todo commit()< 12onnDE2ommit()? O si "ueremos des. L*t28L)? 1stmtDEbindParam(> version>.net7manual7en7re . Guía 11 +uer. name. . /ecomiendo leer la documentación de 1ttp!77333.() 0jecuta la consulta pasada como parAmetro % retorna un objeto PDO+tatement con el resultado. 1s3l=>S*L*+% : )"O# releases O"D*" -H version>? Corea28 (12onnDE34ery(1s3l) as 1roB){ e28o 1roB[>name>]<LnL? e28o 1roB[>version>]<LnL? e28o 1roB[>date>]<LnL? & 8 e&ec() 0jecuta la consulta pasada como parAmetro % retorna el n?mero de re$istros afectados.PHP.

1'assBord)? & 2at28 (PDO*x2e'tion 1e) { e28o >)allo de +onexion VVV> < 1eDEget#essage()? & 9: +rea2i=n de la base de datos noti2ias :9 1db8DE34ery(>+"*!%* D!%!-!S* noti2ias D*)!UL% +. +OLL!%* 9: . Guía 11 Materia# y E)!ipo • • :u#a de laboratorio +ervidor 9eb con interprete PHP instalado Procedimiento D.NS*"% . 14ser. 8rear un nuevo pro$rama con el nombre de N3oticias.>? 14ser = >root>? 1'assBord = >>? try { 1db8 = neB PDO(1dsn. 8rear un nuevo pro$rama con el nombre de N3oticias2. 8rear un nuevo pro%ecto en PHP Desi$ner con el nombre de PDO.S%S noti2ia ( id int(..!"S*%=4tCK !U%O$.N%O noti2ia (tit4lo.pO copiar el si$uiente códi$o < 67'8' 9: . texto var28ar(G00) NO% NULL. 2.9 PHP. tit4lo var28ar(G0) NO% NULL. texto) M!LU*S (>P.N+"*#*N%.nnoDD*)!UL% +. 6.) NO% NULL !U%O$.nsertando datos en la tabla noti2ias :9 1db8DE34ery(L.pO copiar el si$uiente códi$o< 67'8' 99Nos 2one2tamos 1dsn = >mys3l dbname=noti2ias?8ost=.@A<0<0<.p.p. P".< +onexi=n a la base de datos :9 1dsn = >mys3l dbname=taller?8ost=.>? .N*=.@A<0<0<. >*s 4n leng4a5e orientado a ob5etos<>)L)? 9: @< *nviar la instr422i=n SNL a la base de datos :9 1res4lset = 1db8DE34ery(>S*L*+% noti2ia<tit4lo.N+"*#*N%=@>)? S*% latin.$sBedis8$2i>)? 1db8DE34ery(>US* noti2ias>)? 9: +rea2i=n la tabla noti2ias :9 1db8DE34ery(>+"*!%* %!-L* .PG >.noti2ia<texto )"O# noti2ia O"D*" -H noti2ia<tit4lo>)? 9: O< Obtener y 'ro2esar los res4ltados :9 1noti2ia = 1res4lsetDECet28Ob5e2t()? e28o 1noti2iaDEtit4lo? e28o 1noti2iaDEtexto? 7E 7.) NO% */.!"!+%*" latin.#!"H I*H (id) ) *NJ. *rabajar=mos con la base de datos N*allerO.

>P. Guía 11 14ser = >root>? 1'assBord = >>? try { 1db8 = neB PDO(1dsn.]<> ><1Cila[@]<>6br 9E>? & 99+erramos la 2onexi=n a la veS 34e destr4imos n4estra instan2ia de PDO 1db8 = n4ll? 7E 5.S!# D*)!UL% +. (O. (G. 14ser. >!2tions2ri't>). FitemF var28ar(Q0) 2ollate 4tCK$4ni2ode$2i NO% NULL. >Xavas2ri't>).PHP. A$re$ar el si$uiente pro$rama Nconexion.p.!"S*%=4tCK !U%O$. FitemF) M!LU*S (.s+l S*% SNL$#OD*=LNO$!U%O$M!LU*$ON$W*"OL? D"OP %!-L* .) NO% NULL a4to$in2rement. A$re$ar un nuevo pro$rama llamado Nindex.pm%admin importando desde la base de datos N*allerO.N*=#y. 1'assBord)? & 2at28 (PDO*x2e'tion 1e) { e28o >)allo de +onexion VVV> < 1eDEget#essage()? & 99Pre'aramos la 2ons4lta 'ara de5arla lista 'ara s4 e5e242i=n 12ons4lta = 1db8DE're'are(>S*L*+% : )"O# noti2ia>)? 99*5e24tamos la 2ons4lta 12ons4ltaDEexe24te()? 99"e2orremos el set de res4ltados mostrando la inCorma2i=n B8ile(1Cila = 12ons4ltaDECet28()) { e28o 1Cila[0]<> ><1Cila[. >Joogle #a's>). (@.pO % copiar el si$uiente códi$o< .#!"H I*H (Fid$itemF) ) *NJ.N+"*#*N%=A ? . (R.p.s"lO desde P.pO +OLL!%*=4tCK$4ni2ode$2i 67'8' 1servidor = >lo2al8ost>? 1bd = >taller>? 14s4ario = >root>? 12ontrasenia = >>? 7E P. items. (Q.N%O FitemsF (Fid$itemF. 10 8orrer el script Nitems.P>). >2Y>)? 1. P"..NS*"% . 0ste script crea la tabla N(temsO e inserta varios re$istros de ejemplo.) */. >#ootools>)..S%S FitemsF? +"*!%* %!-L* FitemsF ( Fid$itemF int(.

9D%D9x8tml.E 64lE 6liE6a 8reC=L2ons4ltaD2om4n<'8'LE+ons4lta 2om(4a24te?n .%#L L8tt' 99BBB<BO<org9%"9x8tml.69aE69liE 6liE6a 8reC=L2ons4ltaD2onD'arametrosD@<'8'LE+ons4lta 2on 'ar(aa24te?metros @69aE69liE 6liE6a 8reC=Linsertar<'8'LE.nsertar69aE69liE 6liE6a 8reC=La2t4aliSar<'8'LE!2t4aliSar69aE69liE 6liE6a 8reC=Lborrar<'8'LE-orrar69aE69liE 694lE 69bodyE 698tmlE (nsertar % copiar los si$uientes códi$os ver los resultados % analizar el códi$o. consulta.69aE69liE 6liE6a 8reC=L2ons4ltaD2onD'arametros<'8'LE+ons4lta 2on 'ar(aa24te?metros .]7E69tdE 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? .LE 6trE 6tdE.Dstri2t<dtdLE 68tml xmlns=L8tt' 99BBB<BO<org9. Guía 11 .D69tdE 6tdE.9D%D9x8tml.comun.Dstri2t<dtdLE 68tml xmlns=L8tt' 99BBB<BO<org9.+ LD99PO+99D%D /.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28()){ 7E 6trE 6tdE67'8' e28o 1Cila[0]7E69tdE 6tdE67'8' e28o 1Cila[.11 PHP.<0 Stri2t99*NL 6VDO+%HP* 8tml PU-L.TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 68. 12ontrasenia)? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L.p1p 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=> < 1servidor < >?dbname=> < 1bd.%#L .+ LD99PO+99D%D /.<0 Stri2t99*NL L8tt' 99BBB<BO<org9%"9x8tml.TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 6table border=L.E#en(4a24te?698. 14s4ario.

12ontrasenia)? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P.9.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+. Q))? 7E 6VDO+%HP* 8tml PU-L.<0 Stri2t99*NL .TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 6tableE 6trE 6t8E.con. Guía 11 7E 69bodyE 698tmlE consulta. 1id)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L.p1p 12 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd.Dstri2t<dtdLE 68tml xmlns=L8tt' 99BBB<BO<org9.<0 Stri2t99*NL L8tt' 99BBB<BO<org9%"9x8tml.*"* id$item=7 O" id$item=7>)? 12ons4ltaDEexe24te(array(@.*"* id$item = 1id = R? 12ons4ltaDEbindParam(> id>.PHP.p1p 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=> 12ontrasenia)? < 1servidor < >?dbname=> < 1bd. 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P.D69tdE 6t8E.parametros.con.parametros.9D%D9x8tml. 14s4ario.$O-X)){ 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E 69bodyE 698tmlE consulta.+ LD99PO+99D%D /.%#L .+ LD99PO+99D%D /.%#L . id>)? 14s4ario.

13 PHP.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+. 14s4ario.<0 Stri2t99*NL 68tml xmlns=L8tt' 99BBB<BO<org9.p1p 67'8' re34ire (>2onexion<'8'>)? 1db= neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd. 1item)? 1insertaDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L. 12ontrasenia)? 1item = >P.9D%D9x8tml.NS*"% .+ LD99PO+99D%D /.tem69tdE .D69tdE 6t8E.D69tdE 6t8E.Dstri2t<dtdLE 68tml xmlns=L8tt' 99BBB<BO<org9.%#L L8tt' 99BBB<BO<org9%"9x8tml.N%O items (item) M!LU*S ( item)>)? 1insertaDEbindParam(> item>. Guía 11 L8tt' 99BBB<BO<org9%"9x8tml.TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 6tableE 6trE 6t8E.9D%D9x8tml.TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 6tableE 6trE 6t8E.$O-X)){ 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E 69bodyE 698tmlE insertar.PG<0>? 1inserta = 1dbDE're'are(>.Dstri2t<dtdLE .

14s4ario.D.$O-X)) { 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E 69bodyE 698tmlE actuali>ar.TTT9x8tmlL xml lang=LenL lang=LenLE 68eadE 6meta 8tt'De34iv=L+ontentD%y'eL 2ontent=Ltext98tml? 28arset=4tCDKL9E 6titleEPDO D Xo4rmoly69titleE 698eadE 6bodyE 6tableE 6trE 6t8E.$O-X)) { 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE .!" +OD.9D%D9x8tml.). P!"! #OD.JO .S%"O D* SUS %!-L!S 1id = T? 1a2t4aliSa = 1dbDE're'are(>UPD!%* items S*% item = 1a2t4aliSaDEbindParam(> item>.+ LD99PO+99D%D /.Dstri2t<dtdLE item P. Guía 11 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+. 1item)? 1a2t4aliSaDEbindParam(> id>.PHP.D69tdE 6t8E. 1id)? 1a2t4aliSaDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L. 12ontrasenia)? 1item = >!SP es Ceo>? 99+!#-.%#L L8tt' 99BBB<BO<org9%"9x8tml.p1p 14 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd.+!" "*J.<0 Stri2t99*NL 68tml xmlns=L8tt' 99BBB<BO<org9.*"* id$item = id>)? .tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+.

1id)? 1borraDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6tableE 6trE 6t8E.ivos< . 12ontrasenia)? 99+!#-.p1p 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd.!" +OD.*"* id$item = id>)? 1borraDEbindParam(> id>.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+. Guía 11 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E 69bodyE 698tmlE borrar.D69tdE 6t8E. P!"! -O""!" "*J. 14s4ario.S%"O D* SUS %!-L!S 1id = K? 1borra = 1dbDE're'are(>D*L*%* )"O# items P.15 PHP.JO .D.$O-X)) { 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE 69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E Al final el pro%ecto PDO "uedar#a con los si$uientes arc.

AdemAs nos permite tambi=n mediante la función Nset&exception&. PDO *""#OD*$*/+*P%.ON)? 99 Pre'aramos 4na N4ery 12omando = 1dbDE're'are(LS*L*+% : )"O# items P.I* 7L)? 99 Obtenemos el 2omando 'or 'arametro J*% 12liente = >Z> < 1'arametro < >Z>? 12omandoDEexe24te( array( 12liente ) )? B8ile( 1roB = 12omandoDECet28() ) { var$d4m'( 1roB )? 99 .m'rimimos res4ltados & 99 +erramos la 2onexion 12omando = n4ll? 1db = n4ll? & 2at28( PDO*x2e'tion 1e ) { e28o L*rror de 2onexi=n L < 1eDEget#essage()? & 7E (A*%2IA' CO(P'%(%"*A2IO PHP# 0sta versión del len$uaje viene con la posibilidad de utilizar blo"ues tr%. Guía 11 16 %jemplo con manejo de errores 8rear el arc.aber sido capturada.andlerO crear nuestra propia función de respuesta para a"uellas situaciones en las "ue una excepción lle$ue al nivel principal de ejecución sin .ivo Nmanejo&errores.p. .catc. para el control de errores.*"* item L. 14ser.pO ejecutarlo % ver los resultados. -odificar nombre de base de datos usuario o contraseHa para ver los mensajes de error $enerados por el manejo de excepciones. 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*. 67'8' try { 14ser=LrootL? 1'ass=LL? 1'arametro=LP8L? 1db = neB PDO(>mys3l dbname=noti2ias?8ost=lo2al8ost>.PHP.

.ON)? 99 +erramos la 2onexion 1db = n4ll? & 2at28( PDO*x2e'tion 1e ) { e28o L*rror de 2onexion L < 1eDEget#essage()? & )acil no utilizamos ni m%s"l&connect ni m%s"l&close el constructor PDO nos crea una instancia del controlador sobre el "ue podemos trabajar. *oda instancia de PDO si le pasamos como atributo "ue PDO<<0//-OD0&0480P*(O3 lanzara una excepcion en cuanto ten$a un error esto es mu% util %a "ue nos concentraremos en realizar el trabajo % si de paso estamos usando transacciones si . Guía 11 *odos .' o Post$re+. Pero es a"ui donde sur$en los problema mas $rave< 8op% Q Paste % los datos inesperados.ora. Isemos PDO "ue viene activado por defecto desde la version 5.a% "ue ser extremadamente cuidadosos en las variables "ue enviamos para entrar a la base de datos dic. PDO es un driver de acceso a varias bases de datos por lo "ue es ideal "ue cuando empieces a pro$ramar lo .a$as sobre este controlador.ec."ue pasa si de repente te cambian la base de datos "ue pasa si tu cliente en lu$ar de m%s"l decide "ue "uiere -++.'. PDO *""#OD*$*/+*P%.17 PHP.. 14ser.o% en d#a conocemos las ventajas de pro$ramar nuestros sitios con contenido dinAmico esto nos conlleva al .isimo trabajo tener "ue revisar variable por variable % . 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*. Para evitar esto .es o un m%s"l&real&escape&strin$ para cada elemento a in$resar en la base revisar las "ueries.a% una excepcion .acer un addslas. 14ser.as variables +(0-P/0 tienen "ue ser verificadas "ue son los datos "ue esperamos en pocas palabras existe una re$la de oro< 3unca te f#es del contenido "ue te env#a el usuario. /ealmente puede ser un dolor de cabeza por"ue es muc.'.o de "ue necesitemos acceder a los datos "ue vamos a mostrar desde una base de datos como por ejemplo -%+. Inas comillas de mas o un caracter no deseado en los datos in$resados % les decimos adiós a nuestros datos in$resados. 'omejor de tener un sitio "ue trabaje con información transaccional es por intermedio de los formularios % del in$reso de información desde el exterior a nuestra base. A. Mo% a dar a conocer los m=todos basicos veamos primero como conectar a -%+.ON)? 99+erramos la 2onexion 1db=n4ll? & 2at28(PDO*x2e'tion 1e){ e28o L*rror de 2onexion L<1eDEget#essage()? & try { 1db = neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>.' D) Isamos el constructor PDO< try{ 1db=neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>.D de PHP PDO por sus si$las en (n$les (PHP Data Objects) Objetos de Datos de PHP. 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*. PDO *""#OD*$*/+*P%.

uer%< . 0stos marcadores es lo "ue se va a reemplazar por el valor "ue tu le asi$nes cuando uses execute().). Guía 11 automaticamente son re$resadas $arantizando la consistencia de todos nuestros datos. 14ser.ON)? 99 Pre'aramos 4na N4ery 12omando = 1dbDE're'are(LS*L*+% : )"O# +lientes P. 'a forma es sencilla< try{ 1db=neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>. 14ser.I* 7L)? 99 Obtenemos el 2omando 'or 'arametro J*% 12liente = >Z><1$J*%[>+liente>]<>Z>? 12omandoDEexe24te(array(12liente))? B8ile(1roB=12omandoDECet28()){ var$d4m'( 1roB )? 99. 18 A.I* 7L)? 99 Obtenemos el 2omando 'or 'arametro J*% 12liente = >Z> < 1$J*%[>+liente>] < >Z>? 12omandoDEexe24te( array( 12liente ) )? B8ile( 1roB = 12omandoDECet28() ) { var$d4m'( 1roB )? 99 .oldersR esto es el si$no de interro$ación en el SH0/0 RTR.*"* +liente L.ora enviar "ueries es sencillo %a "ue automAticamente las variables son prote$idas contra ata"ues de +. A"u# si cambia un poco la forma %a "ue usamos lo "ue se le conoce como Prepared +tatements o 8omandos Preparados es i$ual de sencillo cuando preparamos un "uer% (%a sea (nsert +elect Ipdate 8all etc. PDO *""#OD*$*/+*P%. 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*. Para actualizar solo tenes "ue cambiar tu .ON)? 99 Pre'aramos 4na N4ery 12omando=1dbDE're'are(LS*L*+% : )"O# +lientes P.PHP. +i vemos el "uer% .' (n%ection.*"* +liente L. 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*.m'rimimos res4ltados & 99+erramos la 2onexion 12omando = n4ll? 1db=n4ll? & 2at28(PDO*x2e'tion 1e){ e28o L*rror de 2onexi=n & try { L<1eDEget#essage()? 1db = neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>.a% al$o diferente % es el uso de lo "ue se le conoce como marcadores o Rplace.m'rimimos res4ltados & 99 +erramos la 2onexion 12omando = n4ll? 1db = n4ll? L < 1eDEget#essage()? & 2at28( PDO*x2e'tion 1e ) { e28o L*rror de 2onexi=n & 8omo podemos ver usamos directamente el valor de nuestro E&:0* sin miedo a "ue sea una cadena "ue pueda perjudicarnos %a "ue el driver automAticamente se encar$a de analizar % enviar la cadena como un strin$. PDO *""#OD*$*/+*P%.

.nstan2e() { iC( selC 1$instan2e == n4ll ) { selC 1$instan2e = neB selC()? & ret4rn selC & & 1$instan2e? . Otra ventaja de usar PDO en lu$ar de las funciones de m%s"l normales es "ue podemos extenderlas % crear nuestra propia clase de bases de datos a$re$arle el patron +in$leton % tener %a lista una clase para trabajar con nuestro sistema.extends PDO { 'rivate stati2 1$instan2e=n4ll? 'rivate C4n2tion $$2onstr42t() { 99 Obtenemos el +onCig desde 4n array.acer un escape de las variables ni muc. 1'Bd.o menos esto te da la facilidad % te "uita una preocupación.*"* id+liente=7 5 mandarle el mensaje al objeto comando diciendole "ue se ejecute con los parAmetros "ue vos decidas< 12omandoDEexe24te( array( LX4anL. PDO *""$#OD*$*/+*P%.19 PHP. 2lase 2onCig et2 12onCig = +onCig get. 1attrs )? 1t8isDEset!trib4te( PDO !%%"$*""#OD*. 14ser. In rapido ejemplo< 2lass D. Guía 11 UPD!%* +lientes S*% Nombre=7 P.ON )? & '4bli2 stati2 C4n2tion get.nstan2e()? 1db = 12onCigDED-Name? 14ser = 12onCigDEUserName? 1'Bd = 12onCigDEPassBord? 1attrs = array()? 1dsn = >mys3l 8ost=lo2al8ost?dbname=> < 1db? 'arent $$2onstr42t( 1dsn. )? 8omo podes ver no es necesario .

Guía 11 20 Tarea D. -odificar el pro%ecto de tal forma "ue las paginas de insertar= borrar .PHP. . actuali>ar aparezca un cuadro de texto para solicitar los datos % se env#en a la pa$ina respectiva para su operación.

Parte II A#!mno: Ma)!ina .o: Docente: +L: "ec-a: E VA L UA CI O N % C O N O CIMI E N T O De# .o tiene actit!d proactiva6 Actit!d propositiva y con prop!estas no ap#icab#es a# contenido de #a $!%a6 T O TA L *//1 Tiene actit!d proactiva y s!s prop!estas son concretas6 Nota ./ a# 0/1 1-4 &onocimiento de iciente de #os !ndamentos te'ricos 5-7 &onocimiento y e2p#icaci'n incomp#eta de #os !ndamentos te'ricos 8-1 0 &onocimiento comp#eto y e2p#icaci'n c#ara de #os !ndamentos te'ricos A P LI C A CIÓ N DEL C O N O CIMI E N T O De# 3/1 a# 4/1 A C TI T UD De# *51 a# 0/1 . Guía 11 (oja de cotejo: ** +!%a **: Acceso a Base de Datos con MySQL .21 PHP.