0% encontró este documento útil (0 votos)
339 vistas428 páginas

Desarrollo Php+MySQL Avanzado

Desarrollo PHP Mysql Mariadb

Cargado por

Fherppst
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
339 vistas428 páginas

Desarrollo Php+MySQL Avanzado

Desarrollo PHP Mysql Mariadb

Cargado por

Fherppst
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 428
USERS [= DESARROLLO PHP-+-MySQL POTENCIE SUS SITIOS ow) CON EL PODER DE " AMBAS HERRAMIENTAS , mrancesoapmes = TRANSACCIONES EN MYSQL ( (MYSQU: GUIA DE REFERENCIA, NX DE FUNCIONES ¢ SEGURIDAD, RESPALDO YY RECUPERACION DE DATOS wm por Francisco Minera LA ROBUSTEZ DE PHP Y EL DINAMISMO DE MYSQL DESARROLLO PHP + MYSQL POTENCIE SUS SITIOS CON EL PODER DE AMBAS HERRAMIENTAS RedUSERS Gaia iru: Desaroo PHP + MySaL auroR: Francisco José Minera COLECCION: Manuals Users FORMATO: 17x24em PAGINAS: §— 422 ‘Copyright © MIAXI. Es une pubkoeeidn do Fox Andina on coedicion con Gradi SA Hecho ol dopéste que marca Isley 11723. Tasos los derechos rasprvedes. Esta pubeacién no puede sor repraducida nian todo ni en parte, por ningin medio actual o future sin el pesmisa previ y por esrita Ge Fox Andina SA. Su inreccion esta ponads por las lyes 11723 y 2546, La pital no asune responsabilidad elguna por oualaviar consecuencie ddorvads del fabricacin,funeionamionto yl utitacion dels servicios y proicos que se describen yo enaizen. Todsslas marcas mencionadas en ‘st libro son propiodad exclusiva de sus espectivos duenos. Impreso en Argotina. Linco de edicién argertina Primera imocesin ‘Sevagret, Costa Rice 5226, Grane Gourg, Malvinas Argentines, Buenos Aires en Il, MX. SBN 978 907.177-169 Minera, Francisco Desarila PHP » MySQL - 1864 Buenos Ares: Fox Andins; Bante Lomas Zamora: Gras, 201 482.5217 em, (Manual usors;207) ISBN 972-987-1773.168 1. Informatics. Tito 00 0053 voww.redusers.com PRELIMMIARES Francisco José Minera Es Analista de Sistemas y Programador Superior, recibido en el Instituto Superior de Formacién Técnica N° 179 en cl afio 2003. Desde 2002 trabaja con PHP. Su experiencia como programador incluye numerosos trabajos realizados, en general, participando en disefios de sitios web dindmicos con bases de datos destinados, a pequefias y medianas empresas. Sus tareas estén relacionadas con el desarrollo de sistemas y plataformas para pequefias y medianas empresas en diversos Tenguajes y arquicecturas. Es autor de los libros Proyectos con PHR XML, PHP 5, Ajax, PHP. Master, Desarrollo Web Profesional, Curso de programacién PHP, PHP 6, PHP avanzado y Desarrollador Web. voww.redusers.com Prélogo PROLOGO Ha transcurrido ya bastante tiempo desde el primer lanzamiento de este libro, lo que nos da una inmejorable oportunidad para realizar un andlisis tanto acerca de lo que ha cambiado como de lo que sigue vigente hasta estos dias. En relacidn a las modificaciones, podrfamos decir que han sido positivas para con los desarrolladores: las nuevas versiones tanto de PHP como de MySQL. han sido aceptadas de muy buena manera y, aunque todavia hay un largo camino por reco- rret, las mejoras incluidas han dado respuestas a los pedidos de la gran comu- nidad de desarrolladores. Otro punto a favor es el continuo crecimiento del niimero de programadores que optan por estas herramientas: por un lado estén, los que, sin experiencia previa, encuentran que pueden répidamente comenzar a desarrollar aplicaciones funcionales incluso durante el proceso de aprendizaje. Ea cuanto a los que provienen de otros lenguajes o tecnologias de desarrollo ven que tanto PHP como MySQL pueden brindarles la solucién éptima para claborar soluciones répidas, estables, de bajo coste, y Ficilmente actualizables. Continuando con los items positivos podemos nombrar uno que tiene que ver justa- mente con el tiempo transeurrido, algo que habla por s{ mismo tanto de la evolucién, como de la madurer alcanzadas: sin dudas esto no es una moda pasajera y el fcuro es muy prometedor segiin los comentarios hechos por los responsables del lenguaje en diferentes entrevistas y opiniones realizadas en distintos blogs / redes sociales. En relacién alos puntos en contra, podemos nombrar una de las virtudes del lenguaje (eu facilidad de aprendizaje) que deriva en algo que podria eventualmente verse como algo negativo: hay muchas petsonas que programan en PHP. Si bien la competencia es algo que beneficia tanto a empleados como a empleadores, al haber tanta oferta ks condiciones que los empleadores ponen tienen mayor preponderancia, Viendo el lado positivo, la competencia hace que el esfuerzo por parte de los programadores los haga cjores profesionales, y eso a su vez deriva en mejores condiciones laborales. Otro punto que se puede marcar tiene que ver con la visién de algunas empresas para con el lengusje: algunas, ya sea por publicidades, falta de conocimiento, o el cema del soporte técnico, preficren apostar a alternativas como .Net o Java. Si bien se trata de opciones probadamente profesionales, quizs podriamos decir que algunas empresas, codavia no cuentan con toda la informacién al momento de decidirse entre una opcién, w otra. Este hecho deriva en algo que tal ver sea una realidad aun hoy: PHP. para empresas de cierto nivel, no es visto como un lenguaje viable para grandes proyectos. Beas wuewisredusers.com 5 PRELIMMIARES EL LIBRO DE UN VISTAZO En la primera parte de este libro encontraré una introduccién a la programacién en el enguaje PHP y el manejo de bases de datos relacionales, para luego profundizar en la sintaxis propia de PHP y MySQL. En cada caso, hallar8 ejemplos practicos que le per- mitirén comprender con mayor facilidad los conceptos desarrollados. De forma parti- cular se trata, ademas, una serie de temas de suma importancia, como son la administracién de una base de datos y la implementacién de medidas de seguridad. PHP En este capitulo encontraremos una seria de rnotas e informacién relevante relacionada con el lenguaje de pragramacién PHP: como dobomos adquirirlo, tas versiones y sus principales caracteristicas, BASES DE DATOS RELACIONALES través de este capitulo haremos un interesante repaso acerca de qué son y para qué podemos utilizar las bases de datos relacianales: entre otras casas analizaremos los modelos y disefio, normalizacién y operaciones relacionales bisicas, Mysa Para poner en prictica los eonceptos teéricas vistos en el capitulo anterior, elegimos una base de datos muy popular en este momento ¥ycon mucho futuro: MySQL. Analizaremes las razones de esta afirmacién y por qué MySQL es al complemento ideal de PHP. PHP Y MYSQL. En este capitulo hallaremos informacién relevante sobre las distintas alternativas que fs ofrece el lenguaje de programacién PHP voww.redusers.com para acceder ae, incluso, definir estructuras de bases de datos utilizando el motor denominado MySQL: aprenderemos la sintaxis adecuada de las funciones, las diferencias y citaremos diversas ejemplos, ademas efectuaremos comentarios acerca del funcionamiento de cada una de ellas SQLEN PHP. Una vez creada lala base de datos y establecida una conexién, comenzaremos a interactuar con los datos para realizar consultas de seleccién y de modificacién. En este capitulo encontraremos la informacipon relacionada con ests proceso, ERRORES Tanto PHP come MySQL nos brindan funciones y opciones de configuracién, que nos permitirdn tener un acceso controlado y Un entendimiento de los errores que puedan surgir en nuestras aplicaciones. En este capitule aplicaremos estas herramientas. ‘TRANSACCIONES En este capitulo, nos procuparemos de realizar un interesante recorrido a través de todas las ventajas que brinda Bees utilizar las transacciones, ademas podremas analizar su funcionamiento en los distintos tipos de tablas que ulilicemes. Capitulo 8 SEGURIDAD EN MYSQL. La informacién que almacenaremos en la base de datos deberé estar resquardada de cualquier problema o peligro. Veremos cudles son las principales tareas de mantenimiento implicadas: backup, optimizacién, recuperacién y reparacién, Capitulo 9 ADMINISTRACION DE MYSQL. Una vez que la base de datos ha sido desarrollada, deberemos cumplir un nuevo rol que conlleva nuevos deberes y responsabilidades: el del administrador. Aqui entenderemos su naturaleza, conoceremos sus tareas principales y descubriremos como aplicar un sistema de privilegios. ‘Apéndice A CAPAS DE ABSTRACCION DE DATOS Existen clases que nos permiten acceder a distintas bases de datos utilizando el mismo cBdigo, lo que es igual a contar con una Ellibro de un vistazo portabilidad de Las aplicaciones que puede cevitarnos un dolor de cabeza en el futuro. En este apartado veremos Pear::DB y ADOdb. Apéndice B EJEMPLO PRACTICO La informacién presentada en éste apéndice intenta mostrar la aplicacién préctica de los temas mas importantes que han sido analizados y tratados en el libro, através de la programacién completa de un sistema de venta de discos de misica Apéndice ¢ MysaLt Esta extension ofrace a os programadores algunas nueves funciones cuyasintaxis © implementacion son diferontes de anteriores versiones En esta secciin del libro nos dadicaremos presentar una complete guia de funciones que contiene la sintaxis aadecuada para cada una de llas Servicios al lector Instalar y configurar PHP, Apache y MySQL. para lograr un correcta funcionamiento es, desde ya, una tarea fundamental. Aqui veremos los pasos necesarios para logrart. TE NFoRMAciON COMPLEMENTARIA ‘A\lo largo de este manual encantrard una serie de recuadros que le brindardn infermacién com- plomentaria: curiosidades, trucos, ideas y consejos sobre los temas tratados. Cada recuadiro estd identificado con uno de los siguientes iconos: ccurtosioanes. ATENCION DATOS UTILES Y ‘smos wes, IDEAS. NOVEDADES, Beas wuewisredusers.com 7 CONTENIDO Sobre el autor 4 Prélogo 5 ELlibro de un vistazo 6 Informacién complementaria 1 Introduccién 1% Ete PHP Obtencién 6 Licencia de uso 7 Versiones. 18 PHP 19 PHP & 1” PHP 5: 2 {Qué versién utilizar? 2 pane Fa Fedde de prone ff ne 5 toes rae PCED ‘eQué es y para qué sirve ERAN Ge COC ites hte 5 Contenido Modelo de red 36 Madelo relacional 35 Madelo orientado a objetos 36 Operaciones relacionales basicas a Disefio de la base de datos 4 Tabla 2 Relacién “a Atributo 4 Claves primarias 44 Claves candidatas 45 Vistas 4B Esquemas, 46 indices a Tipos de retaciones entre tablas 52 Cardinalidad Uno a Uno 52 Cardinalidad Uno a Varios 52 Cardinalidad Varios a Varios 53 Normatizacién 56 Datos redundantes 57 Primera Forma Normal 59 Segunda Forma Normal 59 Tercera Forma Normal a MySQL y ol soporte para el mdelo relacional actual “ Integridad referenciat 2 Subconsultas: or Resumen 7 Actividades: wun redusers.com 9 PRELIMMIARES Et uso del monitor de MySaL 123 wysaL Resumen 12 Por qué MySOL? 70 Actividades 8 Obtencién de MySOL n Llcencia de uso n Diferencias entre versiones 73 PHPYMYsOL Tipos de datos 73 Cémo.conectar PHP con MySOL_ 100 Cadenas de caracteres 73 mysal_connect 130 Numéricos 7% mysal_peonnect 1m Fecha y hora 7 Ejecuciin de sentencios 133 mysal db query mma mmysal_query 134 Craacion de base de datos através de PHP 105 mmyagl create db as Seloceiin do una base de datos. 137 mysal select db 107 Creacién de tablas a través de PHP 138 Obtener listedos de datos Tipos de tobias @0_ytablas através de PHP uo ISAM 81 mysal list dbs ut MyiSaM 22 mysql list tables 1s MERGE 83 Uilizacion de miltiples bases de datos. 144 HEAP 85 Cudndohacerla a InnoDB 85 Cémo hacerlo 146 BerkeleyD8 86 En qué casos usar cade una? 86 Referencia de funciones a7 Funciones para trabajar con cadenas de caractores @7 Funciones pare trabsjar con campos numéricos 98 Cerrar conesién con la base Ms Funciones pare tabsjar myzol close ue con fecha y hora 104 Ejemplo prctico: autos php ua Funciones de conversibn 113 Resumen us Funciones agregadas oestaisicas 116 150 Operadorat de comparacién 14 Operadores lgicos 115 Introduce alos procesos SOL EN PHP almacenados 117 Consultas de seleccién 182 10 www redusers.com Contenido Selecién simple 152 tog errors 1% Consults mutitabla 182 error_tog 16 Subconsultas 152 tog_errors_max len 1% Recorrer las filas devueltas ignore_repeoted errors 1 de una consulta 153 ignore_repeated_source 19 mysal_fetch_array 153 track_errors 200 anyaglfetch_row 158 him errors 201 mrysal_fetch_object 158 error_prepend string 203 onyaalfetch_assoe 160 error_append string 20% mmysal_fetch field 163 war_plus overloading 205 Moverse entre ragistros 164 mysql error 206 mnyanl data seek 166 mysal_errno 207 Numero de registros ycampes devueltos 106 onysal_num rows 16 mnyenl_atfected rows 161 mrysal_num fields 169 Insert 170 Campos eutoincrementables 170 yea insert id 171 rogister globats 208 Delete 172 Cédigos de error en MySOL ne error 22 Errares en INNOdb 22 Manejo de excepciones na Resumen 23 Actividades ne TRANSACCIONES Update 173 {Qué es una transaeci6n? ne Ejemplo prtico: libro. php 174 Casos de apicacén 216 Resumen 107 Implementacién Actividades 108 de transseciones con MySQL a7 ma : ERRORES Roportos de error en PHP 190 error_reporting 190 display_errors 3 display_startup_errors 194 Baas wwew.redusers.cam " PRELIMMIARES Lavarableautocornmit 220 Erol del usuario: usuarios Tablas transaccionales 221 y administradores dl sistema 27 808 222 Sistema de privtegios ur INNOdb 22 Tabla user 26 Bloqueos 223 Tablatost 29 Bloquens en NNODB: FOR UPDATE 226 Tabla do 250 Bloqueos en INNODE: Tablas tables privy columns prie 251 LOCK IN SHARE MODE 227 Jerarquias de acceso 252 Resumen m1 Actividades: 228 z a | SEGURIDAD EN MYSOL Backup de Bases de Datos 250 Comandos grant y revoke 253 BACKUP 220 Geslibn de priviagios con INSERT 256 MySOLDump 231 Gettibn de privilege con SELECT 257 Gestiin de privlegios con UPDATE 257 — mer | Gestién de privilegios con DELETE 257 Baja de usvarios 258 ysal 258 Listar todos los usuarios mediante una consulta 258 Resumen 259 Actividades 240 Recuperacin ante fallos 205 Desde a tinea de comandos os Desde el prompt de MySQL 236 CAPAS DE ABSTRACCION Seguridad a nivel abla 237 PARA ACCESO A DATOS Reporacién de tablas Arquitecturayfuncionamiento 242 ena Base de Datos 207 Introduccion a MDB2 262 Optimizacion de tblas 241 Introducein » ADO 2 Introducein at replicacién 202 Seguridad fisiea 243 Resumen 2a Actividades 244 AADMINISTRACION DE MYSOL Erol del administrador de Bases de Datos 208 2 www redusers.com CaS Introduccién EJEMPLO PRACTICO MYSQLI Relerencia de funciones ue SERVICIOS AL LECTOR ‘Apache a0 PHP a2 MysoL. m2 Configuracién 413 cenxphp 294 —_Instalacién sobre Linux as index.php 295 Apache as. buscador.php 296 PHP: 6 {ogin.php 298 MySQL a7 verdiscos.php 200 Configuracién a9 carrito. php. 305 ‘Meni de opciones an Dar de atta discos 312 Dar de baja discos 1 Informacién acerca del funcionamiento 420 Configuracién de PHP a través dol archivo php.ini 428 Modificar los datos de los discos 317 Configuracién de MySQL Dar de alta categorias 321 através del Archivo php.ini 25 Dar de baja categorias 323 Configuracién del archivo my.enf 428 Modificar los datos de Indice tematico 429 las categorias 325 Equivatencia de términos 431 Dar de alta intérpretes 227 Abreviaturas comiinmente utilizadas 499 Dar de baja intérpretes 329 Modificar las datos de los intérpretes 331 Dar de alta sellos 333 Dar do baja sellos 335 Modificar los datos de los sellos 397 Ventas por mes 339 Usuarios mas actives 361 wun redusers.com 13 PRELIMMIARES INTRODUCCION Podrfamos decir que uno de los objetivos de este libro es el de incroducir al lector novel al desarrollo de aplicaciones web tomando como base a dos de las herra- micntas mds populares que existen cn la actualidad: el lenguaje de programacién PHP y la base de datos relacional MySQL. En la actualidad una enorme cancidad de sitios web utilizan estas tecnologfas, algo muy motivante sobre todo para aquellos estudiantes de sistemas o simple- mente aficionados que quieran insertarse en el mercado y que necesiten hacerlo a través de tecnologias probadamente aceprads. Pero més alld de lo circunstancial, PHP y MySQL brindan una alternativa mds a quienes quieren desarrollar soluciones altamente sofisticadas orientadas a todo tipo deemprendimientos, desde los mis simples a los mas complejos. Este libro eseé d gido a dar respuestas que a su vez leven a nuevas preguntas, es decir disparadores que obliguen al lector a continuar permanentemente la btisqueda de nuevos niveles. Los requisitos para con el lector son minimos: alcanzara solo con tener experiencia cn la utilizacién de algiin sistema operativo y una idea bisica acerca del funciona- miento de la arquitectura cliente servidor, esto es realizar una peticién aun servidor web a través de un navegador y obtener una respuesta adecuada. En definitiva, tanto cl Lenguaje PHP como la base de datos MySQL han conti- nuado exitosamente un camino iniciado hace ya mucho tiempo y los resultados, han sido realmente beneficiosos para todos los que de alguna manera estan rela cionados al mundo del desarrollo de aplicaciones web, y la idea es procurar que la mayor cantidad de desarrolladores se acerquen a esta via 14 www redusers.com Desarrollo PHP + MySQL PHP En este capitulo encon mos s referentes una serie de not al lenguaje de programacién PHP: cémo adquirirlo, sus versione sus principales caracteristicas y demas temas que servirén de para los capitulos subsiguientes, ‘tension oencia de uso Versiones PAP PAP a APS {ue version ta? [Extesianes on PHP ‘Bases de datos Ventas 6 trajar can etesions ‘iblotecas incorporadas Facidad de aprendiaje Portabilead Resumen SERVICIO DE ATENCION AL LECTOR: [email protected] _Atvidades 16 1 18 19 ysis eas ela oe 1PM OBTENCION PHP, acrénimo de PHP Hypertext Preprocessor, cs un lenguaje de programa- cién que se utiliza en la mayoria de los casos para el desarrollo de sitios web, pe- ro que para muchos es un lenguaje de propésito general y el uso que se le dé de- penderd en gran parte de las necesidades que posea el programador. Entre las caracteristicas que hacen de PHP un lenguaje popular y muy poderoso pa- ra desarrollar aplicaciones, podemos citar las siguientes: + Programacién de paginas dinamicas en servidores. ‘+ Programacién de aplicaciones de escritorio con GTK (PHPGTR). + Soporte para trabajar con miiltiples bases de datos. * Soporte para miiltiples placaformas. + Soporte para miileiples servidores. + Facilidad de aprendizaje. + Portabilidad de eddigo entre diferentes plaaformas. + Total libertad para distribuir las aplicaciones. Para obtener una copia de PHP, deberemos ingresar a su sitio web, www.php.net! downloads, y scleccionar la opcién que coincida con nuestro sistema operative, complete Source Code Complete Source Code Figura 1. Area de descargas en ol sitio web de PHR. Segiin Netcraft (wwwnetcraft.com), compafiia que se dedica entre otras cosas a brrindar estadisticas acerca del uso de tecnologias en Internet desde 1995, la utiliza 16 www redusers.com ncia de uso cién de PHP en servidores viene creciendo en forma sostenida y se hace cada ver mas popular, como se ve en la siguiente figura. Figura 2. Uso de PHP en servidores a través de! tiempo. (Fuente: hitp//news.netcraft.com). LICENCIA DE USO ‘Se mencioné con anterioridad que PHP cs un lenguaje “libre”. Este término se refic- re al tipo de licencia que tiene, y consiste, bisicamente, en tres puntos o “libertades": + La primera libertad es la de usar el programa (PHP). + La segunda es la de poder modificar el programa accediendo a su cédigo fuente. + Latercera es la de distribuir el programa modificado 0 no. La licencia de PHP esté disponible en www.php.net/license o, cambien, viene jun- to.con el programa en el archivo license.txt. La redistribucién, modificacién y uso del lenguaje PHP estén permitidos bajo ks siguientes normas (licencia versién 3.01): EE] 4 Nomar es mi NoMBRE PHP 05 un aerénimo recursivo de PHP Hypertext Preprocessor, ya que uliza su propio acrénimo como parte de su nombre, También ocurre esto con GNU, acrénimo recursivo de GNU's Not Unix. En elcaso de PHP se eligié la primera letra P (que podria haber sido cualquiorotral porque en algin momento (en (os inicios del tenguajel éste se land Personal Home Page Tools, wun redusers.com 7 1PM * La redistribucién del eddigo fuente de PHP debe estar siempre acompafiada de la correspondiente licencia y copyright de PHP. * No puede usar cl nombre PHP para promocionar sus productos, a menos que tenga permiso por escrito del PHP Group. No hay una empresa comercial detras de PHP; las mejoras y avances dentro del len- in ob- guaje resultan de una gran comunidad de desarrolladores que contribuyen, tener rédicos comerciales, con: eédigo fuente, soporte a través de listas de correo, e- visidn del programa en busca de errores, notificacién de fallas de seguridad, y més. Sobre esta base se sostiene una licencia que, juscamente, asegura la libertad del len- guaje y no pern les de PHD y sea el duefio del lenguaje: éste es el espiritu de la licencia, ‘Cuando se desarrolla una aplicacién y se la vende a terceros el importe que se cobra no es el lenguaje de programacién sino la solucién a un problema, el tiempo inver- tido en el desarrollo, el soporte, u otro particular. te bajo concepto alguno que alguien obtenga beneficios comercia- VERSIONES Esta seceién no precende repasar Ia historia de PHP, sino que, por el contrario, tie- nie como objetivo realizar una breve resefa de las caracteristicas principales y los cambios que sufrié el lenguaje desde la versién 3 hasta la 5 inclusive. PHP tavo versiones anteriores a la 3, pero elegimos ésta como punto de partida por- que es la versién mas antigua que puede verse hoy en dia en algunos sitios. Esto sucede, mayormente, porque los sitios en cuestién —que fueron desarrollados cen origen cuando esta versién era la tltima~cumplen con un objetivo preciso y no ién a versiones posteriores Hoy, fa mayoria de las aplicaciones estan programadas con las versiones 4 0 5 del lenguaje PHP, Al momento de escribir esta reedicién, PHP versién 6 no ha sido lanzado a produccién de manera oficial han necesitado actualiza Hy & rrincieio PHP nacié originalmente come un contador de visitas al sitio web que conten‘a el curriculum de su creador, Rasmus Lerdorf. en 1995, Estaba programado en PERL. Lerdorf realizo algunas me~ joras y agregé nuevas funcionalidades para [uego liberar el cédigo fuente al piblico. En 1997 ‘Andi Gutmans, Zeev Zuraski y Lerdorfrescribieron el cédigo y anunciaron la versién 3 de PHP. 8 www redusers.com Versiones PHP 3 PHD versién 3 fue creado en 1997 y se lo considera una continuacién de una ver- sién anterior de PHP llamada PHP/FI 2.0, aunque Ilamarla “continuaci lativo porque el cédigo se rescribié completamente, y sdlo se mantuvieron su for- ma de trabajar y algunas funciones implementadas: la idea era mantener alos usua- rios de PHP/ET y seguir trabajando en conjunto con ellos. ‘Ya en esta version, PHP tenia caracteristicas que perduraron en el tiempo y atin hoy an punto fuerte del lenguaje: soporte para una gran cantidad de bases de datos, \teraccién con protocolos de red y uso de extensiones. En cuanto a la orientacién a objetos (POO), la versién 3 le daba soporte a medias, sin implementar codas las posibilidades de este paradigm Se vislumbraba ya por estos tiempos a una gran cantidad de personas (decenas de lares de usuarios y cientos de miles de sitios web) que se encontraban interesa- das no tinicamente en utilizar sino, también, en colaborar con el lenguaje. PHP 3.0 se lanzé de manera oficial en el mes de junio de 1998. PHP 4 ‘Tomando como punto de referencia la versién anterior, el nticleo (parte del progra- ma que se encarga de administrar los procesos) de PHP fue rescrico para la versién 4, Esto se dio porque al ser cada vex mds popular, las aplicaciones existences en el mercado fueron haciéndose més complejas y requerfan mayor velocidad en la eje~ cucién que la que podta ofrecer PHP versién 3. El nuevo nticleo se denominé Motor Zend (cn referencia a los nombres de sus prin~ cipales desarrolladores, Zev Zuraski y Andi Gutmans). Otras mejoras importantes son: el soporte para la mayoria de los servidores web, las funciones para el manejo de sesiones HTTP, los buffer de salida y la inclusién de gran cantidad de funciones de propésitos diversos. La versién 4 llegé a estar instalada en més del 20% de los dominios en Internet. En cuanto a la POO, el soporte que PHP ofrecia, pricticamente, no se llegé a modificar con relacién a la versién 3. Lo que si se modificé fue su uso, ya que se volvié habitual para gran cantidad de usuarios, generalmente, en ap! nes de gran tamafio. Este EE] avanzar en vistintas DIRECCIONES A LA VEZ Dentro doa ampli oferta do languajes de programacién -destinados al dacarrllo do aplicacio- nes tanto web como de escritoio-, existenactvalmente algunos que tienen un sintaxis muy s- miar ala do PHP, Esta o5, quzis, otra do las vontajas do este Lenguaje: aprancor a programar an al da la posibliad de hacerlo luego en otro. wu redusers.com 19 1PM requerimicnto casi explicito por parte de los usuarios cendria su respuesta en la ver~ sidn 5. Un caso similar se dio con XML: PHP daba soporte para manejar esta clase de archivos pero cra bastante limitado en cuanto a las opciones que offecia. Un pun- to importante es que las extensiones escritas para PHP 3 no trabajan con PHP 4 (aun- que cs posible portar extensiones a PHP 4 si se tiene acceso a las fucntcs originales). PHP 4 se introdujo por primera ver en el mercado en el afto 1999, y ka versién ofi- cial fue lanzada en el mes de mayo de 2000. PHP 5 Los cambios que experimenta PHP en esta versién son verdaderamente importantes, y se podria decir que revolucionaron el lenguaje. La primera versin de PHP 5 se liberd en junio de 2003 (la primera versién conside- radaestable de PHP 5 se liberé en julio de 2004), Entre las nuevas caracteristicas figuran: Figura 3. Es posible encontrar informacién y caracteristicas de la iltima versién de PHP en su sitio oficial ‘+ Mejoras sobre el motor Zend (Zend Engine I). + En cuanto a la programacién orientada a objetos, PHP ahora ofrece notables mejoras que lo hacen una alternativa totalmente competente en este aspecto en comparacién a otros lenguajes con historia en este campo. ‘+ Mejoras en el soporte de XML (es importante saber que el eédigo fue rescrito en comparacién con la versién inmediatamente anterior). ‘+ Manejo de excepciones (similar a como lo hace Java). SQlite SQLite es una libreria escrita en lenguaje C que implementa un motor de base de datos accesible por varios lenguajes (PHP, Python, C, etcétera). 2 www redusers.com Versiones No permite muleiples usuarios accediendo a la ver en modo escrituraa la base de datos, debido a que el mecanismo de bloqueo que utiliza consiste en bloquear toda la base completa, Por eso, esta libreria esti especialmente indicada cuando se requiera de una gran rapider. en las consultas y nos baste que un dinico usuario pueda realizar modificaciones (cabe mencionar que SQLite es entre dos y tres veces més répido que bases como MySQL 0 PostgreSQL, ya que no es un servidor sino una base de datos de esctitorio, por lo que el acceso a los datos es ms directo, entre otras razoncs). Brinda soporte pata un miximo de 2 cerabytes de datos. ‘SQLite es software libre y podremos obtener mas informacién en su sitio oficial, el cual encontramos en la direccién www-hwaci.com/sw/sqlite. MySQLi Pero a pesar de estos importantes avances, quizés nos interese, particularmente, la inclusién de MySQLi (con i de “improved”, mejonado), una extensién que permite acceder a las funcionalidades provistas por MySQL. a partir de la versién 4.1.2. Se ha probado que esta extensién oftece mayor velocidad (en algunas operaciones, cs hasta cuarenta veces mis répida que la extensién MySQL anterior). Se esté trabajando para que la migracién desde la extensién de MySQL a MySQLi sea lo menos trabajosa posible. Esto se logra, entre otras cosas, manteniendo las funciones ~y sus nombres~ lo mas parecidas que se pueda en ambas extensiones. Si vemos cédigos programados con ambas cxtensiones, no podremos scr capaces de norar grandes diferencias en general. Podemos encontrar una completa resefia acerca de cémo instalar la extensién MySQLi en la direccién www.php.net/mysqli. Veremos dos caracteristicas: las consultas preparadas y la seguridad en las conexiones, ls cuales analizamos a continuacién, Consultas preparadas Cuando ejecutamos una instruccién SQL, lo que sucede es, en resumidas cuentas, que se crea la instruccién en PHP, se la envia al servidor de bases de datos (por caso, MySQL), éste controla que la instruccién sea valida y devuelve un resultado (puede ser un conjunto de registros, por ejemplo). Luego PHP trabaja con esos datos. Debemos saber que si ejecutamos una instruccién N veces (por ejemplo, insertar 100 registros), hay que enviar N instrucciones a MySQL. La posibilidad que da MySQU desde la versién 4.1.2 es que, en vez de recibir N instrue~ ciones, permite aceptar consultas preparadas: PHP le envia un molde de la instruccién, MySQL lo valida y lo guarda; luego PHP no tiene que enviarle la instruccién completa sino que puede mandarle sélo los datos que podrfan cambiar de una instruccién a otra, Por cjemplo, trabajando sin consultas preparadas sc harfa lo siguiente: wu redusers.com a 1PM INSERT INTO tablat VALUES (1, "argentina", 100.000); INSERT INTO tablat VALUES (2, "brasil", 500.000); INSERT INTO tablat VALUES (3, "uruguay", 300.000); INSERT INTO tablat VALUES (4, "paraguay', 200.000); INSERT INTO tablat VALUES (5, "chile", 600.000); En este caso, MySQL hace cinco veces un trabajo similar, esto sin contar el problema que se genera por al trafico en la red. En cambio, con consultas preparadas seria: INSERT INTO tablat VALUES (?,?,2); Asi, se envia y se valida una sola vez. Luego enviamos solo los datos que varfan: (1, "argentina", 100.000); (2, "brasil*, 500.000); (3, "uruguay", 300.000) ; (4, "paraguay", 200.000) ; (5, "chile", 600.000) ; ‘Vemos que se envian menos datos. Lo anterior no esti codificado en PHP. Simplemente sieve para ilustrar el concepto de las consultas preparadas (Prepared Statements en inglés). Seguridad en las conexiones Utilizando las funciones provistas por PHD para acceder a bases de datos MySQL, existia la posibilidad de tener una conexién por defecto: se establecia una cone- xién y, si en las siguientes instrucciones SQL no se la indicaba expresamente, se asumia la iiltima abierta. Esto puede traer ciertos problemas relacionados a la seguridad, por eso MySQLi requiere que se especifique explicicamente en cada script PHP Ia conexién que se utiliza. iQué version utilizar? Silaaplicacién ya esté funcionando y cumple con sus propésitos, evidentemente no hay razén para migrar a otra versién de PHP. 2 www redusers.com Extensiones en PHP Ahora bien, si queremas desarrollar un sitio desde cero, lo que conviene es utilizar la versign mis reciente del lenguaje: quizés no utilicemos todas las mejoras ni todas sus caracteristicas; pero si quisiéramos hacerlo no tendriamos que rescribir el cédi- g0, ni actualizar ala versién mas reciente, ni entrar en temas en ocasiones engorro- sos como cs la compatibilidad del lenguaje entre dos versiones distintas del mismo. Aunque a veces se diga que esta decisiSn depende de los requerimientos del desa- rrollador, PHP versién 5 es un tema aparte porque, como se dijo, ha sido mejora- do y no de forma cosmética: el soporte mejorado para la programacién orientada a objetos es algo que ya es muy popular en otros lenguajes y PHP no es la excepcién Gran cantidad de cédigo esti siendo escrito bajo este paradigma y mientras mis rf pido se acostumbre el programador PHP, mds en carrera estard a la hora de actuali- zar sus conocimientos ¢ incluso al momento de buscar empleo, Si ccnemos instalada una versién de PHD y no sabemos cul es, es posible recurtir ala funcién denominada PHPVERSION(: VERSTON() * sphpversion(); EXTENSIONES EN PHP Cuando programamos en un lenguaje no s6lo en PHP-, normalmente nos vale ‘mos de funciones o procedimientos, ya sea para resolver problemas o modular el c6- digo para hacerlo més legible y reutilizarlo sin escribir lo mismo més de una ver, Las extensiones no son ni mas ni menos que conjuntos de funciones que tenemos disponibles para programar pero, para ser mis precisos, podsfamos dividir las fun- ciones en dos grupos: las funciones que vienen incorporadas con el lenguaje Ey extension be La vistrisucion ‘Al momento de descargar la tltima versin de PHP desde su sitio oficial, encontraremas archi- ‘ys con distinlas extensiones |,ZIP, .TAR, .BZ y.TGZI, Debemos saber que todos contienen la mis- ‘ma informacién, y la eleccién de descargar uno u otro depanderd de si tiene o no un programa descompresor que pueda trabajar con dichas extensiones. wu redusers.com 3 1PM (llamadas built in) y las que estén en las bibliocecas afladidas, que se tienen que incluir en el sistema de forma especifica. Las extensiones ~o bibliotccas~ componen el segundo grupo. para utilizar ciertas funciones hay que extender el lenguaje. Una vez que se instalan y se habilitan esas bibliotecas (ya vercmos cémo hacerlo), el comportamiento de las Funciones componentes dentro del cécigo de nuestros pro- {gramas es idéntico al de cualquier funcidn © procedimiento, o sea que la progeama- idn se vuelve independiente y transpatente al origen de las funciones. Las extensiones en PHP pueden agruparse por funcionalidad, es decir que podria- mos encontrarnos con una extensién para manipular cadenas de caracteres, otra pa ra acceder a bases de datos, otra para trabajar con archivos XLS, y demés, Para instalar estas extensiones, tenemos que seguir una serie de pasos: el prime- ro de ellos es abrir el archivo php.ini (si estamos trabajando con PHD versién 3 el archivo, probablemente, se lame php3.ini; desde la versién 4 en adelante se ha convenido en Ilamarlo simplemente php.ini), buscar la linea que comienza con extension dir y reemplazarla por extension_dir = "c:\PHP\extensions", en caso de que C:\PHP\extensions sea en donde tenemos almacenadas las extensiones que vienen incluidas con PHP. Para saber en qué lugar se encuentran las extensiones, debemos buscar dentro del directorio en donde instalamos PHP una carpeta lla- mada extensions (o ext) y copiar la ruta completa hasta allf a la Linea extension- dir del php.ini, tal como se mostré anteriormente. ‘Guardar las extensiones en un solo lugar implica el beneficio de no tener que indi carla ruta completa a la extensién cada vez que queramos usarla, Segtin estemos tra- bajando sobre sistemas Linux/Unix o Windows habra diferencias tales como: Se podria decir que ‘* Limux usa la barra / para acceder a subdirectorios (el directorio de extensiones po- diva ser /ust/lib/PHP3), mientras que Windows usa la barra \, ‘Las extensiones en Linux son archivos .80, en Windows son .DLL. Ahora sélo nos queda habilitar las extensiones que vayamos a usar. Lo tinico que de- bemos hacer es buscar dentro del archivo php.ini una lisea del tipo (con archivos ter- minados en .$0 0 -DLL segtin corresponda): Ey covico be Barras Una de las equivocaciones més frecuentes a la hora de publicar nuestros archivos PHP en un servidor con un sistema operativo diferente del nuestro, es la de escribir las rutes @ archivos 0 Girectorios de forma incorrecta, Cabe recordar que los sistemas Unix compatibles usan / para acceder a subdirectorios, y los sisternas Windows usan \ 4 www redusers.com Extensiones en PHP jextension=pgsql.so jextensi sxtension=xnl.so Y quitarel punto y coma inicial para habilitar las bibliotecas que queramos usar. Pa- ra que los cambios tengan efecto habré que reiniciar el servidor web. Se pueden habilitar miiltiples extensiones, incluso no existe ningain inconvenien- te en, por ejemplo, utilizar dos recas con el objetivo de acceder a diferentes tipos de bases de datos al mismo tiempo. Bases de datos PHP tiene extensiones para soportar, entre otras, las siguientes bases de datos: + DBase + msql + Informix * Oracle * Interbase * Postgre SQL. + MS SQL Server * Sybase + Mysql Incluso con ODBC (Open Data Base Connectivity, Conectividad Abierta de Bases de Datos) se puede acceder a casi cualquier base de datos existente en el mercado: ODBC brinda un conjunto de comandos que son traducidos a instrucciones espe- cificas de una base de datos en particular a través de drivers provistos por étas, Es claro que utilizar funciones nativas da més réditos, en cuanto a la velocidad de respuesta, comparado con trabajar con algiin mediador tipo ODBC. Ea nstavacion Hay varios programas que nos ofrecen descargar PHP, MySQL y Apache on un solo archivo, @ instalartos @ través de un programa que nos guia y nos hace preguntas acerca de dénde queremes instalar cada elemento, qué tipo de instalacién preferimos, etc, tal come lo hacen muchas aplicaciones que trabajan bajo Windows, wu redusers.com cy 1PM Por otro lado cuando se emplean bases de datos con una gran cantidad de presta- ciones como Oracle y se utiliza ODBC, OLE, ADO, etcétera, se pierde gran par- te del poder, puesto que hay funciones propias de la base de datos que no se puc- den utilizar con un mediador genético como éstos, por no estar implementadas. Por lo tanto si se quiere utilizar todo el poder de la base de datos, es preferible acceder con funciones nativas para ésta, como las que ofrece PHP en sus extensiones. Por ejemplo, si en nuestro proyecto sabemos que vamos acceder sdlo a la base de datos Postgre SQL, no hay necesidad de acceder con ODBC ya que PHP nos provee de tuna excensién (php_pgsqldll) para hacerlo de forma nativa, Ventajas de trabajar con extensiones Sélo cargamos las bibliotecas cuando las usamos: PHP ya nes incorporadas y seria poco recomendable iniciar el motor para soportar cientos de funciones de las cuales probablemente necesitemos s6lo algunas. Ademés, al afia- dir una biblioteca no hace falta reinstalar PHP, slo hebilitar desde el archivo ph- paini lo que necesitamos: esto significa modularidad. ne demasiadas funcio- Bibliotecas incorporadas Bl lenguaje PHP incorpora sin necesidad de ningtin tipo de instalacién ni habilia- id extras las funciones que listamos a continuacién: + Para manejo de matrices. ‘+ Funciones mateméticas. + BCMath (Desde PHP 4.0.4. Miis funciones matematicas) + Para manejo de Clases/Objecos. + Para manejo de variables de tipo de caricter. + Para tratamiento de Fecha y Hora. + Para acceso directo a Entrada/Sal + Funciones de directorio. + Funciones de Gestién de Errores y Ri [Ey wirar y aPrENDER Es importante tener en cuenta que se lagra un mayor entendimianto del lenguaje cuando nos lencargamos de leer cédigo est muchas maneras, y ne quedarse sélo con un punto de vista ayuda a abrir nuestra mente e incor- pporar nuevas formas de encarar la escritura de un cédigo. por otras personas: un mismo problema puede resolverse de 6 www redusers.com Extensiones en PHP + Funciones de Sistema de Archivos * Para utilizar el protocolo FTP. + Para utilizar el protocolo HTTP. + Funciones de correo. + Funciones de Red. * Funciones de Control de Salida. «+ Para ejecucién de Programas. + Funciones para el manejo de sesiones. * Funciones de secuencia + Funciones de cadenas. + Funciones URL. + Para manejo de Variables. Para poder tener acceso a las dems bibliotecas, tendremos que activarlas a través del archivo php.ini, o bien incorporarlas al momento de compilar PHP e inscalar las bibliotecas en forma separada (inicamente para aquellos sistemas operativos en los que para instalar PHP haya que compilarlo). Para ver qué bibliotecas tenemos activas en nuestro sistema, podemos utilizar la funcién PHPinfo() de la siguiente manera: Normalmente cuando no recordamos cémo instalar 0 habilitar una biblioteca en particular en nuestro sistema, bastaré con buscar la referencia en el manual de PHP, el cual encontramos en la direccién www.php.net/manual Hy ave En revistas ospecializadas, libros y/o articulos en Internet encontraremos referencias alos sisto- mas LAMP. Esta sigla se refiere # Linux, Apache, MySQL. y alguno de ls lengusjes Per/PHP/Pyt= hon. Los sistemas tipo LAMP son muy utiizados en la actualidad, entre otras razones, debide ala estabilidad, [a potencia y el bajo costo de desarrollo de las herramientas que los componen, ees wun redusers.com fa 1PM FACILIDAD DE APRENDIZAJE Esto evidentemente no equivale a hacer un juicio de valor sobre otros lenguajes, simplemente se trata de una cualidad de PHP. PHP se caracteriza por ser un lenguaje cuyo aprendizaje se vuelve sencillo incluso para aquéllos que nunca han crabajado con ningtin otro lenguaje de programacién, pero esta claro que tener conocimientos previos ayuda a entender mas ripidamen- te qué se est haciendo y cémo se ests haciendo, Un punto importante es que ka sintaxis de PHP deriva o es similar ala del lenguaje C, que es realmente muy popular: el que tenga conocimientos en este lenguaje se acercard con més facilidad al uso de PHP. La meta de este lenguaje es permitir escribir a los creadores de sitios web paginas ndmicas de una manera répida y facil, pero si se quiere ir més ally llegar a desa- rrollar aplicaciones complejas necesicaremos avanzar dentro del lenguaje: 4 PHP sea ficil de aprender pero este aprendizaje debe ser constance. PORTABILIDAD PHP cs un lenguaje multiplataforma, lo que significa que est preparado para era- bajar sobre distincos sistemas operativos. Mas adelante en este mismo capitulo po- dremos ver un liscado de los si -mas operativos soportados. Pero la portabilidad esta también en que no es necesario realizar grandes modi- ficaciones al cédigo fuente de una aplicacién escrita en PHP al momento de tras- ladarla de una plataforma a otra: si lo deseamos podemos desarrollar aplicacién en Windows 0 MAC, pero luego subir el mismo cédigo a un servidor que esté corriendo Linux, por ejemplo. La portabilidad de PHP es, sin duda, un punto fuerte frente a lenguajes como ASP JASPINET, que necesican de componentes adicionales para correr en algunas placa- formas. PHP corre en una gran cantidad de sistemas operatives y sin necesidad de un componente adicional que debamos comprar. sestra Debemos tener en cuenta que el lenguaje de programacién PHP se encuentra disponible para los siguientes sistemas operativos: + Unix/HP-UX * Unix * Unix/Linux + Windows (codas las versiones, salvo * Unis/OpenBSD PHPS que no corre bajo Windows 95) * Unix/Solaris * MAC OS 8 www redusers.com Portabilidad Actualmente, PHP se puede ejecutar bajo los servidores web Apache (incluso en la versién 2.0), IIS (Jnsernet Information Server), PWS (Personal Web Server), AOLSer- ver, Roxen, OmniHTTPd, Oreilly Website Pro, Sambar, Xitami, Caudium, Nets- cape Enterprise Server, THTTPD, y otros. Las posibles incompatibilidades entre plataformas son las siguientes: * Ruta a archivos/directorios. * Bibliotecas que sélo funcionan en algunos sistemas, por ejemplo: -Funciones W32api (sélo para plataformas Windows de 32 bits) ~Funciones para el manejo de Impresoras (slo en Windows 9x, ME, NT4 y 2000). -Las funciones COM para Windows. ~Funciones de acceso directo a E/S (no disponibles para sistemas Windows). -Funciones GMP (funciones que permiten trabajar con enceros de longitud va- riable, no disponibles para sistemas Windows). -Funciones para el control de procesos (no disponibles para sistemas Windows). -Funciones FAM (notifican cambios en archivos y directorios, no disponibles pa- ra sistemas Windows). -Funciones POSIX (no disponibles para sistemas Windows). -Funciones para Neurses (no disponibles para sistemas Windows). lad con Windows NT/2000/XP/7 Incluso existen bibliorecas que oftecen compatiil pero no con las versiones de Windows 9.x. Normalmente cuando no recordamos si una biblioteca es 0 no compatible con ‘nuestro sistema, basta con buscar la referencia cn el manual de PHP, www.php.net/ manual/ y verificar si hay algiin requerimiento. BW resumen En este capitulo hemos visto una resefia de las principales virtudes del Lenguaje de progra- ‘macién PHP: qué hace, para qué sirve, on qué se usa mayormente, qué versiones existen. También vimos cuales son los requisitos para instalarlo y cémo incorporar extensiones para hacer nuestro trabajo mas facil. En definitiva, un punto de partida para conocer un lenguaje que esté dando mucho que hablar y que seguirs haciéndolo, wu redusers.com 29 [™@ ACTIVIDADES Desarrollo PHP + MySQL Bases de Datos relacionales Desde hace algiin tiempo a esta parte se le da cada vez mas importancia al hecho de reunir la mayor cantidad de informacién posible para cuando Uegue el momento de tomar decisiones Justamente, los sistemas de apoyo a la toma de decisiones y su disefio son parte fundamental de este capitulo. SERVICIO DE aTENCiOW aL LEcTOR: [email protected] Qué es y para qué sive ‘ma Base de Datos? Aequitestra de Bases de Datos del de datos oven réraico ovo de ed ola relacial ‘Modelo crientado a objets Operaciones relacionales bisicas Diseo dela Base de Datos Tabla Relacin tito Claes primaries Claes candidatas Vistas Esquemas indices Tpos de relaciones entre tablas Catcnaidad Uno a Uno (atc Uno a Varios Catcinaidad Vas a Varios Nrmalzacién Datos refundantos Primera Ferma Nannal Sogunda Forma Namal Tercera Forma Nomral ySIL ye soprt par el modelo rezcional actual Integrad referencia Suboorsutas Resumen Actividades alaels|o lel slslalelalelalalsls ote| 2) ¢| el ale) sla gigiaia) EQUE ES Y PARA QUE SIRVE UNA BASE DE DATOS? Una base de datos cs una estructura organizada de datos relacionados entre si que nos permite obtener, eventualmente, informacién actualizada acerca de una organizacién. Se dice eventualmente porque una base de datos por si misma no nos produce nin- {guna mejora: el beneficio se logra disertindola correctamente a partir de lo que ne- smos (requerimientos) y manteniendo sus datos actualizados. Arquitectura de Bases de Datos En 1975, el comiré ANSI-SPARC (American National Standard Institute - Standards Planning and Requirements Committee) propuso una arquitectura de tres niveles pa- ra los sistemas de bases de datos cuyo objetivo es el de separar las aplicaciones de la base de datos fisica. Los tres niveles son: + Interno: ¢s cl nivel mis bajo de abstraccién. Define codos los detalles de eémo funciona el almacenamiento en la base de datos y los métodos de acceso la in- formacién. + Conceptual: este nivel se aleja de los detalles técnicos y se concentra en las ne- cesidades de los usuarios. Se deseriben entidades, atributos, relaciones, operacio- nes de los usuarios y restricciones a las acciones de los mismos. Es una represen- tacién de los datos desde el punto de vista de una organizacién, + Externo: aqui se define qué partes de la base de datos podrin ser vistas y cusles serin ocultas a qué usuarios. Es el nivel de mayor abstraccién. MODELO DE DATOS La idea primaria de los sistemas informiticos es poder plasmar, a través de dife- rentes herramientas, situaciones del mundo real. Para traspasar la realidad de una situacién en concreto a una base de datos existe una serie de pasos intermedios que facilitan esta tarea. Una de estas herramientas es el modelo de datos, que per- mite describir de modo abstracto en qué forma se va almacenar y a recuperar la informacién existente en una base. Quizis el més conocido sea el relacional, pero existen otros modelos de adminis- tracién de datos, los cuales detallamos a continuacién: + Modelo jerirquico + Modelo de red * Modelo orientado a objetos 2 www redusers.com Modelo de datos A continuacién, haremos un anilisis de todos ellos para conocer sus diferencias y sus caracteristicas mas sobresalientes en lo que se refiere al disefio de bases de datos. Modelo jerarquico Las bases de datos que ingresan dencro de este modelo organizan su informacién utilizando niveles de jerarquias. Cada nivel de jerarquia puede tener un miimero N de nodos, con la particularidad de que cada uno no puede tener mis de un padre. Figura 1. Modelo jerarquico. En la Figura 1, el modo 1 no tiene padre cuando se da esta situacién se lo llama no- do raiz- y tiene dos hijos. De esos hijos slo hay uno que es padre, Haciendo un paralelismo entze los tipos de relaciones que admite el modelo rela- cional, el modelo jerdrquico admite relaciones uno a varios y uno a uno, Este modelo tiene muchos puncos en comin con las estructuras de tipo érbol. TD Pensar en et Futuro Debemos tener en cuenta que disefiar una bace de datos puede ser la parte que mas tiempo nos demande dentro de un desarrollo de importancia, Por este razén es conveniente prestar aten~ cidn a todos los detalles, ya que cambiar la estructura de la base de datos en medio de un desa- rrollo no es lo mas recomendable por los problemas que pueden generarse. Beas wuewisredusers.com 33 2. BASES DE DATOS RELACIONALES En comparacién con el modelo relacional (ver més adelante) aqui sf importa, co- mo en el modelo de red, el orden en que se ubiquen los datos. Uno de los inconvenientes del modelo jerirquico consiste en la redundancia de datos. Supongamos una relacién Maestro-Detalle, como es pedides y productos. Cada pedido puede contener més de un producto y, a su vez, cada producto pue- de encontrarse contenido en mas de un pedido. Si intentamos simular esta situa- cién por medio del modelo jerérquico, llegaremos a la conclusién de que es im- posible, a menos que repica informaciones. Figura 2. Maestro-Detalle en el modelo jerdrquico. ‘Un problema aparte es el de eliminar un nodo padre. Se tendria que eliminar toda su descendencia, Esta clase de problemas se solucionan en los demas modelos. Modelo de red Es ligeramente similar al modelo jerdrquico. Una de las diferencias fundamencales es que aqui un nodo puede tener varios padres. Dy wezcia Sibien el modelo de datos mas utilizado on la actualidad es ol conccido como relacional, en dotor- rminados sectores esta imponiéndose el modelo lamado orientado a objetos, Por otra parte, es importante caber que ambos toman cosas del otro, y aunque mantienen sus principios fundamen- tales, intentan dar a los usuarios y desarrolladores lo que éstos buscan. 34 www redusers.com Modelo de datos Administrar la informacién en una base de datos de este tipo puede llegar a ser demasiado dificultoso, debido a que existe la posibilidad de que haya una gran cantidad de interrelaciones entre nodos. Figura 3, Modelo de red. En la imagen anterior se pueden observar algunas de las posibles relaciones existentes entre nodos: el nod 2 y el nodo 3 son padres del nodo 4, que a su vez es padre del nodo 5. EI nodo 1 no tiene padres ni hijos. Este modelo admite relacioncs uno a varios y uno a uno, Modelo relacional Se trata, sin dudas, del modelo més popular desde hace un tiempo, y con él se im- ponen conceptos tales como tabla ~arreglo bidimensional-, fila y columna. Es un modelo relativamente nuevo (tomé notoriedad en 1970 y su autor, Edgar Frank Codd, murié el 18 de abril del aio 2003) y quizas el vinico que llegé tanto a los usuarios finales como también a los desarrolladores. Se recuperan los datos por medio de lenguajes de programacién de consulta (el més popular es SQL, pero también existen otros lenguajes de este tipo) que mantienen la compatibilidad aun entre sistemas gestores de bases de datos de distineas compa Fas ¢ incluso entre sistemas operatives diferentes, Entendemos el modelo relacional como una propuesta de ver los datos come si se crataran de objetos del mundo real, diferenciables entre si por sus caracteristicas bé= sicas, Un objeto dado puede ser descrito por la coleccién de caracteristicas que tie ne (denominadas atributos), y diferenciable a partir de eso mismo de otros objetos. Este modelo admite relaciones uno a varios, uno a uno, y varios a varios. Beas wuewisredusers.com 35, En este modelo las tablas deben cumplir las siguientes reglas: * Cada fila debe ser tin * Cada columna debe ser tinica. * Los valores de las columnas deben pertenecer al dominio de cada attibuto. + Debe tener un solo tipo de fila * El valor de la columna para cada fila debe ser tinico Modelo orientado a objetos Al intentar trabajar con sistemas de informacién geogréfica o también con sis- temas multimedia, los modelos anteriormente mencionados no se sienten de- masiado cémodos ¢ incluso algunos ni siquiera pueden soportarlos por, entre otros, los motives que se enumeran a continuacién: * La estructura de los objetos es mas complejas * Las transacciones son de larga duraciéns * Se necesitan nuevos tipos de datos para almacenar imigenes y textos; + Hace falta definir operaciones no estandar, especificas para cada aplicacién. Todo esto sin contar con el hecho de que los lenguajes de programacién orientados a objetos estin teniendo un gran auge, y aprovechar una base de datos que compar- «a los mismos principios no es nada desdefiable. Incluso muchas bases de datos rclacionales ~por cjemplo, PostgreSQL~ cstin implementando varios conceptos propios de los orientados a objetos. Estas ba- ses son Ilamadas a veces Objeto-Relacionales. Las bases de datos orientadas a objetos en lugar de incorporar tablas como lo hacen las relacionales, utilizan objetos. Los objevos de una base de datos tienen las mismas caracteristicas conocidas de los objevos de los lenguajes orientados a objetos (heren- cia, polimorfismo, encapsulacién, otros). Este modelo admite relaciones uno a varios, uno a uno, y varios a vatios, FEy onven v Procreso Es importante mancionar que si no tenemos demaciada experiencia an le que se retiere al di- sefio yla implementacin de bases de datos, es recomendable que comience a hacerlo de for~ ‘ma pausada ~pero progresiva-, poniande en practica ejemplos simples para {uego ampliar- ialidades o desarrollando otros mas complejos. 96 www redusers.com Operaciones relacionales basicas OPERACIONES RELACIONALES BASICAS Estas operaciones forman parte de lo que se consi ra cl dlgebra relacional y sirven para crear nuevas relaciones a partir de las ya existentes. Si conocemos cl Lenguaje SQL encontrarcmos scmejanzas directas con respecto a las operaciones que pasaremos a describir y es exactamente asf porque este lenguaje no es mas que una implementacién de estas operaciones. El Algebra relacional —junto con el eélculo relacional~ fueron definidos por Codd como la “base de los lenguajes relacionales”. Se puede decir que el algebra es un len- guaje procedural (de alto nivel), mientras que el eéleulo relacional es un lenguaje no procedural. Sin embargo, ambos lenguajes son equivalentes: para cada expresién del Algebra, se puede encontrar una expresién equivalente en el caleulo, y viceversa. El algebra relacional es un lenguaje con una serie de operadores que trabajan so- bre uno o varios conjuntos de datos -podemos asumir que son tablas~ para ob- tener otro conjunto como resultado, sin que cambien los originales. La salida de tuna operacién puede ser la entrada de otra operacién. Esto permite anidar ex- presiones de dlgebra del mismo modo que se pueden anidar las expresiones arit- meéticas (esta propiedad se denomina clausura). Debemos saber que de los nueve operadores, sélo hay cinco que son fundamen- tales: seleccién, proyeccién, producto, unién y diferencia, que permicen reali- zar la mayoria de las operaciones de obtencién de datos. Los operadores no fun- damentales son reunién, interseccién, asignacién y divisién, que se pueden ex presar a partir de los cinco operadores fundamentales. A continuacién se presenta una descripcién de las nueve operaciones: 1. Unién 6. Proyeccién 2, Interseccién 7. Reun 3. Diferencia 8. Divisio 4, Producto 9. Asignacién 5. Seleccién TI consuntos Habremos notado que algunas de la operaciones relacionales basicas son propias de las operaciones entre conjuntos y esto es, precisamente, porque de allf provienen. De hecho, po- demos pensar una base de datos como una serie de conjuntos de datos y, a su vez, que cada tuno de esos conjuntos posee subconjuntos que agrupan a los datos. was wun redusers.com 7 2. BASES DE DATOS RELACIONALES Para unién, interseccién y diferencia supondremos los conjuntos de la Figura 4. Conjunto 4 Conjunto 2 Figura 4. Situacién inicia, 1, Unién: debemos saber que esta operacién permite combinar datos de distincas tablas que tienen la misma eseruccura. nn Figura 5. Union. FEy poner EN PRACTICA LOS CONOCIMIENTOS En internet circulan, fracuentemente, gran cantidad de ejercicios ~en general, de universidades- {gue pueden servimos de gran ayuda a la hora de poner en practica nuestros conocimientos acer~ ca del disefo de sistemas, Cabe recordar que la mejor manera de aianzar conocimientos y ad- Auirir otros es enfrentandase a situaciones y desaffos nuevos. 8 www redusers.com Operaciones relacionales basicas 2. Interseccién: esta operacién permite obtener filas comunes a varias tablas. Interscestin Figura 6. Interseccién. Diferencia: permite obtener filas que figuran en una tabla pero no en otra. Diterencia entre Conjunto 4 y Conjunto 2 Figura 7. Diferencia EG et simsoro Para disefar bases de datos generalmente se utilizan diagramas que descriten de forma grati- ca las estructuras de las tablas, las relaciones, [as claves primarias, as claves foraneas, etc, Si bien hay simbolos clacicos para implementar en este tipo de diagramas, lo mas importante es entender el funcionamiento del sistema, més alla de la simbologia utilizada. Beas wuewisredusers.com 99 2. BASES DE DATOS RELACIONALES 4, Producto: nos permite obtener todas las posibles combinaciones (producto cat- tesiano) entre las dos tablas correspon: ientes. Figura 8. Producto. 5. Seleccién: esta operacién nos permite obtener un conjunto de filas de una o mas tablas que satisfacen una condicién especificada. Todos los reistrs con A> 1 = Figura 9. Seleccién. 6. Proyeccién: es un caso concreto de la operacién de seleccién, y permite disc minar las columnas que deseamos obtener. 40 www redusers.com nes relacionales basicas Todos os reistros B con A> 1= | 7 Figura 10, Proyeccién Reunién: la operacién unién permite obtener datos de distintas tablas con la misma estructura, La operacién reunién permite obcener datos de distineas t2- blas con distineas estructuras. Su equivalente en SQL es JOIN. Reunién Todos los rogistos B yXcon A=A y A>3= Figura 14. Reunién. 8. Divisién: si dividimos una tabla B por una tabla A obtendremos como resulta- do una tercera tabla que contendri los campos de la tabla B que no existen en la tabla A y las filas que estan asociadas en la tabla B con cada fila de la tabla A. EG Primera insTancia Debemos tener en cuenta que para poder poner en prctica los ejemplos entragados en este ca- pitulo debemos antes instalar y poner en marcha el servidor web, el servidor de bases de datos yee Lenguaje PHP, En este libro se incluyen notas referidas a estos temas, de forma que el lec- tor pueda realizar estas tareas por su cuenta y sin complicaciones, Beas wuewisredusers.com at 2. BASES DE DATOS RELACIONALES Dhistén 1 | divisido Figura 42. Division, 9. Asignacién: debemos saber que la utilidad de esta operacién consiste en asignar valores a uno 0 més registros de una tabla. Asignar 10 a8 Figura 13. Asignacion. DISENO DE LA BASE DE DATOS Sibien las bases de datos estan cada vez mis cerca de los usuarios finales, siguen ma- nejando una terminologia propia y en esta seccién intentaremos introducir algunos de los conceptos fundamentales para luego avanzar sobre otros temas. Tabla Una tabla es una coleccién de una o mds columnas y cero 0 mas fila, Las tablas, pueden ser entendidas como una estructura de datos simple que se asemeja bas- 2 www redusers.com Disefio de la Base de Datos ante a una matriz.de dos niveles: el primero podria represencar el ntimero de fi- la y el segundo, el ntimero de columna. Para poder acceder a un valor de esta matriz debemos indicar alguno de estos dos datos. Colummas Ga. a at Fils J 1 Figura 14. Estructura de datos Tabla Como se dijo, una tabla nos permite organizar los datos en filas (también llamadas, cuplas 0 registros) y columns (atributos, campos). Cada una de estas filas (asi como los datos que se encuentran contenidos en ella) debe ser distinta con respecto a las demés. Cada columna dentro de una fila es el valor de un atributo de esa fila Relacién Una relacidn es una vinculacién entre ideas, una forma de asociar entidades para lo- grar el objetivo en comin que tienen. Una relacién es una asoctacién encre entidades. Existen varios tipos de relaciones, que se verén mds adelance. Atributo Un atribuco define y diferencia una entidad de otra. Los atribucos pueden verse co- mo caracteristicas de las entidades, Veamos un ejemplo: un perro puede tener un Ea actuauizacion Es importante caber que la extensién denominada MySQL provee grandes mejoras con respec- toz la extensién anterior y, ala vez, intenta mantener la compatibilidad de las funciones ya exis~ tentes en versiones anteriores. Mas informacién y una completa guia de referencia de las fun- ciones de esta nueva extensién en el Apéndice C de este libro. Beas wuewisredusers.com 43, nombre, un duefio, un color de pelo, una edad, una comida preferida, y demés. Todos estos son atributos de un perro. Nétese que no definimos ningtin valor particular para estas caracteristi «s el nombre del perro y no un perro, Rosita es una instancia del atributo nombre, ss el atriburo Claves primarias Para diferenciar una entidad de otra debemos remitienos a sus acsibutos, y para ferenciar una fila de otra dentro de una tabla nos guiamos por la clave prima Una clave primaria tiene la particularidad de no tener valores repetidos. Para d dir cuilfes de todos los atributos formarin parte de la clave primaria, debemos bus- car uno que cumpla con la requisitoria anterior; y si no existe deberemos crear una clave primaria artificial. Veamos ejemplos de cada situaci Suponiendo la tabla libros, tenemos la siguiente escructura: entre Cand_pagaas oil ‘sen fate En este ejemplo, si repasamos los atributos uno por uno notaremos que sélo hay uno que no va a repetirse y es ISBN. Podemos tomarlo como clave primaria: ya que no habré dos libros con el mismo ISBN, no habré dos filas iguales. Debemos saber que una clave primaria puede estar formada por més de un atribu- to, en este caso se dice que es una clave compuesta. -Podriamos tomar como clave primaria a ISBN y cualquier otro atributo, como por ejemplo Editorial? Si, se podrfa, pero no se deberia. Mis adelance, en este mismo ca- pitulo, en la seccién Normalizacién, se responderin ésta y otras preguntas. Nada nos impide pasar por alto la clave ISBN y crear otra, que podrfa llamarse co- igo _Ubro, En este caso codigo libro no significa nada, no tiene ninguna implican- Bey Para PRESTAR ATENCION La versién 4.1 ~junto a la S- de MySQL marca un verdadero quiebre en cuanto a las funcionali- \dades prestadas por este gestor de bases de datos. Una muestra de esto es Ia inclusion en PHP ée una nueva extensién llamada MySQLi, que viene con la distribucién desde la versién 5 de PHP cen adelante, y cuyo objetivo es soportar las nuevas funciones de MySQL. 4 www redusers.com Disefio de la Base de Datos cia para lo que es un libro: sélo se trata de un atributo con una restriccién bisica que seri el hecho de no tener la capacidad de repetirse. Este caso también se relaciona con las téenicas de normalizacién. Simplemen- ce, se trata de respetar ciertas técnicas de diserio de bases de datos y, a la vez, te- ner en cuenta lo que nuestro sistema necesita: las decisiones finales corren por cuenta de las personas que se encarguen de ello, Veamos otro caso en el cual tenemos la tabla alumnos, cuya estructura inicial es: Nombre auto Diecron on ago Naor En este ejemplo, no hay ningin atributo que no pueda repetirse en los distintos alumnos. La solucién es crear una clave y asignarla a cada alumno. La llamaremos codigo _alumno y al crearla nos aseguramos que no pueda tomar valores repetidos. La sintaxis utilizada en MySQL para crear claves primarias es la siguiente: primary key (columnat [, columna2 ...]) Por ejemplo: OREATE TABLE tabla ( ‘Canpot INT NOT NULL, ‘Canpo2 VARCHAR(30) NOT NULL, PRIMARY KEY (Canpo1) Las columnas que se definan como claves primarias no pueden adn Claves candidatas Acabamos de ver que una fila puede ser diferenciada de las demés a través de un nit mero de atributos, Esos atributos forman lo que se llama una clave candidata. Pue- de haber varias claves candidatas dentro de una tabla. La lave principal o primaria es la clave candidata que clijamos para representar cada fila de manera univoca, Luego de esto nos permitira idencificar y localizar un registro de manera rapida y organizada Beas wuewisredusers.com 45, Para identificar las claves candidatas de una tabla no hay que fijarse en un estado 0 instancia de la base de datos: que en un momento dado no haya duplicados para un atriburo o conjunto de atributos, no garantiza que los duplicados no sean posibles. No obscante, vale la recfproca: Ia presencia de duplicades en un estado de la base demuestra que cicrta combinacidn de atributos no cs una clave candidata valida. Vistas En ciertas ocasiones, no nos interesa que todos los usuarios de una base de datos puedan ver todos los datos de la base (ya sea por seguridad, orden o, simplemente, para mostrar a cada usuario sélo lo estrictamente necesario para realizar su trabajo). Para esto existen las lamadas vistas que en resumidas cuentas lo que nos permiten es recortar una tabla y restringir el acceso a alla Por ejemplo, si tomamos en cuenta la siguiente tabla: Tabla pleas de | Name ee wide [Diaccon_e Y cambign tenemos un sector en nuestra empresa que se dedica a enviar tarjetas de felicitacién a los cmpleados, seguramente no se necesitari conocer el sucldo de cada uno de ellos, ast que slo permitiremos que se vean los siguientes datos a través de una vista definida especialmente para este propésito: ‘sta Tia_Enoleados tote | Nome foe Dieeson_@ MySQL implementa las vistas desde la versién 5.0.1. De esta forma podemos crear vistas a partir de consultas de la siguiente manera: CREATE VIEW nombre vista AS SELECT colt, col2 FROM tablat; Esquemas Un esquema es una forma de visualizar una base de datos mis allé de los datos que contenga actualmente. Para representar el esquema de una base de datos relacio- nal se debe dar el nombre de sus tablas, los atributos de cada una de éstas, los 46 www redusers.com Disefio de la Base de Datos dominios sobre los que se definen estos atribucos, las claves primarias y las cla- ves forsineas (Ia definicién y ejemplos acerca de claves forineas las encontraremos més adelante, en este mismo capitulo). Indices Un indice es una estructura de datos en donde se almacena informacién extra acer- cade una columna (una columna indexada). Cuando MySQL encuentra un fndice en una columna, lo usar en vez. de recorrer todas las posiciones de la columna, MySQL se enearga de utilizar indices para encontrar fas con valores espeectlicos en alguna de sus columnas de manera mas répida, Debemos saber que existen en MySQL cuatro tipos de indices distintos: de clave primaria, tinicos, fulltext c indices normales. indices de clave primaria Estos indices se crean, justamente, al momento de definir como clave primaria ~ver una de las seeciones anteriores, Claves Primarias~ una o més columnas de una tabla. indices normales A menos que haya sido definido como unique (‘inico), un indice normal admite valores duplicados, a diferencia de lo que sucede con los indices de clave primaria Existen varias maneras en MySQL de crear indices normales, veamos algunas: index nombre_indice (columna? [, columna2 ..]) Por ejemplo: OREATE TABLE tabla ( ‘Canpot INT NOT NULL, ‘Canpo2 VARCHAR(30) KOT NULL, PRIWARY KEY (Canpot), INDEX indice! (Caspo2) create index indice on tabla(columnal [, columna2, ..]) GREATE INDEX indicet ON tabla (Campo2); was wun redusers.com ar 2. BASES DE DATOS RELACIONALES La tiltima es a través de un ALTER TABLE: ALTER TABLE tabla ADD INDEX indicet (Canpo2); indices Fulltext MySQL puede indexar cualquier tipo de dato: estos tipos de indices pueden conte net campos de tipo CHAR, VARCHAR y TEXT. Los indices de este tipo estin dis para facilitar y optimizar la buisqueda de palabr: cantidades de informacién en campos de texto. Se crean de las siguientes maneras: * a cravés de la sintaxis CREATE FULLTEXT INDEX, similar a CREATE INDEX, (CREATE FULLTEXT INDEX nombre indice ON tabla (columnat [, columna2, ..J); los clave en tablas que tienen grandes Por ejemplo: CREATE FULLTEXT INDEX indice1 ON tabla (Campo2); +O al momento de crear la tabla, como por ejemplo: CREATE TABLE tabla ( wapot INT NOT NULL, Campo2 CHAR(30) NOT NULL, PRIMARY KEY (Campot), FULLTEXT indice! (Campo2) + Oura opcisn seria hacer un ALTER TABLE sobre una cabla ya existente: ALTER TABLE tabla ADD FULLTEXT indicet (Campot); Hy enon En a actualidad, ce pone de manifiesto la unién que existe entre el Lenguaje PHP y el servidor de bases de datos MySQL, a pesar de algunas diferencias en cuanto a le forma de licenciamiento surgidas hace algin tiempo. PHP presta especial atancin a los avances de MySQL, y trabaja para incorporarlos y soportarlos en su propia versién. 48 www redusers.com Disefio de la Base de Datos én las columnas CHAR y VARCHAR es posible que definamos que no se use la exten sién completa del campo sino sélo una parte. Para crear un indice como parte de un campo, sélo se tiene que especificar el tama- fio entre paréntesis después del nombre de la columna: CREATE TABLE tabla ( Ccanpot INT NOT NULL, Gampo2 CHAR(30) NOT NULL, PRIMARY KEY (Canpo1), FULLTEXT indicet (Campo2(10)) % En este tiltimo caso se indexaran sélo los primeros 10 caracteres de Campo2. indices inicos Aqui los valores duplicados no son permitidos. Hay varias formas de crear esta cla- se de indices ~muy similares a las expuestas anteriormente- y son las siguientes: CREATE UNIQUE INDEX indice1 ON tabla (Canpo2); CREATE TABLE tabla ( Canpot INT NOT NULL, Gampo2 CHAR(30) NOT NULL, PRIUARY KEY (Canpo1), ‘UNIQUE indicet (Campo2) M ALTER TABLE tabla ADD UNIQUE indice! (Canpot); a columna Como en las anteriores exposiciones, un indice puede abarcar més de u “indices compuestos, hay que separarlas con comas (,). Existen dos maneras de elimi- nar un indice, Usar una u otra dependers del tipo de indice que queramos eliminar. ‘A continuacién veamos ¢! primer caso que nos servird para climinar indices de tipo clave primaria, y cuya sintaxis es la siguiente: ALTER TABLE tabla DROP PRIMARY KEY; Beas wuewisredusers.com 49 2. BASES DE DATOS RELACIONALES Notemos que no indicamos el nombre de ningtin campo: esto es porque sélo pue~ de haber una clave primaria por tabla y con dar el nombre de ésta es suficiente, Para climinar el resto de los indices, la sintaxis para usar ¢s la siguicnte: ALTER TABLE tabla DROP INDEX nombre_indice; t6 el indice. ste: Donde nombre indice representa el campo sobre el cual se implem En lugar de la instruccién anterior también podemos utilizar la sigu DROP INDEX nombre_indice ON tabla; “Tengamos en cuenta que en las tiltimas inserucciones nunca eliminamos el cam- po, sino la restriccién que tiene efecto sobre él: el campo seguird existiendo pe- ro ya no tendré las caracteristicas de un indice. Debemos saber que para ver los indices de una tabla podemos utilizar cualquiera de las instrucciones que detallamos a continuaci ‘SHOW KEYS FROM tabla; © bien, DESCRIBE tabla; Hay otro comando que utilizado de determinada manera se convierte en un siné- nimo de DESCRIBE. Este comando se llama EXPLAIN y su sintaxis es la sig EXPLAIN tabla; Las tres iiltima strucciones devolverin la estructura de la tabla y algunas ca- racteristicas més; entre ellas, algunas referidas a los indices implementados. Ty Prvcsas Es muy importante recordar que, aunque no tengamos al Lenguaje PHP en cu versién So cupe- rior, siempre podremos utilizar y probar las caracteristicas provistas por las itimas versiones de MySQL desde su consola de 00S y, también, desde cu terminar do Linux. Para obtener infor- ‘macién adiconal sobre el tema, podemos consultar el Capitulo 3 de este libro. 50 www redusers.com Disefio de la Base de Datos Cuando creamos un indice sobre una columna, MySQL crea internamente una es- cructura de datos aparte, mis accesible y compacta que la tabla original. Cuando MySQL encuentre que hay un indice en una columna, usard esta estructura en vez de hacer un escaneo completo de la tabla. El uso de indices no es indispensable pa- ra que nucstras instrucciones SQL funcionen ni para que nuestra base de datos tra- baje normalmente, los indices influyen mas que nada en el desempefio, en la velo- cidad de respuesta de la base de datos. En MySQL el ntimero maximo de indices por tabla varia segiin el tipo utilizado, pero todos ellos admiten un mfnimo de 16, En caso de no utilizar indices, MySQL recorrerd secuencialmente la cabla en cuestién desde el primer registro hasta el tiltimo, lo que produce eventualmente inconvenientes con respecto a la velocidad de resolucién de instrucciones SQL, y una sobrecarga de los recursos del sistema al cener éste un mayor trabajo ~tanco de entrada/salida como de uti- lizacién de CPU y memoria. Atin en tablas no ran grandes, el uso de indices me- jora la velocidad de accién de una base de datos. Y después de esto nos surge una pregunta, zpor qué no indexar todas las columnas de todas las tablas? La respuesta es que cada vez que nosotros implementamos un INSERT, UPDATE, REPLACE, o DELETE sobre una tabla, MySQL tiene que actualizar el indice correspondiente para reflejar los cambios en los datos, lo que evidentemente redunda en mas trabajo para el servidor. No hay un indicio especial y concreto que nos permita saber cuindo crear un indi- ce 0 cusndo no —de todas maneras, siempre podemos trabajar sobre la base de prue- bay error-, pero si hay algunos aspectos que debemos tener en cuenta: qué tipo de consulas ejecutamos y con qué frecuencia lo hacemos. Es importante destacar que lo del tipo de consulta tiene que ver con que indexar tuna columna en particular podrfa ser de utilidad si dicha columna aparece en la cliusula denominada WHERE en una consulta. Yo de la frecuencia es porque hay que determinar si se justifica crear un {ndice an- ce una determinada reiteracién de uso: puede ocurrir que la columna indexada apa- rezca en las consultas pero no en la cantidad de veces necesarias para superar el gas- to de mantenimiento que precisa el indice. Ey anAuisis de sistemas Digefar un sistema requiere, en rigor, Un analisis previo, que consiste en una serie de pasos, co- imo recopilar informacién acerca de [a empresa en la cual se [ova a utilizar, conocer sus tareas y-c6mo se las lleva a cabo, cuantas personas trabajan alli, cudles con las perspectivas, y demas. Todas estas actividades son propias de un Analista de Sistemas. Beas wuewisredusers.com st TIPOS DE RELACIONES ENTRE TABLAS Una base de datos est compuesta por tablas y esas tablas se relacionan de algu- nna manera para darle un sentido al sistema, y plasmar lo mas fielmente posible lo que sucede en cl mundo real o situacién que descamos implement Las relaciones pueden catalogarse segiin sus propiedades. En esta seccién veremos dos de ellas: la cardinalidad y la mod: La cardinalidad especifica el niimeto de instancias de una entidad que se pueden te la ar con un ntimero de instancias de otra entidad. Quizds esto suene confuso peto con lo siguiente observaremos que no lo es nto Hay tres tipos de cardinalidad: * Uno a Uno * Uno a Varios + Varios a Varios Cardinalidad Uno a Uno Se llama relacién de uno a uno entre dos tablas, cuando a cada elemento de la cla- ve de la tabla A se le asigna un tinico elemento de la tabla B y para cada elemento de la clave de la tabla B existe un tinico elemento en la tabla A. Bjemplo: podemos citar como ejemplo la siguiene relacién, cada pais tendré sélo un presidente y cada presidente tendré a su cargo sélo un pals. a ‘abla Figura 15. Relacién uno a uno. TI ear tasias Es importante saber que la tarea de relacionar tablas es; finalmente, rolacionar ideas. Debomos hacerlo como nos resulte mas comodo: sobre un papel, con palabras, con dibujos, con diagra~ mas, etcétera. El punto fundamental es que intentemos llegar a tener un entendimiente profundo sobre el sistema que estamos disefando, pare, posteriormente, implementarlo con é 2 www redusers.com Tivos de relaciones entre tablas Llegado el caso, existe la posibilidad de unificar las tablas A y B en una sola, pero esto dependers de los siguiente aspectos: + Las necesidades de nuestro sistema. * De que si en esa situacidn se respetarfan 0 no las reglas de normalizacién (expli- cadas mAs adelante en este mismo capfculo). «Si la tabla resultance es demasiado grande (posee una gran cantidad de cam- pos) y; por lo tanco, diffeil de manejar. Cardinalidad Uno a Varios Supongamos nuevamente que tenemos dos tablas: una llamada A y la otra B. Se dice que existe una relacién de uno a vatios entre las tablas A y B cuando una cla- ve de la tabla A posce varios elementos relacionados en la tabla B y cuando una clave de la tabla B posee un inico elemento relacionado en la tabla A. =} Figura 46. Rolaclon uno a varios. Ejemplo: cada ciudadano vora por un candidato y cada candidato tended la posibi- lidad de ser votado por mas de un ciudadano. Cardinalidad Varios a Varios Una relacion es de varios a varios entre las tablas A y B cuando una clave de Ia ta- bla A posee varios elementos relacionados en la tabla B y a su vez una clave de la tabla B posee varios elementos relacionados en la tabla A. [DT revciones con uno mismo Una tabla puede relacionarse consiga misma a través de sus campos. Esto se da comunmente cuando se necesita implementar estructuras de directorio con niveles desconocidos. Obviarmen= te, no se puede crear una tabla por nivel, y la solucién est en centralizar todos los niveles en una sola, Los buscadores que permiten este tipo de busquedas implementan esta forma de trabajar. Beas wuewisredusers.com 53 2. BASES DE DATOS RELACIONALES s nent Figura 47. Relacton varios a varios. Ejemplo: un libro determinado pudo haber sido escrivo por varios aucores y a su ver cada autor pudo haber escrito varios libros. Generalmente, no veremos este tipo de relaciones en los disefios de los sistemas de bases de datos, porque son dificiles de tratar y de mantener, Directamence se trans- forman en dos relaciones de tipo Uno a Varios, creando una tercera tabla (Ilamémos- la ©) que hace de intermediaria entre la A y la B, que permanecen incactas. Figura 48. Transformacion de relaciones varios a varios. ‘Veamos un ejemplo de esto tiltimo (seremos capaces de identificar con simbolo # el campo que se encarga de actuar como clave primaria): Teo Ube # [ Cos tore Tilo arias Tala tor | cot aoe Nombre yao Nadonaldaa Hasta aquf tenemos una relacién de varios a varios. Para transformar esta rela cin hacemos lo siguiente: comamos las claves de ambas tablas y construimos una tercera, Luego armamos las relaciones. Taba to bo | cod aoe [cos 0 54 www redusers.com Tivos de relaciones entre tablas Las relaciones quedarian como se muestra en la Figura 19. Taba Libro Figura 19. Transformacién de relaciones varios a varios La modalidad indica si es obligatorio 0 n0 que una i cién. Vimos con anterioridad que, segiin la cardinalidad, existen relaciones del tipo Uno a Varios, Uno a Uno, y Varios a Varios. Lo que la modalidad agrega a este tipo de relaciones es la posibilidad de definir si «s obligatoria 0 no la participacién de cada instancia en esa relacidn. Volviendo a los ejemplos que vimos anteriormente: cada ciudadano vora por un candidato, y ca- da candidato tendré la posibilidad de ser votado por més de un ciudadano. Ahora bien, :es obligatorio que cada ciudadano vote por un candidato? 2¥ que un candidato sea vorado por una persona al menos? Respondiendo a esta clase de preguntas, estaremos en condiciones de definir la modalidad implementada en nuestras relaciones. La forma grifica de definir la modalidad en las distintas relaciones depend del au- ‘or; no hay sdlo una manera, pero la forma clisica o la més usada es la siguiente: T | coterie OJ onsiona Figura 20. Simbologia de modelidad en las relaciones. ‘Veamos algunos ejemplos: Figura 21. Ejemplo de modalidad en las relaciones. Beas wuewisredusers.com 55 En la figura anterior, codos los registros de la tabla B deberin tener un (y solo uno) registro asociado en Ia tabla A. Por su lado, los registros de la tabla A podrin tener (0 no) uno 0 varios registros asociados en la tabla B. NORMALIZACION ‘Cuando normalizamos una base de datos lo que hacemos es aplicar una serie de reglas con el objetivo fundamental de evitar problemas fucutos relacionados con la légica de disefio implementada en ella Las llamadas reglas o formas normales pueden parecer confusas al principio y lo son: en este punto, poner en préctica los conocimientos adquitidos tiene una im- portancia fundamental, y al poco tiempo veremos que ni siquiera hard falta re- cordar de memoria estas reglas, ya que con sélo ver el diagrama de entidad-rela- cidn de la base de datos, notaremos de inmediato los errores cometidos. Aplicar las reglas de normalizacién nos aseguraré, en principio, dos cosas: + Evitar la redundancia de datos. + Evitar errores en lo que se refiere a la insercién, aceualizacién y borrado de re- gistros. Al aplicar estas reglas, debemos tener en cuenta en todo momento lo que necesita- mos de nuestro sistema; es decir, sus requerimientos. Supongamos que cenemos un sistema de alquiler de DVDs, sil sistema admite que un usuario pueda alquilar mas de uno a la ver, cendremos un diseiio y si el sistema no lo admite, tendremos otro. En sintesis, el disefio depende de las exi- xgencias que tengamos. Existen varios niveles de normalizacién: * Primera Forma Normal ‘* Segunda Forma Normal * Tercera Forma Normal + Forma Normal Boyce-Codd '* Cuarta Forma Normal + Quinta Forma Normal o Forma Normal de Proyeccién-Unién '* Forma Normal de Proyeccién-Unidn Fuerte + Forma Normal de Proyecci6n-Unién Extra Fuerte * Forma Normal de Clave de Dominio 56 www redusers.com Normalizaci6n Cada nuevo nivel, evidentemente, acerca més y mds a una base de datos a ser ver daderamente relacional, pero aqu{ sélo veremos las tres primeras formas normales, por scr suficientes para la gran mayoria de los casos y porque para comprendcr las demas harfa falta tener un conocimiento profundo. Datos redundantes Uno de los principios fundamentales en lo que respecta al disefto de bases de da- tos es ef de evitar la redundancia de datos. De hecho ~como veremos en la pré- \-, luego de aplicar las técnicas de normalizacién de nuestro sistema, esto deberia darse en forma complecamente natural xima sece ‘Veamos un ejemplo para saber de qué hablamos cuando nos referimos a la redundan- cia de datos. Supongamos que tenemos una tabla con datos de nuestros clientes: Tibia One # | cian Nnéieo Nombre y Aelia andro Fecha denainieno Fecha Nadoalded fom Numa Cuerta orienta | Aanumésico Aqui el campo que tiene claras posibilidades de repetir datos es Nacionalidad (si te- rnemos més de un clience con la misma nacionalidad, ya hay redundancia, pero no hay que esperar a que esto suceda: si existe la posibilidad ya es suficiente). Por qué no pensar lo mismo de Nombre y Apellido o de Fecha de nacimiento? Por- que tanto los nombres como los apellidos son infinitos (hay paises en los que no hay restricciones al momento de elegir un nombre) y lo mismo ocurre con las fechas. Incluso a la hora de ingresar los datos de un cliente, es mas seguro que seleccionemos su nacionalidad desde una lista, y no que la ingresemos manualmente, ya que esto po- sibilitaria errores de tipeo o distintas formas de ingreso (Argentina, Argentino, Arg., Argent,, etcéera) y, por ende, datos erréneos y dificiles de tratar en nuestra base. Si [DJ 2ruicar Los conocimientos abauiRinos Debemos tener en cuenta que si bien cada sistema tiene cus particularidades, al ganar experien- cia, notaremos que nos enfrentamos a situaciones en las cuales podremos aplicar soluciones implementadas con anterioridad. Esto no encefia que raculta fundamental prestar atencién al ro tanto al “cémo” o al “por qué”. was wun redusers.com sr 2. BASES DE DATOS RELACIONALES quisiésamos saber la cantidad de clientes por pats que tienen depésitos en ef banco, aunque construyamos correctamente la consulta SQL, posiblemente los datos recu- perados no reflejen la realidad, Guardando las nacionalidades en una tabla podria- 1mos listarlas luego. Si no lo hiciéramos, nuestra tabla quedarfa de la siguiente forma: “ible Gite 1 | sewobais [12111950 genia se uaReotaaad 2 | cullamo gatsa | 01 062000 Majo 99 23605188 8788 3 | Viotasales | 2312-1900 Bast gb M282903 4 [Santiago goras [12121890 ‘genta 3212221455666 5 [vitor somee | 041-1955 ig 5 A5A555 8665 Para solucionar el problema anterior y otros derivados que surgen a partir de la re- dundancia de datos, modificamos la estructura de la tabla de la siguiente manera: Tibia Gere 1 [seyjosnista [121-1956 1 Eecrcers 2 | cullrmo ate | 01082000 2 99-23666788 8798 3 |Vietasales | 2312-1900 3 aps 2308 4 | Samignderas [1212-1890 1 121220145 5666 5 | Visor Gone | OF111955 1 35-4565 6685. “aba Pis 1 agente 2| Méica 3] Basi La idea madre de todo esto es que los indices numéricos ecupan menos espacio que las cadenas de caracteres: asf, en nuestro ejemplo, escribimos la palabra “Argentina” sélo una ver, y el niimero 1 (cédigo correspondiente a Argentina) varias veces en reemplazo de “Argentina”. Por eso, casi nunca se habla de redundancia de datos cuando los campos en cuestién son numéricos DD pereriencias Debemas aber que las cumplir porque ‘udios teérico-practicos muy camplejos. Se recomienda desde aqui tratar de incorporarlas pidamente y tenerlas presentes en cada proyecto. cnicas de normalizacién no son raglas caprichosas quo se deben La mayoria de ellas tiene una gran utilidad practica yes el resultado de es- 58 www redusers.com Normalizaci6n Primera Forma Normal Una tabla se encuentra en la primera forma normal si cada una de las columnas ad~ mite un tinico valor para cada registro. Veamos un ejemplo: ig usano | Nene tio Numero go Reabo [Poauct 1 an epee 3333 B45 2 Roto Gas 34 12,12, 5,38 3 Vicor Zapata 3385 Fr} En la tabla anterior existe una serie de problemas. A cravés de instrucciones SQL no podriamos contestar, por ejemplo, cusntos productos compré Juan Lépez o cusll es el producto més vendido de la empresa. Estos inconvenientes se dan posiblemente porque no se respeta la primera forma normal: la columna Producto contiene mis de un valor por registro. Es importate mencionar que aplicando la primera forma normal, nuestra tabla ori ginal se divide en dos y queda de la siguiente manera: (Cote Ussato [Nombre paid Numer do bo 4 un Lope 2333 2 lo Gaspar sa 3 eter Taste 235 Numero oe Reioo | Producto Canta 3833 8 1 3833 34 1 3833 fa 1 2334 2 2 3334 38 1 834 4 1 3335 10 1 Ahora sf estamos en condiciones de contestar ficilmente cualquier pregunta, cluso nuestra visién de la base de datos a través de las tablas se ha simplificado con- siderablemente, haciéndola més entendible y légica. Segunda Forma Normal En esta forma normal, lo que se trata de lograr es que cada uno de los campos de una tabla dependa dircctamente de la clave primaria. Veamos. Beas wuewisredusers.com 59 2. BASES DE DATOS RELACIONALES Pensemos en el siguiente ejemplo que consiste en guartar datos de empleados (nombre, empresa en la que trabaja, direccién de la empresa): Cod_emplsdo | Nonbre_emplato | Nombre enorese | Dieccon_erpese 1 open, SenauoerSA | Paso 122 2 Di Resi Beneider SA. | Pasco 122 3 Cw, oi Banco Mar ‘at 200 El campo Nombre empleado depende directamente de la dave Cod_empleado. En cambio, Direccion_empresa no depende de Cod_empleado, sino de la empresa. Ver este tipo de situaciones depende de la experiencia que vayamos logrando En definitiva la situacidn final podrfa ser la siguiente: Coi_enpeaio | Nonbre_enpleado 1 open i 2 Daz. Rtn a Cua lio Cod_erpesa | Wonbeo_onpresa | Diassion empresa 1 Benavaer SA | Pasco 122 2 arco wae ert 200 Cof_enpeado | Cat_enpres 1 1 2 1 a 2 O también: Gid_enpleady | Nonbe_empleado | Cod_enpresa a apex Al i 2 iar, Rastign 1 a rz, Jo z Cod_enoresa | Nomtre_enpress | Dessin_enpresa 1 Buraidersa | Paseo 122 2 arco Mar ‘Met 200 En el primer caso podriamos suponer que un empleado puede trabajar en mis de tuna empresa, 6 www-redusers.com Bees MySAL y el soporte para el modelo relacional actual Tercera Forma Normal Una tabla estd en tercera forma normal si sus campos dependen tinicamence de la clave, es decir, no dependen unos de otros. Si repasamos el ejemplo anterior vere- ‘mos que esto no sucede. Veamos otro ejemplo: lote Nombre Asli DD Daron i an Lovee TwoSaiwe [122 2 Rota Gea Tau iver m1 3 lor Tate Baviader 132 Si prestamos atencién, veremos que el campo Duracion depende més del campo DVD. que de Cliente. Aplicando la tercera forma normal obtendriamos el siguiente escenario: Clete Nome oad id 1 an Lovee z 2 Rao Gaspar 5 3 eto Tapsta 3 (o_0¥0 Dw ‘ivacon 2 Too Sele 1m 5 Te Diver 1 a acer m2. MYSQL Y EL SOPORTE PARA EL MODELO RELACIONAL ACTUAL MySQL es un gestor de bases de datos bastante nuevo, quizis por eso se hayan im- plementado recién en las tltimas versiones conceptos fundamentales del Modelo Relacional. A continuacién, un repaso éstos con ejemplos en MySQL. BEd RESPETAR LAS REGLAS Lae técnicas de normalizacién con féciles de recordar luego de haberlas aplicado un par de veces. Pera si atin dudamos de si su aplicacién es o no necesaria, podemos probar a disefier un sistema « implementarto sin tomar en cuenta estas técnicas: vremos que cada madificacién o nueva im- plementacién que queramos realizar se volvers dificil-o imposible de poner en préctica, was wun redusers.com 6 2. BASES DE DATOS RELACIONALES Integridad referencial La integridad referencial implica que cuando un registro haga referencia a otro, ese ‘otro debe necesariamente existir. Supongamos el siguiente caso: Tai abe Cod_avae Nombve_evor | Cid_nadceatind est Sabato Jorge is ores aro Vas Ue Jone Amado stv Paz Cas ones Tabla Nira God_oaconaad | Deve nationals pina Bas Mio Safa Pad Chile Sihiciéramos una consulta del tipo: SELECT * FRON autor, nacionalidad WHERE autor.cod_nacionalidad = nacionalidad. cod_nacionalidad; Necesicarfamos fundamentalmente dos cosas: + Que autorseéd_nacionalidad no admitiera valores nulos. + Que cada valor de la columna autor.cod_nactonalidad estuviera correspondido en nadionalidad. cod_nacionalidad. Lo primero lo logramos al momento de crear la tabla, con el atributo NOT NULL so- bre autor.cod_nacionalidad: y lo segundo, imponiendo integridad referencia. 2Cémo se hacia ances de la implementacién de la integridad referencial en las tablas tipo ENWOdb, vistas més adelante? Se le dejaba el control absoluto a la aplicacién y ninguno a la base de datos. Era el programador el que debia manejar las decisiones ante las posibles situaciones en las que esto sucediera. Hablamos en pasado, pero sto sigue siendo asi hoy cn dia en muchas apli e www redusers.com MySAL y el soporte para el modelo relacional actual Claves foraneas Una clave fordnea es un campo comain y corriente que tiene la particularidad de co- rresponderse con la clave primaria de otra tabla, Estas claves estén muy estrechamente ligadas al concepto de incegridad referen- cial, debido a que si una clave fordnea contienc un valor, ese valor se refiere a un registro existente en la tabla relacionada. MySQL soporta claves fordneas tinicamente en las tablas tipo INNOdb. S camos crear estas claves en otro tipo de tablas, no recibiremos ertores ni adverten- cias, pero tampoco obtendremos ningsin efecto: en otras palabras, las tablas se com- porcarin como cen hubigramos creado las claves fordneas, Cuando se crean tablas con claves forineas, MySQL no crea de manera automética indices en las claves foréneas ni en las claves referenciadas. Si queremos crear estos indices debemos hacerlo explicitamente. Por ejemplo, si quisiéramos crear indices en la clave primaria y en la clave forinea, deberfamos hacer lo siguiente: CREATE TABLE tabla? ( Canpo2 INT NOT NULL, Canpoa INT NOT NULL, PRIWARY KEY (Campo2) ) ENGINE = TNNODB; CREATE TABLE tablat ( ‘Canpot INT NOT NULL, Campo? INT NOT NULL, ‘Campos. VARCHAR(30), PRIMARY KEY(Campot), INDEX (Campot) INDEX (Campo2) , FOREIGN KEY (Canpo2) REFERENCES tabla2(Canpo2) ) ENGINE = TANOB; EG sovuciones En ocasiones, al disofiar un sistema, veremos qua hay distintas maneras de resolver un problo- ima, y decidirse por una u otra dependeré de diversos factores. Esto nos permite notar que no existe un Unico camino o una sola respuesta para un problema: s6lo la acumulacién de experien- cia haré que vearnos cual es la solucién mas conveniente en cada caso. wun redusers.com 6 2. BASES DE DATOS RELACIONALES Volviendo al ejemplo de Autores y Nacionalidades, una forma de resolver el pro- blema planteado seria la siguiente: CREATE TABLE nacionalidad ( cod_nacionalidad INT, desc_nacionalidad VARCHAR(50) , PRIMARY KEY (cod_nacionalidad) ) ENGINE = INNODB; CREATE TABLE autor ( cod_autor INT, nonbre_autor VARCHAR( 50), cod_nacionalidad INT NOT NULL DEFAULT PRIMARY KEY (cod autor), INDEX (cod_autor), INDEX (cod_nacionalidad) FOREIGN KEY (cod_nacionalidad) REFERENCES nacionalidad(cod_nacionalidad) ) ENGINE = TWNODBS Debemos saber que también es posible modificar una tabla existente agregindo- Ie una clave fordnea, de la siguiente manera: CREATE TABLE autor ( cod_autor INT, nonbre_autor VARCHAR(50), cod_nacionalidad INT NOT NULL, PRIMARY KEY (cod_autor) ) ENGINE = INNODB; ALTER TABLE autor ADD FOREIGN KEY (cod_nacionalidad) REFERENCES nacionalidad (cod_nacionalicaa); Fag Pup. sus Mevoras Es muy interesante saber que al Lenguaje PHP se encarga de incorporar muchas mejoras en su vversién 5 ademas de las relacionadas con MySQL. Podemos obtener un listado de ellas en el Capitulo 1 de este libro. Ademis, alli podremos observar ol desarrollo a través do los aos de las diversas versiones del leguaje PHP que se han puesto a disposicién de los usuarios, wo www redusers.com MySAL y el soporte para el modelo relacional actual No es recomendable aplicar sentencias ALTER TABLE o CREATE INDEX sobre tablas que estin siendo referenciadas, por posibles problemas intemnos de MySQL. Lo que conviene hacer aqui es elimi Qué ocurte cuando se borra algtin registro que tiene, a su vez, registros asociados (en el caso de nuestro ejemplo la pregunta serfa qué pasa si climinamos algiin regis- «to de la tabla Nacionalidad y esa nacionalidad aparece en la tabla Autor)? Lo que pasa podemos manejarlo nosotros a través de las siguientes opciones: ar la tabla en cuestién y volverla a crear actualizada, + ON DELETE RESTRICT: es la accidn por defecto, y directamente no permite la eliminacién, Muestra un mensaje de error. + ON DELETE NO ACTION: hace exactamente lo mismo que la opcién anterior. * ON DELETE SET DEFAULT: todavia no csté implementada, pero lo que de- beria hacerse es reemplazar las claves eliminadas por el valor que se dio por defec- to (DEFAULT) al momento de crear la tabla. En el ejemplo de autores y nacionali- dades reemplazarfa el valor eliminado por 0. + ON DELETE CASCADE: climina cambién las filas de la cabla hija. En nues- tro ejemplo, si climinamos al registro Méjico de nacionalidad, también borra- ramos a todos los escritores mejicanos. + ON DELETE SET NULL: se encarga de poner a NULL los campos de la tabla hija que perdieron a su padre. En nuestro ejemplo, si eliminamos el registro Méjico de nacionalidad, pondriamos e! campo denominado céd_nacionalidad igual a NULL para todos los escritores mejicanos. Para implementar alguna de estas opciones hacemos lo siguiente: ALTER TABLE tablaPadre ADD FOREIGN KEY(nonbre_canpo) REFERENCES tablaHija(nonbre_canpo) ON DELETE CASCADE; EG susconsuttas El uso de cubconcultas cuando trabajamos desde un lenguaje de pragramacién no es realmen- le imprescindible, si bien es cierto que puede alivianarnos las tareas en ciertas ocasiones. La forma clasica de suplir las cubconcultas es realizar una consulta, guardar los datos en variables temporates y utilizarlos como argumentos para otras consults. Beas wuewisredusers.com 65 Al trabajar con referencias entre tabla, debe crearse primero la tabla referenciada y luego la que hace referencia a ella (esto vale también para cuando cargamos la base desde un archivo .SQL). En nuestro ejemplo, como la tabla Autor hace referencia a la tabla Nacionatidad, debe crearse la cabla Nacionalidad antes que la tabla Autor. Si no queremos tener complicaciones con el orden de creacién, podemos crear todas las tablas sin especificar cules claves son foréneas (como en el CREATE TABLE del tiltimo ejemplo) y al final ejecutar los ALTER TABLE necesarios para especifi- car las claves fordneas correspond ‘Cuando queramos borrar una tabla, debemos asegurarnos de que no esté referen- ciada por ninguna otra (esto vale también para cuando cargamos la base desde un archivo SQL). En nuestro ejemplo, como la tabla Autor hace referencia a la tabla Nacionalidad, debemos eliminar la primera antes que la segunda. ‘Cuando se crea una clave foranea, MySQL le asigna internamente un identificador. Para eliminar una restriccién (S6lo la restriccién, no el campo) de clave fordnea ne- cesitamos conocer esa clave. Para conocer esa clave podemos ejecutar la instruccién: es, SHOW CREATE TABLE nombre tabla; Que nos devolverd algo como lo que sigue: CREATE TABLE ‘autor’ ( “cod_autor’ int(11) NOT NULL default ‘0°, “nonbre autor’ varchar (50) default NULL, “cod_nacionalided’ int(11) NOT NULL default ‘0, PRINARY KEY ("cod_autor’), KEY “eod_autor” (“cod_autor’), KEY “cod_nacionalidad’ (‘cod_nacionalidad’), ‘CONSTRAINT “autor_ibfk_1° FOREIGN KEY (°cod_nacionalidad’) REFERENCES ‘nacionalidad’ (*cod_nacionalidad’) ) ENGINE=InnoDB DEFAULT CHARSET=Latint La clave que necesitamos est4 entre comillas ¢ inmediatamente después de la pa- labra CONSTRAINT, Una vez que tomamos conocimiento de esto, debemos eje- cutar la instruccién para eliminar la restriccién: ALTER TABLE autor DROP FOREIGN KEY autor_ibfk 1; La dave varia segiin el caso, 6 www redusers.com MySAL y el soporte para el modelo relacional actual En cuanto a actualizar registros con claves fordi eas, tenemos cuatro opciones que estin disponibles a partir de la versién 4.0.8 y tienen la misma funcionali- dad que las ya mencionadas cn ON DELETE. + ON UPDATE CASCADE * ON UPDATE NO ACTION + ON UPDATE SET NULL + ON UPDATE RESTRICT Si vamos a usar al mismo tiempo las opciones denominadas ON DELETE y ON UPDATE, ser4 necesario que prestemos atencién al orden que utilizamos para escribirlas: en primer lugar ingresamos ON DELETE y posteriormente ON UPDATE. Subconsultas Las subconsultas se implementaron en MySQL a partir de la versi6n 4.1. ‘SELECT * FROM TABLAT WHERE TABLA (SELECT 8 FRON TABLA2 WHERE C > 3); J/compara todos los valores de A con los valores que J/devuelve 1a segunda consulta. BW resumen Disefiar una base de datos es una tarea que, necesariamente, combina experiencia y conoci= rmientos teéricos. En este capitulo hemos visto los conceptos necesarios para introducirnos en este apasionante tema y poder sacar provecho de Las opciones que nos ofrece MySQL. was wun redusers.com or [™@ ACTIVIDADES Desarrollo PHP + MySQL MySQL Ya viros los ¢ ‘os de bases de datos e hicimos hincapié en el modelo relacional. Para poner en practica los conceptos tedricos vistos, elegimos una base de datos muy popular en este momenta y con mucho futuro por delante: MySQL. Analizaremos en este capitulo cuales son las razones de esta sentencia y por qué MySQL se ha canvertido en el complemento ideal de PHP. SERVICIO DE aTENCiOW aL LEcTOR: [email protected] Por qué MysOL? ‘Oblencsin de SOL cena de uso Diferencias ere versines Tpos de datos Cadena de caacees Numericas Fechay hor Tos detblas ‘SAM ist MERGE HEAP ‘noo Berke En qu casos usat cada una? Referencta de funciones Funcines pare trabajar con cadenas de carateres Funcioes para abajar cn campts numéro Funcioes para abajar con fecha y hora Funcines Ge conversion Funcioes agregadas estadticas (Operadoes de eomgaracin (perades pcos Introduccion los praoesos almacenades El uso del monitor de MySOL Resumen Actividades 0 a a B B B 1B Sasaseees 104 13 14 ia 1s 47 1m 12 128 ‘.wyso éPOR QUE MYSQL? MySQL es un sistema gestor de bases de datos muy utilizado en la actualidad por, entre otros, los siguientes motivos: * Rapider * Posi lad de trabajar en diferentes plataformas + Muiltiples formatos de tablas para cada necesidad * Seguridad, * Gran estab + Adminiscracién simple + Soporte técnico (con e! licenciamiento comercial). d. ysat* " Get Trained. Get Ahead. ete ompstiine ge wth MYSQL Tig Figura 1. Sitio web de MySQL. Fed ANTES DE La CREACION ‘Aunque es posible modificar el tipo de dato de una columna do una tabla, no as recomendable cambiar le base de datos durante un desarrollo, 3 menos que sea absolutamente necesario, Por teste motivo, es de suma importancia estudiar os valores méximos y minimos que vaya a tomar cada campo antes de crear las estructuras correspondientes, cy www.redusers.com Bee 4Por qué MySQL? Si bien todavia le queda mucho camino por recorres, en corto tiempo ha logrado darse a conocer en el Ambito informatico y fue afianzndose progresivamente en el mundo de las bases de datos relacionales. n entre esta base MySQL se utili- Desde hace algtin tiempo, se ha ido dando una particular unis de datos y el lenguaje de programacién PHP; por este motiv 2a mayormente en proyectos relacionados con sitios web. Obtencién de MySQL MySQL. puede obrenerse de forma completamente libre a través de cualquier tipo de distribucidn: revistas, Internet, copias en CD provistas por amigos, eteétera. Pero sin dudas, una de las formas més utilizadas es acceder al sitio en Internet de MySQL (wwwamysql.com), y desde alli descargar la versién mds adecuada con res- pecto al sistema sobre el cual desarrollaremos nuestras aplicaciones. Esta es una bue- 1a forma de tener acceso a la ltima versién del programa. MySQL esté disponible, entre otros, para los siguientes sistemas operativos: * Linux + Windows (9x, Me, NT, 2000, XP, Vista, 7) * Solaris * BSD (FreeBSD, NetBSD, OpenBSD, BSD/OS) * Mac OS + Novell NetWare (6.0 0 superior) + Os/2 + BeOS + RISC OS + SGT IRIX 6.5.x + as/400 El hecho de que MySQL este disponible para tantos sistemas operatives ha sido uno de los puntos decisives para lograr la popularidad actual. Licencia de uso MySQL pone a disposicién de los usuarios dos tipos de licenciamiento: * Una licencia comercial. * Una licencia GPL (General Public License). Bay wwwredusers.com n ‘.wyso ‘Suposicin iil Desarrllar una aplicacbn (que tlce MySOL wan st ota ‘he paraol dsaro {PH per jap)? No Se debe obtener tuna licencia comercial Puede distri su apicaion ‘alo a Hcencia GPL. {Se pretende uslzar una Heencia GPL? 4S pretend utizar una licencia comercial? Se tiene que vender también la versiin moditcada de MySQL ‘como GPL (0 66, inouyondo ‘el cédigo fuente modificedo yateniéndonos a ls purtos ‘que monciona la GPL} No ae necesita liber al <6digo fuerte modiicato, Hy que contactarse cxn [a empresa MySQL AB para ‘obtener una icentia comercial (pagéndota, por supuest} Figura 2. En qué casos usar una licencia u otra? Sélo se puede responder a esta pregunta tentendo claro nuestro objetivo, n comercial brinda, entre otras cosas, soporte técnica y garantia, vwmwredusers.com Tipos de datos Diferencias entre versiones Una de las constantes mejoras que MySQL. va ofteciendo a lo largo del lanzamien- to de sus nuevas versiones ¢s el soporte para cl estindar del Lenguaje de consulta SQL (Structured Query Language) ; por ende, el esquema relacional. La versién que le dio més satisfacciones al equipo de MySQL fue la 3.23, ya que con ella alcan76 estabilidad y un desempefio que hizo que se la tuviera en cuenta entie las principales opciones al elegir un gestor de base de datos relacionales (entre otras iejoras, la inclusién de tes tipos de tablas: MyISAM, InnoDB y BerkeleyDB) Desde la versidn 4.0 se incluyen las tablas InnoDB en la distribucién estindar, lo que implica la posibilidad de relacionar tablas y proveerles de mayor seguridad y rapide. Desde la versidn 4.1, MySQL soporta subconsultas y consultas preparadas. Para la versidn 5, entre otras mejoras se destacan la inclusién de soporte para programar procedimientos almacenados. Para saber qué versién de MySQL tenemos instalada en nuestro sistema, podemos realizar la consulta que vemos a continuacién: SELECT VERSION(); ara obtener més informacién acerca de cémo realizar consultas a MySQL, ver en este mismo capitulo la seccién El uso del monitor de MySQL. TIPOS DE DATOS Se utilizan para definir los tipos de datos de las columnas de una tabla al crearla. MySQL soporta una gran variedad de datos, uno para cada necesidad. Cadenas de caracteres Los subtipos de datos existentes aqui son CHAR, VARCHAR, BLOB, TEXT, ENUM y SET. [DT acerca de sortware LiBRE Es muy importante tener en cuenta que pedemos obtener més informacién sobre la licencia GPL y conceptos generales acerca del software libre si visitamos los sitios web que se {encuentran en las direcciones waw.gnu.org/licenses/gpl-fag.html y http://es.gnu.org/ticen- cias, En ellos podremos consultar datos interesantes e informa eae wun redusers.com B ‘.wyso CHAR y VARCHAR Son muy similares, y quiaés la diferencia mas notable sea la forma de almacena- micnto: cuando definimos una columna tipo CHAR de tamafio N, c ingresamos un valor (de menos de W caracteres) en esa columna, MySQL rellenars con espacios lo que sobra, mientras que si hacemos lo mismo con una columna de tipo VARCHAR, cen este caso no se rellenara con espacios. Cuando obtenemas informacién a través de una consulta SQL, no obtenemos los espacios sobrantes: MySQL los remueve. Sise ingresa una cadena de mayor canvidad de caracteres que el tamaiio prefijado al definir la columna, la cadena se truncaré al legar al limite Por defecto, las comparaciones (en cualquiera de los dos tipos de datos) son insen- sibles a maytisculas y mimisculas, Para més informacién, ver funcién BINARY. BLOB y TEXT Se usan para cadenas con un rango que dependerd del tamaiio que queramos almacenar. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido distinguir maytisculas y mindisculas, y BLOB las distingue. Otra diferencia podria ser su uso. TEXT tiende a ser usado para cadenas de texto plano (sin formato), mientras que BLOB se usa para objetos binarios, o sea, cualquier tipo de datos o informacién, desde un archivo de texto con todo su formato, hasta imagenes, archivos de sonido o video. BLOB (cs un actdnimo de Binary Large OBject, objeto binario de gran tamafio) se sub- divide en cuatro tipos que difieren sélo en la capacidad maxima de almacenamiento. Con TEXT sucede lo mismo, ¢ incluso, hay correspondencia entre la capacidad ma- xima de almacenamiento de unos y otros. mr TraL08 sweet 255 8 Tat 65595 MeDUNELOB veouNTER sg777.215 Lose LoNerext 4.204967 295 Tabla 2. Equivaloncias de tamaros entre variables de tipo BLOB y TEXT. ‘Ninguna columna de estos tipos puede tener valor por defecto. Eid SELECCION DE TIPos DE DaTos ‘Al mamento de definir una tabla, debemos prestar particular atencién al tipo de dato que estinamos a cada campo y su longitud: esto nos ayudaré a preservar recursos ya mantener una coherancia dentro del diseno de las estructuras de datos del sistema. Pedemos encontrar mas informacién acerca del disefo de bases de datos relacionales en el Capitulo 2, ™ www.redusers.com Bee Tipos de datos ENUM Este tipo de string puede seleccionar su valor tinicamente de una lista finita (méxi- mo de 65.535 clementos) de opciones definidas por el usuario, y otras dos por de- fecto (indice 0 que significa error por ingresos fuera de rango, por ejemplo y es- td representado por ™, ¢ indice NULL con valor NULL). Por cjcmplo: Definiendo columnas de tipo ENUM("“argentina”, ‘paraguay"): CREATE TABLE user ( nombre enum(' juan’, 'pedro') NOT NULL, pais enun(‘argentina', ‘paraguay’, ui ico") SET Similar a ENUM en su funcionamienco, slo que aqui se puede seleccionar n nguno o mis de un valor de la lista (hasta 64, los muestran separados por comas). Al ser ENUM semejante a una lista, podemos realizar consultas tales como: SELECT * FROM non tabla WHERE set_col LIKE ‘walue%'; ‘SELECT * FROM non_tabla WHERE FIND_IN_SET( ‘value’, set_col)>0; Ver funcion FIND_IN_SET() SELECT * FROM non_tabla WHERE s Donde val1 y val2 son opciones rcol = ‘valt, val2'; Ja lista, SELECT * FROM non_tabla WHERE set_col & 1; Busca solo los que contengan el primer elenento de la lista. TTT Nomeros y caDENAS DE CARACTERES Es una buena costumbre definir come numéricos sélo aquellos campos sobre los cuales ce rea- lizarén operaciones matematicas, como la edad de una persona o el niimera de productos de una ‘empresa. Paro en ol caso de, por ejemplo, niimoros de documento, esto no seria oventualmen- te necesario Irecordemos que estas decisiones dependeran del sistema en cuestiénl. eae wun redusers.com cy ‘.wyso Numéricos Se definen los subtipos DECIMAL (o NUMERIC, DEC), INTEGER (o INT), TINYINT, BIT, BOL, MEDIUMINT, BIGINT, SMALLINT, FLOAT y DOUBLE (o DOUBLE PRECISION, o REAL). ‘Todos los tipos numéricos pueden definirse con dos parmettos opcionales: UNSIGNED (impide que los campos numéricos acepten signo negativo, es decir, sélo se aceptarin el cero y los valores positivos) y ZEROFILL (completa con ceros a la izquierda hasta la longitud maxima). La forma de uso es: TEPO_DATO [UNSIGNED] [ZEROFILL] Por ejemplo: INT(4) UNSIGNED ZEROFILL Si tenemos almacenado el ntimero 12, al hacer un SELECT se mostraré 0012. Si te- nemos almacenado el niimero -12, al hacer un SELECT se mostrar 0000. ‘Veamos las caracteristicas de cada tipo de dato: ‘TINYINT[(M)] Wes dl nuimero de digitos que serin visibles al mostrar el contenido del campo. Si el campo que se va.a mostrar sobrepasa los M digitos, se mostrarin M digicos. * Si se omite 0 se sobrepasa la capacidad de TINYINT, se toma la cantidad méxi- ma soportada por este tipo de daco. i se define con signo va desde -128 a 127. signo (UNSIGNED) va desde 0 hasta 255 BIT Es un TINYINT de un digico (TINYINT(1)) BOOL Es un TINYINT de un digico (TINYINT(1)). SMALLINT((M)] Wes el ntimero de digitos que serin visibles al mostrar el contenido del campo. Si cel campo que se va a mostrar sobrepasa los M digitos, se mostrarin M digitos. += Si se omite 0 se sobrepasa la capacidad de SMALLINT, se coma la cantidad mé- xima soportada por este tipo de dato. + Sisse define con signo va desde -32768 a 32767. * Sin signo (UNSIGNED) va desde 0 hasta 65535, 76 www.redusers.com Bee Tipos de datos MEDIUMINT[(M)] Mes el niimero de digitos que sern visibles al mostrar el contenido del campo. Si cl campo que sc va a mostrar sobrepasa los M digitos, sc mostrarin M digitos. * Si se omite 0 se sobrepasa la capacidad de MEDIUMINT, se coma la cantidad m4- xima soportada por estc tipo de dato. + Si se define con signo va desde -8388608 a 8388607, Sin signo (UNSIGNED) va desde 0 hasta 16777215. INTICM)] Mes el ntimero de digitos que serin visibles al mostrar el contenido del campo. Si el campo que se va a mostrar sobrepasa los M digitos, se mostrarén M digitos. + Si se omite 0 se sobrepasa la capacidad correspondiente a INT, se toma la ean- tidad maxima soportada por este tipo de dato, + Si se define con signo va desde -2147483648 a 2147483647 + Sin signo (UNSIGNED) va desde 0 hasta 4294967295. INTEGER[(M)] Sinénimo de INT. BIGINT[(M)} Mes el niimero de digitos que sersn visibles al mostrar el contenido del campo. Si cl campo que sc va a mostrar sobrepasa los M digitos, sc mostrarin M digitos. * Si se omice o se sobrepasa la capacidad correspondiente a BIGINT, se toma la cantidad maxima soportada por este tipo de dato. + Si se define con signo va desde -9223372036854775808 a 9223372036854775807. + Sin signo (UNSIGNED) va desde 0 hasta 18446744073709551615. ‘Todas las funciones matemsticas trabajan internamente con valores BIGINT. FLOAT((M,D)} Sirven para definir niimeros con coma, con menos precisién que DOUBLE. Mees el niimero de digitos que seran visibles al mostrar el contenido del campo. Si el campo que se va a mostrar sobrepasa los M digitos, se mostrarén M digitos. Ea comparisiioap Una de ta caracteristicas que hacen de MySQL uno de los sistemas gestores de bases de datos mas utilizados en ls actualidad es su total compatibitidad y funcionamiento en las plataformas Linux y Windows, aunque hay que toner en cuenta que no se racomienda su uso on esta citima para sitios que se encuentran en etapa de produccién, Bay wwwredusers.com i” ‘.wyso El rango de posibles valores va de -3.402823466E+38 a -1.175494351E-38 , 0, y des- de 1.175496351E-38 hasta 3.402823466E+38. DOUBLE[(M,D)] Sirven para definir ntimeros con coma, con mds precision que FLOAT. M es el nuimero de digitos que serin visibles al mostrar el contenido del campo. Si el campo que se va a mostrar sobrepasa los M digitos, se mostrarin M dlgitos El rango de posibles valores va de -1.7976931348623157E+308 « -2.2250738585072014E-308, 0, y de 2.2250738585072014E-308 a 1.7976931348623157E+308. DOUBLE PRECISION[(M,D)] Sinénimo de DOUBLE. REAL((M,D)] Sinénimo de DOUBLE. DECIMAL[(M[,D})] Debemos saber que aqut el nimero es almacenado internamente como una cade- na de caracteres (un cardeter por cada digito). Ni el separador decimal () ni el signo menos (-) para niimeros negativos son parte de M. Sino sc Ie da ningtin argumento, por defecto M cs igual a 10, omando un ran- go de 9999999999 a 99999999999 para ntimeros con signo, Y por defecto, D es igual a 0 DEC[(M[,D})] Sinénimo de DECIMAL. NUMERIC[(M[,D])] Sindnimo de DECIMAL. Fecha y hora Los subtipos de datos existences son DATETIME, DATE, TIMESTAMP, TIME y YEAR. DATETIME DATETIME: Se utiliza cuando se necesita trabajar con fechas y horarios a la vez. El formato por defecto es ' YYYY-MM-DD HH:MM:SS' pero se le puede dar uno diferente si por algin motivo necesitéramos hacerlo, por ejemplo: "YYYY/MM/DD HH'MM%SS". El rango va desd "1000-01-01 00: 00" hasta "9999-12-31 23: 359 8 www.redusers.com Bee ipos de datos Si al momento de ingresar un DATETINE definimos un valor invélido (por ejemplo, minuto superior a 60) se almacenari la fecha nula. Por ejemplo: para el formato "YYYY-MM-DD HH:MM:SS" scria 0000-00-00 00:00:00" DATE. DATE se utiliza cuando se necesita trabajar slo con fechas. El formato por defecto es YOY-MM-DD' pero se le puede dar un formato diferente si por algiin motivo nece~ sivéramos hacerlo, por ejemplo: YNY"MM*DD'. Rango '1000-01-01" a '9999-12-31" Si al momento de ingresar un DATE definimos un valor invilido (por ejemplo, mes superior a 12) se almacenars la fecha nula, Por ejemplo: para el formato YHY-MM- 1D’ seria ‘0000-00-00. ‘TIMESTAMP Combinacién de fecha y hora. El rango va desde el 01-enero-1970 al afio 2037. El forma- to de almacenamiento depende del tamaiio del campo y se viualiza como un rximero, TESTU ‘von ass TMESTUPL2) uooninss TESTU, Moore TESTE) mao “TWUESTUFE) wuuoo TESTU) vu [TMESTUPZ) w Tabla 2. Formatos de la funcién TIMESTAMP. Si al momento de crear la tabla se define un TIMESTAMP mayor a 14, se redondea a 14; si se define un miimero impar, se redondea al pa Si al momento de ingresar un TIMESTAMP definimos un valor invilido (por ejemplo, minuto superior a 60) se almacenar la fecha nula. Por ejemplo: ;nmediatamente superior. Para TIMESTAMP(2) seria 00. Para TIMESTAMP(12) serfa 000000000000. Otro punto importante es que al ingresar una fecha © un horario se toman los da- {0s no ingresados como ceros: esto supone un problema para las fechas, ya que si ehemos un TIMESTAMP(2) no podemos ingresar s6lo el afio porque eso supondrla algo como 990000 (dia y mes no pueden ser cero, estarian fuera de rango). En cam= bio, la hora, los minutos y los segundos si pueden ser cero. Es decir que no pode- ‘mos insertar cadenas de menos de 6 caracteres.. En PHP hay una gran cantidad de funciones que precisan trabajar con TIMESTAMP. Bay wwwredusers.com 9 ‘.wyso ‘TIME Debemos saber que ‘TIME se utiliza cuando se necesita trabajar sélo con hora rigs. El formato por defecto es 'HE:MM:SS' (aunque también soporta 'HHE:MM: para periodos largos de tiempo), pero se le puede dar un formato diferente si por algin motivo necesitéramos hacerlo, por cjcmplo: 'HH*MM*SS. BI rango va de -838:59:59" a ‘838:59:59' (es importante que el hecho de poder al- macenar TIME negativos nos da la pauta de que existen mas usos que el de sim- plemente guardar el horario de un determinado suceso) * Si al momento de ingresar un TIME definimos un valor invilido (por ejemplo, « nuto superior a 60) se almacenaré la Fecha nula. Por ejemplo: para el formaco "HH:MM:DD' seria ‘00:00:00" + Si ingresamos valores fuera de rango, éstos se terminan reemplazando por el YEAR Se usa para representar afios. Su formato es por defecto HF (puede definisse co- mo 'Y¥). El rango va desde 1901 hasta 2155. * Sise representa el aio con sélo dos digitos, surge la siguiente particularidad: si se de- fine el campo tipo YEAR como un niimero, no podemos representar el afio 2000 con 00 (seria interpretado como el aio 0000); debemos hacetlo con la cadena 00 0 con 0. + Si ingresamos un valor ilegal, éte sera convertido a 0000. TIPOS DE TABLAS Cuando se trabaja con MySQL, existe la opcién de variar el tipo de tabla después de creada (salvo con las tablas del sistema llamadas MySQL y test , que por de- fecto son MyISAM y no se recomienda modificarlas) Para indicar el tipo de tabla al erearla usamos la siguiente sintaxi CREATE TABLE tablat ( ‘campot INT(4) UNSIGNED, campo2 VARCHAR(25) NOT NULL ) ENGINE-WvTSAM; Si se omite la opcién ENGINE=... por defecto se crea una tabla MyISAM. Importante: segtin MySQL, la opcién TYPE (similar a ENGINE) es soportada hasta la versién 4.x de MySQL (dejard de usarse a partir de la 5). La opcién 80 www.redusers.com Bee Tipos de tablas ENGINE fuc afiadida en la versién 4.0.18 del lenguaje (para las series 4.x) y en la versién 4.1.2 (correspondiente a las versiones 4.1). Si se incenta crear un tipo de tabla no disponible en nuestra versién, MySQL op- tard por crear una tabla tipo MyISAM. A continuacién, haremos una reseita de los tipos de tablas soportados. ISAM En un principio, el gestor de bases de datos MySQL empez6 utilizando este tipo de cablas y, actualmente, se las considera en desuso. Entre sus desventajas figura el hecho de no poder transportar archivos entre miqui- nas con distinta arquitectura (tiene un formato diferente para cada arquitectura / sistema operativo, lo cual resulca més répido, pero presenta el problema de la in- compatibilidad) y el de no manejar archivos de tablas superiores a 4 GB. Los indices se guardan en archivos .ISM y los datos, en archivos ISD. MySQL recomienda actualizar este tipo de rablas hacia las de tipo MyISAM. Esto puede hacerse con la siguiente instruccién SQL: ALTER TABLE nosbre_de_la tabla ENGINE = AVISAN; MylSAM Es el tipo de tabla por defecco en MySQL desde la versién 3.23 y esta basada sobre las ablas ISAM, por supuesto que ofreciendo mis opciones que éstas. Cuando se usan estas tablas, los datos se almacenan fisicamente en dos atc uno que tiene la extensién .M¥I (MYISAM INDEX), en donde se almacenan los indi- ces, y otro .M¥D (MYISAM DATA), donde se almacenan los datos. El versiones Es recomendable utilizar La ultima versién de MySQL, pero en ocasiones no debomos hacerlo, ya que las empresas que desarrollen software suelen liberar (as llamadas versiones bets, no aconsejables para sistemas que estén en etapa de produccién, pero si para los que estén en desarrollo, Queda a criterio del lector utilizar las versiones beta o las estables, Bay wwwredusers.com at rsa Se encargan de proveer un almacenamiento independiente: esto significa que se pueden copiar tablas de una méquina a otra de distinta plataforma, Si estamos trabajando con MySQL en forma local, normalmente, se pode4 ver en el propio equipo que estos arch bre una base de datos (estas carpetas estan en el directorio data dentro del directo- tio en donde se instalé MySQL, y allf hay una carpeta por cada base de datos). Es- to vale también para otros tipos de tablas vos se almacenan en una carpeta que tiene por nom- Figura 3. Creando una tabla MyISAM desde ! monitor de MySQL. Ademis: * Sopor en comparacién con los que soportaban las ISAM. n archivos de gran tamaiio (63 bits, archivos de tablas superiores a 4 GB) + Estin optimizadas para sistemas operativos de 64 bits. * Posibilidad de indexar campos BLOB y TEXT. * Se permiten valores NULL en columnas indexadas. * Cada tabla guarda un registro que indica si fue cerrada correctamente o no, y all iniciar MySQL existe 1a opcién de indicarle que se verifique ese pare la tabla de ser necesario, de forma automitica £0, y se re Bo ORACLE Hace algun tiompo la empresa Oracle tomo posesion de MySQL (Ia primera version lanzada bajo la nueva administracion fue la 5:5, y al momento de escribir este relanzamiento va por la 5.5.8 1. Esa compra genero un gran revuelo entre los usuarios de este popular servidor de bases de datos, que aguardan expectantes cuales seran los pasos a seguir por parte de la compatia. 2 vwn.cedusers.com eae Tipos de tablas Esto se logra iniciando MySQL con la opcién: --ayisan-recover Sise enconeré un error, trata de repatarlo de forma ripida ondenando los registos de 2, se vuelve a crearel archivo que contiene la tabla. Y sco existiendo, se intenta reparatlo escribiendo los registros sin un ordenamiento. « Inserts concurrentes (se pueden insertar varios registros al mismo tiempo). MERGE Este tipo de tabla es muy utilizada en los casos en que se precise tratar un niimero N de tablas MyISAM (de idéntica estructura y pertenecientes ala misma base de datos, de la que también debers formar parte la tabla MERGE) como si fuera una sola Esto podria aplicarse si la tabla MyISAM original es de gran tamafio, y acceder a su contenido llevara una cantidad considerable de tiempo y recursos. Obviamente, es- camos hablando de una tabla realmente muy grande. Otras caracteristicas: + Sélo se pueden aplicar inscrucciones SELECT, DELETE y UPDATE. * La definicidn de la tabla se almacena en un archivo «ERM, y el listado de las ta~ blas MyISAM, en un archivo .MRG (aqui hay en realidad un indice de los archi- vos -MYI usados. Ver cablas MYISAM). * Permiten de alguna forma butlar el tamafio maximo de una tabla y el camafio ma- ximo de un archivo en un sistema operativo espec * Debemos saber que si queremos borrar una de las tablas MyISAM que forma parte de la tabla MERGE, no podremos hacerlo bajo el sistema operativo Win dows, ya que éste no permite borrar archivos que estén abiertos, y la tabla, al formar parte de la tabla MERGE, se considera abierta. ico. Por la misma razén se producen inconveniences al aplicar instrucciones tales co- mo DROP TABLE, ALTER TABLE, DELETE FROM sin WHERE, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE y ANALYZE TABLE. Una forma de solucionar esto es borrar el contenido de la tabla MERGE (aplicando la instruceién DELETE sin WHERE a una tabla MERGE, no se borra el contenido de las ta- blas MyISAM sino que se las quita del listado de componentes de la tabla MERGE). Asi estas tablas se considerarin no abiertas. Cuando se crea una tabla de este tipo hay que especificar (con la instruccién UNION) la lista de tablas asociadas. Veamos un ¢jemplo. Bay wwwredusers.com 83 ‘.wyso Devolveria algo como: DIFERENCIAS QUE ENRIQUECEN 84 www.redusers.com Tipos de tablas El pardmetro INSERT_METHOD especifica cn qué tabla se realizarin los INSERTS; si en la primera de la lista (poniendo INSERT_METHOD-FIRST) o en Ia tltima (poniendo IN- SERT_METHOD=LAST). En nucsteo caso la tabla t1 cs la primera y #2 cs la tltima, HEAP Este tipo de tablas tienen una particularidad que las hace diferentes del resto: son tablas en memoria, son temporales y desaparecen cuando el servidor se cierra. Es importante saber que esto las hace realmente ripidas y que, a diferencia de una abla TEMPORARY, que sélo puede ser accedida por el usuario que la crea, una tabla HEAP puede ser utilizada por diversas personas. Algunas otras particularidades: + No soportan columnas de tipo BLOB o TEXT. + No soportan columnas de tipo AUTO_INCREMENT. + No se permiten valores NULL en las columnas que han sido indexadas (antes de MySQL en la versién correspondiente a la 4.0.2). + Siempre conviene especificar el nimero maximo de filas (MAX ROWS) cuando se crea la tabla, para no usar toda la memoria disponible. InnoDB Debemos saber que estas tablas, al igual que las BerkeleyDB, son ‘TST: este cér- mino significa Transactions Safe Tables, o tablas para transacciones seguras. Las ablas tipo TST son menos répidas y ocupan mas memoria, pero a cambio ofre- cen mayor seguridad frente a fallos durance la consulta. Ademds, las tablas InnoDB tienen las siguientes caracterfst as + Proven la posibilidad de transacciones seguras. ACID (Atomicidad; Consisten- cia; Separacién, en inglés Lolacion y Durabilidad). ~ Atomicidad. Consultas tratadas como una sola, de cal forma que sélo se ejecutan cuando todas ellas tienen éxito, en caso de que alguna falle no se ejecuca ninguna. ~ Consistencia. Slo datos validos pueden ser eseritos en la base de datos. - Separacién. Las transacciones que tengan lugar simultdneamente deben ejecu- tarse aisladas unas de otras hasta que finalizan. - Durabilidad. Cuando una transaccién se completa exitosamente, los cambios son permanentes y no se podrd volver atrés. - Soporta operaciones COMMIT y ROLLBACK (beneficio propio de ser TST). + Recuperacién ante fallos. + Soporta FOREIGN KEY (Claves foréneas). Primera vez que se da esto en MySQL. Bay wwwredusers.com 85 ‘.wyso * Bloqueo a nivel de fila. + Permite realizar copias de seguridad mientras la base esté funcionando, * Gran cficacia en el procesamicnto de grandes voliimenes de informacién. + No permite crear claves sobre columnas de tipo BLOB o TEXT. * Una tabla no puede tencr mds de 1000 columnas. + Al borrar todas las filas de una tabla las borra una por una —lo que produce pro- blemas relacionados a la velocidad. Hasta ahora puede eruncar eablas Fueron agregadas en la ve n 4.0 de MySQL. BerkeleyDB Estas tablas pueden ser usadas independientemente de MySQL: estén desarrolla- das por otra empresa (Sleepycat) y el gestor de bases de datos MySQL offece una interfaz para trabajar con ellas como una posibilidad més. * Soportan operaciones COMMIT y ROLLBACK. + Es de tipo denominado TST (Tzansactions Safe Tbles). Podemos ver tablas INNODB para obtener mas informacién acerca de este tema. + Normalmente, para instalarlas hay que buscar una versién de MySQL que in- cluya soporte para este tipo de tablas, y habilitar la opcién al momento de la instalacién (~-with*berkeley-dboption) + En el archivo en donde se guardan los datos también se guarda la ruta a ese mis- mo archivo, de modo que no es posible cambiar la base de directorio. ZEn qué casos usar cada una? Como siempre, la respuesta depende de lo que tengamos que hacer. Las tablas que normalmente se usan hoy en dia son las MyISAM, pero pronto (qui 22és muy pronto) se comenzarin a usar las INNODB, especialmente por la posibilidad de crear relaciones entre tablas (Fundamental en el modelo relacional) y oftecer ma- ryores prestaciones respecto de la seguridad, ademas de las transacciones. EG ws sopre innops Las tablas conocidas como InneDB ce vuelven cada vez mas populares en el gestor de bases de datos MySQL y conviene estar al tanto de los avances que se producen en este campo. Pa~ a es0 existe un sitio de consulta permanente que podemos visitar accediendo 2 www.in- nodb.com. Esta en inglés y trata en detalle las caracteristicas de estas tablas. 86 vwmwredusers.com waa Referencia de funciones Las ISAM estén précticamente en desuso (incluso la empresa que desarrolla MySQL. admit la posibilidad de que en su versién 5 ya no estén disponibles), y las demas, tienen usos muy cspecificos c incluso compatibles con otros tipos: la clave est en estudiar los problemas que se necesita solucionar; y ver en cada caso qué conviene. REFERENCIA DE FUNCIONES Los sistemas gestores de bases de datos, normalmente, vienen con funciones incor poradas para mejorar y hacer més sencillas las consultas que se realizan a una base de datos. La mayoria de estas funciones forman parte del lenguaje SQL estindar pe- to hay otras que son particulares de algiin gestor de bases de datos, lo que significa que existen grandes posibilidades de que al migrar de un sistema gestor de bases de datos a otro, estas funciones no sean reconocidas, es decir no sean compatibles. Una de las cosas que hacen popular a una base de datos, dentro del dmbito informé- tivo, es el hecho de que respeten el estindar ANSI SOL, pero eso no se contradice con que cada base mejore las prestaciones ¢ incorpore funciones propias: queda a criterio de los usuarios el utilizar estas funciones y conocer las virtudes y defectos de su uso. MySQL no es Ia excepeién y nos brinda una gran variedad de funciones para ha- cemnos mas facil recuperar o manipular datos de una base. En los ejemplos que se dan al referenciar estas funciones cabe destacar que los pa metros (0 argumentos) son genéticos, es decir que se les da un nombre cualquie- ra para que resulte més sencillo entender que es lo que hace la funcién; pero la idea és que para sacarle partido a las funciones los parmetros pueden ser otras funcio- nes o bien campos de la/s tabla/s referenciada/s en la instrucc sQL. Ademés, los argumentos que se encuentran entre corchetes (farg]) son opcionales y las funciones estén ordenadas alfabécicamente. Funciones para trabajar con cadenas de caracteres Estas funciones normalmente trabajan con posiciones dentro de una cadena de ca racteres: por defecto, a primera posicién (el primer cardctet) estd asociada al ntime- ro 1; la segunda, al 2 y asi sucesivamente. ASCII(6te) Dewuelve el valor del eédigo ASCH del primer caricter del parimetro, Por ejemplo: ‘SELECT ASCII('2"); Devuelve 50 que es el codigo ASCII que representa al caracter '2' Bay wwwredusers.com 87 ‘.wyso Esta funcién devuelve 0 si str es una cadena vacfa, y NULL si str es una cadena mula, BIN(N) ‘Vea la funcién CONV. BINARY Es en realidad un operador, y puede utilizarse para forzar comparaciones sensibles a maytiseulas y mintisculas, Por ejemplo: SELECT "at = "AY; Devuelve 1 (verdadero) SELECT BINARY Devuelve 0 (falso) BIT_LENGTH (str) Devuelve la longieud de la cadena str en bits. CHAR(N1, N2, N3, ...) Recibe como pardmetros niimeros enteros (si recibe ntimeros con coma o cade- nas que contienen niimeros, toma los enteros) y los toma como valores del cédi- 0 ASCII, devolviendo los simbolos correspondientes. Por ejemplo: SELECT CHAR(77, 121.4,83,81,'76'); Devuelve ‘\ySal' 77 representa el carcter M segtin el e6digo ASCH, el 121 representa y y ast (CHAR_LENGTH (str) Ver funcién CHARACTER LENGTH. Ey cave Hora es? ‘Cuando £¢ trabaja con funciones para el manejo de fechas y horas, hay que tener en cuenta que to ‘man como tiempo actual los horarios del lugar en donde se encuentre instalado el servidor de ba 66 de datos. Un ejemplo es NOW(). Podemas abtener la fecha y hora actuales de nuestro lugar de residencia a través de otros lenguajes que trabajan del lado cliente por ejemplo, JavaScript). 88 www.redusers.com Bee Referencia de funciones CHARACTER_LENGTH (str) Devuelve la longitud de str. CONCAT cadenal, cadena2, cadena3, ..) Devuelve una concatenacién (unidn) de las cadenas pasadas como pardmettos. Devuelve NULL si alguna cadena es nula, Es importante qye un argumento nu mérico es convertido a cadena de caracteres. Por ejemplo: SELECT CONCAT(‘una ', ‘sola’, ' cadena’, ' - ejercicio *, 1); Dewelve ‘una sola cadena - ejercicio 1' La funcién denominada CONCAT_WS hace lo mismo sélo que el primer parimetto se encarga de actuar como separador. Por ejemplo: SELECT CONCAT_WS(',', ‘uno’, ‘dos’, ‘tres'); Dewelve —‘uno,dos, tres’ CONCAT_WS(separador, cadenal, cadena2, cadena3, ...) Ver funcién CONCAT. CONV(N, base_origen, base_destino) Convierte mimeros pasindolos entre diferentes bases numéticas y devuelve una te presentacién a través de una cadena de caracteres del niimero en la nueva base y NULL si cualquier argumento es nulo. La base minima es 2 y la maxima es 36. N es interpretado como entero pero puede ser especificado como entero 0 como cade- 1a (para representar niimeros hexadecimales ~base 16- como para poner un ejemplo). Hay otras Funciones derivadas de ésta que enunciamos aqui. - BIN(N) Devuelve una representacién binaria de N. Devuelve NULL si N es nulo, - HEX(P) Si P es un ntimero, la funcién devuelve una cadena que contiene el valor hexa- decimal (base 16) de P. SiP es una cadena de caracteres, Ja funcién devuelve una cadena hexadecimal en donde cada caricter de P es convertido a dos digitos hexadecimales. Devuelve NULL si N es nulo. wa wun redusers.com 89 ‘.wyso - OCT(N) Devuelve una cadena de caracteres que contiene la representacin octal (base 8) del mimero N (que es de tipo denominado LONG). Devuelve NULL si W es nulo. Su sintaxis es mas sencilla pero la funcionalidad puede obtencrse utilizando la funcién CONV. ELT(N, strl, str2, str3, .. Se encarga de devolver stet si Wes igual a1, str2 si Nes igual a 2, y as{sucesivamen- te, SiN estd fuera de indice, devuelve NULL. FIELD(str, stel, str2, str3, ..) Devuelve el indice (comenzando a contar desde 1) de la cadena str en ste, str2, cetcérera, y 0 si no encuentra la cadena. Por ejemplo: SELECT FIELD('bbb’, ‘aaa’, "bbb', ‘ccc’, ‘ddd’, eee"); Devuelve 2 FIND_IN_SET(ste, strlista) Devuelve la posicién de str dentro de la lista strista, Devuelve 0 si no esté en la lis- 20 sila lista esté vacfa, Devuelve NULL si algin parimetro es nulo. Por ejemplo: SELECT FIND_IN_SET('b’, ‘a,b,c, Devuelve 2 Esta funcién podria no fu cionar correctamente si en str hay alguna (.) coma. HEX(P) Vea la fan n CONV. INSERT (str, pos, len, nuevacadena) Devuelve la cadena str reemplazando su contenido desde la posicién pos hasta la posicidn pos + len por la cadena nuevacadena. SELECT INSERT(‘el rio dulce", 4, 9, ‘War'); Devuelve ‘ell Mar dulce’ 90 www.redusers.com Bee Referencia de funciones INSTR(strsubcadena) Vea la funcién POSITION, LCASE(ste) Devuelve la cadena denominada str en mintisculas. Esta funcidn es idéntica a la funcién LOWER. Para pasar a maytisculas ver UCASE LEFT (str, N) Devwuelve N caracteres de la cadena str empezando desde la izquierda. LENGTH (str) Vea funcién CHARACTER LENGTH. LIKE Es realmente muy utilizado y trae muchos beneficios al permititnos incorporar las llamadas expresiones regulares en nuestras consultas SQL. Devuelve 1 si hubo coincidencias y 0 si no. opera un nmr cua de craton, nso ig. Buses xatanete un cari Tabla 3. Operadores de la funcién LIKE. Por ejemplo: SELECT ‘Buscar!’ LIKE ‘Buscar_'; Devuelve 1 SELECT ‘Buscar!’ LIKE '%Buc’'; Dewelve 1 SELECT ‘Buscar!’ LIKE ‘Buscar! _ Dewuelve 0 SELECT "Buscar!" LIKE ', en otros se comparan dos valores con el operador = en vez di etcetera, 14 www.redusers.com Bee Referencia de funciones Si en una comparacién, por lo menos uno de los elementos que se estn compa- rando es NULL, la comparacién dari como resultado NULL, excepto si se usa el operador de comparacin <=> (Tabla 6). leulded - ‘SLED = 4,1 = 0,4 = NUL; Develo 1 0 NUL Menor ogi ue < SELEOTA 1,1 10,1 <= NUL Develo 11 NUL Mayor o lua gue > ‘ELE 1>~ 1, 1>= 10,1 >» NUL, Develo 1 0 NUL Tata deforma especial aNULL <> SELEC 1 > 1,1. NUL; Dewele 10 es noma? SNOT MULL ———SELECTISNOT NUL), 1S NOT MUL/O}, Dewele 10 wo est en lata? Norm ‘SELECT we NO (0,35; pen), Doweioo Tabla 6, Lista de operadores. Operadores légicos Veamos queé tipo de operadores lbgicos existen y emo trabajar con ellos: NOT o! Negacién. Por ejemplo: SELECT 1(141); Dewuelve 0 (1#1-2, 2 e5 distinto de 0, 2 es verdadero, 10 distinto de verdadero es falso) sera rer Manne Te ciara CE OF Bay wwwredusers.com 115 a iE AND 0 && Devuelve 1 si odos los operandos son verdaderos, si no devuelve 0. Por ejemplo: I a 2 Devuelve el valor 1 si alguno de los operandos es verdadero, el valor NULL sialgu- no ¢s NULL y el otro es 0; si no devuelve el valor 0. Por ejemplo: XOR Devuelve 1 siy sélo si tinicamente uno de los operandos es 1, a menos que el otro sea NULL en cuyo caso devuelve NULL; si no devuelve 0. 16 ‘wn redusers.com Introduccién a los procesos almacenados Por ejemplo: SELECT 1 XOR 15 Devuelve 0 SELECT 1 XOR 0; Dewelve 1 SELECT 1 XOR NULL; Devuelve NULL SELECT 1 XOR 1 XOR 15 Devuelve 1. Prinero evalua 1 XOR 1 (que devuelve 0), luego el resultado anterior y 1 (0 XOR 1) INTRODUCCION A LOS PROCESOS ALMACENADOS Una de las grandes novedades de la versign 5 de MySQL es sin dudas la inclusién de soporte para procesos almacenados. A continuacién veremos los fundamentos, testicos y este tema mas algunos ejemplos basicos. Si ya usamos bases de datos como Oracle, Interbase / Firebird, PostgreSQL, seguro escuchamos hablar de procedimientos almacenados. Sin embargo, en MySQL esto 1 para que esta base de datos se convierta en un verdadero sistema gestor de bases de datos. « toda una novedad y un paso Ahora jen, ;qué son en realidad los procedimientos almacenados? Luego de sumer- gimos en este tema veremos que el nombre es plenamente identificatorio y casi ex- plica lo que es un procedimiento almacenado. Ey oPerapora 1 Un 260 tific es al de contundir el operador de comparacién f=] con el de asignaci6n fol, Para no cometer un erro, se recomienda ubicar primero el valor y, luego, la variable en una compa racién. Supongamos que nos equivocamas escribiondo lo siguiente: if (10 = Svar) {Esto daria error inmediatamente; en cambio lo siguiente no: if (Svar = 10) {a eae wun redusers.com 17 ‘.wyso Los procedimientos almacenados son un conjunto de instrucciones SQL mds una serie de estructuras de control que nos permiten dotar de cierta légica al procedi miento, Estos procedimicntos estin guardados ~almacenados- en el servidor y puc- den ser accedidos a través de llamadas, como veremos més adelante. Se puede decir que estos procedimicntos tienen un lenguaje de programacin aso- ciado y entonces, surge una preguota cuyas respuestas nos ayudarin a empezar a ver los casos de utilidad de estos procedimientos: ;cuil es la novedad en tener un len- {guaje de programacién para interactuar con una base de dacos? :Para qué queremos tun lenguaje -por cierto limitado- teniendo a nuestra disposicién otros mucho mas avanzados y completos -ente ellos PHP- para acceder a una base de datos? jimos que estos procedimientos pueden programarse utilizando un lenguaje: ésta no cs la ventaja, la ventaja consiste en que residen en el servider, y esto implica que: + Se garantiza que todas las aplicaciones (sea cual fuere el lenguaje en el que estén es- critas o el sistema sobre el que funcionen) obtendrin los mismos resulcados. * Un derivado de la ventaja anterior: si por algin motivo se debe cambiar de len- guaje de programacién, no importa ya que los procedimientos almacenados for- man parte de la base de datos, y esto posibilita el mancenimiento de la I6gica. + En principio, utilizando una base de datos se centraliza la informacién, ahora se centraliza la forma de acceder a esa informacién. + La mayor parte del trabajo se realiza en el servidor y no en el cliente. Esto diltimo reduce el trifico y libera cargas de trabajo en las aplicaciones cliente. Sapongamos aque deseamos realizar una tarea sin utilizar procedimientos almacenados. Normal- mente necesitariamos interactuar con la base de datos pidiéndole informacién desde nuestra aplicacién y enviando a su vez otras, lo que provoca inevitablemen- ico en la red que puede atentar contra nuestros recursos, bio utilizamos procedimientos almacenados, hariamos tal vez sélo una peticién y el resto de las tareas se resolverian en el servidor. Nuestra aplicacién s6- lo esperaria esta resolucién para recibir los datos. * Con respecto a la seguridad, se podria evitar que las aplicaciones clientes accedan directamente a las tablas: ahora los procedimientos almacenados harin las veces de intermediarios, y se podrin evitar comportamientos maliciosos. Ey temro comparrivo Et hecho de trabajar con procedimientes almacenados no es excluyente: pademos trabajar como normalmente se hace con lenguajes de programacién separados de ls base de datos eimplementar a la vez operaciones o tareas que utilicen procedimientos. Lo mismo vale pa- ra las funciones, vistas también en esta seccién. 118 www redusers.com Introduccién a los procesos almacenados Este timo punto es importante y denora algo que quizés se deba aclarar: tal vez muchos usuarios tengan acceso a una base de datos 0 a programar aplicaciones que aceedan a bases de datos, peto los procesos almacenados son programados por po- cas personas y son esas personas quienes deciden qué datos poner a disposicién de los dems, de qué forma hacerlo y cudndo modificar ese comportamiento. Eviden- cemente, utilizando procedimientos almacenados se tiene un mayor control sobre lo que se quiere mostrar y de qué forma hacerlo, Més adelante veremos que MySQL crea algunas tablas durante su instalacién, «2 blas de sistema, por ejemplo, para administrar usuarios, y si instalamos MySQL ver- sién 5 veremos una tabla que no habjamos visto antes: una tabla llamada prec. Desde esta tabla es posible gestionar los privilegios de los usuarios con respecto ala creacién tanto de procedimientos como de funciones (veremos qué es una funcién més adelante en esta misma seccién), Debemos saber que los privilegios para ejecutar o modificar procedimientos © funciones son dados automaticamente a su creador. Para crear un procedimicnto, MySQL nos ofrece la directiva CREATE PROCEDURE. Al crearlo éste es ligado 0 relacionado con la base de datos que se esta usando, tal co- mo cuando creamos una tabla, por ejemplo. Para lamar a un procedimiento lo hacemos mediante la instruccién CALL. Desde un procedimiento podemos invocar a su vez a otros procedimientos o funciones. Un procedimiento almacenado, al igual cualquiera de los procedimientos que po- damos programar en nuestras aplicaciones utilizando cualquier lenguaje, tine: + Un nombre. + Puede tener una lista de pardmetros. «+ Tiene un contenido (seccién también llamada definicién del procedimiento: aqui se especifica qué es lo que va a hacer y eémo) * Ese contenido puede estar compuesto por instrucciones sql, estructuras de con- trol, declaracién de variables locales, control de errores, etcétera. En resumen, la sintaxis de un procedimiento almacenado ¢s la siguiente: ‘CREATE PROCEDURE nonbre (pardnetro) [caracteristicas} definicién Puede haber mas de un parémetro (Ge separan con comas) 0 puede no haber ningu- no (en este caso deben seguir presentes los paréntesis, aunque no haya nada dentro). Los parimetros tienen la siguiente estructura: modo nombre tipo aaa wun redusers.com 119 ‘.wyso Donde: + modo: cs opcional y puede ser IN (cl valor por defecto, son los parimetros que el procedimiento recibir), OUT (son los parimetros que el procedimiento podri modificar) o INOUT (mezcla de los dos anteriores). ‘+ nombre: ¢s el nombre del parimetro. * tipo: es cualquier tipo de dato de los provistos por MySQL. + Dentro de earacteristieas es posible incluir comentarios o definir si el procedi miento obtendrd los mismos resultados ante entradas iguales, entre otras cosas. + definiei6n: eel cuerpo del procedimiento y esti compuesto por el procedimien- to en sf aqut se define qué hace, cémo lo hace y bajo qué circunstancias lo hace. Asi como exiscen los procedimientos, también existen las funciones. Para crear una funcién, MySQL nos oftece la directiva CREATE FUNCTION. ‘Como ya vimos, la diferencia entre una funcién y un procedimiento es que la fun- cién devuelve valores. Estos valores pueden ser utilizados como argumentos para ins- trucciones SQL, tal como lo hacemos normalmente con otras funciones como son, por cjemplo, MAX() 0 COUNT(). Utilizar la cldusula RETURNS cs obligatorio al mo- mento de definir una funcién y sirve para especificar el tipo de dato que seri devuel- 0 (S6lo el tipo de dato, no el dato). Su sintaxis es: CREATE FUNCTION nonbre (pardmetro) RETURNS tipo [caracteristicas] definicion Puede haber més de un parimetro (se separan con comas) 0 puede no haber ningu- no (en este caso deben seguir presentes los paréntesis, aunque no haya nada den- tro). Los parimetros tienen la siguiente estructura: nombre tipo Donde: ‘+ nombre: es el nombre del pardmetro. + tipo: ¢s cualquier tipo de dato de los provistos por MySQL. + Dentro de earacteristicas es posible incluir comentarios o definir si la funcién de- volveré los mismos resultados ante entradas iguales, entre otras cosas. * definicién: es el cuerpo del procedimiento y esti compuesto por el procedimien- to en si: aqui se define qué hace, cémo lo hace y eudndo lo hace. 120 www redusers.com eae Introduccién a los procesos almacenados Para llamar a una funcién lo hacemos simplemente invocando su nombre, como se hace en muchos lenguajes de programacién, Desde una funcién podemos invocar a su vez a otras funciones o procedimientos En la bibliografia asociada a estos temas quizas se encuentre que tanto a los procedi- jentos almacenados como alas funciones sc los lama "rutinas”. También puede rea lizar biisquedas por stored procedures, que es la traduccién al inglés de procedimientos deliniter // mysql> CREATE PROCEDURE procedimiento (IN cod INT) -> BEGIN <> SELECT * FROM tabla WHERE co > END >I ‘Query OK, 0 rows affected (0.00 sec) mysql> deliniter ; mysql> CALL procedinento(4) ; En el cédigo anterior lo p linea de comandos de coma (:): en los procedi ero que hacemos es fijar un delimitador, Al u SQL vimos que el delimitador por defecto es el punto y ntos almacenados podemos definirlo nosotros. TDD servicios de aLosamienTo WEB Dependiende de Las caracteristicas de las inetrucciones SQL que vayamos a utilizar en nuestros proyectos, serd de importancia verificar que versién esté instalada en el hosting para garantizar fl correcta funcionamiento de nuestros scripts: evaluar los requerimientos de nuestras aplicaciones es un punto importante en las distintas etapas de un desarrollo aaa wun redusers.com vat ‘.wyso Lo interesante de esto es que podemos escribir el delimitador anterior; sin que el procedimiento termine, Mis adelante, en este mismo eddigo volveremos al delimi- tador clisico. Luego creamos el procedimiento con la sintaxis vista anteriormente y uubicamos el contenido entre las palabras reservadas BEGIN y END. El procedimiento recibe un parimetro para luego trabajar con él, por eso ese pa- rémetro es de tipo IN. Definimos el parimetro como OUT cuando en él se va a guardar la salida del procedimiento. Si a parimetro hubiera sido de entrada y salida a la ver, seria de tipo denominado INOUT. El procedimiento termina y es llamado luego mediante la siguiente instruccién: mysql> CALL procedinento(4); (Otro ejemplo: CREATE PROCEDURE procediniento2 (IN a INTEGER) BEGIN DECLARE variable CHAR(20); IF a> 10 THEN SET variable = ‘mayor a 10°; ELSE SET variable = ‘menor 0 igual a 10°; END IF; INSERT INTO tabla VALUES (variable); END + El procedimienco recibe un parametro llamado a que es de tipo entero. + Se declara una variable para uso interno que se llama variable y es de tipo char. * Se implementa una estructura de control y si a es mayor a 10 se asigna a varia- ble un valor. Si no lo es se le asigna otro. a el valor final de variable en un: instruccién SQL. TE tear o no TIPEAR ‘Trabajar utilizando la linea de comandes de MySOL es Una experiencia que no deberiamos dojar pasar: si bien hay muchas aplicaciones que nos permiten acceder a las funciones provistas por MySQL de forma grafica, se aprenden muchas cosas y se afianzan otras utilizando esta opcién que no por ser la mas antigua deja de ser til y muy empleada hoy en dia. 12 vwmwredusers.com Ga El uso del monitor de MySQL Recordemos que para implementar el ultimo ejemplo se deberin usar nuevos dei- mitadores, como se vio anteriormente. Observemos ahora un ejemplo de funciones: mysql> deliniter // mysql> CREATE FUNCTION cuadrado (s SHALLINT) RETURNS SHALLINT -> RETURN s*s3 iL Query OK, 0 rows affected (0.00 sec) nysql> deliniter ; nysql> SELECT cuadrado(2); Otras bases de datos como PostgreSQL implementan procedimicntos almacenados y brindan la posibilidad de programarlos utilizando lenguajes como PHP. En MySQL hay intenciones de implementar lo mismo y seguramente en las préxi- mas versiones lo veremos, pero mds importante que utilizar un lenguaje u otro es entender para qué podrfan scrvirnos los procedimientos almaccnados. Es por eso mismo que hemos decidido incluir esta introduccién en el libro: para que el lector empiece a acostumbrarse a utilizar este tipo de herramientas y pueda sacar ventaja de su uso, Mas adelante pods cambiar la implementacién de los pro- cedimientos almacenados pero no lo harin con sus principios fundamencales. En definitiva hemos dado un recorrido por el nuevo mundo de la programac de procedimientos almacenados en MySQL. Es importante que se trata de un mundo que esté en pleno desarrollo y que promete evolucionar. EL USO DEL MONITOR DE MySQL ‘Tipicamente para acceder a bases de datos MySQL utilizaremos nuestras propias p4- ginas PHP 0 algtin programa para administracién (PHPMyAdmin 0 MySQLAB, por ejemplo), pero MySQL trac consigo un programa cliente que nos permite acce- der a los datos: no tiene un nombre especifico, algunos lo Hlaman prompt o linea de comandos o monitor de MySQL, o simplemente MySQL. Este programa nos serviré para dar los primeros pasos con la base de datos, conocer a fondo su sintaxis y familiarizarnos con los mensajes de error del sistema. aaa wun redusers.com 128 rsa Para ponerlo en marcha (primero aseguirese de que el servidor MySQL esté activo) lo tinico que tenemos que hacer es abrir una terminal en Linux (0 una ventana de DOS en sistemas Windows), ir hasta el directorio donde inscalamas MySQL y en- tear en Ia carpeta bin. Ahora debemos tipear segtin el caso: * Es importante saber que si no creamos ningiin usuario lo més probable es que po- damos entrar poniendo simplemente lo siguiente nysoL + Si ya creamos un usuario tenemos que entrar poniendo, MySOL -u nombre de usuario -pcontrasena Atencién: no det 10s dejar espacio entre -p y contrasefia, sino escribirlo todo junto. Si todo funcions bien, veremos un mensaje de bienvenida y el programa estard pre- parado y esperando recibir nuestras instrucciones. Figura 4. Pantalla de bienvenida del programa ellente MySQl. Aqui lo que podemos hacer gresar sentencias SQL de cualquier tipo. Las sencencias terminan con ; (puto y coma), esto significa que aunque presionemos la tecla esto no produciré ningtin cambio salvo el de introducir una nueva linea en la pantalla es ni més ni menos qu En definitiva, para ejecutar una sentencia tenemos que tipearla, finalizarla con ; (punto y coma) y presionar la tccla . 124 vwn.cedusers.com eae El uso del monitor de MySQL A medida que interactuemos con el programa cliente de MySQL, veremas que el prompt iri cambiando segtin lo que hagamos: SI sto pa un ae comand. > Fspeando una rer lea. > pean laser ie, hay ua cade ate ca * epee la igure lua, hay una cada ate cn. Tabla 7. Lista de posibles prompt. La tercera y cuarta opcién se dan, por ejemplo, cuando estamos ingresando una cadena de texto: todo lo que escribamos seré parte de la cadena sin importar si es un ; (punto y coma) 0 un o cualquier otra cosa que no sea el correspon- diente cierre de la cadena (si abrimos la cadena con comillas dobles, el cierte se 4 otro par de comillas dobles; si abrimos la cadena con comillas simples, el cie- re serd otro par de comillas simples). Para cerrar el programa y volver a DOS (0 al prompt de Linux) existen las directivas quit y exit. Para cancelar una directiva (antes de finalizarla con ;) existe la directiva \¢. Por ejemplo: MySQL> SELECT * FROM alusnos > WHERE >\e mysau> Algunos ejemplos: MYSQL> CREATE DATABASE ejemplo; MYSQL> USE ejemplo; [TD pase no vea Para ingresar al monitor de MySOL se puade usar (a cintaxic MySQL -u nombre de_usuario ~pcontrasefia 0 bien, MySQL ~u nombre_de usuario ~p. Al ejecutar esto dltimo, se nos pedir le contrasefia, con la diferencia de que esta vor, al tipearla, los demas no podrén vera, privlegian- do asi cuestiones de seguridad y evitando posibles espias. wr redusers.com 105 ‘.wyso MYSQL> CREATE TABLE tablat ( “> canpot INT(4) UNSIGNED, => campo2 VARCHAR(25) NOT NULL 2) MYSQL> INSERT INTO tablat VALUES (2, ‘CADENA A‘); MYSQL> INSERT INTO tablat VALUES (1, ‘CADENA B'); MYSQL> SELECT * FROM tablat WHERE campot >= 1; NySOL> OROP TABLE tablat; ysol> exIT Hay comandos que devuelven un gran ntimero de filas. Debemos saber que si quiere guardar estos resultados para imprimirlos o para leerlos més emodamen- te, puede ingresar al monitor de MySQL poniendo: MySOL -u nombre_de_usuario ~pcontrasefia --tee="uno.txt” O: MySOL --tee="uno.txt” Con esto lograremos que todos los comandos y las salidas de los mismos se guarden en el archivo uno.txt (que en este caso se guardari en el mismo directorio donde se cencuentea el programa MySQL, normalmente, el directorio BIN). El archivo no po- dra ser a jerto mientras la conexién esté activa (Otra opcién para ingresar al monitor es la siguiente: MySOL -h servidorcenter> Donde servider es el servidor al que nos queremos conectar (all! estarin guardadas las bases de datos) y puede ser su nombre o bien su direccién IP. Si se omite esta opcién se intencari conectar por defecto a la propia méquina desde donde se esta trabajando. Lo anterior cs muy importante porque pone de manificsto la distincién entre MySQL 126 www.redusers.com Bee El uso del monitor de MySQL Cliente y MySQL Servidor, que podrian estar instaladas en diferentes méquinas, di- ferentes sistemas operativos, y tener diferentes versiones: mds adelance veremos fun- ciones que nos exigirin que sepamos distinguir encre clientes y servidores de MySQL. Por tiltimo, las opciones para ingresar al monitor son muchas y se pueden poner cuantas se quicra sin importar el orden de las mismas. Para obtener un listado completo puede tipear: MySQL ~2 O bien: MySQL ~2 > opciones.txt Es importante que ambas hacen lo mismo, sélo que la primera muestra las op- ciones por pantalla, mientras que la segunda las guarda en este caso en el archi- vo opeiones.tet, dencro de la misma carpeta bin, BW resumen En este capitulo hemos visto una introduccién al gestor base: 1s MySQL y las po- sibilidades que puede brindarnos en nuestras tareas de desarrollo, Algunas de estas opciones son: las plataformas soportadas, las diferentes versiones disponibles, los t de tablas (una para cada necesidad) y los tipos de datos soportados para definir nuestros 1s. También repasamos las funciones que nos ofrece el Lenguaje SOL y cémo ejecutar consultas a través de la linea de comandos de MySQL. aaa wun redusers.com wer [™@ ACTIVIDADES ‘wn. redusers.com Desarrollo PHP + MySQL PHP y MySQL En este capitulo hallaremos las distintas alternativas que nos ofrece PHP para acceder, y definir estructuras de bases de datos MySQL: sintaxis de las funciones, diferencias, ejemplos ‘Cémo conectar PHP con MySQL, msal connect isel_peonnect Ejcusin de senencias mysal_db_quey sel query ‘reacion de base de datos através de PHP myselcreate ¢b Seleccione una base de datos sect (reacion de tablas através ‘de PHP ‘bene stds de bases de als y tablas através de Pi iso ists isolates Ubizacin de mittiples lnases de datos (cuinds hacer Como hata ‘cerrarconesin on a base mysql_close ‘jempla prictico: autos php Resumen SERVICIO DE ATENCION AL LECTOR: [email protected] _Atvidades y comentarios acerca de cada una de elas. 130 130 12 1 1 a 135 137 BT 138 “0 ul 3 me rc uw M6 16 141 49 150 4. PHY m¥saL. COMO CONECTAR PHP CON MySQL Antes de empezar a interactuar con una base de datos, tenemos que establecer una conexién entre PHP y el servidor de bases de datos MySQL. Para hacerlo, PHD nos ofrece dos funciones: mysql_connect y mysql_pconnect que, aunque similares, difieren en algunos aspectos. mysql_connect a base de datos y requiere que se le pasen, de ma- nera opcional, los siguientes argumentos (en este orden): nysql_connect (“servidor”, “nombre de usuario”, “password”); + SERVIDOR. Cadena de caracteres que debe contener el nombre del servidor © bien su direccién IP, Cuando hablamos de servidor nos referimos a la méqui- na en donde se encuentra instalado el servidor de bases de datos MySQL. Si estamos trabajando en forma local podemos utilizar como nombre de servidor locathost 0 127.0.0.1 como direccién IP. Opcionalmente se puede agregar el puerto de conexién (desde PHP 3), de la si- guiente forma: servidor:puerto (por cjemplo, locathost:80). * NOMBRE DE USUARIO. Se trata de nombre de usuario vilido para poder tener acceso a la base de datos en cuestién. + PASSWORD, Corresponde a la contrasefia que corresponde al nombre de usuario que se ha ingresado anteriormence. ‘Como se dijo, los argumentos son opcionales y si no se especifica alguno se asumen los valores por defecto que se encuentran en el archivo php.ini (0 php3.ini segain la versién de PHP). Alli enconcraremos las siguientes lineas: mysql.default_port = (puerto por defecto) mysql.default_host = (nombre del servidor por defecto) mysql-defaule_use (nombre de usuario por defecto) 130 www redusers.com Gémo conectar PHP con MySQL mysql.default_password = (clave de usuario por defecto) Para completar las opciones contenidas en el php.ini simplemente tenemos que escribir la informacién a continuacién del signo igual. Por ejemplo, para com- pletar s6lo el usuario y el nombre del servidor: mysql-defaule_port = mysql-default_host = "168.22.22.9" mysql-default_user = "pepe" mysql.defauke_password = Si tenemos valores por defecto en el php.ini pero de igual manera completamos los ar- gumentos de mysql_connect, se tendrin en cuenta estos tiltimos por sobre los primeros. Los argumentos son opcionales pero piramidales, donde podemos incluir: + Ningiin argumento, + Sélo el nombre del servidor. + Sélo el nombre del servidor y ef nombre de usuario. + El nombre del servidor, el nombre de usuario y el password. Debemos saber que esto significa que no se puede, por citar algin ejemplo, ingresar el password y dejar vacfos los demés argumentos. ee] i ean age Ah te ai erm te FBR AYA eating To crete ot aon Eee ee Beeateniaaeee rn SS RISA Rs BA Due sd hae else Sige retin cnet ‘and eet f sect fore ne ftp erp: net/ini-sactsions Figura 1. Configurando las opciones de MySOL en el archivo php.ini. eee www redusers.com 131 4. PHY m¥saL. PHP tiene valores por defecto (no los incluidos en el php.ini, otros) que se usan cuando un determinado argumento fue omitido en fa llamada a mysql_connect y, ademés, no tiene un valor asociado en el php.ini. Estos valores son: + Nombre del servidor: lcathost (que cs cquivalente a escribir 127.0.0.1) + Nombre de usuario: el del propietario del proceso del servidor. * Password: vacia. Si programamos de forma local, por ejemplo, para realizar pruebas de desarrollos, no hay mayores inconveniences en completar los valores por defecto del php.ini, pe- ro tengamos en cuenta que cualquiera que tenga acceso a ese archivo podrd ver esa informacién. Incluso a través de PHP se puede utilizar la funcién get efg var("mysql.default_password") y ver la contrasetia escrita all. Esta fuancién devuelve 4 (verdadero) si nos conectamos y 0 (falso) si algo falls Sise logra la conexién devuelve, ademés, un identificador de conexién. Por ejem- plo, en la conexién que vemos a continuacién: Sid_conexio ysql_connect (“168.22.22.3", “pepe”, “grillo”); $id_conexion seria el identificador. Nota importante: uno de los arguments de mysql_connect es el servidor al que nos queremos conectar (al estarn guardadas las bases de datos) y en el cual deberd es- tar instalado y activo el servidor de bases de datos, mysql_pconnect La sintaxis de esta funcién es ka siguiente: ysql_pconnect(“servidor”, “nonbre de usuario”, “password”); FEy tRaBAUAR CON BASES DE DATOS Recordemos que para empezar a interactuar con una base de dates [esto es, realizar consultas fen el lenguaje SOLI debemos primero asegurarnos de que los servidores fol de paginas web y el de bases de datos} estén funcionando, y que la conexién se haya llevado a cabo con éxito (ma~ diante una de las funciones mysql_connect o mysql_peonnectl 132 www redusers.com Gémo conectar PHP con MySQL Funciona de manera similar a mysql_connect con la diferencia de que las conexiones abiertas con mysql peonnect (P de persistence) no se cierran -persisten- cuando termi- na la cjecucién del archivo PHP (con mysql_connect sucede esto, Ver mysql close) Si en el momento en que se llama a esta funcién ya existe una conexién abierta idéntica, se usa; y en caso de que no exista, se la crea. Cuando se dice “idéntica” se quiere decir que los argumentos “servidor”, “nombre de usuario” y “password” son iguales en las dos conexiones, tanto la conexién que brie como la que se encuentra abierta Esta funcién, al igual de lo que sucede con la funcién mysql_connect que vimos nente, también devuelve un identificador de conexidn, se inten anterio} Ejecucién de sentencias Luego de crear la instruccién SQL hay que enviarla al servidor para que éte la resuel- va. PHP nos ofiece dos funciones para poder hacerlo: mysql db_query y mysql_query. mysql_db_query Los argumentos que espera son: nysql_db_query(“base de datos”, “instruccion”, identificador) ; + Base de datos. Aqui debemos ingresar el nombre de la base de datos sobre la cual quetemos llevar a cabo la consulta. 4 Instruccién, Cadena que contiene la consulta SQL. por realizar. Las instrucciones no pueden terminar con punto y coma () + Identificador. Un identificador de conexién. Este argumento es opcional y si se opta por no incluirlo, la funcidn intentard encontrar una conexi al servidor MySQL. Si no la encuentra, trataré de crear una como s ra a mysql connect() sin argumentos. a abierta Ejemplos de la funcién: vwuw.redusers.com 133 4. Bue Y mYSOu. Esta funcidn devuelve 4 (verdadero) si la instruccidn pudo ejecutarse y se encarga de devolver el valor 0 (filso) si algo fallé durante el proceso. Nota: antes de proceder a enviar una inscruccién SQL debemos tener establecida tuna conexién con el servidor correspondiente. mysql_query Su sintaxis es la siguiente: ‘+ Instruccién. Cadena que contiene la consulta SQL por realizar. Las instrucciones ‘no pueden terminar con punto y coma (;). {QUE PASO? wwiw.redusers.com z Greacién de base de datos a través de PHP + Identificador. Se trata de un identificador de conexidn. Este argumento es op- cional y sielige no incluirlo, la funcién asume la uiltima conexién abierta con el servidor MySQL. Si no la encuentra, intentard crear una como si se llamara a mysql_connect() sin argumentos. Esta funcién devuelve el valor 1 (que corresponde a verdadero) sila instruccién pu- do ejecutarse con éxito y 0 (falso) si algo fall. Nota: ances de enviar una instruccién SQL, es necesario que tengamos establecida una conexién con el servi lor correspondiente. CREACION DE BASE DE DATOS A TRAVES DE PHP Existen distintos programas para crear bases de datos. A continuacidn, abordare- mos la forma de hacerlo a través de un script PHP con la funcién mysql create ab. mysql_create_db Su sintaxis es la siguiente: nysal_create_db(“base de datos”, identiticador); * Base de datos: se trata del nombre de la base de datos que vamos a crear. Si ese nombre ya existe o el identificador no es vilido, la funcién devuelve 0 (fal- so) y, obviamente, no crea ninguna base + Tdentificador: este argumento es opcional y si se elige no incluirlo, ta funcién asume la tiltima conexién abierta con el servidor MySQL. Si no la encuentra, in- tentard crear una como si se Hlamara a mysql connect() sin argumentos. Para més informacién acerca de identificadores de conexién y cémo conectarse al servidor, ver mysql_connect en este mismo capitulo, Py no eset unico Debemos sabor que si bien SQL [Structured Query Language] es el Lenguaje de consulta a bases de datos mas utilizado de la actualidad, también existen otras opciones (come QBE -Query By xample~, QUEL, etcétera} que intentan hacerle sombra aunque no lo logren, ni por casualidad, al menos por ahora. Ya veremos qué pasa en futuras versiones eee www redusers.com 135 4. Bue Y mYSOu. Esta fiuncién devuelve 1 (verdadero) sila instruecién pudo ejecutarse con éxito y 0 (also) si algo falld. Debemos tener en cuenta que esta funcién no esti disponible en todos los servidores, y que en su lugar podemos utilizar mysql_query, tal cual veremos en el ejemplo presentado hacia el final de este mismo capitulo. Ejemplo de la funcién mysql create. db: wwiw.redusers.com 3 Seleccién de una base de datos Cada ver. que se crea una base, ésta se almaccnari -normalmente- en dl directorio aysql\datas\nombre base, donde mysal es el directorio en donde se instal MySQL. Figura 2. Bases de datos almacenadas en el servidor. Para eliminar una base de datos desde PHP, podemos utilizar la funcién mysql dxop_ab cal como lo vemos en el siguiente eédigo: ysql_drop_db(“base de datos", identificador); SELECCION DE UNA BASE DE DATOS Normalmente, en un servidor hay almacenadas mis de una base de datos, Por eso, debemos indicar cual de todas ellas vamos a utilizar en nuestras consultas. PHP nos provee para ello de una funcién llamada mysql select db. mysql_select_db Su sintaxis es la siguiente: nysql_select_db(“base de datos”, identiticador) ; * Base de datos: nombre de la base de datos que queremos seleccionar y sobre la cual queremos realizar las consuleas. + Identificador: un identificador de conexién, Este argumento es opcional y si op tamos por no incluitlo, la funcién asume la tltima conexién abierta con el servi- eee www redusers.com 17 4. PHY m¥saL. dor MySQL. En caso de que no la encuentre, intentaré crear una como si se lla- mara a mysgl_conneet() sin argumentos, Para mas informacién acerca de identificadores de conexién y de edmo conectar- se al servidor ver mysal_connect en este mismo capitulo. Algo importante es que esta funcién liga a la base de datos seleccionada y al identificador. Esto significa que cuando por medio de cualquier funcién haga se tomar como base de datos la base selecciona- day no habré que volver a indicarla cada vex. mos referencia al identificado Esta funcién devuelve true (verdadero) si tuvo éxito y false (faso) si algo falld (por jemplo, si no hubiese ninguna base de datos con ese nombre). CREACION DE TABLAS A TRAVES DE PHP No existe en PHP una funcién especifica para crear tablas. Para hacerlo debemos ucilizar la funcién mysql_db_query o la mysql_query ya explicadas anteriormente y escribir la instruccién SQL que corresponda, Veamos algunos ejemplos: <2ohp J/earganos en una variable toda 1a consulta Stabla = “create table t1 ("3 Stabla .= “ct int(4) unsigned not null,"; Stabla .= “c2 varchar(100)) "5 Stabla .= “ENGINE-nyisan”; J/la ejecutanos nysql_query(Stabla) ; > 138 www redusers.com Greacién de tablas a través de PHP Para eliminar una tabla podemos hacer lo siguiente: VALIDACION DE INSTRUCCIONES vas www redusers.com 139 4. PHY m¥saL. Para modificar la estructura de la tabla podemos hacer lo siguiente: <2php Iereanos 1a consulta Ssql = “ALTER TABLE t1 MODIFY c2 BIGINT NOT NULL"; 1/la ejecutanos if (mysql_query(Ssql)) — { echo “tabla modificada”; } else q echo “error al modificar la tabla”; } > Generalmente un error en este tipo de consultas se debe a una sintaxis incorrecta en {a instruccién SQL, © bien a un problema al establecer la conexién al servidor. Por lo general, veremos en nuestros programas una gran cantidad de consultas a una base de datos por lo que, aunque sea en las primeras aplicaciones, seria lo més con- veniente trabajar de la misma forma que en el itimo ejemplo. Esto significa, utilizar mensajes de confirmacién de tareas. Esto deriva en cl beneficio de no sdélo saber dén- de esti el error sino, y a consecuencia de lo anterior, resolverlo de forma répida. OBTENER LISTADOS DE BASES DE DATOS Y TABLAS A TRAVES DE PHP Para saber qué bases de datos existen en el servidor, PHP nos ofrece la fancién mysql list. dbs. Para saber qué tablas se encuentran en una base de datos, PHP nos brinda otra funcién que nos seré de utilidad: mysql lst tables Ty Prpmvaomin Debemas tener en cuenta que para darnos una idea de hasta dénde se puede llegar utilizan- do de manera conjunta PHP y MySQL, podemos poner como ejemplo una aplicacién como PHPMyAdmin que, independientemente de ser utilizada por un gran numero de usuarios, es realmente muy completa y detallada en cuanto a sus funcionalidades. 140 www redusers.com Obtener listados de bases de datos y tablas a través de PHP mysql_list_dbs Sintaxis: nysql_list_dbs (identificador) ; Identificador se refiere a un identificador de conexidn. Este argumento es op cional y si se opta por no con el servidor MySQL. Si no la encuentra mara a mysql_conneet() sin argumentos. Esta funcidn devuelve un puntero de resultado que contiene las bases disponibles en relacién con la actual conexién (identificador). icluirlo, la funcién asume la tiltima conexién abierta tentard crear una como si se lla- Antes de continuar con los ejemplos pertinentes, sera de suma utilidad explicar la funcién denominada mysql_ tablename. aysql_tablenane(lista, i); Esta fuuncién toma dos argumentos: el primero ¢s el puntero que apunta al primer elemento de la lista de bases de datos devuelta por la funcién mysql_lst_dbs, el se- gundo cs un indice para recorrer csa lista. Pucde resultar confuso, pero esta funcién -a pesar de su nombre- nos sirve tanto pa- ra recorter y obtener los nombres de las tablas de una lista, como asf también para obtener los nombres de las bases de datos de una lista, segiin se use mysql. list_dbs © mysql Uist_tables (explicada mas adelante). El siguiente cddigo merece una explicaci6n: <2php $res = mysql list dbs ($Link); Eid £4 via vespués DE INTERNET Lae bases de datos no son propiedad exclusiva de Internat: su émoite depende de qué proyectos queramos desarrollar con ellas, Tengamos presente este concepto a la hore de elegir el lugar fen donde guardar los datos: puede que no siempre ce precise utilizar las prestaciones de un ser- vidor, ya que existen otras opciones disponibles que podemos aprovechar. eee www redusers.com 141 4. Bue Y mYSOu. + La cercera linea guarda en $res el puntero correspondiente a la lista de las ba- ses de datos disponibles en el servidor de bases de datos MySQL, utilizando la conexién Stink (definida previamente). * La cuarta linea inicializa la variable $3. + La quinta linea se encarga de recorrer la lista de bases de datos utilizando la fune cién conocida como mysql_fetch_row. + La sesta linea, uelizando la funcién mysql tablename, muestra el nombre de la ba- se de datos correspondiente a la posicién $4 de la lista. + La octava linea incrementa $i para pasata la siguiente base de datos (si es que la hay). En lugar de mysql_feteh_row podrian haberse usado otras funciones como por ejem- plo mysql_fetch_object, como vemos a continuacién: CREACION DE BASES Y TABLAS | 142 wwiw.redusers.com Obtener listados de bases de datos y tablas a través de PHP Aqui, cada una de las veces que se llama a mysql_feteh_object se obsiene un cle- mento de la lista y se lo asigna a $i. De ese elemento (que se manipula como sise tratase de un objeto gracias a mysql_fetch_object) comamos la propicdad Databa~ se (que representa el nombre) y la mostramos. mysql_list_tables Es importante saber que hace lo mismo que mysql list_dbs, pero en ver de de- volver un puntero al primer elemento de una lista de bases de datos, lo devuel- ve al primer elemenco de una lista de cablas de una base de dacos. Aqut también podemos utilizar la funcién mysql tablename, que se encuentra ex- plicada detallamente en mysql_ist dbs. Sintaxis: nysql_list_tables (bast datos, identificader) ; * Base de datos, Corresponde al nombre de la base de datos de la cual queremos extraer los nombres de las tablas que necesitamos. + Identificador. Un identificador de conexién. Este argumento es opeional y si se opta por no incluirlo la funcién asume la iltima conexién abierta con el ser- vidor MySQL. Debemos saber que si no la encuentra, intentard crear una co- mo si se Ilamara a mysql_connect() sin argumentos. Para obtener més informacién acerca de los identificadores de conexién y de cémo conectarse al servidor, podremos enconcrar la funcién mysql_connect en el transcurso de este mismo capi Fjemplo: <2php sre si while ($i < mysql_fetch_row(Sres)) { echo mysql_tablenane (Sres, $i); echo * eee www redusers.com 13 4. PHY m¥saL. UTILIZACION DE MULTIPLES BASES DE DATOS Normalmente en nuestras aplicaciones accedemos a una base de datos por vez, pe- r0 PHP nos offece la posibilidad de hacerlo a varias al mismo tiempo. A continua- cién damos algunos comentarios acerca de este tema. Cuando hacerlo Hay ocasiones en las que quizas por temas de seguridad 0, simplemente, de légica de negocios, una empresa guarda sus datos en distintas bases. Por ejemplo, podria suceder que el sector de contaduria y el de recursos humanos almacenaran sus da- tos en distintos lugares y que un tercer sector precisara datos de los dos sectores an- teriores para realizar su tarea (por ejemplo, para liquidacién de sueldos y jornales) También, podefa darse el caso de dos o mis empresas distintas que erabajan en un acceder a datos de forma concurrente. proyecto en comtin y necesi En definiciva es una cuestién de disefio del sistema de una empresa (0 varias) y se da normalmente con mucha frecuencia, mas de la que uno supondria. Como hacerlo Acceder a dos o més bases de datos desde PHP es realmente muy sencillo e intuiti- ‘vo, si sabemos cémo acceder a una por vez. A continuacién vemos algunos ejemplos: {Qué conexiones quedan abiertas? 2 Se quiore crear la tabla t1, En el siguiente cédigo, Y suponiendo que la conexién con al servidor sea valida y la base se haya creado exitosa- ‘mente ,que error se comate? que falta? Desarrollo PHP + MySQL SQL en PHP Una vez creada la estructura de la base de datos [ya sea a través de PHP 0 de algun programa cliente de MySQL), y establecida una conexién, debernos empezar a interactuar con los datos para poder realizar consultas de seleccién y de modificacién (ingreso, baja yactualizacién de registros). He aqu un recorrido por las distintas, funciones que PHP nos ofre ce para cumplir con estas tareas. SERVICIO DE aTENCiOW aL LEcTOR: [email protected] ‘Cosultas de selecsn Selectién simple Consutas muttabla Subconsitas Recorrer as fas deve ‘de una consulta mysql fetoh_array iysql_feth_ sow iysql fetch object iysqlfetoh_assoe mysql fetch fea Movers entre regstras mysol_date_sek mero de regstros campos dewueltos inysql_oum_rows| insal_affecied_rons inysl_oum_fields Insert ‘Campos aitoinrementalos ysl nso id Delete Update ‘jempla préctico: ros pip Resumen Actividades 182 182 182 182 153 153 188 188 160 163 184 164 186 186 167 169 170 170 m1 1m 17 1% 187 188 5.801 EN PHP CONSULTAS DE SELECCION El lenguaje de consulta SQL es a la vez sintético y muy potente. Cuando quere~ mos realizar consultas de seleccién (esto es recuperar registros de una o més ta~ blas) podemos recuperar millones de registros con tan sélo una linea de cédigo. A continuacién, nos dedicaremos a analizar las distintas posibilidades que exis- ten para extraer datos y luego trabajar con ellos. Seleccién simple Con el término seleccién simple hacemos referencia a consultas a una sola ta- bla por vee. Este tipo de consultas no son frecuentemente usilizadas en aquellos emas que poseen un disefio complejo. SELECT * FROM TABLAT; Consultas multitabla Consisten en realizar consuleas que implican varias tablas a la vez, esto significa que se recuperan datos de varias fuentes. Son bastante comunes y més adelante, en el transcurso de este mismo capitulo, ve- remos en forma detallada cémo solucionar el problema que representa tener dos 0 mas columnas de varias tablas diferentes que poscen el mismo nombre, SELECT * FROM TABLA1, TABLAZ HERE TABLAI.A = TABLA2. Subconsultas Las subconsultas se implementaron en MySQL a partir de la versién 4.1. SELECT * FRO TABLAT WHERE TABLAT.A = (SELECT B FROM TABLA2 WHERE C > 3); J/compara todos los valores de A con los valores que Jidevuelve 1a segunda consulta. Si la versién de MySQL que poscemos no incluye soporte para subconsultas, no hay de qué preocuparse: son perfectamente reemplazables, s6lo tendremos que realizar, en lugar de una consulta, dos 0 més. 182 www redusers.com Recorrer las filas devueltas de una consulta RECORRER LAS FILAS DEVUELTAS DE UNA CONSULTA Al realizar una consulta a una basc de datos, normalmente obtendremos un conjunto de registros. PHP permite almacenarlos en forma de objetos 0, también, de arrays (matrices) con el objetivo de acceder a ellos utilizando indices ya sea numéricos o al- fanuméricos. Haremos a continuacién un recorrido por las distineas posibilidades. mysql_fetch_array Debemos saber que esta funcién nos permite recuperar Alas y acceder a los valo- res de cada campo como si de una matriz se tracase Su sintaxis es la siguiente: nysql_fetch_array(id consulta, tipo_indice) ; id_consulta: se envia una consulta al servidor (con mysql_query 0 con mysql_db_ query, por ejemplo) de bases de datos. El resultado devuelto por al- guna de estas funciones se denomina id_consulta. Para recuperar los datos devueltos por la consulta (si es que los hay) una de las fun ciones que se pucde utilizar cs mysql_fetch_array a la cual sc le pasa como argumen- (o el identificador de la consulta (en este caso id_consulta). Cada ver. que se llama a mysgl_fetch_array, el puntero interno avanza una fila, La primera vez que se la lama, ésta se posiciona en la primera fila (siempre y cuando exista una primera fila). En el ejemplo que podemos observar en la signiente pagi- na, cada vez que se llama a la funcién mysql fetch_array, se asigna a la matriz $fila los campos resultantes de la consulta $sql. Cuando no haya més fas, la macriz, S$fila comard el valor FALSE y el bucle WHILE cermina Fld cepurar EL LencuaJe Es importante verificar de manera detallada la sintaxis de lac instrucciones SQL que utiliza mos en las aplicaciones, puesto que es un error comin referenciar en nuestras consultas nombres de tablas o campos inexistentes. Puede ser de ayuda probar las consultas en otras programas, como PHPMyAdmin o MySQLFront, we redusers.com 153 S.SOL EN PHP tipo_indice: csta funcién trata a cada fila como si fuera una matriz. Este argumen- to permite definir el tipo de indice. Las opciones son MYSQL_ASSOC, MYSQL_ NUM, y MYSQL_BOTH. Este argumento es opcional y si se opta por no incluir- lo se asume por defecto MYSQL_ASSOC. Debe escribirse con letras maytisculas. MysQl_Assoc Se utiliza el nombre del campo (columna) como indice. Por ejemplo: MATRIZ DEVUELTA POR MYSQL_FETCH_ARRAY 184 ive redusers.com esas Recorrer las filas devueltas de una consulta Los dos ejemplos anteriores hacen lo mismo. Como podemos observar, los nombres de campos son sensibles a maytisculas y mi rmisculas: no ¢s lo mismo $fila[“eampol”] que $fila{“Campol”]. La forma correc «a para escribir los nombres de los campos dependent exclusivamnce de «mo los ha- yamos definido al momento de crear las tablas. MYSQL_NUM Se utiliza el ntimero del campo (columna) como indice, segiin el orden dado en la consulea SQL. El indice 0 cortesponde al primer campo. Por ejemplo: Gas we redusers.com 155 S.SOL EN PHP Es importamte saber si se seleccionan todos los campos, se tendr en cuenta el or den dado en la creacién de la tabla, Por ejemplo: Es lo mismo poner $fila{0] que poner $fila[“0”) o $fila{‘0’). a i ium .6 3 c p ja la posibilidad de utilizar el ntimero o el nombre del cam- po (columna) como indice. Es como utilizar MYSQL_ASSOC y MYSQL_NUM. al mismo tiempo. Observemos el ejemplo: 156 ive redusers.com esas Recorrer las filas devueltas de una consulta Los nombres de campos son sensibles a maytisculas y mintisculas: no es lo mis- mo $fila[“campot”] que $fila[*Campot”]. La forma correcta para escribir los, nombres de los campos dependeri de cémo los definimos al crear las tablas. Si consultamos sobre mis de una tabla, y por lo menos dos de los campos recupe- rados tienen el mismo nombre, sélo tendré validez Ia giltima columna. Algunos cjemplos de esta situacién y las posibles soluciones, pueden encontrarse en mysql_fecth_assoc, en este capitulo. MYSQL_FETCH_ARRAY Y REGISTROS DEVUELTOS. Gas we redusers.com 187 5.801 EN PHP mysql_fetch_row Esta funcién es como utilizar mysql_fetch_array con el argumento tipo indice igual a MYSQL_NUM, es decir que toma el ntimero del campo (columna) como indice, segiin el orden dado en la consulta SQL. Por ejemplo: ”; echo $f[2]; //muestra c echo “
! } > La llamada a mysql_fetch_row devuelve la préxima fila del resultado (si es que hay una préxima) 0 falso si no quedan mas fila. Para mds informacin ver mysql_fetch_array y MYSQL_NUM. mysql_fetch_object Esta funcién se encarga de tracar a cada fila como si fuera un objeto, y a cada campo como si fuera una propiedad del objeto fila mysql fetch object(id consulta, tipo indice); id_consulta: se envia una consulta al servidor (con mysql_query 0 con mysql_db_ query, por ejemplo) de bases de datos. Debemos saber que el resultado devuelto por alguna de estas Funciones se denomina id_consutta Para recuperar los datos devueltos por la consulta (si es que los hay) una de las Fun- ciones que se puede wtlizar es mysql_fetch_object a la cual se le pasa como argu- mento el identificador de la consulta (en este caso id_consulta). tipo_indice: cste argumento permite definir cl tipo de indice. 158 www redusers.com Recorrer las filas devueltas de una consulta Las opciones disponibles para este argumento son MYSQL_ASSOC, MYSQL_ NUM, y MYSQL_BOTH. Es opcional y si elegimos no ineluirlo se asume por de- fecto MYSQL_ASSOC. Deberemos escribirlo con letras maytisculas. Para mayor informacién, recomendamos ver mysql fetch_array. Por ejemplo, si tenemos la tabla: Nombre Tata: A osto Nombre Apaido | Waconaidad | Estado cil oo ‘an Naren aw casato| 04 nani Grows —_| Artin Cassio 6 Etvadotijea | Waco ‘Soto 005 eis Satonis | Livan ‘Sot Podriamos acceder a los valores de cada campo de la siguiente forma: filal - >codigo = 001 fila2 - snombre_y_apellido = Emanuel Ginobili fila3 - >codigo = 005 fila2 - »nacionalidad = Argentina En PHP seria: Gas we redusers.com 159 5.801 EN PHP Los nombres de campos son sensibles a maytisculas y mintisculas: no es lo mismo $fila[“campol”] que $fila{“Campol”]. La forma correcta para escribir los nombres dc los campos dependeri de cémo los definimos cuando creamos las tablas. Si consultamos sobre mis de una tabla, y por lo menos dos de los campos recupera- dos tienen el mismo nombre, sélo tendré valides la tltima columna. Ejemplos de es- to y posibles soluciones pueden encontrarse en mysql_fecth_assoc, en este capitulo. mysql_fetch_assoc Esta funcién se comportard del mismo modo que al utilizar la denominada mysql_fetch_array con el argumento tipo_indice igual a MYSQL_ASSOC, es decir que toma ¢l nombre del campo (columna) como indice. Si realizamos una consulta sobre més de una tabla y por lo menos dos de los cam- pos recuperados tienen el mismo nombre, s6lo tendré validee la tilima columna. Por ejemplo, si tenemos las siguientes tablas: Noni Tta WBLAL Cent Nombre ad 1 Homer 38 4 Mage a 5 Us 7 6 ar a ome Tata Cig Nonbre attares 1 Phila 0000 4 New or 000000 5 Fhoen 2100000 @ ‘seat e000 "; 160 wn redusers.com Recorrer las filas devueltas de una consulta Para poder acceder a dos columnas 0 més que posean el mismo nombre, contamos con por lo menos dos posbilidades, ral como podemos observar en la siguiente pagina: INDICE DE LAS COLUMNAS Gas we redusers.com 161 S.SOL EN PHP ‘+ Usar indices numéricos, como se explicé en mysql_fetch_row. + Usar alias en las consultas. Por ejemplo: Los nombres de campos son sensibles a mayvsculas y mindsculas: no es lo mis- mo escribir $fila[“campol”] que $fila[“Campo1”]. La forma correcta para es- cribir los nombres de los campos dependeri exclusivamene de la manera en c6- mo los hayamos definido al momento de crear las eablas. Si necesitamos trabajar s6lo con indices numéricos o con indices numéricos y aso- iativos, utilizaremos la funcién mysql_fetch_row o bien, mysql_fetch_array. ELECCIONES 162 ive redusers.com esas Recorrer las filas devueltas de una consulta mysql_fetch_field Esta funcién no recupera los datos contenidos en una columna, pero permite ob- tener informacién acerca de la estructura del campo y trabajar con él como si fuera un objeto, de la siguiente forma: ‘Scampo->nane; J/devuelve el nonbre de 1a columa Cada vez que se llama a la funcién denominada mysql fetch field, ésta devuelve el siguiente campo (que figura en la instruccién SQL). name es sélo una propie~ dad disponible, el listado completo es el siguience: ame ore de a calurma tate rare de ata a aque prez colina max_legt longtud mina de aclu pl 4 sila eotann no conte un vers, iw 0 wiran_tey 1 sila cena es cle pina sno O nique te 4 sila cotana es cave ica si 100 uliple_key 1 sila coma es cle no una, $100 rumetc 4s lncoumns es muméica sno 0 ob 1 sila eon en 8108, to 0 pe loo deo dea colmna niga 1 sila eon e usa. sn 0 ze 41s lncolunna es eel. sno Es muy importante escribir los nombres de las propiedades en minsculas. Encontraremos mis informacién sobre tipos de dacos (n . blob, y otros) en el Capitulo 3; e informacién sobre primary_key, unique key, multiple key, nombres de columnas, nombres de tablas y demas, en el Capitulo 2. Forma de uso: nane.“
"; Ges ‘weweeiredusers.com 163 5.801 EN PHP echo Scampo->table.‘“
"; echo $campo->type.
"; t 1/ €n la primera llamada a mysql_fetch_field se 1/ mostraran las propiedades de 1a colunna a, en la J) segunda de b, y en la tercera de la c. > MOVERSE ENTRE REGISTROS Cuando usamos las funciones que nos provee PHP destinadas a recorrer las fi- las devuelcas por una instruccién SELECT (esto es, mysql_fetch_array, mysql _fetch_object, mysql_fetch_assoc, mysql_fetch_row), obscrvamos que ante cada Hamada a estas funciones, se avanza al siguiente registro (si es que lo hay). Para volver hacia atrés 0 bien para posicionarnos en algiin registro especifico cxiste la funcién mysql_data_seek. mysql_data_seek Su sintaxis es: nysql_data_seek(id consulta, nusero_fila); id_consulta: se envia una consulta al servidor de bases de datos (con mysql- _query 0 con mysql_db_ query, por ejemplo). El resultado devuelto por alguna de estas funciones se denomina id_consulta. numero_fila: se encarga de indicar el niimero de fila a la cual queremos acceder. A [a primera fila corresponde el valor 0. Luego de Hamar a la funcidn, la primera llamada a cualquier funcién para recorrer las filas devueltas (mysql_fetch_array, mysql_fetch_object, mysql_fetch_assoc, mysql_fetch_row) devolvers la fila ntimero numero fila. 164 www redusers.com Moverse entre registros Por ejemplo, si enemos a siguiente tabla: None Tb BLA cod toms | 1 HP A Pe 3 fy 4 bon Devuelve verdadero si tiene éxito, y falso si ocurrié algiin error (por ejemplo, si el niimero de fila mumero_fila no existe). Gas we redusers.com 165 5.801 EN PHP NUMERO DE REGISTROS Y CAMPOS DEVUELTOS PHP prove funciones para obtener el niimero de filas y campos devueltos nego de una consulta, Veremos una descripcién de cada una de ellas mysql_num_rows Esta funcidn sélo sirve p. las de un resultado. Su rnysql_nun_rows(id_consulta) ; id_consulta: se envia_una consulta al servidor (con mysql_query © con mysql_db_ query, por ejemplo) de bases de datos. El resultado devuelto por al- guna de estas funciones se denomina id_consulta. Por ejemplo: Fy manTener Los DATOS EN MEMORIA ‘mysql data_seek permite movernas entre regictres. Adernds, puede ser dtl para no lamar mas de na vez @ una de las funciones mysql fetch array, mysql fetch object, mysql fetch assoc o mysql_ fetch_zow con la misma consulta ala base de datos: si mantiene la variable id_consulta, mantiene los datos devueltos por ella, pudiendo acceder a ellos con mysql data seek o mysal fetch. 166 www redusers.com Numero de registros y campos devueltos bien podriamos obrener el mismo resultado realizando una consulta como: select count(*) fron tabla: en muchos casos nos la ahorrarfamos utilizando mysql_num_rows. mysql_affected_rows Esta funcidn sdlo sirve para sencencias tipo INSERT, UPDATE 0 DELETE. De- vwelve el niimero de filas involucradas en Ja ultima instruccién SQL (siempre y cuando sean INSERT, UPDATE 0 DELETE). En el cédigo que se encuentra debajo podemos observar la sintaxis de esta funcién, nysql_affected_rows(identificador); Identificador: un identificador de conexién, Este argumento es opcional y si se opta por no incluirlo, la funcién intencard enconcrar una conexién abierta al ser- vidor MySQL. Para obtener mayor informacién acerca de los identificadores de conexién y cémo conectarse al servidor, podremos consultar mysql_connect, que sc encuentra explicado cn cl Capitulo 4. Por ejemplo, si tenemos la siguiente tabla: Nore ABLAL ods mons 4 aman 2 ab 3 owtio 4 Gattela 5 fr EG ccua. usar? Es importante caber que la mayoria de las veces la diferencia entre las funciones denominadas ‘mysql fetch_array, mysal fetch object, mysql fetch assoc y mysql fetch_row es précticarnente intima, y 68 recomionda usar la quo mas cémoda nes reculte, aunque mysql fetch array pusde suplantar el funcionamiento de casi todas las demas. Ges ‘weweeiredusers.com 167 S.SOL EN PHP Sila tiltima senrencia fue un DELETE sin ckiusula WHERE, esta funcién deberia de- volver el riimero total de registro que habia en la tabla; sin embargo, devuelve cero. wwiw.redusers.com Numero de registros mysql_num_fields Esta Funcién, en lugar de devolver el niimero de filas devueltas por la consulta como hhace mysql_num_rows, o modificadas como hace mysql_affected_rows, nos petmi- ce obtener el miimeto de campos (columnas) devueltos por la consulta, Su sincaxis es: id_consulta: Se envia una consulta al servidor (con mysql_query o con mysql_db_ ‘query, por ejemplo) de bases de datos. El resultado devuelto por alguna de estas fun= ciones se denomina id_consutta. Por ejemplo: Gas we redusers.com 169 5.801 EN PHP INSERT Podemos realizar ingresos en una tabla a través de las funciones mysql_query 0 mysql_db_query, pero PHP nos brinda una funcién que puede ser muy titi cuan- do se trabaja con campos de auto incremento. Campos autoincrementables MySQL nos permite insertar registros en una tabla evitando de forma automatica que un campo come valores duplicados. Estos campos se llaman autoineremenca bles y se definen al momento de crear una tabla. Por ejemplo: Luego vamos a definir el archivo crear_estructura.php, que nos va a permitirtras- ladar a una base de datos el disefio visto anteriormente. Si no existe una base de datos llamada “libros” en el servidor, este archivo la creara Si ya existe ~o si se ejecuta este archivo dos veces-, se le pediré que modifique la va- riable $nombre_base, o sea que se creari otra base de datos (si optamos por esto Glkimo el nuevo nombre de la base se debers actuslizar en el archivo config.inc) Ges ‘weweeiredusers.com 175,

También podría gustarte