ID:               35839
 Updated by:       [EMAIL PROTECTED]
 Reported By:      muratyaman at gmail dot com
-Status:           Assigned
+Status:           Feedback
 Bug Type:         MSSQL related
 Operating System: Win XP Pro SP2
 PHP Version:      5CVS-2005-12-29 (snap)
 Assigned To:      fmk
 New Comment:

bigint is not known on my mssql server 7 but it works fine on mssql
server 2000.

I have tested your code on both servers using PHP 5.1.2-dev and I do
not get any errors. I don't think there is any errors here.

I have also tested with both local and remote server and with
php_mssql.dll and php_dblib.dll.


Previous Comments:
------------------------------------------------------------------------

[2005-12-30 00:21:51] muratyaman at gmail dot com

Hi again :)

I changed my function to this:

function db_get_next_id($mygenid=''){
  $id = 0; $ret_val=0;
  $stmt = mssql_init("SPMY_GET_NEXT_ID");
  mssql_bind($stmt, "@GEN_ID_NAME", &$mygenid, SQLVARCHAR,
FALSE,FALSE);//input, not null
  mssql_bind($stmt, "@ID", &$id, SQLINT4, TRUE,TRUE);//output,null
  mssql_bind($stmt,"RETVAL",&$ret_val,SQLINT4);
  $result = mssql_execute($stmt);

  while($row=mssql_fetch_row($result)){
    //read id
    $id=$row[0];//but it should get from the output variable!?
  }
  mssql_free_statement($stmt);
  unset($stmt);  // <---VERY important
  return $id;
}

Anyway, this solved my problem.

But will I not be able to use arbitrary SQL statements with
mssql_query, including execution of procedures, etc. ?!

Kind regards

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

[2005-12-29 23:54:16] muratyaman at gmail dot com

Basically, my procedure inserts a dummy record into a special table and
gets inserted id. (int8 is a udt for 'bigint', i'm changing it for you
below to bigint).
I have dummy tables to simulate sequence generators for different
tables, here is a pair of them:

CREATE TABLE TBL_GEN_ABC_ID (
  ID bigint IDENTITY(1, 1) NOT NULL,
  DUMMY bit,
  CONSTRAINT PK_TBL_GEN_ABC_ID PRIMARY KEY CLUSTERED (ID)
)
GO
CREATE TABLE TBL_ABC (
  ABC_ID INT NOT NULL,
  ABC_NAME] VARCHAR(100) NOT NULL,
  CONSTRAINT PK_TBL_ABC PRIMARY KEY CLUSTERED (ABC_ID)
)
GO

Procedure is like this:
CREATE PROCEDURE spmy_get_next_id(
  @GEN_ID_NAME VARCHAR(100)='#NO TABLE',
  @ID bigint OUTPUT
)
AS
BEGIN

  SET @ID=NULL;
  
  DECLARE @GEN_ID bigint;
  SET @GEN_ID=0;
  
  IF (UPPER(@GEN_ID_NAME)='ABC_ID')
  BEGIN
     WHILE (1=1)
     BEGIN
     
       --generate id
       INSERT INTO TBL_GEN_ABC_ID (DUMMY)
       VALUES(0);
       SET @GEN_ID=@@IDENTITY; --get generated id

       IF(NOT EXISTS( --make sure it was not used
         SELECT ABC_ID
         FROM TBL_ABC
         WHERE [EMAIL PROTECTED])
         )
           BREAK;
     END

  END
  
  SET @[EMAIL PROTECTED]; 
  SELECT @ID AS ID;--for PHP to read resultset and value
  RETURN @ID;      --return value, not crucial
END
GO

so in PHP you can use modifed version of my function:

function db_get_next_id($mygenid=''){
  $i=0;
  $sql="
      DECLARE @MY_ID bigint, @r bigint
      EXECUTE @r=SPMY_GET_NEXT_ID \"$mygenid\", @MY_ID OUTPUT
      "
      ;
      
  if($qry=db_query($sql)){
     while($row=db_fetch_row($qry)){
         $i=$row[0]; break;
     }
     db_free_result($qry);
  }
  return $i;
}//end fun get next id

$new_id=db_get_next_id('ABC_ID');
(As I mentioned earlier, e.g. db_fetch_row is just using
mssql_fetch_row.. all of my db_xyz functions are like this.)

This works fine but subsequent mssql_query functions fail.
This may not be the ideal way of doing it, but it should not  cause any
harm. Everything else is working fine. Maybe I should just change the
way I use my procedures..
Thank you.

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

[2005-12-29 22:37:33] [EMAIL PROTECTED]

Frank, can you make any sense to this? :)

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

[2005-12-29 22:35:42] muratyaman at gmail dot com

Thank you.
I could not integrate php_dblib.dll :(
I tried to compile FreeTDS using Dev-C++ but could not get it working
with PHP.. I am stuck.

I was investigating the problem.
I have a function as follows:

function db_get_next_id($mygenid=''){
  $i=0;
  $sql="
      DECLARE @MY_ID INT8, @r int8
      EXECUTE @r= SPMY_GET_NEXT_ID \"$mygenid\", @MY_ID OUTPUT
      "
      ;
      
  if($qry=db_query($sql)){
     while($row=db_fetch_row($qry)){
         $i=$row[0]; break;
     }
     db_free_result($qry);
  }
  return $i;
}//end fun get next id

$new_id=db_get_next_id('keyfield');

This just works fine, I found that after this, calls to the db fails
and produces the error. Because when I comment out the line calling
this function, I don't get any error message.
Any ideas?
Regards

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

[2005-12-29 22:15:50] [EMAIL PROTECTED]

Does using php_dblib.dll work any better or not?

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/35839

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

Reply via email to