PHP y MySQL
Aplicaciones Web/Sistemas Web
Juan Pavn Mestras Dep. Ingeniera del Software e Inteligencia Artificial Facultad de Informtica Universidad Complutense Madrid
Material bajo licencia Creative Commons
PHP
Breve introduccin a MySQL con phpMyAdmin
Persistencia de datos
La informacin se guarda para volver a utilizarla Mecanismos
Ficheros Almacenamiento bsico Acceso secuencial o aleatorio Bases de datos Informacin estructurada Relaciones Bsquedas Acceso concurrente Control de acceso a la informacin Integridad
Juan Pavn - UCM 2012-13
PHP
MySQL
Sistema de Gestin de Base de Datos Relacional
La informacin se guarda en tablas Una tabla es una coleccin de datos relacionados Una tabla consta de columnas (campos) y filas (registros) Las tablas se enlazan por relaciones entre columnas
Implementa casi todo el estndar SQL (Structured Query Language) Cdigo abierto
Actualmente de Oracle, que adquiri Sun, que tena MySQL AB Aplicaciones pequeas y grandes (millones de registros)
Escalable
Transacciones, Multiusuario Eficiente: Multihilo, varias tcnicas de hash, b-tree, etc. Conexin al servidor MySQL con sockets TCP/IP
Esto permite conectarla con casi cualquier plataforma
PHP
Juan Pavn - UCM 2012-13
phpMyAdmin
Herramienta que ofrece una interfaz grfica para la administracin del servidor MySQL
Configuracin del servidor y las bases de datos Gestionar (crear, modificar, borrar) las bases de datos, tablas, campos, relaciones, ndices, etc. Consultas con SQL, y mediante ejemplos (query by example) Definir usuarios y asignar permisos Realizar copias de seguridad Crear grficos (PDF) del esquema de la base de datos Exportar a muchos formatos (documentos de texto, hojas de clculo)
En XAMPP se puede invocar en http://localhost/phpmyadmin/ Configuracin
Fichero config.inc.php (en el directorio raz de phpMyAdmin) Pero ms recomendable a travs de la interfaz web de phpMyAdmin en http://www.dominio.com/phpMyAdmin/setup Usar el password del root de mySQL, que se aplica tambin a ese mismo usuario en phpMyAdmin (efectivo tras rearrancar mySQL)
PHP
Juan Pavn - UCM 2012-13
phpMyAdmin Pgina inicial
Juan Pavn - UCM 2012-13
PHP
Usuarios de MySQL
Conviene crear un nuevo usuario para cada sitio web
Cada sitio web tendr sus propias bases de datos El usuario root solo se debe usar para administracin En principio no tiene password, pero habr que ponerlo, por seguridad A continuacin crear un nuevo usuario
por ejemplo para el sitio del ejemplo a continuacin: tienda
Entrar en phpMyAdmin como usuario root
Pestaa Users-> Add user En la ventana que aparece indicar
Nombre de usuario: tienda Host (local si estis desarrollando con XAMPP en vuestro PC) Password: tienda Crear una base de datos para el nuevo usuario Marcar la casilla Createdatabasewithsamenameandgrantallprivileges No activar privilegios globales
Salir de la sesin como root Se puede trabajar con la nueva base de datos
PHP
Entrar con el nuevo usuario
Juan Pavn - UCM 2012-13
Creacin de una base de datos con phpMyAdmin
Como root: Create database en la pestaa Database
Indicar un nombre para la base de datos La opcin "collation" indica el conjunto de reglas de comparacin y ordenacin del texto en la base de datos, que depender del idioma Por ejemplo, utf8_general_ci que vale para muchos idiomas y no es sensible a maysculas y minsculas
Juan Pavn - UCM 2012-13
PHP
Manejo de la base de datos con phpMyAdmin
Al seleccionar la base de datos creada aparecen las operaciones que se pueden realizar con ella
Se pueden aadir permisos (pestaa Privileges) para que otros usuarios puedan usar la base de datos
En Structure se pueden crear las tablas que definen el esquema de la base de datos
Juan Pavn - UCM 2012-13
PHP
Ejemplo sencillo de base de datos: Tienda
Clientes nif* nombre direccion email telefono Pedidos numero * fecha cliente producto cantidad Productos id * nombre precio descripcion
*Clave primaria (los objetos en esta columna son nicos y no nulos). Ser indexada. **Se pueden definir tambin ndices para mejorar la eficiencia de las bsquedas ***Las claves forneas (foreign keys) identifica una columna (o grupo de columnas) en una tabla que se refiere a otra columna (o grupo de columnas) en otra tabla, generalmente la clave primaria en la tabla referenciada. Contribuyen a gestionar la integridad de la base de datos: no se puede crear un pedido de un cliente o un producto que no existan. Las claves forneas deberan indexarse porque se usarn para seleccionar registros con frecuencia.
Juan Pavn - UCM 2012-13 PHP
10
Creacin de tablas
La base de datos consta de tablas
Cada una con una serie de columnas (campos) Cada campo tendr asociado un tipo: Enteros: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT Nmeros reales: DECIMAL, DOUBLE, FLOAT, REAL Booleanos: BOOLEAN Fecha: DATE, TIME, YEAR Strings: VARCHAR (hasta 256 caracteres), TEXT Como Storage Engine conviene usar InnoDB para poder gestionar relaciones entre tablas Como Collation conviene usar utf8_general_ci
Juan Pavn - UCM 2012-13
PHP
11
Creacin de tablas
La primera tabla es la de clientes, con cinco campos
nif: servir como primary key (el nif es nico) nombre: de empresa o de persona (sera nombre + apellidos) Se puede indexar para hacer bsquedas por este campo direccion email telefono: como string para permitir uso de caracteres no numricos
Juan Pavn - UCM 2012-13
PHP
12
Creacin de tablas
Crear dos tablas ms:
productos pedidos
autoindex
Juan Pavn - UCM 2012-13
PHP
13
Definir relaciones entre tablas
Usar la pestaa Designer para ver grficamente las tablas
Se pueden recolocar las tablas Para aadir una relacin seleccionar el botn Create relation Seleccionar la primary key de la tabla clientes: nif Seleccionar la foreign key en la tabla pedidos: cliente Aparece una ventana para seleccionar qu hacer para preservar la integridad de las referencias, con las siguientes operaciones:
DELETE: seleccionar RESTRICT UPDATE: seleccionar CASCADE La restriccin ms adecuada en la mayora de los casos es evitar realizar borrados en cascada y actualizar en cascada
La relacin queda establecida y aparece en el grfico Para salvar el diagrama, usar el botn Save
Juan Pavn - UCM 2012-13
PHP
14
Definir relaciones entre tablas
Si falla el establecimiento de una relacin, comprobar que:
Ambas usan tablas InnoDB como storage engine No hay registros en las tablas Si los hubiera hay que comprobar que concuerdan para mantener la integridad de las referencias El campo en la primera tabla es una clave primaria El campo correspondiente en la segunda tabla est indexado Ambos campos tienen exactamente los mismos tipos de datos Si son numricos, ambos deben ser unsigned (o ninguno)
Una vez que se haya establecido la relacin no ser posible introducir registros en la segunda tabla a menos que se correspondan en el campo de la relacin con el de la primera tabla
Qu ocurre en la segunda tabla cuando se borra un registro de la primera tabla?
Juan Pavn - UCM 2012-13
PHP
15
Introducir datos en tablas
Seleccionar la tabla
Seleccionar la pestaa Insert Introducir datos para los campos correspondientes en Value
Tambin se pueden introducir a travs del programa PHP que recupera la informacin que un usuario haya introducido en un formulario de una pgina web En la pestaa Browse se pueden ver los registros de la base de datos y modificar campos de los mismos
Juan Pavn - UCM 2012-13
PHP
16
Backup de la base de datos
Export
Conveniente de forma regular Especialmente si se hacen muchos cambios Opciones (seleccionar Custom en Export Method) Qu se guarda
El servidor completo Una base de datos entera Una tabla
Estructura o datos, o ambos Compresin: ninguna, zipped, gzipped, bzipped Formato
SQL, CSV, Word, Latex, Excel, OpenDoc, PDF, XML, JSON, etc.
El proceso inverso es posible con Import
Juan Pavn - UCM 2012-13
PHP
17
Ejercicios con phpMyAdmin
Instalar phpMyAdmin Crear la base de datos tienda con las tablas clientes, productos y pedidos tal como se han definido previamente Insertar elementos en las tres tablas, primero en clientes y productos y luego en pedidos
Comprueba qu ocurre si se intenta introducir un pedido para un cliente que no existe
Intenta eliminar un cliente que tiene algn pedido
Observa el efecto de haber definido la poltica DELETE: RESTRICT cuando se estableci la FOREIGN KEY
Intenta cambiar el nombre de un producto que tiene algn pedido
Observa el efecto de haber definido la poltica UPDATE: CASCADE cuando se estableci la FOREIGN KEY
Juan Pavn - UCM 2012-13
PHP
18
PHP
Uso de MySQL con PHP
Acceso a la base de datos en PHP
web Servidor Web dinmico
Servidor Web Cliente
request Navegador GET index.php
httpd
Intrprete PHP (Genera HTML) Busca pgina index.php Consulta index.php
cdigo HTML
Repositorio de pginas
Base de datos
Juan Pavn - UCM 2012-13
PHP
20
Uso de una base de datos MySQL desde PHP
Con PHP5 se recomienda utilizar la extensin MySQLi (Mysql improved) en vez de la tradicional Mysql
Permite utilizar las mejoras de las ltimas versiones del servidor MySQL Interfaz orientada a objetos Interfaz ligera para acceso a bases de datos, con soporte para MySQL y otros sistemas de gestin de bases de datos Un driver especfico para cada SGBD Proporciona una capa de abstraccin para el acceso a datos Independiente del tipo de SGBD
No usa la sintaxis SQL
Alternativa: PHP Data Objects (PDO)
Orientado a objetos
Juan Pavn - UCM 2012-13
PHP
21
Uso de una base de datos MySQL desde PHP
Normalmente comprende los siguientes pasos:
1. Conexin con el servidor de bases de datos y seleccin de una base de datos Se obtiene un objeto para operar con la base de datos 2. Uso de la base de datos Envo de operacin SQL a la base de datos Recepcin y tratamiento de los resultados Liberar memoria de resultados 3. Desconexin
Juan Pavn - UCM 2012-13
PHP
22
Conexin con la base de datos
Para utilizar una base de datos hay que indicar el servidor y la base de datos que se quiere utilizar, con un usuario
$mysqli =newmysqli($hostname, $usuario,$password,$basededatos); if (mysqli_connect_errno()){ echo"ErrordeconexinalaBD:".mysqli_connect_error(); exit(); } Devuelve un objeto sobre el que operar con la base de datos Si hubiera un error se comprueba con el mtodo mysqli_connect_errno()
Cuando se deja de utilizar la base de datos conviene cerrar la conexin al servidor para liberar recursos ordenadamente
$mysqli>close();
Juan Pavn - UCM 2012-13
PHP
23
Operaciones SQL en una base de datos MySQL
Las queries SQL se pasan con el mtodo query
$mysqli>query("SQLquery"); Devuelve un objeto que permite tratar los resultados Devuelve FALSE si hay algn error Si se ponen variables PHP en la query, se ponen entre comillas simples para que la funcin mysql_query las reemplace por su valor
$empresa="Empresa%"; $query="SELECT*FROMclientesWHEREnombreLIKE'$empresa'"; $resultado=$mysqli>query($query) or die($mysqli>error."enlalnea".(__LINE__1)); $numregistros=$resultado>num_rows; echo"<p>ElnmerodeclientesconnombreEmpresa*es:",$numregistros,".</p>";
Juan Pavn - UCM 2012-13
PHP
24
Operaciones SQL en una base de datos MySQL
Varios atributos y mtodos de la clase mysqli_result facilitan el tratamiento de los registros obtenidos
$num_rows:Nmero de registros (filas)
$numfilas=$resultado>num_rows;
fetch_array() o fetch_all():Devuelve todas las filas en un array asociativo, numrico, o en ambos fetch_assoc(): Lo mismo pero como array asociativo
$registro=mysqli>fetch_array([modo])
Argumento opcional para indicar cmo se accede a los registros
Usando el nombre del campo como ndice: MYSQL_ASSOC Usando la posicin como ndice: MYSQL_NUM Usando tanto el nombre de campo como la posisicn: MYSQL_BOTH
free():Libera la memoria asociada al resultado
$resultado>free();
Juan Pavn - UCM 2012-13
PHP
25
Operaciones SQL en una base de datos MySQL
Ejemplo: listado de la tabla clientes
$query="SELECT*FROMclientes"; $resultado=$mysqli>query($query) or die($mysqli>error."enlalnea".(__LINE__1)); $numregistros=$resultado>num_rows; echo"<p>ElnmerodeclientesconnombreEmpresa*es:",$numregistros,".</p>"; echo"<table border=2><tr><th>NIF</th><th>Nombre</th><th>Direccin</th> <th>Email</th><th>Telfono</th></tr>"; while ($registro=$resultado>fetch_assoc()) { echo"<tr>"; foreach ($registroas$campo) echo"<td>",$campo,"</td>"; echo"</tr>"; } echo"</table>"; $resultado>free();
Juan Pavn - UCM 2012-13
PHP
26
SQL
SELECT
Recupera elementos de una tabla o conjunto de tablas (con JOIN)
SELECTcampos FROMtabla WHEREcampo=valor
Si se quieren todos los campos, usar * Si se omite la clusula WHERE se tienen todos los campos de la tabla Para la condicin WHERE se pueden usar varios operadores:
= <> != < <= AND OR NOT
>
>=
Se pueden recuperar campos de varias tablas
SELECTtabla1.campo1tabla2.campo2FROMtabla1,tabla2 WHEREcampo3=valor3ANDtabla1.campo1=tabla2.campo2
Tambin se pueden usar patrones para las condiciones % indica cualquier subcadena
SELECTcampos FROMtablas WHEREcampo3LIKEpatron
Ejemplo: SELECT nombre FROMclientes WHEREnombre LIKEJuan% Ordenar: ORDER BY Para no tener registros duplicados: DISTINCT
SELECTDISTINCTcampos FROMtablas WHERE...
Juan Pavn - UCM 2012-13 PHP
27
SQL
INSERT
Inserta nuevos elementos en una tabla Crea un nuevo cliente INSERTINTOclientes(nif,nombre,direccion,email,telefono) VALUES("M3885337J","EmpresaUno","CalleUno,Madrid", "[email protected]","912347898") Actualiza campos de una tabla Modifica el importe del producto "Producto1" UPDATEproductos SETprecio =399.99WHEREnombre="Producto1" Elimina registros de una tabla Elimina pedidos con ms de 30 das de antigedad DELETEFROMpedidos WHEREfecha <CURDATE()10
UPDATE
DELETE
Juan Pavn - UCM 2012-13
PHP
28
Ejercicio
Listar la informacin de la tabla pedidos indicando el nombre y NIF del cliente, y el coste de cada pedido (cantidad*precio del producto) Definir una funcin que liste todos los pedidos de un cliente dado por su nombre
Juan Pavn - UCM 2012-13
PHP
29
Bibliografa
Manual PHP oficial http://www.php.net/manual/es/index.php Sitio oficial de phpMyAdmin: http://www.phpmyadmin.net Introduccin sencilla al uso de phpMyAdmin y php con MySQL
http://www.yourwebskills.com/dbbackground.php http://www.yourwebskills.com/beginningmysql.php S. Suehring, T. Converse, J. Park. PHP6 and MySQL Bible. Wiley Pub. 2009 O. Heurtel. PHP y MySQL. Domine el desarrollo de un sitio Web dinmico e interactivo. Ediciones ENI 2009 M. Delisle. Dominar phpMyAdmin para una administracin efectiva de MySQL. Packt Publishing (2007)
Libros
Juan Pavn - UCM 2012-13
PHP
30
Apndice: Interfaz PHP Mysql tradicional
Normalmente comprende los siguientes pasos:
1. Conexin con el servidor de bases de datos mysql_connect() 2. Seleccin de una base de datos mysql_select_db() 3. Uso de la base de datos Envo de operacin SQL a la base de datos mysql_query() Recepcin y tratamiento de los resultados mysql_num_rows() mysql_fetch_array() mysql_free_result() 4. Desconexin del servidor de bases de datos mysql_close()
Juan Pavn - UCM 2012-13
PHP
31
Conexin con la base de datos
Para utilizar una base de datos hay que:
Conectarse con el servidor que la gestiona $conexion =mysql_connect($servidor,$usuario,$password) Devuelve como resultado un recurso de tipo enlace (la conexin a la base de datos) Si hubiera un error devuelve FALSE
En caso de error, si se quiere acabar el script se puede poner: $conexion =mysql_connect($servidor,$usuario,$password)or die("ErrorenconexinalservidorMySQL:".mysql_error());
Seleccionar la base de datos en el servidor mysql_select_db($basedatos,$conexion) La base de datos se especifica en la variable $basedatos Devuelve TRUE si todo va bien, FALSE si hay algn error
mysql_select_db($bd,$conexion)or die("Error:Nosepuedeusarlabasededatos.".mysql_error());
Juan Pavn - UCM 2012-13
PHP
32
Operaciones SQL en una base de datos MySQL
Las queries SQL se pasan con la funcin
mysql_query("SQLquery"); Devuelve un identificador o TRUE (dependiendo de la instruccin) si la instruccin se ejecuta correctamente Devuelve FALSE si hay algn error Si se ponen variables PHP en la query, se ponen entre comillas simples para que la funcin mysql_query las reemplace por su valor
$query="SELECT*FROMclientes"; $resultado=mysql_query($query)or die("Errorenlaquery:".mysql_error()); $numregistros=mysql_num_rows($resultado); echo"<p>Elnmeroderegistrosdeclienteses:",$numregistros,".</p>";
Juan Pavn - UCM 2012-13
PHP
33
Operaciones SQL en una base de datos MySQL
El conjunto de registros resultado del query se guarda en una variable Varias funciones facilitan el tratamiento de los registros obtenidos
mysql_num_rows:Devuelve el nmero de registros (filas)
$numfilas=mysql_num_rows($resultado)
mysql_fetch_array:Devuelve el siguiente registro o FALSE si no hay ms
$registro=mysql_fetch_array($resultado,[modo_de_acceso])
Argumento opcional para indicar cmo se accede a los registros
Usando el nombre del campo como ndice: MYSQL_ASSOC Usando la posicin como ndice: MYSQL_NUM Usando tanto el nombre de campo como la posisicn: MYSQL_BOTH
mysql_free_results:Libera la memoria una vez procesado el conjunto de registros
$registro=mysql_fetch_array($resultado)
Juan Pavn - UCM 2012-13
PHP
34
Operaciones SQL en una base de datos MySQL
Ejemplo: listado de la tabla clientes
$query="SELECT*FROMclientes"; $resultado=mysql_query($query)or die("Errorenlaquery:".mysql_error()); $numregistros=mysql_num_rows($resultado); echo"<p>Elnmeroderegistrosdeclienteses:",$numregistros,".</p>"; echo"<table border=2><tr><th>NIF</th><th>Nombre</th><th>Direccin</th> <th>Email</th><th>Telfono</th></tr>"; while ($registro=mysql_fetch_array ($resultado,MYSQL_ASSOC)){ echo"<tr>"; foreach ($registroas$campo) echo"<td>",$campo,"</td>"; echo"</tr>"; } echo"</table>"; mysql_free_result($resultado);
Juan Pavn - UCM 2012-13
PHP
35
Desconexin de la base de datos
Cuando se deja de utilizar la base de datos conviene cerrar la conexin al servidor para liberar recursos ordenadamente
mysql_close($conexion);
Juan Pavn - UCM 2012-13
PHP
36