Thomas, I'm not sure if this is what you're looking for(for
sql errors), but using "eval" and RaiseError => 1 is
recommended for catching *DBI* errors.  Not sure if that
works for catching *SQL* errors.  Read the DBI docs on this
by doing

   perldoc DBI

at a command prompt.

Are you saying that the SQL passed to your function may
*NOT* be valid SQL?  I'm not in a position to test this
now, but I'd try implementing "eval" with RaiseError for
error trapping, and then test by passing invalid sql
to your function.

HTH.

-- 
Hardy Merrill
Senior Software Engineer
Red Hat, Inc.

Webmaster [[EMAIL PROTECTED]] wrote:
> I have made a MySQL library for PERL, using the DBI interface, but I'm
> having problems catching errors!
> 
> If there is a SQL-error the browser-window just turnes white and thats not
> that informative!
> 
> As you can see, I've made a function that receives a $sql with the
> SQL-Statement in and a reference to @data.
> My function then exec the SQL and puts the returned data in the array @data.
> This works just fine, but how (and where) should I
> insert code for catching a SQL error and maybe print it to the screen or
> even better mail the error to me???
> 
> Best regards
> 
> Thomas Haggren
> Denmark
> 
> Here is my code:
> 
> $sql = qq�
>     SELECT data
>     FROM table
>     where someting = 1�;
> &sql_select_cols( $sql, \@data);
> 
> #
> # sql_select_cols
> #
> sub sql_select_cols
> {
>      # Define vars
>      my($dbh, $sth, $numberOfRows, $i, @row);
> 
>      # Get params from function call
>      my($sql, @params) = @_;
> 
>      # Use DBI - Database independent interface for Perl
>      use DBI;
> 
>      # Make connection to database
>      if(!$dbh)
>      {
>           $dbh = DBI->connect($DSN, $USER, $PASSWORD, {  RaiseError => 1,
> 
> PrintError => 1,
> 
> AutoCommit => 1} );
>      }
> 
>      # Clear arrays that ref is pointing at
>      for($i=0; $i < scalar(@params); $i++) { undef(@{$params[$i]}); }
> 
>      # Prepare and execute sql
>      $sth = $dbh->prepare("$sql");
>      $sth->execute();
> 
>      # Clear number of rows
>      $numberOfRows = 0;
> 
>      # Loop results and return data through params
>      while (@row = $sth->fetchrow_array)
>      {
>           # Assemble all rows in one var separated by ;;
>           my($tabelfields) = join(";;",@row);
> 
>           # Loop all params parses
>           for($i=0; $i < scalar(@params); $i++)
>            {
>             # Split $tabelfields at ;; and store data in the right param
>            my(@temp) = split(/;;/, $tabelfields);
>            $params[$i]->[$numberOfRows] = $temp[$i];
>            }
> 
>           # Increase number of rows
>           $numberOfRows++;
>      }
> 
>      # If you wish to know the number of exec sql-statements on a page, you
> can alert $sql_select_cols_counter
>      if(!$sql_select_cols_counter) { $sql_select_cols_counter = 1; }
>      else          { $sql_select_cols_counter++; }
> 
>      # Disconnect from database
>      $dbh->disconnect;
> 
>      # Return number of rows
>      return $numberOfRows;
> }

Reply via email to