php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #24595 Cannot bind output variables.
Submitted: 2003-07-10 12:35 UTC Modified: 2003-08-06 11:14 UTC
Votes:1
Avg. Score:2.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:1 (100.0%)
From: hans at velum dot net Assigned:
Status: Not a bug Package: MSSQL related
PHP Version: 5.0.0b1 (beta1) OS: Windows XP
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: hans at velum dot net
New email:
PHP Version: OS:

 

 [2003-07-10 12:35 UTC] hans at velum dot net
Description:
------------
When using mssql_bind() to bind an output variable, the variable is passed into the stored procedure but the modified value is not returned.  (The variable is being passed by reference to mssql_bind()).

Reproduce code:
---------------
I used the following user-contributed example from mssql_execute manual page.


if we have this procedure: 

CREATE PROCEDURE [procedure] 
( 
  @sval varchar(50) OUTPUT, 
  @intval int OUTPUT, 
  @floatval decimal(6,4) OUTPUT 
) AS 

if @intval is null 
select '@intval is null' as answer 
else 
select '@intval is NOT null' as answer 

set @sval='Hello ' + @sval 
set @intval=@intval+1 
set @floatval=@floatval+1 

return 10 

We can use this PHP code: 

<?php 

$conn=mssql_connect("myhost","user","pwd"); 

if ($conn) { 
mssql_select_db("mydb",$conn); 

$stmt=mssql_init("procedure",$conn); 
mssql_bind($stmt,"RETVAL",&$val,SQLINT4); 

$ival=11; 
$fval=2.1416; 
$sval="Frank"; 

mssql_bind($stmt,"@sval",&$sval,SQLVARCHAR,TRUE); 
mssql_bind($stmt,"@intval",&$ival,SQLINT4,TRUE); 
mssql_bind($stmt,"@floatval",&$fval,SQLFLT8,TRUE); 

$result=mssql_execute($stmt); 

$arr=mssql_fetch_row($result); 
print ("Answer: " . $arr[0] . "
" ); 
print ("RETVAL = $val ; intval = $ival ; floatval = $fval ; string = $sval"); 

mssql_close($conn); 
} 
else print("ooops!"); 


Expected result:
----------------
Answer: @intval is NOT nullRETVAL = 10 ; intval = 12 ; floatval = 3.1416 ; string = Hello Frank

Actual result:
--------------
Answer: @intval is NOT nullRETVAL = 0 ; intval = 11 ; floatval = 2.1416 ; string = Frank

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-07-10 12:52 UTC] sniper@php.net
Does this happen with PHP 4.3.2 ?

 [2003-07-10 14:38 UTC] hans at velum dot net
Yes, I verified that this is also happening with 4.3.2.  I thought, based on a comment in the manual, that this was not an issue in the 4.3.2 release.

I also verified that the bound values are making it *into* the stored procedure w/o incident.  (E.g. I can add them to the returned result row to see that the stored procedure is aware of the values.)
 [2003-08-05 12:20 UTC] brian_caughlin at hotmail dot com
I ran into this issue myself in 4.3.2, and found that the workaround is to use the mssql_next_result() function before attempting to access the retval and any output parameters.  I also found that I don't need to pass the variables by reference.

Here is the code that works for me in 4.3.2:

<?php 

$conn=mssql_connect("myhost","user","pwd"); 

if ($conn) { 
mssql_select_db("mydb",$conn); 

$stmt=mssql_init("procedure",$conn); 
mssql_bind($stmt,"RETVAL",$val,SQLINT4); 

$ival=11; 
$fval=2.1416; 
$sval="Frank"; 

mssql_bind($stmt,"@sval",$sval,SQLVARCHAR,TRUE); 
mssql_bind($stmt,"@intval",$ival,SQLINT4,TRUE); 
mssql_bind($stmt,"@floatval",$fval,SQLFLT8,TRUE); 

$result=mssql_execute($stmt); 

$arr=mssql_fetch_row($result); 
print ("Answer: " . $arr[0] . "
" ); 
mssql_next_result($result);
print ("RETVAL = $val ; intval = $ival ; floatval = $fval ; string =
$sval"); 

mssql_close($conn); 
} 
else print("ooops!"); 
?>

I hope this helps!
 [2003-08-05 13:31 UTC] brian_caughlin at hotmail dot com
By the way, it looks like this bug may be a duplicate of Bug #21089.  Perhaps this is simply an undocumented change.
 [2003-08-05 18:32 UTC] sniper@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php4-STABLE-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php4-win32-STABLE-latest.zip

and also read the comments in bug #21089

 [2003-08-06 10:38 UTC] brian_caughlin at hotmail dot com
This is to confirm that the same behaviour manifests itself in the latest CVS snapshot, and also that the methods described in the comments for Bug #21089 apply here.  This appears to be a change that took place in 4.3 which continues to apply to 5.0.  The documentation should be updated to reflect this change.
 [2003-08-06 11:14 UTC] sniper@php.net
Same as bug #21089

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 16:01:28 2024 UTC