3

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

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

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 中只有元标记,一个 int。 返回大于 1 的答案的情况对我来说完美无缺,但是返回正好 1 的情况会失败
select count(sort_order) from forum.metatag_sort where metatag=?

4

2 回答 2

1

您的_get_next_hashref-definition 看起来像某些类的方法,但您将其称为函数:

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

所以它没有得到任何对象信息,除了 . 它不能返回任何东西undef

于 2012-11-08T13:34:06.027 回答
0

您似乎忘记设置$sqlSQL 字符串:

"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}任何东西进行比较。如果里面有语句句柄,那就是真的。如果不是,那就是假的。
  • return如果“then”块中else有 a,则不要将 a放入return块中。你不需要else. 只需将其放在 - 语句下方if即可。
  • return没有参数总是返回undef。请参阅ProhibitExplicitReturnUndef

这是我的做法:

sub _get_next_hashref {
  my ($self) = @_;
  if ($self->{sth}) {
    if(my $hash_ref = $self->{sth}->fetchrow_hashref) {
      return $hash_ref;
    }
    # this will only be called if there was no result, thus no else needed
    undef $self->{sth}; # set to undef (or = '') if you must
  }
  # see above
  return; # returns undef if no param is given
}
于 2012-11-08T09:55:10.437 回答