SPUG: Using a Duplicate Value Error Message

BenRifkah Bergsten-Buret benb at speakeasy.net
Tue Mar 20 09:56:09 PDT 2007


Welcome Will,


Will Kidwell wrote:
> I've got RaiseError working, and it might be possible to use it 
> somehow to set a variable equal to 1 for "Try Again" or "0" for 
> "Success", but if thats the answer I'm still not sure of how to write 
> it out.
Just some background to start: Is the handles.users column restricted to 
unique values using some kind of duplicate key constraint?  If so it 
seems like you won't be able to insert duplicate entries am I right?  If 
that's the case then you're most of the way there.  You mentioned having 
RaiseError working.  This means that if you try to insert a duplicate 
record the DBI will throw an exception (i.e.: die).  You can use this to 
your advantage.  Try this for make_handle:

    sub make_handle {

        my ($dbh, $username, $password, $URL) = @_;
        my $sth = shift;

        my $sth = $dbh->prepare("INSERT INTO handles (users, passwords)
    VALUES(?,?)");

        my $success = 0;

        # trap any errors that may occur so that if the DBI dies the web
    page doesn't have to
        eval {
            $sth->execute($username, $password);
            $sth->finish();

            # if we got this far then there was no error and we
    succeeded in creating a new entry
            $success = 1;
        };

        $dbh->disconnect();

        # return a status code that says whether we were successful and
    also return any error that may have occurred.
        return $success, $@;
    }

Then when you call make_handle you can see if you were successful and if 
not you can see what kind of error occurred:

    if ($x eq ""){
      welcome();
    }

    elsif ($x eq "Submit"){
      my ($success, $error) = make_handle ($dbh, $username, $password,
    $URL);

      # if we succeeded let the user know
      if ($success) {
        success_page();
      }
     
      # otherwise we give them an error page
      else {

        # if the error was due to a duplicate entry the message will say so
        if ($error =~ m/duplicate entry/i) {

        # clean up the error message so that the user doesn't have to
    read DBI error talk
          $error = "The username '$username' is already in use. Please
    try again";

        # Then show the welcome page with a message this time so they
    can try again
          welcome($error);
        }

        # if it's not a duplicate entry we need to tell them that there
    was a db error and chances
        # are it won't help to try again
        else {
          error($error);
        }
      }
    }

    else {
      error();
    }

Have fun,

-- Ben


More information about the spug-list mailing list