2016-08-12 1 views
1

Ich bin nicht in der Lage, die Ausgabe richtig mit dem folgenden Code abrufen. Bitte hilf mir, es zu klären.fetchrow_hashref Problem in Perl

Ich bekomme anders ausgegeben, um in MySQL und Perl zu laufen.

Ab sofort gibt es undef zurück, wenn ich Dumper benutze. Aber ich möchte, dass es null anzeigt.

$reactivate_sth = $dbh->prepare(" 
     SELECT 
     a, 
     b 
     FROM 
     table 
     WHERE 
     c = ? 
     AND 
     d = ? 
     ORDER BY 
     date DESC 
    "); 
$reactivate_sth->execute($c, $d); 
print $result = $reactivate_sth->fetchrow_hashref(); 

OUTPUT:

MySQL:

Empty set (0.00 sec) 

Perl:

HASH(0x3068198) 

Data :: Dumper

VAR1 = undef 
+2

Was zeigt 'Data :: Dumper' das' $ result' -Hash enthält? Befindet sich das MySQL unter einem transaktionalen Status (der möglicherweise ein 'commit' erfordert)? –

+1

Was @DravSloan sagte. Sind Sie sicher, dass Sie sich in beiden Fällen mit derselben Datenbankinstanz verbinden? –

+0

Es kann sich herausstellen, dass Sie ein "leeres" Ergebnis von 'fetchrow_hashref()' validieren können, indem Sie 'if (!% $ Result)' ausgeben. Wenn ein leerer Hashwert getestet wird, wird false zurückgegeben, wenn er keine Schlüssel/Wert-Paare enthält. (Sie müssen Ihrem Hash den Operator '%' voranstellen, da es sich um eine Hash-Referenz handelt). –

Antwort

1

Endlich fand ich die Lösung für dieses Problem. Ich bin mir nicht sicher, ob das eine richtige Lösung ist oder nicht.

Bitte führen Sie mich, wenn die Reparatur nicht professionell ist.

if (!defined $result->{''}) { 
    $result = ''; 
} 
+0

Probieren Sie if (keys% hash) { # Es gibt Schlüssel } else { # Es gibt keine Schlüssel } – Developer

2

Sie müssen Ihren Code lesbarer machen. Es ist oft nützlich, eine heredoc zu verwenden SQL-Anweisungen zu zitieren, wie dies

my $reactivate_sth = $dbh->prepare(<<END_SQL); 
SELECT a, b 
FROM table 
WHERE c = ? AND d = ? 
ORDER BY date DESC 
END_SQL 

$reactivate_sth->execute($c, $d); 

my $result = $reactivate_sth->fetchrow_hashref; 

Jetzt $result ist eine Referenz auf einen Hash, weil Sie die fetchrow_hashref Methode aufgerufen. Drucken wird, wie Sie gefunden haben, etwas wie HASH(0x1cc5a8) produzieren. Sie müssen auf die Elemente des Hashs zugreifen, um Sinn des Ergebnisses zu machen

Danach weiß ich nicht, welche Ausgabe Sie wollen. Sie können den Kern Data::Dumper Modul verwenden den Datensatz anzuzeigen, die Sie dieses

abgerufen haben
use Data::Dumper; 
print Dumper $result; 

diese Hilfe tut? Sie haben nichts mehr verlangt

+0

Ich habe 'execute ($ c, $ d) 'Teil nicht bekommen. Kannst du mir bitte erklären, wie es funktioniert, da ich keine Ahnung habe. – Arijit

+0

@Arijit: Bitte entführen Sie nicht die Frage eines anderen. Wenn du etwas fragen willst, dann schreibe bitte eine eigene Frage. – Borodin

+0

@Borodin: mysql gibt einen leeren Datensatz zurück. Aber Kipper druckt undef. Ich möchte nicht undef anzeigen. – Vasanth