• Publicidad

Perl y SQLite

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Perl y SQLite

Notapor explorer » 2015-07-24 06:34 @315

Pero, ¿a qué columnas? Las tienes definidas en la línea 43:

Vulnerabilidad Descripción Prueba Recomendaciones

Quiero decir, ¿qué distingue a una columna de otra según lo que sacas de la base de datos?

Nos falta mucha información...
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

Publicidad

Re: Perl y SQLite

Notapor situ » 2015-07-24 09:06 @421

Claro, así es. Ahora como tengo el script queda todo en la columna A del excel.

Digamos que:
    Vulnerabilidad es la columna A del excel
    Descripción es la columna B del excel
    Prueba es la columna C del excel
    Recomendaciones es la columna D del excel

Cuando hago el bucle sobre la base de datos, mi idea es guardar cada dato en su columna correspondiente.

Muchas gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Perl y SQLite

Notapor explorer » 2015-07-24 16:21 @723

Pues entonces haces lo que te digo: creas un hash que relacione el nombre con el índice de la columna:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @columnas = qw(
  2.   Vulnerabilidad        Descripción    Prueba Recomendaciones
  3. );
  4. my %columnas = map { $columnas[$_] => $_ } 0 .. $#columnas;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y así ya sabes en qué columna debes poner cada valor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $worksheet->write( $fila, $columnas{$testing[1]}, $testing[0], $files );
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: Perl y SQLite

Notapor situ » 2015-07-24 19:23 @849

Perdón que siga consultando pero no logro hacerlo andar. Debajo te dejo parte del script y el error que obtengo ahora.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Nombre de las columnas del TAB vulnerabilities
  2.     my @columnas = qw(
  3.       observacion riesgo recomendacion
  4.     );
  5.  
  6.     for ( my $i = 0 ; $i < @columnas ; $i++ ) {
  7.         $worksheet->write( 0, $i, $columnas[$i], $header );
  8.     }
  9.  
  10.     my %columnas = map { $columnas[$_] => $_ } 0 .. $#columnas;
  11.  
  12.     ## Formato para las filas
  13.     my $files = $workbook->add_format();
  14.     $files->set_border(1);
  15.     $files->set_border_color('black');
  16.  
  17.     ############ Listado de vulnerabilidades ############
  18.     print "\n\nListado de las vulnerabilidades almacenadas:\n";
  19.     my $sth = $dbh->prepare("SELECT issues FROM mitabla");
  20.     $sth->execute();
  21.     while ( my @row = $sth->fetchrow_array ) {
  22.         $contador++;
  23.         print "$contador - $row[0]\n";
  24.         $vulnerabilidades{$contador} = $row[0];
  25.     }
  26.  
  27.     ############ Listado de vulnerabilidades ############
  28.     print
  29. "\n\nIngrese el número o números de las vulnerabilidades, separados por comas: ";
  30.     chomp( my $issues = <> );
  31.     print "\n[+]Vulnerabilidad/es ingresada/s: [$issues]\n";
  32.  
  33.     my @numeros = split /,/, $issues;
  34.  
  35.     for my $numero (@numeros) {
  36.         $numero += 0;    # aseguramos que es un número
  37.  
  38.         if ( $vulnerabilidades{$numero} ) {
  39.             my $vulnera = $vulnerabilidades{$numero};
  40.  
  41.             print " [-]Exportando vulnerabilidad [$vulnera]\n";
  42.  
  43.             for my $issue (qw(observacion riesgo recomendacion)) {
  44.                 my $sth =
  45.                   $dbh->prepare("SELECT $issue FROM mitabla WHERE issues=?");
  46.                 $sth->execute($vulnera);
  47.                 push( @titulos, $sth->fetchrow_array );
  48.             }
  49.         }
  50.     }
  51.  
  52.     for my $testing (@titulos) {
  53.         $worksheet->write( 1 + $a, 0, $columnas{ $testing[0] }, $files );
  54.     }
  55.  
  56.     $sth->finish();
  57.     $dbh->disconnect();
  58.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Error:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Use of uninitialized value in scalar assignment at C:/Perl64/site/lib/Excel/Writer/XLSX/Worksheet.pm line 1829, <> line 1. 


Muchas gracias por la buena voluntad y predisposición.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Perl y SQLite

Notapor explorer » 2015-07-24 19:41 @862

No, no, no... Estamos liando cosas...

La creación de %columnas se refiere al array @columnas que contiene los nombres de las columnas de la hoja, no las columnas de las SQL que estamos extrayendo.

El error que sale está diciendo que $testing[0] contiene un valor que no corresponde a ninguno de los valores de las claves creadas para %columnas. Si lo hubieras dejado como te puse en el mensaje anterior, %columnas contendría como claves los mismos nombres que las columnas de la hoja, que, estamos suponiendo, son justo los valores que estamos obteniendo de la base de datos.

Sigues usando $a, pero no la incrementas ni nada. En mi código la renombré a $fila, y se supone que se incrementa en alguna parte del bucle, para que se pinte la siguiente línea de la hoja de cálculo.

En la línea 47 estás almacenando en @titulos todos los resultados de las consultas a la base de datos, pero además, de todas las vulnerabilidades solicitadas por el usuario. Y cuando terminas, haces el bucle de las líneas 52 a 54, recorriendo esos valores. Y yo creo que eso no es correcto. Vamos a ver... las columnas están determinadas por los valores devueltos por la base de datos, pero ¿y las filas? ¿cómo se rellenan? Si hay que rellenar una fila por cada vulnerabilidad solicitada por el usuario, lo estamos haciendo mal colocando ese bucle fuera.

Repasa mi código anterior. Verás que uso $testing[0] y $testing[1], para saber en qué columnas pintar y qué pintar, pero la verdad es que no sé el aspecto real que tienen los resultados devueltos por la base de datos. Un pequeño ejemplo de eso y de cómo quedaría en la hoja, estaría bien.

Repasa con tranquilidad el orden de ejecución de las cosas. Programar no es ir poniendo las cosas "a ver si ahora funcionan". Programar es un arte parecido a la relojería: o funciona o no funciona. Y si funciona, es porque todo se realiza en la secuencia deseada.
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: Perl y SQLite

Notapor situ » 2015-07-24 20:03 @877

Perfecto, voy a leer nuevamente el código para ver dónde está el error y, como comentas, es así la idea: es llenar las filas del excel con los datos obtenidos de la base de datos.

Yo pensé que haciendo el bucle de @titulos iba a poder manejar esa parte pero veo que no.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $issue (qw(observacion riesgo recomendacion)) {
  2.     my $sth = $dbh->prepare("SELECT $issue FROM mitabla WHERE issues=?");
  3.     $sth->execute($vulnera);
  4.     push( @titulos, $sth->fetchrow_array );
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Muchas gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Perl y SQLite

Notapor situ » 2015-07-25 19:07 @838

Perdón, pero estuve probando y la verdad que no logro hacerlo funcionar. Tengo que seguir capacitándome en el lenguaje, sin duda.

El script final es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use DBI;
  3. use utf8;
  4. use Excel::Writer::XLSX;
  5. ############ Variables ############
  6. my $contador = 0;
  7. my %vulnerabilidades;
  8. my %informacion;
  9. my $workbook  = Excel::Writer::XLSX->new("reporte.xlsx");
  10. my $worksheet = $workbook->add_worksheet('Vulnerabilities');
  11. $worksheet->set_tab_color('red');
  12.  
  13. #$worksheet->autofilter( 0, 0, 999999, 14 );
  14. $worksheet->set_column( 0, 14, 20 );
  15.  
  16. ############ Conecto a la DB ############
  17. my $dbh = DBI->connect(
  18.     "dbi:SQLite:dbname=mitabla.s3db",
  19.     "", "",
  20.     {
  21.         RaiseError     => 1,
  22.         sqlite_unicode => 1,
  23.     },
  24. ) or die $DBI::errstr;
  25.  
  26. ########### Creamos el reporte ############
  27. ##Iniciadores de las variables q corresponden a las columnas
  28. $a = 0;
  29. $b = 0;
  30. $c = 0;
  31. ## Formato para los nombres de las columnas
  32. my $header = $workbook->add_format();
  33. $header->set_bold();
  34. $header->set_size(12);
  35. $header->set_color(0x09);
  36. $header->set_align('center');
  37. $header->set_fg_color(0x16);
  38. $header->set_border(1);
  39. $header->set_border_color('black');
  40. ## Nombre de las columnas del TAB vulnerabilities
  41. my @columnas = qw(
  42.   issues observacion recomendacion
  43. );
  44.  
  45. for ( my $i = 0 ; $i < @columnas ; $i++ ) {
  46.     $worksheet->write( 0, $i, $columnas[$i], $header );
  47. }
  48.  
  49. ## Formato para las filas
  50. my $files = $workbook->add_format();
  51. $files->set_border(1);
  52. $files->set_border_color('black');
  53.  
  54. ############ Listado de vulnerabilidades ############
  55. print "\n\nListado de las vulnerabilidades almacenadas:\n";
  56. my $sth = $dbh->prepare("SELECT issues FROM mitabla");
  57. $sth->execute();
  58. while ( my @row = $sth->fetchrow_array ) {
  59.     $contador++;
  60.     print "$contador - $row[0]\n";
  61.     $vulnerabilidades{$contador} = $row[0];
  62. }
  63.  
  64. ############ Listado de vulnerabilidades ############
  65. print
  66. "\n\nIngrese el número o números de las vulnerabilidades, separados por comas: ";
  67. chomp( my $issues = <> );
  68. print "\n[+]Vulnerabilidad/es ingresada/s: [$issues]\n";
  69.  
  70. my @numeros = split /,/, $issues;
  71.  
  72. for my $numero (@numeros) {
  73.     $numero += 0;    # aseguramos que es un número
  74.  
  75.     if ( $vulnerabilidades{$numero} ) {
  76.         my $vulnera = $vulnerabilidades{$numero};
  77.         print " [-]Exportando vulnerabilidad [$vulnera]\n";
  78.         for my $issue (qw(issues observacion recomendacion)) {
  79.             my $sth =
  80.               $dbh->prepare("SELECT $issue FROM mitabla WHERE issues=?");
  81.             $sth->execute($vulnera);
  82.             while ( my @row = $sth->fetchrow_array ) {
  83.  
  84.                 #$worksheet->write( 1+$a, 0, $row[0], $files );
  85.                 my $info = $informacion{ $row[0] };
  86.             }
  87.         }
  88.     }
  89. }
  90.  
  91. $sth->finish();
  92. $dbh->disconnect();
  93.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Hago lo siguiente:
- Con el bucle de la línea 50 creo los títulos a las columnas del excel
- Con el bucle de la línea 83 comienzo a buscar en la base de datos la información de la columna "issues", "observacion" y por último, "recomendacion".

Cuando comienzo a buscar en la base de datos voy a obtener en cada columna. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
issues: cross-site scripting
observacion: es una vulnerabilidad que permite inyectar código javascript
recomendacion: recomiendo filtrar caracteres
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El excel debería quedar así:
Imagen
Y como las vulnerabilidades las ingreso separadas por comas, voy a obtener la información de cada una y la voy a guardar en el excel.

Muchas gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Perl y SQLite

Notapor explorer » 2015-07-25 20:26 @893

Pues entonces es muy sencillo: no necesitas siquiera un hash.

Con un par de variables, una que se llame $fila y otra que se llame $columna, te vale.

En el bucle for() de la línea 72, vas incrementando el valor de $fila (estamos escribiendo una vulnerabilidad en cada fila por cada una de las seleccionadas por el usuario).

Y en el bucle for() de la línea 78, vas incrementando el valor de $columna.

Naturalmente, antes de los bucles, has inicializado esas dos variables. $fila = 1 antes del for() de la línea 72, y $columna = 1 antes del for() de la 78.

Al llegar a la línea 85 ya lo tienes todo: $fila, $columna y $row[0] contiene el texto sacado de la base de datos.
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: Perl y SQLite

Notapor situ » 2015-07-26 22:39 @985

Muchas gracias por la corrección.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Anterior

Volver a Básico

¿Quién está conectado?

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