我正在连接数据库,我从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
的类似内容,因为我不想退出我的程序。这可能吗?
答案 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 - 如果我需要检查查询是否有效,我将使用您的方法,谢谢。