2

DBI メソッドに問題があったことを覚えていますselectrow_array。私が十分に整頓されていなかったとき、私が尋ねた列の値ではなく、列の数(または不要なもの、正確に思い出せません)が返されました。今、私はいくつかのコードをリファクタリングしようとしていますが、可能な限りすべての場所で、期待値のみが返されるようにしたいと考えています。だから私は驚きを避け、悪い行動が何であったかを見つけようとします. DBI docs から、これは本当に問題のある状況である可能性があることを読みました:

複数の列を持つステートメント ハンドルのスカラー コンテキストで呼び出された場合、ドライバーが最初の列の値を返すか最後の列の値を返すかは未定義です。だから、それをしないでください。また、スカラー コンテキストでは、行がなくなった場合やエラーが発生した場合は、"undef" が返されます。最初のフィールド値が NULL だったので、その「undef」は返された「undef」と区別できません。これらの理由から、「selectrow_array」をスカラー コンテキストで使用する場合、または使用しない場合は注意が必要です。

selectrow_arrayそれでも、値以外のものを返すことを強制することはできませんcol1(それが私が期待していることです)

my $query = 'SELECT col1, col2, col3 FROM table WHERE id = 112233';

my ( $c ) = ( $dbh->selectrow_array( $query ) );
my $x = ask_from_db();
my $y = $dbh->selectrow_array( $query );
my $z = ( $dbh->selectrow_array( $query ) );
my @A = $dbh->selectrow_array( $query );

say "C: $c"; # C: col1
say "X: $x"; # X: col1
say "Y: $y"; # Y: col1
say "Z: $z"; # Z: col1
say "A: @A"; # A: col1 col2 col3

sub ask_from_db {
  return $dbh->selectrow_array( $query );
}

上記で尋ねるたびに、良い結果が得られます。間違った結果を得るには、どのようにクエリを実行すればよいですか?

間違った結果 !=col1

4

2 に答える 2

3

「ドライバーが最初の列または最後の列の値を返すかどうかは未定義です」というドキュメントの意味は、返される列がデータベースドライバーによって定義され、DBI.

そのため、Postgres ドライバーは常に最初の列を返すことを決定する可能性がありますが、mysql ドライバーは常に最後の列を返すか、返される列はクエリに依存する可能性があります。

したがって、呼び出しはスカラー コンテキストではありませんselectrow_array。常にリスト コンテキストで呼び出してください。

my @row = $sth->selectrow_array($query)

ドキュメントに記載されているすべての問題を回避できます。

于 2012-11-23T15:28:03.697 に答える
3

結果の違いは、ドライバーの実装に基づいています。

wantarray ? @row : $row[0]

wantarray ? @row : $row[-1]

別のドライバーを使用して、別の結果を得ることができます。そうは言っても、最初に返さないドライバーを見つけるのは難しいと思います。

確実に最初のものを取得したい場合は、次を使用します。

( $dbh->selectrow_array( $query ) )[0]
于 2012-11-23T17:08:43.667 に答える