PHP y MySQL Aplica cion e s W e b/ Sist e m a s W e b Ju a n Pa vón M e st r a s D e p. I n ge n ie r ía de l Soft w a r e e I n t e lige n cia Ar t ificia l Fa cu lt a d de I n for m á t ica Un ive r sida d Com plu t e n se M a dr id Mat erial baj o licencia Creat ive Com m ons PHP Breve int roducción a MySQL con phpMyAdm in Persist encia de dat os La inform ación se guarda para volver a ut ilizarla Mecanism os Ficheros • Alm acenam ient o básico • Acceso secuencial o aleat orio Bases de dat os • I nform ación est ruct urada • Relaciones • Búsquedas • Acceso concurrent e • Cont rol de acceso a la inform ación • I nt egridad Juan Pavón - UCM 2012- 13 PHP 3 MySQL Sist em a de Gest ión de Base de Dat os Relacional La inform ación se guarda en t ablas • Una t abla es una colección de dat os relacionados • Una t abla const a de colum nas ( cam pos) y filas ( regist ros) • Las t ablas se enlazan por relaciones ent re colum nas I m plem ent a casi t odo el est ándar SQL ( St ruct ured Query Language) Código abiert o Act ualm ent e de Oracle, que adquirió Sun, que t enía MySQL AB Escalable Aplicaciones pequeñas y grandes ( m illones de regist ros) Transacciones, Mult iusuario Eficient e: Mult ihilo, varias t écnicas de hash, b- t ree, et c. Conexión al servidor MySQL con socket s TCP/ I P Est o perm it e conect arla con casi cualquier plat aform a Juan Pavón - UCM 2012- 13 PHP 4 phpMyAdm in Herram ient a que ofrece una int erfaz gráfica para la adm inist ración del servidor MySQL Configuración del servidor y las bases de dat os Gest ionar ( crear, m odificar, borrar) las bases de dat os, t ablas, cam pos, relaciones, índices, et c. Consult as con SQL, y m ediant e ej em plos ( query by exam ple) Definir usuarios y asignar perm isos Realizar copias de seguridad Crear gráficos ( PDF) del esquem a de la base de dat os Export ar a m uchos form at os ( docum ent os de t ext o, hoj as de cálculo) En XAMPP se puede invocar en http://localhost/phpmyadmin/ Configuración Fichero con fig.in c.ph p ( en el direct orio raíz de phpMyAdm in) Pero m ás recom endable a t ravés de la int erfaz web de phpMyAdm in en http://www.dominio.com/phpMyAdmin/setup Usar el password del root de m ySQL, que se aplica t am bién a ese m ism o usuario en phpMyAdm in ( efect ivo t ras rearrancar m ySQL) Juan Pavón - UCM 2012- 13 PHP 5 phpMyAdm in – Página inicial Juan Pavón - UCM 2012- 13 PHP 6 Usuarios de MySQL Conviene crear un nuevo usuario para cada sit io web Cada sit io web t endrá sus propias bases de dat os El usuario root solo se debe usar para adm inist ración Ent rar en phpMyAdm in com o usuario root En principio no t iene password, pero habrá que ponerlo, por seguridad A cont inuación crear un nuevo usuario • por ej em plo para el sit io del ej em plo a cont inuación: tienda • Pest aña Users- > Add user • En la vent ana que aparece indicar • • • • Nom bre de usuario: tienda Host ( local si est áis desarrollando con XAMPP en vuest ro PC) Password: tienda Crear una base de dat os para el nuevo usuario • Marcar la casilla Create database with same name and grant all privileges • No act ivar privilegios globales Salir de la sesión com o root Ent rar con el nuevo usuario Se puede t rabaj ar con la nueva base de dat os Juan Pavón - UCM 2012- 13 PHP 7 Creación de una base de dat os con phpMyAdm in Com o root : Creat e dat abase en la pest aña Dat abase I ndicar un nom bre para la base de dat os La opción " collat ion" indica el conj unt o de reglas de com paración y ordenación del t ext o en la base de dat os, que dependerá del idiom a • Por ej em plo, ut f8_general_ci que vale para m uchos idiom as y no es sensible a m ayúsculas y m inúsculas Juan Pavón - UCM 2012- 13 PHP 8 Manej o de la base de dat os con phpMyAdm in Al seleccionar la base de dat os creada aparecen las operaciones que se pueden realizar con ella Se pueden añadir perm isos ( pest aña Privileges) para que ot ros usuarios puedan usar la base de dat os En St ruct ure se pueden crear las t ablas que definen el esquem a de la base de dat os Juan Pavón - UCM 2012- 13 9 PHP Ej em plo sencillo de base de dat os: Tienda Clie n t e s Pe didos nif * num ero * nom bre fecha direccion client e Pr odu ct os id * nom bre precio em ail product o t elefono cant idad descripcion * Cla ve pr im a r ia ( los obj et os en est a colum na son únicos y no nulos) . Será indexada. * * Se pueden definir t am bién ín dice s para m ej orar la eficiencia de las búsquedas * * * Las cla ve s for á n e a s ( for e ign k e ys) ident ifica una colum na ( o grupo de colum nas) en una t abla que se refiere a ot ra colum na ( o grupo de colum nas) en ot ra t abla, generalm ent e la clave prim aria en la t abla referenciada. Cont ribuyen a gest ionar la int egridad de la base de dat os: no se puede crear un pedido de un client e o un product o que no exist an. Las claves foráneas deberían indexarse porque se usarán para seleccionar regist ros con frecuencia. Juan Pavón - UCM 2012- 13 PHP 10 Creación de t ablas La base de dat os const a de t ablas Cada una con una serie de colum nas ( cam pos) Cada cam po t endrá asociado un t ipo: • Ent eros: TI NYI NT, SMALLI NT, MEDI UMI NT, I NT, BI GI NT • Núm eros reales: DECI MAL, DOUBLE, FLOAT, REAL • Booleanos: BOOLEAN • Fecha: DATE, TI ME, YEAR • St rings: VARCHAR ( hast a 256 caract eres) , TEXT Com o St orage Engine conviene usar InnoDB para poder gest ionar relaciones ent re t ablas Com o Collat ion conviene usar utf8_general_ci Juan Pavón - UCM 2012- 13 PHP 11 Creación de t ablas La prim era t abla es la de client es, con cinco cam pos nif: servirá com o prim ary key ( el nif es único) nom bre: de em presa o de persona ( sería nom bre + apellidos) • Se puede indexar para hacer búsquedas por est e cam po direccion em ail t elefono: com o st ring para perm it ir uso de caract eres no num éricos Juan Pavón - UCM 2012- 13 PHP 12 Creación de t ablas Crear dos t ablas m ás: product os pedidos Juan Pavón - UCM 2012- 13 aut oindex PHP 13 Definir relaciones ent re t ablas Usar la pest aña Designer para ver gráficam ent e las t ablas Se pueden recolocar las t ablas Para añadir una relación seleccionar el bot ón Creat e relat ion • Seleccionar la prim ary key de la t abla client es: nif • Seleccionar la foreign key en la t abla pedidos: client e • Aparece una vent ana para seleccionar qué hacer para preservar la int egridad de las referencias, con las siguient es operaciones: • DELETE: seleccionar RESTRI CT • UPDATE: seleccionar CASCADE • La rest ricción m ás adecuada en la m ayoría de los casos es evit ar realizar borrados en cascada y act ualizar en cascada • La relación queda est ablecida y aparece en el gráfico Para salvar el diagram a, usar el bot ón Save Juan Pavón - UCM 2012- 13 PHP 14 Definir relaciones ent re t ablas Si falla el est ablecim ient o de una relación, com probar que: Am bas usan t ablas I nnoDB com o st orage engine No hay regist ros en las t ablas • Si los hubiera hay que com probar que concuerdan para m ant ener la int egridad de las referencias El cam po en la prim era t abla es una clave prim aria El cam po correspondient e en la segunda t abla est á indexado Am bos cam pos t ienen exact am ent e los m ism os t ipos de dat os • Si son num éricos, am bos deben ser unsigned ( o ninguno) Una vez que se haya est ablecido la relación no será posible int roducir regist ros en la segunda t abla a m enos que se correspondan en el cam po de la relación con el de la prim era t abla ¿Qué ocurre en la segunda t abla cuando se borra un regist ro de la prim era t abla? Juan Pavón - UCM 2012- 13 PHP 15 I nt roducir dat os en t ablas Seleccionar la t abla Seleccionar la pest aña I nsert I nt roducir dat os para los cam pos correspondient es en Value Tam bién se pueden int roducir a t ravés del program a PHP que recupera la inform ación que un usuario haya int roducido en un form ulario de una página web En la pest aña Browse se pueden ver los regist ros de la base de dat os y m odificar cam pos de los m ism os Juan Pavón - UCM 2012- 13 PHP 16 Backup de la base de dat os Ex por t Convenient e de form a regular • Especialm ent e si se hacen m uchos cam bios Opciones ( seleccionar Cust om en Export Met hod) • Qué se guarda • El servidor com plet o • Una base de dat os ent era • Una t abla • Est ruct ura o dat os, o am bos • Com presión: ninguna, zipped, gzipped, bzipped • Form at o • SQL, CSV, Word, Lat ex, Excel, OpenDoc, PDF, XML, JSON, et c. El proceso inverso es posible con I m por t Juan Pavón - UCM 2012- 13 PHP 17 Ej ercicios con phpMyAdm in I nst alar phpMyAdm in Crear la base de dat os t ienda con las t ablas client es, product os y pedidos t al com o se han definido previam ent e I nsert ar elem ent os en las t res t ablas, prim ero en client es y product os y luego en pedidos • Com prueba qué ocurre si se int ent a int roducir un pedido para un client e que no exist e I nt ent a elim inar un client e que t iene algún pedido • Observa el efect o de haber definido la polít ica DELETE: RESTRI CT cuando se est ableció la FOREI GN KEY I nt ent a cam biar el nom bre de un product o que t iene algún pedido • Observa el efect o de haber definido la polít ica UPDATE: CASCADE cuando se est ableció la FOREI GN KEY Juan Pavón - UCM 2012- 13 PHP 18 PHP Uso de MySQL con PHP Acceso a la base de dat os en PHP web Servidor Web dinámico Servidor Web Cliente «request» Navegador httpd GET index.php Intérprete PHP (Genera HTML) código HTML Busca página index.php Consulta index.php Repositorio de páginas Juan Pavón - UCM 2012- 13 PHP Base de datos 20 Uso de una base de dat os MySQL desde PHP Con PHP5 se recom ienda ut ilizar la ext ensión M ySQLi ( Mysql im proved) en vez de la t radicional M ysql Perm it e ut ilizar las m ej oras de las últ im as versiones del servidor MySQL I nt erfaz orient ada a obj et os Alt ernat iva: PHP Dat a Obj ect s ( PD O) I nt erfaz ligera para acceso a bases de dat os, con soport e para MySQL y ot ros sist em as de gest ión de bases de dat os • Un driver específico para cada SGBD Proporciona una capa de abst racción para el acceso a dat os • I ndependient e del t ipo de SGBD • No usa la sint axis SQL • Orient ado a obj et os Juan Pavón - UCM 2012- 13 PHP 21 Uso de una base de dat os MySQL desde PHP Norm alm ent e com prende los siguient es pasos: 1 . Con e x ión con el servidor de bases de dat os y selección de una base de dat os • Se obt iene un obj et o para operar con la base de dat os 2 . Uso de la ba se de da t os • Envío de operación SQL a la base de dat os • Recepción y t rat am ient o de los result ados • Liberar m em oria de result ados 3 . D e scon e x ión Juan Pavón - UCM 2012- 13 PHP 22 Conexión con la base de dat os Para ut ilizar una base de dat os hay que indicar el servidor y la base de dat os que se quiere ut ilizar, con un usuario $mysqli = new mysqli($hostname, $usuario, $password,$basededatos); if ( mysqli_connect_errno() ) { echo "Error de conexión a la BD: ".mysqli_connect_error(); exit(); } • Devuelve un obj et o sobre el que operar con la base de dat os • Si hubiera un error se com prueba con el m ét odo mysqli_connect_errno() Cuando se dej a de ut ilizar la base de dat os conviene cerrar la conexión al servidor para liberar recursos ordenadam ent e $mysqli‐>close(); Juan Pavón - UCM 2012- 13 PHP 23 Operaciones SQL en una base de dat os MySQL Las qu e r ie s SQL se pasan con el m ét odo qu e r y $mysqli‐>query("SQL query"); • Devuelve un obj et o que perm it e t rat ar los result ados • Devuelve FALSE si hay algún error • Si se ponen variables PHP en la query, se ponen ent re com illas sim ples para que la función m ysql_query las reem place por su valor $empresa="Empresa%"; $query="SELECT * FROM clientes WHERE nombre LIKE '$empresa'"; $resultado=$mysqli‐>query($query) or die ($mysqli‐>error. " en la línea ".(__LINE__‐1)); $numregistros=$resultado‐>num_rows; echo "<p>El número de clientes con nombre Empresa* es: ",$numregistros,".</p>"; Juan Pavón - UCM 2012- 13 PHP 24 Operaciones SQL en una base de dat os MySQL Varios at ribut os y m ét odos de la clase m ysqli_ r e su lt facilit an el t rat am ient o de los regist ros obt enidos $ n u m _ r ow s: Núm ero de regist ros ( filas) $numfilas=$resultado‐>num_rows; fe t ch _ a r r a y( ) o fe t ch _ a ll( ) : Devuelve t odas las filas en un array asociat ivo, num érico, o en am bos • fe t ch _ a ssoc( ) : Lo m ism o pero com o array asociat ivo $registro=mysqli‐>fetch_array([modo]) • Argum ent o opcional para indicar cóm o se accede a los regist ros • Usando el nom bre del cam po com o índice: MYSQL_ASSOC • Usando la posición com o índice: MYSQL_NUM • Usando t ant o el nom bre de cam po com o la posisicón: MYSQL_BOTH fr e e ( ) : Libera la m em oria asociada al result ado $resultado‐>free(); Juan Pavón - UCM 2012- 13 PHP 25 Operaciones SQL en una base de dat os MySQL Ej em plo: list ado de la t abla client es $query="SELECT * FROM clientes"; $resultado=$mysqli‐>query($query) or die ($mysqli‐>error. " en la línea ".(__LINE__‐1)); $numregistros=$resultado‐>num_rows; echo "<p>El número de clientes con nombre Empresa* es: ",$numregistros,".</p>"; echo "<table border=2><tr><th>NIF</th> <th>Nombre</th> <th>Dirección</th> <th>Email</th> <th>Teléfono</th></tr>"; while ($registro = $resultado‐>fetch_assoc()) { echo "<tr>"; foreach ($registro as $campo) echo "<td>",$campo, "</td>"; echo "</tr>"; } echo "</table>"; $resultado‐>free(); Juan Pavón - UCM 2012- 13 PHP 26 SQL SELECT Recupera elem ent os de una t abla o conj unt o de t ablas ( con JOI N) SELECT campos FROM tabla WHERE campo = valor • Si se quieren t odos los cam pos, usar * • Si se om it e la cláusula WHERE se t ienen t odos los cam pos de la t abla • Para la condición WHERE se pueden usar varios operadores: • = < > != < < = • AND OR NOT > >= Se pueden recuperar cam pos de varias t ablas SELECT tabla1.campo1 tabla2.campo2 FROM tabla1, tabla2 WHERE campo3=valor3 AND tabla1.campo1 = tabla2.campo2 Tam bién se pueden usar pat rones para las condiciones • % indica cualquier subcadena SELECT campos FROM tablas WHERE campo3 LIKE patron • Ej em plo: SELECT nombre FROM clientes WHERE nombre LIKE Juan% Ordenar: ORDER BY Para no t ener regist ros duplicados: DI STI NCT SELECT DISTINCT campos FROM tablas WHERE ... Juan Pavón - UCM 2012- 13 PHP 27 SQL I N SERT UPD ATE I nsert a nuevos elem ent os en una t abla • Crea un nuevo client e INSERT INTO clientes (nif, nombre, direccion, email, telefono) VALUES ("M3885337J", "Empresa Uno", "Calle Uno, Madrid", "jefe@empresauno.com", "91 2347898") Act ualiza cam pos de una t abla • Modifica el im port e del product o "Producto1" UPDATE productos SET precio = 399.99 WHERE nombre="Producto1" D ELETE Elim ina regist ros de una t abla • Elim ina pedidos con m ás de 30 días de ant igüedad DELETE FROM pedidos WHERE fecha < CURDATE()‐10 Juan Pavón - UCM 2012- 13 PHP 28 Ej ercicio List ar la inform ación de la t abla pedidos indicando el nom bre y NI F del client e, y el cost e de cada pedido ( cant idad* precio del product o) Definir una función que list e t odos los pedidos de un client e dado por su nom bre Juan Pavón - UCM 2012- 13 PHP 29 Bibliografía Manual PHP oficial ht t p: / / www.php.net / m anual/ es/ index.php Sit io oficial de phpMyAdm in: ht t p: / / www.phpm yadm in.net I nt roducción sencilla al uso de phpMyAdm in y php con MySQL ht t p: / / www.yourwebskills.com / dbbackground.php ht t p: / / www.yourwebskills.com / beginningm ysql.php Libros S. Suehring, T. Converse, J. Park. PHP6 and MySQL Bible. Wiley Pub. 2009 O. Heurt el. PHP y MySQL. Dom ine el desarrollo de un sit io Web dinám ico e int eract ivo. Ediciones ENI 2009 M. Delisle. Dom inar phpMyAdm in para una adm inist ración efect iva de MySQL. Packt Publishing ( 2007) Juan Pavón - UCM 2012- 13 PHP 30 Apéndice: I n t e r fa z PH P M ysql t r a dicion a l Norm alm ent e com prende los siguient es pasos: 1. Conexión con el servidor de bases de dat os mysql_connect() 2. Selección de una base de dat os mysql_select_db() 3. Uso de la base de dat os • Envío de operación SQL a la base de dat os mysql_query() • Recepción y t rat am ient o de los result ados mysql_num_rows() mysql_fetch_array() mysql_free_result() 4. Desconexión del servidor de bases de dat os mysql_close() Juan Pavón - UCM 2012- 13 PHP 31 Conexión con la base de dat os Para ut ilizar una base de dat os hay que: Con e ct a r se con e l se r vidor que la gest iona $conexion = mysql_connect($servidor, $usuario, $password) • Devuelve com o result ado un recurso de t ipo enlace ( la conexión a la base de dat os) • 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("Error en conexión al servidor MySQL: ".mysql_error()); Se le ccion a r la ba se de da t os en el servidor mysql_select_db($basedatos, $conexion) • La base de dat os se especifica en la variable $basedatos • Devuelve TRUE si t odo va bien, FALSE si hay algún error mysql_select_db($bd, $conexion) or die ("Error: No se puede usar la base de datos. ".mysql_error()); Juan Pavón - UCM 2012- 13 PHP 32 Operaciones SQL en una base de dat os MySQL Las qu e r ie s SQL se pasan con la función mysql_query("SQL query"); • Devuelve un ident ificador o TRUE ( dependiendo de la inst rucción) si la inst rucción se ej ecut a correct am ent e • Devuelve FALSE si hay algún error • Si se ponen variables PHP en la query, se ponen ent re com illas sim ples para que la función m ysql_query las reem place por su valor $query="SELECT * FROM clientes"; $resultado=mysql_query($query) or die ("Error en la query: ".mysql_error()); $numregistros=mysql_num_rows($resultado); echo "<p>El número de registros de clientes es: ",$numregistros,".</p>"; Juan Pavón - UCM 2012- 13 PHP 33 Operaciones SQL en una base de dat os MySQL El conj unt o de regist ros result ado del query se guarda en una variable Varias funciones facilit an el t rat am ient o de los regist ros obt enidos m ysql_ n u m _ r ow s: Devuelve el núm ero de regist ros ( filas) $numfilas=mysql_num_rows($resultado) m ysql_ fe t ch _ a r r a y: Devuelve el siguient e regist ro o FALSE si no hay m ás $registro=mysql_fetch_array($resultado, [modo_de_acceso]) • Argum ent o opcional para indicar cóm o se accede a los regist ros • Usando el nom bre del cam po com o índice: MYSQL_ASSOC • Usando la posición com o índice: MYSQL_NUM • Usando t ant o el nom bre de cam po com o la posisicón: MYSQL_BOTH m ysql_ fr e e _ r e su lt s: Libera la m em oria una vez procesado el conj unt o de regist ros $registro=mysql_fetch_array($resultado) Juan Pavón - UCM 2012- 13 PHP 34 Operaciones SQL en una base de dat os MySQL Ej em plo: list ado de la t abla client es $query="SELECT * FROM clientes"; $resultado=mysql_query($query) or die ("Error en la query: ".mysql_error()); $numregistros=mysql_num_rows($resultado); echo "<p>El número de registros de clientes es: ",$numregistros,".</p>"; echo "<table border=2><tr><th>NIF</th> <th>Nombre</th> <th>Dirección</th> <th>Email</th> <th>Teléfono</th></tr>"; while ($registro = mysql_fetch_array ($resultado, MYSQL_ASSOC)) { echo "<tr>"; foreach ($registro as $campo) echo "<td>",$campo, "</td>"; echo "</tr>"; } echo "</table>"; mysql_free_result($resultado); Juan Pavón - UCM 2012- 13 PHP 35 Desconexión de la base de dat os Cuando se dej a de ut ilizar la base de dat os conviene cerrar la conexión al servidor para liberar recursos ordenadam ent e mysql_close($conexion); Juan Pavón - UCM 2012- 13 PHP 36