【问题标题】:return code in the CGI while inserting into Oracle database插入 Oracle 数据库时在 CGI 中返回代码
【发布时间】:2016-12-21 21:31:37
【问题描述】:

我有一个将value1value2value3 插入 Oracle 数据库的 Perl CGI 脚本

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();

那么我可以使用该信息来显示它是否成功插入或显示遇到错误。

或者在插入重复数据时我可以使用其他方法来显示错误吗?

【问题讨论】:

  • 请展示您如何打开/创建您的$dbh,尤其是RaiseErrorPrintError 标志。取决于他们,execute or die 可能会有所帮助。
  • @PerlDuck: die 在 Web 应用程序中几乎从来都不是正确的做法。不管发生什么,你都应该得到一个 HTML 页面。
  • @Borodin 是的,是的。但他在eval 这样做。我只是想给出一个想法在哪里应该发生错误处理。漂亮的帽子,顺便说一句。 :-)
  • 我的手机没有显示帽子,我的邻居正在听很吵很奇怪的音乐:-(
  • 我的帽子周围我会戴上绿柳;在我的帽子周围,十二个月零一天;如果有人问我为什么穿它;都是为了远方的真爱。

标签: sql oracle perl cgi


【解决方案1】:

在 CGI 代码中 die 没有用处。您应该生成一个 HTML 响应页面,而只是中途放弃并不是一件有用的事情

同样,您不想在您的 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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 2014-07-09
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多