我有一个Perl CGI脚本,可以将value1
,value2
,value3
插入Oracle数据库
eval {
my $sth = $dbh->prepare(
"insert into $table (COLUMN1, COLUMN2, COLUMN3) VALUES ('$value1','$value2','$value3')"
);
if ( defined( $sth ) ) {
$sth->execute();
}
else {
die( "Sth not defined" );
}
};
print "Successfully inserted";
对于唯一的value1,value2,value3我插入这些值没有问题,但如果我尝试插入重复的值,我会得到
执行()
时违反了唯一约束错误
在日志中。但该页面仍然显示已成功插入。
所以我在想是否可以获得
的返回码$sth->execute();
然后我可以使用该信息来显示它是否已成功插入或显示是否遇到错误。
或者,在插入重复数据时,还有其他方法可用于显示错误吗?
答案 0 :(得分:3)
它对CGI代码中的die
没用。你应该生成一个HTML响应页面,只是放弃一半是不是一件有用的事情
同样,您不希望在yuour DBI连接中启用RaiseError
选项,如果遇到错误,只需向DBI询问die
如果您未启用die
或启用RaiseError
,则不需要eval
启用PrintError
非常有用,它使DBI使用warn
来记录相同的消息。这将出现在服务器日志文件中以供以后诊断
对$sth->execute
的调用会在失败时返回 false 值,并且在此基础上您可以打印错误消息以及错误字符串
您还应该在prepare
语句中使用占位符。只需将问号?
代替列值并将调用中的实际值传递给execute
逻辑应该看起来像这样
my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 0, PrintError => 1 });
my $sth = $dbh->prepare( "insert into $table (COLUMN1, COLUMN2, COLUMN3) VALUES (?, ?, ?)" );
if ( $sth ) {
my $ret = $sth->execute( $value1, $value2, $value3 );
if ( $ret ) {
print "Successfully inserted\n";
}
else {
print "Insert failed:\n";
print $sth->errstr, "\n";
}
}
else {
print "Failed to prepare statement handle:\n";
print $dbh->errstr, "\n";
}