• Publicidad

Recoger datos de un formulario

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Re: Recoger datos de un formulario

Notapor alavaros » 2010-05-26 06:11 @299

Buenas de nuevo,

Ahora quiero meter esos datos recogidos del formulario en una base de datos Oracle, tengo el siguiente código de prueba para conectarme a la base de datos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use DBI;
  3.  
  4. # variables a editar
  5. my $db_user = "mi_user";
  6. my $db_pass = "mi_pass";
  7. my $host_name = "mi_host";
  8. my $db_name = "mi_tabla";
  9. # vars
  10.  
  11. my $q_string = "DBI:oracle:host=$host_name;database=$db_name";
  12.  
  13. sub connect {
  14.     return (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));
  15. }
  16.  
  17. my $sth = $dbh->prepare("SELECT col1,col2 FROM mi_tabla;");
  18.  
  19. $sth->execute();
  20.  
  21. while ( @registro=$sth->fetchrow_array()) {
  22.         print "nombre:$registro[0]  almacenamiento:$registro[1]\n";
  23. }
  24.  
  25. $sth->finish();
  26.  
  27. $dbh->disconnect || warn "\nFallo al desconectar.\nError: $DBI::errstr\n";
  28.  
  29. 1;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


*Nota: las variables y las columnas en mi código son las correctas, pero me salta este error:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Apache/1.3.41 Server at 127.0.0.1 Port 80


¿Alguna idea? ¿Puede que sea que no tengo el módulo DBI? Tampoco sé cómo mirar si lo tengo o no.

Gracias de antemano.
alavaros
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-05-24 11:30 @521

Publicidad

Re: Recoger datos de un formulario

Notapor explorer » 2010-05-26 07:53 @370

Pero... ¿por qué estás ejecutando el programa a través del Apache?

En cuanto al programa, tienes definida la conexión a la base de datos dentro de una función, que no llamas desde ningún lado.

Un programa más sencillo sería así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use DBI;
  3.  
  4. # Variables a editar
  5. my $db_user   = "mi_user";
  6. my $db_pass   = "mi_pass";
  7. my $host_name = "mi_host";
  8. my $db_name   = "mi_tabla";
  9.  
  10. # Conexión
  11. my $dbh = DBI->connect(
  12.      "DBI:oracle:host=$host_name;database=$db_name", $db_user, $db_pass,
  13.      { PrintError => 0, RaiseError => 1 }
  14. );
  15.  
  16. # Preparación de la sentencia a ejecutar
  17. my $sth = $dbh->prepare("SELECT col1, col2 FROM mi_tabla;");
  18.  
  19. # Ejecución
  20. $sth->execute();
  21.  
  22. # Lectura del resultado
  23. while ( @registro = $sth->fetchrow_array() ) {
  24.     print "nombre:$registro[0]  almacenamiento:$registro[1]\n";
  25. }
  26. $sth->finish();
  27.  
  28. # Desconexión
  29. $dbh->disconnect();
  30.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero, repito, este programa está preparado para ser ejecutado desde la línea de comandos, no desde el Apache.

Otro tema muy distinto es que necesites ejecutarlo como un CGI, a través de una llamada con el Apache. Si se trata de crear un CGI, mira mi CGI Mínimo para comprobar que tienes bien configurado el servicio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recoger datos de un formulario

Notapor alavaros » 2010-05-27 10:06 @462

Vale, te comento más o menos lo que necesito hacer:

Tengo el formulario en HTML, con sus validaciones en JavaScript, en un archivo llamado formulatio.html, en una máquina UNIX, luego quiero recoger los datos del formulario y meterlos en una tabla de una base de datos Oracle. Dentro del mismo directorio tengo otro fichero, oracle.pl, que lo llamo desde el formulario al dar a enviar. He probado con tu cgi mínimo en oracle.pl, y funciona correctamente.

La pregunta es cómo debo recoger los datos, conectar con la base de datos y luego insertar una nueva fila con esos datos. Aún no tengo mucha idea de todo esto, pero para eso estamos aquí, ¿¿no??

Gracias.

¡Saludos!
alavaros
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-05-24 11:30 @521

Re: Recoger datos de un formulario

Notapor explorer » 2010-05-27 11:40 @527

Bien, entonces ese cgi oracle.pl que llamas desde la página html, lo que debe hacer es usar la técnica mostrada en el CGI mínimo para leer los parámetros. Más exactamente:

* Con param() sabemos si al cgi se le han pasado parámetros o no.
* Recogemos los parámetros.
* Abrimos la conexión a la base de datos Oracle.
* Creamos una sentencia SQL con INSERT o UPDATE (según las características de la base de datos).
* Hacemos un do() o un prepare()/execute() a la base de datos.
* Cerramos la base de datos.
* Al usuario le devolvemos un fichero HTML con el resultado de la operación (positiva o negativa)

En el código tienes un ejemplo de acceso, pero para hacer un SELECT. Solo hay que cambiar esa sentencia SQL por un INSERT o UPDATE, y ya casi lo tienes todo ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recoger datos de un formulario

Notapor alavaros » 2010-05-27 12:25 @559

Buenas de nuevo, he intentado lo que tu dices, seguramente mi código tendrá muchísimos fallos, pero tengo un fallo que no creo que sea de código (o sí, no lo sé), te lo pongo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Software error:

Can't locate DBI.pm in @INC (@INC contains: /usr/perl5/5.8.4/lib/i86pc-solaris-64int /usr/perl5/5.8.4/lib /usr/perl5/site_perl/5.8.4/i86pc-solaris-64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/i86pc-solaris-64int /usr/perl5/vendor_perl/5.8.4 /usr/perl5/vendor_perl .) at /var/apache/cgi-bin/oracle.pl line 5.
BEGIN failed--compilation aborted at /var/apache/cgi-bin/oracle.pl line 5.

For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

pero el módulo DBI sí que está, no sé por qué será.

Gracias de antemano.

Saludos
alavaros
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-05-24 11:30 @521

Re: Recoger datos de un formulario

Notapor explorer » 2010-05-27 13:13 @592

El error dice que el programa no encuentra al módulo DBI en ninguno de los directorios indicados.

Puede que esté, pero no en esos directorios.

Si está en otro directorio, se lo puedes indicar dentro del programa, con la ayuda de 'use lib "directorio";'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recoger datos de un formulario

Notapor alavaros » 2010-05-28 02:20 @138

Pues eso es lo raro, resulta que si está en alguno de esos directorios. He mirado en /usr/perl5/5.8.4/lib por probar, y esto es lo que contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AnyDBM_File.pm       ExtUtils             Sun                  cacheout.pl          newgetopt.pl
Attribute            Fatal.pm             Switch.pm            charnames.pm         open.pm
AutoLoader.pm        File                 Symbol.pm            complete.pl          open2.pl
AutoSplit.pm         FileCache.pm         Term                 constant.pm          open3.pl
B                    FileHandle.pm        Test                 ctime.pl             overload.pm
Benchmark.pm         Filter               Test.pm              dbm_filter_util.pl   perl5db.pl
CGI                  FindBin.pm           Text                 diagnostics.pm       pod
CGI.pm               Getopt               Tie                  dotsh.pl             pwd.pl
CPAN                 Hash                 Time                 dumpvar.pl           shellwords.pl
CPAN.pm              I18N                 UNIVERSAL.pm         exceptions.pl        sigtrap.pm
Carp                 IO                   Unicode              fastcwd.pl           sort.pm
Carp.pm              IPC                  User                 fields.pm            stat.pl
Class                List                 abbrev.pl            filetest.pm          strict.pm
DB.pm                Locale               assert.pl            find.pl              subs.pm
DBI.pm               Math                 attributes.pm        finddepth.pl         syslog.pl
DBM_Filter           Memoize              auto                 flush.pl             tainted.pl
DBM_Filter.pm        Memoize.pm           autouse.pm           getcwd.pl            termcap.pl
Devel                NEXT.pm              base.pm              getopt.pl            timelocal.pl
Digest               Net                  bigfloat.pl          getopts.pl           unicore
Digest.pm            PerlIO               bigint.pl            hostname.pl          utf8.pm
DirHandle.pm         PerlIO.pm            bigint.pm            i86pc-solaris-64int  utf8_heavy.pl
Dumpvalue.pm         Pod                  bignum.pm            if.pm                validate.pl
Encode               Scalar               bigrat.pl            importenv.pl         vars.pm
English.pm           Search               bigrat.pm            integer.pm           vmsish.pm
Env.pm               SelectSaver.pm       blib.pm              less.pm              warnings
Exporter             SelfLoader.pm        bytes.pm             locale.pm            warnings.pm
Exporter.pm          Shell.pm             bytes_heavy.pl       look.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y sin embargo salta ese error.

He probado con use lib "/usr/perl5/site_perl/5.8.4"; y ya no salta ese error, ahora hay otro, ¡je,je!, un error de sintaxis en esta línea:
my $sth = $dbh->prepare("INSERT INTO cintas ("nombre","almacenamiento") VALUES (param(nombre), param(almacenamiento))");

¿¿Qué error le ves??

Saludos
alavaros
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-05-24 11:30 @521

Re: Recoger datos de un formulario

Notapor explorer » 2010-05-28 04:06 @213

El error está en que Perl no interpola llamadas a funciones dentro de cadenas de texto (bueno, sí que puede, pero es muy feo). Y además hay comillas dobles dentro de otras comillas dobles.

Prueba a escribirlo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sth = $dbh->prepare('INSERT INTO cintas ("nombre", "almacenamiento") VALUES (?,?)');
  2. $sth->execute( param(nombre), param(almacenamiento) );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así, además, habrás aumentado el nivel de seguridad, ya que DBI se ocupará de escapar los argumentos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recoger datos de un formulario

Notapor alavaros » 2010-05-28 05:17 @262

Buenas, muchas gracias por la ayuda que me estás prestando, voy aprendiendo poco a poco, ¡je,je!

Sigo teniendo el mismo problema con el módulo DBI; he probado con use DBI (así simplemente me dice que no encuentra el módulo) con use lib "/usr/perl5/site_perl/5.8.4; y ahora también con use lib "/usr/perl5/site_perl/5.8.4/DBI, y el error ahora es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Status: 500 Content-type: text/html
Software error:

Can't locate object method "connect" via package "DBI" (perhaps you forgot to load "DBI"?) at /var/apache/cgi-bin/oracle.pl line 32.

For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
alavaros
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2010-05-24 11:30 @521

Re: Recoger datos de un formulario

Notapor explorer » 2010-05-28 06:07 @296

A ver... el use lib sirve para decir dónde tiene que mirar Perl para buscar los módulos. Pero a continuación debes cargarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use lib '/usr/perl5/site_perl/5.8.4';
use DBI;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Una cosa... en la lista de módulos mostrada antes, no aparece el DBD::Oracle, que es el que DBI necesitará. Es posible que los errores que ves del DBI en realidad se refieren a que no encuentra DBD::Oracle.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Web

¿Quién está conectado?

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

cron