gpt4 book ai didi

html - 检查字母数字字符并从 HTML 表单获取输入

转载 作者:可可西里 更新时间:2023-11-01 13:32:15 27 4
gpt4 key购买 nike

我对 Perl 编程还很陌生,我有几个似乎无法解决的编译问题。我的程序从此 HTML 表单获取输入。

问题:我的表单应该使用 post 还是 get 方法?

<FORM action="./cgi-bin/Perl.pl" method="GET">
<br>
Full name: <br><input type="text" name="full_name" maxlength="20"><br>
Username: <br><input type="text" name="user_name" maxlength="8"><br>
Password: <br><input type="password" name="password" maxlength="15"><br>
Confirm password: <br><input type="password" name="new_password" maxlength="15"><br>

我打开一个 CSV 文件,将 user_name 的值写入一个数组,并对用户的输入进行多项检查。

问题#1:我需要检查 full_name、user_name、password 和 new_password 是否都是字母数字或空格,但我不断收到多个错误,如下所示:

Use of uninitialized value $full_name in string eq at Perl.pl line 33

我认为我没有正确使用 CGI 从表单中获取这些值。我也相信我没有正确检查字母数字字符。我该如何解决这个问题?

问题 #2: 如果用户的密码不匹配并且用户名已被占用,我需要将用户重定向到特定网页。我使用了元重定向,但没有成功。如何显示正确的错误页面?

这是我的代码:

#!/usr/bin/perl 
use CGI qw(:standard);
use strict;
use warnings;

print "Content-type: text/html\n\n";

#opening Members.csv for reading
my $file = '/home/2014/amosqu/public_html/cgi-bin/Members.csv';
open(my $csv, '<', $file) || die "Could not open your file";

#getting these from HTML form
my $full_name = param('full_name');
my $user_name= param('user_name');
my $password = param('password');
my $new_password = param('new_password');

my @users = ();

#splitting each line of csv file
foreach (<$csv>) {
chomp;
my @fields = split (/\,/);
push @users, $fields[1]; #put all usernames inside of array
}

close $csv;

#opening Members.csv for appending
open(my $fh, '>>', $file) || die "Could not open your file";

#SOURCE OF PROBLEM 1
#checking that all values are alphanumeric
if(($full_name && $user_name && $password && $new_password) eq /\A[[:alnum:]]+\z/) {
#if passwords don't match, redirect to error page
if($password ne $new_password){
print qq(<html>\n);
print qq(<head>\n);
print qq(<title> Passwords don't match. </title> \n);
print qq{<meta http-equiv="refresh"content="5;URL="http://www.cs.mcgill.ca/~amosqu/registration.html">\n};
print qq(</head>\n);
print qq(<body>\n);
print qq(<b><center> Passwords don't match </b></center>\n\n);
print qq(</body>\n);
print qq(</html>\n);
}
#if they do match, check that user name isn't in Members.csv
else {
if(grep (/$user_name/, @users)) {
print qq(<html>\n);
print qq(<head>\n);
print qq(<title> Sorry username already taken. </title>\n);
print qq{<meta http-equiv="refresh"content="5;URL="http://www.cs.mcgill.ca/~amosqu/registration.html">\n};
print qq(</head>\n);
print qq(<body>\n);
print qq(<b><center> Username already taken. </b></center>\n\n);
print qq(</body>\n);
print qq(</html>\n);
}
#if it isn't already in Members.csv append values to the file
else {
print $fh "$full_name, $user_name, $password \n";
}
}
}

close $fh;

最佳答案

这应该让你继续。您的代码存在许多问题,但不会阻止它正常工作,但目前的智慧是根本不要使用 CGI,所以我会和您一起努力。

  • 使用 GET 除非你有充分的理由使用 POST

  • 问题就在这里

    if(($full_name && $user_name && $password && $new_password) eq /\A[[:alnum:]]+\z/) {

    您正在使用一个 bool && 运算,它结合了三个变量的 truth ,并检查它作为一个字符串是否等于匹配的结果$_ 的内容针对该正则表达式。

    您必须单独检查每个变量,并使用绑定(bind)运算符 =~ 根据正则表达式测试它们。使用 POSIX 字符类也是一种不好的形式。我建议你使用 grep,像这样

    my $mismatch = grep /[^A-Z0-9]/i, $full_name, $user_name, $password, $new_password;

    现在,如果任何变量包含非字母数字字符,$mismatchtrue。 (严格来说,它被设置为具有非字母数字字符的变量的数量,如果没有,则为零(假)。)

    然后你可以说

    if (not $mismatch) { ... }
  • 看起来您只需要一个构建单独页面的 else

关于html - 检查字母数字字符并从 HTML 表单获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com