use strict;
use DBI;
# edit these to match your server's settings
my $database=
"MyDatabaseName";
my $user=
"someuser";
my $password=
"somepass";
my $dbhost=
"MyHost";
my $dbh;
my $sth;
#############################################################
sub connect {
$dbh=DBI->
connect("DBI:mysql:database=$database;host=$dbhost",
$user,
$password)
or &handle_error
("Cannot open database $database. $DBI::errstr");
return ($dbh)
}
sub disconnect
{
if(defined $sth) { my $rc=
$sth->
finish;
}
if(defined $dbh) { my $rc=
$dbh->
disconnect or &handle_error
("Error on disconnect. $DBI::errstr");
}
}
#############################################################
# you could edit this to write to a log or send you an email
# or whatever you wanted
sub handle_error
{
my $error_string =
"Server name: ".
$ENV{SERVER_NAME
}.
"\n";
$error_string .=
"Request: ".
$ENV{REQUEST_URI
}.
"\n";
$error_string .=
"Method: ".
$ENV{REQUEST_METHOD
}.
"\n";
$error_string .=
"Cookies: ".
$ENV{HTTP_COOKIE
}.
"\n";
$error_string .=
"Remote address: ".
$ENV{REMOTE_ADDR
}.
"\n";
my $buf;
if ($ENV{'REQUEST_METHOD'} eq
'POST') { read(STDIN,
$buf,
$ENV{'CONTENT_LENGTH'});
}
else { $buf=
$ENV{'QUERY_STRING'};
}
$error_string .=
"Variables: ".
$buf.
"\n\n\n";
$error_string .=
"Error: \"@_\"";
#now you have an error message
#you could do whatever you wanted with
# I wouldn't display all that info to your user though
exit 0;
}
#############################################################
#just execute a sql qry .. no return .. fails safely
sub safe_do
{
my $sql=
$_[0];
$dbh->
do($sql) or &handle_error
("SQL statement failed: $sql; ERROR DESCRIPTION: $DBI::errstr");
}
#############################################################
#just execute a sql qry and ignore all errors that are non-fatal
sub unsafe_do
{
my $sql=
$_[0];
return $dbh->
do($sql);
}
#############################################################
#returns a single row of values
sub safe_select_row
{
my $sql=
$_[0];
my @row=
$dbh->
selectrow_array($sql);
&handle_error
("SQL statement failed: $sql; ERROR DESCRIPTION: $DBI::errstr") if $DBI::
errstr;
return @row;
}
#############################################################
#retrurns a single row of values as a referrence
sub safe_select_row_ref
{
my $sql=
$_[0];
my $row=
$dbh->
selectrow_arrayref($sql);
&handle_error
("SQL statement failed: $sql; ERROR DESCRIPTION: $DBI::errstr") if $DBI::
errstr;
return $row;
}
#############################################################
#returns a single row of values in a hash referrence
sub safe_select_row_hashref
{
my $sql=
$_[0];
my $sth=
$dbh->
prepare($sql)
or &handle_error
("SQL statement failed: $sql; ERROR DESCRIPTION: $DBI::errstr");
$sth->
execute()
or &handle_error
("SQL statement failed: $sql; ERROR DESCRIPTION: $DBI::errstr");
my $row=
$sth->
fetchrow_hashref();
#$sth->finish();
return $row;
}
#############################################################
#returns a result
sub select_rows
{
my $sql=
$_[0];
my $sth=
$dbh->
prepare($sql)
or &handle_error
("prepare failed: $sql; ERROR DESCRIPTION: $DBI::errstr");
$sth->
execute() or &handle_error
("execute failed: $sql; ERROR DESCRIPTION: $DBI::errstr");
return $sth;
}
#############################################################
#returns all rows in an array reference
sub select_all_rows
{
my $sql=
$_[0];
my $sth=select_rows
($sql);
my $rows=
$sth->
fetchall_arrayref();
return $rows;
}
#############################################################
#checks to see if a table exits
sub table_exists
{
my ($table)=
@_;
my @names=
$dbh->
tables();
my $field;
foreach $field (@names) {
if($field eq
$table) { return 1;
}
}
return 0;
}
#############################################################
#exec sql statement, returns the number of rows affected
sub exec {
my($sql)=
@_;
my $sth=
$dbh->
prepare($sql)
or &handle_error
("Can't prepare statement '$sql': $DBI::errstr");
my $rows_affected=
$sth->
execute
or &handle_error
("Can't execute statement '$sql': $DBI::errstr");
return $rows_affected;
}
#############################################################
#exec sql statement with values, returns the number of rows affected
sub execWithValues
{
my($sql,
@values)=
@_;
my $sth=
$dbh->
prepare($sql)
or &handle_error
("Can't prepare statement '$sql': $DBI::errstr");
my $rows_affected=
$sth->
execute(@values)
or &handle_error
("Can't execute statement '$sql': $DBI::errstr");
return $rows_affected;
}