Hi

I am on a RedHat box with perl 5.8.8.  I have just started usinf
"bind_param" but am having an issue.

In my script I have the following section of perl:

########################################
    $tmp = <<EOF;
SELECT DISTINCT
    UPPER(eS.machine) AS Machine
FROM
    userTracking.sessions s
        LEFT JOIN userTracking.eventLog eS ON  eS.id = s.start_id
        LEFT JOIN userTracking.eventLog eE ON eE.id = s.end_id
        LEFT JOIN userTracking.logbooks l ON s.id = l.sessions_id
WHERE
    eS.date BETWEEN ? AND ?
    OR IFNULL(eE.date, NOW()) BETWEEN ? AND ?
    OR (eS.date < ?
        AND IFNULL(eE.date, NOW()) > ?)
ORDER BY
    eS.machine
EOF

    if (!($sth = $DBH->prepare($tmp))) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }
    $sth->bind_param(1, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(2, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(3, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(4, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(5, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(6, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    if (!($sth->execute())) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }

    for (my $i = 0; @row = $sth->fetchrow_array; $i++) {
        push(@{$INFO{formParameters}{machineList}}, $row[0]);
    }
    $sth->finish;
    $sth = undef;

    $tmp = <<EOF;
SELECT DISTINCT
    UPPER(eS.netid) AS Netid
FROM
    userTracking.sessions s
        LEFT JOIN userTracking.eventLog eS ON  eS.id = s.start_id
        LEFT JOIN userTracking.eventLog eE ON eE.id = s.end_id
        LEFT JOIN userTracking.logbooks l ON s.id = l.sessions_id
WHERE
    eS.date BETWEEN ? AND ?
    OR IFNULL(eE.date, NOW()) BETWEEN ? AND ?
    OR (eS.date < ?
        AND IFNULL(eE.date, NOW()) > ?)
ORDER BY
    eS.netid
EOF

    if (!($sth = $DBH->prepare($tmp))) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }
    $sth->bind_param(1, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(2, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(3, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(4, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(5, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(6, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    if (!($sth->execute())) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }

    for (my $i = 0; @row = $sth->fetchrow_array; $i++) {
        push(@{$INFO{formParameters}{netidList}}, $row[0]);
    }
    $sth->finish;
    $sth = undef;

    $tmp = <<EOF;
SELECT
    UPPER(eS.machine) AS Machine,
    UPPER(eS.netID) AS NetID,
    DATE_FORMAT(eS.date, '%Y/%m/%d %H:%i:%S') AS Start,
    IF (eE.date IS NULL,
        '',
        DATE_FORMAT(eE.date, ''%Y/%m/%d %H:%i:%S')) AS End,
    FORMAT((UNIX_TIMESTAMP(IFNULL(eE.date, NOW())) -
            UNIX_TIMESTAMP(eS.date)) / 3600, 4) AS Elapsed,
    IFNULL(
        GROUP_CONCAT(
            '<div class=\"eventDisplayDiv\"><span class=\"',
            l.severity, '\">',
            DATE_FORMAT(l.date, '%m/%d/%Y %H:%i:%S'),
            ' ',
            l.netid,
            '</span><br/>',
            l.entry,
            '</div>'
        ORDER BY
            l.date DESC
        SEPARATOR
            ''
        ),
        ''
    ) AS Event
FROM
    userTracking.sessions s
        LEFT JOIN userTracking.eventLog eS ON  eS.id = s.start_id
        LEFT JOIN userTracking.eventLog eE ON eE.id = s.end_id
        LEFT JOIN userTracking.logbooks l ON s.id = l.sessions_id
WHERE
    eS.date BETWEEN ? AND ?
    OR IFNULL(eE.date, NOW()) BETWEEN ? AND ?
    OR (eS.date < ?
        AND IFNULL(eE.date, NOW()) > ?)
GROUP BY
    s.id
ORDER BY
    eS.date
LIMIT ?, ?
EOF

    if (!($sth = $DBH->prepare($tmp))) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }
    $sth->bind_param(1, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(2, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(3, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(4, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(5, $INFO{formParameters}{dateStart}, SQL_DATETIME);
    $sth->bind_param(6, $INFO{formParameters}{dateEnd},   SQL_DATETIME);
    $sth->bind_param(7, $INFO{formParameters}{limitOffset},
                     SQL_INTEGER);
    $sth->bind_param(8, $INFO{formParameters}{limitLength},
                     SQL_INTEGER);

    if (!($sth->execute())) {
        push(@{$INFO{error}}, "DB prepare failed");
        return encode_json(\%INFO);
    }

    for (my $i = 0; @row = $sth->fetchrow_array; $i++) {
        $row[4] += 0;
        push(@{$INFO{table}{$row[0]}{$row[1]}}, [@row[2 .. $#row]]);
    }
    $sth->finish;
    $sth = undef;
########################################

I have used DBI->trace("2|SQL")  and I see that the first two queries
are being run correctly.  However, I get the message:

        myscript.pl DBD::mysql::st bind_param failed: Illegal
parameter number at ./myscript.pl line 268.

Line 268 corresponds to the first bind_param line of the last select.

I have tried the binds without the types.  I tried putting the values
in the execute().  I tried removing the LIMIT.

ideas?

Reply via email to