我可以检查一下执行是否有效而没有它在Perl mysql中死亡?

时间:2012-09-18 08:47:42

标签: mysql perl execute

我正在连接数据库,我从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的类似内容,因为我不想退出我的程序。这可能吗?

2 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分: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 - 如果我需要检查查询是否有效,我将使用您的方法,谢谢。