• Publicidad

Ayuda

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

Notapor kidd » 2005-05-13 17:09 @756

Hola:

Limpié un poco el código:

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

use CGI ':standard';
use DBI; #Inicio del DBI
use CGI::Session qw/-api3/; #Incio de una Sesion CGI

print header;
  my $sid = cookie(CGISESSID); #Permite mantener la sesion por medio de la cookie creada
  my $session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});

  my $username = $session->param('username'); #obtiene el parametro de la sesion
  my $ID = $session->param('ID'); #obtiene el parametro de la sesion

my ($dbh, $sth);

$dbh = DBI->connect('DBI:mysql:Tickets') or die "Couldn't connect to database: " . $DBI->errstr;
   $sth = $dbh->prepare("SELECT * FROM usuario WHERE username = ? LIMIT 1") or die "Couldn't prepare statement: " . $dbh->errstr;
   $sth->execute($username); # Ejecuta el query para validar que existe el usuario

      my ($nombre,$apellidopat,$apellidomat) = $sth->fetchrow_array();

   $sth->finish;
$dbh->disconnect;

exit(1);


Lo primero que hice, suponiendo que nada más vas a recibir el registro de un sólo usuario, mejor salvas de una vez los datos en las variables correspondientes cuando haces el fetchrow_array.

Lo segundo, es que cuando llamas al nuevo objeto DBI, no estás mandando ni el username ni la contraseña para conectarte al database, no sé si esta permitido conectarse de esta manera a tu database, de lo contrario nunca podrás abrir la conexión.

La sintáxis podría ser algo así:

Código: Seleccionar todo
my $q_string = "DBI:mysql:host=[HOST];database=[DATABASE]";

$dbh = DBI->connect($q_string, $user, $password,
                      { RaiseError => 1, AutoCommit => 0 });


La línea de $qstring contiene los siguientes componentes:

DBI:
[MÓDULO]: En ese caso sería mysql
host=[HOST]; El host al que te vas a conectar. Lo más seguro es que sea localhost
database=[DATABASE] El nombre del database al que te vas a conectar. En este caso sería Tickets.


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Publicidad

Ayuda

Notapor Marcos » 2005-05-18 10:22 @473

Ok gracias estoy siguendo tus consejos, oie una pregunta en la ultima parte donde me indicas el codigo de conexion a la DB eso lo debo de hacer en todas los programas q realicen esa conexion :?:
J.Marcos Cardozo H.
Marcos
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2005-02-09 12:09 @548
Ubicación: Pachuca, Hgo

Notapor macgregor » 2005-05-18 11:17 @512

Hola.
En cada cgi que crees para acceder a la base de datos deberias
habrir una conexion.
Despues no olvides cerrar esa conexion a la base de datos o crearas instancias habiertas al SGBD que acabaran colapsando el acceso a tu base de datos.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

Notapor kidd » 2005-05-18 11:21 @514

Hola Marcos:

Así es. En cada script que inicies una conexión tienes que mandar el username y la contraseña, en el caso de que MySQL lo necesité para permitir una conexión.

Lo que si te recomiendo es que dentro de tus programas te conectes al principio y te desconectes al final, pues tiene mucho costo de recursos conectarse y desconectarse.


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Marcos » 2005-05-19 11:01 @501

Hola como estan, gracias por sus comentarios me han servido de mucho, mira si todos mi scrips tienen la conexion a la DB, es mas cuando te logeas en el sistema que genera va a la BD y jala la informacion, para poder ingresar, pero lo que pasa es que se supone que debe de guardar esa informacion en una Cookie, para poder mantener la sesion y que el sistema te pueda abrir la pantalla correcta de acuerdo al usuario, este sistema ya estaba implementado en windows 2000, pero me pidieron que lo migrara a Linux Red Hat 8 por lo que desde que lo hice he tenido un poco de problemillas, en este caso despues de login, no me respeta la sesion , y no me da los datos de los usuarios, y la expira inmediatamente, sabiendo que debe expirar a los 15 min, o sea para no hacerla cansada, despues del login, como que se cae la conexion o no puede hacerla.

Aqui les agrego el codigo completo del scrip que es q yo pienso causa el problema :

#!/usr/bin/perl

use CGI ':standard';
use DBI; #Inicio del DBI
use CGI::Session qw/-api3/; #Incio de una Sesion CGI

print header;
$sid = cookie(CGISESSID); #Permite mantener la sesion por medio de la cookie creada
$session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});

$username = $session->param('username'); #obtiene el parametro de la sesion
$ID = $session->param('ID'); #obtiene el parametro de la sesion

$dbh = DBI->connect('DBI:mysql:Tickets') #Se conecta a la base de datos
or die "Couldn't connect to database: " . $DBI->errstr;
$sth = $dbh->prepare('Select * From usuario where username = ?') #Hace referencia a la tabla de tickets del usuario especificado
or die "Couldn't prepare statement: " . $dbh->errstr;

my @data;
$sth->execute($username); # Ejecuta el query para validar que existe el usuario
# Read the matching records and print them out
while (@data = $sth->fetchrow_array()) { #Trae cada uno los registros del usuario nombre ,apellidos
$nombre = $data[1];
$apellidopat = $data[2];
$apellidomat = $data[3];
}
print<<FIN;
<html>
<head>
<title>Menu</title>
<meta http-equiv="Content-Type" content="text/html;">
<!-- Fireworks MX Dreamweaver MX target. Created Wed Jul 16 11:13:56 GMT-0500 (Hora de verano de México) 2003-->
<script language="JavaScript">
<!--

function mmLoadMenus() {
if (window.mm_menu_0627130038_0) return;
window.mm_menu_0627130038_0 = new Menu("root",107,20,"Arial, Helvetica, sans-serif",14,"#000066","#0000cc","#a4c4e3","#ccffff","center","middle",3,0,1000,-5,7,true,true,false,0,false,false);
mm_menu_0627130038_0.addMenuItem("Principal","window.open('busqueda.pl', 'contenido');");
mm_menu_0627130038_0.addMenuItem("Crear&nbsp;Ticket","window.open('crear.pl', 'contenido');");
mm_menu_0627130038_0.addMenuItem("Buscar&nbsp;Ticket","window.open('buscaticket.pl', 'contenido');");
mm_menu_0627130038_0.addMenuItem("Cerrar&nbsp;Sesi&oacute;n","location='cerrar.pl'");
mm_menu_0627130038_0.hideOnMouseOut=true;
mm_menu_0627130038_0.menuBorder=1;
mm_menu_0627130038_0.menuLiteBgColor='#8aa4c1';
mm_menu_0627130038_0.menuBorderBgColor='#8aa4c1';
mm_menu_0627130038_0.bgColor='#8aa4c1';
window.mm_menu_0716104230_1 = new Menu("root",107,20,"Arial, Helvetica, sans-serif",14,"#000066","#0000cc","#8aa4c1","#ccffff","center","middle",3,0,1000,-5,7,true,true,false,0,false,false);
mm_menu_0716104230_1.addMenuItem("Usuarios","window.open('usuarios.pl', 'contenido');");
mm_menu_0716104230_1.addMenuItem("Crear&nbsp;","window.open('creausuario.pl', 'contenido');");
mm_menu_0716104230_1.addMenuItem("Buscar","window.open('buscarusuario.pl', 'contenido');");
mm_menu_0716104230_1.addMenuItem("Eliminar","window.open('eliminarusuario.pl', 'contenido');");
mm_menu_0627130038_0.hideOnMouseOut=true;
mm_menu_0627130038_0.menuBorder=1;
mm_menu_0627130038_0.menuLiteBgColor='#8aa4c1';
mm_menu_0627130038_0.menuBorderBgColor='#8aa4c1';
mm_menu_0627130038_0.bgColor='#8aa4c1';

mm_menu_0716104230_1.writeMenus();
} // mmLoadMenus()

//-->
</script>
<script language="JavaScript1.2" src="../ticketimg/interfaz_02/mm_menu.js"></script>
</head>
<body
background="../ticketimg/interfaz_01/n01_r3_c9.gif" > <!--o nLoad="MM_preloadImages('Banner_r1_c1_f2.gif');"-->
<center>
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
<font size="5" color="#CCCCCC"><strong>Bienvenido </strong>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
<font size="5" color="#CCCCCC"><strong><em> $nombre $apellidopat $apellidomat</strong>

<script language="JavaScript1.2">mmLoadMenus();</script>
<table border="0" cellpadding="0" cellspacing="0" width="730">
<!-- fwtable fwsrc="02baner_02.png" fwbase="02baner_01.gif" fwstyle="Dreamweaver" fwdocid = "742308039" fwnested="0" -->
<tr>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="339" height="1" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="54" height="1" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="337" height="1" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="1" height="1" border="0" alt=""></td>
</tr>

<tr>

<td rowspan="3"><a href="#" onMouseOver="MM_showMenu(window.mm_menu_0627130038_0,0,39,null,'Banner_r1_c1')"><img name="Banner_r1_c1" src="../ticketimg/interfaz_02/Banner_r1_c1.gif" width="339" height="39" border="0" alt=""></a></td>
<td colspan="2"><img name="Banner_r1_c2" src="../ticketimg/interfaz_02/Banner_r1_c2.gif" width="391" height="22" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="1" height="22" border="0" alt=""></td>
</tr>
<tr>
FIN
if ($ID >= 100){ #LA interfaz de Menu para el usuario,
print<<FIN;
<tr>
<td><img name="Banner_r2_c2" src="../ticketimg/interfaz_02/Banner_r2_c2.gif" width="54" height="17" border="0" alt=""></td>
<td rowspan="2"><img name="Banner_r2_c3" src="../ticketimg/interfaz_02/Banner_r2_c3.gif" width="337" height="39" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="1" height="17" border="0" alt=""></td>
</tr>
FIN
}else{ #LA interfaz de Menu para el super usuario, de la maniputación de los usuarios (Crear,Modificar,Eliminar).
print<<FIN;
<tr>
<td><img name="Banner_r2_c2" src="../ticketimg/interfaz_02/Banner_r2_c2.gif" width="54" height="17" border="0" alt=""></td>
<td rowspan="2"><a href="#" onMouseOver="MM_showMenu(window.mm_menu_0716104230_1,-41,-23,null,'n02baner_01_r3_c3')"><img name="n02baner_01_r3_c3" src="../ticketimg/interfaz_02/02baner_01_r3_c3.gif" width="337" height="39" border="0" alt=""></a></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="1" height="16" border="0" alt=""></td>
</tr>
FIN
}
print<<FIN;
<td colspan="2"><img name="Banner_r3_c1" src="../ticketimg/interfaz_02/Banner_r3_c1.gif" width="393" height="22" border="0" alt=""></td>
<td><img src="../ticketimg/interfaz_02/spacer.gif" width="1" height="22" border="0" alt=""></td>
</tr>
</table>
</center>
</body>
</html>

FIN
$dbh->disconnect;
print end_html;
J.Marcos Cardozo H.
Marcos
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2005-02-09 12:09 @548
Ubicación: Pachuca, Hgo

Notapor kidd » 2005-05-20 15:29 @687

Hola:

Lo que se me ocurre es que sea un problema al crear los cookies. Prueba con tu navegador entrar a las páginas y revisa en tus archivos de cookies si fue creada, de lo contrario debes de revisarlo.

A veces el crear cookies es medio mañoso, pero normalmente son problemas de configuración al crear el cookie.

SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Marcos » 2005-05-23 13:58 @623

Hola, mira ya cheque lo que me comentas de las cookies, si explorador si las genera, ya revise las sintaxis, y estan de forma correcta, mira lo que esta pasando que al logearte e iniciar la sesion, me da esta cookie por ejemplo :

Set Cookie:
CGISESSID=8348f598b7dd1de88391edd9cc904a26; path=/ Date: Mon, 23 May 2005 18:49:19 GMT Content-Type: text/html; charset=ISO-8859-1 marcos jmch 100.

Esto se genera por que yo estoy parando la ejecucion de programa para verficar si esta generando la cookie y esta viajando ala BD a checar el usuario, password y su ID y como vez si me la da, tanto la cookie como los datos.

Te pongo el scrip donde genero la session y me da los datos que te mostre anteriormente :

#!/usr/bin/perl -w

use CGI::Cookie;
use CGI ':standard';
use DBI;
use CGI::Session qw/-api3/;


$dbh = DBI->connect('DBI:mysql:Tickets') #Se conecta a la base de datos
or die "Couldn't connect to database: " . $DBI->errstr;
$sth = $dbh->prepare('SELECT * FROM usuario WHERE username = ? AND password = ?')
or die "Couldn't prepare statement: " . $dbh->errstr; # Se hace referencia a la tabla


$username = param('username'); #se obtiene un parametro de la pagina anterior
$password = param('password');
$resultado = $sth->execute($username,$password); # Ejecuta el query para validar que existe el usuario

while (@data = $sth->fetchrow_array()) {
$ID = $data[0]; #recibe el id del usuario
}
if($resultado == 1 )
{

my $session = new CGI::Session("driver:File", $cgi, {Directory=>'/tmp'}); #Crea una nueva session
print "Set-Cookie: $session\n";
print "Content-Type: text/html\n\n";
$session->param('username',$username); #Lleva los parametros del usuario a la sesion
$cookie = cookie(CGISESSID => $session->id); #Se crea una cookie con los datos de la sesion
print header( -cookie=>$cookie);

#Diferentes parametros que se suben a la sessi?n para utilizarlos m?s adelante nel os dem?s programas
print $username;
print $password;
print $session->param('ID',$ID); #sebe el id del usuario a la sesi?n
$session->param('sentenciaUsuario',"Select * from ticket where username = ? ORDER BY ticket_id DESC");
$session->param('sentenciaSoporte',"Select * from ticket where Tipo = ? ORDER BY prioridad,status DESC ");
$session->param('sentenciaSuperUsuario',"Select * from ticket ORDER BY prioridad,status DESC ");
$session->param('usuariosentencia',"SELECT * FROM usuario ORDER BY id DESC");

#A la sesi?n se le da un tiempo de expiraci?n de 10 minutos
$session->expire('username', '+1h');
print '<META HTTP-EQUIV="Refresh"
CONTENT="0;URL=../principal.pl">';
}
else{

print '<META HTTP-EQUIV="Refresh" CONTENT="0;URL=../login.pl?error=1">'
#print redirect('../login.pl?error=1\n\n'); #Si en la verificacion es erronea regresa a la pagina de inicioi
}

$sth->finish;
print "\n";
$dbh->disconnect;


Esta cookie pasa al siguiente programa el cual me va a dar la pantalla de acuerdo al usuario, que es el scrip que puse en el mensaje anterior, pero el problema que cuando quiero provar como en este scrip, aqui no me nada ningun dato solo me aparece Content-Type: text/html; charset=ISO-8859-1,
J.Marcos Cardozo H.
Marcos
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2005-02-09 12:09 @548
Ubicación: Pachuca, Hgo

Notapor Marcos » 2005-06-02 11:16 @511

Hola sigo con mi mismo problema, ya cheque mis cookies y el navegador si las crea pero no se que esta pasando al llamarlas, en el siguiente scrip, como que se expiran luego luego, alguien sabe q onda con eso? :?:
J.Marcos Cardozo H.
Marcos
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2005-02-09 12:09 @548
Ubicación: Pachuca, Hgo


Volver a Web

¿Quién está conectado?

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