Wie kann ich überprüfen, ob eine Datenbankabfrage Ergebnisse angezeigt werden?

StackOverflow https://stackoverflow.com/questions/290133

  •  08-07-2019
  •  | 
  •  

Frage

Unsere Website benutzt Perl einen einfachen Mechanismus für unsere HR Menschen offene Stellen auf unserer Website zu veröffentlichen. Es wurde von einem Dritten entwickelt, aber sie haben in Berührung längst getreten worden, und leider haben wir keine Perl Fähigkeiten im eigenen Hause. Dies ist, was passiert, wenn Marketing-Leute ihre internen IT-Team umgehen!

Ich muss eine einfache Änderung, um diese Anwendung zu machen. Derzeit sagt die offenen Stellen Seite ‚Wir derzeit folgende offene Stellen haben:‘, unabhängig davon, ob es irgendwelche offene Stellen! So wollen wir es so ändern, dass diese Linie nur zu den entsprechenden Zeiten angezeigt wird.

Ich kann offensichtlich beginne ein bisschen Perl zu lernen, aber wir sind schon eine Ersatz-Website planen, und es wird sicherlich nicht Perl werden. So, da die Lösung für die mit diesen Fähigkeiten trivial sein, dachte ich, dass ich für einige gezielte Hilfe bitten würde.

Im Folgenden ist der Beginn des Verfahrens, dass die offenen Stellen auflistet.

sub list {
  require HTTP::Date;
  import HTTP::Date;

  my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];

  my $dbh = DBI->connect($dsn, $user, $password)
    || die "cannot connect to $database: $!\n";

  my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL

  my $sth = $dbh->prepare($sql);
  $sth->execute();


  while (my $ref = $sth->fetchrow_hashref()) {
    my $temp  = $template;
    $temp     =~ s#__TITLE__#$ref->{'title'}#;

    my $job_spec = $ref->{'job_spec'};

...etc...

Der Schlüssel Linie ist while (my $ref = $sth->fetchrow_hashref()) {. Ich bin herauszufinden, dass dies zu sagen ‚während ich eine andere freie Stelle aus dem zurück-Cord abziehen kann ...‘. Wenn ich vor dieser Zeile meiner print-Anweisung, wird sie immer angezeigt werden; nach dieser Zeile, und es wurde für jede freie Stelle wiederholt werden.

Wie kann ich feststellen, dass es einige offene Stellen ohne vorzeitig bewegen durch das zurückgegebene Re-Cord angezeigt, werden?

Ich konnte immer den Code innerhalb der while-Schleife kopieren, und legen Sie sie in einer if () Anweisung (vor der while-Schleife), die auch meine umfassen wird print-Anweisung. Aber ich würde es vorziehen, nur den einfacheren Ansatz von If any records then print "We currently have.." line haben. Leider habe ich keine Ahnung, selbst diese einfache Linie zu codieren.

Siehe, ich habe dir gesagt, es ist ein triviales Problem ist, auch meine tastete Erklärung unter Berücksichtigung!

TIA

Chris

War es hilfreich?

Lösung

Eine wirklich einfache Art und Weise sei:

$sth->execute();

my $first = 1;
while (my $ref = $sth->fetchrow_hashref()) {
    if( $first ) {
        print "We currently have the following vacancies:\n";
        $first = 0;
    }
    my $temp  = $template;
    ...
}
if( $first ) {
    print "No vacancies found\n";
}

Andere Tipps

Wenn Sie mit Mysql, die „Reihen“ Methode funktioniert gut:

$sth->execute();

if($sth->rows) {
  print "We have data!\n";
}

while(my $ref = $sth->fetchrow_hashref()) {
...
}

Das Verfahren, und einige Einsprüche werden in umfangreichem Detail in "perldoc DBI" dokumentiert. Beginnen Sie immer mit "perldoc".

Dies ist nicht so sehr eine Frage Perl, da es eine Datenbank Frage ist, und es gibt keine gute Möglichkeit, zu wissen, wie viele Ergebnisse, die Sie haben, bis Sie sie haben. Du hast zwei Möglichkeiten hier:

  1. Sie eine Abfrage durchführen, die ein „select count (*)“ tut, um zu sehen, wie viele Zeilen sind, und dann in einer anderen Abfrage, um die tatsächlichen Zeilen oder
  2. zu erhalten
  3. die Abfrage durchführt und die Ergebnisse in ein Hash speichern, dann zählen, wie viele Einträge, die Sie in der Hash haben, und dann durch die Hash-gehen und die Ergebnisse ausdrucken.

Zum Beispiel aus der Spitze von meinem Kopf:

my @results = ();
while (my $ref = $sth->fetchrow_hashref()) {
   push @results, $ref;
}

if ($#results == 0) {
  ... no results
} else {
  foreach $ref (@results) {
    my $temp = $template;
    ....
 }

Da jeder will für die wiederholten Tests optimieren weg, ob der Header in Graeme Lösung gedruckt wurde, stelle ich diese kleinere Variante vor:

$sth->execute();

my $ref = $sth->fetchrow_hashref();
if ($ref) {
  print "We currently have the following vacancies:\n";
  while ($ref) {
    my $temp  = $template;
    ...
    $ref = $sth->fetchrow_hashref();
  }
} else {
    print "No vacancies found\n";
}

Da Ihre Abfrage ein ist SELECT können Sie nicht ausnutzen Zeilen oder des Wertes durch die ausführen selbst.

Sie können jedoch im Voraus zählen, wie viele Zeilen (das heißt offene Stellen), um Ihre Abfrage durch das Hinzufügen eines weiteren Abfrage ... etwas wie folgt wählen wird:

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?";
$sth = $dbh->prepare($query);
$sth->execute($date);
$numVacancies = $numinfo->fetchrow_arrayref()->[0];

# Debug:
print "Number of vacancies: " . $numVacancies . "\n";

if ( $numVacancies == 0 ) { # no vacancy found...
    print "No vacancies found!\n";
}
else { # at least a vacancy has been found...
    print "We currently have the following vacancies:\n";

    # Retrieve the vacancies:
    my $sql = "SELECT * FROM $table where expiry >= '$date' ORDER BY expiry";
    my $sth = $dbh->prepare($sql);
    $sth->execute();

    ...
}

Oder ähnlich, anstelle von "vorbereiten" und "Ausführen" die Abfrage und dann mit "fetchrow_array" , können Sie alles tun, in einem Aufruf mit selectrow_array :

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?"; 
my $numVacancies = $dbh->selectrow_array($query, undef, $date);

# Debug:
print "Number of vacancies: " . $numVacancies . "\n";

Und das gleiche gilt auch für selectall_arrayref :

# Retrieve how many vacancies are currently offered:
my $query = "SELECT COUNT(*) AS rows FROM $table WHERE expiry >= ?";
my $numVacancies = $dbh->selectall_arrayref($query, {Slice => {}}, $date);

# Debug:
print "Number of vacancies: " . @$numVacancies[0]->{rows} . "\n";

Allerdings, wenn Sie selectrow_array oder selectall_arrayref , können Sie auch die Zahl der offenen Stellen abgerufen werden direkt aus dem Ergebnis der ursprünglichen Abfrage:

# Retrieve the vacancies:
my $sql = "SELECT * FROM $table where expiry >= ? ORDER BY expiry";
my $vacancies = $dbh->selectall_arrayref($sql, {Slice => {}}, $date);

# Debug:
print "Number of vacancies: " . scalar @{$vacancies} . "\n";

Ein bisschen effizienter Art und Weise (eine bedingte innerhalb der Schleife zu vermeiden), wenn Sie es nicht stört die Art und Weise verändert sich die Seite ausgegeben wird etwas (auf einmal anstatt eine Zeile zu einem Zeitpunkt), könnten Sie eine Variable machen hält die Ausgabe kurz vor der Schleife:

my $output = '';

und dann in der Schleife, jede print-Anweisung ändern wie folgt aussehen:

$output .= "whatever we would have printed";

dann nach der Schleife:

if ($output eq '')
{
  print 'We have no vacancies.';
}
else
{
  print "We currently have the following vacancies:\n" . $output;
}

Fügen Sie einfach eine andere Abfrage .. so etwas wie folgt aus:

# count the vacancies    
$numinfo = $dbh->prepare("SELECT COUNT(*) FROM $table WHERE EXPIRY >= ?");
$numinfo->execute($date);
$count = $numinfo->fetchrow_arrayref()->[0];

# print a message
my $msg = '';
if   ($count == 0) $msg = 'We do not have any vacancies right now';
else               $msg = 'We have the following vacancies';
print($msg);
use Lingua::EN::Inflect 'PL';

$sth->execute();
my $results = $sth->fetchall_arrayref( {}, $max_rows );

if (@$results) {
    print "We currently have the following ", PL("vacancy",scalar @$results), ":\n";

    for my $ref (@$results) {
        ...
    }
}

sagt perldoc DBI:

 For a non-"SELECT" statement, "execute" returns the number of rows
 affected, if known. If no rows were affected, then "execute"
 returns "0E0", which Perl will treat as 0 but will regard as true.

Die Antwort ist also den Rückgabewert von $ sth- zu überprüfen> execute ():

 my $returnval = $sth->execute;
 if (defined $returnval && $returnval == 0) {
     carp "Query executed successfully but returned nothing";
     return;
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top