10. Acceso a bases de datos desde PHP
PHP
10. Acceso a bases de datos desde PHP
10.1. Creación de una base de datos con PhpMyAdmin
Para poder acceder a una base de datos desde PHP usando SQL necesitamos antes tener una base de datos.
Para crearla, emplearemos PhpMyAdmin, una herramienta de administración para PHP y MySQL que se incluye como parte de la mayoría de paquetes "WAMP", como Uniform Server, XAMPP o EasyPHP.
Vamos a planificar antes de comenzar:
- Crearemos una base de datos que se llamará "prueba".
- Esta base de datos contendrá un único bloque de información, una tabla llamada "amigos".
- Para cada uno de esos amigos, guardaremos 4 datos (campos): nombre (que será texto de hasta 40 letras), email (texto hasta 50 letras), telefono (texto hasta 20 letras), fechanac (fecha de nacimiento, tipo de datos "fecha").
Los pasos que debemos seguir son:
1.- Lanzar nuestro servidor web.
2.- Abrir PhpMyAdmin. En ocasiones tendremos que teclear la ruta "http://localhost/phpmyadmin" o alguna similar en nuestro navegador; en el caso de The Uniform Server, el panel de control nos muestra un botón llamado "phpMyAdmin", que nos permite abrirlo de forma sencilla:
3.- Debería aparecer la ventana principal de PhpMyAdmin:
4.- En la pestaña "Databases", tendremos la opción para crear una nueva base de datos (Create database). En el recuadro introduciremos la palabra "prueba" como nombre para la base de datos y en el desplegable "Collation", escogeremos "utf8_spanish_ci" como juego de caracteres. Terminaremos pulsando el botón "Create".
5.- Al hacer clic en "prueba" nos aparecerá el contenido de la base de datos, que todavía está vacía y un apartado "Create table" ("crear tabla") que espera que le digamos un nombre (name) y una cantidad de campos (number of columns). Como nombre, introduciremos la palabra "amigos", y como número de campos indicamos "4". Hacemos clic en el botón "Go" ("adelante"), para crear la tabla.
6.- Aparece la lista de introducción de datos para los campos:
7.- Introducimos los valores que habíamos diseñado, utilizando el tipo de datos "VARCHAR" para los campos que van a guardar texto, indicando su longitud máxima, y empleando el tipo "DATE" para la fecha. Finalmente pulsamos el botón "Save" (grabar):
(Hay cosas que se podrían mejorar; por ejemplo, no hemos definido ninguna "clave", por lo que podríamos tener datos duplicados, y hemos dejado marcada la casilla "not null", por lo que necesariamente deberemos indicar una valor para cada uno de los campos, pero no se trata aquí de aprender a diseñar bases de datos, sino de jugar con PHP)
8.- Ya que estamos, podemos incluir un par de fichas (registros) desde PhpMyAdmin, para tener datos con los que jugar después desde nuestros mini-programas en PHP. Hacemos clic en la pestaña superior "Insert" (insertar):
(Como se ve en el ejemplo, las fechas se deben introducir en formato AAAA-MM-DD).
El resultado de esta operación, nos dará una pista de qué deberemos hacer más adelante para introducir datos desde PHP:
9.- Podemos comprobar que se han guardado los datos correctamente si usamos la pestaña "Browse" (echar un vistazo). El resultado nos debería confirmar que hemos introducido correctamente los datos. Se nos propone la consulta "SELECT * FROM `amigos` LIMIT 0,300", que es la que nos interesa para ver todos los datos que contiene nuestra tabla de amigos (nuevamente, consultas parecidas a esa serán las que usaremos desde PHP):
10.- Finalmente, queda una cosa por hacer para poder acceder a nuestros datos desde PHP. Debemos crear un usuario, que tenga permiso para acceder a esta base de datos.
Para ello, volvemos a la base de datos, haciendo clic en la palabra "Prueba", y después pulsamos en la pestaña "Privileges" (privilegios):
A continuación, hacemos clic en "Add user" (agregar usuario):
Emplearé como nombre "usuario", y "1234" como contraseña (obviamente, en un proyecto real no deberían ser nombres y contraseñas tan triviales). Se pueden restringir los permisos para que sólo pueda realizar ciertas operaciones, pero no es nuestro caso. Como queremos poder practicar las operaciones más habituales desde PHP, dejaremos marcada la opción "Grant all privileges on database 'prueba'" (conceder todos los permisos en la base de datos "prueba"):
Listo. Aparentemente, ya podemos empezar a manipular datos desde PHP...
Ejercicio propuesto 10.1.1: Crea una base de datos, llamada "biblioteca", que permita guardar datos de libros. Inicialmente tendrá una única tabla, llamada "libros", con los campos Autor, Titulo, Codigo, Descripcion.El campo Codigo actuará como clave primaria, que permita distinguir unos libros de otros de forma inequívoca.
10.2. Consulta de bases de datos desde PHP
Para consultar desde PHP la información existente en una base de datos, los pasos serán básicamente los siguientes:
- Abrir la conexión con el servidor de bases de datos (como estamos en nuestro propio ordenador, será "localhost"), autentificándonos con nuestro nombre de usuario ("usuario") y nuestra contraseña ("1234"). Usaremos la orden "mysql_connect".
- Escoger la base de datos que nos interese (en nuestro caso, "prueba"), con la orden "mysql_select_db".
- Realizar la consulta en SQL que queramos, con "mysql_query". En nuestro ejemplo, querremos todos los datos de la tabla "amigos", para lo que serviría hacer "SELECT * FROM amigos". (Cuidado: en la órdenes de SQL, como SELECT, no se suele distinguir entre mayúsculas y minúsculas, pero en los nombres de las tablas es posible que sí).
- Para obtener cada uno de los registros, utilizaremos "mysql_fetch_array", que devolverá "falso" cuando no haya más datos, por lo que es frecuente recorrer los registros usando un "while". Para acceder a cada uno de los campos, se usa una sintaxis que recuerda mucho a la de un "array": $dato["nombre"].
- Finalmente, cerraremos la conexión con la base de datos.
Vamos a ver un ejemplo que recopile todo esto (leer_bd.php):
<html>
<body>
<p>Datos extraidos sobre amigos: </p>
<table>
<tr>
<td>Nombre</td>
<td>E-mail</td>
<td>Teléfono</td>
<td>Fecha Nac.</td>
</tr>
<?php
if (!($enlace=mysql_connect("localhost","usuario","1234"))) {
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("prueba",$enlace)) {
echo "Error seleccionando la base de datos.";
exit();
}
$resultado=mysql_query("SELECT \* FROM amigos",$enlace);
while($dato = mysql_fetch_array($resultado)) {
echo "<tr><td>" . $dato["nombre"] . "</td>" .
"<td>" . $dato["email"] . "</td>" .
"<td>" . $dato["telefono"] . "</td>" .
"<td>" . $dato["fechanac"] . "</td>" .
"</tr>";
}
mysql_free_result($resultado);
mysql_close($enlace);
?>
</table>
</body>
</html>
El resultado debería ser el siguiente (los datos que habíamos introducido):
Datos extraidos sobre amigos:
Nombre
E-mail
Teléfono
Fecha Nac.
Juan
1111@aprendeaprogramar.com
1111-111-111
2013-11-18
Antonio
2222@aprendeaprogramar.com
2222-222-222
2013-11-19
Ejercicio propuesto 10.2.1: Crea una página que muestre toda la información contenida en la "biblioteca".
10.3. Inserción de datos en la base de datos
Para introducir datos, normalmente usaremos dos "páginas":
- Una será el formulario con las casillas de introducción, el botón, etc.
- La segunda recibirá los datos del formulario y los insertará en la base de datos (normalmente, antes deberemos asegurarnos de que los datos tienen valores "razonables").
En un proyecto real, en ocasiones será la misma página la que reciba los datos, como ya habíamos comentado, pero de momento vamos a separar la lógica, para simplificar el desarrollo.
La apariencia de la página que pide datos al usuario podría ser:
<html>
<body>
<h1>Introducción de datos</h1>
<form action="almacenar.php" method="post">
Nombre: <input name="nombre" type="text"> <br> <br>
Correo electrónico: <input name="email" type="text"> <br> <br>
Teléfono: <input name="telefono" type="text"> <br> <br>
Fecha nac.: <input name="fechanac" type="text"> <br> <br>
<input name="guardar" value="Guardar" type="submit"><br>
</body>
</html>
Y la página encargada de guardar estos datos en la base de datos sería muy similar a la que habíamos utilizado para mostrar información extraída de la base de datos, apenas con dos diferencias importantes:
La orden de SQL que habíamos usado para leer era "SELECT FROM"; para introducir datos usaremos "INSERT INTO" (si son datos nuevos) o bien "REPLACE INTO" (si se debe sobrescribir algún dato que pudiera existir previamente y en el que se haya modificado sólo algún campo).
No necesitaremos usar "mysql_fetch_array" para recibir información, ni ningún "while" para que esta recepción de información sea repetitiva.
Podría ser algo así (insisto: en un caso real también se debería comprobar que el usuario realmente ha introducido datos, y que esos datos tienen sentido):
<html>
<body>
<?php
$n = $_POST["nombre"];
$e = $_POST["email"];
$t = $_POST["telefono"];
$f = $_POST["fechanac"];
if (!($enlace=mysql_connect("localhost","usuario","1234"))) {
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("prueba",$enlace)) {
echo "Error seleccionando la base de datos.";
exit();
}
mysql_query("REPLACE INTO amigos (nombre, email, telefono, fechanac) VALUES (".
"'$n','$e','$t','$f')", $enlace);
mysql_close($enlace);
?>
<p>Datos introducidos: </p>
Nombre: <?=$n?><br>
E-mail: <?=$e?><br>
Teléfono: <?=$t?><br>
Fecha Nac.: <?=$f?><br>
</body>
</html>
Una vez introducidos los datos, podríamos volver a mostrarlos de la forma vista en el apartado anterior. La nueva ficha debería aparecer junto a las demás.
Podemos comprobar si los datos se han guardado con "mysql_affected_rows();":
$cantidadDeDatos = mysql_affected_rows();
Si $cantidadDeDatos vale 0, es que no se ha llegado a guardar ningún dato (típicamente, porque no esté funcionando la conexión a la base de datos o porque ese código ya estuviera utilizado).
Ejercicio propuesto 10.3.1: Crea un formulario que permita introducir un nuevo libro en la "biblioteca".
Ejercicio propuesto 10.3.2: Mejora el apartado 10.3.1, para que se vuelva a mostrar el formulario tras introducir un dato. Antes del formulario, debe aparecer el texto "Cambios guardados correctamente" en color verde, o el texto "No se ha podido guardar", en color rojo, según corresponda.
Ejercicio propuesto 10.3.3: Crea un formulario que permita modificar un libro de la "biblioteca": el usuario deberá introducir su nombre exacto. Entonces se mostrará un nuevo formulario, similar al de "añadir", que contendrá los datos anteriores de ese libro dentro de las casillas de texto (deberás escribir esos datos en el "value" de cada "input"). El usuario podrá modificar los datos que desee, y los cambios se guardarán (en la misma ficha) cuando se pulse el correspondiente botón.