|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 02:00:01 2025 UTC |
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!