dbi将undef视为空,但查询在mysql中产生结果

时间:2012-11-08 09:10:48

标签: mysql perl dbi

我有一个只产生一行和一列的mysql查询,当以交互方式检查查询时,我可以看到结果,这就是我想要的。但是当我使用时 $sth->fetchrow_hashref; 我得到了undef。 有没有人知道这里可能有什么问题? 我感谢任何方向的任何一点。你产生你的结果。

这是在执行后直接完成的:

sub _get_next_hashref
{
    my $self = shift;
    if($self->{sth} ne '') {
    if(my $hash_ref = $self->{sth}->fetchrow_hashref)
    {
        return $hash_ref;
    } else {
        $self->{sth} = '';
        return undef;
        }
    } else {
    return undef;
    }    
}

其他一些信息:
执行的查询以limit 1结束,因此应始终只有一行。出于某种原因,数据中否则会导致更多行完美地工作,但只产生一行结果的数据不起作用。

$sql = "select sort_order from forum.metatag_sort where metatag=? order by id desc limit 1";
$self->{sth} = $self->{dbh}->prepare($sql);
if($self->{sth}->execute(@args)) {
    return _get_next_hashref();
}

在@args中只有metatag,一个int。
案例在哪里     select count(sort_order) from forum.metatag_sort where metatag=? 将返回大于1的答案对我来说完美无缺,但是这种情况将完全返回1的情况失败。

2 个答案:

答案 0 :(得分:1)

您的_get_next_hashref - 定义看起来像是某个类的方法,但您将其称为函数:

if($self->{sth}->execute(@args)) {
    return _get_next_hashref();
}

因此它没有获取对象信息,除了undef之外它不能返回任何内容。

答案 1 :(得分:0)

您好像忘记将$sql设置为SQL字符串:

"select sort_order from forum.metatag_sort where metatag=? order by id desc limit 1"
$self->{sth} = $self->{dbh}->prepare($sql);

您使用的是strictwarnings吗?考虑一下:以下:

"some code";
print "bar";

use warnings应该告诉你这一行:

  

在scratch.pl第5318行的void上下文中无用的常量(某些代码)。


我冒昧地为你改变了一些代码。

  • 正如@MoritzBunkus所说,你不需要将$self->{sth}与任何东西进行比较。如果它中有一个语句句柄,那就是真的。如果没有,那将是假的。
  • 如果'then'块中有return,请勿在{{1​​}}块中放置else。您不需要return。只需将其放在else - 声明下面。
  • 没有参数的
  • if始终返回return。见ProhibitExplicitReturnUndef

我是这样做的:

undef