Conexión con el servidor de bases de datos
Como paso inmediato hemos de interconexionar ambos servidores de forma que sea posible tranferir información de uno a otro.
Para ello es necesario utilizar siempre una función PHP con la siguiente sintaxis:
$c=mysql_connect(h, u, p)
donde $c es la variable que recoge el identificador del enlace, h es la dirección del servidor de bases de datos, ("localhost") , u es el nombre de uno de los usuarios registrados en la tabla user ("pepe" o "root") y p la contraseña (en nuestro caso "pepa" ó "") .
Estos tres valores –cadenas de texto– deben ir escritos entre comillas.
Para cerrar la conexión, tenemos que insertar:
$c=mysql_close ($c)
donde $c es el nombre de la variable en la que se recogió el indentificador del enlace en el momento de la apertura.
Aquí tienes el código de un script que realiza la apertura de una conexión y después la cierra.:
if($c=mysql_connect("localhost","pepe","pepa")){
print "
La conexión con el servidor de bases de datos se ha realizado con exito
";
}else{
print "
No ha podido realizarse la conexión
";
}
if(mysql_close($c)){
print "
Se ha cerrado la conexión con el servidor de bases de datos
";
}
Y aquí puedes comprobar el funcionamiento del script anterior.
Si realizáramos una segunda conexión (con los mismos argumentos) sin haber cerrado la anterior no se efectuará un nuevo enlace sino que nos devolverá el ya abierto.
Sintaxis alternativa
Otra forma de efectuar la conexión es utilizar los valores registrados en el fichero mysql.inc.php –lo hemos creado en la página anterior– y eso requiere que insertemos un include("c:..."), indicando la ruta completa de seguridad y el nombre del fichero en el que hemos guardado las claves y que era mysql.inc.php.
En este supuesto como valores de los parámetros h, u y p pondremos los nombres de las variables:
$mysql_server
$mysql_login y
$mysql_pass
sin encerrarlas entre comillas.
Aquí tienes el código de un script que realiza la apertura de una conexión y después la cierra:
include("C:/Apache/seguridad/mysql.inc.php");
if($c=mysql_connect($mysql_server,$mysql_login,$mysql_pass)){
print "
La conexión con el servidor de bases de datos se ha realizado con exito
";
}else{
print "
No ha podido realizarse la conexión
";
exit();
}
if(mysql_close($c)){
print "
Se ha cerrado la conexión con el servidor de bases de datos
";
}
Desde este enlace puedes comprobar su funcionamiento.
La instrucción OR DIE
Es una opción alternativa a exit() que, como acabamos de ver en un ejemplo, 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')
y 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 apare- cerá en la ventana del navegador el texto incluido en mensaje.
Este es el código fuente de un script que produce un error –la contraseña es incorrecta– y que utiliza esta nueva sintaxis:
$c=mysql_connect("localhost","pepe","pepi") or die("No se conecto");
if(mysql_close($c)){
print "
Se ha cerrado la conexión con el servidor de bases de datos
";
}
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 este otro script lo hemos incorporado y puedes comprobarlo aqui:
$c=@mysql_connect("localhost","pepe","pepi") or die("No se conecto");
if(mysql_close($c)){
print "
Se ha cerrado la conexión con el servidor de bases de datos
";
}
Lista de bases de datos existentes
PHP dispone de herramientas para conocer el número de bases de datos existentes en el servidor, así como sus nombres. Todas ellas requieren que se haya establecido una conexión con el servidor.
$p=mysql_list_dbs($c)
La variable $p es un nuevo identificador imprescindible y previo a la determinación del número y los nombres de las bases de datos existentes en el enlace abierto (identificado por $c).
$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).
Fíjate que i tiene que ser i<$n porque si, por ejemplo, $n=5 los cinco valores posibles de i serían: 0,1,2,3 y 4.
Una lista completa de todas las bases de datos existentes en el servidor podría hacerse mediante el siguiente proceso:
• Abrir la conexión.
• Invocar a mysql_list_dbs.
• Contar el número de bases de datos con mysql_num_rows
• Insertar un bucle:
for ($i=0;$i<$num,$i++)
• Presentar la lista de nombres mediante un bucle que lea los diferentes valores de $i en:
mysql_db_name($p,$i)
Aquí tienes el código fuente de un ejemplo completo:
<?
if($c=mysql_pconnect ("localhost","pepe","pepa")){
echo "<h2> Conexión establecida con el servidor</h2><br>";
# recoge en una nueva variable que hemos llamado $p
# un nuevo identificador, $p
$p=mysql_list_dbs($c);
# utilizando ese nuevo identificador podemos extraer el número
$numero=mysql_num_rows($p);
echo "Hay ",$numero, " bases de datos en el servidor<br>" ;
#este bucle (desde cero hasta el número
# nos irá listando los nombres correspondientes a esos numeros de orden
for ($i=0;$i<$numero;$i++) {
echo mysql_db_name($p, $i),"<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>";
}
?>
y desde aquí puedes ejecutarlo
Crear una base de datos
mysql_query ("CREATE DATABASE nom")
donde nom es el nombre de la 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.
Aquí tienes el código de un ejemplo de creación de una base de datos:
<?
if($conexion=mysql_connect ("localhost","pepe","pepa")){
echo "<h2> Conexión establecida con el servidor</h2><br>";
if(mysql_query("CREATE DATABASE otraBase")){
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>";
}
?>
Si lo ejecutas dos veces podrás comprobar que en la segunda oportunidad te aparece el mensaje diciendo que no ha sido posible crearla.
Borrar una base de datos
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.
Este es el código de un script que puede borrar la base creada anteriormente:
<?
if($c=mysql_connect ("localhost","pepe","pepa")){
echo "<h2> Conexión establecida con el servidor</h2><br>";
if(mysql_query ("DROP DATABASE otraBase",$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>";
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>";
}
?>
Igual que ocurría al tratar de crearla, si intentamos borrar una base de datos inexistente la función mysql_drop_db nos devolverá FALSE.
Depurando los procesos de creación y borrado de bases de datos
Sería mucho más interesante comprobar la existencia o inexistencia de una base de datos antes de ejecutar esas instrucciones y que después de la comprobación se nos presentara un mensaje informativo.
MySQL dispone de una sentencia para este fin, pero –aunque la vamos ver más adelante– olvidémosnos de su existencia e intentemos crear nuestro propio script de comprobación.
Combinando las instrucciones anteriores no resulta difícil hacerlo. Aquí tienes un ejemplo de código para efectuar esa comprobación al crear una base de datos:
<?
# introducimos en una variable el nombre de la base de datos a crear
$crear="mispruebas";
#conectamos con el servidor y comprobamos la conexión
if ($conexion=mysql_pconnect ("localhost","pepe","pepa")){
echo "<h2> Conexión establecida con el servidor</h2><br>";
$p=mysql_list_dbs($conexion);
$numero=mysql_num_rows($p);
$comprueba=0;
#comprobamos si existe una base con ese nombre
# si existe hace la variable comprueba igual a 1
# si no existe la variable comprueba sera 0 tal como la hemos
# puesto aquí arriba
for ($i=0;$i<$numero;$i++) {
if ($crear==mysql_db_name($p, $i)){
$comprueba=1;
};
}
#si la base de datos no existe la creamos y escribimos el mensaje de exito
#si existe, avisamos de su existencia y evitamos intentar crearla
# observa que como nombre del la nueva base puede ponerse una variable
if($comprueba==0){
if(mysql_query ("CREATE DATABASE $crear")){
echo "<h2> Base de datos $crear creada</h2><br>";
}else{
echo "<h2> No ha sido posible crear la base de datos $crear</h2><br>";
};
}else{
echo "<h2> La base de datos $crear YA EXISTE</h2><br>";
} ;
# cerramos la conexión con el servidor
if(mysql_close($conexion)){
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>";
}
?>
y este otro código es para el caso de borrado:
<?
# introducimos en una variable el nombre de la base de datos a borrar
$borrar="mispruebas";
#conectamos con el servidor y comprobamos la conexión
if ($conexion=mysql_connect ("localhost","pepe","pepa")){
echo "<h2> Conexión establecida con el servidor</h2><br>";
$p=mysql_list_dbs($conexion);
$numero=mysql_num_rows($p);
$comprueba=0;
#comprobamos si existe una base con ese nombre
# si existe hace la variable comprueba igual a 1
# si no existe la variable comprueba sera 0 tal como la hemos
# puesto aquí arriba
for ($i=0;$i<$numero;$i++) {
if ($borrar==mysql_db_name($p, $i)){
$comprueba=1;
};
}
#si la base de datos existe la borramos y escribimos el mensaje de exito
#si no existe, avisamos de su inexistencia y evitamos intentar borrarlas
# observa que como nombre del la nueva base puede ponerse una variable
# AHORA BORRAREMOS SOLO EN EL CASO DE QUE EXISTA
# que significa que $comprueba es igual a 1
if($comprueba==1){
if(mysql_query ("DROP DATABASE $borrar")){
echo "<h2> Base de datos $crear BORRADA</h2><br>";
}else{
echo "<h2> No ha sido posible BORRAR LA BASE de datos $borrar</h2><br>";
};
}else{
echo "<h2> La base de datos $borrar NO EXISTIA</h2><br>";
} ;
# cerramos la conexión con el servidor
if(mysql_close($conexion)){
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>";
}
?>
- en realidad lo ideal sería cambiar los for por un while (($i<$numero) && (! comprueba)) - Experimenta con estos scripts, sustitúyelos por otros propios en los que utilices las funciones que hemos incluido –a la derecha tienes el código fuente– dentro del fichero mysql.inc.php y comprueba, listando las bases de datos existentes, que sólo queden: mysql y test.
Tipos de campos MySQL
Es muy necesario conocer los diferentes tipos de campos que pueden contener las tablas de MySQL -podrás encontrarlos al final del documento-.
Conocer las posibilidades de cada uno será fundamental a la hora de diseñar una tabla. En ese momento tendremos que decidir qué campos son necesarios, cuál es tipo requerido, cuáles han de ser sus dimensiones y también cuáles de ellos requerirán ser tratados como índices.
Tipos de campo bien elegidos y un tamaño adecuado a las necesidades reales de nuestro proyecto son las mejores garantías para optimizar el tamaño de la tabla y para hacerla realmente eficaz.
El grado de eficiencia de una base de datos suele ser directamente proporcional al tiempo invertido en el análisis de la estructura de sus tablas.
CREACIÓN DE LAS BASES DE DATOS NECESARIAS PARA EL CURSO
Pulsa en este enlace para que cree automáticamente la base de datos que va a contener los sucesivos ejemplos que hemos incluido en estos materiales.
Crear base de datos EJEMPLOS |
Una vez hecho esto, escribe tu propio script y crea una segunda base de datos como el nombre practicas. Esta será la que habrás de utilizar en ejercicios que tendrás que ir haciendo en el resto del curso.
Antes de continuar, es conveniente comprobar desde Windows que el directorio c:\mysql\data contiene las bases de datos ejemplos y practicas
Automatizar la conexión Con nuestros conocimientos sobre PHP ya estamos en condiciones de hacer más cómoda la conexión. Creemos una función que realice de forma automática la conexión con MySQL y guardémosla en nuestro fichero mysql.inc.php <? # estas son las variables anteriores $mysql_server="localhost"; $mysql_login="pepe"; $mysql_pass="pepa"; # creemos una nueva variable $c sin asignarle ningún valor # para que pueda recoger el identificador de conexión # una vez que se haya establecido esta $c; # escribamos la función que hace la conexión # como pretendemos que el valor del identificador # sea usado fuera de la función, para recuperar su valor # pasaremos ese valor por referencia anteponiendo & al # nombre de la variable function conecta1(&$c){ # para usar las variables anteriores en la funcion # hemos de definirlas como globales global $mysql_server, $mysql_login, $mysql_pass; if($c=mysql_connect($mysql_server,$mysql_login,$mysql_pass)){ print "<br>Conexión establecida<br>"; }else{ print "<br>No ha podido realizarse la conexión<br>"; # el exit lo incluimos para que deje de ejecutarse # el script si no se establece la conexión exit(); } } # esta función asignará a $c el valor del identificador # repetimos la misma función con otro nombre # ahora quitaremos el mensaje de conexión establecida # consideraremos que si no hay mensaje se ha establecido # asi quedará limpia nuestra página function conecta2(&$c){ global $mysql_server, $mysql_login, $mysql_pass; if($c=mysql_connect($mysql_server,$mysql_login,$mysql_pass)){ }else{ print "<br>No ha podido realizarse la conexión<br>"; exit(); } } ?> Si sustituyes el contenido de tu mysql.inc.php por el que tienes aquí arriba –puedes eliminar la líneas de comentario al hacerlo– estaremos en disposición de ejecutar scripts como este. En este ejemplo utilizaremos la primera función: Ver código fuente ejemplo153.php y ahora haremos uso de la segunda Ver código fuente Ejecutar ejemplo Tipos de campos en MySQL MySQL tiene habilitados diversos tipos de campos que en una primera aproximación podrían clasificarse en tres grupos:
Campos numéricos MySQL soporta los tipos numéricos exactos(INTEGER, NUMERIC, DECIMAL, y SMALLINT) y los tipos numéricos aproximados (FLOAT, DOUBLE precision y REAL). Los campos que contienen números enteros admiten el parámetro UNSIGNED, que implica que no admita signos, por lo que solo aceptaría enteros positivos. Todos los campos numéricos admiten el parámetro ZEROFILL cuya función es completar el campo con ceros a la izquierda hasta su longitud máxima. Tipos de campos numéricos enteros Estos son los distintos tipos de campos numéricos enteros que admite MySQL. Los parámetros señalados entre corchetes son opcionales.
Números de coma flotante Por la estructura binaria de los microprocesadores y habida cuenta de que algunos números no enteros -sin ir más lejos, el 0.1- requerirían infinitos caracteres binarios para su representación exacta, se hace necesario introducir un redondeo en su tratamiento informático y como consecuencia de ello asumir que se generan errores de medida.Esta circunstancia obligó al tratamiento de los números decimales mediante el llamado Standar de Aritmética de Punto Flotante, un algoritmo definido por la IEEE (Institute of Electrical and Electronics Engineers) que unificó los procesos de representación de números en ordenadores con lo que son uniformemente controlables los errores introducidos. El Standar de Aritmética de Punto Flotante estableció dos niveles de precisión:
|
|
No hay comentarios:
Publicar un comentario