• Publicidad

Consulta a MySql

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Consulta a MySql

Notapor oihantze » 2009-08-27 04:33 @231

¡¡Hola a todos!!! Estoy haciendo un programa el cual accede a la base de datos. Ya he hecho unos cuantos y todos me han funcionado sin ninguna pega pero en éste algo falla... Resulta que la consulta que está marcada con asteriscos (*****), a la hora de ejecutarla en la consola me devuelve 6 resultados, pero a la hora de hacerlo con Perl solo me devuelve el primer resultado de los que me devuelve haciendo la consulta manualmente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. #nos conectamos con la base de datos para luego poder acceder a eso documentos
  4. use DBI;
  5.  
  6. $db="documentos";
  7. $host="localhost";
  8. $port="3306"; # puerto mysql
  9. $usuario="root";
  10. $pw="database";
  11.  
  12. #realizamos la conexion a la base de datos                              
  13. $connectionInfo="DBI:mysql:database=$db;$host;$port";
  14. $conexion=DBI->connect($connectionInfo,$usuario,$pw);
  15.  
  16.  
  17. #tendremos que ordenar los articulos por autor y haremos tantos grupos como autores haya,los cogeremos de autor_escribe, para ello tendremos q coger el codigo del autor y con el ir a la tabla de autores y acceder al nombre asignado a ese cogido, ese nombre sera el nombre del grupo , y para asignarle articulos cogeremos el codigo_articulo de la tabla autor_escribe e iremos a la tabla articulos y con ese codigo cogeremos el link y el titulo relacionado.
  18.  
  19. open(RESULTADO, ">jerarquia_autor.txt");
  20.  
  21. $count="SELECT count(distinct codigo_autor) FROM autores";
  22. $consulta=$conexion->prepare($count);
  23. $consulta->execute();
  24. @data = $consulta->fetchrow_array(); #nos deja en el array el número de autores que hay
  25. $consulta->finish();
  26. $num_autores="$data[0]";
  27.  
  28. # la tabla autores tiene dos campos: codigo_autor y nombre.
  29. my ($titulo,$link);
  30. $cont="1";
  31. while ($cont le $num_autores){
  32.         $query="SELECT nombre FROM autores where codigo_autor=$cont";  
  33.         $consulta=$conexion->prepare($query);
  34.         $consulta->execute();
  35.         @data = $consulta->fetchrow_array();#nos deja en el array el nombre del autor que tiene el código indicado en la consulta
  36.         $consulta->finish();
  37.  
  38.         print RESULTADO $data[0]."\n"; # escribe en el fichero el nombre del autor, que coincidirá con el nombre de cada grupo
  39.  
  40. #ahora quiero que me coja todos los códigos de los artículos que escribe ese autor, para eso voy a la tabla autor_escribe que tiene dos campos (cod_articulo y cod_autor) y hago la siguiente consulta
  41.  
  42.         $query="SELECT cod_articulo FROM autor_escribe where cod_autor=$cont";  #**********ESA CONSULTA ME DA MAL********************
  43.         $consulta=$conexion->prepare($query);
  44.         $consulta->execute();
  45.         @articulos = $consulta->fetchrow_array(); ####solo tienen el primer artículo en vez de todos(en la consola con la misma query devuelve todos)
  46.         $consulta->finish();
  47.  
  48. # por cada articulo iría a la tabla artículos con el cod_articulo y cogería los datos que me interesan
  49.         foreach $articulo (@articulos){
  50.                 $query="SELECT identificativo,tittle FROM articulos where codigo=$articulo";   
  51.                 $consulta=$conexion->prepare($query);
  52.                 $consulta->execute();
  53.                 @data = $consulta->fetchrow_array();#nos deja en el array los datos del resultado de la consulta
  54.                 $consulta->finish();
  55.                 $titulo="$data[0]";
  56.                 $link="$data[1]";
  57.  
  58.                 print RESULTADO "\t".$titulo."\n";
  59.                 print RESULTADO "\t"."\t".$link."\n";
  60.  
  61.         }
  62.        
  63.         $cont++;
  64. }
  65.  
  66. print RESULTADO " Artículos sin autor conocido";
  67. $query="SELECT cod_articulo FROM autor_escribe where cod_autor=0";     
  68. $consulta=$conexion->prepare($query);
  69. $consulta->execute();
  70. @articulos = $consulta->fetchrow_array(); #nos deja en el array los datos del resultado de la consulta
  71. $consulta->finish();
  72.  
  73. foreach $articulo (@articulos){
  74.         $query="SELECT identificativo,tittle FROM articulos where codigo=$articulo";   
  75.         $consulta=$conexion->prepare($query);
  76.         $consulta->execute();
  77.         @data = $consulta->fetchrow_array();#nos deja en el array los datos del resultado de la consulta
  78.         $consulta->finish();
  79.         $titulo="$data[0]";
  80.         $link="$data[1]";
  81.  
  82.         print RESULTADO "\t".$titulo."\n";
  83.         print RESULTADO "\t"."\t".$link."\n";
  84. }
  85.  
  86. close(RESULTADO);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Bueno, si alguien tiene alguna idea de cómo lo puedo hacer, por favor, que me ayude, porque ¡¡¡estoy ya desesperada!!! ¡¡¡¡Gracias por adelantado!!!!
Última edición por explorer el 2009-08-27 05:00 @250, editado 1 vez en total
Razón: Ortografía, q->que, jerarquia se escribe con 'j'.
oihantze
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-12 17:13 @759

Publicidad

Re: Consulta a MySql

Notapor explorer » 2009-08-27 05:14 @260

El problema está en el uso de la función fetchrow_array().

Según la documentación de DBI, esta función nos devuelve la siguiente fila del conjunto de resultados. Si no hay más, nos devuelve el valor undef.

Lo que tienes que hacer es rodear las líneas con una condición while(), para repetir el proceso por cada línea del resultado de la query.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (my @articulo = $consulta->fetchrow_array()) {
    my $articulo = $articulo[0]; # el resultado está en el primer campo
    $query="SELECT identificativo,tittle FROM articulos where codigo=$articulo";
    # ... sigue ...
}
$consulta->finish();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otra opción es recuperar todos los valores, que es justo lo que quieres (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $articulos_ref = $consulta->fetchall_arrayref();
$consulta->finish();
for my $articulo_ref (@$articulos_ref) {
    my $articulo = $articulo_ref->[0];
    # ... sigue con la consulta ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta a MySql

Notapor oihantze » 2009-08-27 06:22 @307

¡¡¡Muchas, muchas, muchas gracias!!!

Llevaba con este problema... ni sé el tiempo y ya me estaba dando ¡¡¡hasta dolores de cabeza!!!

Me ha funcionado con la segunda opción que me has puesto; con la primera me daba unos cuantos errores.

¡¡¡¡Eskerrik asko otra vez!!!!
oihantze
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-07-12 17:13 @759


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados