2011-12-01 08:47 @407 |
|
|
jacks
Perlero Frecuente
|
Registrado: 2011-04-05 11:14 @510 Mensajes: 148
|
|
|
Acceder a base de datos MySQL desde script en Perl
|
|
¡Hola! Tengo una pequeña duda. He creado un programa en Perl que necesita conectarse a MySQL. Todo funciona correctamente porque está usando la base de datos de mi ordenador y mi clave. El problema que veo yo cuando lo instale otra persona en su ordenador, y lógicamente, no tendrá la misma clave que yo, ¿habría alguna manera de hacer que funcionase en cualquier PC? Es que no se me ocurre nada. Lo único la persona que lo use deberá crearse una cuenta con el nombre root y el pasword que utilizo, ¿no? De esta manera será todo igual.
|
2011-12-01 11:49 @534 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
|
La solución sería que el programa instalador, a la hora de crear el esquema en la MySQL, definiese también un usuario para acceder a ella, que coincidiese con la que use el programa. O dar también la oportunidad de preguntar al usuario si tiene ya creado un usuario, y en ese caso, preguntarle por sus credenciales, y grabarlas luego en el programa, para que haga uso de ellas.
Para el primer caso, el programa instalador necesitará saber las credenciales de acceso a la MySQL, algo que puede saber si lo pregunta al usuario que instaló la MySQL, o lo sabe el propio instalador, si fue él el que también instaló la MySQL.
Una vez que tenga acceso completo a la MySQL, crea el esquema de la base de datos y un usuario genérico para acceder a ella.
_________________ JF^D Perl programming
|
2011-12-02 19:16 @844 |
|
|
pvaldes
Perlero Frecuente
|
Registrado: 2011-01-22 12:56 @580 Mensajes: 118
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
|
> ¿habría alguna manera de hacer que funcionase en cualquier PC?
Sí, usa un montón de argumentos para lanzar el programa
|
2011-12-06 06:42 @320 |
|
|
jacks
Perlero Frecuente
|
Registrado: 2011-04-05 11:14 @510 Mensajes: 148
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
Vale, ya he creado el método para que el usuario pueda meter el usuario y el pasword. Pero el problema es ¿cómo compruebo que esos son los datos correctos? Lo probé con: Using perl Syntax Highlighting (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));
pero después me di cuenta que si la base de datos que tengo puesta en q_string no existe, aunque los datos sean correctos, dará error. 
|
2011-12-06 07:34 @357 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
(Te sobran los paréntesis más externos.) Si no se ha podido conectar, $DBI::errstr y $DBI::err tendrán almacenados el mensaje y número de error que ha ocurrido. Como tienes puesta la opción PrintError => 0, el mensaje no saldrá al STDERR, así que no sabrás qué ha ocurrido. Por eso tienes que analizarlo desde el propio programa (no queremos que el usuario vea el error original en inglés, y/o que el programa lo gestione por sí mismo). Pero el problema lo tienes en RaiseError => 1, ya que con eso estás indicando que si ocurre un error, se muera el programa (y mostrando el error en STDERR). Si no quieres que el usuario vea ningún error, deberás ponerlo a '0'. Y... ¿cuál es el mensaje de error? Depende del motor de bases de datos que estemos usando. Si es MySQL, saldrá algo como esto: Using text Syntax Highlighting root@hs-981:~/# perl -MDBI -E 'DBI->connect("DBI:mysql:database=kkk", "user", "pass", {PrintError => 0, RaiseError => 0}); say "[$DBI::err][$DBI::errstr]"'
[1045][Acceso negado para usuario: 'user'@'localhost' (Usando clave: SI)] También saldrá el mismo mensaje de error si la tabla es correcta pero si el usuario (o la contraseña) están mal. Si, en cambio, los usuarios son correctos y tienen permisos para conectarse, pero la tabla es incorrecta, saldrá este mensaje: Using text Syntax Highlighting [1049][Base de datos desconocida 'kkk'] con lo que puedes usarlo para sacar un aviso en pantalla e informar al usuario. Lista de códigos de error para MySQL (para el servidor). Using perl Syntax Highlighting if ($DBI::err == 1049) {
say "La base de datos no está bien indicada o no existe";
}
_________________ JF^D Perl programming
|
2011-12-06 10:24 @475 |
|
|
jacks
Perlero Frecuente
|
Registrado: 2011-04-05 11:14 @510 Mensajes: 148
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
Ya, pero creo que aun así no funcionará lo que quiero hacer. Intentaré explicarme mejor. Imagina que no hay ninguna base de datos creada con lo cual lo que quiero que haga es que al introducir el usuario y la contraseña la cree. Por ejemplo, database= "prueba" usuario= "jacks" password = "pwd". Lo que quiero que haga, como es la primera vez que ejecuto el programa, es que cree la base de datos con el nombre y clave que he introducido. Si las clave y la contraseña no coinciden no se crea y da error. En cambio, si es correcto, que la cree. ¿Se podría hacer con este código? Lo que pasa que no sé cómo hacer que dé el error. Using perl Syntax Highlighting my ($db) = @_; # Recoge los datos pasadosdesde la llamada en estas variables
my @databases = DBI->data_sources( "mysql", { host => 'localhost', user => $usu, password => $pwd } );
# Cogemos la lista de bases de datos presentes en el sistema
my $base_datos = $db; #Introducimos el nombre de la base de datos que queremos comprobar que está en la variable $base_datos
my $dsn = "DBI:mysql:$base_datos"; # Conformamos el DSN de esa base de datos
unless ( $dsn ~~ @databases ) { # Si el $dsn no está entre las @databases la creamos
my $drh = DBI->install_driver("mysql"); # Carga del controlador mysql
my $rc = $drh->func( "createdb", $base_datos, 'localhost', $usu, $pwd, 'admin' ); # Creamos la base de datos
}
| Última edición por explorer el 2011-12-06 14:18 @637, editado 2 veces en total |
| Formateado de código con Perltidy |
|
2011-12-06 17:04 @753 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
Pero para poder crear una nueva base de datos, se debe hacer con un usuario/contraseña que tenga permisos para poder hacer eso (el usuario administrador, por ejemplo). Un usuario normal no puede hacerlo, salvo que tenga concedidos los permisos para CREATE (crear tablas y bases de datos). Entonces... desde el principio, ese usuario debe tener todos los permisos (todos, excepto GRANT y alguno más, que no son necesarios). Teniendo concedido el de CREATE, podrá ejecutar comandos SQL de creación de bases de datos, y luego, de las tablas. Algo así (antes tiene que existir el usuario, claro, y con permisos de CREATE puestos por el administrador) Using sql Syntax Highlighting CREATE DATABASE basedatos; # Crear la base de datos
GRANT ALL privileges ON basedatos.* TO user@localhost; # privilegios: todos, para ese usuario, a esa base
_________________ JF^D Perl programming
|
2011-12-07 08:53 @411 |
|
|
jacks
Perlero Frecuente
|
Registrado: 2011-04-05 11:14 @510 Mensajes: 148
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
|
Hummm... sí, vale, pero es que el usuario y la contraseña estarán creados al instalar la base de datos MySQL con lo cual ya tendrá los permisos. Lo único que quiero es que me compruebe que con esos datos (usuario y contraseña) puedo crear bases de datos. Que pueda lanzar un error diciendo que no puede acceder o no se puede crear una base de datos con ese usuario y esa contraseña. No sé si me expliqué bien ahora. Yo no quiero dar permisos a nadie, solo quiero que el usuario meta sus datos y pueda o no crear bases de datos dependiendo si son correctos o no los datos.
|
2011-12-08 14:08 @631 |
|
|
pvaldes
Perlero Frecuente
|
Registrado: 2011-01-22 12:56 @580 Mensajes: 118
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
jacks escribió: Hummm... sí, vale, pero es que el usuario y la contraseña estarán creados al instalar la base de datos MySQL con lo cual ya tendrá los permisos. Lo único que quiero es que me compruebe que con esos datos (usuario y contraseña) puedo crear bases de datos. Que pueda lanzar un error diciendo que no puede acceder o no se puede crear una base de datos con ese usuario y esa contraseña. No sé si me expliqué bien ahora. Yo no quiero dar permisos a nadie, solo quiero que el usuario meta sus datos y pueda o no crear bases de datos dependiendo si son correctos o no los datos. vaya lío que tienes... Using perl Syntax Highlighting my ($db) = @_; # Recoge un solo valor, el primer argumento.
my @databases = DBI->data_sources( "mysql", { host => 'localhost', user => $usu, password => $pwd } );
# NO, nunca se indica el password en un archivo de texto plano
# Y NO FUNCIONARÁ porque tienes que conectarte a tu base de datos ANTES de poder trabajar con ella
my $base_datos = $db; # este paso es totalmente innecesario
my $dsn = "DBI:mysql:$db"; # de nuevo innecesario
unless ( $dsn ~~ @databases ) {
my $drh = DBI->install_driver("mysql"); # este paso debería ser innecesario,
# mysql viene por defecto
# además $drh aún no existe
my $rc = $drh->func( "createdb", $db, 'localhost', $usu, $pwd, 'admin' );
# no has creado un database handle nuevo, $drh no existe
# Usa DO para esto,
# Y de nuevo contraseña pasada como variable, cualquiera que quiera leer esta contraseña solo tiene que imprimir la variable y ya tiene las llaves de tu casa
Léete la documentación.
|
2011-12-08 16:41 @736 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
A ver, pvaldes... que me parece que te has colado otra vez... El código que está usando jacks está sacado de aquí, donde comentaba con Txemaracas diversas formas, la más óptimas posibles, para crear bases de datos en una MySQL, a petición de un usuario, en el caso de que la base de datos no exista. Se puede hacer de varias maneras, como se comenta en ese hilo. Esta es una en la que se dialoga con el motor MySQL de forma directa (no usando las funciones básicas de DBI. Idea sacada de la propia página de manual DBD::mysql). La línea 13 le pide a DBI que nos dé un manejador para poder dialogar con la biblioteca MySQL. NO estamos instalando nada, sino que estamos pidiendo a DBI que cargue el controlador de MySQL para poder dialogar con el motor. (Tampoco tiene sentido decir "debería": DBI no sabe con qué motor de base de datos queremos dialogar. En un sistema puede haber varios motores simultáneos). La línea 17 le solicita al controlador de MySQL que cree una nueva base de datos, y que nos dé el resultado de la operación. Lo que comentas de que $drh no existe, ¿a qué te refieres? Es una variable escalar que salta a la existencia en la misma línea 13 (la estamos declarando y definiendo). Y sobre el tema de las contraseñas, que te conteste jacks. Por mí, yo no veo problemas.
_________________ JF^D Perl programming
|
2011-12-09 11:04 @502 |
|
|
pvaldes
Perlero Frecuente
|
Registrado: 2011-01-22 12:56 @580 Mensajes: 118
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
|
hombre, si hablamos de un código incompleto ya no opino, desde luego tal y como estaba planteado ahí nunca funcionaría... el del enlace que pones probablemente sí lo haga.
> # USADO para esto,
veo que se ha corregido, pero no, debe decir lo que ponía inicialmente, lo entrecomillo para que no quede ambiguo
USA "DO" para esto
|
2011-12-14 07:03 @336 |
|
|
jacks
Perlero Frecuente
|
Registrado: 2011-04-05 11:14 @510 Mensajes: 148
|
|
|
Re: Acceder a base de datos MySQL desde script en Perl
|
|
Hola pvaldes. Yo no soy un experto en base de datos. De hecho sé poco sobre ese tema. Por eso quizás mis ideas o mis códigos te puedan parecer ridículos o muy poco eficaces.
He estado mirando la documentación de DBD::mysql y no he encontrado lo que quería, quizás puedas ayudarme.
Mi intención es que el programa que he hecho, cree un usuario con una contraseña. La primera vez que se ejecute el programa no existirá ese usuario con lo cual lo creará pero a partir de ese momento se conectará directamente cada vez que se ejecute.
El problema es que no sé como darle los privilegios al usuario que he creado parapoder crear bases de datos.
|
|
Página 1 de 1
|
[ 13 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|