Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

lunes, 20 de agosto de 2012

Provincias, cantones y distritos para seleccionar

Basado en una entrada anterior donde puse a disposición un script para crear las tablas que representan la estructura de provincias, cantones y distritos, he creado un script PHP que genera unos arreglos en JavaScript para poder utilizarlos en selectores de manera que carguen dinámicamente según la selección anterior. Básicamente, si selecciona una provincia, cargue los cantones de esa provincia, y si selecciona un cantón, cargue los distritos de ese cantón.

El script en PHP sería este:

<?php
 mysql_connect("localhost","root","") or die("Unable to connect to SQL server");
 @mysql_select_db("data_base_name") or die("Unable to select database"); 
  
 $provincias_result = mysql_query("select * from PROVINCIA_CR");
  
 echo "var p=new Array();var c=new Array();var d=new Array();";
 while ($provincia_row = mysql_fetch_row($provincias_result)) {
   
  echo "p[" . $provincia_row[0] . "]='" . $provincia_row[1] . "';";
   
  $cantones_result = mysql_query("select * from CANTON_CR where codigo_provincia = "
   . $provincia_row[0]);
   $canton_line = "c[". $provincia_row[0] . "]='"; 
   $distrito_lines = "";
   while ($canton_row = mysql_fetch_row($cantones_result)) {
    $canton_line = $canton_line . $canton_row[2] ."@" .  $canton_row[1] . "~";
     
    $distritos_result = mysql_query("select * from DISTRITO_CR where codigo_canton = "
     . $canton_row[0]);
      
    $distrito_line = "d[". $canton_row[1] . "]='";   
    while ($distrito_row = mysql_fetch_row($distritos_result)) {
      $distrito_line .= $distrito_row[2] ."@" .  $distrito_row[1] . "~";
    }
    $distrito_line=substr_replace($distrito_line ,"",-1); // Remueve último caracter.
    $distrito_lines .= $distrito_line . "';";
   }
   $canton_line=substr_replace($canton_line ,"",-1); // Remueve último caracter.
   echo $canton_line . "';";
   echo $distrito_lines;   
 }
?>
Este script genera un código como este (también dejo a disposición el script generado):
var p=new Array();var c=new Array();var d=new Array();p[1]='San José';c[1]='San José@1~Escazú@1~Desamparados@1~Puriscal@1~Tarrazú@1~Aserrí@1~Mora@1~Goicoechea@1~Santa Ana@1~Alajuelita@1~Vasquez de Coronado@1~Acosta@1~Tibás@1~Moravia@1~Montes de Oca@1~Turrubares@1~Dota@1~Curridabat@1~Pérez Zeledón@1~León Cortés@1';d[1]='Carmen@101~Merced@101~Hospital@101~Catedral@101~Zapote@101~San Francisco de Dos Ríos@101~Uruca@101~Mata Redonda@101~Pavas@101~Hatillo@101~San Sebastián@101';d[1]='Escazú@102~San Antonio@102~San Rafael@102';d[1]='Desamparados@103~San Miguel@103~San Juan de Dios@103~San Rafael Arriba@103~San Antonio@103~Frailes@103~Patarrá@103~San Cristóbal@103~Rosario@103~Damas@103~San Rafael Abajo@103~Gravilias@103~Los Guido@103';d[1]='Santiago@104~Mercedes Sur@104~Barbacoas@104~Grifo Alto@104~San Rafael@104~Candelaria@104~Desamparaditos@104~San Antonio@104~Chires@104';d[1]='San Marcos@105~San Lorenzo@105~San Carlos@105';d[1]='Aserrí@106~Tarbaca o Praga@106~Vuelta de Jorco@106~San Gabriel@106~La Legua@106~Monterrey@106~Salitrillos@106';d[1]='Colón@107~Guayabo@107~Tabarcia@107~Piedras Negras@107~Picagres@107';d[1]='Guadalupe@108~San Francisco@108~Calle Blancos@108~Mata de Plátano@108~Ipís@108~Rancho Redondo@108~Purral@108';d[1]='Santa Ana@109~Salitral@109~Pozos o Concepción@109~
...
Con ese código se puede agregar lógica JavaScript, sazonada con JQuery, para cargar las opciones dinámicamente:

Código en GitHub

<html>
<head>
 <script src="distritos.js" type="text/javascript"></script>
 <script src="jquery-1.7.1.min.js" type="text/javascript"></script> 
 <script type="text/javascript">  
  var separator1 = "~";
  var separator2 = "@";
  
  function cargarProvincias(provinciaId) {
   $("#" + provinciaId).append($("<option></option>")
    .attr("value", -1).text("Elija una provincia"));  
   for (var key in p) {
    $("#" + provinciaId).append($("<option></option>")
     .attr("value", key).text(p[key]));
   }
  }
  
  function cargarCantones(provincia, cantonId) {
   var provinciaSelectedValue =  $(provincia).val();
   $("#" + cantonId + " option").remove();
   
   if(provinciaSelectedValue != -1) {     
    $("#" + cantonId).append($("<option></option>")
     .attr("value", -1).text("Elija un cantón")); 
    
    var cantones = c[provinciaSelectedValue].split(separator1);
    
    for (var i=0; i < cantones.length; i++) {
     var cantonValuePair = cantones[i].split(separator2);
     $("#" + cantonId).append($("<option></option>")
     .attr("value", cantonValuePair[1]).text(cantonValuePair[0]));
    }    
   } else {
    $("#" + cantonId).append($("<option></option>")
     .attr("value", -2).text("Elija una provincia"));
   }
   cargarDistritos($("#" + cantonId), "distritos");
  }
  
  function cargarDistritos(canton, distritoId) {
   var cantonSelectedValue =  $(canton).val();
   $("#" + distritoId + " option").remove();
   
   if(cantonSelectedValue > 0) {      
    $("#" + distritoId).append($("<option></option>")
     .attr("value", -1).text("Elija un distrito")); 
    
    var distritos = d[cantonSelectedValue].split(separator1);
    
    for (var i=0; i < distritos.length; i++) {
     var distritoValuePair = distritos[i].split(separator2);
     $("#" + distritoId).append($("<option></option>")
     .attr("value", distritoValuePair[1]).text(distritoValuePair[0]));
    }    
   } else if(cantonSelectedValue == -1){
    $("#" + distritoId).append($("<option></option>")
     .attr("value", -1).text("Elija un cantón")); 
   } else if(cantonSelectedValue == -2){
    $("#" + distritoId).append($("<option></option>")
     .attr("value", -1).text("Elija una provincia")); 
   }
  }  
 </script> 
</head>

<body onload="cargarProvincias('provincias')">
 <select id="provincias" onchange="cargarCantones(this, 'cantones');"></select>
 <select id="cantones" onchange="cargarDistritos(this, 'distritos');"><option value="-2">Elija una provincia</option></select>
 <select id="distritos"><option value="-2">Elija una provincia</option></select>
</body>
</html>

Resultado Final:

lunes, 16 de mayo de 2011

PHP: Desplegar datos de cualquier tabla MySQL


Si alguna vez necesitan hacer una página rápida de prueba para desplegar los datos de cualquier tabla MySQL, aquí les dejo esté código que encontré en este post. Solamente hay que cambiar los datos de conexión y la tabla que desean desplegar.

<?php

//MyDB represents the name of your database.
//MyTable represents the name of your table inside the database.

mysql_connect("localhost","my_user","my_pass") or die("Unable to connect to SQL server");
@mysql_select_db("my_database") or die("Unable to select database");


$result = mysql_query("select * from MY_TABLE limit 500");
?>
<table border="1">
<tr>
<?php


while ($field=mysql_fetch_field($result)) {
echo "<th>";
echo "$field->name";
echo "</th>";
}
echo "</tr>";

while ($row = mysql_fetch_row($result)) {
echo "<tr>";
for ($i=0; $i<mysql_num_fields($result); $i++) {
echo "<td>";
if (isset($row[$i]))
echo "$row[$i]";
else
echo "-";
echo "</td>";
}
echo "</tr>\n";
}

echo "</table>";

?>

miércoles, 2 de junio de 2010

Renombrar base de datos en MySQL

Parece ser que antes existía un comando en MySQL para renombrar una base de datos pero fue quitado por cuestiones de seguridad.

RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 

This statement was added in MySQL 5.1.7 but was found to be dangerous and was removed in MySQL 5.1.23. It was intended to enable upgrading pre-5.1 databases to use the encoding implemented in 5.1 for mapping database names to database directory names (see Section 8.2.3, “Mapping of Identifiers to File Names”). However, use of this statement could result in loss of database contents, which is why it was removed. Do not useRENAME DATABASE in earlier versions in which it is present.


Existe una manera alternativa pero solo funciona con el motor MyiSAM. Me tomó un poco de tiempo pero encontré un script para poder renombrar con InnoDB. El script requiere que exista una BD con el nuevo nombre que se va utilizar.


DROP PROCEDURE IF EXISTS RenameDatabase;
DELIMITER |
CREATE PROCEDURE RenameDatabase(
IN oldname CHAR (64), IN newname CHAR(64)
)
BEGIN
DECLARE version CHAR(32);
DECLARE sname CHAR(64) DEFAULT NULL;
DECLARE rows INT DEFAULT 1;
DECLARE changed INT DEFAULT 0;
IF STRCMP( oldname, 'mysql' ) <> 0 THEN
REPEAT
SELECT table_name INTO sname
FROM information_schema.tables AS t
WHERE t.table_type='BASE TABLE'
AND t.table_schema = oldname
LIMIT 1;
SET rows = FOUND_ROWS();
IF rows = 1 THEN
SET @scmd = CONCAT( 'RENAME TABLE ', oldname, '.', sname,
' TO ', newname, '.', sname );
PREPARE cmd FROM @scmd;
EXECUTE cmd;
DEALLOCATE PREPARE cmd;
SET changed = 1;
END IF;
UNTIL rows = 0 END REPEAT;
IF changed > 0 THEN
SET @scmd = CONCAT( "UPDATE mysql.db SET Db = '",
newname,
"' WHERE Db = '", oldname, "'" );
PREPARE cmd FROM @scmd;
EXECUTE cmd;
DROP PREPARE cmd;
SET @scmd = CONCAT( "UPDATE mysql.proc SET Db = '",
newname,
"' WHERE Db = '", oldname, "'" );
PREPARE cmd FROM @scmd;
EXECUTE cmd;
DROP PREPARE cmd;
SELECT version() INTO version;
IF version >= '5.1.7' THEN
SET @scmd = CONCAT( "UPDATE mysql.event SET db = '",
newname,
"' WHERE db = '", oldname, "'" );
PREPARE cmd FROM @scmd;
EXECUTE cmd;
DROP PREPARE cmd;
END IF;
SET @scmd = CONCAT( "UPDATE mysql.columns_priv SET Db = '",
newname,
"' WHERE Db = '", oldname, "'" );
PREPARE cmd FROM @scmd;
EXECUTE cmd;
DROP PREPARE cmd;
FLUSH PRIVILEGES;
END IF;
END IF;
END;
|
DELIMITER ;

martes, 19 de enero de 2010

MySQL Workbench: Una opción para crear tus diagramas ER



Hace un tiempo estuve "googleando" para encontrar alguna herramienta gratuita para diseñar diagramas de entidad relación (ER) y extrañamente no pude hallar ninguna rápidamente. De hecho ni siquiera me tomé la molestia de descargar algunas de las aparentemente "freeware" que estaban disponibles porque no me daban buena espina.

Un día de estos buscando la página para descargar MySQL Admin, el cual es un cliente gestor de bases de datos MySQL, me di cuenta que existia otra herramienta de la misma gente de desarrollo: MySQL Workbench. Esta herramienta tiene varias utilidades que no he explorado bien aún pero me llamó la atención que tiene justo lo que andaba buscando. MySQL Workbench permite no solamente diseñar los diagramas desde cero, sino que también provee la posibilidad de aplicar ingenieria inversa para generar el diagrama a partir de una base de datos existente.

Esta opción de ver los diagramas actualizados con la BD era algo que resentía no tener en MySQL y que por el contrario siempre ha sido parte de MS SQL Server, al menos desde que comencé a usarlo en la versión 2000. Sin duda MySQL junto con las herramientas que lo acompañan cada vez resulta ser una opción más competitiva y robusta para el desarrollo de base de datos. Ya no es como en los tiempos en que el profesor nos decía que si necesitabamos una BD sin mucha complejidad usaramos MySQL.

miércoles, 16 de diciembre de 2009

Provincias, Cantones y Distritos

Un típico problema a resolver para los programadores de Costa Rica en aplicaciones locales ,es manejar los catálogos de provincias, cantones y distritos (PCD's). La relación de estos tres catálogos refleja una relación jerárquica donde una provincia agrupa cantones y un cantón agrupa distritos.

Así lucen los scripts para crear estas tablas en una base de datos MySQL:

Provincia:
DROP TABLE IF EXISTS `PROVINCIA_CR`;
CREATE TABLE `PROVINCIA_CR` (
  `codigo_provincia` smallint(5) unsigned NOT NULL auto_increment,
  `nombre_provincia` varchar(45) NOT NULL,
  PRIMARY KEY  USING BTREE (`codigo_provincia`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

Cantón:
DROP TABLE IF EXISTS `CANTON_CR`;
CREATE TABLE `CANTON_CR` (
  `codigo_canton` smallint(5) unsigned NOT NULL,
  `codigo_provincia` smallint(5) unsigned NOT NULL,
  `nombre_canton` varchar(45) NOT NULL,
  PRIMARY KEY  USING BTREE (`codigo_canton`),
  KEY `FK_CANTON_PROVINCIA` (`codigo_provincia`),  
  CONSTRAINT `FK_CANTON_PROVINCIA` FOREIGN KEY (`codigo_provincia`) REFERENCES `PROVINCIA_CR` (`codigo_provincia`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Distrito:


DROP TABLE IF EXISTS `DISTRITO_CR`;
CREATE TABLE `DISTRITO_CR` (
  `codigo_distrito` int(10) unsigned NOT NULL,
  `codigo_canton` smallint(5) unsigned NOT NULL,
  `nombre_distrito` varchar(45) NOT NULL,  
  PRIMARY KEY  (`codigo_distrito`),
  KEY `FK_DISTRITO_CANTON` (`codigo_canton`),
  CONSTRAINT `FK_DISTRITO_CANTON` FOREIGN KEY (`codigo_canton`) REFERENCES `CANTON_CR` (`codigo_canton`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Hace poco necesitaba crear estos catálogos y tuve que darme a la tediosa tarea de manipular una página html con el contenido de las PCD's para poder generar las inserciones a la base de datos. Así que dejo a disposición dos documentos para cualquiera que les sea útil:
  1. Documento hoja de cálculo con toda la información necesaria. Se puede editar para generar las inserciones para otro administrador de BD que no sea MySQL.
  2. Documento con los scripts para crear las tablas y las inserciones.
En este otro artículo muesto como crear la serie de selectores para una interfaz web.