Re: Stored procedures, PDO, and PHP issue

Eric Chamberlain <[email protected]> Wed, 19 Aug 2009 13:58:04 -0700
Newsgroups gmane.comp.db.postgresql.php
Message-ID <[email protected]>
> Hi Eric,
>
> What about setting your SQL text to use $1 and $2 as the parameter
> values?  I'm currently doing this in the C API (as I type this!) so  
> not
> sure if this will work in PHP PDO.
>
> $stmt = $db->prepare("SELECT is_password_expired($1::integer,
> $2::varchar)");
>

Unfortunately this does not work or I maybe doing it wrong.  New code:
$stmt = $db->prepare("SELECT is_password_expired($1::integer,  
$2::varchar);
$stmt->bindValue(1, settype($userId, "integer"), PDO::PARAM_INT);
$stmt->bindValue(2, $hashPass, PDO::PARAM_STR);
$stmt->execute();

> When you say "this completely fails" - in what respect?  What errors  
> do
> you get?

I get a blank screen.  I've tried setting the error reporting level to:

error_reporting(E_ALL);

before calling the above code.  Our servers are configured to display  
errors, etc.  The fact that it just goes blank tells me there is a  
bigger issue going on.

> Also have you tried making sure your PHP $userId is an integer
> not a string - e.g. settype($userId, 'integer');  Again I'm not sure  
> if
> this has a bearing on the PDO stuff as I've never used it.
>

Yes, I have tried settype hoping that would somehow make PDO use the  
right one.

> Regards,
> Andy
>
>
> Eric Chamberlain wrote:
>> I'm having an issue calling a specific stored proc using PHP and PDO.
>> I have two procs with the same name and same number of parameters.
>> However, the parameter types are different.  When the below code is
>> called in PHP it always calls the varchar, varchar proc.  I can not
>> get it to call the integer, varchar proc.
>>
>> Stored procedure definitions:
>> boolean is_password_expired(i_user varchar, i_pass varchar)
>> boolean is_password_expired(i_user_id integer, i_pass varchar)
>>
>> $stmt = $db->prepare("SELECT is_password_expired(?, ?)");
>> $stmt->bindValue(1, $userId, $hashPass, PDO::PARAM_INT);
>> $stmt->execute();
>>
>> This always returns false because it's passing the $userId, of say
>> "1", to the varchar, varchar proc.  I've tried using the following:
>>
>> $stmt = $db->prepare("SELECT is_password_expired(?::integer,
>> ?::varchar)");
>>
>> This completely fails.
>>
>> $stmt->bindParam(1, $userId, $hashPass, PDO::PARAM_INT);
>>
>> Same as bindValue result.
>>
>> $stmt->execute(array($userId, $hashPass));
>>
>> Same result.
>>
>> Is there some way to inform PDO and Postgresql that I plan on using
>> the integer, varchar proc?  If so, how do I do this?  Thanks all!
>>
>> Eric
>>