PHP + Mysql Desde 0

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 216

Teoría y práctica de la creación de bases de datos +


Instalación y gestión de MySQL + Revisión de sentencias
para consultas, inserción y actualización + Control de
errores y administración de datos

RU
1I
+

RedUSERS
.
TITULO: PHP + l\IlySQL desde cero
AUTOR: Francisco l\Ilinera
COLECCIÓN: Desde Cero
FORlviATO: 19 x 15 cm
PÁGINAS: 192

Copyright © MMXIV. Es una publicación de Fox Andina en coedición con DÁLAGA S.A. Hecho el depósito que

marca la ley 11723. Todos los derechos reservados, Esta publicación no puede ser reproducida ni en todo
ni en parte, por ningún medio actual o futuro sin el permiso previo y por escrito de Fox Andina S.A. Su infrac-
ción está penada por las leyes 11723 y 25446. La editorial no asume responsabilidad alguna por cualquier
consecuencia derivada de la fabricación, funcionamiento y/o utilización de los servicios y productos que se
describen y/o analizan. Todas las marcas mencionadas en este libro son propiedad exclusiva de sus respec-
tivos dueños. Impreso en Argentina. Libro de edición argentina. Primera impresión realizada en sevagraf,
Costa Rica 5226, Grand Bourg, Malvinas Argentinas, Pcia. de Buenos Aires en VIl, MMXIV.

ISBN 978-987-1949-66-3

Minera, Francisco
PHP + IvlySQL desde cero.
la ed. - Ciudad Autónoma de Buenos Aires: Fox Andina;. Buenos Aires: Dalasa,
w • 2014.

192 p. ; 19x15 cm. - (Desde cero; 37)

ISBN 978-987-1949-66-3

1. Informática, I. Título
CDD 005.3

» www.redusers .com
PHP T MYSQL DESDE CERO 3

Prólogo al contenido
Tanto el lenguaje de programación como el gestor de bases
de datos están posicionados en el mercado desde hace largo
tiempo. Podemos analizar algunos hechos respecto a ellos.
En relación con las modificaciones, han sido positivas para
los desarrolladores. Las nuevas versiones tanto de PHP como
de MySQL han sido aceptadas de muy buena manera, y las
mejoras incluidas han dado respuestas a los pedidos de la
gran comunidad de usuarios.
Otro punto es el continuo crecimiento del número de pro-
gramadores que optan por estas herramientas. Por un lado,
están los que, sin experiencia previa, encuentran que pueden
comenzar a desarrollar aplicaciones funcionales, incluso du-
rante el proceso de aprendizaje. Por otro lado, quienes pro-
vienen de otros lenguajes o tecnologías de desarrollo ven que
tanto PHP COlTIO MySQL les permiten elaborar soluciones rápi-
das, estables, de bajo costo y fácilmente actualizables.
Una de las virtudes del lenguaje (su facilidad de aprendiza-
je) deriva en algo que podría verse como negativo: hay muchas
personas que programan en PHP. Si bien la competencia es
algo que beneficia tanto a empleados como a empleadores, al
haber tanta oferta, las condiciones de los empleadores tienen
mayor preponderancia. Desde un lado positivo, la competencia
genera que los programadores se esfuercen por ser mejores, y
esto a su vez deriva en mejores condiciones laborales.
Un último punto está relacionado con la visión de algunas
empresas para con el lenguaje, que, ya sea por publicidad,
falta de conocimiento o soporte técnico, prefieren apostar a
alternativas como .Net o Java. Esperamos que, luego de leer
este manual, puedan poner en práctica sus conocimientos
y sacar sus propias conclusiones.

www.redusers.com «
4 [o;j3;;;3 PRELIMINARES

Ellibro de un vistazo
Conocer a fondo todas las características y posibilidades que un lenguaje
de programación como PHP nos brinda es una tarea qtle requiere paciencia y
aplicación por parte del desarrollador. A lo largo de los siguientes capitulos
íntentaremos ír asimilando, poco a poco, las técnicas y los métodos necesa-
rios para sacar provecho de la potencia del lenguaje.

Analizaremos las razones


de esta afirmación y por qué MySQL
En este capítulo analizaremos es el complemento ideal de PHP.
información relevante relacionada con
el lenguaje de programación PHP: cómo
debemos adquirirlo, las versiones y sus
principales características,
En este capítulo brindaremos
información relevante sobre las
distintas alternativas que nos ofrece
el lenguaje de programación PHP para
En este capítulo aprenderemos lo que acceder y definir estructuras de bases
es una base de datos, conoceremos de datos utilizando el motor MySQL.
su estructura principal para almacenar
información y haremos una introducción a
lo que necesitamos para utilizar MySQL.

Una vez creada la base de datos


y establecida una conexión,
comenzaremos a interactuar con
Para poner en práctica los conceptos los datos para realizar consultas de
vistos en el capítulo anterior, elegimos selección y de modiñcación, En este
una base de datos muy popular en este capítulo encontraremos la información
momento y con mucho futuro: MySQL. relacionada con este proceso.

» www.redusers .com
PHP + MYSQL DESDE CERO t'l'id.fi 5

Tanto PHP como l\1ySQL nos brindan


funciones y opciones de configuración Mientras desarrollamos aplicaciones,
que nos permitirán tener un acceso cumplimos múltiples roles, Pero, cuando
controlado y un entendimiento de trabajamos en un sistema real, las tareas
los errores que puedan surgir en se vuelven específicas, En este capítulo,
nuestras aplicaciones, En este capítulo entenderemos la naturaleza y el rol de los
aplicaremos estas herramientas, administradores de bases de datos,

A lo largo de este manual, podrá encontrar una serie de recuadros que le brindarán información
complementaria: curiosidades, tIl1COS, ideas y consejos sobre los temas tratados. Para que pueda
distinguirlos
~ en forma más sencilla, cada recuadro está identificado con diferentes iconos:
,

CURIOSIDADES ATENCIÓN DATOS ÚTILES smos


E IDEAS y NOVEDADES \VEB

www.reduaers.com «
6 PRELIMINARES

Contenido dellibro
Prólogo 3 Licencia de oso 41
El libro de un vistazo...................................... 4 Resumen 41

Información complementaria 5 Actividades 42

Introducción 10

lVlySQL
PHP Tipos de tablas 44
Características de PHP 12 IS •.l\.l\'I 4·4

PHP 5 13 I\fI)rIS•.l\.M 4·4

Qué versión de PHP utilizar 16 I\fIERGE 46

Extensiones en PHP.. ................................... 16 HEAP 47

Ventaja de trabajar con extensiones/ InnoDB 48


bíbltotecas 17 BerkeleyDB 49
Extensiones incorporadas 18 En qué casos usar cada tabla 50

Bases de datos 19 Tipos de datos 50


Portabilidad 21 Cadenas de caracteres 50

Resumen 23 Numértcos 53

Actividades 24 Fecha y hora 56

Referencia de funciones 59

Typeff) [VARCHAR •
LengthNalues1 VARCHAR
Bases de datos Collation
TINYINT
TeXT
Qué es una base de datos 26 Attributes DATE
SMALLINT
Arquitectura de bases de datos 26 Null MEDIUMINT
Default2 INT
Modelo de datos relacional. 27 BIGINT
Extra FLOAT
Base de datos relacional. 27 DOUBLE
DECIMAL
Tipos de relaciones entre. tablas 34 DATETIME
TlMESTA'oAP
Gestor de base de datos:MySQL 40
Por qué iVlySQL 40
- TIME

Obtener iVlySQL 40

» www.redusers .com
PHP + MYSQL DESDE CERO 7

Funciones para trabajar


con cadenas de caracteres 60 Utilizar SQL en PHP
Funciones para trabajar Consultas de selección............................... 128

con campos numéricos 73 Selección simple 128

Funciones para trabajar Consultas multitabla 128


con fecha y hora 81 Subconsultas 129
Funciones de conversión 93 Recorrer las filas devueltas
Funciones agregadas o estadísticas 94 de una consulta 129
Operadores de comparación 95 mysql_fetch_array 129
Operadores lógicos 96 mysql_fetch_ro\y 134
El uso del monitor de IvrySQL 98 mysql_fetch_ object 135
Resumen 101 mysql_fetch_assoc 137
Actividades 102 mysql_fetch_field 140
Moverse entre registros., ... ...................... 142
mysql_data_see.k 142
Número de registros y campos devueltos ... 144
PHPY MYSQL mysql_num_ro\vs 144
Conectar PHP con IvlySQL 104 mysqljañected j-ows 145
mysql, connect 104 mysql_nuID_fields 147
mysql_pconnect 107 lnsert 148
Ejecución de sentencias 108 Campos autoincrementables 148
Creación de base de datos Jnysql_inselot_id 149
a través de PHP 110 Delete. ......................................................... 150
Selección de una base de datos 113
Organize ... Inelude in libraoy • Shar_with • Bum
Creación de tablas a través de PHP ....... 114
Neme
..t favorites
Obtener listados de bases de datos _ Oesktop autos
y tablas a través de PHP 116 ~ Oownloads ejemplos
Iil Oropbox libros
Uso de múltiples bases ..,¡ R«ent Places mysql
de datos en una aplicación 119 performanCt_SChEma
.,... libraries test
Cerrar conexión con la base de datos 121 Ji Documents t..J Frank.pid

Ejemplo práctico: autos.php 123 Jo Music L.] ib_logfil.o


líii.íl Ptetures W ib_logfilel
Resumen 125 Videos U ibdat.l
L.J mysql·bin.ooooot
Actividades 126

www.redusers.com «
8 ttf1#¡f, PRELIMINARES

Update 152 Manejo de excepciones 191


Ejemplo práctico: libros.php 152 Resumen 191
Resumen 167 Actividades 192
Actividades 168

*
Manejo de errores
Administración de bases de datos
El rol del administrador
O~"IB

Reportes de ellor en PHP.. .. 170 El rol del usuario


errorjeportmg 170 Sistema de privilegios
display _errors 173 Tabla user
display _stal·tup _errors 174 Tabla host
log_ errors 175 Tabla db
error _log 176 Tablas tables_priv y columnsJlriv

log_errors_max_leu 177 Jerarquías de acceso


ignore_ repeated _errors 177 Comandos grant y revoke
ignore_ repeated _source 180 Gestión de privilegios con ['iSERT
rrack errors 180 Gestión de prívüegíos con SELECT
btml eITOI'S 181 Gestión de prtvtlegtos con t,"PDATE
errorjprependjstríng 183 Gestión de prtvüegros con DELETE
error _appeud _string 184 Gestión de usuarios
warn jilus _overloadiug 184 Baja de usuarios
mysqjerror 184 mysql, changejuser
mysq'[ errno 186 Listar todos los usuarios mediante una consulta
regtster globals 186 Resumen
perror 191 Actividades

'ii C:\windo\'ls\system32\cmd.exe

» www.redusers .com
E:\-:\l.""ESTROSITIO PODR.\ ACCEDER A L-:XAPRE''IE'''DIGITAL DE CADA LIBRO y TA.,mIÉ~
OBTE:\""ER,DE~IA."""ER~GR~ TLTIA, L-:XCAPÍTL"LOE:\\"ERSIÓ:\""PDF, EL SL,)L~O CO~IPLETO
E ThLÁGE:\""ES_-L'IPLLID_o\.SDET.o\.PAy CO:\lR~T.o\.PA.

RedUSERS • redusers.com
Nuestros libros incluyen guías visuales, explicaciones paso a paso, recuadros
complementarios, ejercicios y todos los elementos necesarios para asegurar
un aprendizaje exitoso.

»OCA

www~ r .eDC
10 PRELIMINARES

Introducción
El objetivo principal de este libro es introducir al lector
en el desarrollo de aplicaciones web, tomando como base dos
de las herramientas más populares de la actualidad: el lenguaje
de programación PHP y la base de datos relacional MySQL.
Una enorme cantidad de sitios web utilizan estas tecnolo-
gías, algo muy motivante para aquellos estudiantes de siste-
mas o simplemente aficionados que quieran insertarse en el
mercado y que necesiten hacerlo a través de tecnologías pro-
badamente aceptadas.
PHP y l\1ySQL brindan una alternativa más a quienes quie-
ren desarrollar soluciones altamente sofisticadas orientadas a
todo tipo de emprendimientos, desde los más simples a los más
complejos. Este manual tiene la finalidad de dar algunas res-
puestas que a su vez lleven a nuevas preguntas, es decir, dispa-
radores que obliguen al lector a continuar permanentemente la
búsqueda de nuevos niveles de especialización.
Los requisitos para el lector son mínimos: tener experiencia
en el uso de algún sistema operativo y una idea básica acerca
del funcionamiento de la arquitectura cliente/servidor; esto im-
plica realizar una petición a un servidor web a través de un na-
vegador y obtener una respuesta adecuada.
En definitiva, tanto PHP como l\1ySQL están transitando un ca-
mino iniciado hace ya mucho tiempo, y los resultados son real-
mente beneficiosos para todos los que de alguna manera están
relacionados con el mundo del desarrollo de aplicaciones web.

» www.redusers .com
PHP

En este capítulo veremos algunos puntos fundamentales sobre


el lenguaje de programación PHP: cómo adquirirlo, sus versiones,
sus principales características y demás temas que servirán
de base para los capítulos siguientes.

..Características de PHP 12 Bases de datos 19


PO:P 5 13
Qué versión de PHP utilizar 16 .. Portabilidad 21

..Extensiones en PHP 16 ..Resumen 23


Ventaja ele trabajar
con exteusioues/bibliotecas 17 .. Actividades 24
Extensiones incorporadas 18
12 1.PHP

Características de PHP
PHP, acrónimo de PHP Hypertext Preprocessor ,es un lenguaje de
programación que se utiliza principalmente para el desarrollo de sitios
web, pero que para muchos es lln lenguaje de propósito general, y el uso
que se le dé dependerá en parte de lo que necesite el programador.
Entre las características que hacen de PHP un lenguaje poplllar y muy
poderoso para desarrollar aplicaciones, podemos citar las siguientes:

• Programación de páginas dinámicas en servidores.


• Programación de aplicaciones de escritorio con GTK (pHPGTK).
• Soporte para trabajar con múltiples bases de datos.
• Soporte para múltiples plataformas.
• Soporte para múltiples servidores.
• Facilidad de aprendizaje.
• Portabilidad de código entre diferentes plataformas.
• Total libertad para distribuir las aplicaciones.

Para obtener una copia, deberemos ingresar a su sitio web, www.php.net/


downloads , y seleccionar la opción acorde con nuestro sistema operativo.

,.,,...,.._._ l' ~.". ,~ ~ ~,,""P~"""I r,...~,......,."........~........ ~II'fI. I'....I.. ~ ,


.I'!"'_'''~'''' , ~ Al ., ,"' """' _..., ••• ~ t ~,t,,,,,,..,tI, CIIIft • 1 .."~,...

tHl\11 AIlIdil""MrIl' ... (...... t4 .. n,! 1-f 11'. tIIflO'l(rlC).,.'


....."'~c""'_''''''_.'·.~!''I''''''
~

• A ~.1H ..........
. "... _t1Ibo.· ~II ,,...,
......

","","-l .....
,t..........,,.,
'., .....I...~.p'''''''''-... 1'~"""'~"""."'P"C'",""""'~~",ot.. tWP' '''''t"WC''.''N
..u~" .,IIU_..-dIM. ....:. -ni

Figura 1. Área de descargas en el sitio web de PHP.

» www.redusers .com
PHP + MYSQL DESDE CERO 13

PHP5
PHP 5 experimentó cambios importantes que revolucionaron el lenguaje.
La primera versión de PHP 5 se liberó en junio de 2003, pero la primera con-
siderada estable es la de julio de 2004. En 2014, contamos con la versión PHP
5.5.10, de la que a continuación destacaremos algunas de sus características.

Generalídades
• Podemos ver las últimas actualizaciones en:
http://php.net/ChangeLog-5.php#5.5.1 O.
• En cuanto a la programación orientada a objetos, PHP 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 (gestión de información):
https://,viki.php.net/internals/,vindows/libs/libxmI2 .
• Mejoras en el manejo de LDAP (manejo de directorios):
https://wiki.php.net/internals/,vindows/libs/ldap .
• Mejoras sobre el motor Zend (desempeño del lenguaje):
http://zend.comlen/company/community/php .

Otras de las características principales que debemos tener en cuenta


son el acceso a las bases de datos y las herramientas disponibles para ello.

Para obtener material adicional gratuito, ingrese a la sección Publicaciones/Libros dentro


de http://premium.redusers.com .Allí encontrará todos nuestros títulos y podrá acceder
a contenido extra de cada uno, como sitios web relacionados, programas recomendados,
ejemplos utilizados por el autor, apéndices, archivos editables o de código fuente. Todo
esto ayudará a comprender mejor los conceptos desarrollados en la obra.

www.reduaers.com «
14 [!:':¡ ~i¡;3
1.PHP

SQLite
SQLite es una libreri a desarrollada en e que implementa un motor
de base de datos accesible por varios lenguajes: PHP, PYTHON, e, etc.
No permite que múltiples usuarios ingresen simultáneamente en modo
escritura a la base de datos; si esto sucede, el mecanismo de bloqueo la in-
moviliza por completo. Por eso, esta librería está especialmente indicada
cuando se requiera una gran rapidez en las consultas y sea suficiente qlle
un único usuario realice modificaciones. Es entre dos y tres veces más rápida
que bases de datos como MySQL o PostgreSQL, ya que no es un servidor, sino
una base de datos de escritorio, por lo que el acceso a los datos es más direc-
to, entre otras razones. Brinda soporte para un máximo de 2 terabytes de
datos. Además, es un software libre, y podremos descargarlo y obtener más
información en su sitio oficial: www.hwaci.com/sw/sqlíte.

_._ -_- .- - _"" -~-


..... ,,,. ...... -
...--.
._ ""_ ... ~ .
_--
1 • ~,,~.
""'........__ ..._,,~ .. a ' ....
4'"

- e n UIlIIU

_ ..-
fII&I ............. .., ....... .c~ .. ~....".,.-

8I00rnb«g ............... 1 ......... q

NOKJA . -..- ....


;iW .... __ ~ s ..... ,...,n ... _- •• -.-

mozilla
~ Senlle\J
--- I!:!b ..........- ....... __ .

Figura 2. Página oficial de SQLite; podemos observar los diferentes patrocinadores.

MySQLi
IvlySQLi(con i de ímproved, mejorado) es 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 ofrece mayor velocidad, en algunas operaciones
es hasta cuarenta veces más rápida que la extensión MySQL anterior.

» www.redusers .com
PHP T MYSQL DESDE CERO [!JOOj3;fi 15

En la actualidad, se está trabajando para que la migración desde la ex-


tensión de MySQL a MySQLi sea lo más sencilla posible. Esto se logra, entre
otras cosas, manteniendo las funciones y sus nombres lo más parecidos
que se pueda en ambas extensiones. Si observamos códigos programados
con las dos extensiones, no notaremos, en general, grandes diferencias.
Podemos encontrar una explicación acerca de cómo instalar la extensión
MySQLi en: www.php.net/mysqli. Para tener más clara la diferencia entre
estas librerías, en la siguiente tabla veremos sus características.
,
,

DIFERENCIAS ENTRE SQLlTE y MYSQL

T CARACTERíSTICA T SQLITE T MYSQL

Uso Puede funcionar perfectamente Funciona con sitios


para sitios de tráfico bajo-medio. de gran envergadura.

Acceso Es monousuario, no permite Permite múltiples consultas y


concurrencia de conexiones. modificaciones al mismo tiempo.

Tipo 1:\0 es una base de datos, sino un Gestor de base de datos.


fichero con datos organizados.

Datos No tiene tipos de datos. Vatios tipos de datos.

Usuarios No hay gestión de usuarios. Posibilidad de gestionar usuarios


con diferentes niveles de acceso.

Seguridad La seguridad se basa en el Gestión propia de seguridad.


sistema de permisos de ficheros
establecido por Unix/Linux,

Facilidad Para hacer una copia o migrar Debe realizar el proceso


la aplicación, basta con mover de backup y restauración como
de sitio el fichero. gestor de base de datos.

Tabla 1. Comparación entre librerías de almacenamiento de datos.

www.redusers.com «
16 ttfj3¡fi 1.PHP

Qué versión de PHP utilizar


Si nuestra aplicación ya está funcionando y cumple con los propósitos,
no hay razón para migrar a otra versión de PHP. Ahora bien, si queremos
desarrollar un sitio desde cero, lo que conviene es utilizar la versión re-
ciente del lenguaje. Quizás no aprovechemos todas las mejoras ni todas
sus características, pero si quisiéramos hacerlo 110tendríamos que actua-
lizar a la versión más reciente, ni reescribir el código, ni entrar e11temas
complejos, como es la compatibilidad del lenguaje entre versiones.
Aunque a veces se diga que esta decisión depende de los requerimien-
tos del desarrollador, PHP 5 es un tema aparte porque, como se dijo, ha
sido mejorado de manera sustancial y continua. El soporte para la progra-
mación orientada a objetos es algo que ya resulta muy popular en otros
lenguajes, y PHP no es la excepción. Gran cantidad de código está siendo
escrito bajo este paradigma y, mientras más rápido se acostumbre el pro-
gramador de PHP, más en carrera estará a la hora de actualizar sus conoci-
mientos, incluso, en el momento de buscar empleo.

Extensiones en PHP
Cuando programamos en un lenguaje, no solo en PHP, nos valemos de fun-
ciones o procedimientos, ya sea para resolver problemas o modular el código
y hacerlo más legible o reutilizarlo sin escribir lo mismo más de una vez.

Un sistema gestor de base de datos o SGBD es un programa encargado de administrar la


información que se va a registrar, también los usuarios y permisos de acceso, y programar
consultas/registros/actualización/eliminación. En resumen, entre los grandes administrado-
res de bases de datos, podemos nombrar: Oracle, Microsoft SQL Server, MySQL.

» www.redusers .com
PHP + MYSQL DESDE CERO 17

Las extensiones no son ni más ni menos que conjuntos de funciones dis-


ponibles para programar, pero, para ser más precisos, podríamos dividir las
funciones en dos grupos. Por un lado, están las que vienen incorporadas con
el lenguaje, llamadas built in Por otro lado, tenemos las que se encuentran
en las bibliotecas añadidas, que debemos incluir en el sistema de manera
específica, estas son las extensiones o bibliotecas. Se podría decir que para
utilizar ciertas funciones hay que extender el lenguaje.
Una vez que se instalan y se habilitan esas bibliotecas (el procedimien-
to podemos encontrarlo en el libro PHP desde cero), el comportamiento de
las funciones componentes dentro del código de los programas es idénti-
co al de cualquier función o procedimiento, o sea que la programación se
vuelve independiente y transparente al origen de las funciones.
Las extensiones en PHP pueden agruparse por funcionalidad; podríamos
encontrarnos con una extensión para manipular cadenas de caracteres, otra
para acceder a bases de datos, otra para trabajar con archivos XLS y demás.

Ventaja de trabajar
con extensiones/bibliotecas
Solo cargamos las bibliotecas cuando las usamos, es decir, no hay so-
brecarga de trabajo innecesaria. PHP ya tiene demasiadas funciones incor-
poradas, y sería poco recomendable iniciar el motor para soportar cientos
de funciones de las cuales probablemente necesitemos solo algunas.

Una de las equivocaciones frecuentes a la hora de publicar archivos PHP en un servidor con un
sistema operativo diferente del nuestro es la de escribir las rutas a archivos o directorios de ma-

nera incorrecta, Los sistemas Unix compatibles usan el símbolo / (barra hacia la derecha) para
acceder a subdirectorios, y los sistemas Windows usan el símbolo (barra hacia la izquierda),

www.redusers.com «
18 ttf9#¡f3 1.PHP

Además, al añadir una biblioteca no hace falta reinstalar PHP, solo habi-
litar desde el archivo php.ini lo que necesitamos. Esto es la modularidad.

Extensiones incorporadas
PHP contiene, sin necesidad de ningún tipo de instalación ni habilita-
ción adicional, entre otras, las siguientes funciones:

• Manejo de matrices.
• Funciones matemáticas.
• BCMath.
• Manejo de clases/objectos.
• Manejo de variables de tipo carácter.
• Tratamiento de fechalhora.
• Acceso directo a entrada/salida.
• Funciones de directorio.
• Gestión de errores y registros.
• Funciones de sistema de archivos.
• Utilización del protocolo FTP.
• Utilización del protocolo HTTP.
• Funciones de correo.
• Funciones de red.
• Ejecución de programas.

En el momento de descargar la última versión de PHP desde su sitio oficial, encontraremos


archivos con distintas extensiones ( .ZIP, .T.4R., .B2, .TGZ). Debemos saber que todos contie-
nen la misma información, y la elección de descargar uno u otro dependerá de si tenemos o
no un programa descompresor que pueda trabajar con dichas extensiones.

» www.redusers .com
PHP + MYSQL DESDE CERO 19

• Manejo de sesiones.
• Funciones de secuencia.
• Funciones de cadenas.
• Funciones URL.
• Manejo de variables.

Para poder acceder a las demás extensiones, debemos activarlas des-


de el archivo php.ini, o bien, incorporarlas en el momento de compilar
PHP e instalar las bibliotecas por separado (en sistemas operativos que
requieren compilar PHP para su instalación). Para saber qué bibliotecas
tenemos activas en nuestro sistema, podemos utilizar la función
PHPinfoO de la siguiente manera:

<?PHP
// funcion PHPülfo
phpínfot);
?>

Normalmente, cuando no recordamos cómo instalar o habilitar una ex-


tensiónlbiblioteca en particular en nuestro sistema, bastará COIl buscar la
referencia en el manual de PHP (www.php.net/manual ).

Bases de datos
En este libro lo principal es la explicación del manejo de bases de datos.
El lenguaje PHP soporta, entre otras, el manejo de las siguientes bases:

• clBase
• Informix
• InterBase
• :tvlSSQL Server
• IvlySQL

www.redusers.com «
20 ttfj#;f3 1.PHP

• msql
• Oracle
• PostgreSQL
• Sybase

Además con ODBC ( Open Database Connectivity , conectividad


abierta de bases de datos) se puede acceder a casi cualquier base de
datos existente en el mercado. Este brinda un conjunto de comandos que
son traducidos a instrucciones específicas de una base de datos en parti-
cular a través de drivers provistos por estas.
Es claro que utilizar funciones nativas da más réditos en cuanto a la
velocidad de respuesta, comparado con trabajar con algún mediador
tipo ODBC. Por otro lado, cuando se emplean bases de datos con una
gran cantidad de prestaciones como Oracle y se utiliza ODBC, OLE,
ADO, etcétera, se pierde gran parte del poder, puesto que hay funciones
propias de la base de datos que no se pueden utilizar con un mediador
genérico como estos, por no estar implementadas. Por 10 tanto, si se
quiere utilizar todo el potencial de la base de datos, es preferible acce-
der con funciones nativas, como las que ofrece PHP en sus extensiones
Por ejemplo, si en nuestro proyecto sabemos que vamos acceder solo
a la base de datos PostgreSQL, no hay necesidad de acceder con ODBC,
ya que PHP nos provee de una extensión ( php _pgsql.dll) para que poda-
mos hacerlo de modo nativo.

Dentro de la amplia oferta de lenguajes de programación -destinados al desarrollo de


aplicaciones tanto web como de escritorio-, existen actualmente algunos que tienen una
sintaxis muy similar a la de PHP. Esta es, quizás, otra de las ventajas de este lenguaje:
aprender a programar en él, da la posibilidad de hacerlo luego en otros.

» www.reduserscom
PHP .,. MYSQL DESDE CERO 21

'NoSQl.lUltersis.c.cfterencefor •_ ~... 28"'2014


DB-ENGINES ~ .. thit.m>ndCMh
~-,-
• .19 :xlA",,'1014

,
HOI"'" I Oll-Etlginps: Rankin9 I Systemf¡

System Propertles Comparlson Microsoft SQLSetver vs. HySQl vs. Orade


I Encydopedi.. I 8109 I ~"Id. I
-.
V~f.dor login

...»XL Dw=r $*
• ""9 QI4

Editorial information provided by DB·Engin~

H_ M_SQl._X 0I1Ide X
0eK~ ()IN!;
wó<+r _IIOOM'.
DB _ 1 Roo!. 1
[no- _. 1205.111 _. 1491.10
R
11
"''''*''J
l'cnd .......
~
(h.n ~
Webse\. ""'"' ~COftllql __

Oevelot>tr Hlaoson
Jn.ltj~re..t_H ._
uc:ono. _Cltl 11

- ..-
lmptunCiMobon C••
tono..og·

Figura 3. Una página muy útil es http://db-engines.com ,


que compara distintas bases de datos.

Portabilidad
PHP es un lenguaje multiplataforma, lo que significa que está preparado
para trabajar sobre distintos sistemas operativos. Pero la portabilidad in-
cide también en el11ec110de que no es necesario realizar grandes cambios
en el código fuente de una aplicación escrita en PHP en el momento
de trasladarla de una plataforma a otra. Por ejemplo, si 10 deseamos,
se puede desarrollar una aplicación en Windows o MAC, pero luego subir
el mismo código a un servidor que esté corriendo Linux.
La portabilidad de PHP es, sin duda, un punto fuerte frente a lenguajes
como ASP/ASP.NET, que necesitan de componentes adicionales para correr
en algunas plataformas. PHP funciona en una gran cantidad de sistemas ope-
rativos y sin necesidad de un componente adicional que debamos comprar.

www.redusers.com «
22 1.PHP

Windows Mac OSX Linux BSD Unix zJOS


Adaptive Server Enterprise Si Si Si Si Si No
A.1\!S Data Server Si Si Si Si Si ?
·
DB2 Si No Si No Si Si
Firebird Si Si Si Si Si Quizá
HSQLDB Si Si Si Si Si Si
Infomix Si Si Si Si Si No
Inzres Si ? Si ? Si _Quizá
InterBase Si No Si No ~ol.ri.!l No
SapDB Si No Si No Si ?
·
MaxDB Si No Si No Si ?
·
Microsoft SQL Server Si No No No No No
MySQL Si Si Si Si Si _Quizá
Oracle Si Si Si Si Si Si
Postsre SOL Si Si Si Si Si No
small SOL Si Si Si Si Si Si
SQLite Si Si Si Si Si · .

Figura 4. Comparación de diferentes recursos para el manejo de base de datos


y su compatibilidad en diferentes sistemas operativos.

Actualmente, se puede ejecutar bajo los servidores web Apache


(incluso en la versión 2.0), lIS (Internet Information Server ), PWS
(Personal Web Server), AOLServer, Roxen, OmniHTTPd, O'Reilly vVebsite Pro,

Por lo general, se logra un mayor entendimiento del lenguaje cuando se lee código es-
crito por otras personas. Un mismo problema puede resolverse de muchas maneras,
y no quedarse solo con un punto de vista ayuda a abrir nuestra mente e incorporar
nuevas formas de encarar la escritura de un código.

» www.redusers .com
PHP + MYSQL DESDE CERO 23

Sambar, Xitami, Caudium, Netscape Enterprise Server, THI-TPD, y otros_


Las posibles incompatibilidades entre plataformas son las siguientes:

• Ruta a archivos/directorios.
• Bibliotecas que solo funcionan en algunos sistemas, por ejemplo:
- Funciones W32api (solo para plataformas Windows de 32 bits).
- Funciones para el manejo de impresoras (solo para Windows 9.x,
ME, NI4 Y2000).
- Las funciones COM para Windows.
- Funciones de acceso directo a E/S
(no disponibles para sistemas Windows).
- Funciones GMP (que permiten trabajar con enteros de longitud variable;
no disponibles para sistemas Windows).
- Funciones para el control de procesos
(no disponibles para sistemas Windows).
- Funciones FM1 (notifican cambios en archivos y directorios;
no disponibles para sistemas Windows).
- Funciones POSIX (no disponibles para sistemas Windows).
- Funciones para Ncurses (no disponibles para sistemas Windows).

Incluso, hay bibliotecas compatibles con Windows. Cuando no recordamos


si una biblioteca es compatible o no con nuestro sistema, basta con buscar la
referencia en el manual de PHP y verificar si hay algún requerimiento.

En este capítulo hemos realizado una reseña de las principales virtudes del lenguaje
de programación PHP: qué hace, para qué sirve y Sl¡S extensiones principales para
bases de datos. En definitiva, un punto de partida para conocer 10 que el lenguaje nos
tiene preparado para el manejo de bases de datos.

www.redusers.com «
24 1.PHP

Actividades
TEST DE AUTOE\' AL{jACIÓ~

1 ¿Qué es una extensión?

2 ¿Cuál es la ventaja de trabajar con extensiones?

3 ¿En qué directorio de su sistema se encuentran las extensiones de PHP?

4 ¿En qué versión de PHP se incorporó la extensión MySQLi? ¿Para qué sirve?

5 Nombre tres de las nuevas características que vienen con PHP.

6 ¿Qué es SQLite?

7 ¿PHP puede trabajar con múltiples servidores web o solo con Apache?

EJERCICIOS PRÁCTICOS

1 ¿Cuál es su versión de PHP? Responda utilizando la función de PHP


que devuelve tal información.

2 ¿Qué extensiones tiene habilitadas en su sistema? Responda inspeccionando


el archivo php.ini , o bien, a través de la función phpinfo.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: [email protected] .

» www.redusers .com
ases atos

En este capítulo, aprenderemos a confeccionar bases de datos


(tablas, relaciones, claves, etc.) y crearemos las primeras herramientas
para el almacenamiento masivo de información. Concluiremos con la
instalación y el lISO inicial del gestor de bases de datos MySQL, que nos
permitirá digitalizar la creación de nuestros diseños .

..Qué es una base de datos 26 Por qué MySQL 40


Arquitectura de bases de datos 26 Obtener 1\tIySQL ........•.••.............. 40
Licencia de u50............••............. 41
..Modelo de datos relacional 27
Base de datos relacional 27 .. Resumen " 41
Tipos de relaciones entre tablas 34
.. Actividades 42
..Gestor de base de datos:
MySQL 40
26 2. BASES DE DATOS

Qué es una base de datos


Una base de datos es una estructura organizada de datos relaciona-
dos entre sí que nos permite obtener, eventualmente, información ac-
tualizada acerca de una organización. Se dice eventualmente porque
por sí misma no produce ninguna mejora: el beneficio se logra diseñán-
dola en forma correcta a partir de 10 que necesitamos (requerimientos)
y manteniendo sus datos actualizados.

Arquitectura de bases de datos


En 1975, el comité Al~SI-SPARC (American National Standard Institute-
Standards Planning and Requirements Committee ) propuso una arquitectura
de tres niveles para 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: es el nivel más bajo de abstracción. Define todos los deta-


lles de cómo funciona el almacenamiento en la base de datos y los
métodos de acceso a la información.
• Conceptual: este nivel se aleja de los detalles técnicos y se
concentra en las necesidades de los usuarios. Se describen entida-
des, atributos, relaciones, operaciones de los usuarios y restriccio-
nes a sus acciones. Es una representación de los datos desde el
punto de vista de una organización.

Así como en la POO la abstracción de información implica obtener del mundo real da-
tos útiles, en este caso, la abstracción se utiliza para el almacenamiento de registros.
Por ejemplo, de un par de zapatillas podemos determinar: marca, tipo, material, tamaño, etc.

» www.redusers .com
PHP -e- MYSQL DESDE CERO 27

• Externo: aqui se define qué partes de la base de datos podrán ser vistas
y cuáles serán ocultas a qué usuarios. Es el nivel de mayor abstracción.

Modelo de datos relacional


La idea primaria de los sistemas informáticos es poder plasmar,
a través de diferentes herramientas, situaciones del mundo real.
Para traspasar la realidad de una situación concreta 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 permite describir
de modo abstracto en qué forma se va a almacenar y a recuperar
la información existente en una base. Quizás el más conocido sea el
relacional, pero existen otros modelos de administración de datos:

• Modelojerárquico UNA BASE DE DATOS


• Modelo de red
• Modelo orientado a objetos ES UNA ESTRUCTURA

DE DATOS
Nos centraremos en el modelo que vamos
RELACIONADOS
a utilizar para confeccionar bases de datos:
r

el modelo relacional. ENTRE SI

Base de datos
relacional
El modelo relacional es, sin dudas, el más popular desde hace tiem-
po. Tomó notoriedad en 1970 y fue creado por Edgar Frank Codd .
Con él se imponen conceptos tales como tabla (arreglo bidimensional),
fila y columna. Los datos se recuperan a través de lenguajes de consul-
ta (el más popular es SQL, pero existen otros) que mantienen la com-
patibilidad aun entre sistemas gestores de bases de datos de distintas
-,. .
compamas o sistemas operativos.

www.redusers.com «
28 ttfj#;f3 2. BASES DE DATOS

Entendemos el modelo relacional como una propuesta para ver los


datos como objetos del mundo real, diferenciables entre sí por sus carac-
terísticas básicas. Un objeto dado puede ser descripto por la colección de
características que tiene (llamadas atributos) y distinguido de otros
objetos a partir de eso mismo. Este modelo admite relaciones uno a va-
rios, uno a uno y varios a varios, haciendo referencia a la información qtIe
guardaremos, por ejemplo: (mundo real) una factura de una casa de com-
putación alberga los datos de uno o mtIchos productos; esto equivaldria a
una relación de uno (factura) a muchos (productos).
Para convertir los datos del mundo real al abstracto, debemos conside-
rar las agrupaciones de información; tomando el ejemplo anterior, la fac-
tura se convertiría en una tabla.
A continuación, explicaremos los diversos componentes de una base
de datos relacional, como el esquema de los datos por almacenar, denomi-
nado tabla; las características, llamadas atributos y cómo se generan las
relaciones entre los diversos registros incluidos dentro de las tablas.

Tabla
Una tabla es una colección de una o más columnas y cero o más filas.
Puede entenderse como una estructura de datos simple que se asemeja
a una matriz de dos niveles: el primero podría representar el número
de fila, y el segundo, el número de columna. Para acceder a un valor de

Si bien el modelo de datos más utilizado en la actualidad es el relacional, en determi-


nado S ámbitos de la programación está imponiéndose el modelo orientado a objetos
(POO). Por otra parte, ambos toman cosas del otro y, aunque mantienen sus principios
fundamentales, intentan dar a los usuarios lo que estos buscan.

» www.reduserscom
PHP .,. MYSQL DESDE CERO 29

esta matriz, debemos indicar alguno de esos datos. Como se dijo, una
tabla nos permite organizar los datos en filas (también llamadas tuplas o
registros) y columnas (atributos o campos). Cada una de las filas (los datos
contenidos en ellas) se diferencia de las otras en algún dato almacenado.
Cada columna dentro de una fila es el valor de un atributo de esa fila.
Continuando con nuestro ejemplo, podemos decir que factura es nues-
tra tabla, que, al ser diseñada y almacenada, la nombraremos como enti-
dad. Veamos cómo quedaria la tabla fachIra en una vista de diseño:

Columnas

I
I O 1 2 3 I
O

Filas 1

2 1I
U

Figura 1. Estructura de una tabla.

Tabla Entidad: Factura

Campo/Atributo Tipo de dato Descripción

Columna l Texto información relacionada con el contenido de datos.

Columna2 Número

Columna3 Fecha

www.redusers.com «
30 2. BASES DE DATOS

Atributo
Un atributo define y diferencia una entidad de otra. Los atributos
pueden verse como características de las entidades. Veamos un ejemplo:
un perro puede tener un nombre, un dueño, un color de pelo, una edad,
una comida preferida y demás.
Todos estos son atributos de un perro (entidad). Nótese que no defi-
nimos ningún valor particular para estas características, el atributo es
el nombre del perro y no un perro. Veamos algunos atributos que pode-
mos definir para la entidad factura.

Tabla Entidad: Factura

Campo/Atributo Descripción

NumeroF actura Los atributos son abstracciones de la vida


real, información que nos será útil manipular
FechaVenta y almacenar.

-
Catezoría

Total

Relación
Una relación es una vinculación entre ideas, un modo de asociar
entidades/tablas para lograr el objetivo que tienen en común. Es decir
que mediante esa vinculación es posible realizar una función.
De manera más concreta, es posible considerar que una relación
es una asociación entre entidades. Por ejemplo, podemos decir que
la entidad factura tiene una relación con la entidad productos (de
donde se obtienen los detalles de 10 que vamos a registrar).

» www.redusers .com
PHP .,. MYSQL DESDE CERO 31

Claves primarias
Para diferenciar una entidad de otra, debemos remitirnos a sus atribu-
tos y, para distinguir una fila de otra dentro de una tabla, nos guiamos por
la clave primaria. Una clave primaria ofrece la particularidad de no tener
valores repetidos. Para decidir cuál de todos los atributos formarán parte
de la clave primaria, debemos buscar uno que cumpla con el requisito
anterior, y, si no existe, deberemos crear una clave primaria artificial.
Veamos ejemplos de cada situación.
En la tabla libros, tenemos la siguiente estructura.

Nombre

Cantidad _páginas

Editorial

ISBJ\

Autor

En este ejemplo, al repasar los atributos uno por uno, notaremos qlIe solo
hay uno que no va a repetirse, y es ISBN. Podemos tomarlo como clave prima-
ria: no habrá dos filas con el mismo ISBN, no habrá dos libros con el mismo
ISBN. Una clave primaria puede estar formada por más de un atributo,
en este caso se dice que es una clave compuesta. ¿Podríamos tomar
como clave primaria a ISBN y cualquier otro atributo, como por ejemplo
Editorial? Sí, se podría, pero no se debería por la estabilidad de la in-
formación que almacenaremos.
Nada nos impide pasar por alto la clave ISBN y crear otra, que podria lla-
marse codigo_libro. En este caso codigo_libro no significa nada, no tiene ningu-
na implicancia para lo que es un libro: es solo un atributo con una restricción
básica que será el hecho de no poder repetirse. Se trata de respetar ciertas
técnicas de diseño de bases de datos y, a la vez, tener en cuenta lo que

www.redusers.com «
ttfj#;f3 2. BASES DE DATOS

nuestro sistema necesita; las decisiones finales corren por cuenta de las
personas que se encarguen de ello. Veamos otro caso en el cual tene-
mos la tabla alumnos, cuya estructura inicial es la siguiente:

Nombre alumno

Dirección

Curso

Colegio

Nacionalidad

En este ejemplo no hay ningún atributo que no pueda llegar a repetirse en los
distintos alumnos. La solución es crear una clave y asignarla a cada alumno.
Podríamos llamarla codigo_alumno y, al generarla, nos aseguramos de que no
pueda tomar valores repetidos. Repasemos el ejemplo de la tabla factura:

Tabla Entidad: Factura

Campo/Atributo Descripción

Campo/Atributo El campo NumeroFactura podría ser nuestra clave


principal, ya que no debe repetirse el registro de una
NumeroFactura factura en nuestra base de datos, y una organización
no puede generar facturas con la misma numeración.
FechaVenta

Categoría

Total

» www.reduserscom
PHP + MYSQL DESDE CERO 33

Claves candidatas LA CLAVE PRINCIPAL


Acabamos de ver que una fila es diferen-
ciada de las demás a través de un número de NOS PERMITE
atributos. Esos atributos forman lo que se IDENTIFICAR Y
llama una clave candidata. Puede haber varias
LOCALIZAR UN
claves candidatas dentro de una tabla.
La clave principal o primaria es la clave can- REGISTRO
didata que elijamos para representar cada fila
de manera unívoca. Luego, nos permitirá identi-
ficar y localizar un registro de manera rápida.
Para identificar las claves candidatas de
una tabla no hay que fijarse en un estado o instancia de la base de datos:
el hecho de que en un momento dado no haya duplicados para un atributo
o conjunto de atributos no garantiza que los duplicados no sean posibles.
Sin embargo, vale lo recíproco: la presencia de duplicados en un estado
de la base de datos sí es útil para demostrar que cierta combinación de
atributos no es una clave candidata válida.

,
Indices
Un índice es una estructura de datos en donde se almacena información
adicional acerca de una columna (una columna indexada). Cuando se en-
cuentra un índice en una columna, el gestor de base de datos lo usará para
no recorrer todos los registros de una tabla.

Vistas
Existen ocasiones en las que no nos interesa que todos los usuarios de
una base de datos puedan ver todos los datos de la base (ya sea por temas
de seguridad, orden o, simplemente, para mostrar a cada usuario lo que
estrictamente precise para realizar su trabajo). Para esto existen las llama-
das vistas, que nos permiten recortar una tabla y restringir el acceso a
ella. Por ejemplo, si tomamos en cuenta la siguiente tabla:

www.redusers.com «
34 ttfj3¡fi 2. BASES DE DATOS

Tabla Empleados

Cod e Nom e Ape_e Sueldo e Dirección e

y tenemos un sector en nuestra empresa que se dedica a enviar bonifica-


ciones por presentismo a los empleados, seguramente no se necesitará
conocer el sueldo de cada uno de ellos, así que solo permitiremos que se
vean los siguientes datos a través de una vista:

Vista Tarjeta_Empleados

Cod e Nom e Ape_e Dirección e

Esquemas
Un esquema es una forma de visualizar una base de datos más allá de
los datos que contenga actualmente. Para representar el esquema de una
base de datos relacional se debe dar el nombre de sus tablas, los atributos
de cada una de estas, los dominios sobre los que se definen estos atribu-
tos, las claves primarias y las claves foráneas (la definición y los ejemplos
acerca de claves foráneas los encontraremos en el capítulo 5).

Tipos de relaciones entre tablas


Una base de datos está compuesta por tablas que se relacionan de al-
guna manera para darle un sentido al sistema y plasmar lo más fielmente
posible lo que sucede en el mundo real.
Las relaciones pueden catalogarse según sus propiedades. En esta
sección veremos dos de ellas: la cardinalidad y la modalidad.
La cardinalidad especifica el número de instancias de una entidad
que se puede relacionar con un número de instancias de otra entidad.
Quizás esto suene confuso, pero con la siguiente explicación veremos
que no lo es tanto. Hay tres tipos de cardinalidad:

» www.redusers .com
PHP .,. MYSQL DESDE CERO 35

• Uno a uno
• Uno a varios
• Varios a varios

Cardinalidad uno a uno


Una relación de llno a uno entre dos tablas tiene lugar cuando, a cada
elemento de la clave de la tabla A, se le asigna un único elemento de la
tabla B y, para cada elemento de la clave de la tabla B, existe un único
elemento en la tabla A. Por ejemplo, cada país tendrá solo un presiden-
te, y cada presidente tendrá a su cargo solo un país.

1:1
Tabla A Tabla B

Figura 2. Relación uno a uno.

Llegado el caso, existe la posibilidad


de unificar las tablas A y B en una sola,
pero esto dependerá de las siguientes razo- EN UNA BASE DE
nes, que debemos tener cuenta: DATOS, LAS TABLAS

• Las necesidades de nuestro sistema. SE RELACIONAN


• Si en esa situación se respetarían o no las PARA DARLE
reglas de normalización (explicadas más
SENTIDO AL SISTENlA
adelante en este mismo capítulo).
• Si la tabla resultante es demasiado grande
(gran cantidad de campos) y dificil de ma-
nejar, o si es adecuada para nuestro fin.

www.redusers.com «
36 2. BASES DE DATOS

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 varios entre las tablas A y B
cuando una clave de la tabla A posee varios elementos relacionados en la
tabla B y cuando una clave de la tabla B posee un único elemento relaciona-
do en la tabla A. Por ejemplo, cada ciudadano vota por un candidato, y cada
candidato tendrá la posibilidad de ser votado por más de un ciudadano.

l:n
/
-,
1I
Tabla A Tabla B

Figura 3. Relación uno a varios.

Cardínalídad varios a varios


Una relación es de varios a varios entre las tablas A y B cuando una clave
de la tabla A posee varios elementos relacionados en la tabla By, a su vez,
una clave de la tabla B posee varios elementos relacionados en la tabla A.
Por ejemplo, un libro pudo haber sido escrito por varios autores, y cada
autor pudo haber escrito varios libros.

Si bien es recomendable utilizar la última versión de cualquier aplicación, hay en ocasio-


nes motivos para no hacerlo. Uno de ellos es que las empresas que desarrollan software
suelen liberar las versiones BETA, que se consideran de prueba y no son recomendables
para sistemas en etapa de producción, pero, tal vez, sí para los que estén en desarrollo.

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!J;j3;fi 37

n:n
/
Tabla A
'"
V <,
Tabla B

Figura 4. Relación varios a varios.

Por lo general, no veremos este tipo de relaciones en los diseños de los


sistemas de bases de datos, porque son dificiles de tratar y de mantener.
Directamente se transforman en dos relaciones de tipo uno a varios.
Esto se hace creando una tercera. tabla (llamémosle C) que hace de inter-
mediaria entre la A y la B, que permanecen intactas.

l:n n:1
/ e ~
Tabla A
-, Tabla
V
Tabla B

Figura 5. Transformación de relaciones varios a varios.

A continuación, veamos un ejemplo de esto último (identificamos


con # al campo que actúa como clave primaria):

En internet circulan, frecuentemente, gran cantidad de ejercicios -en general, de universida-


des- que pueden servirnos de ayuda a la hora de poner en práctica nuestros conocimientos
acerca del diseño de sistemas. Recordemos que la mejor manera de afianzar conocimien-
tos y adquirir otros es enfrentándose a situaciones y desafios nuevos.

www.redusers.com «
38 ttfj#;f3 2. BASES DE DATOS

Tabla Libro Tabla Autor

# Cod libro # Cod autor

Titulo Nombre y Apellido

Páginas Nacionalidad

Hasta aquí tenemos una relación de varios a varios. Para transformar


esta relación hacemos lo siguiente: tomamos las claves de ambas tablas
y construimos una tercera. Luego armamos las relaciones.

Tabla Autor libro

# Cod autor

# Cod libro

Las relaciones quedarian como se muestra en la figura 6.

1:n n:1
/ r'\,
Tabla Autor
-, Tabla Autor_Libro
V
Tabla Ubro

Figura 6. Transformación de relaciones varios a varios.

Modalidad
La modalidad indica si es obligatorio o no que una instancia participe en
la relación. Vimos antes que, según 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 definir si es obligatorio o no la participación
de cada instancia en esa relación. Volviendo a los ejemplos anteriores:

» www.reduserscom
PHP + MYSQL DESDE CERO 39

cada ciudadano vota por un candidato, y cada candidato tendrá la posibi-


lidad de ser votado por más de un ciudadano. Ahora bien, ¿es obligatorio
que cada ciudadano vote por un candidato? ¿Y que un candidato sea vo-
tado por una persona al menos? Respondiendo esta clase de preguntas
podremos determinar la modalidad ell las relaciones.
La forma gráfica de definir la modalidad en las distintas relaciones de-
pende del autor, no hay solo una manera, pero la forma clásica o la más
usada es la que vemos en la figura 7.

I Obligatoria

o Opcional

Figura 7. Simbología de modalidad en las relaciones.

Veamos algunos ejemplos. En la figura 8, todos los registros de la


tabla B deberán tener un (y solo uno) registro asociado en la tabla A.
Por su lado, los registros de la tabla A podrán tener (o no) uno o varios
registros asociados en la tabla B.

Tabla A
1:" -/ Tabla B
-""
Figura 8. Ejemplo de modalidad en las relaciones.

Al finalizar la lectura de los párrafos anteriores, conocemos cómo debe-


mos confeccionar una base de datos; llevémoslo a la práctica conociendo
qué gestor de base de datos podemos utilizar.

www.reduaers.com «
40 2. BASES DE DATOS

Gestor de base de datos: MySQL


Disponemos de varias herramientas para la gestión de base de datos,
para este libro elegimos una muy popular y con mucho futuro por delan-
te que es: MySQL. Analizaremos cuáles son las razones para que se haya
convertido en el complemento ideal de PHP.

Por qué MySQL


MySQL es un sistema gestor de bases de datos muy utilizado en la
actualidad por los siguientes motivos:

• Rapidez
• Posibilidad de trabajar en diferentes plataformas
• Múltiples formatos de tablas para cada necesidad
• Seguridad
• Gran estabilidad
• Administración simple
• Soporte técnico (con el licenciamiento comercial)

Si bien todavia le queda mucho camino por recorrer, en corto tiempo ha


logrado darse a conocer en el ámbito informático y file afianzándose pro-
gresivamente en el mundo de las bases de datos relacionales.
Desde hace algún tiempo, se ha ido dando una particular unión entre
esta base de datos y el lenguaje de programación PHP; por este motivo,
MySQL se utiliza principalmente en sitios web.

Obtener MySQL
MySQL puede obtenerse de manera completamente libre a través de
cualquier tipo de distribución: revistas, Internet, copias en CDIDVD
provistas por amigos, etcétera. Pero, sin dudas, una de las formas más
utilizadas es acceder al sitio www.mysql.com ~y desde allí descargar la

» www.redusers .com
PHP + MYSQL DESDE CERO 41

versión más adecuada al sistema sobre el cual desarrollaremos nuestras


aplicaciones. Esta es una buena forma de tener acceso a la última ver-
sión del programa. MySQL está disponible, entre otros, para los siguien-
tes sistemas operativos:

• Linux
• Windows (9x, Me, NI, 2000, XP, Vista, 7)
• Solaris
• BSD (FreeBSD, NetBSD, OpenBSD, BSD/OS)
• Mac OS
• Novell NetWare (6.0 o superior)
• OS/2
• BeOS
• RISC OS
• SGI IRIX 6.5.x
• AS/400

Licencia de uso
11ySQL pone a disposición de los usuarios dos tipos de licenciamiento:
una licencia comercial y una licencia GPL (General Public License).
La licencia comercial brinda, entre otras cosas, soporte técnico y garantía.

Diseñar una base de datos es una tarea que necesariamente combina experiencia
práctica y conocimientos teóricos. En este capítulo hemos recorrido los conceptos
fundamentales para introducirnos en este apasionante tema y poder sacar provecho
de las opciones que nos ofrecerá MySQL.

www.redusers.com «
42 2. BASES DE DATOS

Actividades
TEST DE AUTOE\' AL{jACIÓ~

1 ¿Cuáles son las ventajas de trabajar con bases de datos?

2 ¿Qué es una tabla? Dé tres ejemplos.

3 ¿A qué se denomina atributo? Defina posibles atributos para las tablas de la


pregunta anterior.
4 ¿Qué es una clave primaria? Defina posibles claves primarias para las tablas
de la pregunta 3. ¿Con qué criterio los elegirá?

EJERCICIOS PRÁCTICOS

1 Nombre dos casos en los cuales aplicaría vistas.

2 Describa un ejemplo en donde intervengan relaciones uno a uno.

3 Describa un ejemplo en donde intervengan relaciones uno a varios.

4 Cree el diseño de una base de datos en donde intervengan relaciones uno a varios
e implemente un esquema de integridad referencial como se hizo en este capítulo.

5 Determine la relación entre las tablas de ejemplo factura y producto.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: [email protected] .

» www.redusers .com
En este capítulo, para poner en práctica lo aprendido, trabajaremos con
MySQL. Utilizaremos sus características generales; para esto debemos
saber que la creación de tablas es un proceso posterior al diseño de la
base de datos, requiere atención, análisis y un conocimiento profundo .

..Tipos de tablas 44 .. El uso del monitor de MySQL ...98

..Tipos de datos 50 .. Resumen 1O1

..Referencia de funciones 59 .. Actividades 102

JI JI JI
44 3. MYSQL

Tipos de tablas
Cuando trabajamos con MySQL, existe la posibilidad de variar el tipo de
tabla una vez creada, salvo en el caso de las tablas del sistema -llamadas
MySQL y test-, qtle por defecto son MyISAM, y no se recomienda modificar-
las. Para indicar el tipo de tabla al crearla, usamos la siguiente sintaxis:

CREATE TABLE tablal (


campo! INT(4),
) ENGINE=MYISAJ.\II;

Si intentamos crear un tipo de tabla no disponible en la versión que


tenemos de MySQL, se generará una tabla tipo MyISAM. A continuación,
haremos un recorrido por los distintos tipos de tablas soportados.

ISAM
MySQL empezó utilizando este tipo de tablas y, actualmente, se las consi-
dera en desuso. Entre sus desventajas figura el hecho de no poder transportar
ficheros entre máquinas con distinta arquitectura (tiene un formato distinto
para cada arquitectura/sistema operativo, lo cual resulta más rápido, pero
presenta el problema de la incompatibilidad) y el de no manejar ficheros de
tablas superiores a 4 gigabytes. Los índices se guardan en archivos .ISM y los
datos en archivos .ISD. MySQL recomienda actualizar este tipo de tablas hacia
las de tipo MyISAM. Esto puede hacerse con la siguiente instrucción SQL:

ALTER TABLE nombre_de_la_fabla ENGINE = MYISAM;

MyISAM
Es el tipo de tabla por defecto en MySQL desde la versión 3.23
Yestá basado en las ISAM, por supuesto, que ofrecen más opciones.

» www.reduserscom
PHP .,. MYSQL DESDE CERO 45

Proveen un almacenamiento independiente: se pueden copiar tablas de una


máquina a otra de distintas plataformas. Cuando se usan estas tablas, los da-
tos se almacenan fisicamente en dos archivos: uno que tiene la extensión .MYI
(MYISAM lNDEX), para los índices, y otro .MYD (MYISAM DATA), para los datos.
Si estamos trabajando con MySQL en forma local, normalmente, se podrá
ver en el propio equipo qtIe estos archivos se encuentran en tIna carpeta qtIe
tiene por nombre a una base de datos (estas carpetas están en el directorio
DATA dentro del directorio en donde se instaló MySQL, y allí hay una carpeta
por cada base de datos). Esto vale también para otros tipos de tablas.
• c:\w.mp\b¡n\my>ql\mysqfS.s.8\bln\my>qf.u~ l:

Figura 1. Creación de una tabla :tvlyISANl desde el monitor de :tvlySQL.

Entre sus características, destacamos las siguientes:

• Soportan archivos de gran tamaño (63 bits, ficheros de tablas superiores


a 4 gigas) en comparación con los que soportaban las ISAM.
• Optimizadas para sistemas operativos de 64 bits.
• Posibilidad de indexar campos BLOB y TEXT .
• Se permiten valores NULL en columnas indexadas.
• Inserts concurrentes (pueden insertarse varios registros al mismo tiempo).
• Cada tabla guarda un registro que indica si fue cerrada correctamente
o no, y al iniciar MySQL existe la opción de indicarle que se verifique
ese registro, y se repare la tabla de ser necesario de forma automática.

www.redusers.com «
46 3. MYSQL

Esto se logra iniciando l\1ySQL con la opción:

=myísam-reccver

Si se encontró un error, trata de repararlo de forma rápida ordenando


los registros de la tabla. Si persiste el error, se vuelve a crear el archivo
que contiene la tabla, y, si continúa sin corrección, se intenta repararlo
escribiendo los registros sin un ordenamiento.

MERGE
Este tipo de tabla es muy utilizada en los casos en que se precisa tratar
a un número N de tablas l\1yISAl\1 (de idéntica estructura y pertenecientes
a la misma base de datos, de la que también deberá formar parte la tabla
MERGE) como si fuera una sola. Esto podría aplicarse si la tabla J\lfyISAl\1
original fuera de gran tamaño y acceder a su contenido llevara una canti-
dad considerable de tiempo y recursos. Obviamente, estamos hablando
de una tabla muy grande. Entre otras características, destacamos:

• Solo se pueden aplicar instrucciones SELECT, DELETE y UPDATE.


• La definición de la tabla se almacena en un archivo .FRlvI, y el listado
de las tablas l\!lySAl\Jl e11U11archivo .:tvIRG(aquí hay en realidad un índice
de los archivos .IvlYI usados. Ver tablas MyIS.AM).
• Permite de algún modo burlar el tamaño máximo de una tabla y el ta-
maño máximo de un archivo en un sistema operativo específico.
• Si quisiéramos borrar una de las tablas l\1yISAl\1 que forma parte de la
tabla IvIERGE, no podríamos hacerlo bajo el sistema operativo Windows,
ya que este no permite borrar archivos que estén abiertos, y la tabla al
formar parte de la tabla IvIERGE se considera abierta.
• Por la misma razón se producen inconvenientes al aplicar instruccio-
nes tales como DROP TABLE, ALTER TABLE, DELETE FROM sin WHERE,

» www.redusers .com
PHP .,. MYSQL DESDE CERO 47

REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE Y ANALYZE TABLE.


Una manera de solucionar esto es borrar el contenido de la tabla l\IIERGE
(aplicando la instrucción DELETE sin WHERE a una tabla l\IIERGE, no se
borra el contenido de las tablas 1\1yISAM, sino que se las quita del listado
de componentes de la tabla l\IIERGE). Así, estas tablas se considerarán
cerradas. Cuando se crea una tabla de este tipo, hay que especificar
(con la instrucción UNJON) la lista de tablas asociadas.
Devolvería algo similar a la tabla siguiente:


a mensaje

1 uno

2 dos

3 tres

1 cuatro

2 cinco

.
3 seis

El parámetro INSERT_NIETHOD especifica en qué tabla se realizarán los


INSERTS, si en la primera de la lista (poniendo INSERT_l\IIETHOD FIRST )
o en la última (poniendo INSERT_ivIETHOD LAST). En nuestro caso, la
tabla tl es la primera, y t2 es la última.

HEAP
Este tipo de tablas tienen una particularidad que las distingue del
resto: son tablas en memoria, temporales y desaparecen cuando el ser-
vidor se cierra. Esto las hace realmente rápidas y, a diferencia de una
tabla TE1\1PORARY, que solo puede ser accedida por el usuario que la
crea, pueden ser utilizadas por diversos usuarios.

www.redusers.com «
48 3. MYSQL

Algunas de sus características son:

• No soportan columnas de tipo BLOB o TEXT.


• No soportan columnas de tipo AUTO_INCRE:tvIENT.
• No se permiten valores NULL en columnas indexadas
(antes de J\lfySQLversión 4.0.2).
• Siempre conviene especificar el número máximo de filas ( :MAX_RO\VS)
cuando se crea la tabla, para no usar toda la memoria disponible.

InnoDB
Estas tablas, al igual que las Berkeley DB, son TST (Transactions Saje
Tables O tablas para transacciones seguras). Las tablas de este tipo son
más lentas y ocupan más memoria, pero a cambio ofrecen mayor segu-
ridad frente a fallas durante la consulta. Fueron agregadas en la versión
4.0 de MySQL y tienen las siguientes características:

• Proveen la posibilidad de transacciones seguras, . <\CID


(autenticación, confidencialidad, integridad, y disponibilidad).
- Atomicidad: consultas tratadas como U11asola, de tal forma que
solo se ejecutan cuando todas ellas tienen éxito. En caso de que alguna
falle, no se ejecuta ninguna.
- Consistencia: solo datos válidos pueden ser escritos en la base de datos.
- Separación: las transacciones que tengan lugar simultáneamente
deben ejecutarse aisladas unas de otras hasta que finalizan.
- Durabilidad: cuando una transacción se completa con éxito,
los cambios son permanentes y 110se podrá volver atrás.
- Soporta operaciones CO:tvIMIT y ROLLBACK (beneficio propio de ser TST).

• Recuperación ante fallas.


• Soporta FOREIGN KEY (claves foráneas).
Es la primera vez que esto se da en J\lfySQL.
• Bloqueo a nivel de fila.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 49

• Permite realizar copias de seguridad mientras la base está funcionando.


• Alta eficacia en el procesamiento de grandes volúmenes de información.
• No permite crear claves sobre columnas de tipo BLOB o TEXT.
• Una tabla no puede tener más de 1000 columnas.
• Al borrar todas las filas de una tabla lo hace una por una,
lo que produce problemas relacionados con la velocidad.
Hasta ahora puede truncar tablas.

BerkeleyDB
Estas tablas pueden ser usadas independientemente de MySQL; son
desarrolladas por otra empresa, Sleepycat, y MySQL ofrece una interfaz
para trabajar con ellas como una posibilidad más.

• Soportan operaciones CO:tvlNIIT y ROLLBACK .


• Es de tipo TST tTransactions Saje Tables).
(Ver tablas INNODB para más información acerca de esto).
• Normalmente, para instalarlas hay que buscar una versión de MySQL
que incluya soporte para este tipo de tablas y habilitar la opción en el
momento de la instalación ( **vvith*berkeley*dboption).
• En el archivo en donde se ahnacenan los datos se guarda la ruta a ese mis-
mo archivo, de modo que no es posible cambiar de directorio la base.

En el momentode definiruna tabla, debemosprestar particularatenciónal tipo de


dato que destinamos a cada campo y a su longitud: esto nos ayudará a preservar
recursos y a mantener una coherenciadentrodel diseño de las estructurasde datos
del sistema.Encontraremosmás informaciónacerca del diseño de bases de datos
relacionalesen el capítulo 2 de este libro.

www.redusers.com «
50 3. MYSQL

En qué casos usar cada tabla


Como siempre, la respuesta depende de lo que tengamos que hacer.
Las tablas que normalmente se usan hoy en día son las MyISAM, pero
pronto (quizás muy pronto) se comenzarán a usar las INNODB, especial-
mente por la posibilidad de crear relaciones entre tablas (fundamental
en el modelo relacional) y ofrecer mayores prestaciones con respecto a
la seguridad, además de las transacciones.
Las ISAM están prácticamente en desuso (incluso la empresa que desa-
rrolla MySQL admite la posibilidad de que en su versión 5 ya no estén dis-
ponibles), y las demás tienen usos muy específicos e incluso compatibles
con otros tipos. La clave está en estudiar los problemas que necesitamos
solucionar, y ver en cada caso qué es lo que más conviene.

Tipos de datos
En el momento de crear tablas de bases de datos, es muy importante
definir los tipos de datos. MySQL soporta una gran variedad de ellos,
uno para cada necesidad.

Cadenas de caracteres
Los subtipos de datos existentes aquí son eRAR, v ARCRAR, BLOB,
TEXT, ENUM, Y SET.

CHARyVARCHAR
Son muy similares, quizás la diferencia más notable es el modo de almace-
namiento. Cuando defmimos una columna tipo CRAR de tamaño N, e ingresa-
mos un valor (de menos de N caracteres) en esa columna, MySQL rellenará
con espacios lo que sobra, mientras que si hacemos lo mismo con una colum-
na de tipo VARCHAR, no se rellenará con espacios. Al obtener información a
través de una consulta SQL, no aparecen los espacios sobrantes, MySQL

» www.redusers .com
PHP + MYSQL DESDE CERO 51

los remueve. Si se ingresa una cadena de mayor cantidad de caracteres


que el tamaño prefijado al definir la columna, la cadena se truncará al
llegar al limite. Por defecto, las comparaciones (en cualquiera de los dos
tipos de datos) S011 insensibles a mayúsculas y minúsculas.

CREAJE JABLE tabla! (


campo! INT(4),
campo2 VARCHAR(25) NOJ NULL
)

BLOBy TEXT
Se utilizan para cadenas con un rango que dependerá del tamaño que
queramos almacenar. La diferencia entre ambos es que TEXT permite com-
parar dentro de su contenido sin distinguir mayúsculas y minúsculas, y
BLOB las distingue. Además, 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, incluyendo las imágenes, hasta archivos de sonido o video.
BLOB (Binary Large OBject, objeto binario de gran tamaño) se subdivide
en cuatro tipos que difieren solo en la capacidad máxima de almacena-
miento. Con TEXT sucede lo mismo e, incluso, hay correspondencia entre
la capacidad máxima de almacenamiento de unos y otros.

Cuando realizamos una consulta a un servidor de bases de datos, este nos devuelve
resultados que viajan a través de la red. Mientras más datos sean, más tráfico gene-
raremos; de ahí la importancia de construir nuestras instrucciones SQL con eficacia,
de manera de obtener estrictamente solo 10 que necesitamos.

www.redusers.com «
52 ttfj3¡fi 3. i\!fYSQL

SUBTIPOS DE DATOS BLOB y TEXT

T DMSIOl\'ES DE BLOB T DMSIOl\'ES DE TEXT T LÍMITE EN CARACTERES

TIl\"YBLOB TIl\iYTEXT 255

BLOB TEXT 65.535

MEDIUl\'IBLOB 11EDIUMTEXT 16.777.215

LO::'\GBLOB LONGTEXT 4.294.967.295

Tabla 1. Equivalenciasde tamaños entre variables de tipo BLOB y TEXT .

Ninguna columna de estos tipos puede tener valor por defecto.

ENUl\1
Este tipo de string puede seleccionar su valor únicamente de una lista fini-
ta (máximo de 65.535 elementos) de opciones definidas por el usuario y otras
dos por defecto (índice Oque significa error, por ingresos fuera de rango,
por ejemplo, y está representado por "", e índice NULLcon valor NULL).Por
ejemplo, definimos una columna con ENUNI("argelltina","lnexico","paraguay") :

CREATE TABLE user (


nombre enum('juan' ,'pedro') NOT NULL,
pais enum('argentina' ,'paraguay', 'mexico'),
);

SET
Similar a ENUNI en su funcionamiento, solo que se puede seleccionar nin-
guno o más de un valor de la lista (hasta 64, la muestra separada por comas).

» www.redusers .com
PHP .,. MYSQL DESDE CERO 53

Numéricos
Existen los subtipos DECIMAL (NUMERIC o DEC), INTEGER (INT),
TINYINT, BIT, BOOL, l\IIEDIUMINT, BIGINT, SMALLINT, FLOAT y DOUBLE
(DOUBLE PRECISION o REAL). Todos los tipos numéricos pueden definir-
se con dos parámetros opcionales: UNSIGNED (impide que los campos
numéricos acepten signo negativo, es decir, solo se aceptarán el cero
y los valores positivos) y ZEROFILL (completa con ceros a la izquierda
hasta la longitud máxima). La forma de uso es:

TIPO DATO [UNSIGNED] [ZEROFILL]

Por ejemplo,

INT(4) UNSIGNED ZEROFILL

Si tenemos ahnacenado el número 12, al hacer un SELECT se mostrará


0012. Si tenemos ahnacenado el número -12, al hacer lln SELECT se mostra-
rá 0000. A continuación, defmiremos cada uno de los subtipos numéricos.
En todos los casos, M es el número de dígitos que serán visibles al mos-
trar el contenido del campo. Si el campo que se va a mostrar sobrepasa
los M dígitos, se mostrarán solo :tvI dígitos.

TINYINT[(M)], BIT
Un tipo de datos BIT nos es útil para almacenar valores de un bit.
Si se omite o se sobrepasa la capacidad de TINYINT, se toma la cantidad
máxima soportada por este tipo de dato. Si se define con signo, va desde
-128 a 127, en cambio, sin signo ( UNSIGNED), va desde Ohasta 255.
BIT es un TINYINT de un dígito (TINYINT(I)) .

www.redusers.com «
54 3. MYSQL

SMALLINT[(M)]
Este es un tipo numérico exacto que podemos utilizar. Si se omite o se
sobrepasa la capacidad de SMALLINT, se toma la cantidad máxima sopor-
tada por este tipo de dato. Si se define con signo, va desde -32768 a 32767,
en cambio, sin signo (UNSIGNED), va desde O hasta 65535.

MEDIUMINT[(M)]
Es otro tipo numérico exacto que podemos utilizar, de mayor capaci-
dad al anterior. Si se omite o se sobrepasa la capacidad de :MEDIUNfINT,
se toma la cantidad máxima soportada por este tipo de dato. Si se defi-
ne con signo va desde -8388608 a 8388607, en cambio, sin signo (UNSIG-
NED), va desde Ohasta 16777215.

INT[(M)] e INTEGER[(M)]
Este tipo de dato es el utilizado con mayor frecuencia en los lengua-
jes de programación y se destina para albergar un valor entero bastante
grande. Si se omite o se sobrepasa la capacidad de INT, se toma la can-
tidad máxima soportada por este tipo de dato. Si se define con signo va
desde el valor -2147483648 al valor 2147483647, en cambio, cuando care-
ce de signo (UNSIGNED), va desde O hasta 4294967295. INTEGER[(M)] es
sinónimo del tipo de dato INT .

llIGINT[(M)]
Es uno de los tipos que soportan un valor entero realmente enorme
para transacciones de cálculos científicos o valores muy grandes.
Si se omite o se sobrepasa la capacidad de BIGINT, se toma la cantidad
máxima soportada por este tipo de dato. Si se define con signo va des-
de -9223372036854775808 a 9223372036854775807, en cambio, sin signo
(UNSIGNED) va desde O hasta 18446744073709551615. Todas las funciones
matemáticas trabajan internamente con valores BIGINT.

» www.redusers .com
PHP -s- MYSQL DESDE CERO [!fi3;fi 55

FLOAT[(M,D)]
Sirven para definir números con coma, con menos precisión
que DOUBLE. El rango de posibles valores va desde -3.402823466E+38
a -1.175494351E-38 ,yO Ydesde 1.175494351E-38 a 3.402823466E+38 .

DOUBLE[(M,D)], DOUBLE PRECISION[(M,D)]


y REAL [(M,D)]
Sirven para definir números con coma, con más precisión qtle FLOAT.
El rango de posibles valores va desde -1.7976931348623157E+308
a -2.2250738585072014E-308 ,O Ydesde 2.2250738585072014E-308 a
1.7976931348623157E+308 . DOUBLE PRECISION[(IvI,D)) Y REAL[(M,D))
son sinónimos de DOUBLE.

DECIMAL [ (M[,D])], DEC[(M[,D])]


y NUMERIC[(M[ ,D])]
Aquí el número es almacenado internamente como una cadena de caracte-
res (un carácter por cada dígito). Ni el separador decimal ( ,) ni el signo menos
(-) para números negativos son parte de IvI. Si no se le da ningún argumento,
por defecto, IvI es igual a 10, tomando un rango de -9999999999 hasta
99999999999 para números con signo, y D es igual a O.
DEC[(M[,D])] y NUMERIC[(M[,D))) son sinónimos de DECIMAL.

Es un estándar que permite normalizar las consultas realizadas sobre una base de
datos. En general, posibilita el manejo de los datos (inserción, actualización, eliminar,
etc.) de una base de datos. La mayoría de motores de bases de datos lo implementan:
SQL server, Oracle, Sybase, Postgres, entre otros.

www.redusers.com «
56 ttfj#;f3 3. MYSQL

VARIABLES DE TIPO NUMÉRICO

1 -128 127
O 255

Si\iALLD'-T 2 -32768 32767


O 65535

3 -8388608 8388607
O 16777215

IXT 4 -2147483648 2147483647


O 4294967295

BIGIJ\, 8 -9223372036854775808 9223372036854775807


01844674407 01844674407 018446744073709551615 018446744073709551615
3709551615 3709551615

Tabla 2. Equivalencias de tamaños entre variables de tipo numérico.

Fecha y hora
Los subtipos de datos existentes son DATETIME ,DATE, TIMESTAMP,
TIME Y YEAR.

DATE TIME
Se utiliza para trabajar con fechas y horarios a la vez. El formato por
defecto es 'YYYY-MM-DD HH:MM:SS' , pero se le puede dar otro formato
si por algún motivo necesitáramos hacerlo, por ejemplo: 'YYYYIMMIDD
HH%MM%SS'. El rango va desde '1000-01-0100:00:00' a '9999-12-3123:59:59' .
Si en el momento de ingresar un DATETIME definimos un valor inválido
(por ejemplo, minuto superior a 60), se almacenará la fecha nula; para el
formato 'YYYY-l\tIM-DD HH:MM:SS' seria '0000-00-00 00:00:00'

» www.reduserscom
PHP .,. MYSQL DESDE CERO 57

DATE
Se utiliza para trabajar solo con fechas. El formato por defecto es
'YYYY-MM-DD', pero se le puede dar otro formato si por algún motivo nece-
sitáramos hacerlo, por ejemplo: 'YYYY*MM*DD' . El rango va desde' 1000-01-01'
a '9999-12-31'. Si en el momento de ingresar un DATE definimos lID valor
inválido (por ejemplo, mes superior a 12), se almacenará la fecha nula;
para el formato 'YYYY-MM-DD' seria '0000-00-00' .

TIMESTAMP
Combinación de fecha y hora. El rango va desde el 01-enero-1970 al
año 2037. El formato de almacenamiento depende del tamaño del campo
y se visualiza como un número.

FORMATO DE ALMACENAMIENTO DE FECHA y HORA

T TA.c'fA.'"O T FOR..'fATO

TTh([ST A..i\1P(14) YYYYMMDDHHJ\1J\IISS

TLi\([ST A..i\1P(12) YI'MMDDHHJ\1J\IISS

m([ST AJ\i1P(lO) mNDDHHYIYI

Tli\1ESTAi\1P(8) YYYYNIYIDD

Tli\1ESTAi\1P(6) YYMMDD

TIMESTAlVIP(4) YYNlN!

Tli\1ESTAl\-IP(2) yy

Tabla 3. Formatos de la función TlMESTANlP.

Si en el momento de crear la tabla se define un TIMEST AMP mayor a


14, se redondea a 14; si se define un número impar, se redondea al par

www.redusers.com «
58 3. MYSQL

inmediatamente superior. Si definimos un valor inválido (por ejemplo,


minuto superior a 60) se almacenará la fecha nula. Por ejemplo:

Para TINIES·TANIP(2) sería oo.


Para TINIESTANIP(12) seria 000000000000 .

Otro punto importante es que, al ingresar una fecha o un horario, se


toman los datos ausentes como ceros. Esto supone un problema para las
fechas, ya que si tenemos un TlMESTANIP(2) , no podemos ingresar solo
el año porque eso supondría algo como 990000 (día y mes no pueden ser
cero, estarían fuera de rango). En cambio la hora, los minutos y los se-
gundos sí pueden ser cero. Es decir que no podemos insertar cadenas de
menos de 6 caracteres. En PHP hay una gran cantidad de funciones que
precisan trabajar con el formato TINIESTANIP.

TIME
Se utiliza para trabajar solo con horarios. El formato por defecto es
'HH:Nilv1:SS' (aunque también soporta 'HHH:Nilv1:SS' para períodos largos de
tiempo), pero se le puede dar otro formato si por algún motivo necesitá-
ramos hacerlo, por ejemplo: 'HH*N1M*SS'. El rango va desde '-838:59:59' a
'838:59:59' (el hecho de poder almacenar TINIE negativos nos da la pauta
de que existen más usos que el de simplemente almacenar el horario de
un determinado suceso). Si en el momento de ingresar un TINlE, definimos
un valor inválido (por ejemplo, minuto superior a 60) se almacenará la fecha
nula, para el formato 'HHJ"W:DD' sería '00:00:00'. Si ingresamos valores fue-
ra de rango, estos valores se reemplazan por el extremo más cercano.

YEAR
Se usa para representar años. Su formato es por defecto 'YYYY' (puede
definirse como ,yy,). El rango va desde 1901 hasta 2155. Si se representa el
año con solo dos dígitos, surge la siguiente particularidad: si se define

» www.redusers .com
PHP + MYSQL DESDE CERO 59

el campo tipo YEAR como un número, no podemos representar el año 2000


con 00 (sería interpretado como el año 0000), debemos hacerlo con la cade-
na 00 o con O. Si ingresamos un valor inválido, este será convertido a 0000.

Fleld [ :
Type (!) ~CHAR
VARCHAR •
LengthNalues 1
TINY1NT
Collation TEXT
Attributes DATE •
SMALLlNT
Null I'vIEDIUI'vIlNT
Defaultl INT
BIGINT
Extra FLOAT
mil DOUBLE
DECIMAL
~ DATETIME
f!ilj TIMESTAMP
- TIME
y.~ __

Figura 2. Gestor de tipos de datos para un atributo de una tabla en l'vIySQL.

Referencia de funciones
Los sistemas gestores de bases de datos, normalmente, vienen con
funciones incorporadas para mejorar y hacer más sencillas las consultas
que se realizan a una base de datos. La mayoría de estas funciones forman
parte del lenguaje SQL estándar, pero hay otras que son específicas de
algún gestor de bases de datos, lo que significa que existen grandes posi-
bilidades de que, al migrar de Ull 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
ámbito informático, es el hecho de que respeten el estándar ANSI SQL,
pero eso no se contradice con que cada base mejore las prestaciones e
incorpore funciones propias: queda a criterio de los usuarios utilizar

www.redusers.com «
60 3. MYSQL

estas funciones y conocer las virtudes y defectos de su uso. MySQL


no es la excepción y nos brinda una gran variedad de funciones para
haCelTIOSmás fácil recuperar o manipular datos de una base.
Cabe destacar que, en los ejemplos que daremos al referenciar estas fun-
ciones, los parámetros (o argumentos) son genéricos, es decir, se les da un
nombre cualquiera para que resulte más sencillo entender qué hace la fun-
ción. Pero, para sacarles partido a las funciones, los parámetros deben ser
otras funciones, o bien, campos de las tablas referenciadas en la instrucción
SQL. Los argumentos entre corchetes ( [arg]) son opcionales. A continuación,
veremos cada una de las funciones ordenadas alfabéticamente.

SELECT Consulta de datos

INSERT
UPDATE Lenguaje de manipulación
DELETE de datos (DML)

CREATE
ALTER Lenguaje de definición
DROP de datos (DDL)
RENAME

COMMIT Control de transacciones


ROLLBACK

GRANT Lenguaje de control de datos (DCL)


REVOKE

Figura 3. Ejemplos básicos de sentencias SQL ANSI.

Funciones para trabajar


con cadenas de caracteres
Estas funciones normalmente trabajan con posiciones dentro de una
cadena de caracteres: por defecto, la primera posición (el primer carácter)
está asociada al número 1; la segunda, al 2, y así sucesivamente.

» www.reduserscom
PHP + MYSQL DESDE CERO 61

ASCII(str)
Devuelve el valor del código ASCII del primer carácter del parámetro.
Por ejemplo, la consulta:

SELECT ASCII('2');
//Devuelve 50 que es el código ASCII que representa al carácter '2'.

Esta función devuelve Osi str es una cadena vacía y NULL si es nula.

BINARY
Es en realidad un operador y puede utilizarse para forzar comparacio-
nes sensibles a mayúsculas y minúsculas. Por ejemplo:

SELECT "a" = "A";


//Devuelve 1 (verdadero)

SELECT BINARY "a" = "A";


//Devuelve O(falso)

Es una buena costumbre definir como numéricos solo aquellos campos sobre los cuales
se realizarán operaciones matemáticas, como el número de productos de una empresa.
Pero en el caso de, por ejemplo, números de documento o códigos postales, esto no se-
ría necesario, recordemos que estas decisiones dependerán particularmente del sistema.

www.reduaers.com «
62 3. MYSQL

BIT_LENGTH(str)
Devuelve la longitud de la cadena str en bits.

CHAR(Nl, N2, N3, ...)


Recibe como parámetros números enteros (si recibe números con
coma o cadenas que contienen números, solo considera los enteros)
y los toma como valores del código ASCII, devolviendo los símbolos
correspondientes. Por ejemplo:

SELECT CHAR(77,121.4,83,81,'76');
//Devuelve 'MySQL'

77 representa el carácter IvI según el código ASCII, el121 representa


el carácter y, y así sucesivamente.

CHAR_LENGTH(str), CHARACTER_LENGTH(str),
LENGTH(stl~)y OCTET_LENGTH(stl~)
Devuelven la longitud de str.

CONCAT(cadenal, cadena2, cadena3, ...)


Devuelve una concatenación (unión) de las cadenas pasadas como
parámetros. Si alguna cadena es nula, devuelve NULL. Si algún argumento
es numérico, se lo convierte a cadena de caracteres. Por ejemplo:

SELECT CONCAT('una ','sola',' cadena',' - ejercicio', 1);


//Devuelve 'una sola cadena - ejercicio l'

» www.redusers .com
PHP + NIYSQL DESDE CERO 63

CONCAT_ WS(separador, cadenal,


cadena2, cadena3, ... )
Hace lo mismo que la función CONCAT solo que el primer parámetro
actúa como separador. Por ejemplo:

SELECT CONCAT_WS(',', 'uno', 'dos', 'tres');


//Devuelve 'uno ,dos,tres'

CONV(N, bascnrígen, base_destino)


Convierte números pasándolos entre diferentes bases numéricas y devuel-
ve una representación a través de una cadena de caracteres del número en
la nueva base o NULL si cualquier argumento es nulo. La base mínima es 2 y
la máxima es 36. N es interpretado como entero, pero puede ser especificado
como entero o como cadena (para representar números hexadecimales -base
16- como para poner un ejemplo). Hay otras funciones derivadas de esta:

• BIN(N): devuelve una representación binaria de N o NULL si N es nulo.


• HEX(P): si P es un número, la función devuelve una cadena que contie-
ne el valor hexadecimal (base 16) de P; si es una cadena de caracteres,
devuelve una cadena hexadecimal en donde cada carácter de P es con-
vertido a dos dígitos hexadecimales. Devuelve NULL si N es nulo.
• OCT(N): devuelve una cadena de caracteres que contiene la representación
octal (base 8) del número N (que es de tipo LONG) o NULL si N es nulo.

Si bien hay muchas aplicaciones que nos permiten acceder a las funciones de MySQL de
forma gráfica, la línea de comandos de MySQL no deja de ser útil y muy utilizada hoy en día.

www.reduaers.com «
64 3. MYSQL

Su sintaxis es más sencilla, pero la funcionalidad puede obtenerse


utilizando COW.

INSERT
(str, pOS, len, nuevacadena)
Devuelve la cadena str reemplazando su contenido desde la posición
pos hasta la posición pos + len por la cadena nuevacadena.

SELECT INSERT('el río dulce', 4, 3, 'Mar');


//Devuelve 'el Mar dulce'

ELT(N, strI, stl'2, strS, ...)


Devuelve strl si)í es igual a 1, str2 si)í es igual a 2, y así sucesiva-
mente. Si )í está fuera de índice, devuelve NULL.

FIELD(stl~,str l, strz, strS, ...)


Devuelve el índice (comenzando a contar desde 1) de la cadena str
en strl, str2, etcétera, y O si no encuentra la cadena. Por ejemplo:

SELECT FIELD('bbb', 'aaa', 'bbb', 'ccc', 'ddd', 'eee');


//Devuelve 2

FIND _IN_SET(stl', strlista)


Devuelve la posición de str dentro de la lista strlista, O si no está en la lista
o si la lista está vacía, y NULL si algún parámetro es nulo. Por ejemplo:

» www.reduserscom
PHP .,. MYSQL DESDE CERO [!j;j3;fi 65

SELECT FIND -IN-SET('b','a,b,c,d');


//Devuelve 2

Esta función podría no funcionar correctamente si en str hay alguna coma.

INSTR(str,subcadena)
Vea la función POSITION.

LCASE(str) y LOWER(str)
Devuelven la cadena str en minúsculas. Para pasar a mayúsculas ver UCASE.

LEFT( str, N)
Devuelve N caracteres de la cadena str empezando desde la izquierda.

LIKE
Es muy utilizada y trae muchos beneficios al permitirnos incorporar las
llamadas expresiones regulares (que podemos encontrar en el estándar ANSI
SQL) en nuestras consultas SQL. Devuelve 1 si hubo coincidencias y O si no.

OPERADORES

O/o Representa un número cualquiera de caracteres, incluso ninguno.

Busca exactamente un carácter.

Tabla 4. Operadores de la función LIKE.

www.redusers.com «
66 3. MYSQL

Por ejemplo:

SELECT 'Buscar!' LIKE 'Buscar ';


//Devuelve 1

SELECT 'Buscar!' LIKE '%B%c%';


//Devuelve 1

SELECT 'Buscar!' LlKE 'Buscar! ';


//Devuelve O

SELECT 'Buscar!' LIKE '%G%x%';


//Devuelve O

SELECT 10 LlKE '1 %';


//Devuelve 1

Si quisiéramos buscar cadenas que contuvieran el carácter % o _, tendria-


mos que anteponer la barra (carácter de escape) antes. Se puede modificar el
carácter de escape por medio de la cláusula especial ESCAPE. Por ejemplo:

SELECT 'Buscar_' LIKE 'Buscarj "ESCAPE '1';


//Devuelve 1

Las comparaciones con LlKE son insensibles a mayúsculas y minúsculas.


Podemos usar la función BYNARY para forzar lo contrario. Por ejemplo:

Para ingresar al monitor de MySQL se puede usar la sintaxis: MySQL-unombre_de_usua-


rio -pcontraseña <enter> , o bien, IvlySQL -u nombre_de _ usuario -p <enter> .

» www.redusers .com
PHP .,. MYSQL DESDE CERO 67

SELECT 'buscar' LIKE BINARY 'BUSCAR';


//Devuelve O

LOAD _FILE(ruta _completa _a_nombre _archivo)


Lee el archivo y devuelve su contenido como una cadena. Por ejemplo:

UPDATE nombre tabla


SET columna=LOAD_FILE("/tmp/picture")
WHERE id=l;

LOCATE(subcadena, str)
Devuelve la posición de la primera ocurrencia de subcadena en str (Osi
no hay coincidencias). Es similar a INSTR solo que los argumentos están
en orden inverso (primero str y luego subcadena). Si se le da un tercer argu-
mento (POS), la función comenzará a buscar coincidencias a partir de POS.

LPAD(str, LEN, COMPLETAR_CON)


Devuelve la cadena str, completada por la izquierda con la cadena
CO.tvIPLETAR_CON hasta que str sea de LEN caracteres de longitud.
Si str tiene LEN caracteres, la función devuelve str sin modificaciones.
Si str tiene más caracteres que LEN, la función trunca la cadena str y
devuelve los primeros LEN caracteres de str. Por ejemplo:

SELECT LP AD('cadena' ,10,'x');


//Devuelve 'xxxxcadena'

Para completar por la derecha ver la función RPAD

www.redusers.com «
68 3. MYSQL

LTRIM(str)
Devuelve la cadena str sin los espacios a la izquierda (si es que los tiene):

SELECT LTRTh'I(' por quien doblan las campanas ');


//Devuelve 'por quien doblan las campanas'

Ver también RTRlM, TRlNI.

MAKE_SET(índice, strl, str2, ...)


Devuelve las cadenas que corresponden a índice (índice 1 es str l ,
índice 2 es str2, ...)

SELECT MAKE SET(l,'a','b','c');


//Devuelve 'a'

MATCH (coll, col2, ...) AGAINST


(cadena _a_buscar
Devuelve un número positivo si se encontró alguna cadena_a_buscar en
coll , co12 , ... Para poder utilizar esta opción, hay que definir la tabla en el
momento de crearla de una forma particular:

CREATE TABLE artículos (


íd INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
coll VARCHAR(200),
col2 TEXT,
FULLTEXT (coI1, col2)
);

» www.reduserscom
PHP -s- MYSQL DESDE CERO 69

Donde las columnas que se utilizan en MATCH tienen que haber sido
previamente definidas en FULLTEXT en el momento de crear la tabla.

MID(stl', POS, LEN)


Devuelve una subcadena de LEN caracteres de longitud, partiendo desde
el carácter de la posición POS de la cadena str. Por ejemplo:

SELECT SUBSTRING('tesoro', 4, 3);


/!Devuelve 'oro'

Esta función es idéntica a SUBSTRING.

POSITION(subcadena IN str)
Devuelve la posición de la primera ocurrencia de subcadena en str o
O si no hay coincidencias. Esta función tiene la misma funcionalidad que
LOCATE, solo cambia la forma de pasarle los argumentos.
Por ejemplo:

SELECT LOCATE('robin' IN 'batman y robin');


/!Devuelve 10

QUOTE(str)
Esta función fue agregada en MySQL versión 4.0.3. Reemplaza los caracte-
res que correspondan por sus respectivas secuencias de escape.

SELECT QUOTE("D'alessandro");
/!Devuelve 'D\'alessandro'

www.redusers.com «
70 3. MYSQL

REPEAT(str, N)
Devuelve str concatenada N veces o NULL si str o N es nulo.

SELECT REPEAT('lapiz azul ',2);


//Devuelve 'lapiz azullapiz azul '

REPLACE(str, BUSCAR, REEMPLAZAR)


Devuelve str reemplazando todas las ocurrencias de la cadena BUSCAR
por la cadena REE:tvIPLAZAR. Por ejemplo:

SELECT REPLACE('la hoja blanca', 'blanca', 'negra');


//Devuelve 'la hoja negra'

REVERSE(str)
Devuelve la cadena str en orden inverso.

RIGHT(str, N)
Devuelve N caracteres de la cadena str empezando desde la derecha.

RPAD(str, LEN, COMPLETAR_CON)


Devuelve la cadena str, completada por la derecha con la cadena
CO:tv1PLETAR_CON hasta que str sea de LEN caracteres de longitud.
Si str tiene LEN caracteres, la función devuelve str sin modificaciones. Si str
tiene más caracteres que LEN, la función trunca la cadena str y devuelve
los primeros LEN caracteres de str.

» www.redusers .com
PHP + MYSQL DESDE CERO 71

SELECT RP AD('cadena' ,10,'x');


//Devuelve 'cadenaxxxx'

RTRIM(str)
Devuelve la cadena str sin los espacios a la derecha (si es que los tiene).
Como el ejemplo que aparece a continuación. Ver también LTRIlVI, TRIM.

SELECT RTRIJ.\II('adios a las armas ');


//Devuelve ' adios a las armas'

SPACE(N)
Devuelve una cadena compuesta por N espacios.

STRCMP(strl, str2)
Devuelve Osi strl y str2 S011 iguales, -1 si strl es más chico (de acuerdo
al ordenamiento actual) que str2, y 1si str2 es más chico (de acuerdo al
ordenamiento actual) que strl . Por ejemplo:

SELECT STRCMP('text', 'text2');


//Devuelve -1

SELECT STRCMP('text2', 'text');


//Devuelve 1

SELECT STRCMP('text', 'text');


//Devuelve O

www.reduaers.com «
72 ttfj#;f3 3. MYSQL

SUBSTRING(str,pos,len)
También admite la forma SUBSTRING(strFROM pos FOR len) .
Ver la función MID.

SUBSTRING _INDEX(str, delim, count)


Si count es positivo, busca las ocurrencias de delim dentro de str comen-
zando desde la izquierda. A la ocurrencia nlimero count, devuelve lo qlle
está a la izquierda de esta. Si count es negativo, busca las ocurrencias de
delim dentro de str comenzando desde la derecha. A la ocurrencia número
count, devuelve lo que está a la derecha de esta. Por ejemplo:

SELECT SUBSTRING _INDEX(',,,,,,,v.MySQL.com', '.', 2);


//Devuelve '\V\vvv.MySQL.

SELECT SUBSTRING_Il\1J)EX('~.MySQL.com', '.', -2);


//Devuelve 'MySQL.com'

TRIM([[BOTH I LEADING I TRAILING]


[cadena_a_borrar] FROM] str)
Si se utiliza sin opciones (o con la opción BOTH, es lo mismo) devuelve la
cadena str eliminando las ocurrencias de cadena a borrar al final y al principio.

La utilidad de las funciones provistas por MySQL es muy poderosa, pero se puede
incrementar anidando las funciones para obtener el resultado buscado.

» www.redusers .com
PHP + MYSQL DESDE CERO 73

Si cadena_a_borrar no se especifica, se asume por defecto que es un espacio.


Con la opción LEADING se borran solo las ocurrencias de cadena_a_borrar
desde la izquierda. Con la opción TRAILING se borran solo las ocurrencias
de cadena, a_borrar desde la derecha. Por ejemplo:

SELECT TRIl\'1(' algo ');


//Devuelve 'algo'

SELECT TRIM(LEADING 'x' FROM 'xxxalgoxxx');


//Devuelve 'algoxxx'

SELECT TRIM(BOTH 'x' FROM 'xxxalgoxxx');


//Devuelve 'algo'

SELECT TRIM(TRAILING 'xyz' FROM 'algoxxyz');


//Devuelve 'algox'

UCASE(str) y UPPER(str)
Devuelven la cadena str en mayúsculas. Para pasar a minúsculas ver LCASE

Funciones para trabajar


, .
con campos numericos
Todas las funciones matemáticas devuelven NULL en casos de error.
Si una operación excede el rango del tipo de dato BIGINT (64 bits), el resul-
tado que se obtiene es o. Son válidos los operadores elementales ( +, -, *, /) Y
la regla de los paréntesis (por ejemplo: ((a + b) * e) es distinto de (a + b * e».

-(X)
Cambia de signo el argumento. Por ejemplo:

www.reduaers.com «
74 3. MYSQL

SELECT -(-2);
//Devuelve 2

ABS(X)
Devuelve el valor absoluto del número X.

ACOS(X)
Devuelve el arco coseno de X ex son radianes).

ASIN(X)
Devuelve el arco seno de X ex son radianes).

ATAN (X)
Devuelve el arco tangente de X ex son radianes).

CEILING(X)
Devuelve el entero (en formato BIGINT) inmediatamente superior a X.
Por ejemplo:

SELECT FLOOR(1.23);
//Devuelve 2

SELECT FLOOR(-1.23);
//Devuelve -1

COS(X)
Devuelve el coseno de X ex son radianes).
» www.redusers .com
PHP .,. MYSQL DESDE CERO 75

COT(X)
Devuelve la cotangente de X ex son radianes).

DEGREES(X)
Devuelve X (se suponen radianes) convertido a grados.

DIV
Operador, realiza una división y devuelve como resultado un número
entero. Por ejemplo:

SELECT 7 DIV 2
//Devuelve 3

Para realizar una división real se utiliza el operador l.


Por ejemplo:

SELECT 3/5;
//Devuelve 0.60

DIV está disponible desde la versión 4.1.0 de MySQL.

EXP(X)
Devuelve el número entero (2.718281828 ... ) elevado a la X.

FLOOR(X)
Devuelve el entero (en formato BIGINT) inmediatamente inferior a X.
Por ejemplo:

www.redusers.com «
76 3. MYSQL

SELECT FLOOR(1.23);
//Devuelve 1

SELECT FLOOR(-1.23);
//Devuelve -2

GREATEST(X,Y, ...)
Similar a LEAST, devuelve el mayor de los argumentos.

INTERVAL(N, NI, N2, N3, ...)


Devuelve Osi N es menor a NI, 1 si N es menor a N2, 2 si N es menor a N3,
Y así sucesivamente. Se detiene a la primera verdad (si N es menor a NI
devuelve Oy no compara N con N2). Los argumentos deben ser enteros (serán
tratados como tales). Es obligatorio que ~1<~2<N3< ...<NN. Por ejemplo:

SELECT ~TERVAL(23, 1, 15, 17,30,44,200);


//Devuelve 3

SELECT INTERV AL(10, 1, 10, 100, 1000);


//Devuelve 2

SELECT INTERV AL(22, 23, 30, 44, 200);


//Devuelve O

LEAST(X,Y, ...)
Similar a GREATEST, pero devuelve el menor de los argumentos.
Por ejemplo:

» www.redusers .com
PHP -s- MYSQL DESDE CERO 77

SELECT LEAST(2,O);
//Devuelve O

SELECT LEAST(34.0,3.0,5.0,767.0);
//Devuelve 3.0

SELECT LEAST("B" ,"A" ,"C,,)·,


//Devuelve "A"

LN(X)
Devuelve el logaritmo natural de X. Disponible desde la versión 4.1.3.

LOG([B,] X)
Devuelve el logaritmo en base B (si B no se pasa, se asume logaritmo natu-
ral) de X La opción de la base arbitraria está disponible desde la versión 4.0.3.

MOD(N,M)
Devuelve el resto de dividir N por NI. Puede utilizarse también el signo %.

SELECT MOD(lO, 2);


//Devuelve O

SELECT lVIOD(29,9);
//Devuelve 2

SELECT 29 % 9;
//Devuelve 2

www.redusers.com «
78 3. MYSQL

Otro modo de usar la función, disponible desde la versión 4.1, es:

SELECT 29 MOD 9;
//Devuelve 2

PIO
Devuelve el valor de PI.

POW(X,Y) y POWER(X,Y)
Devuelven el valor que se obtiene al elevar X a la potencia Y.

RADIANS(X)
Devuelve X (se suponen grados) convertido a radianes.

RAND([N])
Si no se le da ningún argumento, devuelve un valor aleatorio entre O y l.
Si se le da el argumento N (entero) hace lo mismo, pero mantiene el valor
obtenido para sucesivas llamadas. Por ejemplo:

SELECT RANDO;
//Devtlelve 0.17573482386203

SELECT RAl"\TD(20);
/!Devuelve 0.15888261251047

SELECT RA..,\1J)(20);
/!Devuelve 0.15888261251047

» www.reduserscom
PHP -s- MYSQL DESDE CERO 79

SELECT RA.'\TOO;
//Devuelve 0.44566677782312

Otro uso interesante para la función es:

SELECT * FROM tablal ORDER BY RANDO;

El orden de los registros devueltos variará aleatoriamente cada vez que


se ejecute la consulta. Solo para I\1ySQL 3.23 o superiores.

ROUND(X [,D))
Devuelve el número X y lo redondea tomando D posiciones decimales
(O si no se da D). Por ejemplo:

SELECT ROIDTJ>(1.58);
/!Devuelve 2

SELECT ROUND(I.298, 1);


/!Devuelve 1.3

SIGN(X)
Devuelve el signo de X(-l si es negativo, Osi es 0,1 si es positivo).

SIN(X)
Devuelve el seno de X ex son radianes).
www.redusers.com «
80 tUja;f3 3. MYSQL

SQRT(X)
Devuelve la raíz cuadrada de x.

TAN(X)
Devuelve la tangente de X (X son radianes).

TRUNCATE(X,D)
Devuelve X truncado a D decimales. Truncar no significa redondear,
sino tomar D decimales. Si D es negativo, devuelve la parte entera de X
y pone a O los últimos D dígitos de X Por ejemplo:

SELECT TRUNCATE(I.999, 1);


//Devuelve 1.9

SELECT TR~CATE(1.999,O);
//Devuelve 1

SELECT TRlJ~CATE(12345.9876, -2);


//Devuelve 12300

SELECT TRUNCATE(122, -2);


//Devuelve 100

Hay funciones matemáticas que tal vez la mayoría de los usuarios no utilicemos nun-
ca, pero son muy útiles para programar aplicaciones orientadas al cálculo de proba-
bilidades y estadísticas de sucesos, al poder unir el hecho de manejar una enorme
cantidad de datos con una gran precisión en los cálculos.

» www.redusers .com
PHP + MYSQL DESDE CERO 81

Funciones para trabajar con fecha y hora


Cuando en algunas funciones se representa el año con solo dos dígitos,
l\1ySQL lo maneja de la siguiente manera:

• Si el año está entre 00 y 69, es tratado como 2000-2069.


• Si el año está entre 70 y 99, es tratado como 1970-1999.

ADDDATE(date,INTERVAL expr type)


Ver la función SUBDATE.

CURDATEOy CURRENT_DATE
Devuelven la fecha actual en formato 'YYYY-MM-DD' o YYYThllv1DD
(si se pone CURRENT_DATEO + O).

CURRENT_TIl\fE y CURTIl\fEO
Devuelven el horario actual en formato 'HHJvIN1:SS' o HH:NINlSS
(si se pone CURRENT_TI:NIEO + O).

CURRENT TIMESTAl\fP
Ver la función NO\V.

DATE_ADD(date,INTERVAL expr type)


Ver la función SUBDATE.

DATE_FORMAT(date,formato)
Da formato a una fecha. Existen las siguientes opciones
(atención a las mayúsculas y minúsculas):

www.reduaers.com «
82 ttfj#;f3 3. MYSQL

FORMATO DE FECHAS

T SIGNO T DESCRIPCIÓN

0/0:\1 Nombre del mes en inglés (January ...December).

%\'" Nombre del día de la semana en inglés (Sunday ...Saturday).

%D Número de día del mes en inglés (Oth, 1st, 2nd, 3rd ...).

%V Año en cuatro dígitos.

%y Año en dos dígitos.

%X Cada año tiene una cantidad de semanas. Cada semana tiene un número.
Una semana perteneciente a un año (que comienza en ese año) puede terminar
en el rulo siguiente. Lo que hace este formato es devolver el rulo (4 dígitos)
al que pertenece la semana de la fecha en cuestión. Torna COtUO primera
semana a la 01 y como primer día de la semana al domingo.

%1 Lo mísmo que %X, pero toma como primer día de la semana el lunes.

%a Nombre del día de la semana abreviado en inglés (Sun ...Sat).

%d Número de día del mes (00 ...31), siempre de dos dígitos.

°10 e Número de día del mes (0 ...31), uno o dos dígitos según corresponda.

°Alm Número de mes (00 ...12), siempre de dos dígitos.

°Alc Número de mes (0 ... 12), uno o dos dígitos según corresponda.

°Alb Nombre del mes abreviado en inglés (Jan ...Dec),

%j Número de día del año (001. ..366).

%H Hora (00 ...23), siempre de dos dígitos.

%k Hora (0 ...23), uno o dos dígitos según corresponda.

%b Hora (01. ..12).

» www.reduserscom
PHP + MYSQL DESDE CERO [!fj3;fi 83

FORMATO DE FECHAS (CO;\'TTh'UACIÓl'I')

Hora (Ol ... 12).

%1 Hora (1 ... 12), uno o dos dígitos según corresponda.

%i Minutos (00 ... 59).

%r Formato 12 horas (hh:mm:ss AM o hh:mm:ss PM).

%T Formato 24 horas (hh:mm:ss).

%S Segundos (00 ...59).

%s Segundos (OO... 59).

%p AMoPM.

Número de día de la semana en inglés (0=Sunday ...6=Saturday).

Número de semana del año (00 ...53) (domíngo como primer día).

%0 Número de semana del año (OO... 53) (lunes como primer día).

%Y Número de semana del año (01. ..53) (domíngo como primer día).

%v Número de semana del año (01. ..53) (lunes como primer día).

Tabla 5. Parámetros de DATE_FORMAT.

Cuando trabajamos con funciones para el manejo de fechas y horas, debemos tener
en cuenta que toman como tiempo actual los horarios del lugar en donde se encuentre
instalado el servidor de bases de datos. Un ejemplo es la función NOW().

www.redusers.com «
84 3. MYSQL

Por ejemplo:

SELECT DATE_FORi"IAT('1997-10-04 22:23:00', '%W %~I %V');


//Devuelve 'Saturday October 1997'

SELECT DATE FORMAT('1997-10-04 22:23:00','Soo las %H:%i:%s horas');


//Devuelve 'Son las 22:23:00 horas'

SELECT DATE FORMAT('1997-10-0422:23:00',


'%D %y %a %d %m %b %j');
//Devuelve '4th 97 Sat 04 10 Oct 277'

SELECT DATE FO~IAT('1997-10-04 22:23:00',

//Devuelve '2222 10 10:23:00PM 22:23:00006'

SELECT DATE_FORiVlAT('1999-01-01', '%X %V');


//Devuelve '1998 52'

SELECT DATE FORMAT(NO\VO, '% Y');


//Devuelve el afio actual utilizando 4 dígitos.Ver función NOWO

DAYNAME(date)
Devuelve el nombre (en inglés) del día de la fecha date. Por ejemplo:

SELECT DA~AME("1998-02-05");
//Devuelve 'Thursday'

» www.reduserscom
PHP T MYSQL DESDE CERO 85

DAYOFMONTH(date)
Devuelve el número del día dentro del mes (desde 1 a 31) de la fecha date.

DAYOFWEEK(date)
Devuelve el n-úmero de día de la fecha date ( 1 para domingo, 2 para lunes ...
7 para sábado). Es similar a ~'EEKDAY, pero numera los días de otra manera.

DAYOFYEAR(date)
Devuelve el número del día dentro del año (desde 1 a 366) de la fecha date.

EXTRACT(type FROM date)


Extrae type de la fecha date. Por ejemplo:

SELECT EXTRACT(YEAR FROM"1999-07-02");


//Devuelve 1999

SELECT EXTRACT(YEAR _~IO:XTH FRO~I"1999-07-02 01:02:03");


//Devuelve 199907

Para ver los posibles valores de type, ir a la función SUBDATE.

FROM_DAYS(N)
Es la función inversa a TO_DAYS : devuelve la fecha que se obtiene
sumando N días al año o. Por ejemplo:

SELECT FRO~I DAYS(729669);


//Devuelve '1997-10-07'

www.redusers.com «
86 3. MYSQL

FROM_ UNIXTIME(unix_timestamp [,fOI'matO])


Devuelve el unix_timestamp (ver función UNIX_TIMESTAMP ) con formato.
Si no se da el argumento formato, la función devuelve 'YYYY-MM:-DD
HH:M1vI:SS' o YYYYMMDDHHMNISS. Los posibles formatos están definidos
en la función DATE_FORMAT. Por ejemplo:

SELECT FROM -UNIXTIME(UNIX-TIMESTAMPO,'%Y %D %M%h:%i:%s');


//Devuelve '2005 6rdFebruary 21:57:10'

El resultado obtenido al ejecutar esta consulta no será el mismo que el que


figura aquí, ya que UNIX_TUvIESTAMPO depende de la fecha y horario actuales.

HOUR(time)
Devuelve la hora del horario time (desde Oa 23). Por ejemplo:

SELECT BOUR('lO:05:03');
//Devuelve 10

MINUTE(time)
Devuelve los minutos del horario time (desde Oa 59).

MONTH(date)
Devuelve el número de mes (desde 1 a 12) de la fecha date.

MONTHNAME(date)
Devuelve el nombre (en inglés) del mes de la fecha date. Por ejemplo:

» www.redusers .com
PHP .,. MYSQL DESDE CERO 87

SELECT MO~TIDAl'¡IE("1998-02-05");
//Devuelve 'February'

NOWO y SYSDATEO
Devuelve la fecha y hora actuales en formato 'YYYY-:MM:-DD HH::MM::SS'
o YYYY:MM:DDllHNiMSS (si se pone NOWO+ O).

PERIOD_ADD(P, N)
Suma N meses a P. P es un periodo de formato YY:MM: O YYYY:MM:
(como agosto de 1999 puede ser 9908 O 199908). El valor devuelto es
de tipo YYYY:MM:. Por ejemplo:

SELECT PERIOD ADD(9801,2);


//Devuelve 199803

PERIOD _DIFF(Pl,P2)
Devuelve el número de meses entre el período PI y P2 (que solo pueden
ser de formato YYMl\1 o YYYYWv1). Por ejemplo:

SELECT PERIOD DIFF(9802,199703);


//Devuelve 11

QUARTER(date)
Divide al año en cuatro periodos de tres meses cada uno y devuelve
el periodo al que pertenece la fecha date. Por ejemplo:

www.redusers.com «
88 3. MYSQL

SELECT QUARTER('98-04-01');
//Devuelve 2

SECOND(time)
Devuelve los segundos del horario time (desde Oa 59). Por ejemplo:

SELECT SECOND ('10:05:03');


//Devuelve 3

SEC_TO_TIME(segundos)
Convierte los segundos al formato 'HH:NINI:SS' o HHNINISS (si se pone
SEC _TO _TINIE( segundos) + O ).

SUBDATE(date,INTERVAL expr type)


El argumento date es un campo de tipo DATETUvIE o DATE que especi-
fica la fecha de comienzo; expr es el intervalo que se va a sumar o restar
a date; type indica que es expr. Si queremos sumar un intervalo a la fecha
date, hay dos maneras de hacerlo:

• Anteponiendo a interval el signo +.


• Utilizando la función DATE_ADD.

Si queremos restar un intervalo a la fecha date, hay dos maneras de hacerlo:

• Anteponiendo a interval el signo -.


• Utilizando la función DATE_SUB.

» www.redusers .com
PHP -s- MYSQL DESDE CERO [!fi3;fi 89

VALORES QUE PUEDE TOMAR TYPE

T \'ALORES SOPORTADOS POR TYPE T FOR.."\fATO DE EXPR

SECOl\"D SECONDS

HOL"R HOURS

DAY DAYS

MOl"TH MONTHS

YEAR YEARS

]\1JNlIT[ SECOJ'¡"D 'MINUTES:SECONDS'

HOL"R :\IDiLTE 'HOURS:MThvrES'

DAY HOL"R 'DAYS HOL"RS'

YEAR :\IO:\"TH 'YEARS-MOI\lHS'

HOL"R SECO:'\l> 'HOL"RS:MII\1.;IES:SECO!\"OS'

DAY:\IDL"TE 'DAYS HOURS:MINUTES'

DAy SECO:'\l> 'DAYS HOURS:MlNUTES:SECO]'.¡"OS·

Tabla 6. Valores de type

Por ejemplo, para sumar un segundo a la fecha dada:

• Utilizando signos:

SELECT "1999-10-31 22:49:49" + L\'TERV AL 1 SECO::\TD;

www.redusers.com «
90 3. MYSQL

• Utilizando la función:

SELECT DATE ADD("1999-10-31 22:49:49", ~TERVAL 1 SECO:\TJ»;

Ambas devuelven 1999-10-3122:49:50 .


Para restar un minuto a la fecha dada:

• Utilizando signos.

SELECT "1999-10-31 22:49:49" -IJ.~TERVAL 1l\'1INUTE;

• Utilizando función.

SELECT DATE_SUB("1999-10-31 22:49:49", I:\'TERVAL Il\ID'UTE);

Ambas devuelven 1999-10-3122:48:49 .


Para sumar 1 minuto y un segundo a la fecha dada:

SELECT DATE_ADD("1997-12-31 23:59:59",


INTERVAL "1:1"l\'1INUTE_SECO~"]»;

Devuelve 1998-01-0100:01:00 .
Para sumar una hora a la fecha dada:

SELECT DATE ADD("1999-01-01", INTERVAL 1 HOUR);

Devuelve 1999-01-01 01:00:00 .


Para sumar 1 mes a la fecha dada:

» www.redusers .com
PHP "1" MYSQL DESDE CERO 91

SELECT DATE_ADD('1998-01-30', ~TERVAL 1 ~IO~TH);

Devuelve 1998-02-28.
En esta última consulta, sumamos un mes a partir del 30 de enero.
Como febrero no tiene día 30 se asume el día más cercano, o sea, su últi-
mo día (28). Las funciones ADDDATEO y DATE_ADDO son idénticas.
Las funciones SUBDATEO y DATE:._SUBO son idénticas.

TIME_FORMAT(time, formato)
Funciona del mismo modo que la función DATE_FORMAT(), solo que puede
utilizar nada más que los formatos referidos a horas, minutos y segundos.

TIME_TO_SEC(time)
Convierte time a segundos. Por ejemplo:

_ _
SELECT TThIE TO SEC('22:23:00');
//Devuelve 80580

TO_DAYS(date)
Es la función inversa a FROM_DA YS . Devuelve la cantidad de días desde
el año Ohasta la fecha date. Por ejemplo:

SELECT TO _DAYS('1997-10-07');
//Devuelve 729669

www.redusers.com «
92 3. MYSQL

UNIX_TlME STAMP (date)


El Unix timestamp es muy utilizado en funciones de PHP que trabajan con
fechas. Son los segundos transcurridos desde el l de enero de 1970 a la hora
00:00:00. Si la función IDITX_TIMESTAMP se llama sin argumentos, devuelve
los segundos transcurridos desde 1970-01-01 00:00:00 hasta ahora (NO\VO).
Si se la llama con un argumento, devuelve los segundos transcurridos desde
1970-01-01 00:00:00 hasta date. Date puede ser de tipo DATE, DATETlME,
TIMEST AMP o un número tipo YYWvIDD o YYYYWv1DD . Por ejemplo:

SELECT UNIX TIMESTAlVlP('1997-10-0422:23:00');


//Devuelve 875996580

WEEK( date [, inicio])


Si se le da solo el primer argumento, devuelve el número de semana
del año correspondiente a date. Si se le dan los dos argumentos, el segundo
permite definir el primer día de la semana (domingo o lunes), y si la prime-
ra semana del año se define con el índice 1 o o.

• Si inicio es igual a o, la semana empieza en domingo


y la primera semana es O.
• Si inicio es igual al, la semana empieza en lunes y la primera semana es O.
• Si inicio es igual a 2, la semana empieza en domingo
y la primera semana es 1.
• Si inicio es igual a 3, la semana empieza en lunes y la primera semana es 1.

WEEKDAY(date)
Devuelve el número de día de la fecha date ( Opara lunes, 1 para
martes,2 para miércoles ... 6 para domingo). Es similar a DAYOF\VEEK ,
pero numera los días de otra manera.

» www.redusers .com
PHP + MYSQL DESDE CERO 93

YEAR(date)
Extrae el año de la fecha date. Por ejemplo:

SELECT YEAR('98-02-03');
//Devuelve 1998

YEARWEEK(date [, inicio])
Devuelve el año y el número de semana de la fecha date. El segundo
argumento es opcional y funciona igual que el segundo argumento de
la función WEEK.

Funciones de conversión
Estas funciones nos permiten tomar el valor almacenado en otras
variables y convertirlos en el tipo de datos que deseemos (en la medida
que 10 permita la función). Veamos su uso.

CAST(expresion AS tipo)
La función CASI se utiliza para convertir un tipo de dato en otro.
El argumento tipo puede ser:

Al utilizar una u otra función debemos considerar la versión del servidor de bases de datos
MySQL, en donde se alojará el sitio web, Una función no soportada nos obligaría a replan-
tear partes del código fuente de la aplicación. Podemos recurrir a la ayuda y a los progra-
mas de MySQL para conocer la versión del servidor y los requerimientos de las funciones.

www.redusers.com «
94 3. MYSQL

• BINARY
• CRAR (desde versión 4. O. 6)
• DATE
• DATETUvIE
• SIGNED (entero con signo)
• TINlE
• UNSIGNED (entero sin signo)

Por ejemplo: tenemos un campo tipo texto (definido como v ARCRAR(2) )


que contiene caracteres numéricos desde 1hasta 10 Y queremos ordenar
estos caracteres. Si hiciéramos algo como:

SELECT * FROM tabla ORDER BY campo_texto;

Obtendríamos la secuencia 1,10,2,3,4,5,6, 7,8,9, pero usando CAST:

SELECT * FROM tabla ORDER BY CAST(campo_texto AS BINARY);

Obtendríamos la secuencia 1,2,3,4,5,6,7,8,9,10. CAST es sinónimo


de la función CONVERT(expresion,tipo). Ambas funciones fueron añadidas
en la versión 4.0.2.

Funciones agregadas o estadísticas


Estas funciones se aplican en un grupo de registros y devuelven un
único valor. Se usan dentro de la cláusula SELECT. Las más utilizadas son
las que describimos a continuación.

• A vo:calcula el promedio de los valores de un campo determinado.


• COUNT: devuelve el número de registros de la consulta SELECT.
• SUN1: devuelve la suma de todos los valores de un campo determinado.

» www.redusers .com
PHP .,. MYSQL DESDE CERO [y;,a;fi 95

• MA.X: devuelve el valor más alto de un campo especificado.


• MIN: devuelve el valor más bajo de un campo especificado.

Operadores de comparación
Las comparaciones pueden devolver tres valores O(falso), 1 (verdadero)
y NULL (nulo). Si en una comparación por lo menos uno de los elementos
que se están comparando es NULL, la comparación dará como resultado
NULL, excepto si se usa el operador de comparación <->

OPERADORES DE COMPARACIÓN

T SIGNIFICADO T OPERADOR T EJEMPLO

Igualdad SELECT 1 = 1,1 = 0,1 = NULL;


//Devuelve 1, O,NULL.

Desigualdad <> SELECT 1 <> 1, 1 <> 0, 1 <> 1\ruLL;


.-
l- /1D~,,.~IYe
0, 1, NULL

Menor o igual que <= SELECT 1 -c= 1, 1 -c= 10, 1 <= l\'ULL;
/1D~yo~lv~
1, 1, l\'ULL

Menor que < SELECT 1 < 1, 1 < 10, 1 < NULL;


Devuelve 0, 1, NULL

Mayor o igual que >= SELECT 1 >= 1, 1 >= 10, 1 >= NULL;
//Devuelve 1, O,NULL

Mayor que > SELECT 1 > 1, 1 > 10, 1 > NULL;


//Devuelve O,O,NULL

Trata de forma <=> SELECT 1 <=> 1, 1 <=> NULL;


especial a NULL //De,'uel,'e 1, O

¿Es nulo? IS :\l.,LL SELECT IS.NULL(l+l), ISJ\"ULL(l/O);


Devuelve 01

www.redusers.com «
96 ttfj#;f3 3. MYSQL

OPERADORES DE COMPARACIÓN (COl\JIl\"UACIÓl\")

¿Es no nulo? IS l"OT xtn.t, SELECT IS l"OT xtn.t.n-n, IS l"OT l\"ULL(l/O);


l/De,'Uelye 1, O

¿Está en la lista? SELICT ',,·eñ,·' rx (0,3,5,'wefw');


//Devuelve 1

¿No está en la lista? NOTIN SELECT ',,·eñ,·' NOT IN (O,3,5""'efw');


//Devuelve O

Tabla 7. Lista de operadores.

Operadores lógicos
Los operadores lógicos, al igual que en el desarrollo, son muy útiles
para realizar comparaciones de valores o estados de diferentes elementos.
En SQL, todos los operadores lógicos se evalúan como TRUE, FALSE,
o NULL. En MySQL, se implementan como 1 (TRUE), O (FALSE), y NULL.

NOTo!
Negación. Por ejemplo:

SELECT !(1+1);
//Devuelve ° (1+1=2, 2 es distinto de 0, 2
es verdadero, lo distinto de verdadero es falso)

SELECT! 1+1;
// Devuelve 1 (atencion los parentesis! Es equivalente a !(1) + 1:
lo distinto de 1 es falso, o sea 0, y 0+1=1, que es verdadero)

» www.reduserscom
PHP + MYSQL DESDE CERO 97

AND O && devuelve 1 si todos los operandos son verdaderos, si no,


devuelve o.
Por ejemplo:

SELECT 1 && 1;
//Devuelve 1

SELECT 1 && O;
//Devuelve O

OR 011
Devuelve 1 si alguno de los operandos es verdadero, NULL si alguno
es NULL y el otro es O; si no, devuelve o. Por ejemplo:

SELECT 1111;
//Devuelve 1

SELECT 1 11 O;
//Devuelve 1

SELECT O 11 O;
//Devuelve O

SELECT O 11 NULL;
//Devuelve NULL

SELECT 1 11 NULL;
//Devuelve 1

www.redusers.com «
98 3. MYSQL

XOR
Devuelve 1 si y solo si únicamente uno de los operandos es 1,a menos que
el otro sea NULL, en cuyo caso devuelve NULL; si no, devuelve O.Por ejemplo:

SELECT 1 XOR 1;
//Devuelve O

SELECT 1 XOR O;
//DeVllelve 1

SELECT 1 XOR NULL;


//Devuelve NULL

SELECT 1 XOR 1 XOR 1;


//Devuelve 1. Primero evalua 1 XOR 1
(que devuelve O), luego el resultado anterior y 1 (O XOR 1)

El uso del monitor de MySQL


Por lo general, para acceder a bases de datos MySQL utilizaremos
nuestras propias páginas PHP o algún programa para administración
(PHPMyAdmin o MySQLAB, por ejemplo), pero MySQL trae un progra-
ma cliente que nos permite acceder a los datos. No tiene un nombre
específico, algunos 10 llaman prompt o línea de comandos o monitor
de MySQL. Nos servirá para dar los primeros pasos con la base de datos,
conocer a fondo su sintaxis y familiarizamos con los mensajes de error.
Para ponerlo en marcha (primero debemos asegurarnos de que el ser-
vidor MySQL esté activo), lo único que tenemos que hacer es abrir una
terminal en Linux o una ventana de DOS en Windows, ir hasta el directorio
donde instalamos MySQL y entrar en la carpeta bin .

» www.redusers .com
PHP .,. MYSQL DESDE CERO 99

Ahora, según el caso, procedemos del siguiente modo:

• Si no creamos ningún usuario, lo más probable es que podamos entrar


escribiendo simplemente:

\\'lySQL <en ter>

• Si ya creamos un usuario, tenemos que entrar escribiendo:

MySQL -u nombre-de-usuario -pcontraseña <enter>

No debemos dejar espacio entre -p y contraseña, sino escribirlo todo junto.


Si todo funcionó bien, veremos un mensaje de bienvenida y el programa esta-
rá preparado para recibir nuestras instrucciones. Podremos ingresar senten-
cias SQL de cualquier tipo. Las sentencias terminan con ; (punto y coma), esto
significa que, aunque presionemos la tecla ENTER«enter», esto no producirá
ningún cambio salvo el de introducir una nueva línea. Para ejecutar una sen-
tencia tenemos que escribirla, fmalizarla con ; y presionar ENTER«enter».

PROMPT DE MYSQL

MySQL> Listo para un nuevo comando.

-> Esperando una nueva línea.

,> Esperando la siguiente línea, hay una cadena abierta con' (comillas simples).

'> Esperando la siguiente línea, hay una cadena abierta con" (comillas dobles).

Tabla 8. Lista de posibles prompt.

www.redusers.com «
100 3. MYSQL

La tercera y cuarta opción de la tabla se dan, por ejemplo, cuando


estamos ingresando una cadena de texto. Todo 10 que escribamos será
parte de la cadena sin importar si es un ; (punto y coma) o un <enter>
o cualquier otra cosa que no sea el correspondiente cierre de la cadena
(si abrimos la cadena con comillas dobles, el cierre será comillas do-
bles; si abrimos la cadena con comilla simple, el cierre será otra comilla
simple). Para cerrar el programa y volver a DOS o al prompt de Linux,
existen las directivas quit y exit _ Para cancelar una directiva (antes de
finalizarla con ;) existe la directiva \c_ Por ejemplo:

fvlySQL> SELECT * FROM alumnos


->WHERE
-> \c
fvlySQL>

Algunos ejemplos:

fvlYSQL> CREATE DATABASE ejemplo;

fvlYSQL> USE ejemplo;


MYSQL> CREATE TABLE tablal (
-> campo! INT(4) UNSIGNED,
-> campo2 VARCHAR(25) NOT NULL
-> );

fvlYSQL> INSERT INTO tablal VALUES (2, 'CADENA A');

fvlYSQL> INSERT INTO tablal VALUES (1, 'CADENA B');

fvlYSQL> SELECT * FROM tablal WHERE campol >= 1;

fvlYSQL> DROP TABLE tablal;

fvlYSQL> EXIT

» www.redusers .com
PHP .,. MYSQL DESDE CERO 101

Hay comandos que devuelven un gran número de filas. Para guardarlas,


ingresamos al monitor de MySQL escribiendo una de estas opciones:

~lySQL -u nombre_ de_usuario -pcontraseña --tee="uno.txt" <enter>

l\1ySQL --tee="uno.txt" <enter>

Todos los comandos y sus salidas se guardarán en el archivo UI10.txt


(en el mismo directorio donde se encuentra MySQL), qtle no podrá ser
abierto mientras la conexión esté activa. Por último, para obtener un lis-
tado completo de las opciones para ingresar al monitor podemos escribir:

~(ySQL -?<enter>

~lySQL -? > opciones.txt<enter>

La primera muestra las opciones por pantalla, mientras que la segunda


las guarda en el archivo opciones. txt, dentro de la misma carpeta bino

Realizamos una introducción a MySQL y analizamos las posibilidades que puede brindar-
nos. Algunas de ellas son: los tipos de tablas y los tipos de datos soportados para definir
campos. Por último, repasamos las funciones e iniciamos el uso del monitor MySQL.

www.redusers.com «
102 tUja;f3 3. MYSQL

Actividades
TEST DE AUTOEV ALlJACIÓ~

1 Nombre tres tipos de tablas y sus características principales.

2 ¿Cuáles son los principales tipos de datos provistos por MySQL?

3 ¿Cuál es la diferencia entre los subtipos de datos DATETIME y DATE?

4 ¿Qué valor representa el timestamp de Unix?

5 ¿Con que función podemos saber el timestamp actual?

EJERCICIOS PRÁCTICOS

1 Utilizando las funciones DATE_FORMATO y NOWO obtenga la siguiente salida:


'este año xxxx será maravilloso para los que aprendan a usar mysql) !!!!',
donde xxxx es el año actual en cuatro dígitos.

2 Eleve el número 10 al cuadrado, luego calcule la raíz cuadrada del resultado


obtenido y por último cámbiele el signo al resultado final. Todo esto utilizando
las funciones matemáticas de MySQL.

3 Dada la cadena 'Carlos Marx' obtenga 'Groucho Marx' utilizando


las funciones para manejo de cadenas de caracteres de MySQL.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: [email protected] .

» www.redusers .com
PHPy
En este capítulo, conoceremos las distintas alternativas que nos
ofrece el lenguaje PHP para acceder e, incluso, definir estructuras
de bases de datos en MySQL. Comenzaremos con las sintaxis
de funciones, analizaremos sus diferencias, y veremos algunos
ejemplos y comentarios sobres ellas .

• Conectar PHP con MySQL l 04 Obtener listados de bases de datos


mysql_ connect 104 y

tablas a través de PHP 116
mysql_pconnect 107 Uso de múltiples bases
Ejecución de sentencias 108 de datos en una aplicación 119
Creación de base de datos Cerrar conexión
a través de PHP I10 con la base de datos 121
Selección de una base Ejemplo práctico: autos.php 123
(le (Jatos 113
Creación de tablas • Resumen 125
a través de PHP 114
• Actividades 126

JI JI JI
104 4. PHP Y MYSQL

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 NIySQL.
Para hacerlo, PHP nos ofrece dos funciones: mysql_connect y mysql_pconnect,
que, aunque son similares, difieren en algunos aspectos.

mysql_connect
Esta función intenta conectar a una base de datos y requiere que se le
pasen, de manera opcional, los siguientes argumentos (en este orden):

mysql_conuectr=servídor", "nombre de usuario", "password");

• servidor: cadena de caracteres que debe contener el nombre del servidor o


bien su dirección IP. Cuando hablamos de servidor, nos referirnos a la má-
quina donde se encuentra instalado el servidor de bases de datos MySQL.
Si trabajando en forma local, podemos utilizar como nombre de servidor
localhost o 127.O.0.1 como dirección IP . También, se puede agregar el puerto
de conexión de la siguiente forma: servidor:puerto (por ejemplo localhost:80 ).
• nombre de usuario: nombre de usuario válido para acceder a la base de datos.
• password: contraseña correspondiente al nombre de usuario que hemos
ingresado anteriormente.

» www.redusers .com
PHP -s- MYSQL DESDE CERO 105

Como dijimos, los argumentos son opcionales y, si no se especifica al-


guno, se asumen los valores por defecto que se encuentran en el archivo
php.ini . Allí encontraremos las siguientes líneas:

mysql.default_port =
(puerto por defecto)

mysql.default_host =
(nombre del servidor por defecto)

mysql.default_user =
(nombre de usuario por defecto)

mysql.defaultpassword =
(clave de usuario por defecto)

Para completar las opciones del php.ini, simplemente tenemos que escri-
bir la información a continuación del signo igual. Por ejemplo, para com-
pletar solo el usuario y el nombre del servidor:

mysql.default_port =
mysql.default_host = "168.22.22.9"
mysql.default_user = "pepe"
mysql.defaultpassword =

Si tenemos valores por defecto en el archivo, pero de igual manera comple-


tamos los argumentos de mysql , connect,se tendrán en cuenta estos últimos por
sobre los primeros. Los argumentos son opcionales pero piramidales:

• Solo el nombre del servidor.


• Solo el nombre del servidor y el nombre de usuario.
• El nombre del servidor, el nombre de usuario y la contraseña.
• Dejarlos sin argumentos.

www.redusers.com «
106 4. PHP Y MYSQL

Es decir, no se puede, por ejemplo, ingresar la contraseña y dejar


vacíos los demás argumentos.
php·NoI~
Fole Edrt Formal V.tw Htlp
[PHP] --~----------------------------------------------~
• •••• ••••• ••• • ••• • •
t'~l""t/"""'"
;...................
AOOut pnp.ini ;
;'PHP's'lnltla'iiation file, generally called php.ini, i5 responsible for
; configuring many of the aspecrs of PHP'S behav10r.
PHP attempts to flnd and load this conflgurarlon from a number of locations.
The following 1s a summary of its search order:
; 1. SAPI module speclfic locatlon.
; 2. The PHPRe environment variable. (AS of PHP 5.2.0)
; 3. A number of predefined registry keys on windows (AS of PHP 5.2.0)
; 4. eurrent workin9 dlrectory (except elI)
; 5. The web server s directory (for SAPI modules), or dtrecrcry of PHP
(otherwlse ln windows)
6. The dlrectory from the --with-config-fl1e-path compile tlme option, or the
wlndows dlrectory (e:\wlndows or e:\winnt)
see the PHP docs for more speclflc informarion.
http://php.net/configuration.fl1e
The syntax of the file 1s extremely simple. whitespace and lines
beginning with a semicolon are silently ignored (as you probably guessed).
sectlon ~eaders (e.g. {FOO]) are also s11ently 19nored, even though
they mlght mean someth ng in the future.
; oirectives following the section heading [PATH- ......
w/~site] only
; apply tO PHP files in the ......
w/mysite directory. oirectlves
; following the section heading [HOSTa......
w.example.com] only apply to
; PHP files served from ""w.example.com. oirectlves set in these
; special sections cannot be overridden by user-defined INI files or
; at runtime. eurrently, [PATH-] and [HOST-] sections only ..ork under
; eGI/F'asteGI.
; http: php.net 'ini.sections

Figura 1. Configuración de las opciones de MySQL en el archivo php. ini-

PHP tiene valores por defecto (no incluidos en el php.ini) qlle se utilizan
cuando un argumento fue omitido en la llamada a mysql_connect y, además,
no tiene un valor asociado en el php.ini. Estos valores son:

• Nombre del servidor: localhost


(que es equivalente a escribir 127.0.0.1).
• Nombre de usuario: propietario del servidor.
• Password : vacío.

Si programamos de forma local, por ejemplo, para realizar pruebas de


desarrollos, no hay mayores inconvenientes en completar los valores por

» www.reduserscom
PHP -s- MYSQL DESDE CERO [!fi3;fi 107

defecto del php.ini, pero tengamos en cuenta que cualquiera que tenga ac-
ceso a ese archivo podrá ver esa información. Incluso a través de PHP se
puede utilizar la función get_cfg_var("mysql.default_passvvord") y ver la con-
traseña escrita alli. Esta función devuelve 1 (verdadero) si nos conectamos
y O (falso) si algo falló. Cuando se logra la conexión, devuelve, además,
un identificador de conexión. Por ejemplo, en la siguiente conexión,
$id_conexion sería el identificador de conexión:

$id_conexion = mysql_connect("168.22.22.3", "pepe", "grillo");

Uno de los argumentos de mysql connect es el servidor al que nos quere-


mos conectar (alli estarán guardadas las bases de datos), y en el cual debe-
rá estar instalado y activo el servidor de bases de datos.

rnysql_pconnect
Funciona de manera similar a mysql_connect con la diferencia de que
las conexiones abiertas con mysql_pconnect (la p significa persistente)
no se cierran -persisten- cuando termina la ejecución del archivo PHP
(con mysql_connect sucede esto). Si al llamar a esta función ya existía
una conexión abierta idéntica, se utiliza esa conexión, de lo contrario,
se la crea. La calificación idéntica quiere decir que los argumentos

Recordemosque,paraempezara interactuarconunabasededatos(esdecir,a realizar


consultasenel lenguajeSQL), debemosprimeroaseguramosdequelos servidores(el
de páginasweb y el de bases de datos) estén funcionando,y que la conexiónse haya
realizadoconéxito(medianteuna delasfuncionesmysql_connect o mysqlpconnecn

www.redusers.com «
108 4. PHP Y MYSQL

"servidor","nombrede usuario" y "password" son iguales en las dos conexio-


nes, tanto la que se intenta abrir como en la que está abierta.
Esta función, al igual que mysql_connect, también devuelve un identifica-
dor de conexión. Su sintaxis es la siguiente:

mysql_pconnect("servidor", "nombre de usuario", "password");

Ejecución de sentencias
Luego de crear la instrucción SQL, hay que enviarla al servidor
para que este la resuelva. PHP nos ofrece dos funciones para hacerlo:
mysql, db_query y mysql query .

rnysql_ db _ query
Los argumentos que espera son:

mysql_db_ query("base de datos", "instrucción", identificador);

• base de datos: nombre de la base de datos sobre la cual queremos


realizar la consulta.
• instrucción: cadena qlIe 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 función intentará encontrar una conexión
abierta al servidor MySQL. Si no la encuentra, tratará de crear una
como si se llamara a mysql connecn) sin argumentos.

Ejemplos de la función:

Consulta de selección enviando una variable de cadena:

» www.redusers .com
PHP + NIYSQL DESDE CERO 109

<?php
$consulta _sql = "select * from alumnos";
mysql_ db_query("base _ejemplo", $consulta _sql);
?>

Consulta de selección escribiéndola directamente en la petición


a la base de datos:

<?php
mysql_db_query("base_ejemplo", "select * from alumnos");
?>

Esta función devuelve 1 (verdadero) si la instrucción pudo ejecutarse


y O(falso) si algo falló:

<?php
$identificador = mysql_connect("168.22.22.3", "pepe", "grillo");
$consulta _sql = "insert into alumnos values (1, 'julian maidana')";
mysql_db_query("base _ejemplo", $consulta _sql, $identificador);
?>

Antes de enviar una instrucción SQL, debemos establecer una conexión


con el servidor.

mysql_ query
Su sintaxis es la siguiente:

mysql_query("instruccion", identificador);

www.reduaers.com «
110 4. PHP Y MYSQL

• 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 función asume la última conexión
abierta con el servidor MySQL. Si no la encuentra, intentará crear una
como si se llamara a rnysql_connect() sin argumentos.

Esta función devuelve 1 (verdadero) si la instrucción pudo ejecutarse


con éxito y O(falso) si algo falló. Antes de enviar una instrucción SQL, de-
bemos establecer una conexión con el servidor.

Creación de base de datos


a través de PHP
Existen distintos programas para crear bases de datos. A continua-
ción, abordaremos la manera de hacerlo a través de un scrípt PHP con
la función rnysql_ create_db.

mysql_create_db
La sintaxis para utilizar esta función es la siguiente:

rnysql_create_ db("base de datos", identificador);

Algunas instrucciones SQL no devuelven registro y no podemos saber si se llevaron a cabo


correctamente. Para estos casos, las funciones mysql jíb query y mysql_query devuelven
valores O o 1, según se haya concretado lo requerido en la instrucción o haya fallado.

» www.redusers .com
PHP -s- MYSQL DESDE CERO 111

• base de datos: es el nombre de la base de datos que vamos a crear. Si ese


nombre ya existe o el identificador no es válido, la función devuelve O
(falso) y, obviamente, no crea ninguna base.
• identificador: un identificador de conexión. Este argumento es opcio-
nal y, si se opta por no incluirlo, la función asume la última conexión
abierta con el servidor MySQL. Si no la encuentra, intentará crear una
como si se llamara a rnysql_connect() sin argumentos.

Para más información acerca de identificadores de conexión y cómo


conectarse al servidor, veremos mysql connect en este mismo capítulo.
Esta función devuelve 1 (verdadero) si la instrucción pudo ejecutarse con
éxito y O (falso) si algo falló. Debemos tener en cuenta que esta función no
está disponible en todos los servidores y que, en su lugar, podemos utilizar
la función mysqljquery , tal cual veremos en el ejemplo presentado hacia
el final de este mismo capítulo. Ejemplo de la función mysqlcreate jíb :

<?php
Scoo = mysql_coooect("localhost", "u", "p");
Sbas = mysql, create _db("mibase");
Ilen este caso se crea la base utilizando el
Ilidentificador Scon, qlIe fue el último abierto.
?>

<?php

$cool = mysql_coooect("198.92.34.1", "u", "p");


$con2 = mysql_connect("localhost", "u", "p");
$bas = mysql_create_db("mibase", $cool);
Ilen este caso se crea la base utilizando el
Ilidentificador $conl.

?>

<?php

www.redusers.com «
112 4. PHP Y MYSQL

SUnk = mysql_ connect("localhost", "u", "p");


ir (mysql_creare _db ("mibase2"» {
//la funcion mysql_create_db devuelve 1
print("base de datos creada");
} else
{
l/la funcion mysql_create_db devuelve O
pl'int("no pude crear la base de datos");
}
Ilutilizando un condicional podemos saber
si accedimos o no a la base de datos
?>

Cada vez que se crea una base, se almacenará normalmente en el


directorio mysql\datasombre_base, mysql, que es el directorio en donde
se instaló MySQL por defecto.
l= Gl


_f_
.. TDOS9STI\QF(C:) • w.mp • bIn • my<ql • mysqIS,S.a • dota •

s..m
F''IOfJtd
~ 0.,. mod/o<tl T~
.o..k1.p .......pI•• 1110 '2011 120 S 10M fiel d•
Oo..nlo.cH rny.ql l'9201111>1 PM role I d.
Otopbo>c ptrlonn.n,t_Kt1cml 1¡g11Ol111~ PI.! J 1" de
~t<tntPl,eu Icsl II!1 .!Oll 11A8 PM F 1.'oId"
Ft.nk".ptd 1'9'2Ol11151 PM PID F.. IKB
l¡b,,"t. ,bJ.gf,'tO 1 '10'201112.03 AM FI. S1.l0~B
• Oocumtl'l's 'bJ.gf,'d 119701111 SI PM FI. SIlO KB
JI MUI'. ,bd.t.l 110 101112.03 AM fIle 18.412 KB
... PICW,tS my.ql. b,n.OOOOOl 1·10201111 SAM 000001 F,I. lKB
8 V,d ••• mysql. bin.lndex 1!,) '201111 SI PM IIIOEX Fj, lKB

Figura 2. Bases de datos almacenadas en el servidor.

Para eliminar una base de datos desde PHP, puede usarse la función
mysql dropjíb :

mysql_drop_db("base de datos", identificador);

» www.redusers .com
PHP T MYSQL DESDE CERO [!JOOj3;fi 113

Debemos tener cuidado al eliminar una base de datos, ya que en


algunos casos no podremos recuperar el contenido.

Selección de una base de datos


Normalmente, en un servidor hay almacenadas más de una base de
datos. Por eso, debemos indicar cuál 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 y los parámetros son iguales a los utilizados
en mysqljcreatejíb:

rnysql_select_db("base de datos", identificador);

Algo importante es que esta función liga o enlaza a la base de datos


seleccionada y al identificador. Esto significa que, cuando por medio de
cualquier función hagamos referencia al identificador, se tomará como
base de datos la seleccionada y no habrá que volver a indicarla cada
vez que deseemos utilizarla.

Si bien SQL (Structured Query Language ) es el lenguaje de consulta de bases de datos


más utilizado de la actualidad, existen otros, como QBE (Query By Example) y QUEL (Query
Language), que intentan competir con él aunque no lo logren, al menos por ahora.

www.redusers.com «
114 4. PHP Y MYSQL

<?php
Slink = mvsql
.. -eonneet("loealhost" , "u" , "p");,
Ssel_base = mysql, seleet_db("basel ");
?>

Esta función devuelve true (verdadero) si tuvo éxito y false (falso) si algo
falló (por ejemplo, si no hubiese ninguna base de datos con ese nombre).

Creación de tablas a través de PHP


En PHP no existe una función específica para crear tablas. Para hacerlo,
debemos utilizar las funciones rnysql_db_query o mysql query , explicadas
anteriormente en este capítulo, y escribir la instrucción SQL que corres-
ponda. Veamos algunos ejemplos:

<?php
l/cargamos en una variable toda la consulta
Stabla = "create table t l (";
Stabla .= "el int(4) unsigned not null,";
Stabla .= "e2 varehar(lOO))";
Stabla .= "ENGINE=myisam";

lila ejecutamos
if (mysql_query($tabla)) {
echo "tabla creada";
} else {
echo "error al crear la tabla";
}

?>

Para eliminar una tabla podemos hacer lo siguiente:

» www.redusers .com
PHP -e- MYSQL DESDE CERO 115

<?php
Ilcreamos la consulta
Sborrar jabla = "drop table tI";

l/la ejecutamos
if (mysql_query(Sborrar_tabla» {
echo "tabla eliminada'" ,
} else {
echo "error al eliminar la tabla";
}
?>

Para modificar la estructura de la tabla hacemos lo siguiente:

<?php
Ilcreamos la consulta
Ssql = "ALTER TABLE u MODIFY e2 BIGINT NOT NULL";

l/la ejecutamos
ir (mysql_query(Ssql» {
echo "tabla modificada'" ,
} else {
echo "error al modificar la tabla";
}
?>

Por lo general, un error en este tipo de consultas se debe a una sintaxis


incorrecta en la instrucción SQL, o bien, a un problema al establecer la co-
nexión al servidor. Usualmente veremos en nuestros programas una gran
cantidad de consultas a una base de datos; por esta razón, aunque sea en
las primeras aplicaciones, seria conveniente trabajar como en el último
ejemplo, es decir, usar mensajes de confirmación de tareas. Esto permite
saber dónde está el error cometido y además resolverlo de manera rápida.

www.redusers.com «
116 4. PHP Y MYSQL

Obtener listados de bases de datos


y tablas a través de PHP
Para saber qué bases de datos hay en el servidor, PHP nos ofrece la fun-
ción mysql_list_dbsy, para conocer qué tablas hay, la función mysql_list_tables.

rnysql_list_ dbs
La sintaxis de la función es:

mysql_list_ dbs(idenfificador);

• identificador: un identificador de conexión. Este argumento es opcional,


y, si se opta por no incluirlo, la función asume la última conexión
abierta con el servidor MySQL. Si no la encuentra, intentará crear
una como si se llamara a mysql_connectO sin argumentos. Esta función
devuelve un puntero de resultado que contiene las bases disponibles en
relación con la actual conexión ( identificador).

Antes de continuar, explicaremos la función mysql_tablename.

mysql_ tablename(lista, í);

Para darse una idea de hasta dónde se puede llegar utilizando en conjunto PHP y
l\llySQL, podernos ponercomoejemplouna aplicacióncomo PHPl\iyAdmin , que, más
allá de ser utilizadapor un grannúmerode usuarios, es realmentemuy completay
detallada en lo que respecta a sus funcionalidades.

» www.redusers .com
PHP .,. MYSQL DESDE CERO [!j;j3;fi 117

Esta función toma dos argumentos: el primero es el puntero que indica


el primer elemento de la lista de bases de datos devuelta por la función
mysql_list_dbs; el segundo es un índice para recorrer esa lista.
Puede resultar confuso, pero esta función -a pesar de su nombre- nos
sirve tanto para recorrer y obtener los nombres de las tablas de una lista,
como también para obtener los nombres de las bases de datos de una lis-
ta, según se use mysql_list_dbs o mysql_list_tables (explicada más adelante).
Veamos el siguiente código de ejemplo y su explicación:

<?php

Sres = mysql_list_dbs($link);
$i = O;
whíle ($i < mysql_fetch _ro,v($res» {
echo mysql_ tablename(Sres, Si);
echo "<BR />".,
Si++;
}

?>

• La tercera línea guarda en $res el puntero correspondiente a la lista


de las bases de datos disponibles en el servidor MySQL, utilizando
la conexión $link (definida previamente).

Las bases de datos no son propiedad exclusiva de intemet: su ámbito depende, como
casi todas las cosas, de qué queramos hacer con ellas. Tengamos presente este con-
cepto a la hora de elegir el lugar en donde guardar los datos, puede que no siempre
se precise utilizar las prestaciones de un servidor.

www.redusers.com «
118 4. PHP Y MYSQL

• La cuarta línea inicializa la variable $i.


• La quinta línea recorre la lista de bases de datos utilizando la función
mysql fetch_rovv .
• La sexta línea, mediante la función mysqltablename, muestra el nombre
de la base de datos correspondiente a la posición $i de la lista.
• La octava linea incrementa $i para pasar a la siguiente base de datos
(si es que la hay).

En lugar de mysqlfetchrow podrían haberse usado otras funciones,


como, por ejemplo, mysqlfetcbobject:

<?php
Sres = mysql_list_dbs($link);
whíle ($i = mysql_fetch_object($res» {
echo $i->Database."<br />";
}
?>

Cada vez que se llama a mysqlfetclr object , se obtiene un elemento


de la lista y se 10 asigna a $i. De ese elemento (que se trata como objeto
gracias a mysql fetchobject ), tomamos la propiedad Database (que repre-
senta el nombre) y la mostramos.

Si bien es posible crear tanto bases de datos como tablas desde PHP, también podemos
hacerlo desde aplicaciones dedicadas a trabajar con J\iIySQL.La ventaja de trabajar de esta
forma es que estas aplicaciones nos brindan posibilidades avanzadas y estandarizadas
para mantener bases de datos. Además, podremos ejecutarlas sin tener instalado PHP.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 119

mysql_list_ tables
Cumple la misma función que mysql_list_dbs, pero en vez de devolver un
puntero al primer elemento de una lista de bases de datos, lo devuelve al
primer elemento de una lista de tablas de una base de datos. Aquí también
es posible usar la función mysql_tablename explicada en rnysql_list_dbs:

rnysql_list_ tables(base de datos, identificador);

Veamos un ejemplo:

<?php
Sres = rnysql_list_tables("basel", $link);
Si = O;
whíle ($i < mysql_fetch _ro,v($res)) {
echo rnysql_ tablename($res, Si);
echo "<BR t>".,
Si++·,

Uso de múltiples bases


de datos en una aplicación
Normalmente, en nuestras aplicaciones, accedemos a una base de datos
por vez, pero PHP nos ofrece la posibilidad de hacerlo a varias al mismo
tiempo. Veremos algunas premisas para tener en cuenta sobre el tema.

Cuándo hacerlo
Hay ocasiones en las que, quizás por temas de seguridad o simple-
mente de lógica de negocios, una empresa guarda sus datos en distintas
bases. Por ejemplo, podría suceder que el sector de contaduría y el de

www.redusers.com «
120 4. PHP Y MYSQL

recursos humanos almacenaran sus datos en distintos lugares y que un


tercer sector precisara datos de los dos sectores anteriores para realizar
su tarea (por ejemplo, para liquidación de sueldos y jornales).
También, podría darse el caso de dos o más empresas distintas que
trabajan en un proyecto en común y necesitan acceder a datos de forma
COnCtIrrente.En definitiva, es una cuestión de diseño del sistema de una
empresa (o varias) y se da COllbastante frecuencia.

Cómo hacerlo
Acceder a dos o más bases de datos desde PHP es, por cierto, muy sen-
cillo e intuitivo si sabemos cómo acceder a una por vez. A continuación,
daremos algunos ejemplos:

<?php
Ilejemplo con dos bases de datos que están guardadas
Ilen diferentes servidores (netl y 127.0.0.1)

l/establecemos las conexiones


Scoul = mysql
.,1 _
coooect("oetl" '" "w" "x");
Sco02 = mysql_coooect("127.0.0.1", ''y'', "z");

Ilconstllta a una tabla de la base de datos basel


Ilqtle esta guardada en "netl"
mysql_select_ db("basel", Scon í);
$sql = "select * from productos";
mysql_ db_query("basel", Ssql, $cool);

Ilconsulta a una tabla de la base de datos base2


Ilque esta guardada en "127.0.0.1"
mysql_ select_ db("base2", Sconz);
Ssql = "select * from clieotes";
mysql_ db_query("base2", Ssql, Sconz);

» www.redusers .com
PHP -s- MYSQL DESDE CERO 121

?>
<?php
Ilejemplo con dos bases de datos que están guardadas
Ilen el mismo servidor (abracadabra)
Ilestablecemos las conexiones
$conl = mysql_connect("abracadabra", "u", "p");
$con2 = mysql_connect("abracadabra", ''y'', "z");

IIcons1llta a una tabla de la base de datos basel


/zque esta guardada en "abracadabra"
mysql_select_db("basel", $conl);
$sql = "select * from productos";
mysql_db_query("basel", Ssql, $conl);

Ilconsulta a una tabla de la base de datos base2


Ilque esta guardada en "abracadabra"
mysql_select_db("base2", Scon2);
Ssql = "select * from clientes";
mysql, db_query("base2", Ssql, $con2);

?>

Como se ve, la forma de trabajo es m1ly parecida a la que usamos al


trabajar solo con una base: lo único que hay tener presente es utilizar la
función mysql_select_dbcada vez que cambiemos de base. También recor-
demos que la declaración de variables tiene que ser comprensible en el
momento de desarrollar, y no debemos mezclar o crear nombres similares.

Cerrar conexión con la base de datos


Para cerrar una conexión, utilizamos la función mysqlcloset) . Tengamos
en cuenta que se cerrará la conexión o no, de acuerdo con la manera en
que fue abierta (ver funciones mysql_connecty mysql_pconnect).

www.redusers.com «
122 4. PHP Y MYSQL

mysql_ close
Si abrirnos la conexión con mysql_connect, podemos cerrarla utilizando
la función mysql_ close, aunque debemos aclarar que este tipo de conexio-
nes se cierran en forma automática al terminar de ejecutarse cada página
PHP en la cual hayamos abierto una conexión previamente.
En cambio, la función no cerrará la conexión si esta fue abierta utilizan-
do la función mysql_pconnect. Su sintaxis es la siguiente:

mysql_ close(identificador);

• identificador : un identificador de conexión. Este argumento es op-


cional y, si se opta por no incluirlo, la función asume la última co-
nexión abierta con el servidor 11ySQL.

<?php
Slink = mysql_ connect("localhost" , "u", "p");

ir (Slink) {
echo "Conexión Abierta!";
} else {
echo "~o puedo establecer la conexión";
}

if (Slink) {
Scerrar = mysql_ close($link);
ir (Scerrar) {
echo "Conexión cerrada!";
} else {
echo "No pude cerrar la Conexión!";
}
}

?>

» www.reduserscom
PHP .,. MYSQL DESDE CERO 123

Esta función devuelve true (verdadero) si tuvo éxito y false (falso) si


algo falló (por ejemplo si el identificador no era válido o si no se había
abierto ninguna conexión).

Ejemplo práctico: autos.php


Realizaremos una ejercitación aplicando las diferentes sentencias
que hemos aprendido hasta aquí; para esto, podemos utilizar un bloc
de notas o un entorno de desarrollo.

<html>
<head>
<title>Autos.php!</title>
</head>
<body>

<?php
l/se establece una conexión con ~1ySQL
Slink = mysql_connect("localhost", "j", "m'') or die("Error en la conexión");

l/se verifica si hayo no hay una base de datos llamada "autos"


Slista_ bd = mysql_list_ dbs(Slink);
whíle (Si = mysql_fetch_object(Slista_bd» {
if (Si->Database = 'autos'){
echo 'Ya existe una base con ese nombre.';
exit;
}
}

l/se crea la base de datos


$crear_ bd = mysqí query("create database
autos") or die("Error al crear la base");

l/se selecciona la base


mysql_ select_ db("autos", Slínk);

l/se verifica si hayo no hay una tabla llamada "modelo"

www.redusers.com «
124 4. PHP Y MYSQL

$lista _tablas = mysql_list_ tables("autos");


$i = O;
whíle ($i < mysql retch rowtstísta tablas) {
if ('modelo' == mysql_ tablename ($lista _tablas, $i» {
echo 'Ya existe una tabla con ese nombre.';
exit;
}
$i++;
}

l/se arma la instrucción para crear una tabla


$sql = "CREAJE JABLE modelo (";
$sql.= "cod_mod INJ(4) UNSIGNED NOJ NULL,";
$sql.= "desc_mod VARCHAR(lOO),";
Ssql .= "PRIl.\'IARY KEY (cod_mod)";
$sql .= ") ENGINE=l.\'IYISAl.\'I";

l/se intenta crear la tabla


if (mysql_ querytssql)
echo 'Base de datos y tabla creadas con exito';
else
echo 'Error a crear la tabla \'modelo\";

l/se cierra la conexión


mysql_ closet);
?>
</body>
</html>

¿Por qué crear bases de datos o tablas desde PHP? Si distribuimos una aplicación a usua-
rios finales, esta se encargará de crear las diferentes estructuras para su funcionamiento.

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!J;j3;fi 125

Si la base de datos y la tabla no existían y se logran crear satisfactoria-


mente, se obtiene la salida que vemos en la figura 3.

- e localhost
<>

Figura 3. Salida de autos.php

Entonces, podremos ver la nueva carpeta autos:

......
_,_ . 't p

*r.~d
,,..,, •
o.t~tnOddlCd ')'1>'
,
• Otittop
JI 00wN0.ch
0._.
11
1
1 19.....
11 ..
,• .,. "'K"
1
1 111'1't.I ,..,
'd 1 11114 ""
h.~""", 1 1 ..... 'IH
• Ooc:","""",-, •. "4'"

-_
••"4'<1
ow.w
........
"',...._... .............
....... 1oor\.OOCXlO1 1
1"
Figura 4. Bases de datos autos almacenadaen el servidor .

Hemos aprendido cómo ejecutar sentencias SQL para definir la estructura de una base de
datos en MySQL: crear y eliminar bases de datos y tablas, establecer conexión y desconexión,
cómo listar tablas y bases de datos disponibles en el servidor, utilizar una o varias bases.
En el próximo capítulo nos alejaremos de las estructuras y las conexiones, y empezare-
mos a manipular los datos de la base.

www.redusers.com «
126 4. PHP Y MYSQL

Actividades
TEST DE AUTOE\' ALUACIÓ:K

1 ¿Cuál es la diferencia entre rnysql_connect y rnysql_pconnect?

2 Cuando nos conectamos a un servidor de bases de datos, ¿qué significa


poner como nombre de servidor localhost? ¿Qué diferencia hay entre localhost
y 127.0.0.1 ?

3 ¿Qué es un identificador de conexión?

EJERCICIOS PRÁCTICOS

1 En el código del archivo Cap4_practicaI, ¿qué conexiones (si es que hay


alguna) quedan abiertas?
2 Se quiere crear la tabla t l En el código del archivo Cap4_practica2,
suponiendo que la conexión con el servidor sea válida y la base de datos
se haya creado satisfactoriamente, ¿qué error se comete?, ¿qué falta?

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: pl'[email protected] .

» www.redusers .com
Utilizar S Len PHP
En este capítulo, haremos un recorrido por las distintas funciones que
PHP nos ofrece para realizar consultas de selección y de modificación
(el ingreso, la baja y la actualización de registros) .

..Consultas de selección 128 ..Delete 150

..Recorrer las filas devueltas ..Update 152


de una consulta 129
..Ejemplo práctico: libros.php ...152
..Moverse entre registros 142
..Resumen 167
..Número de registros
y campos devueltos 144 ..Actividades 168

..Insert 148

JI JI JI
128 5. UTILIZAR SQL EN PHP

Consultas de selección
El lenguaje de consulta SQL es sintético, muy potente y utilizado por dis-
tintos gestores de bases de datos. Cuando queremos realizar consultas de
selección (esto es, recuperar registros de una o más tablas), podemos obtener
millones de registros con solo una linea de código.
Veremos las distintas posibilidades que existen para extraer datos y
luego trabajar con ellos.

Selección simple
Nos referimos a consultas a una sola tabla por vez. Este tipo de consultas
son poco frecuentes en sistemas que tienen un diseño complejo.

SELECT * FROMTABLAl;

El asterisco * tomará todos los valores que contiene la TABLAl •

Consultas multitabla
Son consultas qlIe implican varias tablas a la vez, o sea, que recuperan
datos de varias fuentes. Son muy comunes. A lo largo del capitulo, vere-
mos cómo solucionar el problema que representa tener dos o más colum-
nas de varias tablas diferentes con el mismo nombre.

SELECT * FROMTABLAl, TABLA2 'W'HERE TABLAl.A = TABLA2.B;

En esta consulta, tomaremos todos los valores de las TABLAl y TABLA2,


pero solamente las que cumplan con la condición TABLAl.A = TABLA2.B .

» www.redusers .com
PHP .,. MYSQL DESDE CERO 129

Subconsultas
Las sub consultas se implementaron en MySQL a partir de la versión 4.1, lo
cual potencia el motor de base de datos para selecciones de datos complejas.

SELECT * FROMTABLAl \VHERE TABLAl.A =

(SELECT B FROMTABLA2 WHERE C > 3);

l/compara todos los valores de A con los valores que


l/devuelve la segunda consulta.

Si el motor de base de datos no soporta subconsultas, no debemos


preocuparnos, son perfectamente reemplazables: solo tendremos que rea-
lizar en lugar de una consulta, dos o más.

Recorrer las filas devueltas


de una consulta
Al realizar una consl1lta a una base de datos, PHP permite guardar los
resultados en forma de objetos o también de arrays (matrices) para acce-
der a ellos utilizando índices, ya sea numéricos o alfanuméricos. A conti-
nuación, haremos un recorrido por las distintas posibilidades.

rnysql_fetch_array
Esta función nos permite recuperar filas y acceder a los valores de cada
campo como si se tratase de una matriz. Su sintaxis es la siguiente:

mysql_fetch _array(id _consulta, tipo_indice);

www.redusers.com «
130 5. lJTILIZAR SQL EN PHP

Cuando se envía una consulta al servidor (por ejemplo, con mysql query
° lnysql_db_query)de bases de datos, el resultado devuelto por alguna de
estas funciones se denomina id_consulta.
Para recuperar los datos devueltos por la consulta (si es que los hay), una
de las funciones que podemos utilizar es mysql_fetch_array, a la cual se le pasa
como argumento el identificador de la consulta (en este caso id_consulta).
Cada vez que se llama a mysql_fetch_array,el puntero interno avanza
una fila. La primera vez que se la llama, se posiciona en la primera fila
(si es que hay primera fila). En el ejemplo que presentamos a continua-
ción cada vez que se llama a la función, se asignan a la matriz Sfila los
campos de la consulta $sql. Cuando no haya más filas, la matriz toma
el valor FALSE y el bucle WHILE termina.

<?php
$sql = "select * from tabla";
Sres = mysql_query($sql);
while (Sfila = mysql_fetch_array($res)) {
••••••
}
?>

Como esta función trata a cada fila como si fuera una matriz, el ar-
gumento tipojndice permite definir el tipo de índice. Las opciones son
MYSQL_ASSOC, MYSQL_NUNl y :tvlYSQL_BOTH.

La función mysql_fetch_array devuelve un array que contiene los valores de cada registro
devuelto por una consulta SQL. Este array es tratado por el lenguaje PHP como cualquier
otro, y es posible aplicar sobre él funciones como count, ínarray , sort y otras.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 131

Este argumento es opcional y, si se decide no incluirlo, se asume por


defecto MYSQL_ASSOC. Debe escribirse con letras mayúsculas.

MYSQL_ASSOC
Se utiliza el nombre del campo (columna) como índice. Por ejemplo:

<?php
Ssql = "select el, c2 from alumnos";

Sres = mysql_query($sql);

whíle ($fila = mysql_fetch_array(Sres, ~'1YSQL_ASSOC» {


echo $fila["cl"];
echo "<br I>":,
echo Sfila["c2"];
echo "<br t>":,
}

?>

<?php
Ssql = "select * from alumnos";

Sres = mysql_query($sql);

while ($Cila = mysql_fetch_array($res)) {


echo $fila["cl"];
echo "<br />".,
echo $fila["c2"];
echo "<br I>":,
}

?>

www.redusers.com «
l"?
:J_ [o;j3;;;3 5. UTILIZAR SQL ENPHP

Los dos ejemplos anteriores realizan la misma acción de recorrer la


consulta mientras se cumpla la condición. Es importante destacar que
los nombres de campos son sensibles a mayúsculas y minúsculas, no es
10 mismo $ftla["campol"] que $fila["Campol"]. El modo correcto de escri-
bir los nombres de los campos dependerá de cómo los hayamos defini-
do en el momento de crear las tablas.

MYSQL_NUM
Se usa el número del campo (columna) como índice, según el orden dado
en la consulta SQL. El Í11dice O corresponde al primer campo. Por ejemplo:

<?php
$sql = "select FFF, XXX,VYY from alumnos";

Sres = mysql_ query(Ssql);

while (Sflla = mysql_fetch_array(Sres, MYSQL_1\lJM) {


echo Sflla[O]; l/muestra FFF
echo "<br 1>".,
echo Sfila[2]; l/muestra YYY
echo "<br 1>".,
echo Sflla[I]; l/muestra XXX
echo "<br 1>".,
}
?>

Antes de escribir un programa, es conveniente dividirlo en funciones. Esto nos ayu-


dará a desarrollar aplicaciones claras, legibles y entendibles no solo para nosotros.

» www.redusers .com
PHP -s- MYSQL DESDE CERO 133

Si se seleccionan todos los campos, se tendrá en cuenta el orden dado


en la creación de la tabla. Por ejemplo:

<?php
II estructura de la tabla alumnos:

II CREATE TABLE tl (
II XXX INT NOT NULL,
II FFF VARCHAR(12),
//YYYTEXT)
11) ENGINE=MYISAM;

Ssql = "select * from alumnos";

Sres = mysql_ query($sql);

while (Sflla = mysql_fetch_array(Sres, MYSQL_1\'UM) {


echo Sffia[O); Ilmuestra XXX
echo "<br 1>".,
echo Sffia(2); Ilmuestra YYY
echo "<br 1>".,
}

?>

Es lo mismo escribir $fila[O] que $fila("O"] o $fila['O'].

MYSQL_BOTH
Permite utilizar el número o el nombre del campo (columna) como
índice. Es COIUO utilizar NIYSQL_ASSOC y MYSQL_NUM al mismo tiempo.
Por ejemplo:

www.redusers.com «
134 5. UTILIZAR SQL EN PHP

<?php
Ssql = "select FFF, XXX,YYYfrom alumnos";
Sres = mysql_query(Ssql);

whíle (Sflla = mysql_ fetch_ array(Sres, l\1YSQL_BOTH» {


echo SfIla[O]; l/muestra FFF
echo "<br t>":,
echo $fIla[2]; l/muestra YYY
echo "<br t>":,
echo $fila[l]; l/muestra XXX
echo "<br I>":,

echo $fila["FFF"]; //lnuestra FFF


echo "<br />".,
echo Sflla["YYY"]; //lnuestra YYY
echo "<br t>":,
echo Sfila["XXX"]; //lnuestra XXX
echo "<hr>": ,

}
?>

Los nombres de campos también son sensibles a mayúsculas. La forma


correcta para escribir los nombres de los campos dependerá de cómo los
hayamos definido en el momento de crear las tablas.
Si realizamos una constllta sobre más de una tabla, y por lo menos dos
de los campos recuperados tienen el mismo nombre, solo tendrá validez
la última columna. Ejemplo de esta situación y posibles soluciones ptleden
encontrarse en mysqlfecth assoc, en este mismo capítulo.

rnysql_fetch_row
Esta función es como utilizar mysql_fetch_array con el argumento
tipo_indice igual a MYSQL_NUM, es decir, toma el número del campo
(columna) corno índice, según el orden dado en la consulta SQL. Por ejemplo:

» www.redusers .com
PHP + MYSQL DESDE CERO 135

<?php
$sql = "select a, b, e from tabla!";
Sres = mysql_query($sql);

while ($f = mysql_fetch_ro"v($res)) {


echo $f[O); l/muestra a
echo "<br I>":,
echo $f[2); l/muestra e
echo "<br 1>".,
}
?>

La llamada a mysqlfetchrow devuelve la próxima fila del resultado (si


es que hay una próxima) o falso si no quedan más filas. Para más informa-
ción, ver tnysql_fetch_array y MYSQL_NUM .

mysql_fetch_object
Esta función trata 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);

Es un error bastante común pensar que la función mysql numrows toma como índice
el número de columna según el orden de creación en la instrucción SQL create tableo
Esto no es así, no importa el orden de creación de la columna, sino el orden en el que
figura en la consulta de selección que se envía a J\tlySQL -generalmente a través de
mysql_query-, cuyo resultado es tomado por esta función.

www.reduaers.com «
136 5. UTILIZAR SQL EN PHP

Para recuperar los datos devueltos por la consulta (si es que los hay), una
de las funciones que se puede utilizar es mysqlfetch object , a la cual se le
pasa como argumento el identificador de la consulta (en este caso id_consulta).
Las opciones para el argumento tipo_indiceson otra vez MYSQL_ASSOC ,
MYSQL_NUM y MYSQL_BOTH. El argumento es opcional y, si se opta por no
incluirlo, se asume por defecto :tvIYSQL_ASSOC. Debe escribirse con letras
mayúsculas. Por ejemplo, si tenemos la tabla:

NBA

Código Nombre_y_Apellido Nacíonalídad Estado civil

001 Allen Iverson EE. uu Casado

004 Emanuel Ginóbili Argentina Casado

005 Eduardo Nájera México Soltero

006 Arvidas Sabonis Lituania Soltero

Podríamos acceder a los valores de cada campo de la siguiente forma:

filal - codigo = 001


fila2- nombre_y_ apellido= Emanuel Ginobili
fila3- codigo = 005
fila2- nacionalidad = Argentina

Recomendamos modificar los ejemplos desarrollados en este libro, ampliarlos en funcio-


nalidades. Esto nos ayudará a comprender y asimilar lo visto de manera rápida y segura.

» www.redusers .com
PHP -e- MYSQL DESDE CERO 137

En PHP seria:

<?php
Ssql = "select * from l\""BA";
Sres = mysql_query(Ssql);

while (Sr= mysql_fetch_object(Sres)) {


echo $f->codigo;
echo "<br t>":,
echo $f->nombre_y _ apellido;
echo "<br />".,
echo $f->nacionalidad;
echo "<br I>":,
}

?>

rnysql_ fetch _assoc


Esta función es como utilizar mysql_fetch_array con el argumento tipo_indice
igual a ivIYSQL_ASSOC, es decir que toma el nombre del campo (columna)
como índice. Si realizamos una consulta sobre más de una tabla y por lo me-
nos dos de los campos recuperados tienen el mismo nombre, solo tendrá vali-
dez la última columna. Por ejemplo, si tenemos las siguientes tablas:

Código! Nombre Edad

1 Homero 38

4 Marge 37

5 Lisa 7

6 Bart 8

www.redusers.com «
138 5. UTILIZAR SQL EN PHP

Código2 Nombre Habitantes

1 Filadelfia 1200000

4 Nueva York 4000000

5 Phoenix 2000000

6 Seattle 300000

En PHP seria:

<?php
$sql = "select Codigol, TABLAl.Nombre, Tabla2.Nombre,
Edad from TABLAl, TABLA2 where Codigol=Codigo2";

Sres = mysql_query($sql);

while (Sf = mysql_fetch_assoc($res)) {


echo $f["Codigol"]." -";
echo $f["Nombre"]. "<br />";
}

lila salida sera:


II 1 - Philadelfia
114 - New York
II 5 - Phoenix
II 6 - Seattle
?>

<?php
$sql = "select Codigol, TABLA2.Nombre, Tablal.Nombre,
Edad from TABLAl, TABLA2 where Codigol=Codigo2";

Sres = mysql_query($sql);

» www.redusers .com
PHP .,. MYSQL DESDE CERO 139

while (Sf = mysql_fetch_assoc(Sres)) {


echo Sf["Codigol"]." - ";
echo Sf['~ombre"]. "<br 1>";
}

lila salida será:


111 - Homero
114 - Marge
II 5 - Lisa
116 - Bart
?>

Para acceder a las dos columnas con el mismo nombre al mismo


tiempo, tenemos al menos dos posibilidades:

• Usar índices numéricos, como se explicó en mysql fetch row .


• Usar alias en las consultas. Por ejemplo:

<?php
Ssql = "select Codigol, TABLA2.Nombre as nom2, Tablal.Nombre
as noml, Edad from TABLAl, TABLA2 where Codigol=Codigo2";

Sres = mysql_quel)'($sql);

while (Sf = mysql_fetch_assoc(Sres)) {


echo $f["Codigol"]." - ";
echo $f["noml"]." - ";
echo $f["nom2"]. "<br />";
}

lila salida será:


II 1 - Homero - Philadelfia
114 - Marge - New York
II 5 - Lisa - Phoenix
II 6 - Bart - Seattle
?>

www.redusers.com «
140 5. UTILIZAR SQL ENPHP

Los nombres de campos son sensibles a mayúsculas y minúsculas.


La forma correcta de escribir los nombres de los campos dependerá de
cómo los hayamos definido en el momento de crear las tablas.
Si necesitamos trabajar solo con índices numéricos o con índices
numéricos y asociativos, utilizaremos las funciones mysqlfetch row o
bien, mysql_fetch_array.

mysql_fetch_field
Esta función no recupera los datos contenidos en una columna, pero
permite obtener información acerca de la estructura del campo y trabajar
con él como si fuera un objeto, de la siguiente manera:

$campo->name; l/devuelve el nombre de la COIUlnl1a

Cada vez que se llama a mysql_fetch_field, devuelve el campo siguiente


(que figura en la instrucción SQL). name es solo una propiedad disponible,
el listado completo es el siguiente:

• name: nombre de la columna.


• table: nombre de la tabla a la que pertenece la columna.

La función mysqlfetchfield permiteobtener,entre otros datos, la longitudmáxima


de una columna,como se explicaen este capítulo.Esto puede ser particularmente
interesanteen el momentode validar el ingresode datos a la tabla en cuestión y no
sobrepasarel valor máximopermitidode una columna.Eventualmente, podríamos
preparar mensajesde errorpersonalizadosa partir de estos datos.

» www.redusers .com
PHP -s- MYSQL DESDE CERO 141

• max_length: longitud máxima de la columna.


• not_null: 1 si la columna no contiene un valor nulo, si no O.
• primarykey : 1 si la columna es clave primaria, si no O.
• tmique_key: 1 si la columna es clave única, si no O.
• multiple_key: 1 si la columna es clave no única, si no O.
• numeric: 1 si la columna es numérica, si no O.
• blob: 1 si la columna es un BLOB, si no O.
• type: el tipo de dato de la columna.
• unsigned: 1 si la colllmna es unsigned, si no O.
• zerofill: 1 si la columna es zero-filled, si no O.

Es muy importante escribir los nombres de las propiedades en minús-


culas. Encontraremos más información sobre tipos de datos (numeric,
blob, otros) en los capítulos 2 y 3, donde también encontraremos infor-
mación sobre primary key , unique key, nombres de columnas, nombres de
tablas y demás. La forma de uso es la siguiente:

<?php
Ssql = "select a , b , e from alumnos'" ,
Sres = mysql_query(Ssql);
while (Scampo = mysql_fetch_field(Sres)) {
echo $campo->name. "<br 1>";
echo $campo->table. "<br />";
echo $campo->type. "<br />";
}

// En la primera llamada a mysqlfetchfield se


// mostraran las propiedades de la columna a, en la
II segunda de b, y en la tercera de la c.
?>

www.redusers.com «
142 ttfj#;f3 5. UTILIZAR SQL EN PHP

Moverse entre registros


Cuando usamos las funciones que nos provee PHP para recorrer las
filas devueltas por una instrucción SELECT (esto es mysqlfetchjarray ,
mysql_fetch_object ) mysql_fetch_assoc .mysqlfetch row), vemos que, ante
cada llamada a estas funciones, se avanza al registro siguiente (si es
que 10 hay). Para volver hacia atrás o para posicionamos en algún regis-
tro específico, existe la función mysql_data_seek.

mysql_data_seek
La sintaxis de la función es:

mysql_data _seek(id_consulta, numero _fila);

Al enviar una consulta al servidor (con mysql_query o con mysqldbquery ,


por ejemplo) de bases de datos, el resultado devuelto por alguna de estas
funciones se denomina id_consulta. El argumento numero_fila es el número
de fila a la cual queremos acceder. A la primera fila corresponde el valor O.
Luego de llamar a la función, la primera llamada a cualquier función para
recorrer las filas devueltas (rnysql ferch array, mysql_fetch_object, rnysql_fetch_assoc ,
mysql fetch row) devolverá la fila número numero_fila. Por ejemplo:

Recordemos verificar de manera detallada la sintaxis de las instrucciones SQL que


utilizamos en las aplicaciones; es un error común referenciar en nuestras consultas
nombres de tablas o campos inexistentes. Puede ser de ayuda probar las consultas
en otros programas, como PHPMyAdmin o ~IySQLFront.

» www.reduserscom
PHP T MYSQL DESDE CERO 143

cod S nom s

1 PHP

2 Perl

3 Ruby

4 Python

<?php
$sql = "select nom_s from tablal";
Sres = mysql_query($sql);

whíle ($fila = mysql_fetch _arraytsres) {


echo $fila["nom s"). "<br />";
}

mysql_ data _seek(Sres ,2);


Sfila = mysql_fetch _arra~7(Sres);
echo Sfila["nom s"). "<br />";

mysql_ data _ seek(Sres ,O);


Sñla = mysql_fetch_array(Sres);
echo Sfila["nom s")."<br />";

II imprime:
IIPHP
JI Perl
II Ruby
II Python
II Rub_y
IIPHP
?>

Devuelve verdadero si tiene éxito, falso si ocurrió algún error


(por ejemplo, si el número de fila numero_fila no existe).

www.redusers.com «
144 5. UTILIZAR SQL EN PHP

Número de registros
y campos devueltos
PHP provee funciones para obtener el número de filas y campos devuel-
tos luego de una consulta. Veremos una descripción de cada una de ellas.

mysql_Dum_rows
Esta función solo sirve para sentencias tipo SELECT. Devuelve el núme-
ro de filas de un resultado. Su sintaxis es:

mysql_ num _ro,vs(id _consulta);

Por ejemplo:

<?php
Ssql = "select * from tablal";

Sres = mysql_query(Ssql);
$numero_mas = mysql num rowsrsres);

echo "Numero de filas devueltas: ".Snumero _filas;


?>

Si bien podríamos obtener el mismo resultado con la siguiente consulta:

select count(*) from tabla;

En muchos casos, hariamos el código más sencillo sin la necesidad


de utilizar mysql numrows .

» www.redusers .com
PHP .,. MYSQL DESDE CERO 145

rnysql_ affected _ rows


Esta función solo sirve para sentencias tipo INSERT , UPDATE o DELETE
y devuelve el número de filas involucradas en la última instrucción SQL.
SU sintaxis es la siguiente:

mysql_affected_rowsüdentíñcador);

El argumento identificador es un identificador de conexión. Es opcional


y, si se opta por no incluirlo, la función intentará encontrar una conexión
abierta al servidor MySQL. Por ejemplo, si tenemos la siguiente tabla:

cod s nom s

1 Batman

2 Robín

3 Acertijo

4 Gatúbela

5 Alfred

La función mysqljíata jeek nos permite movemos entre registros. Además, puede ser útil
para no llamar más de una vez a una de las funciones mysql_fetch_array, mysqlfetch ob-
ject, mysqljfetchjissoc o mysqlfetchrow con la misma consulta a la base de datos. Si
mantiene la variable id_ consulta, también mantiene los datos devueltos por ella, y se puede
acceder a estos a través de mysql_data_seek o alguna de las funciones mysql_fetch.

www.redusers.com «
146 5. UTILIZAR SQL EN PHP

<?php
$con = mysql_connect("l68.22.22.3", "U", "p");
$sql = "update tablal set nom_ S = " where cod_ S > 2";
Sres = mysql_ query($sql);

echo mysql_affected _ro,vs($con);


l/imprime 3
?>

<?php
$con = mysql_ connect("l68.22.22.3", "u", "p");

$sql = "delete from tablal where cod_s > 3";


Sres = mysql_query($sql);

echo mysql_affected _rews(Scen);


l/imprime 2
?>

<?php
$con = mysql_ connect("l68.22.22.3", "u", "p");

$sql = "insert into tablal values (6, 'Guason')";


Sres = mysql_query($sql);

$sql = "insert into tablal values (7, 'Fierro')";


Sres = mysql_query($sql);

echo mysql_affected _rcws(Scon);


l/imprime 1 (toma la última instrucción)
?>

Si la última sentencia fue un DELETE sin cláusula vVHERE ,


esta función debería devolver el número total de registros que
había en la tabla; sin embargo, devuelve cero.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 147

rnysql_Durn_fields
Esta función, en lugar de entregar el número de filas devueltas por
la consulta, como hace mysql numrows , o modificadas, como hace
mysql_affected_rovvs, nos permite obtener el número de campos (columnas)
devueltos por la consulta. Su sintaxis es:

mysql_oum_ fields(id _ coosulta);

Por ejemplo:

<?php
//Devuelve el número de columnas de la tabla tablal

Ssql = "select * from tablal";


Sres = mysql_query(Ssql);

Soumero_campos = mysql_oum_fields(Sres);

echo "Numere de campos devueltos: ".Soumero _ campos;


?>

<?php
//Devuelve 3 (la consulta devuelve 3 campos: a, b, e)

Ssql = "select a , b , e from tablal'" ,


Sres = mysql_query($sql);

$numero_campos = mysql_oum_fields($res);

echo "::\Tumero de campos devueltos: ".Soumero _campos;


?>

www.redusers.com «
148 5. UTILIZAR SQL EN PHP

Insert
Podemos realizar ingresos en una tabla a través de las funciones
rnysql_query o mysql db query ,pero PHP nos brinda otra función que puede
ser muy útil cuando se trabaja COll campos de autoincremento.

Campos autoincrementables
11ySQL nos permite insertar registros en una tabla evitando de forma
automática que un campo tome valores duplicados. Estos campos se lla-
man autoíncrementables y se definen en el momento de crear una tabla.
Por ejemplo:

<?php
$sql = "CREATE TABLE TI (";
$sql.= "codigo INT NOT NULL AUTO_INCREMENT, ";
$sql.= "descripcion VARCHAR(100) NOT NULL, ";
$sql .= "PRIJ.\IIARYKEY(codigo)";
$sql .= ")";

mysql_ query($sql);

$sql = "INSERT INTO TI (descripcion) VALUES ('positivo')";


mysql_ query($sql);

Ssql = "INSERT INTO TI (descripcion) VALUES ('negati"o)";


mysql_ query($sql);

Ssql = "INSERT INTO TI (descripcion) VALUES ('neutro')";


mysql_ query($sql);

// la tabla TI quedaría así:


// 1 positivo
// 2 negativo
113 neutro
?>

» www.redusers .com
PHP .,. MYSQL DESDE CERO [!fjarfi 149

Los campos autoincrementables mantienen internamente el valor máximo,


aunque lo borremos. Por ejemplo, teniendo en cuenta el ejemplo anterior:

<?php

Ssql = "DELETE FROl\1TI \"lIERE codigo = 3";


mysql_ query($sql);

Ssql = "INSERT INTO TI (descrípcíon) VALUES ('no medible')";


mysql_ query($sql);

// la tabla TI quedaría así:


II 1 lindo
112 feo
// 4 no medible
?>

unysql_insert_id
Esta función devuelve el valor (no el número de fila) del último campo
autoincremental ingresado y debe llamarse inmediatamente después
del ingreso. Su sintaxis es la siguiente:

Generalmente, la diferencia entre las funciones mysql_fetch_array , mysqlfetch _object,


mysql fetch assoc y mysql fetch row es ínfima, por eso se recomienda usar la que
más cómoda nos resulte, aunque rnysql_fetch_array puede suplantar el funcionamien-
to de la mayoría de las demás funciones.

www.redusers.com «
150 5. UTILIZAR SQL EN PHP

mysql_insert_id(identificador);

Por ejemplo, teniendo en cuenta el caso anterior:

<?php

Ssql = "INSERT INTO TI (descrípcíon) VALUES ('medible')";


mysql_ query($sql);

// la tabla TI quedaria asi:


II 1 positivo
II 2 negativo
II 4 no medible
II 5 medible
echo "Ultimo valor de codigo : ".mysql_insert_idO;

//devuelve 5
?>

Delete
No existen funciones específicas para borrar tablas o registros,
o columnas de una tabla: todo esto se hace mediante las funciones
mysql query o la mysql dbquery . Observemos algunos ejemplos:

<?php
//borrar tablas
$sql = "DROP TABLE nombre_tabla";
mysql_ quel)'($sql);

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!jOOj3;fi 151

l/borrar registros de una tabla


Ssql = "DELETE FROM nombre_tabla WHERE campo! > 4";
mysql , querytssqí);

l/borrar columnas de una tabla


Ssql = "ALTER TABLE nombre_tabla DROP COLUMN campo!";
mysql_ query($sql);
?>

Aunque sí existe una función para borrar bases de datos completas, y


es la función mysql drop db , Por ejemplo:

<?php
$cbas = mysql_create_db("mibase") 01' DIE ("no se pudo crear la base");

echo "<br I>base de datos creada";

Sbbas = mysql_ drop _db("mibase") 01' DIE ("no se pudo eliminar la base");

echo "<br I>base de datos eliminada";


?>

Entendamos la diferencia entre utilizar instrucciones para borrar tablas e instruccio-


nes para borrar todos los datos -filas- de una tabla, En las primeras se bOITala es-
tructura completa y los datos que contiene, mientras que en la segunda se mantiene
la estructura y se borran los datos,

www.redusers.com «
152 5. lJTILIZAR SQL EN PHP

Al igual que para borrar datos o estructuras no existen funciones es-


pecíficas, para modificar o actualizar estructuras de tablas o registros, se
utilizan las funciones mysql_query o mysql_db_query . Por ejemplo:

<?php

$sql = "update tablal set campo = 10";


$mysql_ query($sql);

$sql = "alter table tablal modify campo BIGINT NOT NULL";


$mysql_ query($sql);

?>

Ejemplo práctico: libros.php


Para este ejemplo, definimos la siguiente estructura para la base de datos:

LIBRO

# COD L Código del libro

NON! L Nombre del libro

FK COD A Código del autor

CANT-PAG -L Cantidad de páginas del libro

ISBN L ISBN del libro

FOTO L
-
Nombre de la imagen del libro

PRECIO L Precio del libro

» www.redusers .com
PHP -s- MYSQL DESDE CERO [!Jf,3ifi 153

AL"TOR LIBRO

# COD A Código
~ del autor

# COD L Código
~ del libro

At.:TOR

# COD A Código del autor

NONI A Nombre del autor

APE_A Apellido del autor

FK COD N Código de la nacionalidad del autor

FEC KAC A Fecha de nacimiento del autor

FEC DEC A Fecha de deceso del autor

~ACIO~_UIDAD

# COD K Código de nacionalidad

DESC K Descripción de nacionalidad

En algunos ejemplos usarnos la función mysql_fetch_array junto con la estructura de


control while para recorrer las filas devueltas por una consulta. Si sabemos que la consul-
ta devolverá solo un registro, no será necesario utilizar while; deberemos proceder del si-
guiente modo: Sfila = rnysql_fetch_array($res); para luego trabajar sobre el array Sfila

www.redusers.com «
154 5. UTILIZAR SQL EN PHP

Podemos visualizar las siguientes relaciones:

Aulor I\ac;IG.all~.CI
~

/ f'...
Autor_Ubro

"V
Ubro

Figura 1. Relaciones entre tablas.

Como primer punto, vamos a definir el archivo config.inc.php ,


el cual contendrá las directivas para conectar a la base de datos:

<?php
l/debe cambiar por los datos correctos de su
l/equipo/configuración!

$servidor = "localhost";
Susuarío = "root";
Spassword = '''';
$nombre_base = "libros";

l/se establece una conexión con MySQL


$link = mysql_ connect($servidor, Susuarío,
Spassword) or die("Error en la conexion");

//se selecciona la base


mysql_ select_ db($nombre _base, Slínk);
?>

» www.redusers .com
PHP .,. MYSQL DESDE CERO 155

Luego, vamos a definir el archivo crear_estructura.php, que nos permitirá


trasladar a una base de datos el diseño visto anteriormente. Si no existe
una base de datos llamada libros en el servidor, este archivo la creará.
Si ya existe -o si se ejecuta este archivo dos veces- se le pedirá que
modifique la variable $nombre_base, es decir, se creará otra base de
datos (si optamos por esto último, se deberá actualizar en el archivo
config.inc el nuevo nombre de la base).
Podríamos modificar el archivo crear estructura.php para que, cada vez
que se ejecute, borre la base de datos llamada libros -si es que existía-
y, luego, la cree otra vez. Intentémoslo.

<?php

l/cambie por los datos correctos!


Sservídor = "localhost";
Susuarío = "root": ,
Spassword = "";
Snombre base = "libros";

l/se establece una conexion con MySQL


Slínk = mysql_connecnsservtdor, Snsuarío,
Spassword) 01' die("Error en la conexion");

l/se crea la base de datos


mysql_ query("CREAIE DAIABASE Snombre _base") or die("Error al crear la
base $nombre_ base (puede que ya exista). Modifique la variable \$nombre_ base.");

//se selecciona la base


mysql_select_db($nombre _base, $link);

l/se crean a continuacion las cuatro tablas


$sql = "CREAIE IABLE libro (";
$sql .= "cod _1INT UNSIGNED NOI NULL,";
Ssql.= "nom_1 VARCHAR(lOO),";
Ssql .= "cod _a INI UNSIGl\'"ED NOI NULL,";

www.redusers.com «
156 5. UTILIZAR SQL EN PHP

Ssql .= "cant_pag_1 INT UNSIGi\TED,";


Ssql.= "isbo_l VARCHAR(20),";
Ssql.= "foto_l VARCHAR(lOO),";
Ssql .= "precio _I FLOAT (5, 2),";
Ssql .= "PRIMARY KEY (cod_I)";
Ssql .= ") E~GD.TE=lVIYISMI";
mysql_ quel)'($sql);

$sql = "CREATE TABLE autor_libro (";


$sql.= "cod_a INT UNSIGNED NOT NULL,";
$sql .= "cod _I INT UNSIGNED NOT NULL,";
Ssql .= "PRIMARY KEY (cod_a, cod_l)";
$sql .= ce) ENGINE=l\fYISAl\1";
mysql, querytssqí):

$sql = "CREATE TABLE autor (";


$sql.= "cod_a INT UNSIGNED NOT NULL AUTO _INCREMENT,";
Ssql .= "oom_a VARCHAR(lOO),";
Ssql .= "ape_a VARCHAR(lOO),";
Ssql .= "cod _n TIl\"YINT UNSIGi\TED NOT I'llJLL,";
Ssql .= "fec_oac_a DATE,";
Ssql.= "fec_dec_a DATE,";
Ssql .= "PRThIARY KEY (cod_a)";
Ssql .= ") E~G:NE=lVIYISAM";
mysql_ queryrssql);

$sql = "CREATE TABLE nacionalidad (";


$sql.= "cod_n TINYINT UNSIGNED NOT NULL AUTO _INCREMENT,";
$sql.= "dese_o VARCHAR(50),";
Ssql .= "PRIMARY KEY (cod_n)";
$sql .= ") ENGINE=lVIYISAlVl";
mysql, querytssqt):

l/insertamos algunos datos


mysql_quel)'("INSERT INTO nacionalidad (desc_o) VALUES ('argeotioa')");
mysql_query("INSERT ~TO nacionalidad (desc_n) VALUES ('belgica')");
mysql_ query("INSERT INTO autor VALUES

» www.redusers .com
PHP T MYSQL DESDE CERO [!JOOj3;fi 157

(1, 'julio', 'cortazar", 2, '1912-11-12', '1984-1-10')");


mysql_ query("INSERT INTO autor VALUES
(2, 'jorge luís', 'borges', 1, '1912-11-12', '1912-11-12')");
Inysql_ query("INSERT INTO autor VALUES (3, 'ernesto',
'sabato' , 1, '1912-11-12' , '1912-11-1")")-
-,
mysql query("INSERT INTO libro VALUES (1,
'uno y el universo', 3, 320, 'isbn', 'Lpng', 23_90)");
mysql query("INSERT INTO libro VALUES
(2 , 'bestiario' ""1 150 'isbn' '3 .pno'
e'· 13 90)")-,
mysql_query("INSERT INTO libro VALUES
(3 , 'octaedro' "" 1 120 'isbn' '4 .pno'
e' 16)")-,

mysql_query("INSERT INTO autor_libro VALUES (1, 2)");


mysql_query("INSERT INTO autor_libro VALUES (1,3)");
mysql_ query("~SERT D,TTO autor _libro VALUES (3, 1)");

echo 'Fin del script';

?>

En el archivo anterior, insertamos datos en las tablas. Lo hicimos desde


PHP, pero también podemos hacerlo por otros medios (el monitor de MySQL,
por ejemplo). Si todo funcionó bien, luego de ejecutar esta página en nuestro
navegador, deberíamos obtener los siguientes resultados en nuestro monitor:

La función mysqljíata jseek permite posicionarnos sobre algún registro particular de los
almacenados en un array de datos. Cada vez que llamamos a esta función, no hacernos
una consulta al servidor, sino que trabajamos con los datos almacenados en memoria de
la primera consulta, con lo que se obtiene una velocidad mayor de respuesta.

www.redusers.com «
158 5. UTILIZAR SQL EN PHP

• c:\w.mp\l>,n\mysql\mysqI5.S.8\bin\mysql.exe

Figura 2. Estructura de la base de datos a través de MySQL.

y tendríamos que poder ver el archivo de la nueva base creada:

U. ..lTl05957WOf(C) • 'NO"" • bn • m~~~1 • ~~~I5.lJ1 • di!1 • • ·t


1
Sh.,. """ - ¡"", 11.... r.ld" •

.O_cp
Fa"of.ld
1 ICVlIll
1)'1: : S.a

Oo..."lo.d~ 't.mptol hf. 'ol:j.t


OlOpb •• Ilbre~ F. 1'.I~'t
Rt<lnt PI,<. m'P'f 1 • 1111~3 PI.A Ft • 'ol~(,
pctfonn~n(c_schc:.mcJ 1 S!2Il11U,,) PI.A Jilt I.I~(I
Lb,-.na 101 t • 1111"3 "'" ro •
olJeo
• Ooturnent, fr.""'~id 1 lCl~t. 10'.16PM l'ItI F e IIJ!
"""le ibJ09~ltO 1 J rol lO 16 Pt./! Fil. • 11>~B
PI'turtS •b_togfilfJ I W.ltIl Il '\l P?I "l • IlO.a
el V,d •• , ....,j Ibdltll 1 io :01. II 11AV hl. lE.Ol.B
myoql.bon.OOO!lOl 1 10 xn; L!ol.9Al..! 001)((1 hl. !tB
4 Hom.group my:oql·bon.000!l02 1lO':Ol!I!.~!"'... ooocc~ r,le I ~n
mysql' bon.OOO!lO3 110':Ol! 10.18 PM ooocm rol: S~D
·1Li Computel _J mY"lI·bon.irnI" 110~1! 10.16 ?M IIIDEX1, I~Il
"" TnOS9S7IVOr (C:)

(l¡o NttwD,k

Figura 3. La base de datos creada, en el sistema de archivos.

A continuación, definimos el archivo buscar.php, que nos dará una


interfaz para buscar libros de nuestra base:

» www.redusers .com
PHP -e- MYSQL DESDE CERO 159

<?php

ir (!include("./config.inc.php")) {
echo "no encuentro el archivo config.inc.php !!!!";
exit;
}

II select autores
Sres = mysql_query("select cod_a, concat_ \vs(', " ape_a, nom_a)
as nombre from autor order by ape_a ase, nom_a ase");
_
Sselect autores = '<select id="cbo _ autor" name="cbo _,autor">"
$select_autores .= '<optíon \'alue="O">Todos los autores</option>';
whíle ($fila = mysql_fetch_array($res» {
$select_autores .= '<option value = ,,, .$fila['cod _a']. "'>'.
uc\vords(strtolo\ver($fila['nombre']».'</optiou>';
}
$select autores .= '</select>';

// select libros
Sres = mysql_query("select cod_l, nom_1 from libro order by nom_1 ase");
_
Sselect libros = '<select id="cbo _ libro" name="cbo _,libro">"
Sselect_Ubros .= '<option ,'alue="O''>Todos los Libros</option>';
whíle (Sflla = mysql_fetch_array(Sres» {
Sselect_libros .= '<option value='" .SfIla['cod_I']. "'>'.
ucwordsistrtotowensñla ['nom_I']». '</option>';
}
Sselect libros .= '</select>';

// select nacionalidad
Sres = mysql_query("select cod_u, desc_u from na-
cionalidad order by desc_u ase");
_
$select uacionalidad = '<select id="cbo _ nacío-
nalidad" name="cbo _ nacionalidad">" ,
$select_nacionalidad .= '<option ,'alue="O">Todas las Nacionalidades </option>';
whíle ($fila = mysql_fetch_array(Sres» {
Sselect, nacionalidad .= '<option value='" .Sfila['cod _n']. "'>'.

www.redusers.com «
160 5. UTILIZAR SQL EN PHP

ucwordststrtolowertgñlaj'desc _n']». '<loption>';


}
$select_ nacionalidad .= '</select>';

<btml>
<bead>
<title>buscar.pbp</title>
<style>
*{
font-family: Arial, Helvetica, sans-serif;
Iont-síze: 13px;
íont-weíght: bold;
color: #57534c;
text-decoration: none;
line-beigbt: 24px;
}

table {
border-top: lpx solid #57534c;
border-ríght: lpx solid #57534c;
}

td {
border-bottom: lpx solid #57534c;
border-Ieft: lpx solid #57534c;
}
</style>
</bead>

<body>

<table cellpadding="4" cellspacing="O">


<tr>
<td colspan="2">Buscador de Libros:<ltd>
<ltr>

» www.redusers .com
PHP -s- MYSQL DESDE CERO 161

<tr>
<td>&nbsp;</td>
<td>
<form actten=vmestrar j'esultados.php" metbod="POST">
<table ceUpadding="4" ceUspacing="O''>
<tr>
<td>Seleccione Autor</td>
<td>
<?php echo $select_autores; ?>
<Itd>
<Itr>
<tr>
<td=Seleccíene Libro<ltd>
<td>
<?php echo $select_libros; ?>
<ltd>
<ltr>
<tI'>
<td>Ingrese I.S.B.~.<ltd>
<td><input type=vtext" id="txt _isbn" name="txt _isbn"><ltd>
</tr>
<tr>
<td>Seleccione Nacionalidad del Autor<ltd>
<td>
<?php echo $select_nacionalidad; ?>
</td>
<ltr>
<tr>
<td>Ingrese Palabra Clave-c/td>
<td><input type="text" id="txt_palabra _clave"
name="txt_palabra _ clave'e-otd>
</tr>
<tr>
<td>&nbsp;<ltd>

www.redusers.com «
162 5. UTILIZAR SQL EN PHP

<td><input type=t'subnut" value="Buscar" id="submitBuscar"


name="submitBuscar"><input type=t'reser" value="Borrar"></td>
</tr>
</table>
</form>
</td>
</tr>
<tr>
<td colspan="2">Complete los datos que conozca y presione
el botón &quot;Buscar&quot;</td>
</tr>
</table>

</body>
</html>

Por último, el archivo mostrarresultados.php, que nos permite mostrar


los resultados de la búsqueda. Prestemos atención a la primera parte del
script, en donde se crea la consulta para recuperar los libros devueltos y
se guarda en la variable Ssql.
Las variables recibidas mediante el array $_POSTson los controles del
formulario de búsquedas y una instrucción como la qtle sigue:

ir ($_POST['nombre_control']) {
••••••
instrucciones
••••••
}

Se ejecutará, si $_POST['nombre_control'] es distinto de O (distinto de


vacío). Recordemos que, en el caso de los controles tipo <select></select> ,
se tomará como valor el atributo value de la opción ( option) elegida.
Aquí se ve el código de mostrar_resultados.php:

» www.redusers .com
PHP -e- MYSQL DESDE CERO 163

<?php

if (!include("./config.inc.php")) {
echo "no encuentro el archivo config.inc.php !!!!";
exit;
}

Ssql = " select * from autor, autor_libro, libro, nacionalidad";


$sql .= " where autor.cod _a = autor _Iibro.cod _a";
Ssql .= " and líbro.cod _I = autor _Iibro.cod _I";
$sql .= " and autor.cod _n = nacionalidad.cod _n";

if (count($_POST» {
foreach ($ POST as $c => Sv)
$_POST[$c] = mysqlreal escape strtngtsv);
}

if ($_POST['cbo _autor'])
Ssql.=" and autor.cod_a = ".S_POST['cbo_autor'];

if ($_POST['cbo _libro'])
Ssql .= " and libro.cod _I = ".S_POST['cbo _libro'];

if (S_POST['cbo _nacionalidad'])
Ssql .=" and nacionalidad.cod_n = ".$_POST['cbo_nacionalidad'];

if ($_POST['txt_isbn'])
Ssql .= " and isbn_I = "'.S _POST['txt_isbn'].""';

if ($_POST['txt_palabra _clave'] != ") {


Ssql .= " and (";
$sql.=" nom_llike ,0/0".S_POST['txt_palabra_clave']."0/0"';
Ssql .= " or cant_pag_llike '%".$ _POST['txt_palabra _clave'[. "0/0''';
Ssql .= " or ísbn Llíke '%".$ _POST['txt_palabra _clave']. "% '";
Ssql .= " or precio_llike '0/0".$_POST['txt_palabra _clave']."%''';
$sql.=" or nom_a Iike ,0/0".$_POST['txt_palabra_clave']."0/0''';
Ssql.=" or ape_a Iike ,0/0".S_POST['txt_palabra_clave']."0/0"';

www.redusers.com «
164 5. UTILIZAR SQL ENPHP

Ssql .= " or fec_nac_ a Iike '%".$ _POST['txt_palabra _cla,re')."%''';


$sql.=" or fec_dec_a Iike '%".S_POST['txt_palabra_clave')."%"';
$sql.=" or desc_n Iike '%".$_POST['txt_palabra_cla,'e')."%"';
Ssql .= ")";
}

Ssql .= " group by libro.cod _1";


Ssql .= " order by nom_1";
$res = mysql_query($sql);

<html>
<head>
<title>mostrar _resultados. php</title>
<style>
*{
font-family: Arial, Helvefica, sans-sertf;
font-síze: 13px;
Iont-weíght: bold;
color: #57534c;
text-decoration: none;
líne-heíght: 24px;
}

table {
border-top: lpx solid #57534c;
border-ríght: lpx solid #57534c;
}

td {
border-bottom: lpx solid #57534c;
berder-leñ: lpx solid #57534c;
}
</style>
</head>
<body>

» www.redusers .com
PHP -e- MYSQL DESDE CERO 165

<table ceUpadding="4" cellspacing="O">


<tI'>
<td colspan="2">

<?php

Stemp = mysqlnum rows/Sresj=s l ? '1 libro encontrado' :


mysql_num_ro\vs($res).' libros encontrados';
echo 'Resultado de la Busqueda:' .Stemp.':";

?>

</td>
<ztr>
<tr>
<td>

<table ceUpadding-"4" cellspacing="O">

<?php

if (!mysql_ num _ rowsisresj) {


echo '<td bgcolor="#COCOCO">&nbsp;
No se encontraron resultados.<ltd>';
} else {

$c=O',
whíle ($f = mysql_ fetch _array($res)) {

Scol = $c % 2 ? "#FOF3F8" : "#COCOCO";


echo '<tr bgcolor=' .Scol,'>';
echo '<td>'. ucwordsfstrtolower(Sfl'uom _I'))). , <ltd>' ;
echo '<td>' .ucwords

www.redusers.com «
166 5. UTILIZAR SQL EN PHP

(srrtolowertsñ'ape , a'].', '.Sf['nom _a'])). '</td>';


echo '<td>' .Sf['cant_pag_I']. '</td>';
echo '<td>' .Sf['isbn_I'].'</td>';
echo '<td>uSs '.Sf['precio _I'].'</td>';
echo '<tr>';

Sc++;
}
}

<ltable>

</td>
</tr>
<tr>
<td colspan="2"><a href "buscar.php">Volver al buscador<la><ltd>
</tr>
</table>

<lb o dy>

</html>

Ahora guardaremos los archivos en una carpeta accesible en el servi-


dor. Debería quedar algo similar a lo que muestra la figura 4.
Recordemos que, si estamos trabajando de forma local, para acce-
der a una de estas páginas debemos ingresar en nuestro navegador:
http://127.0.0.1/110111bre_pagüla.php
, siempre y cuando hayamos guardado
las páginas en el directorio raíz del servidor (normalmente HTDOCS).
De 10 contrario, debemos incluir en la dirección la ruta hasta
nombrejiagina.pbp, por ejemplo: http://127.0.0.1/ejemplol/paginas/
nombrepagina.php. Recordemos que, antes de acceder a la página buscar.
php , debemos ejecutar una vez la página crear_estructura.php.

» www.reduserscom
PHP .,. MYSQL DESDE CERO [!6j3·fi 167

• Computer • m05957WOF (C;) • wamp • www • 05 • libros

[n elude on hbrary • Sharewith • Bum Newfolder

Favontes
Oesktop
... Oownloads
Oropbox
Recent Places
buscar contig.inc crear_estructura mostrar_resultad
os
.. Libreries
.J Oocuments
JI Music
~ Pictures
B Videos

~ Homegroup

... Computer
C. m059S1'M1F (C:)
, Network

Figura 4. Listado de archivos del proyecto.

Los datos que se guardan en una base están, por lo general, en continuo cambio. En este
capítulo, aprendimos a recuperar filas a través de consultas de selección, insertar datos,
modificarlos y borrarlos. Además consideramos las distintas funciones para recorrer el con-
junto de filas devueltas por una consulta y la manera de acceder a cada campo en particular;
por último, vimos un ejemplo completo de todo lo explicado.

www.redusers.com «
168 ttfj#;f3 5. UTILIZAR SQL EN PHP

Actividades
TEST DE AUTOE\' ALUACIÓ~

1 ¿Qué diferencia hay entre las funciones mysql_fetch_array y mysql fetch row ?

2 La función mysql num rows es equivalente a una función del lenguaje SQL,
¿cuál es esa función?
3 ¿Qué diferencia hay entre las funciones mysql_ num_rovvs ymysql_ affected _ro\vs ?

4 ¿Qué aplicación tienen las constantes MYSQL_ASSOC, lvIYSQL_NUM


y MYSQL_BOTH en la función rnysql_fetch_array?

5 ¿Qué función deberíamos usar si quisiéramos saber cuál es el nombre


de columna de una tabla?

EJERCICIOS PRÁCTICOS

1 Abra la tabla y el código del archivo Cap5 _practica! y responda,


¿cuál es la salida?

2 Suponiendo la tabla del ejercicio 1, ¿qué devuelve el siguiente código


del archivo Cap5 _practica2?

3 Cree una tabla y verifique a través del ingreso de registros que efectivamente
esta contiene un campo autoincremental.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: [email protected] .

» www.reduserscom

anejo e errores
Para lograr desarrollos robustos y estables, nos ayudará conocer
los errores frecuentes que podemos cometer o que suelen aparecer,
y aprender de ellos. Tanto PHP como MySQL nos brindan funciones
y opciones de configuración que nos permitirán tener un acceso
controlado y un entendimiento de los errores que puedan surgir
en nuestros futuros desarrollos.

~Reportes de error en PHP 170 error_append_Sh'ing 184


error _ reporting 170 warn _plus _overloadíng 184
dísplay, errors 173 mysql, error 184
display_ startup _errors 174 mysql, errno 186
log_ errors 175 register globals 186
errorjog 176 perro." 191
log_errors_max_len 177 Manejo de excepciones 191
íguorej'epeated jerrors 177
ignore _ repeated _source 180 ~ Resumen""",.,.""",."",.,."""" ,191
track errors 180
btml errors 181 ~Actividades ......'.'.'.'.'.'.'.'.........,192
errorjprepend _string 183

JI JI JI
170 6. MANEJO DE ERRORES

Reportes de error en PHP


PHP nos ofrece distintas funciones y directivas de configuración para
obtener diferentes niveles de reportes de error. A continuación, presenta-
remos un listado de ellas y algunos ejemplos.

error _reporting
Esta es una función muy útil para detallar los tipos de errores que es
posible mostrar en las páginas. Las opciones que nos brinda son:

• E_ALL: todos los errores y advertencias, excepto E_STRICT.


• E_ERROR: errores fatales en tiempo de ejecución.
• E_WARNING: advertencias en tiempo de ejecución y errores 110 fatales.
• E_PARSE: errores de compilación internos.
• E_NOTICE: errores no críticos, normalmente producto de fallas
en el código, como variables no inicializadas, por ejemplo.
• E_CORE_ERROR: errores fatales producidos durante el inicio de PHP.
• E_ CORE_ WAR.."IDlG: advertencias -no errores fatales- de posibles erro-
res producidos durante el inicio de PHP.
• E_ CO:MPILE_ERROR: errores fatales en tiempo de compilación.
• E_CO:MPILE_\VARNlNG: advertencias -no errores fatales- de posibles
errores en tiempo de compilación.
• E_USER_ERROR: mensaje de error generado por el usuario
que se asemeja a E_ERROR.
• E_USER_ 'vVARNING: mensaje de error generado por el usuario
que se asemeja a E_'vVARNING.
• E_USER_NOTICE: mensaje de error generado por el usuario
que se asemeja a E_NOTICE.
• E_STRICT: noticias en tiempo de ejecución para hacer qlle PHP
sugiera cambios para mantener la compatibilidad de su código.
• E_RECOVERABLE_ERROR: el error puede ser capturado y tratado
a partir de excepciones.

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!jOOj3;fi 171

• E_DEPRECATED: mensajes acerca de código que no será soportado


por PHP en futuras versiones.
• E_USER_DEPRECATED: similar al anterior solo que los mensajes
de error pueden ser generados por el usuario.

Si estamos desarrollando sitios, es conveniente tener habilitadas todas


las opciones referidas al informe de errores. Esto no es aconsejado cuando
estamos en etapa de producción, es decir, si el sitio está en funciona-
miento y es visitado por los usuarios.
A partir de versiones posteriores a PHP 5, se incluirá el nivel de errores
denominado E_RECOVERABLE_ERROR , que podremos utilizar en lugar
de E_ERROR para identificar fallas que requieren un control y un mane-
jo específicos, pero de los que el sistema puede recuperarse, es decir,
que producen una inestabilidad no definitiva. Además, el nivel de erro-
res E_ALL contendrá al nivel E_STRICT.
Se puede configurar el reporte de errores a través de constantes sim-
bólicas, que deben ser deshabilitadas explícitamente mediante el uso de
algunos operadores. Los operadores son:
.,
• -: negaclon
·1:or(O)
• &: and (Y)

En las distribuciones no solo de PHP, MySQL y Apache sino de muchas otras aplicaciones,
suelen incluirse archivos que contienen información acerca de los errores encontrados o
reportados por usuarios y todavía no solucionados. Incluso, si somos nosotros los que
encontramos algún error desconocido hasta el momento, podemos reportarlo a través de
un formulario o a una dirección de correo electrónico que figura en la misma distribución.

www.redusers.com «
172 6. MANEJO DE ERRORES

Veamos algunos ejemplos:

Mostrar todos los errores menos los errores no criticos:

_
error reportíng =E _ ALL & ~E_ NOTICE

Mostrar todos los errores menos los errores no críticos y las advertencias:

error_reporting = E_ALL & ~(E_NOTICE I E_WARNING)

Mostrar todos los en·ores:

error_reporting = E_ALL

En PHP existe una función con el mismo nombre que la directiva vista
anteriormente (errorreporting), que permite pasar por encima de lo que
está escrito en el archivo php.ini y utilizar el nivel de reporte de errores que le
demos a la función. Este valor permanecerá solo durante nuestra sesión,
luego se perderá y se seguirá usando el valor que figura en el php.ini ,
La sintaxis de la función es la siguiente:

Algunos lenguajes de programación traen junto con la ayuda del lenguaje sus entornos de
desarrollo. Como PHP no posee un entorno de desarrollo único, es posible que deba desear-
gatO la ayuda que proviene del sitio web de PHP, ya que tampoco viene junto con la versión
oficial. La ayuda está disponible en muchos formatos y para diversos sistemas operativos.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 173

error_reporting(nivel);

El argumento nivel puede ser uno de los siguientes valores enteros:

• 1: E ERROR
• 2: E_ WARl'flNG
• 4: E PARSE
• 8: E_NOTICE
• 16: E_CORE_ERROR
• 32: E_CORE_ \VARNING

Para seleccionar varias opciones a la vez, debemos sumar los valores


enteros de las opciones. Por ejemplo, si quisiéramos utilizar las opciones
E_ERROR, E_ ~'ARl"JING Y E_PARSE, deberíamos escribir:

error_reporting(7);

La función error_reportingdevuelve el valor anterior, en forma de valor ente-


ro, que contenía la directiva. Se puede utilizar la función ini_set para configu-
rar el nivel de error, pero tendrá validez solo en tiempo de ejecución:

ini _set ("error _ reportíng"


e , opcíon);,

El argumento opcionpuede ser E_ALL, E_\VARNING, etc. Con la función


ini_set, podemos modificar valores de otras directivas en tiempo de ejecución.

display _errors
Para esta función obtenemos dos valores: 1 o O. Si se toma el valor verdade-
ro (1), al ocurrir un error se mostrará el mensaje correspondiente en pantalla.

www.redusers.com «
174 6. MANEJO DE ERRORES

Por ejemplo, si intentamos conectarnos a una base de datos inexistente,


obtendremos un mensaje a través del navegador como muestra la figura 1.

.. __ :<e_ .... •c, ...


¡c.is...k
•1 l1looo
:i§:
_.~ -
..
1 ..... t:
~ -

r..i-... -
[11':"... ~ I~'" M....nJi4' ,tUwt;.' * ....
~~ ........
" ....,.. ..,.....rt. ..... r,w'_"
"
• In.,
0000: lot •• O
• """e' ~
() ,I~IO

~ .. ~
11........• "IL ... _.......... _..
I~ ,._ .. .' ................. ,...., S. ••f ........... L .~ ....... _... ..... I,.,_~

• In_
1
o (JO»>
0000.
mmlt o
....."1.... :0
1.... :10

Figura 1. Directivadisplay error s habilitada.

El valor por defecto de esta directiva es l. Sin dudas, tenerla activada es


muy útil durante el periodo de desarrollo de un sitio web, ya que notificará
los errores que cometamos. Si, en cambio, el sitio está publicado y en etapa
de producción, es conveniente no mostrar los mensajes de error, por más que
estos ocurran, a los lISUariOS.Esto tiene que ver tal vez con una cuestión rela-
cionada con el diseño, con lo amigable qlIe necesita ser siempre un sitio web.
Incluso, en ocasiones, se producen errores que no modifican el buen
funcionamiento del sistema, pero que de todas formas emiten mensajes
de error al producirse. De hecho, formalmente, podríamos decir qlIe los
errores deben solucionarse en la etapa de desarrollo del sitio, y solo cuan-
do no se produzcan deberá pasar a la publicación definitiva.

display _startup _errors


Es posible que se produzcan errores durante el arranque de PHP, que
no forman parte de los que se muestran o se ocultan mediante la configu-
ración de la directiva display_errors. Para mostrar u ocultar estos errores,
debemos configurar la directiva display_startup_errors, que puede tomar los

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!jOOj3;fi 175

valores 1 (verdadero) o O (falso). El valor por defecto es O (oculta los errores).


Nuevamente, recomendamos no tener habilitada esta directiva durante la
etapa de producción de un sitio web, pero sí durante la etapa de desarrollo.
Un error típico dentro de la categoria de errores de arranque se da cuando
PHP no encuentra directorios especificados en el archivo php.ini , como es el
caso de las extensiones o los defmidos en la directiva include_path.

log_errors
Cada servidor web, generalmente, mantiene en un archivo el registro
de todos los errores ocurridos. Estos errores pueden ser de cualquier
tipo, desde problemas al cargar módulos hasta de configuración.
Si queremos agregar a este archivo los errores que se producen en
las páginas PHP, deberemos configurar esta directiva para que 10 haga,
esta admite dos valores: 1 (verdadero) para activarla y O(falso) para
desactivarla. Su valor por defecto es O.
Tengamos en cuenta que habilitar o deshabilitar esta directiva no
modifica la conducta de display_errors ni viceversa. Puede mostrar u
ocultar los errores producidos al mismo tiempo que los guarda en el
archivo de errores del servidor, es decir, ambas directivas no son priva-
tivas ni están relacionadas de ninguna manera.
Si tenemos esta directiva habilitada, pronto -al cometer un error-
podremos ver en el archivo de errores líneas como las siguientes:

Losmensajesde errorpuedenvariarde un sistemaoperativoa otro,por lo que se


recomienda tener cuidados especialesen este aspecto y tratar de conocer en pro-
fundidadlas característicastécnicasde cadauno de los sistemadisponiblespara no
ser sorprendidospor las posiblesincompatibilidades.

www.redusers.com «
176 6. MANEJO DE ERRORES

[Thu Mar 11 22:19:552014] [error] [client 127.0.0.1] PHPWarning:


mysql_quel")·O:Access denied for user:'usuario@localhost' (Using password: NO) in
cnarchívos de programa\apache grcupiapacheihtdocsiwebt \index.php on line 33

Estas marcan errores que tienen que ver con PHP. En el ejemplo ante-
rior, se puede ver que un usuario se intentó conectar a una base de datos
y 110 tenía permisos suficientes para hacerlo.
También registra errores de sintaxis, los parse errors , que ocurren cuan-
do escribimos de manera incorrecta lineas de código, cuando no cerramos
correctamente una cadena o cuando nos sobra o falta alguna llave para
cerrar o abrir módulos de código. Por ejemplo:

[Sun Apr 17 21:02:28 2005] [error] [clíent 127.0.0.1] PHP


Parse error: parse error, unexpected ',' in c:\
apache group'apacheihtdocsxwebtundex.php on line 49

Si utilizamos el servidor web Apache, podremos ubicar este archivo


en la carpeta LOGS, dentro del directorio Apache. El archivo de errores
normalmente se llama error.1og y, al ser de texto plano, se puede abrir con
cualquier editor de textos. Si el servidor web Apache está activo, no podre-
mos tener acceso al archivo. Esto es lógico porque Apache necesita acceso
permanente a este archivo, ya que lo modifica -en realidad solo agrega
líneas- de manera permanente. Para leer este archivo, es posible realizar
una copia y trabajar sobre ella o apagar el servidor web.

error_log
Desde esta directiva es posible configurar el nombre bajo el cual se
guardará el archivo que almacena los errores ocurridos. Podemos espe-
cificar también la ruta hacia el archivo, de manera de poder ubicarlo en
el directorio que nos resulte adecuado.

» www.redusers .com
PHP + MYSQL DESDE CERO 177

log_ errors _ max _len LOS ERRORES, PARA


Esta directiva está estrechamente ligada
a las anteriores, ya que nos permite definir SER REITERADOS,
la capacidad máxima que podrá tener el DEBEN OCURRIR
archivo de errores. Esta capacidad será ,
EN LA l\IIISl\ILALINEA
definida en bytes, y el valor por defecto de
la directiva es 1024. Si no queremos imponer y ARCHIVO
un límite al tamaño del archivo, le asigna-
mos o. Recordemos este hecho que por lo
general se presta a confusión y que sucede
también en otras directivas: puede que el
valor O indique valores ilimitados, es decir que represente un valor infi-
nito, no acotado. Si quisiéramos evitar utilizar el archivo de errores del
servidor web para almacenar las fallas relacionados con PHP, debería-
mos configurar la directiva log errors , vista antes.

ignore_repeated_errors
Si configuramos esta directiva en el valor 1, PHP mostrará los errores
que se repiten solo una vez. Se asume que los errores, para considerar-
se reiterados, deben ocurrir en la misma línea yen el mismo archivo.
Veamos un ejemplo:

MySQL trae, junto con su distribución, una ayuda en formato HTML, que es realmente
muy extensa y completa. No solo proporciona una referencia de las funciones y las
características de la base de datos, sino también una serie de ejemplos y recomen-
daciones de mucha utilidad. Se puede descargar la ayuda en otros formaros desde el
sitio web de MySQL (www.mysql.com ).

www.redusers.com «
178 ttfj3¡fi 6. MA1\iEJO DE ERRORES

<!DOCTYPE HIML PUBLIC "-//W3C/IDID HIML 4.0 IransitionaV/EN">


<HIML>
<HEAD>
<TITLE> ejemplo de ignore_repeated_errors </TITLE>
</HEAD>

<BODY>

<?php
$cnx = mysql_pconnect('localhost', 'root', ") or DIE('Error en la conexion');
$db = mysql_ select_ db('basel ');

for (Sx=O; $x<3; $x++) {


Sres = mysql_queryO;
}
?>

</BODY>
</HTML>

Asumiendo que la conexión se haya establecido correctamente, con


ignorerepeatederrors asignado a o, la salida será como 10 muestra la
figura 2. y con ignore repeatederrors asignado a 1, la salida será como
podemos observarla en la figura 3.

Es una buena costumbre tratar de resolver por nuestra cuenta los errores que come-
temos, pero en ocasiones nos será más beneficioso consultar la ayuda de PHP o de
l\!IySQL y no quedarnos estancados perdiendo tiempo para tratar de solucionar algún
inconveniente que se presente en nuestras aplicaciones.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 179

Ii .ioll
1 0.0004 . moresl
0.0011 .....or~,1 15

\\·a.... : .)· .. I_... .,-Q .sp.dl •• ".1' 1 '. __ •• ', °...... (":\1ra.p..... ~rro... 1.P.... h.
Scack

errores I
15

\Vanli
•• : .)· .. I_.... ""() .spH1. a. "al' 1pa'HI".',Oaiv •• " C:\.... p\.... ~rror•• l.p..,o.II ••
Suck
H
)

Figura 2. ignore repeated errors deshabilitada.

"·1.... : "IIIL~ .:lftcts a' lusl1,.._ec.r.°an'" • C:\1rallP~sLp~ .....

jj trion
1 CIlOlesl
2 err or •• l 15

Figura 3. ignore repeated errors habilitada.

Dadas las condiciones que debe cumplir un error para considerarse repeti-
do, está claro que, como en el ejemplo, las líneas de error deberán estar den-
tro de ciclos o bucles ( for, while, do while, foreach, etc.). Puede resultar cómodo
tener esta directiva habilitada, porque nos facilitaría y aclararía de manera
considerable la visión de los errores cometidos en el momento de tenerlos en
la pantalla. Al acudir al código fuente de la aplicación y resolverlo, estaríamos
solucionando todas sus instancias. El comportamiento de ignore repeated errors
cambia según el valor de otra directiva llamada i gnore_repeated_source.

www.redusers.com «
180 6. MANEJO DE ERRORES

ignore_repeated_source
En apartados anteriores, cuando explicamos el funcionamiento de la di-
rectiva ignore_repeated_errors,dijimos que, para considerar un conjunto de
errores como repetidos, estos debían ubicarse en la misma línea del mismo
archivo. La directiva ignore_repeated_source modifica la definición de lo
que es en sí un error repetido con respecto a como 10 hace la directiva
ignore_repeated_errors. Cuando está activada, no tiene en cuenta el ori-
gen de los errores, es decir, el archivo en el que se produjeron. Así, si
cometemos un mismo error repetido que se reitera a su vez en más de
un archivo, solo veremos un mensaje de error.
Si mantenemos ignore_repeated_sourceen Oe ignorej epeated errors en 1,
PHP se comportará como se expuso en la sección ignorej'epeated errors .
Si mantenemos ignore repeatedsource en 1 e ignorerepeated errors en 1,
PHP se comportará como se expuso en la sección ignore_repeated_source .

track -errors
En PHP existe una variable cuyo nombre es php_errormsg(Sphp_errormsg),
que nos permite acceder al mensaje correspondiente al último error come-
tido, siempre y cuando la directiva track_errors esté habilitada. Suponiendo
esto último, veamos el siguiente código:

<!DOCTYPE HTML PUBLIC "-//\V3C/IDTD HTML 4.0 TransitionaV/EN">


<HTML>
<HEAD>
<TITLE> ejemplo de track _ errors </TITLE>
</HEAD>

<BODY>

<?php
echo Smatríz -no-definida[34);
echo "<br>------------ ".,

» www.reduserscom
PHP T MYSQL DESDE CERO 181

echo '<br><br>Mensaje del ultimo error cometido: '.$php_errormsg;

echo "<br><br>-- ----------- ".,


?>

</BODY>
<IHTML>

Su salida será lo que muestra la figura 4. Esta directiva está deshabili-


tada por defecto; para habilitarla debemos asignarle el valor on,

[J .,.mplo d... ><1,.""." <>


+- e localhost r
~---------------------------
es! php

Mensaje dd uI!imo tlTOC cometido: l:ndefined "ariable: matriz_no definida

Figura 4. Directiva track elTOrShabilitada.

htmI -errors
Cuando esta directiva se encuentra deshabilitada, los errores se mues-
tran como mensajes en formato HTJ\1L. Supongamos el siguiente código:

<!DOCTYPE HTML PUBLIC "·//W3C/IDTD HTML 4.0 Transitlonal//EN">


<HTML>
<HEAD>
<TITLE> ejemplo de html_ errors <lTITLE>
<IHEAD>

<BODY>

www.redusers.com «
182 6. MANEJO DE ERRORES

<?pbp
mysql_ querytsvar);
?>

</BODY>
<IHTML>

Al habilitar esta directiva, asignándole el valor On, a los mensajes de error


se les agregará un enlace que derivará en llna descripción del error cometido,
que en general estará dentro del manual de PHP. Si no tenemos el manual de
PHP, podemos bajarlo desde www.php.net/docs.php . Una vez descargado,
lo copiamos a algún directorio; en nuestro ejemplo, lo llamaremos nlanualPHP,
dentro del directorio de instalación de PHP. Luego, abrimos el archivo php.ini ,
vamos a la línea que comienza con html_ errors y cambiamos su valor a On:

btml errors = 00

Vamos a la linea que comienza con docref_root y escribimos la dirección


en donde se encuentra el manual:

_
docref root = "/manuaIPHPI"

Podemos usar también referencias a sitios de Internet. Por ejemplo:

docref _ root = "bttp://,,,,,,,v.direccion.comlmanual"

Por último, indicamos la extensión que tienen los archivos del manual
que descargamos (HTML, TXT, etc.)

docref ext = .html

» www.reduserscom
PHP .,. MYSQL DESDE CERO 183

error _prepend _string


Esta directiva hace posible mostrar contenidos antes de los mensajes de
error. Si escribimos textos en formato HTML, la directiva los soportará y mos-
trará la salida correspondiente. Además, nos permite personalizar el formato
o la presentación de los mensajes de error y adecllarlos a nuestras necesida-
des. No hace falta habilitar o deshabilitar expresamente la directiva: bastará
con asignarle valores o no. En el caso de asignarle algún texto, se considerará
habilitada, de lo contrario, se considerará deshabilitada. Un ejemplo es:

error_prepend_string = "<b>Error!</b><br><font color=FFCCOO>"

En este caso, cada vez que se produzca un error, antes de mostrarlo


por pantalla, se imprimirá el texto Error! en negrita y, como se puede
observar, el mensaje de error en sí se imprimirá con sus caracteres en
color naranja, puesto que abrimos la etiqueta <font color=FFCCOO>en la
directiva error_prepend_string .

<!DOCTYPE HTML PlJBLIC "-/1W3C/IDTD HTML 4.0 TransitionaVIEN">


<HTML>
<HEAD>
<TITLE> ejemplo de error _prepend _ stríng <mTLE>
</HEAD>

<BODY>

<?php

echo $matriz[34;

</BODY>
<IHTML>

www.redusers.com «
184 6. MANEJO DE ERRORES

error _append _string


Esta directiva es similar a errorprepend string, pero con la diferencia de
que su contenido se imprimirá luego del mensaje de error.

error_append_string = "<lfont><br>Final del mensaje de error."

<!DOCTYPE HTML PUBLIC "-//W3C/IDTD HTML 4.0 TransitionaI/IEN">


<HTML>
<HEAD>
<TITLE> ejemplo de error_append_string </TITLE>
<IHEAD>

<BODY>

<?php

echo $matriz[34;

</BODY>
<IHTML>

warn _plus _overloading


Esta directiva nos informa, si es que está habilitada, a través de una adver-
tencia, cuando usarnos el signo de suma ( +) para concatenar cadenas en lugar
del utilizado por PHP con el mismo fin, que es el punto ( .). Hay lenguajes cuya
sintaxis es muy parecida a la de PHP que utilizan el signo más ( +) en lugar del
punto (.) para unir cadenas de caracteres o variables dentro de un script.

mysql_error
Esta función devuelve una descripción del último error cometido,
relacionado con MySQL. Su sintaxis es la siguiente:

» www.redusers .com
PHP + MYSQL DESDE CERO 185

mysql_error(identificador);

El argumento identificador es un identificador de conexión opcionaL


Si no se incluye, la función intentará hallar la última conexión abierta activa
al servidor J\lfySQL. Si no la encuentra, tratará de crear una como si se llamara
a rnysql_connecn) sin argumentos. La función no presenta mensajes de alerta
(\V ARl"J"INGS) sobre posibles errores, solo trabaja con los errores ya consuma-
dos. A continuación, damos algunos ejemplos acerca de cómo utilizarla.

<?php
$id = mysql_connect("168.22.22.3", "u", "p");
echo mysql_ erren);

$sql = "insert into tl values (1, 2)";

mysql_db_ query("base", $sql, Síd);


echo mysql_erren);
?>

En otros ejemplos de este mismo libro ( capítulo 4 y 5), hemos utiliza-


do la construcción DIE. La diferencia entre usar DIE y mysql, error es que,
con la primera, podemos personalizar los mensajes de error (además DIE
finaliza la ejecución del script) y, en cambio, con la segunda obtenemos
mensajes de error oficiales de MySQL ..Además, DIE puede usarse en
cualquier ámbito, no solo para interceptar errores relacionados con el
servidor de bases de datos MySQL.
Quizás en pequeñas y medianas aplicaciones se tienda a no usar este
tipo de funciones, ya que, normalmente, conociendo en qué línea del
script se produjo el error, podremos solucionarlo sin mayores inconve-
nientes. Sin embargo, es una buena práctica utilizar esta clase de funcio-
nes, que en muchos casos pueden evitamos perder tiempo.

www.redusers.com «
186 6. MANEJO DE ERRORES

mysql_ errno
En NIySQL y en cualquier lenguaje de programación o aplicación, los
errores están catalogados y es posible identificarlos a través de un código.
Podemos conocer este código mediante la función mysql_errno. Su sintaxis
es similar a mysql_ error:

mysql , erroo(ideotificador);

Un ejemplo de esta función es:

<?php
$id = mysql, coooect("168.22.22.3", "u", "p");
echo mysqt errnot);

Ssql = "insert ioto tl values (1, 2)";

m)-sql_db_quel)-("base", S sql, Síd);


echo mysql_errooO;
?>

register globals
Utilizando register_globals = 011, PHP asume todas las variables como
globales y no podrá diferenciar entre los diferentes tipos de ellas (si usa
una variable en su script que tiene el mismo nombre de una variable de
sesión, PHP no podrá distinguirlas y las tratará como a una sola).
Para solucionar este problema y trabajar con register_globals = Off, PHP
nos ofrece los siguientes arrays:

• $ SERVER
• $ GET
• $ POST

» www.redusers .com
PHP .,. MYSQL DESDE CERO [!fjarfi 187

• $ COOKIE
• $ FILES
• $ ENV
• $ REQUEST
• $ SESSION

La idea es identificar el método por el cual recibimos las variables y ac-


ceder a ellas mediante el array correspondiente. Por ejemplo, si enviamos
variables a través de un formulario a una página, debemos recuperarlas a
través del array correspondiente al método usado en el formulario.

<l+paginalphp -->
<form action=pagina2.php method=POST>
<input type=text name=nombre>
<input type=submit>
</form>

<?php

//pagina2. php

echo "la variable nombre contiene el valor: ".$_POST[nombre);

?>

Los servidores web guardan un archivo con los errores producidos durante un perio-
do. Es recomendable revisar este archivo para observar comportamientos irregulares,

www.redusers.com «
188 ttfj3¡fi 6. MA1\iEJO DE ERRORES

A continuación, haremos una breve reseña de los distintos arrays que


provee PHP para almacenar variables:

• $_SERVER: contiene una serie de variables generadas por el servidor web.


Algunas de ellas son:
- REMOTE_ADDR: dirección IP del usuario.
- SERVER NANIE: nombre del servidor web.
- PHP_SELF: nombre del archivo que se está ejecutando.

Accedemos a ellas de la siguiente manera:

echo $_SERVER[PHP _SELF);

• $_GET: almacena las variables pasadas por URL (por ejemplo, a través
de links o formularios con method=get). Quizás sea aquí donde se vea
de manera clara cuál es el problema de seguridad que supone usar
register_globals = 011. Supongamos que tenemos un script para auten-
tificar usuarios. Luego de un determinado proceso, si el usuario está
registrado, almacenamos en la variable usuario el valor registrado.
Al pasar la variable por URL, de acuerdo con la siguiente estructura:
http://ltV'fV'fv.misitioltveb.com?usuario=registrado ~utilizando
register_globals = 011 cualquiera estaría registrado, evitando el proceso
de registro (recordemos que PHP no necesita declarar las variables).

Habilitar
ladirectivaregister_globals puedeconvertirseenunatentación,yaquela mane-
ra deprogramaraplicacionessevuelvemásfácil;pero,tantopor cuestionesdeseguridad
comoporquecasinadiela habilita,serecomiendatenerladeshabilitada.

» www.redusers .com
PHP T MYSQL DESDE CERO 189

Con register_globals = Off podríamos especificar el modo en el que recibi-


ríamos la variable. Si definimos que la variable sea de tipo SESSIO,
no nos importa qué valor tenga $_GET[usuario], lo que nos importa
es el valor de $ SESSION[usuario] .
• _
$ POST: tiene un uso similar a $_ GET., almacena las variables recibidas
por el método POST; por ejemplo, a través de formularios.
• $_COOKIE: una matriz asociativa de variables pasadas al script actual
a través de cookies HIIP.
• $_FILES: aquí se guardan algunas informaciones acerca de los archivos
enviados a través de formularios.
• $_ENV: las variables que se incluyen en este array realmente dependen
del sistema operativo sobre el que se está trabajando.

Otras variables de entorno incluyen las variables CGI:

• $_REQUEST: una matriz asociativa que guarda los contenidos


de $_GET, $_POST y $_COOKIE.
• $_ SESSION : aqui se guardan las variables de tipo sesión.

Como dato interesante, si trabajamos con los arrays que nos provee
PHP, nuestros scripts funcionarán tanto con register_globals = On como con
register_globals = Off. Podemos observar qué valor tiene la directiva register_
globals en su sistema de dos maneras: accediendo al archivo php.ini y bus-
cando la línea qtle contenga algo parecido a lo que muestra la figura 10.

Las innovaciones sobre las funcionalidades de las tablas incluyen avances respecto del
manejo y la descripción de los errores cometidos por los usuarios. Sin embargo, el trata-
miento de errores es una cuestión poco considerada por un alto porcentaje de usuarios.

www.redusers.com «
190 6. MANEJO DE ERRORES

o a través de la función phpinfo, como muestra la figura 5.

"""'_III","_- óO 60 '09"l"_Olobo"
memort_1imII 12811 128101
_._"'''''1( no ~.'ue no\aJue
OU1PU1_D<tnonng 1 1
oulPULhandlet no ..-a/"e no"itue
poILINa_sI .. 81.1 811
p<OCIoion 1A 1A
[email protected]_C8che_slte 16K 16K
rOllpolh_C8Cho_ttl 120 120
reoill.'_lroc_lrov 011 011
regiIIO'..lIIobaI. 011 0tI
,eglllo,_long_a,noyo 011 Otf
repotL.memleakl en en
rOl>Ol\..lend_dobug en On
requelLorde, GP GP
~1._mOde oe OW
satt_mOdo_o.oC_dir rovstu« oova/ue

Figura 5. Directiva register globals en la salida de la función phpinfo.


Suelen circular algunas soluciones para los códigos programados con
register_globals = On, que en resumen recorren todas las variables conteni-
das en los arrays vistos antes y copian sus valores a variables:

Snombre = S_GET[nombre);

o con la función nu set:

ini_set("reoister
e _globals""1
" ").

Pero debe quedar claro que se trata de un tema de seguridad y que


es necesario trabajar con los arrays provistos por PHP. Las dos líneas de
código anteriores solo mantienen el funcionamiento de las aplicaciones
que están programadas con register_globals = On y que desean pasar a
register_globals = Off sin modificar casi nada del código, pero el problema
de seguridad alertado por PHP seguirá latente.

» www.redusers .com
PHP -e- MYSQL DESDE CERO [!jOOj3;fi 191

perror
MySQL exhibe mensajes y códigos de error en muchos sistemas. Para obte-
ner más información o descripciones acerca de los errores podemos utilizar
el programa perror que viene junto con la distribución de MySQL.
Las descripciones de los errores pueden variar de un sistema operativo
a otro. Su sintaxis es la siguiente:

C:\> perro!" codigo [codigo] [codigo] [...]

Manejo de excepciones
Una excepción es un suceso o evento que ocurre y que interrumpe la
ejecución normal de un programa. Puede ser por problemas en el hardware
de un equipo, errores de programación u otros.
Las excepciones están directamente ligadas a la programación orientada
a objetos. Cuando una excepción ocurre dentro de un método, este crea un
objeto que guarda información acerca de la excepción ocurrida. PHP puede
lanzar, intentar o capturar excepciones a través de los bloques try, catch y
throw. Si la excepción no es capturada, se producirá un error fatal, y PHP
mostrará un mensaje para referir esta situación. Las excepciones son co-
munes en lenguajes como Java o C++ y se implementaron en PHP versión 5.

Analizamos una serie de funciones, programas y opciones de configuración de PHP y MySQL


para conocer los errores y administrarlos. Vimos cómo programar las aplicaciones ante
la disposición del nuevo valor por defecto que se le da a la directiva de register globals .

www.redusers.com «
192 ttfi#·f, 6. MANEJO DE ERRORES

Actividades
TEST DE AUTOEV ALuACIÓ~

1 ¿Qué tipo de variables se guardan en los arrays $_POST, $_GET y $ SESSION?

2 ¿Qué valor tiene la directiva error_reporting en su sistema?


Para responder verifique el valor en el archivo php.ini o utilice las funciones
phpinfo o error reporting.

3 ¿Cónlo configuraría la directiva errorreporting si su sitio está en etapa


de desarrollo? ¿Y si está en etapa de producción? Justifique su respuesta.
4 ¿Qué diferencia hay entre E_ALL y E_WARNING?

5 Habilite la directiva log_errors en su sistema.


¿Qué valores contiene su archivo error.log?

EJERCICIOS PRÁCTICOS

1 ¿Cuál es el error número 3 en NIySQL?

2 Abra el archivo Cap6 _práctica2, ¿cuál es la salida del código si usamos


register_globals = Off? ¿Y con register_globals = Onz

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: pl·[email protected] .

» www.redusers .com
Administración
ases atos
Mientras desarrollamos nuestras aplicaciones, cumplimos el rol de
administrador de servidor web, servidor de bases de datos, programador
de aplicaciones, llSllariO y más. Pero, cuando trabajamos en un sistema
real, las tareas se vuelven más específicas. En este capitulo, entenderemos
la naturaleza y el rol de los administradores de bases de datos .

..El rol del administrador 2 .. Gestión de usuarios ,.,.,., 18

..El rol del usuario ,., 3 ..Resumen ,.,., , , , 19

..Sistema de privilegios 3 ..Actividades 20

JI JI JI
2 APÉl.\'DICE. lillMlNISTRAC¡ÓN DE BASES DE DATOS

El rol del administrador


Un administrador de bases de datos (DBA por sus siglas en
inglés) es la persona encargada de conocer cada detalle del servidor
de bases de datos y de responder a los usuarios las preguntas técnicas
acerca de su funcionamiento. Su tarea es tan importante y compleja
que incluso puede llegar a haber más de uno por empresa.
El administrador no tiene injerencia en temas de diseño de la base
(recordemos la diferencia entre una base de datos y un servidor de
bases de datos: un servidor puede contener varias bases). Sus tareas
principales son: gestionar usuarios, crearlos, modificar sus permisos y
eliminarlos, y mantener las bases de datos y el servidor protegido ante
posibles ataques externos (actualizar el servidor mediante parches de
seguridad, firewalls, etc.). Otras tareas importantes suelen ser:

• Instalar y actualizar el servidor de bases de datos.


• Configurar el servidor (optimización, mejoras de rendimiento).
• Crear las bases de datos, aunque en algunos sistemas esto se delega
a los usuarios.
• Administrar los recursos del sistema (prestar atención al crecimiento
de los archivos de las bases).
• Realizar copias de seguridad.
• Responder ante fallos en el sistema de manera rápida y segura.

Si bien este libro está destinado al trabajo con bases de datos MySQL, cuando en este
capítulo hablamos de las tareas fundamentales y a la vez comunes de los administradores
de bases de datos ,no hacemos referencia específica a ninguna base de datos, puesto
que las tareas son independientes de la elección.

» www.redusers .com
PHP -e- MYSQL DESDE CERO 3

• Mantener la información.
• Monitorear las actividades de los usuarios. Controlar el acceso.
• Generar estadísticas e informes.
• Probar nuevos productos que posiblemente se instalarán en el sistema.

Si bien en los gestores de bases de datos más avanzados existen herra-


mientas de última generación que permiten (o por lo menos ayudan) detectar,
diagnosticar y resolver según el caso estas tareas de manera casi automática,
la presencia y disponibilidad de un administrador es indispensable.

El rol del usuario


Como habremos notado en la sección anterior, el fin principal de la tarea de
un administrador de bases de datos es asegurar que la información esté
disponible para los usuarios en el tiempo y la forma en que la necesiten.
Cuando hablamos de usuarios, normalmente, nos referimos a perso-
nas que acceden a los servicios provistos por un sistema gestor de base
de datos a través de aplicaciones desarrolladas para tal fin. La conexión
entre usuarios y administradores es con frecuencia establecida tanto
en un sentido como en otro. Podría ocurrir que un usuario se contacta-
ra con un administrador y pidiera alguna clase de información técnica
o que un administrador se contactará con un usuario al notar comporta-
mientos indebidos por parte de este.

Sistema de privilegios
MySQL cuenta con un sistema.de privilegios que tiene como fin princi-
pal validar la conexión de un usuario y otorgarle determinados permisos
-operaciones- sobre bases de datos, tablas y columnas.
Uno de los permisos que pueden concedérsele a un usuario es
la posibilidad de ejecutar determinadas instrucciones (SELECT, INSERT,

www.redusers.com «
4 APÉNDICE. ADMINISTRACIÓN DE BASES DE DATOS

UPDATE, DELETE, ALTER, otras) e, incluso, algunas funciones provistas


por MySQL. Estos permisos están almacenados en el mismo servidor,
en una base de datos llamada mysql, que se crea en forma automática
durante la instalación de MySQL. De esta manera, cuando se logra esta-
blecer una conexión, se dan ciertos privilegios de acuerdo con la iden-
tidad del usuario. Luego de establecida la conexión, cuando el usuario
intente realizar operaciones que no le estén permitidas, simplemente,
se le impedirá consumarlas.
La identidad será definida por el nombre de usuario y la máquina desde la
cual se efectúa la conexión, porque se asume que dos o más usuarios que se
conectan desde distintos equipos pueden tener el mismo nombre de usuario.
Tanto cuando un usuario intenta establecer una conexión como cuan-
do trata de ejecutar una instrucción SQL, MySQL tomará la decisión de
permitirlo o no de acuerdo con la información contenida en las tablas
db, user, host, tables_priv y columns_priv . A continuación, haremos un re-
corrido por cada una de ellas.

Tabla user
La tabla user contiene información sobre cada uno de los usuarios:
desde qué máquina puede acceder al servidor MySQL hasta su clave y
sus diferentes permisos. La estructura de la tabla user y la descripción
de cada campo es la siguiente:

El sistemade privilegiosaquí expuestopuedeprovocarconfusióndurantelos prime-


ros acercamientosa él;pero, aunquepuederesultar complejo, también es completa-
mentelógicoy ofrecemuchasopcionesque nos seránde granayuda simplificándo-
nosuna enormevariedad de tareas.

» www.redusers .com
PHP .,. MYSQL DESDE CERO [!fjarfi 5

TABLA USER

T CA.\fPO T DESCRIPCIÓN

Host Nombre de la máquina desde la cual el usuario tiene permitido


conectarse. Por ejemplo: hostl.com.ar

User Nombre del usuario.

Password Contraseña del usuario. Se almacena encriptada.

Select_priv ¿Permitir instrucciones SELECT?

lnsert_priv ¿Permitir instrucciones INSERT?

Update_priv ¿Permitir instrucciones lJPDATE ~

Delete_priv ¿Permitir instrucciones DELETE?

Index_priv ¿Permitir la creación o eliminación de índices?

Aiter_priv ¿Permitir la modificación de las estructuras de las tablas?

Create_priv ¿Permitir crear tablas?

Drop_priv ¿Permitir borrar tablas?

Grant_priv ¿Permitir otorgar permisos a otros usuarios?

References _priv ¿Permitir crear relaciones entre tablas?

Reload_priv ¿Pennitir ejecutar los comandosreload, refresh,


flush-privileges, flush-hosts, flush-Iogs y flush-tables ?
(Permiten recargar el sistema),

Shutdown_priv ¿Permitir ejecutar el comando shutdownz


(permite parar el servidor).

www.redusers.com «
6 APÉNDICE .. 1U)MI1'llSTRAC¡ÓN DE BASES DE DATOS

TABLA USER (CONTINUACIÓN)

Process _priv ¿Permitir ejecutar el comando processlist ?

File_ptiv ¿Permitir leer y escribir archivos usando comandos


como select into outfile y load data infile ?

Tabla 1. Estructura de la tabla USER.

Los campos host, password y user admiten 60, 16 y 16 caracteres res-


pectivamente, mientras que los demás, solo un carácter (N para restrin-
gir, y para permitir). Están definidos como de tipo ENillvI.
En el caso de que se dejen en blanco -contengan el símbolo %, que
actúa como comodín- los campos user, host o password se referirán a
cualquier usuario, equipo o contraseña.

Figura 1. Mensaje de error al intentar loguearse un usuario inválido.

Tabla host
La tabla host contiene información sobre las máquinas que podrán
acceder al servidor, así como de las bases de datos y sus diferentes per-
misos. Permite definir permisos globales para máquinas con acceso a
las bases de datos del servidor. Contiene los mismos campos, a excep-
CiÓ11 de user, que la tabla db, que veremos a continuación. Su estructura
y la definición de los campos es la siguiente:

» www.redusers .com
PHP -s- MYSQL DESDE CERO [!Jf,3ifi 7

TABLA HOST

T CA.'fPO T DESCRIPCIÓN

Host Nombre de la máquina desde la cual el usuario tiene pennitido


conectarse. Por ejemplo: hostl.com.ar .

Db Nombre de la base de datos a la cual tiene permitido


conectarse el usuario.

Select_priv ¿Permitir instrucciones SELECT?

Insert_priv ¿Permitir instrucciones INSERT?

Update_priv ¿Permitir instrucciones UPDA TE?

Delete_priv ¿Permitir instrucciones DELETE?

Index_priv ¿Permitir la creación o eliminación de índices?

Alter_priv ¿Permitir la modificación de las estructuras de las tablas?

Create_priv ¿Permitir crear tablas?

Drop_pliv ¿Permitir borrar tablas?

Grant_priv ¿Permitir otorgar permisos a otros usuarios?

Tabla 2. Estructura de la tabla host.

Los campos host y db admiten 60 y 64 caracteres, respectivamente,


mientras que los demás aceptan un carácter (N para restringir, y para
permitir). Estos campos están definidos como de tipo ENUM.
Si se dejan en blanco (o contienen el símbolo %, que actúa de comodín)
los campos host o db se referirán a cualquier equipo o base de datos.

www.redusers.com «
8 APÉNDICE .. .<illMlNISTRAC¡ÓN DE BASES DE DATOS

Tabla db
La tabla db permite especificar permisos para bases de datos indivi-
duales. Las columnas host, db y user sirven para especificar el host desde
el que puede acceder el usuario, el nombre de usuario a quien se le reco-
nocen permisos y la base de datos a la que se van a aplicar los permisos,
respectivamente. Los permisos indicados en esta tabla solo se aplican a
la base de datos identificada en la columna db.

TABLADB

Host Nombre de la máquina desde la cual el usuario tiene permitido


conectarse. Por ejemplo: hostl.com.ar.

Db Nombre de la base de datos a la cual tiene permitido


conectarse el usuario.

Select_priv ¿Permitir instrucciones SELECT?

Insert_priv ¿Permitir instrucciones NSERT'?

Update _priv ¿Permitir instrucciones UPDA TE?

Delete_priv ¿Permitir instrucciones DELETE?

Index_priv ¿Permitir la creación o eliminación de índices?

Alterpriv ¿Permitir la modificación de las estructuras de las tablas?

Create_priv ¿Permitir crear tablas?

Drop_ptiv ¿Permitir borrar tablas?

Grant_priv ¿Permitir otorgar permisos a otros usuarios?

Tabla 3. Estructura de la tabla db.

» www.redusers .com
PHP .,. MYSQL DESDE CERO 9

Los campos host, db y user admiten 60, 64 Y 16 caracteres, respecti-


vamente, mientras que los demás solo un carácter ( . para restringir,
y para permitir). Están definidos como de tipo ENUM.
En el caso de que se dejen en blanco -o contengan el símbolo %,
que actúa de comodín-los campos user, host o db se referirán a cual-
quier usuario, equipo o base de datos.

Tablas tables_priv y columns_priv


Las tablas db, tratadas anteriormente, tables_priv y columns_priv nos
proveen un control individual de las bases de datos, tablas y columnas.
tables_priv permite especificar permisos para tablas concretas dentro de
una base de datos. Contiene los siguientes campos:

TABLES PRIV

T CA.\fPO T DESCRIPCIÓN

Host Nombre de la máquina desde la cual se intenta


conectar el usuario. Por ejemplo: hostl.com.ar.

Db Nombre de la base de datos a la cual se intenta


conectar el usuario.

User Nombre del usuario.

Table name Nombre de la tabla sobre la cual se aplicarán


las siguientes
~ restricciones.

Table_priv Aquí se ubican, separadas por coma, las operaciones


permitidas sobre la tabla Table_name al usuario User que se
conecta desde la máquina Host Las operaciones disponibles
son las siguientes: SELECT, lNSERT , UPDATE , DELETE,
CREATE, DROP, GRAAl, REFERENCES, r.IDEX y ALTER.

www.redusers.com «
10 APÉNDICE .. 1illMI1'llSTRAC¡ÓN DE BASES DE DATOS

TABLES _PRIV (CONTINUACIÓN)

Column_priv Aquí se ubican, separadas por coma, las operaciones permitidas


sobre la columna Column_priv (que pertenece a la tabla
Table_name, de la base Db) al usuario User que se conecta desde
la máquina Host. Las operaciones disponibles son las siguientes:
SELECT, INSERT, UPDATE YREFERENCES.

Timestamp Valor timestamp correspondiente a la fecha


de inserción del registro.
-
Grantor Nombre de la persona que ha concedido
los permisos para modificar la tabla.

Tabla 4. Estructura de la tabla tables priv·


La tabla COlUlTI11S_priv
permite especificar permisos para columnas
concretas dentro de una tabla. Contiene los siguientes campos:

COLUMNS PRIV

Host Nombre de la máquina desde la cual se intenta conectar


el usuario. POI' ejemplo: hostl.com.ar.

Db Nombre de la base de datos a la cual se intenta


conectar el usuario.

User Nombre del usuario.

Table name Nombre de la tabla que contiene la columna.

Column name Nombre de la columna.

» www.redusers .com
PHP + MYSQL DESDE CERO 11

COLUMNS _PRIV (CONTINUACIÓN)

Column_priv Aquí se ubican, separadas por coma, las operaciones permitidas


sobre la columna column_priv (que pertenece a la tabla
table _ name , de la base db ) al usuario user que se conecta desde
la máquina host. Las operaciones disponibles son las siguientes:
SELECT, INSERT, UPDATE YREFERENCES.

Timestamp Valor timestamp correspondiente a la fecha


de inserción del registro.
-

Tabla 5. Estructura de la tabla columns _priv.

Jerarquías de acceso
Como se dijo antes, al recibir un intento de conexión, 11ySQL compara
los datos ingresados con los que figuran en la tabla user. Si hay coinci-
dencia -es decir, si en la tabla hay una fila que contenga el mismo user,
password y host-, se autoriza el acceso a ese usuario.
Ante cada instrucción SQL generada por un usuario conectado, 11ySQL
vuelve a consultar la tabla user, esta vez para verificar si tiene permisos
para ejecutar esa instrucción. Si los tiene, la instrucción se ejecuta; si no
los tiene se pasa a consultar la tabla db para comprobar si tiene permisos

La tarea de un administrador de bases de datos puede parecer lejana para los usuarios
de sistemas o desarrolladores de aplicaciones. Sin embargo, cuando se tiene la necesi-
dad de administrar un servidor web, por ejemplo, cosa no tan extraña por estas épocas,
se deberán poner en práctica algunas de las tareas y métodos utilizados por aquellos.

www.reduaers.com «
12 APÉl.\'DICE. lillMlNISTRAC¡ÓN DE BASES DE DATOS

específicos sobre la base de datos en cuestión. Si los tiene, la instrucción


se ejecuta; si no los tiene se pasa a consultar las tablas tablespriv y co-
lumnspriv . Si allí encuentra los permisos, la acción se ejecuta, si no MySQL
devuelve un mensaje error. Repasando los campos de las distintas tablas,
notaremos que hay algunos que se repiten: ¿qlIé pasaría si incurriéramos en
supuestas contradicciones? Por ejemplo, podría ocurrir que denegáramos un
permiso a un usuario en la tabla user y se lo habilitáramos en la tabla db.
Lo que OClIrrees que los permisos de la tabla user tienen alcance global,
pero no particular. Entonces, en esta situación, el usuario no contaría con
ese permiso en ninguna base de datos, salvo en las bases en que lo habili-
tamos, que figuran en la tabla db.
De la misma manera, un usuario habilitado en la tabla user no podrá ac-
ceder a una base de datos del servidor desde una máquina, si esa máquina
no está habilitada en la tabla host,

Comandos grant y revoke


Para otorgar o modificar privilegios a los usuarios, podemos hacerlo
a través de la modificación de tablas o mediante los comandos grant y
revoke. A continuación, describiremos estos comandos.

Comando grant
Permite crear nuevos usuarios y modificar sus permisos.

mysql> grant select, ínsert on *.* to lucas@'%' identified by 'blablabla';

En el ejemplo anterior se da la siguiente situación:

• Permisos: ejecutar instrucciones select e insert (grant select, insert).


• Sobre: cualquier tabla de cualquier base de datos ( *. *).
• Para el usuario: lucas (to lucas).

» www.redusers .com
PHP -e- MYSQL DESDE CERO 13

• Que se conecta desde: cualquier máquina ( @'%').


• Cuya contraseña es : blablabla (identifiedby 'blablabla').

Si quisiéramos dar ciertos permisos sobre una base de datos


en particular, podríamos escribir:

mysql> grant select, insert on nombre_ base. * to lucas@'%' identified by 'blablabla';

Si quisiéramos dar ciertos permisos sobre una tabla de una base


de datos en particular, podríamos escribir:

mysql> grant select, ínsert on nombre _base.nombre _tabla to lucas@'%'


identified by 'blablabla';

Figura 2. Ejemplode uso del comando grant Alta del usuariopipo.

Si quisiéramos dar ciertos permisos sobre una tabla de una base de datos
en particular para un usuario que se conecta desde una máquina específica:

mysql> grant select, insert on nombre _base.nombre _tabla to lucas@nombre_


host identified by 'blablabla';

www.redusers.com «
14 APÉNDICE. ADMIN1STRAC¡ÓN DE BASES DE DATOS

Es posible dar permisos a usuarios de manera tal que se puedan conec-


tar sin informar su contraseña, la parte identified by es opcional.
También pueden darse permisos sobre columnas determinadas:

mysql> grant select (coll, col2, col3) on nombre _base.nombre _tabla to lucas
@nombre_host identified by 'blablabla';

Donde col l, col2 y col3 son columnas pertenecientes a la tabla nombre_tabla.

ñ.í.c r-os oLt \lindo ..1S Lüe i-s Ion 6.1. ?600J
COPYl~iy},t 2009 (c) Micl'O!>oft Co r-po r-a t Lon . All l'iy}'l5 r-e s e r-v e d,
: ,U s e r-s '<Pr-anc .is co )cd e: '\.\/dmp'.J in 'mys. q 1'mys. q 15 . S .8 '<bin
C:'\',anp'hin'\.nysql'l1lys.qlS _S_U'bin)nysql -ll pipo -px
\,/clcone to t he NySQL mnn Lt o r-, COflfllc."ll\:';' und ~lit)1 ; u.' 'y.
VOlt1' NySQL connect ion id Le 9
~el'vel' vel'siorl: S.5.S-log NySQL Cornnllnity SCl'vel' (GPL)
COPYl-igl,t (c) 2~~~~ 2~1~,Ol'acle and/oJ' its affiliates. AIl l'ig),ts l·esel·ued.
r-ec Je .is a r-eq i s t e r-ed t r-adene i-k of Or-ac Ie Co r-po r-ac i o n endvo r- Lt s
<;tffili~,tc~;_ Otile." '1C\nt!S tTl(\y }JC t r-a derae r-k s of t hc r- r-e s pc c c ivc
í

oone r-s ,

Type ')lelp;' Ol" ',11' fOl" 11elp. Iype "e' to cleal" tlle eUl".~ent inpl,t statement.

mysql> ,.se lib.'os;

Figura 3. Usuario pipo accediendo al sistema.

En los ejemplos anteriores se dan los privilegios select e insert,


pero hay más. Algunos de ellos son los siguientes:

Las distintas tareas que cumple lID administrador de bases de datos, desarrolladas
en este mismo capítulo, se volvieron, a través de los distintos avances producidos,
tan importantes que incluso desde hace algún tiempo a esta parte se dictan cursos y
carreras para especializarse en esta área.

» www.redusers .com
PHP -s- MYSQL DESDE CERO [!fi3;fi 15

LISTADO DE PRIVILEGIOS

T CA;\IPO T DESCRIPCIÓN

ALL Permite al usuario obtener todos los privilegios, excepto grant option
(Ver al final de la tabla).

ALTER Permite el uso de la instrucción ALTER TABLE.

CREATE Permite el uso de la instrucción CREATE TABLE.

CREATE Permite el uso de la instrucción CREATE TEMPORARY TABLE .


TEMPORARY
TABLES

DELETE Permite el uso de la instrucción DELETE.

DROP Permite el uso de la instrucción DROP TABLE .

EXECUTE Permite ejecutar procedimientos almacenados (MySQL 5.0)

FILE Permite el uso de los comandos


SELECT ...ll\lO OlJTFILE y LOAD DATA ll\"FILE.

Permite el uso de la instrucción CREA TE ll\"DEX y DROP ll\l)EX.

INSERT Permite el uso de la instrucción INSERT.

LOCK TABLES Permite el uso de la instrucción LOCK TABLES.

PROCESS Permite el uso de la instrucción SHOW FULL PROCESSLIST.

RELOAD Permite el uso de la instrucción FLUSH.

SELECT Permite el uso de la instrucción SELECT.

SHOW DATABASES Permite el uso de la instrucción SHOW DATABASES .

SHUTDO\VN Permite el uso de la instrucción MYSQLADMll' SHUTDOWl\.

www.redusers.com «
16 APÉl.\'DICE. lillMlNISTRAC¡ÓN DE BASES DE DATOS

LISTADO DE PRIVILEGIOS (COl\'TTh'lJACIÓl\)

UPDATE Permite el uso de la instrucción UPDATE.

USAGE Sin privilegios. Solo permite establecer la conexión.

GRANT OPTION Permite al usuario dar permisos a otros usuarios.

Tabla 6. Instrucciones para manipular bases de datos.

Tengamos en cuenta que, para poder ejecutar el comando grant, se


deben tener ciertos permisos especiales, por ejemplo, el usuario ROOT
los tiene. Puede ingresar al sistema como ROOT y agregar usuarios o
modificar sus permisos a través del comando grant.

Comando revoke
Su sintaxis y forma de uso es similar a grant, pero en vez de dar
privilegios, los quita. Por ejemplo:

mysql> REVOKE ALL ON *.* FROMjason@'%';

Implementar en los sistemas un área para el control y seguimiento de las actividades de los
usuarios que ingresan en nuestro sitio puede ser interesante desde el punto de vista esta-
dístico y económico, y también lo será en el aspecto referido a la seguridad. Por ejemplo,
podríamos evitar el acceso al sitio a usuarios conflictivos o que intenten realizar algún daño.

» www.redusers .com
PHP + NIYSQL DESDE CERO 17

Quita todos los privilegios sobre todas las bases de datos disponibles
en el servidor al usuario jason, desde donde sea que se conecte.

Figura 4. Eliminación del usuario pipo a través de revoke .

Gestión de privilegios con INSERT


En este ejemplo, damos al usuario thomas, contraseña blablabla , el privi-
legio de insertar datos en la tabla productos de la base de datos alimentos.
Si el usuario no existe, será creado:

mysql> grant insert on alimentos.productos to thomas@'%' identified by 'blablabla';

Gestión de privilegios con SELECT


En este ejemplo, damos al usuario rick con contraseña blablabla , que se
conecta desde el host serverl.com, el privilegio de ejecutar instrucciones
select en la columna dese alimentos de la tabla tipo de la base de datos ali-
mentos. Si el usuario no existe, será creado:

mysql> grant select (desc_alimentos) on alimentos.


tipo [email protected] id entified by 'blablabla';

www.reduaers.com «
18 APÉNDICE. ADMINISTRACIÓN DE BASES DE DATOS

Gestión de privilegios con UPDATE


Damos al usuario jeff y contraseña blablabla , que se conecta desde el host
serverl.com, el privilegio de ejecutar instrucciones update en las bases de datos
disponibles en el servidor. Si el usuario no existe, será creado:

mysql> grant update on *.* to [email protected] id entified by 'blablabla';

Gestión de privilegios con DELETE


Damos al usuario peter, que podrá conectarse desde cualquier host sin es-
pecificar su password, el privilegio de ejecutar instrucciones delete en las bases
de datos disponibles en el servidor. Si el usuario no existe, será creado:

mysql> grant update on *.* to peter@'%';

Gestión de usuarios
Para gestionar nuestros usuarios, en la consola de MySQL contamos con
diferentes herramientas que veremos a continuación.

Baja de usuarios
Se pueden quitar usuarios borrando las entradas correspondientes en la
tabla user, o bien, limitando sus privilegios a través del comando revoke, visto
anteriormente en este mismo capitulo. Utilizando revoke no se eliminará al
usuario, pero se logrará que se mantenga totalmente inoperante e inofensivo.

mysql_ change _user


Cuando nos conectamos desde PHP a una base de datos MySQL, tene-
mos que utilizar alguna de las funciones provistas para esto y darle como

» www.redusers .com
PHP + MYSQL DESDE CERO 19

argumento, entre otros, el nombre de usuario y su contraseña. A propósi-


to, PHP incorpora una función que nos permite, una vez establecida la co-
nexión, cambiar de usuario, contraseña e incluso, base de datos sin cerrar
la. conexión. Esta función es mysqlchangeuser y tiene la siguiente sintaxis:

mysql_change_user ("nombre de usuario","password","base de datos", identificador);

Los argumentos base de datos e identificadorson opcionales. Si se especifica


base de datos, esta será la base por defecto luego del cambio de usuario. Se
especifica identificador,en el caso de que tenga más de una conexión abierta,
para indicar cuál de ellas desea modificar (si especifica identificadordebe in-
dicar sí o sí la base de datos). Si la combinación final es inválida (es decir que
el usuario es incorrecto o no se corresponde con la contraseña, o no existe la
base de datos), la función devuelve falso y se mantiene la conexión anterior.

Listar todos los usuarios


mediante una consulta
Simplemente tenemos que obtener los usuarios de la tabla user,
que figuran justamente en la columna llamada user.

mysql> select disfinct(user) from user;

En este capítulonos introdujimos en el mundode los administradoresde bases de


datos: sus tareas, su relación con el entorno y cómo realizan sus funciones. Para esto,
utilizamos las funciones y los comandos provistos por PHP y MySQL.

www.redusers.com «
20 APÉNDICE. ADMINISTRACIÓN DE BASES DE DATOS

Actividades
TEST DE AUTOEV ALUACIÓI\

1 ¿Qué diferencia a los comandos GRANT y REVOKE?

2 Nombre cuatro tareas clásicas de un administrador de bases de datos.

3 ¿En qué consiste el llamado sistema de privilegios?

4 ¿Para qué sirven básicamente las tablas db, host y user ?

5 ¿Es posible crear dos usuarios con el mismo nombre y distintas contraseñas?
Haga la prueba.

EJERCICIOS PRÁCTICOS

1 Ingrese al servidor como usuario ROOT y dé de alta a un usuario llamado PIPO que
tenga permiso para realizar consultas SELECT sobre todas las base de datos.
Dele una contraseña y permítale acceder solo desde el host local ( localhosn

2 Conéctese a una base de datos como usuario PIPO e intente borrar una tabla.

3 Permítale a PIPO, realizar consultas SELECT y ejecutar instrucciones DROP.

4 ¿Hay en su servidor algún usuario con permiso para acceder a algún dato, cuyo
nombre sea Marty? Responda a esta pregunta mediante una consulta SQL.

Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse


con nuestros expertos: [email protected] .

» www.redusers .com
CON
PHP+MySQL desde cero
En este libro nos centraremos en el uso del lenguaje de programación
PHP en conjunto con una potente herramienta: el gestor de bases
de datos MySQL. Desde el inicio veremos la teoría y puesta en
práctica de bases de datos, continuaremos con el aprendizaje de
las facilidades que nos provee el lenguaje y aprenderemos cómo
potenciar nuestras aplicaciones con el gestor.

Dentro del libro encontrará *:


Teoría y práctica de la creacióu de bases de datos en PHP y MySQL / Utilización

de sentencias SQL / Funciones de acceso a datos desde PHP / Administración


y gestión de errores ell NlySQL
>1< Parte del contenido de este libro fue publicado previamente en DesarrolloPHP ::>'1ySQL, de esta misma editorial.

Otros títulos de la colección:

~ Java 1I PHP ti Programación


desde cero desde cero 8 desde cero
e e '-4, y •• , _

.""'"'" •
¡ ¡ .)'it'I1IIY ,"tJ;~ ~

~ ~

ISBN 978-987-1949-66-3

.
REDUSERS.com PROFESOR E:\TLDffiA
En nuestro sitio podrá encontrar noticias Ante cualquier consulta técuíca
relacionadas y también participar relacionada con el libro, puede
RU de la comunidad de tecnologia más
importante de América Latina.
contactarse con nuestros expertos:
profesorjjredusers.com.

También podría gustarte