Mon problème est le suivant. Une fois que le mot de passe est reconnu comme valide, j'ai besoin de rediriger vers Je sais que je sais que je J'écris cette affirmation après main.cgi code> mais je reçois le message comme:
Type de contenu code> de sorte qu'il s'agit de ceci en tant que HTML et de l'imprimer à l'écran. Je suis un débutant à Perl. Quelqu'un peut-il m'aider à trouver la solution pour cela et faire fonctionner mon code comme je le veux? Ou s'il vous plaît me suggérer un code alternatif pour cela, ou tout lien qui pourrait m'aider à sortir. P>
#!C:\perl\bin\perl.exe
use strict;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
my $q = new CGI;
print "Content-Type: text/html\n\n";
if ($q->param("Login")) {
my $Password = param('Password');
if (!$Password) {
print "Please Enter the Password";
} else {
my $dbh = DBI->connect(
"dbi:SQLite:DEVICE.db",
"", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
my $sth = $dbh->prepare("select * from Settings where Password = ?");
$sth->execute($Password);
if (my $pass = $sth->fetchrow_hashref) {
print redirect(-url => 'http://localhost/cgi-bin/Main.cgi');
} else {
print "Invalid Password";
}
$dbh->disconnect;
}
}
print <<END1;
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<body>
<form NAME="login" METHOD="POST">
<input type="hidden" name="submit" value="Submit">
<TABLE align="center" bgcolor=#B0C4DE>
<TR>
<TD> Enter The Password And Click Login</TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TR>
<TD align="center" colspan="2">
<input type="submit" name="Login" value="Login">
<input type="reset" name="submit" value="Cancel">
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
END1
5 Réponses :
La redirection:
print "Content-Type: text/html\n\n";
Voir ce qui suit, espérons-le, cela vous donnera une bonne idée de la façon de garder le flux de contrôle "à droite" et vous aidera à identifier exactement quelles pièces font quoi et devraient faire quoi, sous votre formulaire:
#!/usr/bin/env perl # Windows does not use #! to launch stuff! use strict; use warnings; # always! use CGI qw(:standard); use CGI::Carp qw(warningsToBrowser fatalsToBrowser); use DBI; my $q = CGI->new; my_program: { if ( !$q->param('Login') or !length $q->param('Login') ) { print $q->header('text/html'), my_form(); # just display the form last my_program; } my $password = $q->param('Password'); if ( !$password or !length $password ) { print $q->header('text/plain'), "Please enter the Password"; last my_program; } my $dbh = DBI->connect( "dbi:SQLite:DEVICE.db", "", "", { RaiseError => 1, AutoCommit => 1 } ); my $sth = $dbh->prepare("select * from Settings where Password = ?"); $sth->execute($password); if (my $pass = $sth->fetchrow_hashref) { print redirect(-url => 'http://localhost/cgi-bin/Main.cgi'); last my_program; } print $q->header('text/plain'), "Invalid Password"; } sub print_my_form { return <<END1; <HTML> <HEAD> <TITLE> </TITLE> </HEAD> <body> <form NAME="login" METHOD="POST"> <input type="hidden" name="submit" value="Submit"> <TABLE align="center" bgcolor=#B0C4DE> <TR> <TD> Enter The Password And Click Login</TD> </TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR> <TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD> </TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR> <TR> <TD align="center" colspan="2"> <input type="submit" name="Login" value="Login"> <input type="reset" name="submit" value="Cancel"> </TD> </TR> </TABLE> </FORM> </BODY> </HTML> END1 }
Hey merci beaucoup M.MFontani..J'ai collé ce code..whenever i Donnez un mot de passe valide puis son être redirigé vers le MAIN.CGI..mais lorsque j'ai donné un mot de passe incorrect, une boîte de dialogue apparaît posant "Vous souhaitez enregistrer ou Ouvrez le fichier login.cgi ".. Et quand je clique sur Ouvrir, il affiche le message" Mot de passe invalide "dans Perl Express ... En réalité, utilisez Perl Express pour exécuter mes programmes PERL ..
Vous devez utiliser $ q-> en-tête ("Texte / plain-pied") ci-dessus à l'occasion où vous donnez simplement les erreurs, et $ q-> en-tête ("Texte / html") lors de la présentation du formulaire; mis à jour
Le moyen le plus simple consiste à utiliser la balise Meta Actualiser, vous n'avez pas besoin de rétablir votre en-tête non plus.
Utilisez ce code: P>
#!C:\perl\bin\perl.exe use strict; use CGI qw(:standard); use CGI::Carp qw(warningsToBrowser fatalsToBrowser); use DBI; my $q = new CGI; my $redirect = 0; print "Content-Type: text/html\n\n"; if ($q->param("Login")) { my $Password = param('Password'); if (!$Password) { print "Please Enter the Password"; } else { my $dbh = DBI->connect( "dbi:SQLite:DEVICE.db", "", "", { RaiseError => 1, AutoCommit => 1 } ); my $sth = $dbh->prepare("select * from Settings where Password = ?"); $sth->execute($Password); if (my $pass = $sth->fetchrow_hashref) { $redirect = 1; } else { print "Invalid Password"; } $dbh->disconnect; } } print <<END1; <HTML> <HEAD> END1 if ($redirect){ print '<meta http-equiv="refresh" content="1;url=http://localhost/cgi-bin/Main.cgi/">'; } print <<END2; <TITLE> </TITLE> </HEAD> <body> <form NAME="login" METHOD="POST"> <input type="hidden" name="submit" value="Submit"> <TABLE align="center" bgcolor=#B0C4DE> <TR> <TD> Enter The Password And Click Login</TD> </TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR> <TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD> </TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR></TR> <TR> <TR> <TD align="center" colspan="2"> <input type="submit" name="Login" value="Login"> <input type="reset" name="submit" value="Cancel"> </TD> </TR> </TABLE> </FORM> </BODY> </HTML> END2
Un million de remerciements Mr.darren..it fonctionne exactement comme je voulais que cela fonctionne comme un mot de passe valide indique le formulaire pendant un moment et plus tard le permet de rediriger à Main.cgi ... mais en dehors de ce bit d'évie Fonctionne correctement .... Tahnks beaucoup ....
Meta Refresh est ce que vous utilisez lorsque vous ne pouvez pas le faire correctement, comme dans la meilleure réponse votée dans cette question.
Merci Brian, mais il était assez évident que Sonya cherchait une solution simple avec aussi peu de réécriture que possible.
Vous voudrez peut-être essayer l'astuce est i avait le même problème pour que cette astuce ait fonctionné pour moi plutôt bien.
Le code n'est pas joli mais ça marche. p> p> contenu = \ "1 code> retardera la page rediriger pendant environ une seconde p>
Pour rediriger une page à une autre Utilisez la méthode suivante.
use CGI::Session; use CGI::Session::Plugin::Redirect; my $session = new CGI::Session(); print $session->redirect('http://example.com/redirect-path/redirect-file.php');
Comme vous l'avez dit, vous n'avez pas vraiment examiné ce que vous êtes nouveau et que cela possède de nombreuses questions de bien-être, mais imprimez le type de contenu plus tard, si vous savez que c'est le cas.
Hé, merci beaucoup ... je l'avais mis JST au-dessus de l'impression << End1 ... Cela fonctionne parfaitement à la page..bt si je saisis le mauvais mot de passe, puis à la différenciation du renvoi "mot de passe invalide" .. La page est Se rafraîchir Thas Al..J'ai essayé Puttin It JST Abve The Signal Impression "Mot de passe invalide"; , € Server Erreur , Wen j'ai vérifié les journaux d'erreur, puis les journaux d'erreur, puis ce que j'ai découvert .. "En-tête mal formé de script. Bad Header = : login.cgi" ,. Ceci est un nouveau problème maintenant ... S'il vous plaît, aidez-moi à résoudre le résoudre, s'il est résolu, alors tout problème dans mon programme est sorti de ...
Dupliqué possible de Redirection d'une page CGI à une autre