Download Tema 8. Bases de datos(I)
Document related concepts
Transcript
Desarrollo Web en Entorno Servidor Tema 8: Bases de datos (I). 1. Bases de datos en la Web. Acceso a bases de datos desde PHP 2. MySQL. Administracion con phpmyadmin. 3. Conexión con el servidor de base de datos. 4. Selección de base de datos. 5. Crear una base de datos. 6. Borrar una base de datos. 7. Crear Tablas. 8. Lectura de resultados de sentencias Mysql. 9. Otras funciones informativas. 1 1.Bases de datos en la Web Las bases de datos permiten almacenar de una forma estructurada y eficiente toda la información de un sitio web Ventajas Proporcionar información actualizada Facilitar la realización de búsquedas Disminuir los costes de mantenimiento Implementar sistemas de control de acceso Almacenar preferencias de los usuarios 2 1.Bases de datos en la Web Esquema básico de un sitio web soportado por bases de datos: 3 1.- Acceso a bases de datos desde PHP. Una de las aplicaciones más frecuentes de PHP es generar un interface web para acceder y gestionar la información almacenada en una base de datos. Usando PHP podemos mostrar en una página web información extraída de la base de datos, o enviar sentencias al gestor de la base de datos para que elimine o actualice algunos registros. PHP soporta más de 15 sistemas gestores de bases de datos: SQLite, Oracle, SQL Server, PostgreSQL, IBM DB2, MySQL, etc. Hasta la versión 5 de PHP, el acceso a las bases de datos se hacía principalmente utilizando extensiones específicas para cada sistema gestor de base de datos (extensiones nativas). Es decir, que si queríamos acceder a una base de datos de PostgreSQL, deberíamos instalar y utilizar la extensión de ese gestor en concreto. Las funciones y objetos a utilizar eran distintos para cada extensión. A partir de la versión 5 de PHP se introdujo en el lenguaje una extensión para acceder de una forma común a distintos sistemas gestores: PDO. La gran ventaja de PDO está clara: podemos seguir utilizando una misma sintaxis aunque cambiemos el motor de nuestra base de datos. Por el contrario, en algunas ocasiones preferiremos seguir usando extensiones nativas en nuestros programas. Mientras PDO ofrece un conjunto común de funciones, las extensiones nativas normalmente ofrecen más potencia (acceso a funciones específicas de cada gestor de base de datos) y en algunos casos también mayor velocidad. De los distintos SGBD existentes, vas a aprender a utilizar MySQL. MySQL es un gestor de bases de datos relacionales de código abierto bajo licencia GNU GPL. Es el gestor de bases de datos más empleado con el lenguaje PHP. Como ya vimos, es la letra "M" que figura en los acrónimos AMP y XAMPP. 4 MySQL MySQL es un sistema gestor de bases de datos (SGBD) relacionales. Es un programa de código abierto que se ofrece bajo licencia GNU GPL, aunque también ofrece una licencia comercial en caso de que quieras utilizarlo para desarrollar aplicaciones de código propietario. En las últimas versiones (a partir de la 5.1), se ofrecen, de hecho, varios productos distintos: uno de código libre (Community Edition), y otro u otros comerciales (Standard Edition, Enterprise Edition). Incorpora múltiples motores de almacenamiento, cada uno con características propias: unos son más veloces, otros, aportan mayor seguridad o mejores capacidades de búsqueda. Cuando crees una base de datos, puedes elegir el motor en función de las características propias de la aplicación. Si no lo cambias, el motor que se utiliza por defecto se llama MyISAM, que es muy rápido pero a cambio no contempla integridad referencial ni tablas transaccionales . El motor InnoDB es un poco más lento pero sí soporta tanto integridad referencial como tablas transaccionales. MySQL se emplea en múltiples aplicaciones web, ligado en la mayor parte de los casos al lenguaje PHP y al servidor web Apache. Utiliza SQL para la gestión, consulta y modificación de la información almacenada. Soporta la mayor parte de las características de ANSI SQL 99 (revisión del estándar ANSI SQL del año 1999, que agrega a la revisión anterior (SQL2 o SQL 92) disparadores, expresiones regulares, y algunas características de orientación a objetos), y añade además algunas extensiones propias. En este primer tema dedicado a las bases de datos vamos a trabajar con la extensión nativa MySQL, dada la gran cantidad de aplicaciones hechas usando esta extensión. 5 MySQL Características de MySQL Modelo relacional, multiusuario Tipos de datos Numéricos Fecha y hora date, time, datetime, year, timestamp Cadena tinyint, smallint, mediumint, int, integer, bigint decimal, float, numeric char, varchar tinytext, text, mediumtext, longtext tinyblob, blob, mediumblob, longblob enum, set Debe elegirse adecuadamente el tipo y el tamaño de cada campo 6 MySQL Operadores Aritméticos Comparación Lógicos Funciones +, -, *, / =, !=, <=, <, >=, >, IS NULL, IS NOT NULL not (!), and (&&), or (||), xor Funciones Funciones Funciones Funciones Funciones de cadena de comparación de cadenas numéricas de fecha y hora de agregado 7 Herramientas de administración: phpMyAdmin phpMyAdmin es una herramienta para la administración del servidor de bases de datos MySQL Dispone de una interfaz gráfica y es de libre distribución Permite realizar todo tipo de operaciones sobre bases de datos: crear, borrar y modificar tablas consultar, insertar, modificar y eliminar datos definir usuarios y asignar permisos realizar copias de seguridad etc Está escrita en php y se ejecuta desde el navegador Si está instalada en la carpeta phpmyadmin, se ejecuta escribiendo en la barra de direcciones del navegador la url http://localhost/phpmyadmin/ Puede administrar bases de datos locales y remotas 8 phpMyadmin 9 Funciones de PHP para el acceso a bases de datos MySQL Los pasos para acceder desde PHP a una base de datos son los siguientes: Conectar con el servidor de bases de datos Seleccionar una base de datos Enviar la instrucción SQL a la base de datos Obtener y procesar los resultados Cerrar la conexión con el servidor de bases de datos 10 Acceso a bases de datos MySQL Las funciones concretas de MySQL que realizan estas operaciones son: Conectar con el servidor de bases de datos: Seleccionar una base de datos: mysql_query() Obtener y procesar los resultados: mysql_select_db() Enviar la instrucción SQL a la base de datos: mysql_connect() mysql_num_rows() y mysql_fetch_array() Cerrar la conexión con el servidor de bases de datos: mysql_close() 11 Acceso a bases de datos MySQL Conectar con el servidor de bases de datos: mysql_connect() Devuelve un identificador de la conexión en caso de éxito y false en caso contrario Sintaxis: $conexion = mysql_connect (servidor, username, password); Ejemplo: $conexion = mysql_connect ("localhost", "cursophp", "") or die ("No se puede conectar con el servidor"); Cerrar la conexión con base de datos: mysql_close() Ejemplos: <?php $c=mysql_connect("localhost", "root",""); mysql_close($c); ?> 12 Conexión con el servidor de la Base de datos. En el siguiente ejemplo se controla si se ha podido realizar la conexión utilizando el valor devuelto por mysql_connect() <?php $c=mysql_connect ("localhost", "root",""); if ($c) Fichero: conexion1.php echo 'Conectado satisfactoriamente'; else echo 'No pudo conectarse: ' ; mysql_close($c); # echo 'Se ha cerrado la conexión con el servidor de bases de datos'; ?> En este ejemplo se utiliza la instrucción OR DIE <?php $c=mysql_connect("localhost", "root","") or die("No se conecto"); if(mysql_close($c)){ print "<br>Se ha cerrado la conexión con el servidor de bases de datos<BR>"; } ?> 13 Evitar el mensaje de error La utilización de or die es una opción alternativa a exit() que, interrumpe la ejecución de un script en el momento de ser ejecutada. Cuando se produce un error en la ejecución de un script –no poder establecer conexión con MySQL, por ejemplo– no tiene sentido seguir ejecutándolo. Lo razonable será interrumpir el proceso y advertir del error. Si añadimos a la instrucción $c=mysql_conect('h','u','p') (sin paréntesis, ni comas, ni punto y coma, sólo separado por un espacio): or die ('mensaje') ponemos el punto y coma de fin de instrucción después de cerrar este último paréntesis, en el caso de que se produzca un error se interrumpirá la ejecución del script y aparecerá en la ventana del navegador el texto incluido en mensaje. Al ejecutar el script anterior se produce un error (la contraseña es incorrecta). Pero si lo ejecutas verás que aparece un mensaje de error generado por PHP. Este tipo de mensajes pueden deshabilitarse haciendo una modificación en php.ini. Pero hay una técnica mucho más fácil. Bastará con insertar delante de la función una arroba (@) para evitar que aparezcan. En el se ha Fichero: conexion3.php incorporado esta técnica. 14 Conexión con el servidor de la Base de datos. Listar Base de datos existentes: Antes de crear y/o borrar una base de datos puede ser conveniente y útil comprobar si ya existe. Todas ellas requieren que se haya establecido una conexión con el servidor. $p=mysql_query(‘SHOW DATABASES’); Consulta para obtener las bases de datos existentes en el servidor. $n=mysql_num_rows($p) Esta función devuelve el número de bases de datos existentes en el servidor. Utiliza como parámetro ($p) el resultado obtenido mediante la función anterior. Ese número puede recogerse en una variable (en este caso $n). mysql_db_name($p, i) Esta nueva función devuelve el nombre de una de las bases de datos, identificada por un número i que debe pertenecer al intervalo [0,$n). Script ejemplo: Fichero: conexion2.php 15 Selección de una base de datos. Dado que podemos manejar bases de datos distintas es preciso decir a MySQL con qué base queremos trabajar. mysql_select_db("n", $c); Devuelve true en caso de éxito y false en caso contrario donde n es el nombre de la base de datos (puede ser una cadena entrecomillada o el nombre de una variable previa). Este valor debe insertarse siempre. La razón es que MySQL permite mantener abiertas, de forma simultánea, varias conexiones (podríamos manejar más de un servidor de bases de datos) y en esas condiciones sería necesaria una conexión distinta para cada servidor. 16 Acceso a bases de datos MySQL Enviar la instrucción SQL a la base de datos: mysql_query() Devuelve un identificador o true (dependiendo de la instrucción) si la instrucción se ejecuta correctamente y false en caso contrario Sintaxis: $consulta = mysql_query (instrucción, $conexion); Ejemplo: $consulta = mysql_query ("select * from noticias", $conexion) or die ("Fallo en la consulta"); 17 Crear una base de datos. La creación de una base de datos también requiere una conexión previa y utiliza la siguiente sintaxis: mysql_query ("CREATE DATABASE nom") donde nom es el nombre de una nueva base de datos. Esta función devuelve TRUE si la base de datos es creada, y FALSE si no es posible hacerlo. Si intentamos crear una base de datos con un nombre ya existente la función nos devolverá FALSE. 18 Ejemplo <?php if($conexion=mysql_connect ("localhost","root","")) { echo "<h2> Conexión establecida con el servidor</h2><br>"; $sql = 'CREATE DATABASE midb'; if (mysql_query($sql, $conexion)) {echo "<h2> Base de datos creada</h2><br>"; } else {echo "<h2> No ha sido posible crear la base de datos</h2><br>";} if(mysql_close($conexion)) {echo "<h2> Conexión cerrada con exito</h2><br>"; echo "El identificador de conexion es:",$conexion;} else {echo "<h2> No se ha cerrado la conexión</h2>";} } else { echo "<h2> NO HA SIDO POSIBLE ESTABLECER LA CONEXIÓN</h2>"; } ?> Fichero: creacionbd1.php 19 Borrar una base de datos. Para borrar una base de datos se requiere el uso de la siguiente función PHP: mysql_query ("DROP DATABASE nom") donde nom es el nombre de la base de datos y debiendo ponerse toda la cadena del paréntesis entre comillas. Esta función devuelve TRUE cuando se ejecuta con éxito, y FALSE en el caso contrario. 20 Ejemplo <?php if($c=mysql_connect ("localhost","root","")) { echo "<h2> Conexión establecida con el servidor</h2><br>"; if(mysql_query ("DROP DATABASE midb",$c)) { echo "<h2> Base de datos borrada</h2><br>"; } else { echo "<h2> No ha sido posible BORRAR la base de datos</h2> <br>"; } if(mysql_close($c)){ echo "<h2> Conexión cerrada con exito</h2><br>";} else{ echo "<h2> No se ha cerrado la conexión</h2>"; } } else { echo "<h2> NO HA SIDO POSIBLE ESTABLECER LA CONEXIÓN</h2>"; } ?> Fichero: borrarbd1.php 21 Acceso a bases de datos MySQL. Ejectuar crearbd.php e importar a la bd creada:noticias.sql Seleccionar una base de datos: mysql_select_db() Devuelve true en caso de éxito y false en caso contrario Sintaxis: mysql_select_db (database); Ejemplo: mysql_select_db ("ejemplos") or die ("No se puede seleccionar la base de datos"); Enviar la instrucción SQL a la base de datos: mysql_query() Devuelve un identificador o true (dependiendo de la instrucción) si la instrucción se ejecuta correctamente y false en caso contrario Sintaxis: $consulta = mysql_query (instrucción, $conexion); Ejemplo: $consulta = mysql_query ("select * from noticias", $conexion) or die ("Fallo en la consulta"); Script para la creación de la base de datos para los ejemplos: Fichero: crearbd.php 22 Acceso a bases de datos MySQL Obtener y procesar los resultados: mysql_num_rows(), mysql_fetch_array() En el caso de que la instrucción enviada produzca unos resultados, mysql_query() devuelve las filas de la tabla afectadas por la instrucción mysql_num_rows() devuelve el número de filas afectadas Para obtener las distintas filas del resultado se utiliza la función mysql_fetch_array(), que obtiene una fila del resultado en un array asociativo cada vez que se invoca Sintaxis: $nfilas = mysql_num_rows ($consulta); $fila = mysql_fetch_array ($consulta); 23 Acceso a bases de datos MySQL Ejemplo noticias 1 Título 1 Texto 1 ofertas 05/02/2012 2 Título 2 Texto 2 promociones 05/02/2012 3 Título 3 Texto 3 promociones 04/02/2012 4 Título 4 Texto 4 costas 01/02/2012 5 Título 5 Texto 5 promociones 31/01/2012 Instrucción: select * from noticias where categoria="promociones" 24 Acceso a bases de datos MySQL Ejemplo: noticias 1 Título 1 Texto 1 ofertas 05/02/2004 2 Título 2 Texto 2 promociones 05/02/2004 3 Título 3 Texto 3 promociones 04/02/2004 4 Título 4 Texto 4 costas 01/02/2004 5 Título 5 Texto 5 promociones 31/01/2004 $consulta $nfilas=3 Instrucción: select * from noticias where categoria="promociones" 25 Acceso a bases de datos MySQL Obtención de las filas: $nfilas = mysql_num_rows ($consulta); if ($nfilas > 0) { for ($i=0; $i<$nfilas; $i++) { $fila = mysql_fetch_array ($consulta); procesar fila i-ésima de los resultados } } Obtener los resultados: mysql_fetch_array() y mysql_fetch_row() Para acceder a un campo determinado de una fila se usa la siguiente sintaxis: $fila["nombre_campo“]// por ser un array asociativo $fila[$i] // $i=índice del campo desde 0 Ejemplo: for ($i=0; $i<$nfilas; $i++) { $fila = mysql_fetch_array ($consulta); print "Título: " . $fila["titulo"]; print "Fecha: " . $fila["fecha"]; } Fichero: select1.php Fichero: select2.php 26 Acceso a bases de datos MySQL Cerrar la conexión con el servidor de bases de datos: mysql_close() Sintaxis: mysql_close ($conexion); Ejemplo mysql_close ($conexion); 27 Crear tablas. Las tablas son elementos de las base de datos. Por esa razón nos resultará imposible crear una tabla sin tener creada y seleccionada una base de datos. Es por eso que para la creación de una tabla se necesitan los siguientes requisitos: Tener abierta una conexión con el servidor MySQL. Tener seleccionada una base de datos. Función para crear una tabla: mysql_query("sent", $c); donde "sent" es la sentencia MySQL y $c es la conexión. 28 Ejemplo <?php $c=mysql_connect ("localhost","root","") or die ("Imposible conectar"); mysql_select_db ("ejemplos", $c); $crear="CREATE TABLE IF NOT EXISTS "; PRIMARY KEY (`num1`), $crear .="ejemplo1 "; UNIQUE KEY …. $crear .="( "; $crear .="num1 TINYINT , "; $crear .="num2 TINYINT (3) UNSIGNED ZEROFILL, "; $crear .="num3 TINYINT (7) UNSIGNED ZEROFILL DEFAULT 13, "; $crear .="num4 REAL (8,3) ZEROFILL DEFAULT 3.14, "; $crear .="fecha DATE, "; $crear .="cadena VARCHAR(32) BINARY, "; $crear .="opcion ENUM('Si','No','Quiza') "; $crear .=")"; if(mysql_query($crear,$c)){ print "Se ha creado la tabla<br>"; }else{ print "Se ha producido un error al crear la tabla"; } ?> Fichero: crear_tabla.php 29 Lectura de resultados de Sentencias SQL. Como hemos visto anteriormente la función utilizada para ejecutar cualquier sentencia SQL es: $r=mysql_query(sent, $c) El resultado recogido en la variable $r, está estructurado en líneas y la función: $t =mysql_fetch_row ($r) $t =mysql_fetch_array ($r) 30 Lectura de resultados de Sentencias SQL. $t =mysql_fetch_row ($r) recoge en una variable ($t) el contenido de la primera línea y coloca su puntero interno al comienzo de la línea siguiente. Por esta razón la lectura completa del contenido de la variable $r requiere llamadas sucesivas a mysql_fetch_row hasta que haya sido leída la última línea. La variable $t tiene estructura de array escalar siendo cero el primero de sus índices. Cuando el puntero interno de mysql_fetch_row() alcance el final de la última línea del resultado devolverá FALSE. 31 Ejemplo <?php function consultartodos() { echo "Todos las columnas de todas las filas de la tabla<br>"; $conexion=mysql_connect ("localhost","root","")or die ("Imposible conectar"); mysql_select_db ("ejemplos", $conexion); $cadena="select * from noticias"; $consulta=mysql_query($cadena,$conexion) or die ("fallo"); #Dos alternativas $fila=mysql_fetch_row($consulta); while ($fila) { foreach($fila as $valor) {echo $valor;} echo "<br>"; $fila=mysql_fetch_row($consulta); } mysql_close ($conexion); } ?> while ($fila=mysql_fetch_row($consulta)) { foreach($fila as $valor) {echo $valor;} echo "<br>"; } 32 Otras funciones Informativas. mysql_num_fields ($res): Está función -en la que $res es el identificador de resultado devuelve el número de campos de la tabla. mysql_num_rows ($res):Devuelve el número de registros que contiene la tabla. Si la tabla no contiene datos devolverá CERO. mysql_field_table($res, 0): Devuelve el nombre de la tabla. Observa que se pasa con índice 0 ya que esta información parece ser la primera que aparece en la tabla. mysql_field_type($rs, $i): Nos devuelve el tipo de campo correspondiente a la posición en la tabla señalada por el índice $i. Dado que la información de primer campo está en el índice 0, el último valor válido de $i será igual al número de campos menos uno. mysql_field_len($res, $i): Nos devuelve la longitud del campo correspondiente a la posición en la tabla señalada por el índice $i. Igual que las anteriores en lo relativo a los índices. mysql_field_name($rs, $i): Nos devuelve el nombre del campo correspondiente a la posición en la tabla señalada por el índice $i. En lo relativo a los índices su comportamiento es idéntico a las anteriores 33 Ejemplo Visualizar la estructura de una tabla. <?php $base="ejemplos"; $tabla="noticias"; $c=mysql_connect ("localhost","root",""); mysql_select_db ($base, $c); $resultado=mysql_query( "SHOW FIELDS from $tabla",$c); $numero=mysql_num_rows($resultado); print "La tabla tiene $numero campos<br>"; while($v=mysql_fetch_row ($resultado)){ foreach($v as $valor) { echo $valor,"<br>"; } Fichero: struct.php } ?> 34 Ejemplo Eliminar una tabla. <?php $base="ejemplos"; $tabla="ejemplo1"; $borrar="DROP TABLE "; $borrar .=$tabla; $conexion=mysql_connect ("localhost","root",""); mysql_select_db ($base, $conexion); if(mysql_query($borrar ,$conexion)) { echo "<h2> Tabla $tabla borrada con EXITO</h2><br>"; } else { echo "<h2> La tabla $tabla NO HA PODIDO BORRARSE</h2><br>"; } mysql_close($conexion); ?> Fichero: borrar_tabla.php 35 Ejemplo Ejemplo de ALTER TABLE. Eliminar una columna de una tabla <?php $base="ejemplos"; $tabla="noticias"; $campo="FECHA"; $borrar="ALTER TABLE "; $borrar.=$tabla; $borrar.=" DROP $campo"; $conexion=mysql_connect ("localhost","root",""); mysql_select_db ($base, $conexion); if(mysql_query ($borrar ,$conexion)) { echo "<h2> A la tabla $tabla se le ha BORRADO el campo $campo</h2><br>";} else { echo "<h2> No ha podido BORRAR</h2><br>"; } mysql_close($conexion); ?> Fichero: alterdrop.php 36 Ejemplo Añadir campos a una tabla. <?php $base="ejemplos"; $tabla="noticias"; $anadir="ALTER TABLE "; $anadir.=$tabla; $anadir.=" ADD nuevocampo TINYINT(12) "; $conexion=mysql_connect ("localhost","root",""); mysql_select_db ($base, $conexion); if(mysql_query ($anadir ,$conexion)) {echo "<h2> A la tabla $tabla se le ha añadido un campo</h2><br>";} else { echo "<h2> No ha podido añadir</h2><br>";} mysql_close($conexion); ?> Fichero: alteradd.php 37 Ejemplo Insertar registros a una base de datos. Para importar tablas Fichero: ejemplos.sql Ejemplo 1 de INSERT Fichero: insert1.php Ejemplo 2 de INSERT Fichero: insert2.php Formulario de entrada Fichero: formulario_insercion.php Script para formulario Fichero: script_insercion.php 38 Ejemplo Actualizar registros de tablas. Formulario Fichero: formularioActualizacion.php Script Fichero: ScriptActualizacion.php Borrar registros de tablas. Formulario Fichero: formularioBorrado.php Script Fichero: ScriptBorrado.php 39