Vous êtes sur la page 1sur 6

Captulo4

Trabajo con bases de datos


4.1 Trabajar con la base de datos
Yiiproporcionaapoyopoderosoparalaprogramacindebasededatos. Yii esta Construidosobre la extensin objetos de datos PHP(PDO),objetosdeaccesoadatos Yii (DAO) esto permite accederalosdiferentessistemasdegestin debasesdedatos(DBMS) en una interfaz uniforme.Aplicaciones desarrolladas usando Yii DAO se pueden cambiar fcilmenteparautilizarotraDBMSsinnecesidaddemodificarlosdatosdeaccesoacdigo. El generador de consultas de Yii ofrece un mtodo orientado a objetos para la construccinde consultasSQL,queayudaareducirelriesgodeataquesdeinyeccinSQL. Yii activo registro (AR), implementado como un mapeo objetorelacionalampliamenteadoptado y Enfoque (ORM), simplifica msla programacin de base de datos. Querepresentaunatabla en trminos de una clase y una fila de una instancia, el AR de Yii elimina la tarea repetitivade escribir aquellasinstruccionesSQLquetratanprincipalmentedeCRUD(crear,leer,actualizary suprimir). Aunque las caractersticasde la basededatosincluye Yiipuedenmanejarcasitodaslastareas relacionadas con la base de datos, puede usar sus propias bibliotecas de base de datos enla aplicacin Yii. De hecho, Yii framework est cuidadosamente diseadoparautilizarsejuntocon otrasbibliotecasdeterceros.

4.2 Objetos de acceso a datos (DAO)


Objetosdeaccesoadatos(DAO)proporcionaunaAPIgenricaparaaccederalosdatos almacenadosensistemasdegestindebasededatos(DBMSoSGBD).Comoresultado,el SGBDsubyacentesepuedecambiaraunadiferentesinnecesidaddecambiodelcdigoque utilizaDAOparaaccederalosdatos.

DAO deYiiestconstruidosobredeobjetosdedatosPHP(PDO),queesunaextensinfacilitar el acceso de datosunificado para muchos DBMS populares tales como MySQL, PostgreSQL.

Por lo tanto, parautilizar DAO de Yii, laextensin PDO y el driver especfico de PDO base de datos(porejemplo,PDOMYSQL)tienequeserinstalado. YiiDAOconsisteprincipalmenteenlassiguientescuatroclases: CDbConnection:representaunaconexinaunabasededatos. CDbCommand:representaunainstruccinSQLparaejecutarcontraunabasededatos. CDbDataReader:representaunflujodesloavancedefilasdeunconjuntode resultadosdelaconsulta. CDbTransaction:representaunatransaccindeDB. Acontinuacin,presentamoselusodeYiiDAOendiferentesescenarios.

4.2.1 Estableciendo la conexin de base de datos


para establecer una conexin de base de datos, cree unainstanciaCDbConnectionyactivarlo. Senecesitaunnombredeorigendedatos (DSN)paraespecificarlainformacinnecesariapara conectar a la base de datos. Tambin se pueden necesitarunnombredeusuarioycontrasea para establecer la conexin. Se produce una excepcin si se produce un error durante el establecimiento de la conexin (por ejemplo, DSN malo o no vlido nombre de usuario / contrasea).
$ c o n n e c t i o n = n e wC D b C o n n e c t i o n ( $ d s n , $ u s e r n a m e , $ p a s s w o r d ) ; / /e s t a b l e c ec o n e x i n .P u e d e sp r o b a r . . .d e t e c t a rp o s i b l e se x c e p c i o n e s $ c o n n e c t i o n > a c t i v e = t r u e ; $ c o n n e c t i o n > a c t i v e = f a l s e ;/ /c l o s ec o n n e c t i o n

El formato de DSN dependedelcontroladordebasededatosPDOenuso.Engeneral,unDSN consiste en el nombre del controlador PDO, seguido de dos puntos,seguido de la sintaxis de conexin especfica del controlador. Consulte la documentacin de PDO para obtener informacin completa. A continuacin se muestra una lista de los formatos de DSN comnmenteusados:
S Q L i t e :s q l i t e : / p a t h / t o / d b f i l e M y S Q L :m y s q l : h o s t = l o c a l h o s t ; d b n a m e = t e s t d b P o s t g r e S Q L :p g s q l : h o s t = l o c a l h o s t ; p o r t = 5 4 3 2 ; d b n a m e = t e s t d b S Q LS e r v e r :m s s q l : h o s t = l o c a l h o s t ; d b n a m e = t e s t d b O r a c l e :o c i : d b n a m e = / / l o c a l h o s t : 1 5 2 1 / t e s t d b

Debido a que CDbConnection extiende de CApplicationComponent, tambin se puede utilizar como un componente deaplicacin. Para ello, configure en una base dedatos(uotronombre) componentedelaaplicacinenlaconfiguracindelaaplicacindelasiguientemanera,

a r r a y ( . . . . . . c o m p o n e n t s = > a r r a y ( . . . . . . d b = > a r r a y ( c l a s s = > C D b C o n n e c t i o n , c o n n e c t i o n S t r i n g = > m y s q l : h o s t = l o c a l h o s t ; d b n a m e = t e s t d b , u s e r n a m e = > r o o t , p a s s w o r d = > p a s s w o r d , e m u l a t e P r e p a r e = > t r u e ,/ /n e e d e db ys o m eM y S Q Li n s t a l l a t i o n s ) , ) , ) A continuacin, puede acceder alaconexin debasededatosatravsdeYii::app()>dbque ya est activado de forma automtica, a menos que configure manera explcita CDbConnection::autoConnect que es falsa. Con este enfoque, la conexin DBsolosepueden compartirenvarioslugaresdenuestrocdigo.

4.2.2 Ejecucin de instrucciones SQL


Una vez que una conexin de base de datos est establecida, las sentencias SQL se pueden ejecutar con CDbCommand. Uno crea una instancia CDbCommand llamando CDbConnection::CreateCommand()conlainstruccinSQL: $ c o n n e c t i o n = Y i i : : a p p ( ) > d b ; / * S u p o n i e n d oq u eh a y ac o n f i g u r a d ou n ac o n e x i n" d b "s in o ,p u e d ec r e a r e x p l c i t a m e n t eu n ac o n e x i n : $ c o n n e c t i o n = n e wC D b C o n n e c t i o n ( $ d s n , $ u s e r n a m e , $ p a s s w o r d ) ; * / $ c o m m a n d = $ c o n n e c t i o n > c r e a t e C o m m a n d ( $ s q l ) ; / * s ie sn e c e s a r i o ,l as e n t e n c i aS Q Lp u e d es e ra c t u a l i z a d ad el a s i g u i e n t em a n e r a: $ c o m m a n d > t e x t = $ n e w S Q L ; * /

Una sentencia SQL se ejecuta a travs de CDbCommand de una de las dos siguientes maneras:

execute (): realiza una consulta, no sentencias SQL tales como INSERT, UPDATE y

DELETE. Si tiene xito, devuelve el nmero de filas que se ven afectados por la ejecucin. query(): ejecuta una sentencia SQLquedevuelvefilasdedatos,talescomoSELECT.Si tiene xito, devuelve unainstanciaCDbDataReader desdedondesepuedeatravesarlas filas de datos resultantes. Para mayor comodidad,un conjunto dequeryXXX() mtodos implementadosquedevuelvendirectamentelosresultadosdelaconsulta. SeproduceunaexcepcinsisegeneraunerrordurantelaejecucindesentenciasSQL. $ r o w C o u n t = $ c o m m a n d > e x e c u t e ( ) ; / / nosentenciasSQLtalescomoINSERT,UPDATE,DELETE. $ d a t a R e a d e r = $ c o m m a n d > q u e r y ( ) ; / / ejecutarunaconsultaSQL $ r o w s = $ c o m m a n d > q u e r y A l l ( ) ; / / consultaydevuelvetodaslasfilasdelresultado $ r o w = $ c o m m a n d > q u e r y R o w ( ) ; / / Consultaydevuelvelaprimerafiladeresultado $ c o l u m n = $ c o m m a n d > q u e r y C o l u m n ( ) ; / / consultaydevuelvelaprimeracolumnadelresultado $ v a l u e = $ c o m m a n d > q u e r y S c a l a r ( ) ; / / consultaydevuelveelprimercampodelaprimerafila

4.2.3 Obteniendo resultados de la consulta


Despus que CDbCommand::query() genere la instancia CDbDataReader,sepuederecuperar filas dedatosqueresultenllamandoCDbDataReader::read()repetidamente.Tambinsepuede utilizarCDbDataReader,enellenguajePHPseconstruyeunforeachpararecuperarfilaporfila. $dataReader=$command>query()//Llamararead()repetidamentehastaquedevuelvafalso while(($row=$dataReader>read())!==false) { ... }//Uso de foreach para recorrer a travs de
cadafiladedatos

foreach($dataReaderas$row){...}//Recuperartodaslasfilasdeunavezenunasolamatriz $rows=$dataReader>readAll() Nota: A diferencia de query (), todos queryXXX () devuelven datos directamente. Por ejemplo,queryRow () devuelve una matriz que representa la primera fila del resultado de la consulta.

4.2.4 El uso de transacciones


Cuando unaaplicacin ejecutaalgunasconsultas,cadalecturay/oescrituradeinformacinen la base de datos, es importante asegurarse de que la base de datos no se queda con slo algunas de las consultas realizadas. Una transaccin, representada como una instancia CDbTransactionenYii,puedeiniciarseenestecaso:

Comienzalaoperacin. Ejecutar consultas uno a uno. Las actualizaciones de la basede datos no son visibles paraelmundoexterior. Confirmarlatransaccin.Actualizacionessehacenvisiblessilaoperacintienexito. Siunadelasconsultasfalla,todalatransaccinserevierte. Elflujodetrabajoanteriorsepuedeimplementarmedianteelcdigosiguiente: $ t r a n s a c t i o n = $ c o n n e c t i o n > b e g i n T r a n s a c t i o n ( ) ; t r y { $ c o n n e c t i o n > c r e a t e C o m m a n d ( $ s q l 1 ) > e x e c u t e ( ) ; $ c o n n e c t i o n > c r e a t e C o m m a n d ( $ s q l 2 ) > e x e c u t e ( ) ; / / . . . .o t r a se j e c u c i o nS q l $ t r a n s a c t i o n > c o m m i t ( ) ; } c a t c h ( E x c e p t i o n$ e )/ /s ep r o d u c eu n ae x c e p c i ns iu n ac o n s u l t af a l l a { $ t r a n s a c t i o n > r o l l b a c k ( ) ; }

4.2.5 Los parmetros de unin


Paraevitarlos ataquesdeinyeccinSQLymejorarelrendimiento delaejecucindesentencias SQL usadas repetidamente, se puede "preparar" una sentencia SQL con parmetros opcionales placeholders que han de ser sustituidos por los parmetros actuales durante el procesodeparmetrosdeunion. Los placeholders de parmetro puede ser nombrado (representado como fichas nicas) o sin nombre (representado como signos de interrogacin). Llame CDbCommand::bindParam() o CDbCommand::bindValue() para reemplazarestosmarcadoresdeposicinconlosparmetros actuales. Los parmetros no necesitansercitados: elcontroladordebasededatossubyacente lo hace por usted. Parmetro obligatorio debe realizarse antes de la sentencia SQL se ejecuta.datos subyacente lo hace por usted. Parmetro obligatorio debe realizarse antes de la sentenciaSQLseejecuta. / /u nS Q Lc o nd o sp l a c e h o l d e r s" : u s e r n a m e "y" : e m a i l " $ s q l = " I N S E R TI N T Ot b lu s e r( u s e r n a m e ,e m a i l )V A L U E S ( : u s e r n a m e , : e m a i l ) " ; $ c o m m a n d = $ c o n n e c t i o n > c r e a t e C o m m a n d ( $ s q l ) ; / /r e e m p l a c ee lp l a c e h o l d e r" : u s e r n a m e "w i t ht h ea c t u a lu s e r n a m ev a l u e

$ c o m m a n d > b i n d P a r a m ( " : u s e r n a m e " , $ u s e r n a m e , P D O : : P A R A MS T R ) ; / /r e p l a c et h ep l a c e h o l d e r" : e m a i l "w i t ht h ea c t u a le m a i lv a l u e $ c o m m a n d > b i n d P a r a m ( " : e m a i l " , $ e m a i l , P D O : : P A R A MS T R ) ; $ c o m m a n d > e x e c u t e ( ) ; / /i n s e r ta n o t h e rr o ww i t han e ws e to fp a r a m e t e r s $ c o m m a n d > b i n d P a r a m ( " : u s e r n a m e " , $ u s e r n a m e 2 , P D O : : P A R A MS T R ) ; $ c o m m a n d > b i n d P a r a m ( " : e m a i l " , $ e m a i l 2 , P D O : : P A R A MS T R ) ; $ c o m m a n d > e x e c u t e ( ) ;

Vous aimerez peut-être aussi