Mié Mar 29, 2006 6:24 pm |
|
|
xoan
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 
|
Mié Mar 29, 2006 6:42 pm |
|
|
 |
kidd
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 Saludos
_________________ Uriel Lizama Perl programmer fundador de Perl en Español
|
Jue Mar 30, 2006 4:43 am |
|
|
 |
explorer
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: Using perl Syntax Highlighting #!/usr/bin/perl -w
use strict;
use CGI qw/:standard/;
my $query = new CGI;
my %FORM = $query->Vars;
print $query->header,
$query->start_html("Mi formulario web"),
"Hola $FORM{nombre}\n",
$query->end_html;
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").
|
Jue Mar 30, 2006 4:59 pm |
|
|
xoan
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 
|
Lun May 24, 2010 11:36 am |
|
|
alavaros
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: Using html4strict Syntax Highlighting <html>
<head>
</head>
<body>
<FORM action="/cgi-bin/oracle.pl" method="post">
<LABEL for="nombre">Nombre (Quien saca la cinta): </LABEL><br>
<INPUT type="text" id="nombre"><BR>
<LABEL for="cintas">Cintas: </LABEL><br>
<textarea type="text" id="cintas"></textarea><BR>
<LABEL for="almacenamiento">Lugar almacenamiento: </LABEL><br>
<INPUT type="text" id="almacenamiento"><BR><br>
<INPUT type="submit" value="Enviar"> <INPUT type="reset">
</FORM>
</body>
</html>
cgi (es un archivo .pl): Using perl Syntax Highlighting #!/usr/bin/perl -w
use strict;
use CGI qw/:standard/;
my $query = new CGI;
my %FORM = $query->Vars;
print $query->header,
$query->start_html("Mi formulario web"),
"Hola $FORM{nombre}\n",
$query->end_html;
exit(1);
Y tan solo me muestra "Hola"; Muchas gracias de antemano y un saludo.
|
Lun May 24, 2010 3:53 pm |
|
|
 |
explorer
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: Using html4strict Syntax Highlighting <html>
<head>
</head>
<body>
<FORM action="/cgi-bin/oracle.pl" method="post">
<LABEL for="nombre">Nombre (Quien saca la cinta): </LABEL><br>
<INPUT type="text" name="nombre"><BR>
<LABEL for="cintas">Cintas: </LABEL><br>
<textarea type="text" name="cintas"></textarea><BR>
<LABEL for="almacenamiento">Lugar almacenamiento: </LABEL><br>
<INPUT type="text" name="almacenamiento"><BR><br>
<INPUT type="submit" value="Enviar"> <INPUT type="reset">
</FORM>
</body>
</html>
_________________ JF^D Perl programming
|
Mar May 25, 2010 8:22 am |
|
|
alavaros
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.
|
Mié May 26, 2010 6:11 am |
|
|
alavaros
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: Using perl Syntax Highlighting #!/usr/bin/perl -w
use DBI;
# variables a editar
my $db_user = "mi_user";
my $db_pass = "mi_pass";
my $host_name = "mi_host";
my $db_name = "mi_tabla";
# vars
my $q_string = "DBI:oracle:host=$host_name;database=$db_name";
sub connect {
return (DBI->connect ($q_string, $db_user, $db_pass, {PrintError => 0, RaiseError => 1}));
}
my $sth = $dbh->prepare("SELECT col1,col2 FROM mi_tabla;");
$sth->execute();
while ( @registro=$sth->fetchrow_array()) {
print "nombre:$registro[0] almacenamiento:$registro[1]\n";
}
$sth->finish();
$dbh->disconnect || warn "\nFallo al desconectar.\nError: $DBI::errstr\n";
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.
|
Mié May 26, 2010 7:53 am |
|
|
 |
explorer
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): Using perl Syntax Highlighting #!/usr/bin/perl
use DBI;
# Variables a editar
my $db_user = "mi_user";
my $db_pass = "mi_pass";
my $host_name = "mi_host";
my $db_name = "mi_tabla";
# Conexión
my $dbh = DBI->connect(
"DBI:oracle:host=$host_name;database=$db_name", $db_user, $db_pass,
{ PrintError => 0, RaiseError => 1 }
);
# Preparación de la sentencia a ejecutar
my $sth = $dbh->prepare("SELECT col1, col2 FROM mi_tabla;");
# Ejecución
$sth->execute();
# Lectura del resultado
while ( @registro = $sth->fetchrow_array() ) {
print "nombre:$registro[0] almacenamiento:$registro[1]\n";
}
$sth->finish();
# Desconexión
$dbh->disconnect();
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
|
Jue May 27, 2010 10:06 am |
|
|
alavaros
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!
|
Jue May 27, 2010 11:40 am |
|
|
 |
explorer
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
|
Jue May 27, 2010 12:25 pm |
|
|
alavaros
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: 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
|
| 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 |
 |
|