-1

我正在连接到一个数据库,并且我正在从 STDIN 获取一个输入,我将其用作执行的一部分。所以我有:

my $i = 0;

while($i != 1) {
    print "Input: ";
    my $input = <STDIN>;
    chomp $input;
    my $test = $dbh->prepare("show tables like $input");

然后我想检查输入是否是数据库中的有效条目,如果不是,则再次循环:

    if ($test->execute()) {
        print "Input exists in database\n";
        $i = 1;
    }
    else {
        print "Input does not exist.\n";
    }
} # end of while

我知道这不起作用,但我想要类似的东西,execute or die因为我不想退出我的程序。这可能吗?

4

2 回答 2

1

你有两个选择:

1) 禁用数据库句柄的 RaiseError 属性。这可以在创建连接时完成:

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

这当然需要您通过在适当的地方测试 $DBI::err 来自己处理错误。

2) 捕捉错误。要么使用 Try/Catch 框架之一(我推荐使用 TryCatch 或 Try::Tiny),要么手动使用 eval。例如:

if (defined( eval { $test->execute() // 0 } ) {
    print "Success";
} else {
    pring "Bugger, I died...: $DBI:Err";
}
于 2012-09-18T09:03:23.073 回答
0

我实际上找到了我想要的不同方式的解决方案,但感谢 pmakholm 的回答。

my $i = 0;

while($i != 1) {
    print "Input: ";
    my $input = <STDIN>;
    chomp $input;
    my $test = $dbh->prepare("show tables like $input");
    my $var = $test->execute();
    if ($var != 0) {
        print "Input exists in database\n";
        $i = 1;
    }
    else {
        print "Input does not exist.\n";
    }
} # end of while

我没有想到的是,即使我在数据库中输入废话,我也会查看该是否存在 - 如果不存在,它只会返回一个空集,所以我可以检查是否为零(检查是否NULL或类似可能会更好,但这有效)。我以为它会返回错误,但事实并非如此。pmakholm - 如果我需要检查查询是否有效,我将使用您的方法,谢谢。

于 2012-09-18T09:22:44.963 回答