Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Recoger datos de un formulario Responder al tema
Nuevo tema


Página 1 de 2  [ 24 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota Mié Mar 29, 2006 6:24 pm

Perlero Nuevo
Registrado: Sab Mar 18, 2006 6:23 pm
Mensajes: 4
Recoger datos de un formulario
Hola a todos. He aquí de nuevo necesitando vuestra ayuda mientras me voy sumergiendo en este lenguaje tan interesante. Resulta que he creado un formulario en HTML que envía un sólo campo (el del nombre) mediante POST al cgi siguiente.

Código:
#! /usr/bin/perl -w

use CGI qw/:standard/;
my $FORM;
my $nombre;
#my $buffer;
my $numero;
$numero = 5;
print "Content-type: text/html\n\n";
read(STDIN, $FormData, $ENV{'CONTENT_LENGHT'});

@pairs = split(/&/, $FormData);

foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);

   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$FORM{'nombre'} = $nombre;
print "Hola $nombre\n";


Por algún motivo cuando ejecuto el cgi no me muestra en pantalla el $nombre. He revisado todo creo, en el HTML al campo del formulario nombre le puse como atributo name="nombre" por tanto creo que no es problema de eso. ¿Alguna sugerencia?

Gracias por vuestra ayuda :D


Nota Mié Mar 29, 2006 6:42 pm
Avatar de Usuario
Creador de Perl en Español
Registrado: Mié Oct 15, 2003 4:52 pm
Ubicación: México
Mensajes: 1163
Hola:

La primera recomendación que te puedo hacer es eliminar todas esas líneas de código con las que lees los parametros recibidos y sustituirlas por unas sencillas líneas:

Código:
#!/usr/bin/perl -w

use strict;
use CGI;

my $query = new CGI;
my %FORM = $query->Vars;


print "Content-type: text/html\n\n";
print "Hola $FORM{'nombre'}\n";

exit(1);


Y a poco no se ve más bonito :wink:


Saludos

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota Jue Mar 30, 2006 4:43 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Es más, incluso hasta te puedes ahorrar el enviar el Content-Type:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use CGI qw/:standard/;
  5.  
  6. my $query = new CGI;
  7. my %FORM = $query->Vars;
  8.  
  9. print  $query->header,
  10.        $query->start_html("Mi formulario web"),
  11.        "Hola $FORM{nombre}\n",
  12.        $query->end_html;
  13.  
  14. exit(1);

Fíjate que realmente estoy componiendo una página html, porque eso es lo que se indica en el Content-Type. Si envías texto normal y corriente, deberás cambiar el header por header("text/plain").


Nota Jue Mar 30, 2006 4:59 pm

Perlero Nuevo
Registrado: Sab Mar 18, 2006 6:23 pm
Mensajes: 4
Muchas gracias a ambos por la ayuda, al final seguí vuestras sugerencias y lo conseguí! El problema que tenía también con mi código inicial era que lo estaba editando con Kate, y éste por defecto codifica los caracteres como UTF-8 por eso me estaba dando problemas. Al reescribir el código en Emacs (que codifica en ASCII) me funcionó también a la primera.

Mil gracias y saludos :-)


Nota Sab Jul 15, 2006 12:00 pm
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
En el menú Herramientas->Codificación se puede cambiar la codificación que se usará en Kate. Y naturalmente, en la configuración.


Nota Lun May 24, 2010 11:36 am

Perlero Nuevo
Registrado: Lun May 24, 2010 11:30 am
Mensajes: 9
Re: Recoger datos de un formulario
Buenas, estoy intentando recoger los datos de mi formulario, y he usado el mismo código que aquí publicáis, pero no me funciona. Soy un poco novato aún y no sé cuál es el error. Os pego el código para ver si podéis ayudarme.
Formulario:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <FORM action="/cgi-bin/oracle.pl" method="post">
  6. <LABEL for="nombre">Nombre (Quien saca la cinta): </LABEL><br>
  7. <INPUT type="text" id="nombre"><BR>
  8. <LABEL for="cintas">Cintas: </LABEL><br>
  9. <textarea type="text" id="cintas"></textarea><BR>
  10. <LABEL for="almacenamiento">Lugar almacenamiento: </LABEL><br>
  11. <INPUT type="text" id="almacenamiento"><BR><br>
  12. <INPUT type="submit" value="Enviar"> <INPUT type="reset">
  13. </FORM>
  14. </body>
  15. </html>


cgi (es un archivo .pl):
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use CGI qw/:standard/;
  5.  
  6. my $query = new CGI;
  7. my %FORM = $query->Vars;
  8.  
  9. print  $query->header,
  10.        $query->start_html("Mi formulario web"),
  11.        "Hola $FORM{nombre}\n",
  12.        $query->end_html;
  13.  
  14. exit(1);


Y tan solo me muestra "Hola";

Muchas gracias de antemano y un saludo.


Nota Lun May 24, 2010 3:50 pm
Avatar de Usuario
Perlero Nuevo
Registrado: Lun May 03, 2010 7:42 am
Ubicación: Girona
Mensajes: 55
Re: Recoger datos de un formulario
Prueba a cambiar "Hola $FORM{nombre}\n", por "Hola $FORM{'nombre'}\n", No se si en los hash influye las comillas, pero pondría la mano en el fuego que sí.

Te aconsejo poner al principio del código: use CGI::Carp; así te saldrán todos los errores que se encuentre en el propio navegador (a mi me va de muerte, ¡je,je,je!)


Nota Lun May 24, 2010 3:53 pm
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Recoger datos de un formulario
El problema está en el código HTML: en los elementos de entrada de texto, les has definido sus id (que sirven para ser referenciados desde el JavaScript), pero no les has definido sus name (nombre) para que sean referenciados desde los parámetros enviados por el POST.

Quedaría, por ejemplo:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <FORM action="/cgi-bin/oracle.pl" method="post">
  6. <LABEL for="nombre">Nombre (Quien saca la cinta): </LABEL><br>
  7. <INPUT type="text" name="nombre"><BR>
  8. <LABEL for="cintas">Cintas: </LABEL><br>
  9. <textarea type="text" name="cintas"></textarea><BR>
  10. <LABEL for="almacenamiento">Lugar almacenamiento: </LABEL><br>
  11. <INPUT type="text" name="almacenamiento"><BR><br>
  12. <INPUT type="submit" value="Enviar"> <INPUT type="reset">
  13. </FORM>
  14. </body>
  15. </html>

_________________
JF^D Perl programming


Nota Mar May 25, 2010 8:22 am

Perlero Nuevo
Registrado: Lun May 24, 2010 11:30 am
Mensajes: 9
Re: Recoger datos de un formulario
Muchas gracias explorer, era justo eso, ya funciona.

Ahora me gustaría preguntarte más cosas, una de ellas es que en el formulario HTML tengo que meter un par de campos para fecha y hora, para empezar no sé si existe un tipo de campo fecha en HTML, o si tengo que poner un simple textbox. ¿Alguna idea?

Saludos.


Nota Mar May 25, 2010 10:15 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Recoger datos de un formulario
No, no existe. Sí que existen controles más elaborados que registren la entrada a lo que deseemos e incluso algunos que muestran un calendario, por ejemplo, pero no forman parte de la biblioteca básica de componentes HTML, sino que se crean con más código HTML y JavaScript.

Te recomiendo que leas algún manual sobre HTML.

_________________
JF^D Perl programming


Nota Mié May 26, 2010 6:11 am

Perlero Nuevo
Registrado: Lun May 24, 2010 11:30 am
Mensajes: 9
Re: Recoger datos de un formulario
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:
Syntax: [ Download ] [ Hide ]
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;


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

Please contact the server administrator, you@yourhost.com 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.


Nota Mié May 26, 2010 7:53 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Recoger datos de un formulario
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):
Syntax: [ Download ] [ Hide ]
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.  

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


Nota Jue May 27, 2010 10:06 am

Perlero Nuevo
Registrado: Lun May 24, 2010 11:30 am
Mensajes: 9
Re: Recoger datos de un formulario
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!


Nota Jue May 27, 2010 11:40 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9518
Re: Recoger datos de un formulario
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


Nota Jue May 27, 2010 12:25 pm

Perlero Nuevo
Registrado: Lun May 24, 2010 11:30 am
Mensajes: 9
Re: Recoger datos de un formulario
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:
Syntax: [ Download ] [ Hide ]
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 (you@yourhost.com), giving this error message and the time and date of the error.

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

Gracias de antemano.

Saludos


Responder al tema  [ 24 mensajes ]  Ir a página 1, 2  Siguiente

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

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO