• Publicidad

Uso de CGI::Session

¿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.

Uso de CGI::Session

Notapor seafree » 2014-09-29 15:02 @668

Ayuda, explorer. No logro usar el módulo de CGI-Session-4.48.tar a pesar de leer el tutorial de CPAN. Intento e intento y no lo logro, te muestro el código:

Script1:
use CGI;
use CGI qw':standard *table';
use DBI;
use POSIX;
use CGI::Session;
use CGI qw(:standard :netscape :shortcuts);
use CGI::Carp qw 'fatalsToBrowser warningsToBrowser';

###################################
#######Object Initialization#######
###################################
$session = CGI::Session->new();
$CGISESSID= $session->id();
print $session->header();

###RECIBO PARAMETROS

my $p_event = param("evento");
my $f_ini = param("date1");
my $f_fin = param("date2");

##################################
##ALMACENANDO DATOS EN LA SESION##
##################################

$session->param('evento',$p_event);
$session->param('date1',$f_ini);
$session->param('date2',$f_fin);

<form name="forma1" method="post" action="pwd_costos.cgi">
.
.
</form>
# Empleo de botón controlado de submit para controlar quienes pueden visualizar costos

<input type="submit" style="font:arial; color:#ffffff; background:#639c18" value="Costos">&nbsp;&nbsp;&nbsp;&nbsp;


Script2: pwd_costos

#! /usr/bin/perl -w
# pwd_costos.cgi
use strict;
use warnings;
use CGI qw(:standard :netscape :shortcuts);
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
use Switch;

##########################
# Object initialization: #
##########################
my $session = CGI::Session->new();
my $CGISESSID= $session->id();
print $session->header();

###--- RECUPERANDO DATOS DE MENU ---###
my $vengo_de = param('vengo_de');
#print "VENGO DE menu: $vengo_de <br>";
#sleep (5);

ESTOS ERRORES ME APARECEN:
Global symbol "$session" requires explicit package name at /var/www/cgi-bin/sifamep/pwd_costos.cgi
Global symbol "$CGISESSID" requires explicit package name at /var/www/cgi-bin/sifamep/pwd_costos.cgi


Gracias por tu valiosa ayuda.
Última edición por explorer el 2014-09-29 15:44 @697, editado 1 vez en total
Razón: modulo => módulo;
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: Uso de CGI::Session

Notapor explorer » 2014-09-29 17:01 @751

Yo interpreto los mensajes de error como que no ha funcionado el new() de CGI::Session. Con el método de clase errstr() se puede saber qué ha pasado.

Ponlo así:

$session = CGI::Session->new() or die CGI::Session->errstr();

De todas maneras... no es obvio el manejo de todo esto.

Al final, sí que se trata de poner unas pocas líneas... pero... hay que aprender media docena de conceptos, para poder saber qué líneas y en qué orden deben ponerse. Y que no es lo mismo crear una sesión, que acceder a los parámetros almacenados en la sesión. Y cómo resolver esto en un solo código (lo normal) o en varios. O la forma de almacenar las sesiones (¿será una cookie o en el URL? ¿se almacenará en un archivo de texto o en una base de datos SQL?)

No queda más que leer los tutoriales, y ver los ejemplos.

Aquí hemos hablado unas cuantas veces del tema:

Los ejemplos que has puesto no siguen la recomendación de cómo iniciar el manejo de las sesiones.

Quiero decir, el módulo CGI::Session permite hacer y manejar sesiones de muchas formas, y eso es lo que lo lía: en lugar de dar un método sencillo, primero explica todos los detalles, y uno se lía entre el new() y el load(). Luego se mira el tutorial y empieza a entender "algo". Pero es lioso. Si lees lo que hace new(), piensas que sirve para crear una sesión, o recrearla, pero no es hasta el final de new() cuando lo explica.

Y finalmente, el cookbook, para ver ejemplos concretos, y por fortuna, alguno se ajustará a lo que se necesita.

Ahí se recomienda, por ejemplo, que, para simplificar, todos los programas empiecen así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         use CGI::Session;
  2.         use CGI;
  3.  
  4.         my $cgi = new CGI;
  5.         my $session = CGI::Session->new(undef, $cgi, {Directory=>'/tmp'});
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
(Naturalmente, si no queremos guardar las sesiones en '/tmp', debemos personalizar la última línea).

Eso lo que hace es crear la sesión si antes no existía, o recrear la sesión si existía. Con la ayuda del objeto $cgi creado por el módulo CGI, CGI::Session es capaz de distinguir los dos casos.

Y luego, cuando el programa esté preparado para sacar el resultado, se puede mandar el ID de sesión por medio de una cookie (aunque hay más formas, claro):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $cookie = $cgi->cookie(CGISESSID => $session->id );         # crear cookie
  2.     print $cgi->header(-cookie=>$cookie);                       # enviar la cookie en la cabecera
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Así que... tanto rollo para al final ser cuatro líneas.

Bueno, en realidad no es tan simple. Tuve que hacer pruebas para ver que las sesiones se creasen -y caducasen- de forma correcta. Y, a veces, decantarme por la solución propuesta en load() para detectar sesiones expiradas e informar al usuario de tal evento.

P.D.: la tecnología CGI está desapareciendo del mundo Perl, en favor de Mojolicious, Dancer, Catalyst... que ocultan mucho de esta complejidad.
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: Uso de CGI::Session

Notapor seafree » 2014-10-08 15:21 @681

Hola, explorer, continúo con las fallas en las sesiones. Verás, en el
Script1:
#!/usr/bin/perl
use v5.8.8;
use strict;
use perlchartdir;
use CGI;
use CGI qw':standard *table';
use DBI;
use POSIX;
use CGI::Session;
use CGI qw(:standard :netscape :shortcuts);
use CGI::Carp qw 'fatalsToBrowser warningsToBrowser';
print "Content-type: text/html\n\n"; ######---Esta linea dice, que de ahí­ en adelante todo el "print" se va a desplegar como HTML.
###################################
#######Object Initialization#######
###################################
my $query= new CGI;
my $session = CGI::Session->new() or die CGI::Session->errstr();
my $cookie= $query->cookie(-name=>$session->name,
-value=>$session->id);
print $session->header();
###RECIBO PARÁMETROS

my $p_event = "disparo";
my $f_ini = "2014-08-01";
my $f_fin = "2014-08-31";

##################################
##ALMACENANDO DATOS EN LA SESIÓN##
##################################

$session->param('evento',$p_event);
$session->param('date1',$f_ini);
$session->param('date2',$f_fin);

<form name="forma1" method="post" action="pwd_costos.cgi">

.

Script2: pwd_costos

#! /usr/bin/perl -w
# pwd_costos.cgi
use strict;
use warnings;
use CGI qw(:standard :netscape :shortcuts);
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
use Switch;

##########################
# Object initialization: #
##########################
my $query = CGI::Session->new();

my $session = CGI::Session->new() or die CGI::Session->errstr();
my $cookie= $query->cookie(-name=>$session->name,
-value=>$session->id);
print $session->header();
# Send proper HTTP header with cookies

###--- RECUPERANDO DATOS DE MENÚ ---###

my $evento= $session->param("evento");
my $f_ini= $session->param("date1");
my $f_fin= $session->param("date2");

print "PARÁMETROS: $vengo_de - $f_ini - $f_fin <br>";

EN ESTA ÚLTIMA LÍNEA PASA QUE CUANDO ES LA PRIMERA VEZ LOS DATOS VAN VACÍOS, TENGO QUE RECARGAR EL SCRIPT 1 PARA QUE SE CREEN LAS VARIABLES DE SESIÓN, SINO NO SE CREAN, ME PODRÍAS AUXILIAR CON LO QUE ESTOY OMITIENDO.

GRACIAS POR TU VALIOSA AYUDA.
Última edición por explorer el 2014-10-08 16:10 @715, editado 2 veces en total
Razón: continuo => continúo; veraz => Verás; SESION => SESIÓN; PARAMETROS => PARÁMETROS; linea => línea; ahí => ahí; MENU => MENÚ; ULTIMA => ÚLTIMA; VACIOS => VACÍOS; SESION => SESIÓN; PODRIAS => PODRÍAS;
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Uso de CGI::Session

Notapor explorer » 2014-10-08 19:02 @835

  • tienes dos veces un 'use CGI'. Te sobra el primero.
  • usar print "Content-type: text/html\n\n"; es una barbaridad estando usando el módulo CGI. De hecho, esa línea sobra, ya que lo que hace ese print es lo mismo que hace la línea print $session->header();, pero esta segunda línea es mejor porque se envía la cookie creada antes.
  • creas una cookie con el nombre de sesión e id, pero... no es necesario: la sesión ya guarda esos datos. No necesitas entonces ninguna cookie. De hecho, luego no haces nada con ella.
  • en el primer script estás guardando siempre los mismos parámetros porque no haces control de si ya están puestos. Supongo que lo habrás hecho para hacer pruebas.
Según lo que veo es correcto: es necesario ejecutar el primer programa para crear los parámetros de la sesión. Mejor dicho: crear la sesión. La información de qué sesión es se guarda en el lado del usuario (quizás una cookie) y los parámetros de la sesión en el servidor.

No sé muy bien qué es lo que quieres hacer.

Por favor, te aconsejo que te leas, con calma, este mensaje: Control de acceso CGI::Session Aunque está centrado en el control de acceso de usuarios, da una visión muy buena de cómo usar CGI::Session, con cookies, sin cookies, con control de sesiones, sesiones expiradas, etc.

Y acostúmbrate a rodear tu código Perl con las marcas de código. Será más fácil de leer.
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: Uso de CGI::Session

Notapor seafree » 2014-10-10 09:56 @455

Gracias, explorer, ten la seguridad que seguiré tus recomendaciones.
Mil gracias por el apoyo.
Última edición por explorer el 2014-10-10 10:17 @470, editado 1 vez en total
Razón: seguire => seguiré;
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Intermedio

¿Quién está conectado?

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