Anda di halaman 1dari 21

1

PHP, Gua 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 Abstraccin de acceso a Bases de Datos (Primera parte)
PDO (PHP Data Objects) es una extensin nativa de PHP5 consiste en una interface uniforme para acceder a varias bases de datos. PDO provee una capa de abstraccin de acceso a bases de datos (!D) "ue permite al desarrollador abstraerse de la !D de una aplicacin. 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 aplicacin. 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 extensin p;p&pdo para el trabajo con bases de datos esta compuesta por tres clases< PDO! /epresenta una conexin entre PHP % un servidor de bases de datos. PDO$tatement! /epresenta una instruccin preparada % despu=s "ue la instruccin 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, Gua 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 ) &

()todos PDO<<begin*ransaction > (nicializa una transaccin. PDO<<commit > 8ommits una transaccin. PDO<<&&construct > 8rea una instancia PDO "ue representa una conexin a una base de datos. PDO<<errorCode > /ecupera el +.'+*A*0 asociado con la ?ltima operacin en la base de datos. PDO<<errorIn o > /ecupera informacin extendida del error asociado con la ultima operacin en la base de datos. PDO<<e&ec > 0jecuta una instruccin +.' % retorna el n?mero de filas afectadas. PDO<<getAttribute > /ecupera un atributo de conexin a base de dato. PDO<<getAvailableDrivers > /etorna un arra% (arre$lo) de los drivers disponibles en la extensin PDO. PDO<<lastInsertId > /etorna el (D (identificador) de la ?ltima fila insertada o secuencia de valores. PDO<<prepare > Prepara una instruccin para ejecucin % retorna un objeto de tipo PDO $tatement. PDO<<+uer, > 0jecuta una instruccin +.' 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 transaccin. 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 )

PHP, Gua 11
bool next%o&set ( void ) int ro&Count ( void ) bool setAttribute ( int $attribute , mixed $value ) bool set'etc"$ode ( int $mode )

&

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

PHP, Gua 11
0alores retornados 0n caso de =xito retorna un objeto PDO. %rrores7%&cepciones PDO!!88construct() dispara un PDO0xception si el intento de conexin a la base de datos falla. 9. %nviar la instruccin $:' a la base de datos! Descripcin PDOStatement PDO PDOStatement PDO 34ery ( string 1statement ) 34ery ( string 1statement , int 1PDO )*%+,$+OLU#N , int 12olno ) string 1statement , int 1PDO )*%+,$+L!SS, string 12lassname , array 12torargs ) string 1statement , int 1PDO )*%+,$.N%O , ob5e2t 1ob5e2t )

PDOStatement PDO

34ery (

PDOStatement PDO

34ery (

'ista de par6metros (nstruccin +.'. 0alores retornados PDO!!+uer,() retorna un objeto PDO+tatement. ;. Obtener , procesar los resultados. Descripcin mixed PDO+tatement<<fetc;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. ctor&ar$s< 0lementos de este arre$lo son pasados al constructor. 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. %jemplo completo 67'8' 9:;< +onexi=n a la base de datos:9 1dsn=>mys3l dbname=dbtest?8ost=;@A<0<0<;>?

PHP, Gua 11

14ser=>db4ser>? 1'assBord=>db'ass>? try { 1db8=neB PDO(1dsn, 14ser, 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% +,!"!+%*" S*% latin; +OLL!%* latin;$sBedis8$2i>)? 1db8DE34ery(>US* Fnoti2iasF>)? 9: +rea2i=n la tabla noti2ias :9 1db8DE34ery(>+"*!%* %!-L* .) NO% */.S%S Fnoti2iaF( FidF int(;;) NO% NULL !U%O$.N+"*#*N%, Ftit4loF var28ar(G0) NO% NULL, FtextoF var28ar(G00) NO% NULL, P".#!"H I*H (FidF) ) *NJ.N*=.nnoDD*)!UL% +,!"S*%=4tCK !U%O$.N+"*#*N%=@>)? 9: .nsertando datos en la tabla noti2ias :9 1db8DE34ery(L.NS*"% .N%O Fnoti2iaF (Ftit4loF, FtextoF) M!LU*S (>P,PG>, >*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,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&in Para todos los ejemplos utilizar= -%+.' pero tambi=n podria utilizar cual"uier otra de las bases de datos soportadas adaptando un poco el cdi$o "ue si$ue< 1db = ne& PDO(>driver 8ost=servidor?dbname=bd>, 4ser, 'ass)? 5 el ejemplo prActico< 1db = ne& PDO(>mys3l 8ost=lo2al8ost?dbname='r4ebas>, >root>, >>)? A;ora en Edb tenemos una instancia de PDO&-%+.' Primera consulta Para la primer consulta ;aremos uso de prepare execute % fetc;. re"uire Kconexion.p;pKL //Nos conectamos 1db = ne& PDO(>mys3l 8ost=> < 1servidor < >?dbname=> < 1bd, 14s4ario,

PHP, Gua 11
12ontrasenia)? //Preparamos la consulta para dejarla lista para su ejecucin 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? //Ejecutamos la consulta 12ons4ltaDEexe24te()? // ecorremos el set de resultados mostrando la informacin B8ile(1Cila = 12ons4ltaDECet28()) { e28o 1Cila[0] < > > < 1Cila[;] < >6br 9E>? & //!erramos la conexin a la ve" #ue destruimos nuestra instancia de P$% 1db = null?

8omo verAs no es nada complicado % es mu% similar a lo "ue nos acostumbramos a ;acer con las clAsicas funciones m%s"l. 8on las funciones -%+.' tambi=n deb#amos validar estrictamente los parAmetros de entrada para evitar in%ecciones +.'. 0n este caso PDO lo ;arA por nosotros siempre % cuando utilicemos al$una de las varias formas "ue nos provee para realizar consultas parametrizadas. 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 = 7 O" id$item = 7>)? //Ejecutamos la consulta incluyendo los par&metros en el mismo orden en el #ue deben incluirse 12ons4ltaDEexe24te(array(@, Q))? 0l ejemplo anterior $enerarA una consulta de la si$uiente manera< ()*)CT : '%O$ items +,)%) id$item = >@> O% id$item = >Q> Otra manera de ;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,*"* id$item = id>)? //!on dicho nombre(clave) agregamos el valor del par&metro 12ons4ltaDEbindParam(> id>, 1id)? //* ejecutamos la consulta 12ons4ltaDEexe24te()? ()*)CT : '%O$ items +,)%) id$item = >R> A;ora bien si no conf#an intenten in%ectar +.' concatenando al$una sentencia en la variable Eid % verAn los resultados Altas= Bajas , (odi icaciones 0l mecanismo si$ue siendo el mismo "ue en las consultas anteriores preparar la consulta a$re$ar los parAmetros % ejecutar. alta 1item = 1$POS%[>item>]? 1inserta = 1dbDE're'are(>.NS*"% .N%O items (item) M!LU*S ( item)>)? 1insertaDEbindParam(> item>, 1item)? 1insertaDEexe24te()?

7
Baja

PHP, Gua 11

1id = 1$J*%[>id>]? 1borra = 1dbDE're'are(>D*L*%* )"O# items P,*"* id$item = 1borraDEbindParam(> id>, 1id)? 1borraDEexe24te()? modi icacin 1item = 1$POS%[>item>]? 1id = 1$POS%[>id>]? 1a2t4aliSa = 1dbDE're'are(>UPD!%* items S*% item = 1a2t4aliSaDEbindParam(> item>, 1item)? 1a2t4aliSaDEbindParam(> id>, 1id)? 1a2t4aliSaDEexe24te()? %<%(P'O 9 *abla de ejemplo

id>)?

item P,*"* id$item =

id>)?

Mamos a crear una tabla "ue vamos a usar despu=s para ;acer al$unas pruebas con PDO. AcA estA el script +.' para -%+.'< +"*!%* %!-L* releases( id .N% NO% NULL !U%O$.N+"*#*N% P".#!"H I*H, version M!"+,!"(;0) NO% NULL, name M!"+,!"(;00) NULL, date D!%* NO% NULL )? .NS*"% .N%O releases (version, name, date) M!LU*S (L@<@L, LPotatoL, L@000D0KD ;GL)? .NS*"% .N%O releases (version, name, date) M!LU*S (LO<0L, LPoodyL, L@00@D0AD ;TL)? .NS*"% .N%O releases (version, name, date) M!LU*S (LO<;L, LSargeL, L@00GD0RD 0RL)? Cone&in a la base de datos PDO nos ofrece una interfaz orientada a objetos bastante sencilla de utilizar. Para establecer la conexin a la base de datos tenemos "ue crear un nuevo objeto PDO pasAndole como parAmetro al constructor la I/' de conexin a la base de datos. 'a I/' de conexin 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 excepcin PDO0xception. Para cerrar la conexin< 1db=n4ll? Consultas Para realizar consultas a la base de datos tenemos los si$uientes m=todos<

PHP, Gua 11
+uer,() 0jecuta la consulta pasada como parAmetro % retorna un objeto PDO+tatement con el resultado. +irve para consultas del tipo +0'08*. 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? &

e&ec() 0jecuta la consulta pasada como parAmetro % retorna el n?mero de re$istros afectados. +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'). 1s3l=LUPD!%* releases P,*"* 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.NS*"% .N%O releases (version, name, date) M!LU*S ( version, date)L? 1stmt = 12onnDE're'are(1s3l)? 1stmtDEbindParam(> name>, L*t28L)? 1stmtDEbindParam(> version>, LQ<0L)? 1stmtDEbindParam(> date>, L@00AD0QD0KL)? 1stmtDEexe24te()? *ransacciones Para iniciar una transaccin utilizamos el m=todo be$in*ransaction()< 12onnDEbegin%ransa2tion()? Despu=s podemos ;acer todas las consultas "ue "ueramos % aceptar la transaccin con el m=todo commit()< 12onnDE2ommit()? O si "ueremos des;acerla utilizamos el m=todo roll!ac@()< 12onnDErollba2U()? Conclusiones Mimos como PDO nos permite conectarnos a la base de datos ;acer consultas crear prepared statements % utilizar transacciones todo a trav=s de una capa de abstraccin "ue permite "ue nuestro cdi$o sea portable. /ecomiendo leer la documentacin de 1ttp!77333.p1p.net7manual7en7re .pdo.p1p para ver todo el potencial de PDO. name,

PHP, Gua 11

Materia# y E)!ipo
:u#a de laboratorio +ervidor 9eb con interprete PHP instalado

Procedimiento
D. 2. 6. *rabajar=mos con la base de datos N*allerO. 8rear un nuevo pro%ecto en PHP Desi$ner con el nombre de PDO. 8rear un nuevo pro$rama con el nombre de N3oticias.p;pO copiar el si$uiente cdi$o <

67'8' 9: ;< +onexi=n a la base de datos :9 1dsn = >mys3l dbname=taller?8ost=;@A<0<0<;>? 14ser = >root>? 1'assBord = >>? try { 1db8 = neB PDO(1dsn, 14ser, 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% +,!"!+%*" latin;$sBedis8$2i>)? 1db8DE34ery(>US* noti2ias>)? 9: +rea2i=n la tabla noti2ias :9 1db8DE34ery(>+"*!%* %!-L* .) NO% */.S%S noti2ia ( id int(;;) NO% NULL !U%O$.N+"*#*N%, tit4lo var28ar(G0) NO% NULL, texto var28ar(G00) NO% NULL, P".#!"H I*H (id) ) *NJ.N*=.nnoDD*)!UL% +,!"S*%=4tCK !U%O$.N+"*#*N%=@>)?

S*%

latin;

+OLL!%*

9: .nsertando datos en la tabla noti2ias :9 1db8DE34ery(L.NS*"% .N%O noti2ia (tit4lo, texto) M!LU*S (>P,PG >, >*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,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. 8rear un nuevo pro$rama con el nombre de N3oticias2.p;pO copiar el si$uiente cdi$o<

67'8' 99Nos 2one2tamos 1dsn = >mys3l dbname=noti2ias?8ost=;@A<0<0<;>?

PHP, Gua 11
14ser = >root>? 1'assBord = >>? try { 1db8 = neB PDO(1dsn, 14ser, 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[;]<> ><1Cila[@]<>6br 9E>? & 99+erramos la 2onexi=n a la veS 34e destr4imos n4estra instan2ia de PDO 1db8 = n4ll? 7E 5.

10

8orrer el script Nitems.s"lO desde P;pm%admin importando desde la base de datos N*allerO. 0ste script crea la tabla N(temsO e inserta varios re$istros de ejemplo.

items.s+l S*% SNL$#OD*=LNO$!U%O$M!LU*$ON$W*"OL? D"OP %!-L* .) */.S%S FitemsF? +"*!%* %!-L* FitemsF ( Fid$itemF int(;;) NO% NULL a4to$in2rement, FitemF var28ar(Q0) 2ollate 4tCK$4ni2ode$2i NO% NULL, P".#!"H I*H (Fid$itemF) ) *NJ.N*=#y.S!# D*)!UL% +,!"S*%=4tCK !U%O$.N+"*#*N%=A ? .NS*"% .N%O FitemsF (Fid$itemF, FitemF) M!LU*S (;, >P,P>), (@, >#ootools>), (O, >Joogle #a's>), (Q, >Xavas2ri't>), (G, >!2tions2ri't>), (R, >2Y>)? 1. A$re$ar el si$uiente pro$rama Nconexion.p;pO

+OLL!%*=4tCK$4ni2ode$2i

67'8' 1servidor = >lo2al8ost>? 1bd = >taller>? 14s4ario = >root>? 12ontrasenia = >>? 7E P. A$re$ar un nuevo pro$rama llamado Nindex.p;pO % copiar el si$uiente cdi$o<

11

PHP, Gua 11
;<0 Stri2t99*NL

6VDO+%HP* 8tml PU-L.+ LD99PO+99D%D /,%#L L8tt' 99BBB<BO<org9%"9x8tml;9D%D9x8tml;Dstri2t<dtdLE

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

PHP, Gua 11
7E 69bodyE 698tmlE consulta.con.parametros.p1p

12

67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd, 14s4ario, 12ontrasenia)? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P,*"* id$item=7 O" id$item=7>)? 12ons4ltaDEexe24te(array(@, Q))? 7E 6VDO+%HP* 8tml PU-L.+ LD99PO+99D%D /,%#L ;<0 Stri2t99*NL L8tt' 99BBB<BO<org9%"9x8tml;9D%D9x8tml;Dstri2t<dtdLE 68tml xmlns=L8tt' 99BBB<BO<org9;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.D69tdE 6t8E.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+,$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.con.parametros.9.p1p 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=> 12ontrasenia)?

<

1servidor

<

>?dbname=>

<

1bd, id>)?

14s4ario,

12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items P,*"* id$item = 1id = R? 12ons4ltaDEbindParam(> id>, 1id)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L.+ LD99PO+99D%D /,%#L ;<0 Stri2t99*NL

13

PHP, Gua 11
L8tt' 99BBB<BO<org9%"9x8tml;9D%D9x8tml;Dstri2t<dtdLE

68tml xmlns=L8tt' 99BBB<BO<org9;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.D69tdE 6t8E.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+,$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.p1p 67'8' re34ire (>2onexion<'8'>)? 1db= neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd, 14s4ario, 12ontrasenia)? 1item = >P,PG<0>? 1inserta = 1dbDE're'are(>.NS*"% .N%O items (item) M!LU*S ( item)>)? 1insertaDEbindParam(> item>, 1item)? 1insertaDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L.+ LD99PO+99D%D /,%#L L8tt' 99BBB<BO<org9%"9x8tml;9D%D9x8tml;Dstri2t<dtdLE

;<0

Stri2t99*NL

68tml xmlns=L8tt' 99BBB<BO<org9;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.D69tdE 6t8E.tem69tdE

PHP, Gua 11
69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+,$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.p1p

14

67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd, 14s4ario, 12ontrasenia)? 1item = >!SP es Ceo>? 99+!#-.!" +OD.JO .D, P!"! #OD.).+!" "*J.S%"O D* SUS %!-L!S 1id = T? 1a2t4aliSa = 1dbDE're'are(>UPD!%* items S*% item = 1a2t4aliSaDEbindParam(> item>, 1item)? 1a2t4aliSaDEbindParam(> id>, 1id)? 1a2t4aliSaDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6VDO+%HP* 8tml PU-L.+ LD99PO+99D%D /,%#L L8tt' 99BBB<BO<org9%"9x8tml;9D%D9x8tml;Dstri2t<dtdLE item P,*"* id$item = id>)?

;<0

Stri2t99*NL

68tml xmlns=L8tt' 99BBB<BO<org9;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.D69tdE 6t8E.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+,$O-X)) { 7E 6trE 6tdE67'8' e28o 1CilaDEid$item7E69tdE 6tdE67'8' e28o 1CilaDEitem7E69tdE

15

PHP, Gua 11

69trE 67'8' & 7E 69tableE 6a 8reC=Lindex<'8'LE#en(4a24te?69aE 67'8' 1db = n4ll? 7E 69bodyE 698tmlE borrar.p1p 67'8' re34ire >2onexion<'8'>? 1db = neB PDO(>mys3l 8ost=><1servidor<>?dbname=><1bd, 14s4ario, 12ontrasenia)? 99+!#-.!" +OD.JO .D, P!"! -O""!" "*J.S%"O D* SUS %!-L!S 1id = K? 1borra = 1dbDE're'are(>D*L*%* )"O# items P,*"* id$item = id>)? 1borraDEbindParam(> id>, 1id)? 1borraDEexe24te()? 12ons4lta = 1dbDE're'are(>S*L*+% : )"O# items>)? 12ons4ltaDEexe24te()? 7E 6tableE 6trE 6t8E.D69tdE 6t8E.tem69tdE 69trE 67'8' B8ile(1Cila = 12ons4ltaDECet28(PDO )*%+,$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;ivos<

PHP, Gua 11

16

%jemplo con manejo de errores 8rear el arc;ivo Nmanejo&errores.p;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. 67'8' try {

14ser=LrootL? 1'ass=LL? 1'arametro=LP8L? 1db = neB PDO(>mys3l dbname=noti2ias?8ost=lo2al8ost>, 14ser, 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*, PDO *""#OD*$*/+*P%.ON)? 99 Pre'aramos 4na N4ery 12omando = 1dbDE're'are(LS*L*+% : )"O# items P,*"* item L.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 versin del len$uaje viene con la posibilidad de utilizar blo"ues tr%,catc; para el control de errores. AdemAs nos permite tambi=n mediante la funcin Nset&exception&;andlerO crear nuestra propia funcin de respuesta para a"uellas situaciones en las "ue una excepcin lle$ue al nivel principal de ejecucin sin ;aber sido capturada.

17

PHP, Gua 11

*odos ;o% en d#a conocemos las ventajas de pro$ramar nuestros sitios con contenido dinAmico esto nos conlleva al ;ec;o de "ue necesitemos acceder a los datos "ue vamos a mostrar desde una base de datos como por ejemplo -%+.'. 'omejor de tener un sitio "ue trabaje con informacin transaccional es por intermedio de los formularios % del in$reso de informacin desde el exterior a nuestra base. Pero es a"ui donde sur$en los problema mas $rave< 8op% Q Paste % los datos inesperados. Inas comillas de mas o un caracter no deseado en los datos in$resados % les decimos adis a nuestros datos in$resados. Para evitar esto ;a% "ue ser extremadamente cuidadosos en las variables "ue enviamos para entrar a la base de datos dic;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;isimo trabajo tener "ue revisar variable por variable % ;acer un addslas;es o un m%s"l&real&escape&strin$ para cada elemento a in$resar en la base revisar las "ueries. A;ora..."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 -++.' o Post$re+.'. Isemos PDO "ue viene activado por defecto desde la version 5.D de PHP PDO por sus si$las en (n$les (PHP Data Objects) Objetos de Datos de PHP. 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. Mo% a dar a conocer los m=todos basicos veamos primero como conectar a -%+.' D) Isamos el constructor PDO< try{ 1db=neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>, 14ser, 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*, PDO *""#OD*$*/+*P%.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>, 14ser, 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*, PDO *""#OD*$*/+*P%.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 ;a% una excepcion

PHP, Gua 11
automaticamente son re$resadas $arantizando la consistencia de todos nuestros datos.

18

A;ora enviar "ueries es sencillo %a "ue automAticamente las variables son prote$idas contra ata"ues de +.' (n%ection. 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.). 'a forma es sencilla< try{ 1db=neB PDO(>mys3l dbname=testdb?8ost=lo2al8ost>, 14ser, 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*, PDO *""#OD*$*/+*P%.ON)? 99 Pre'aramos 4na N4ery 12omando=1dbDE're'are(LS*L*+% : )"O# +lientes P,*"* +liente L.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.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>, 14ser, 1'ass)? 1dbDEset!ttrib4te(PDO !%%"$*""#OD*, PDO *""#OD*$*/+*P%.ON)? 99 Pre'aramos 4na N4ery 12omando = 1dbDE're'are(LS*L*+% : )"O# +lientes P,*"* +liente L.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 .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$. +i vemos el "uer% ;a% al$o diferente % es el uso de lo "ue se le conoce como marcadores o Rplace;oldersR esto es el si$no de interro$acin en el SH0/0 RTR. 0stos marcadores es lo "ue se va a reemplazar por el valor "ue tu le asi$nes cuando uses execute(). Para actualizar solo tenes "ue cambiar tu .uer%<

19

PHP, Gua 11

UPD!%* +lientes S*% Nombre=7 P,*"* id+liente=7 5 mandarle el mensaje al objeto comando diciendole "ue se ejecute con los parAmetros "ue vos decidas< 12omandoDEexe24te( array( LX4anL, ; )? 8omo podes ver no es necesario ;acer un escape de las variables ni muc;o menos esto te da la facilidad % te "uita una preocupacin. 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. In rapido ejemplo< 2lass D- extends PDO { 'rivate stati2 1$instan2e=n4ll? 'rivate C4n2tion $$2onstr42t() { 99 Obtenemos el +onCig desde 4n array, 2lase 2onCig et2 12onCig = +onCig get.nstan2e()? 1db = 12onCigDED-Name? 14ser = 12onCigDEUserName? 1'Bd = 12onCigDEPassBord? 1attrs = array()? 1dsn = >mys3l 8ost=lo2al8ost?dbname=> < 1db? 'arent $$2onstr42t( 1dsn, 14ser, 1'Bd, 1attrs )? 1t8isDEset!trib4te( PDO !%%"$*""#OD*, PDO *""$#OD*$*/+*P%.ON )? & '4bli2 stati2 C4n2tion get.nstan2e() { iC( selC 1$instan2e == n4ll ) { selC 1$instan2e = neB selC()? & ret4rn selC & & 1$instan2e?

PHP, Gua 11

20

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

21

PHP, Gua 11

(oja de cotejo: **

+!%a **: Acceso a Base de Datos con MySQL - 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# ./ 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 ,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

Anda mungkin juga menyukai