lunes, 11 de junio de 2012

Base de Datos


    La mayoría de los desarrolladores no tienen un diseño de fondo en relación con MySQL, así que cuando crean su base de datos, es ineficiente, con errores y poco fiable.

Bien por la creación de las especificaciones para su base de datos MySQL, su aplicación será eficiente y confiable, ya que responde a las normas de la industria para la creación de una adecuada base de datos.

Usted obtiene los siguientes beneficios al diseñar de forma adecuada una base de datos MySQL:

    * Velocidad - Dado que la base de datos es eficiente y utiliza los datos correctos y tipos de caracteres de longitud, mejorará la velocidad de consulta.

    * Seguridad - La seguridad mejora, ya que permiten a los datos específicos se almacenan en la base de datos MySQL, y nada más.

    * Eficiencia del espacio de almacenamiento - Ya que está desarrollando una base de datos que es puramente basado en especificaciones de los datos, no habrá bytes o caracteres innecesarios almacenados en la base de datos MySQL. Esto ahorra espacio


Los tipos de datos de MySQL más comúnmente utilizados son VARCHAR, DECIMAL, DATE, INT, TEXT y TIMESTAMP.

VARCHAR es de uso común para cadenas de longitud variable de hasta 255 caracteres. Si usted debe almacenar y procesar datos de naturaleza alfanumérica, este tipo de datos es el más adecuado.

Los ejemplos más comunes de datos reales que se ajusten a este tipo incluyen nombres de personas, códigos postales, números de teléfono y cualquier tipo de datos alfanuméricos que no exceda de 255 caracteres de longitud. No utilice el tipo VARCHAR al almacenar números que se utilizarán para cálculo, ya que podría causar algunos problemas relacionados con la computación. En otras palabras, podría afectar la exactitud e integridad de la computación.

DECIMAL es adecuado para almacenar los números que se utilizarán para cálculo. En MySQL, se puede especificar el número de dígitos en números permitidos para ser almacenados (incluyendo el número de decimales). También podemos especificar si se permiten valores negativos.

La asignación de la longitud adecuada del tipo DECIMAL puede ser complicada. Por ejemplo, si usted necesita para almacenar sólo 5 dígitos antes del punto decimal y permitir sólo 3 dígitos después del punto decimal, la longitud adecuada / valores que se configuran en la base de datos es:

Decimal (5 +3, 3) o decimal (8, 3)

Ejemplos de números permitidos: 12345.678, 56872.690, 11.6 y 12.568
Los siguientes números, sin embargo, retornarán error: 128781.1, 8972865.231
El tipo de datos DATE es recomendado para el almacenamiento de fechas. El formato de fecha predeterminado para MySQL es 2009-05-18 [año-mes-día].
El tipo de datos INT se recomienda si va a guardar números que no contengan un punto decimal. INT significa entero. Una vez más, como en DECIMAL, especificar correctamente INT en MySQL puede ser complicado.

Hay varios tipos entero que usted necesita conocer, así como el número máximo de dígitos que pueden tener:

    * TINYINT - Este tipo aceptará hasta 3 dígitos como máximo.
    * SMALLINT - Permite un máximo de 5 dígitos como máximo.
    * Este tipo aceptará un máximo de 8 dígitos como máximo.
    * INT - Este tipo le dejará ir hasta 10 dígitos.
    * BIGINT - Si va a permitir hasta 20 dígitos, este es recomendable.
    TEXT es un tipo de datos muy útil que acepta entradas de texto, una mezcla de cualquier tipo de caracteres que conforman el contenido de los formularios web. VARCHAR sólo puede aceptar hasta 255 caracteres, pero TEXT puede ser usado para almacenar datos que supere esa cantidad.

Cuando el tipo de datos TIMESTAMP es seleccionado, mediante la verificación de "CURRENT_TIMESTAMP" como por defecto, MySQL regresa automáticamente la fecha y hora para cada inserción de datos.

Explicamos los pasos a seguir para crear la base de datos en MySQL

    Antes de abordar los scripts de nuestro sitio, es importante crear la base de datos (BD) que va a ser utilizada por los mismos. Hemos elegido una base de datos MySQL, entre otras razones, porque se trata del tipo de base más corrientemente utilizado en combinación con PHP. Por supuesto, podríamos haber utilizado cualquier otra base para la cual PHP tenga funciones o simplemente crear un DSN y emplear las funciones para ODBC disponibles en PHP.

Pensamos que el hecho de programar en este lenguaje lleva inherente la necesidad de conocer mínimamente el funcionamiento de MySQL y que la utilización de cualquier otra BD o método de conexión no conlleva cambios significativos en los scripts que abordaremos. Veremos pues el caso particular de MySQL y dejamos a vuestra cuenta aplicar lo visto para cualquier otra base.

En capítulos de otros manuales hemos explicado la instalación y utilización de MySQL y la sintaxis para la creación de tablas. En este capítulo nos limitaremos a describir paso a paso la creación de la base postal sin hacer hincapié en el significado de los comandos utilizados.
Pasemos pues a describir uno a uno los pasos a seguir:

    1.-Creación de la base de datos

Una vez dentro de MySQL, el primer paso es crear la base de datos:

Create database postal;

    2.-Creación de las tablas

Para la creación de la tabla imagenes, donde almacenaremos los gráficos de las postales, generaremos dos campos: id_imagen, que es el identificador del grafico, específico para cada uno y cuyo valor corresponde también con el nombre del archivo gif. El otro campo, tipo, define el objeto de la postal (cumpleaños, Navidades o San Valentín).
La forma más simple de crear esta tabla sería:

Create Table imagenes
(
id_imagen int(2),
tipo varchar(15)
);

La siguiente tabla a crear, postal, debe guardar toda una serie de datos necesarios para hacer llegar la postal al destinatario y hacer que el remitente reciba la confirmación de recepción. Veremos cómo actúa cada uno de esos datos en el script más adelante. Por ahora nos limitaremos a describir la sintaxis de la creación:

Create Table postal
(
id_postal int(5),
texto varchar(255),
email_destinatario varchar(50),
nombre_destinatario varchar(50),
email_remitente varchar(50),
nombre_remitente varchar(50),
id_imagen int(2),
avisar char(7)
);

Para una aplicación más compleja deberíamos definir además las claves y considerar más detenidamente el tipo de campo a definir. Aconsejamos leer los capítulos del tutorial de SQL donde podréis consejos para mejorar las prestaciones de las tablas.

    3.-Relleno de la tabla imagenes con los gráficos de muestra

Para rellenar rápidamente la tabla en un primer momento, sin necesidad de recurrir a sentencias SQL tipo Insert, podemos crear un archivo de texto con los registros separados por líneas y los valores de campo, puestos en el buen orden, separados por tabuladores. En el pack de descarga encontraréis el archivo texto imagenes ya preparado. Lo único que tenéis que hacer es colocar el archivo en el directorio bin de MySQL y ejecutar la siguiente orden en la base de datos:

Load data local infile "imagenes.txt" into table imagenes;
Con esto tendremos llena la tabla imagenes. Para comprobarlo teclead:
select * from imagenes;
Veréis como aparece en pantalla el contenido de la tabla que obviamente corresponde al del archivo texto.

Trabajar con bases de datos en PHP

    Una de las principales ventajas que presenta el trabajar con páginas dinámicas del lado del servidor es el poder trabajar con contenidos que están alojados en bases de datos. De esta forma, podemos organizarlos, actualizarlos y buscarlos de una manera mucho más simple.

El lenguaje PHP, ya hemos dicho, ofrece interfaces para el acceso a la mayoría de las bases de datos existentes. Podrás encontrar bases de datos de código abierto, como MySQL, comerciales propietarias como Oracle y además tiene librerías para acceso a datos por ODBC, lo que nos permite comunicar con todas las bases de datos posibles en sistemas Microsoft, como Access o SQL Server. Gracias a los juegos de funciones existentes para cada sistema gestor de base de datos, podremos realizar cualquier acción con los datos que necesitemos para el desarrollo de la más variada gama de aplicación web.

Esta interacción se realiza, por un lado, a partir de las funciones que PHP nos propone para cada tipo de base de datos y, por otro estableciendo un diálogo a partir de un idioma universal: SQL (Structured Query Language) el cual es común a todas las bases de datos.

Como base ejemplo de estos capítulos hemos elegido MySQL, sin duda la base de datos más extendida en combinación con PHP. Su gratuidad, eficiencia y simplicidad la han hecho una buena candidata. No obstante, en caso de utilizar cualquier otra base compatible con PHP, las correcciones a llevar a cabo con respecto a nuestros ejemplos no son excesivamente grandes y la lectura de esos capítulos seguirá siendo de gran utilidad.

Configurar la base de datos que vamos a utilizar para los ejemplos de este manual

    Una vez instalado MySQL y antes de poder comenzar con nuestros ejemplos, será necesario llevar a cabo las siguientes operaciones:

-Introducidos dentro de MySQL, crearemos la base de datos ejemplo con la siguiente sentencia:

create database ejemplo;
-Seleccionaremos la base ejemplo como la base a utilizar:
use ejemplo

-Crearemos a continuación la tabla clientes a partir de la siguiente sentencia:
create table clientes (
nombre varchar(100),
telefono varchar(100)
);

Ahora ya disponemos de nuestra tabla vacía. Sólo queda comenzar a llenarla con los datos que iremos insertando.

El conjunto de scripts utilizados para el bloque de bases de datos puede ser descargado aquí.
Guión de artículos relativos a las bases de datos en PHP

A lo largo del manual ofreceremos varios artículos, en los que trataremos cada uno de los accesos a la base de datos más típicos, como selecciones, actualizaciones o inserciones, siguiendo el siguiente guión:

Inserción de registros
Selección de registros
Actualización de registros
Borrado de registros

Introducción de nuevos registros con PHP

    Una vez creada la tabla clientes en nuestra base de datos ejemplo, el paso siguiente sea llenarla con registros. Para ello vamos a ver este artículo, en el que se reciben datos desde un formulario y luego se insertan con PHP en la base de datos, en la tabla adecuada.

Los datos del registro pueden ser recogidos, por ejemplo, a partir de un formulario. Aquí os proponemos un simple documento HTML que recoge los datos y los envía a una página PHP que se encarga de procesarlos:

<HTML>
<HEAD>
<TITLE>Insertar.html</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Insertar un registro</h1>
<br>
<FORM METHOD="POST" ACTION="insertar.php">
Nombre<br>
<INPUT TYPE="TEXT" NAME="nombre"><br>
Teléfono<br>
<INPUT TYPE="TEXT" NAME="telefono"><br>
<INPUT TYPE="SUBMIT" value="Insertar">
</FORM>
</div>
</BODY>
</HTML>

Llegados a la página destino del formulario (insertar.php), lo primero que habrá que hacer es establecer un vínculo entre el programa y la base de datos. Esta conexión se lleva a cabo con la función mysql_connect. A continuación, deberemos generar una orden de inserción del registro en lenguaje SQL. Esta orden será ejecutada por medio de la función mysql_db_query. 

En esta función especificaremos primeramente la base de datos sobre la que queremos actuar y a continuación introduciremos la sentencia SQL:

<HTML>
<HEAD>
<TITLE>Insertar.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");

//Ejecucion de la sentencia SQL
mysql_query("insert into clientes (nombre,telefono) values ('$nombre','$telefono')");
?>
<h1><div align="center">Registro Insertado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>
</BODY>
</HTML>

Ejecutar ejemplo

    Los parámetros user y password son definidos por el creador de la base. Es conveniente en un principio, al crear nuestras bases, trabajar sin ellos con lo cual dejaremos las cadenas correspondientes vacías: "".

Selección y lectura de registros con PHP

    Dentro de una base de datos, organizada por tablas, la selección de una tabla entera o de un cierto número de registros resulta una operación rutinaria.

Aquí os mostramos una forma bastante clásica de mostrar en pantalla a partir de un bucle los registros seleccionados por una sentencia SQL:

<HTML>
<HEAD>
<TITLE>lectura.php</TITLE>
</HEAD>
<BODY>
<h1><div align="center">Lectura de la tabla</div></h1>
<br>
<br>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");

//Ejecutamos la sentencia SQL
$result=mysql_query("select * from clientes");
?>
<table align="center">
<tr>
<th>Nombre</th>
<th>Teléfono</th>
</tr>
<?
//Mostramos los registros
while ($row=mysql_fetch_array($result))
{
echo '<tr><td>'.$row["nombre"].'</td>';
echo '<td>'.$row["telefono"].'</td></tr>';
}
mysql_free_result($result)
?>
</table>

<div align="center">
<a href="insertar.html">Añadir un nuevo registro</a><br>
<a href="actualizar1.php">Actualizar un registro existente</a><br>
<a href="borrar1.php">Borrar un registro</a><br>
</div>

</BODY>
</HTML>

Ejecutar script

    Los pasos a realizar son, en un principio, los vistos para la inserción de un registro: Conexión a la base y ejecución de la sentencia. Esta vez, la información de dicha ejecución será almacenada en una variable ($result).

El siguiente paso será plasmar en pantalla la información recogida en $result. Esto lo haremos mediante la función mysql_fetch_array que devuelve una variable array con los contenidos de un registro a la vez que se posiciona sobre el siguiente. El bucle while nos permite leer e imprimir secuencialmente cada uno de los registros.

La función mysql_free_result se encarga de liberar la memoria utilizada para llevar a cabo la consulta. Aunque no es necesaria su utilización, resulta altamente aconsejable.

Actualización de un registro de la base de datos con PHP

    Para mostrar cómo se actualiza un registro presente en nuestra base de datos, vamos a hacerlo a partir de un caso un poco más complejo para que empecemos a familiarizarnos con estas operaciones. Realizaremos un par de scripts que permitan cambiar el número de teléfono de las distintas personas presentes en nuestra base. El nombre de estas personas, así como el nuevo numero de teléfono, serán recogidos por medio de un formulario.

El archivo del formulario va a ser esta vez un script PHP en el que efectuaremos una llamada a nuestra base de datos para construir un menú desplegable donde aparezcan todos los nombres. La cosa quedaría así:

<HTML>
<HEAD>
<TITLE>Actualizar1.php</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Actualizar un registro</h1>
<br>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");

echo '<FORM METHOD="POST" ACTION="actualizar2.php">Nombre<br>';

//Creamos la sentencia SQL y la ejecutamos
$sSQL="Select nombre From clientes Order By nombre";
$result=mysql_query($sSQL);

echo '<select name="nombre">';

//Generamos el menu desplegable
while ($row=mysql_fetch_array($result))
{echo '<option>'.$row["nombre"];}
?>
</select>
<br>
Teléfono<br>
<INPUT TYPE="TEXT" NAME="telefono"><br>
<INPUT TYPE="SUBMIT" value="Actualizar">
</FORM>
</div>

</BODY>
</HTML>

La manera de operar para construir el menú desplegable es la misma que para visualizar la tabla. De nuevo empleamos un bucle while en combinación con la función mysql_fetch_array lo que nos permite mostrar cada una de las opciones.

El script de actualización será muy parecido al de inserción:

<HTML>
<HEAD>
<TITLE>Actualizar2.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");
//Creamos la sentencia SQL y la ejecutamos
$sSQL="Update Clientes Set telefono='$telefono' Where nombre='$nombre'";
mysql_query($sSQL);
?>

<h1><div align="center">Registro Actualizado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>

</BODY>
</HTML>

Borrado de un registro con PHP

    Otra de las operaciones elementales que se pueden realizar sobre una base de datos es borrar un registro. Para hacerlo, SQL nos propone sentencias del tipo Delete. Veámoslo con un ejemplo aplicado a nuestra agenda.

Cabe señalar que primero debemos seleccionar el registro que se desea borrar y luego realizar el borrado propiamente dicho. Para ello crearemos un menú desplegable dinámico, donde se podrá seleccionar el elemento que se desea borrar. Luego se pasará a una página PHP una referencia al elemento seleccionado, para borrarlo de la base de datos.

<HTML>
<HEAD>
<TITLE>Borrar1.php</TITLE>
</HEAD>
<BODY>
<div align="center">
<h1>Borrar un registro</h1>
<br>

<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");

echo '<FORM METHOD="POST" ACTION="borrar2.php">Nombre<br>';

//Creamos la sentencia SQL y la ejecutamos
$sSQL="Select nombre From clientes Order By nombre";
$result=mysql_query($sSQL);

echo '<select name="nombre">';

//Mostramos los registros en forma de menú desplegable
while ($row=mysql_fetch_array($result))
{echo '<option>'.$row["nombre"];}
mysql_free_result($result)
?>

</select>
<br>
<INPUT TYPE="SUBMIT" value="Borrar">
</FORM>
</div>

</BODY>
</HTML>

El siguiente paso es hacer efectiva la operación a partir de la ejecución de la sentencia SQL que construimos a partir de los datos del formulario:

<HTML>
<HEAD>
<TITLE>Borrar2.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","tu_user","tu_password");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("mi_base_datos");

//Creamos la sentencia SQL y la ejecutamos
$sSQL="Delete From Clientes Where nombre='$nombre'";
mysql_query($sSQL);
?>

<h1><div align="center">Registro Borrado</div></h1>
<div align="center"><a href="lectura.php">Visualizar el contenido de la base</a></div>

</BODY>
</HTML>

No hay comentarios:

Publicar un comentario