0

单击提交按钮时,应调用回调函数。打印回调期间传递的所有参数不起作用。但它进入回调函数。如何访问传递的变量以便我可以插入表中。

sub registerStu {
    use DBI;
    use strict;
    my $reg = $mw->Toplevel();
    $reg->title("Registration");
    $reg->geometry("500x500+0+0");
    #$button -> grid(-row=>5, -column=>5);
    my $name = $reg->Label( -text => "Name", -width => 20 )->pack( -side => "top" );
    my $ename = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $uid = $reg->Label( -text => "User name", -width => 20 )->pack( -side => "top" );
    my $euid = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $pwd = $reg->Label( -text => "Password", -width => 20 )->pack( -side => "top" );
    my $epwd = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $mail = $reg->Label( -text => "Email", -width => 20 )->pack( -side => "top" );
    my $email = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $dept = $reg->Label( -text => "Department", -width => 20 )->pack( -side => "top" );
    my $edept = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $gname = $ename->get();
    my $guid  = $euid->get();
    my $gpwd  = $epwd->get();
    my $gmail = $email->get();
    my $gdept = $edept->get();
    my $submit = $reg->Button(
        -text    => "Register",
        -command => sub { &InsertStu( $gname, $guid, $gpwd, $gmail, $gdept ); }
    )->pack( -side => "top" );
}

sub InsertStu {
    print "hello";
    print "@_\n";
    my $driver   = "mysql";
    my $database = "course";
    my $dsn      = "DBI:$driver:database=$database";
    my $userid   = "root";
    my $password = "pwd";

    my $dbh = DBI->connect( $dsn, $userid, $password, { AutoCommit => 1 } ) or die $DBI::errstr;
    #my $sth = $dbh->prepare("INSERT into student(sid,name,password,email,dept) values('$guid','$gname','$gpwd','$gmail','$gdept')");
    #$sth->execute() or die $DBI::errstr;
}
4

2 回答 2

1

您过早地提取文本字段的值。

# These values aren't set yet, so your callback function will always be
# passed an empty string for each of these values
my $gname = $ename->get();
my $guid  = $euid->get();
my $gpwd  = $epwd->get();
my $gmail = $email->get();
my $gdept = $edept->get();

相反,将文本字段传递给回调函数,这样您就可以拉取实际按下提交按钮时设置的值:

sub registerStu {
    use DBI;
    use strict;
    my $reg = $mw->Toplevel();
    $reg->title("Registration");
    $reg->geometry("500x500+0+0");
    #$button -> grid(-row=>5, -column=>5);
    my $name = $reg->Label( -text => "Name", -width => 20 )->pack( -side => "top" );
    my $ename = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $uid = $reg->Label( -text => "User name", -width => 20 )->pack( -side => "top" );
    my $euid = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $pwd = $reg->Label( -text => "Password", -width => 20 )->pack( -side => "top" );
    my $epwd = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $mail = $reg->Label( -text => "Email", -width => 20 )->pack( -side => "top" );
    my $email = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $dept = $reg->Label( -text => "Department", -width => 20 )->pack( -side => "top" );
    my $edept = $reg->Entry( -width => 20, -background => 'white', -foreground => 'black' )->pack( -side => "top" );
    my $submit = $reg->Button(
        -text    => "Register",
        -command => sub { InsertStu( $ename, $euid, $epwd, $email, $edept ); }
    )->pack( -side => "top" );
}

sub InsertStu {
    my ( $ename, $euid, $epwd, $email, $edept ) = @_;

    my $gname = $ename->get();
    my $guid  = $euid->get();
    my $gpwd  = $epwd->get();
    my $gmail = $email->get();
    my $gdept = $edept->get();

    my $driver   = "mysql";
    my $database = "course";
    my $dsn      = "DBI:$driver:database=$database";
    my $userid   = "root";
    my $password = "pwd";

    my $dbh = DBI->connect( $dsn, $userid, $password, { AutoCommit => 1 } ) or die $DBI::errstr;
    my $sth = $dbh->prepare("INSERT into student(sid,name,password,email,dept) values(?,?,?,?,?)");
    $sth->execute( $guid, $gname, $gpwd, $gmail, $gdept ) or die $DBI::errstr;
}
于 2014-10-25T18:34:38.870 回答
0

&调用 Perl 子例程时应避免使用 & 符号。它做了一些相当神秘的事情,并且可能成为尴尬错误的根源。刚刚InsertStu($gname, $guid, $gpwd, $gmail, $gdept)是正确的。

我想你是说你的InsertStu子程序正在打印hello,但没有别的?我会说那是因为get调用不起作用,或者在单击之前您没有在这些字段中输入任何内容Register

@_如果您使用,将更容易看到参数列表中的确切内容Data::Dump,就像这样

use Data::Dump;
dd \@_;

但它不是核心模块,可能需要先安装。如果您愿意,您可以使用核心模块Data::Dumper来达到类似的效果,但效果Data::Dump要好得多。如果您的字段为空或仅包含空格字符,那么您将看不到任何print通话内容。

您还应该尝试转储五个get调用返回的值,registerStu以查看那里发生了什么。

您应该注意,将变量值插入到 SQL 字符串中是不好的做法prepare。其大部分优点prepare是您可以使用参数的占位符只调用一次,然后execute根据需要调用多次。它看起来像这样

my $insert = $dbh->prepare('INSERT INTO student (sid, name, password, email, dept) VALUES (?, ?, ?, ?, ?)');

然后使用

$insert->execute($guid, $gname, $gpwd, $gmail, $gdept) or die $DBI::errstr;

每当您需要插入记录时。该prepare调用应该在您的应用程序的初始化中与connect.

于 2014-10-25T17:29:16.027 回答