4887l1

Listing 1. retrieve-today-birthday.pl, which uses DBI to retrieve the
names of people in our "addressbook" table whose birthdays are today.

#!/usr/bin/perl

use warnings;    # Perl 5.6.x version of "-w" option
use strict;
use DBI;

# Set up some basic variables
my $dbname = 'addressbook';
my $username = 'reuven';
my $password = '';

# What name should we look for?
my $look_for_name = $ARGV[0];
die "You didn't enter a name to look for " unless $look_for_name;

# Connect to the database
my $dbh = DBI->connect("dbi:Pg:dbname=addressbook", $username, $password,
                      {RaiseError => 1, PrintError => 1, AutoCommit => 1});

# Make sure that we successfully connected to the database
die "No connection to the database: '$DBI::errstr' "
    unless $dbh;

# Add % to the front and back, for an SQL regexp
$look_for_name = "%" . $look_for_name . "%";

# Create the SQL query
my $sql = "SELECT first_name, last_name, birthday ";
$sql .= "  FROM People ";
$sql .= "  WHERE (first_name LIKE ?) OR (last_name LIKE ?) ";

# Prepare the query
my $sth = $dbh->prepare($sql);

# Execute the query
$sth->execute($look_for_name, $look_for_name);

# Iterate through returned rows
while (my $row_ref = $sth->fetchrow_arrayref)
{
    my ($first_name, $last_name, $birthday) = @{$row_ref};
    print "$first_name $last_name (birthday: $birthday)\n";
}

# Make sure that some rows were returned
if ($sth->rows == 0)
{
    print "No one in the addressbook matches that pattern.\n";
}

# We're done with this SQL statement
$sth->finish;

# Close our connection to the database
$dbh->disconnect;
