【问题标题】:can't call method prepare on an undefined value perl无法在未定义的值 perl 上调用方法准备
【发布时间】:2016-12-22 09:54:28
【问题描述】:

在我们使用的 dbutils.pm 文件中

my $sth = $dbh->prepare($checkUser) or return ($::FALSE,"checkUser prepare failed "); 

在此语句中出现错误,例如 can't call method prepare on an undefined value 在此文件中多次使用相同的语句,但我没有收到任何这样的错误。 prepare($checkUser) --> checkUser 是 SQL 查询,它返回一些东西。查询其返回值没有问题。

我们正在使用sub dbLogin { } 函数。在这个函数中我们给出了:

$dbh = DBI->connect('DBI:Or‌​acle:DBname', 'username', 'pwd')
  or die "Couldn't connect to database: " . DBI->errstr;

这个函数返回$dbh,所以根据你的建议,我们已经使用了$dbh代码行。

我们在 dbUtil.pm 文件中多次使用的 $dbh 返回的内容。

请建议我解决此问题。

【问题讨论】:

  • 您添加的任何细节都没有改变这种情况。问题是当您使用它调用prepare() 时,$dbh 是未定义的。你需要弄清楚为什么它没有在你的程序中设置。
  • 我们每次都调用 sub dbLogin() 函数,同时调用 prepare() 就像我的 $dbh= &dbLogin;我的 $sth = $dbh->prepare($checkUser) 或 return ($::FALSE,"checkUser prepare failed");.
  • 那么 dbLogin() 由于某种原因返回了一个未定义的值。你需要弄清楚为什么会这样。并且,请不要使用& 调用子程序。它可能会令人困惑,并且已经有 20 多年没有要求了。
  • 为什么它给出了我没有得到的未定义值..因为我们有 2k 行代码并且在那个文件中我的 $dbh=&dbLogin();被使用了很多次......当我们为最后几行代码调用 $dbh->prepare() 时,我们遇到了问题。
  • 我不知道。那是你来了解的。如果我正在调试它,我会在三个地方打印$dbh 的值——因为它是从connect() 返回的,就在它从dbLogin() 返回之前以及在它用于调用prepare() 之前。这将向您显示它首先未定义的位置。但如果你是一名程序员,你应该能够自己解决这个问题。

标签: perl


【解决方案1】:

表示$dbh 不正确。请像下面这样写你的$dbh,看看它是否无法建立连接。

my $dbh = DBI->connect($data_source, $username, $auth, \%attr)
                or die "Couldn't connect to database: " . DBI->errstr;

或者

my $dbh = DBI->connect($data_source, $username, $auth, { RaiseError => 1 });

根据您编辑的问题:

在调用dbLogin 子例程之后(就在prepare 语句之前)打印$dbh 的转储程序以查看它是否未定义。如果是这种情况,那么您需要进一步调试以查看正在修改 $dbh 的内容。

【讨论】:

  • 嗨 Chankey,这里我们使用 sub dbLogin { } 函数。在这个函数中,我们给出了 $dbh = DBI->connect('DBI:Oracle:DBname', 'username', 'pwd' )或死“无法连接到数据库:”。 DBI->errstr;像这样,这个函数返回 $dbh;因此,根据您的建议,我们已经使用了 $dbh 行代码。
  • 如果您的dbLogin() 函数返回一个有效的$dbh,但在您使用它调用prepare()$dbh 未定义,那么一定是某些东西覆盖了该值。或者您可能没有使用正确的$dbh 变量。你有 my $dbh 掩盖原始变量的地方吗?
  • 如果您有较大的代码片段(例如 dbLogin() 函数,如果您可以编辑您的问题以包含它们而不是将它们放在难以阅读的 cmets 中,这将很有帮助。
【解决方案2】:

好的,让我们看看那个错误。

无法在未定义的值上调用方法准备

Perl 告诉你你正在对一个未定义的值调用prepare() 方法。这是什么意思?

在你的代码中有这一行:

my $sth = $dbh->prepare(...);

这里,prepare() 是您在对象$dbh 上调用的方法。如果 Perl 告诉你你在一个未定义的值上调用它,那么此时你的代码 $dbh 必须是未定义的。

因此,您需要查看您认为$dbh 被赋予值的位置。该代码以某种方式出错。您需要在那里添加更多错误检查,以找出问题所在。 Chankey suggests 的代码看起来是一个很好的开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2020-06-25
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多