logo El diario de Pepe Molina (Caricatos)

yo

Para nuestra gestión plantearemos como navegar y modificar algunos datos con muy pocas líneas de código.


Última caricatura

IV Asamblea de la AEC: IV Asamblea General de la Asociación Española de Caricaturistas

IV Asamblea de la AEC

RSS de las imágenes: rss


La Cita

En la práctica, sólo es problema lo que la inteligencia puede resolver

Hermann Keyserling, filósofo alemán (1880-1946).


En esta zona están las páginas personales del autor.


Mis clientes ahora también son mis amigos (aunque les cobre).


En Mis amigos Informáticos hay una pequeña colección de páginas de colegas webmasters..


En Mis amigos artistas podemos encontrar artistas de cualquier índole (dibujantes, pintores, escritores...)


Las recomendaciones que proponemos son de índole variada.


Aquí un cajón de sastre de enlaces.


Nos referencian desde sitios de toda índole.


Puede contribuir a mantener esta página con su donativo.


botón pay-pal

Sencilla gestión de una base de datos: estructuras

emoticón de Caricatos Publicado el día 26 de enero de 2012
id=68; categorías: Vicisitudes de un Webmaster, Programación

mysql MySQL es el sistema de gestión de bases de datos más popular de Internet, y en este apunte trataremos su gestión desde páginas web. Para nuestra gestión plantearemos como navegar y modificar algunos datos con muy pocas líneas de código.

Siempre será necesario datos básicos para realizar la conexión y el acceso, cosa en la que no nos detendremos considerando que se dispone de esos datos. Para empezar solo necesitaremos de nuestro lenguaje del servidor (PHP) y usar la instrucción "mysql_connect()" con nuestros datos "privados" de conexión.

Empezaremos con un pequeño listado que nos permitirá ver los nombres de cada base de datos de nuestro sistema, de forma que podamos enlazar a un listado de sus tablas. Supondremos que el fichero será "ver_bases_de_datos.php"; luego los enlaces serán del tipo "ver_tablas?bd=[aquí el nombre de la base de datos].

$sql = "show databases";
$res = mysql_query($sql);
if ($res)	{
	if (mysql_num_rows($res) > 0)    {
		$datos = array();
		while	($dato = mysql_fetch_array($res))
			array_push($datos, "<li><a href='ver_tablas.php?bd=".$dato[0]."' >".$dato[0]."</a></li>");
		$body = "<ul>\n".implode("\n", $datos)."\n</ul>";
	}
	else
		$body = "No se encontraron bases de datos.";
}
else
	$body = "Se ha producido el error ".mysql_errno($res)." [".mysql_error($res)."].";

Como puede notarse tan solo estamos definiendo el cuerpo de la página web, que supuestamente tendrá otros elementos como títulos, comentarios, estilos, etc.

A continuación añadiremos un botón que nos permita crear una nueva base de datos:

ob_start();
echo <<< nueva
<form action="crear_bd.php" method="get">
<label for="bd" >Base de datos: </label>
<input id="bd" type="text" name="bd" />
<button type="submit"> Crear </button>
</form>

nueva;
$body .= ob_get_clean();

Ahora ponemos el código necesario para crear esa nueva base de datos en nuestro sistema, que como se puede ver se trata de el fichero "crear_bd.php":

$bd = $_GET["bd"];
if ($bd != "") {
	$sql = "create database $bd";
	$res = @mysql_query($sql);
}
header("Location: ver_bases_de_datos.php");

Propondremos también un fichero que borre las bases de datos del sistema, pero debe usarse con Mucha Precaución.

Junto al enlace que nos mostrará las distintas tablas pondremos otro que enlace al fichero borrar_bd.php, que recibirá en el parámetro "bd" el nombre de esa base de datos, y al igual que en la creación vuelva al listado de bases de datos de nuestro sistema. Tan solo se debe cambiar en el listado anterior la palabra "create" por "drop".

Gestión de las tablas

El listado de las tablas es tan sencillo como el de las bases de datos, pero hay que indicar el nombre de la misma con la cláusula from: "show tables from base_de_datos".

$from = (isset($_GET["bd"])) ? " from ".$_GET["bd"]:"";
$bd = $_GET["bd";
$sql = "show tables$from";
$res = mysql_query($sql);
if ($res)	{
	if (mysql_num_rows($res) > 0)    {
		$datos = array();
		while	($dato = mysql_fetch_array($res))	{
			array_push($datos, "<li><a href='ver_columnas.php?bd=$bd&tabla=".$dato[0]."'>".$dato[0]."</a> <a href='borrar_tabla?bd=$bd&tabla=".$dato[0]."'>borrar</a></li>");
		}
		$body = "<ul>\n".implode("\n", $datos)."\n</ul>";
	}
	else $body = "No existe tablas en la base de datos {$_GET[bd]}...";
}
else $body = "ha ocurrido un error nº ".mysql_errno($res)." en la consulta $sql ".mysql_error($res);

ob_start();
echo <<< nueva
<form action="crear_tabla.php" method="get">
	<input type="hidden" name="bd" value="$bd" />
	<label for="tabla" >Tabla: </label>
	<input id="tabla" type="text" name="tabla" />
	<button type="submit"> Crear </button>
</form>

nueva;
$body .= ob_get_clean();

Hemos añadido un botón para crear una nueva tabla al igual que habíamos hecho con las bases de datos, pero en su implementación hay una pequeña diferencia, ya que al crear una tabla al menos hay que crear un campo sin importar el nombre, tipo u otras características.

Como más adelante propondremos añadir y borrar campos en las tablas, nuestro código añadirá un campo que denominaremos id (identificador): entero que será clave primaria.

$bd = $_GET["bd"];
$tabla = $_GET["tabla"];
if ($tabla != "") {
	$t = (isset($bd)) ? "$bd.$tabla": $tabla;
	$sql = "create table if not exists $t (id int(11) key auto_increment)";
	$res = @mysql_query($sql);
}
header("Location: ver_tablas.php?bd=$bd");

Vemos que después de insertar la nueva tabla, vuelve a redireccionarse a la página que muestra las tablas de la base de datos que estamos tratando. Volviendo al listado, evidentemente también podríamos borrar tablas, exactamente igual que lo hemos hecho con las bases de datos, con la misma instrucción drop.

Nos toca conocer la estructura de la tabla y para ello disponemos de un par de sentencias sql que hacen lo mismo (se podría decir que son alias); se trata de "show columns" y "describe". A continuación, nuestro código:

$bd = $_GET["bd"];
$tabla = $_GET["tabla"];
$describe = (isset($_GET["bd"])) ? "$_GET[bd].$_GET[tabla]":$_GET["tabla"];
$sql = "describe $describe";
$res = mysql_query($sql);
if ($res)	{
	if (mysql_num_rows($res) > 0)    {
		$c = mysql_num_fields($res);
		$titulos = array();
		$ths = array();
		for ($i = 0; $i < $c; $i++)	{
			$titu = mysql_field_name($res, $i);
			array_push($titulos, $titu);
			array_push($ths, "<th>$titu</th>");
		}
		array_push($ths, "<th>opciones</th>");
		$datos = array();
		while	($dato = mysql_fetch_array($res))	{
			$datito = array();
			for ($i = 0, $total = count($titulos); $i < $total; $i++)
				array_push($datito, "<td>".$dato[$titulos[$i]]."</td>");
			array_push($datito,
				"<td><a href='borrar_columna.php?bd=$_GET[bd]&tabla=$_GET[tabla]&columna=$dato[Field]' >borrar</a>
				| <a href='editar_columna.php?bd=$_GET[bd]&tabla=$_GET[tabla]&columna=$dato[Field]' >editar</a></td>");
			array_push($datos, "<tr>".implode("\n", $datito)."</tr>\n");
		}
		$body = "<table border='1'>\n<caption>Base de datos: $_GET[bd]; Tabla: $_GET[tabla]</caption>\n<tbody>\n<tr>".implode("\n", $ths)."</tr>\n".implode("\n", $datos)."\n</tbody>\n</table>\n";

En el mismo listado hemos añadido una columna "opciones" en la cabecera del listado, y en cada campo un par de enlaces:

borrar => "borrar_columna.php?bd=$bd&tabla=$tabla&columna=$columna
Con una simple instrucción "alter table $bd.$tabla drop column $columna"
editar => "editar_columna.php?bd=$bd&tabla=$tabla&columna=$columna
Con un código más complejo que veremos más adelante.

En la misma página añadiremos un formulario para insertar nuevos campos en la tabla. El código será sensiblemente más extenso debido a la gran cantidad de opciones posibles como tipo de campo:

ob_start();
echo <<< form
<form action="sumar_columna.php" style="margin: auto; width: 60%;">
<label>Base de datos: <input type="text" name="bd" value="$bd" /></label><br/>
<label>Tabla: <input type="text" name="tabla" value="$tabla" /></label><br/>
<label>Campo (Field): <input type="text" name="campo" value="" /></label><br/>
<label>Tipo: <select name="tipo">
	<option value="INT">INT</option>
	<option value="VARCHAR">VARCHAR</option>
	<option value="TEXT">TEXT</option>
	<option value="DATE">DATE</option>
	<option value="TINYINT">TINYINT</option>
	<option value="SMALLINT">SMALLINT</option>
	<option value="MEDIUMINT">MEDIUMINT</option>
	<option value="BIGINT">BIGINT</option>
	<option value="DECIMAL">DECIMAL</option>
	<option value="FLOAT">FLOAT</option>
	<option value="DOUBLE">DOUBLE</option>
	<option value="REAL">REAL</option>
	<option value="BIT">BIT</option>
	<option value="BOOLEAN">BOOLEAN</option>
	<option value="SERIAL">SERIAL</option>
	<option value="DATETIME">DATETIME</option>
	<option value="TIMESTAMP">TIMESTAMP</option>
	<option value="TIME">TIME</option>
	<option value="YEAR">YEAR</option>
	<option value="CHAR">CHAR</option>
	<option value="TINYTEXT">TINYTEXT</option>
	<option value="MEDIUMTEXT">MEDIUMTEXT</option>
	<option value="LONGTEXT">LONGTEXT</option>
	<option value="BINARY">BINARY</option>
	<option value="VARBINARY">VARBINARY</option>
	<option value="TINYBLOB">TINYBLOB</option>
	<option value="MEDIUMBLOB">MEDIUMBLOB</option>
	<option value="BLOB">BLOB</option>
	<option value="LONGBLOB">LONGBLOB</option>
</select>
</label><br/>
<label>Longitud/Valores: <input type="text" name="long" value="" /></label><br/>
<label>Predeterminado: <input type="text" name="pred" value="" /></label><br/>
<label>Nulo: <input type="checkbox" name="null" /></label><br/>
Clave:
	<label>(no <input type="radio" name="key" value="no" checked="checked" />)</label>
	<label>(si <input type="radio" name="key" value="si" />)</label>
	<label>(auto_increment <input type="radio" name="key" value="auto_increment" />)</label>
<br/>
<button type="submit" > Añadir campo </button>
</form>

form;
$body .= ob_get_clean();

	}
	else $body = "No existe '$describe'";
}
else $body = "No existe '$describe'";
ob_start();
echo <<< estilos
table {
margin: auto;
}
th {
padding: 0 2em;
}
estilos;
$css .= ob_get_clean();

Insertar nuevos campos evidentemente implica mayor complejidad en el código ya que hay muchas posibilidades, pero no es nuestra intención realizar códigos complejos sino simples, así que lo limitaremos considerablemente:

$bd = $_GET["bd"];
$tabla = $_GET["tabla"];
$campo = $_GET["campo"];
$long = ($_GET["long"] == "") ? "":"($_GET[long])";
$tipo = $_GET["tipo"].$l;
$nulo = (isset($_GET["null"])) ? " NULL":" NOT NULL";
$pred = ($_GET["pred"] == "") ? "":" default '$_GET[pred]'";

if ($_GET["key"] == "auto_increment") $clave = " auto_increment, add primary key ($campo)";
elseif ($_GET["key"] == "si") $clave = ", add primary key ($campo)";
else $clave = "";

$sql = "alter table $bd.$tabla add column $campo $tipo$nulo$pred$clave";
$res = @mysql_query($sql);
header("Location: ver_columnas.php?bd=$bd&tabla=$tabla");

Sobre este último código vemos la instrucción SQL que hemos utilizado para borrar columnas y nos acompañará el resto de este apunte: alter table. Viendo su sintaxis, notamos que después de indicar la tabla que vamos a "alterar", debemos indicar la lista de modificaciones separadas por comas; en este caso concreto queremos añadir una columna (campo), así que usamos "add [columna] [características]".

También hemos puesto en el listado de campos o columnas un enlace para editarlos que al igual que en el caso del borrado, tiene como parámetros la base de datos, la tabla y la columna. Nos servirá el formulario que usamos en "ver_columnas.php", donde cabiamos el action por modificar_columna.php, y añadimos un campo oculto para no perder la referncia de la columna. A continuación mostramos el código que modifica columnas:

$bd = $_GET["bd"];
$tabla = $_GET["tabla"];
$describe = (isset($_GET["bd"])) ? "$_GET[bd].$_GET[tabla]":$_GET["tabla"];
$columna = $_GET["Field"];
$sql = "describe $describe";
$res = mysql_query($sql);
if ($res)	{
	if (mysql_num_rows($res) > 0)    {
		$c = mysql_num_fields($res);
		$titulos = array();
		$ths = array();
		for ($i = 0; $i < $c; $i++)
			array_push($titulos, mysql_field_name($res, $i));
		$datos = array();
		while	($dato = mysql_fetch_array($res))	{
			if ($dato["Field"] == $columna)	{
				$datito = array();
				for ($i = 0, $total = count($titulos); $i < $total; $i++)
					$datito[$titulos[$i]] = $dato[$titulos[$i]];
			}
		}
	}
}
preg_match('/\((.*?)\)/is', $datito["Type"], $l);
$long = $l[1];
$tipo = preg_replace('/\((.*?)\)/is', "", $datito["Type"]);
$pred = $datito["Default"];
$null = ($datito["Null"] == "YES") ? " checked='checked'":"";
$auto = ($datito["Extra"] == "auto_increment") ? " checked='checked'" : "";
$pri = ($auto == "" && $datito["Key"] == "PRI") ? " checked='checked'" : "";
$no = ($auto == "" && $pri == "") ? " checked='checked'" : "";
$alter = array();
if ($_GET["pred"] != $pred)	{
	array_push($alter, ($_GET["pred"] == "") ? "alter $datito[Field] drop default": "alter $datito[Field] set default '$_GET[pred]'");
}
$type = ($_GET["long"] == "") ? $_GET["tipo"]:"$_GET[tipo]($_GET[long])";
if ($datito["Type"] != $type)
	array_push($alter, "modify $columna $type");
if (isset($_GET["null"]))	{
	if ($datito["Null"] != "YES")
 		array_push($alter, "modify $columna $type null");
}
else	{
	if ($datito["Null"] == "YES")
		array_push($alter, "modify $columna $type not null");
}
switch ($_GET["key"])	{
	case "auto_increment":
		if ($datito["Extra"] != "auto_increment")
		array_push($alter, "modify $columna $type not null auto_increment, add primary key ($columna)");
	break;
	case "si":
		if ($datito["Key"] == "" && $datito["Extra"] != "auto_increment")
		array_push($alter, "add key ($columna)");
	break;
	case "no":
		if ($datito["Key"] != "" && $datito["Extra"] != "auto_increment")
		array_push($alter, "drop key $columna");
	break;
	default:
	break;
}
if ($_GET["campo"] != $columna)
	array_push($alter, "change $columna $_GET[campo] $type");
if (count($alter) &gt; 0)	{
	$sql = "alter table $bd.$tabla ".implode(", ", $alter);
	$res = mysql_query($sql);
}
header("Location: ver_columnas.php?bd=$bd&tabla=$tabla");

Del código que hemos presentado destacamos que podemos realizar más de una alteración: cambio de nombre, de tipo, de valores predeterminados, que admitan o no valores nulos y algunas posibilidades con los índices; y aunque existen más posibilidades, por tratarse de una "gestión sencilla", lo dejaremos así.

Notas finales

Hemos comentado que hay que hacer algunas cosas con mucha precaución, sobre todo cuando empecemos a ingresar datos, ya que podríamos hacer modificaciones "no reversibles" que podrían causar pérdidas de datos; evidentemente son consecuencias no deseadas. Y aunque son códigos funcionales, hay herramientas muy potentes y a veces totalmente gratuitas con muchas opciones y del todo recomendables como es el caso de phpMyAdmin.

Zona de comentarios

Este apunte aún no tiene comentarios.

Evaluación

Valoración de esta página: (apunte.68) valor

Valoración evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar

Respuesta: Zona de mensajes (proceso de evaluación)

Historial de navegación

Esta página ha sido visitada en 3914 ocasiones


Disponemos de rss sindicar

Y del Mapa del sitio, además del sitemap.xml.


Aquí podemos encontrar los apuntes más visitados.

"Top 10" reemplaza a la sección Últimos apuntes.


Una buena forma de buscar un apunte es a partir de su categoría.


También es posible buscar apuntes por medio de las etiquetas (tags).


Hemos decidido poner al alcance de todos algunos comodines.

Adjuntamos una versión reducida del "buscador interno" que vemos en la lista anterior:

Buscar en apuntes

También estamos recopilando antiguas páginas del sitio.


Desde este recuadro se puede hacer una búsqueda cronológica.


Se puede crear una postal nueva desde el enlace del sector "Otras páginas del dominio", o editar la que sale en el recuadro, pulsando sobre ella..

http://www.pepemolina.com/postales/Fondos/santa.gif
http://www.pepemolina.com/postales/animales/gato8t.gif
Feliz Navidad
Feliz Navidad
enlace a la postal
Copyright © 2002-2018 www.pepemolina.com
RSS rss | Ver Mapa del sitio