in reply to Using If statement to set DBI prepare

First, prepare() is not a statement handle method, it's a database handle one. Apart from that, your way seems appropriate for what you want to do. In the TIMTOWTDI philosophy, you could set up the SQL statement and placeholders in the conditional and execute at the end. Something along the lines of

my ($sql, @placeholders); if (@rows == 0) { $sql = qq{SELECT 1}; @placeholders = ($svr1, $ap1, $in); } else { $sql = qq{SELECT 2}; @placeholders = ($svr1, $ap); } my $sth = $dbh->prepare($sql); $sth->execute(@placeholders);

Looks more wordy, but that's how I usually like to do it.

Update: I had a comment for @rows == "0", but apparently perl is smart enough to DWIM and guess the correct context, never producing any warning or some such, whatever the case may be (@rows eq "0", @rows eq 0 and @rows == 0 all work).

Replies are listed 'Best First'.
Re^2: Using If statement to set DBI prepare
by dtharby (Acolyte) on Jul 21, 2005 at 10:32 UTC
    Yeah, I know about the statement handle & db handle. as I said my original code is on another system and I can't remember all of it.
    thanks for the idea of placeholders, it makes it look much neater. I will give it a try.
    Thanks Danny
Re^2: Using If statement to set DBI prepare
by dtharby (Acolyte) on Jul 28, 2005 at 08:29 UTC
    I am having a problem now where the @rows eq "0" dows not appear to be working. @rows has a value and I have confirmed that it is correct. But the statement to see if the value is eq to 0 seems to be bypassed.
    Here is the code :-
    my $cth = $dbh->prepare('SELECT COUNT(*) FROM SuppressList WHERE A +ctive = ? AND ServerName = ? AND Application = ? and Instance = ?') o +r die "Couldn't Prepare statement: " . $dbh->errstr; $cth->execute($Active,$Server_Name,$App,$Inst); @rows = $cth->fetchrow_array(); cawto "Rows: @rows"; my ($sql, @placeholders); if (@rows ge "1") { $sql = qq{SELECT * FROM SuppressList WHERE Active = ? AND Serv +erName = ? AND Application = ? AND Instance = ?}; @placeholders = ($Active,$Server_Name,$App,$Inst); cawto "ServerName/App/Inst Execute Complete"; } else { $sql = qq{SELECT * FROM SuppressList WHERE Active = ? AND Serv +erName = ? AND Application = ?}; @placeholders = ($Active,$Server_Name,$App); cawto "ServerName/App Execute Complete"; } my $sth = $dbh->prepare($sql); $sth->execute(@placeholders);

    I am lost... it appears to work then it actually doesn't. Any tips ?
    Cheers
    Danny

    Update: Sorry forgot to add that I changed to ge from eq to see if that worked.. It doesn't. Also running this on Win32 platform.

      Start by using the correct operator: @rows == 1. The eq operator worked when comparing to 0, but it could very well be an exception.