Edit report at https://bugs.php.net/bug.php?id=35935&edit=1

 ID:                 35935
 Comment by:         jmpalacios at gmail dot com
 Reported by:        victoria at balic dot net
 Summary:            MySQL stored procedure doesn't return value when
                     using bindParam()
 Status:             Not a bug
 Type:               Bug
 Package:            PDO related
 Operating System:   RHEL4-64/CentOS 4.2-64
 PHP Version:        5.1.1
 Assigned To:        wez
 Block user comment: N
 Private report:     N

 New Comment:

I'm using PHP 5.4.14 and MySQL 5.5.30 on Mac OS X 10.8 and I'm also seeing this 
exact same problem.

There's bug report for the MySQL side of the issue here 
http://bugs.mysql.com/bug.php?id=11638. Even though it's closed, because it was 
reported as being fixed in MySQL 5.5.3, some of us demonstrated it's still an 
issue even as of MySQL 5.6.11. So I'm hoping it'll get re-opened at some point 
in the future; if not, I'll look into opening a new bug report for the problem.

In any case, apparently MySQL is interested in making the binding of output 
parameters via its C API a possibility, so when they do it'd be great to have 
the PHP side of things fixed up to finally make it a possibility.

Thanks!


Previous Comments:
------------------------------------------------------------------------
[2006-04-09 07:47:37] w...@php.net

MySQL doesn't supporting binding output parameters via its C API.  You must use 
SQL level variables:

$stmt = $db->prepare("CALL sp_returns_string(@a)");
$stmt->execute();
print_r($db->query("SELECT @a")->fetchAll());


------------------------------------------------------------------------
[2006-03-09 19:55:22] keyvez at hotmail dot com

I am experiencing the same issue on Windows and MSSQL.

Stored Procedure Create Code:
******************************************
CREATE PROCEDURE [dbo].[p_sel_all_termlength]
  @err INT = 0 OUTPUT AS
SELECT * FROM termlength
SET @err = 2627
******************************************

PHP Code:
******************************************
$Link = new PDO('mssql:host=sqlserver;dbname=database', 'username', 'password');
        
$ErrorCode = 0;
        
$Stmt = $Link->prepare('p_sel_all_termlength ?');
$Stmt->bindParam(1,$ErrorCode,PDO::PARAM_INT,4);
$Stmt->execute();
echo "Error = " . $ErrorCode . "\n";

while ($Row = $Stmt->fetch(PDO::FETCH_OBJ)) {
        echo $Row->description . "\n";
}

echo "Error = " . $ErrorCode . "\n";
******************************************

PHP Output:
******************************************
Error = 0
9 Weeks
Semester
One Year
Trimester
Error = 0
******************************************

------------------------------------------------------------------------
[2006-01-09 20:34:14] victoria at balic dot net

I just used the latest snapshot as instructed (5.1.2RC3-dev 20060109) and I get 
the same behaviour as reported above -- ie. the PDO call returns empty value 
when using bindParam().

------------------------------------------------------------------------
[2006-01-09 10:19:30] sni...@php.net

Please try using this CVS snapshot:

  http://snaps.php.net/php5.1-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5.1-win32-latest.zip



------------------------------------------------------------------------
[2006-01-09 00:26:08] victoria at balic dot net

Description:
------------
I created a trivial stored procedure in MySQL (v5.0.17) that simply returns an 
integer constant. If I call the procedure using a PDO statement and binding a 
return value $stmt->bindParam(), I get nothing. 
On the other hand, if I issue two SQL queries to implicitly obtain the result, 
things are ok (see below). So something is broken with the way PDO handles 
bindParam.

I am using the latest stable release of PHP (5.1.1), MySQL 5.0.17 and mod_php 
for Apache 2.2

Reproduce code:
---------------
<?php
$DB = new PDO(...);
if($DB != NULL) {
 $stmt = $DB->prepare(" CALL test_pdo(?)");
 $stmt->bindParam(1, $return_value, PDO::PARAM_INT, 10); 
 $stmt->execute();
 print "Procedure returned: $return_value \n";

 //try instead plain SQL call
 $DB->query("CALL test_pdo(@nn)");
 $rows = $DB->query("SELECT @nn")->fetchAll();
 print "SELECT returned: \n";
 print_r($rows);
}
?>
And here's actual MySQL Stored procedure:
CREATE PROCEDURE test_pdo 
 (OUT Pout INTEGER)
BEGIN
  SET Pout := 1912;
END

Expected result:
----------------
$return_value should have been set to "1912" and instead it's empty. The stored 
procedure is working ok as the second call (in which i implicitly obtain the 
output by making two SQL queries) returns the correct value (see below).

Actual result:
--------------
Procedure returned:

SELECT returned: 
Array ( [0] => Array ( [@nn] => 1912 [0] => 1912 ) )


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=35935&edit=1

Reply via email to