in reply to Perl CGI and SQL statements

Mr. Muskrat explained that:
$db = new Win32::ODBC("$DSN"),
needed to be:
$db = new Win32::ODBC("$DSN");
You've posted the code again with the same error. You could at least fix that bit.

use diagnostics; can be very useful. But if you have many errors it can be a bit overwhelming! I would comment it out while you eliminate the obvious errors. I added use warnings; added my to a few variable declarations and was able to get the thing to compile. Which is a start. Difficult to help you much more because of your data source.

Hope that helps.

Update:

$cgi->p("$dept was received."),
should be:
$cgi->p("$dept was received.");

Replies are listed 'Best First'.
Re^2: Perl CGI and SQL statements
by kjg (Sexton) on Apr 19, 2006 at 09:30 UTC
    Um, looking above that is a ';' not a ',' so now I'm a bit perplexed.

    I don't have 'use warnings' in my perl installation :(

      It was the line before it. See my updated post.

      If your perl is earlier than 5.6.x add  -w to the end of the shebang line.

      Right I've commented everything out and found that the problem seems to hinge on my IF statement. This is my code now:
      use strict; use diagnostics; use CGI qw(:standard); use CGI::Carp qw/fatalsToBrowser/; use Win32::ODBC; use lib '/perlcgi/settings'; require 'settings.pl'; # Included configuration file which contains g +lobal variables my %labels = ( MA => 'Mortgage Advisers', CA => 'Customer Advisers', BM => 'Branch Management', HO => 'Head Office', Acc => 'Accord', MSa => 'MCC Sales', MSe => 'MCC Service', ); my $cgi = CGI->new; my $dept = $cgi->param('department'); my $folderday = '19Apr'; my $SqlStatement ='SELECT * FROM Pipeline WHERE Publish<="$today" AND +Expiry>="$today" AND CA="Must Read"'; my $today = '19 Apr 2006'; print $cgi->header('text/html'); if (defined $dept) { if (exists $labels{$dept}) { # FIXME # untaint $dept and put it into database print $cgi->start_html, $cgi->p("$dept was received."), if ($dept ='CA'){ } # end of IF CA= $cgi->end_html; } else { print $cgi->start_html, $cgi->p("$dept was received, but is not a valid department + name."), $cgi->end_html; }; } else { print $cgi->start_html, $cgi->start_form( -action => $cgi->script_name, ), $cgi->popup_menu( -name => 'department', -values => [keys %labels], -labels => \%labels, ), $cgi->submit, $cgi->end_form, $cgi->end_html; };
      The error message says there are compilation errors and syntax errors at this bracket:

      } # end of IF CA=

      but I think it doesn't like:

      if ($dept ='CA'){

      What's wrong with that?

        if ($dept='CA') is an assignment, not a comparisson. In addition you should use 'eq' for a texual comparison (== for numeric). So:
        if ($dept eq 'CA')
        is the way to go.
        HOWEVER, you have an imbedded 'if' inside a print staement, which is the reason for the syntax error. I suggest you break it up into two print statements.
        $cgi->p("$dept was received."),
        Change the comma to a ;

        Also:

        if ($dept eq'CA'){
        is better than:
        if ($dept ='CA'){
        If you had warnings (-w) enabled that would have been flagged up too.

        Update: == corrected to eq as pointed out by cdarke below