3

行と列を 1 つだけ生成する mysql-query があります。クエリを対話的にチェックすると、結果が表示されます。これが必要です。しかし、使用する $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ため、常に 1 つの行のみが存在する必要があります。何らかの理由で、それ以外の場合はより多くの行になるインデータは完全に機能しますが、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

-definition_get_next_hashrefは一部のクラスのメソッドのように見えますが、関数のように呼び出します:

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

と を使用strictしていwarningsますか? これを考慮してください:以下:

"some code";
print "bar";

use warnings次の行が表示されます。

Scratch.pl 行 5318 の void コンテキストでの定数 (一部のコード) の無駄な使用。


私はあなたのためにコードを少し変更する自由を取りました.

  • @MoritzBunkus が言ったように、何かと比較する必要はありません$self->{sth}。その中にステートメント ハンドルがあれば、それは true になります。そうでない場合は、false になります。
  • 「then」ブロックにa がある場合はreturn、ブロックに a を入れないでください。は必要ありません。-ステートメントの下に置くだけです。elsereturnelseif
  • return引数がない場合は、常に が返されますundefProhibitExplicitReturnUndefを参照してください。

これが私がそれを行う方法です:

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 に答える