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

 ID:                 64522
 Updated by:         ssuffic...@php.net
 Reported by:        capile at tecnodz dot com
 Summary:            After first query to MSSQL (DBLIB) all the other
                     queries return null values
-Status:             Open
+Status:             Assigned
 Type:               Bug
 Package:            PDO related
 Operating System:   Ubuntu Linux
 PHP Version:        5.4.13
-Assigned To:        
+Assigned To:        ssufficool
 Block user comment: N
 Private report:     N

 New Comment:

See commit 9ef762d:
[master 9ef762d] FIX BUG #64522
 1 file changed, 2 insertions(+), 3 deletions(-)


Previous Comments:
------------------------------------------------------------------------
[2013-05-31 04:35:41] ssuffic...@php.net

Related To: Bug #64522

------------------------------------------------------------------------
[2013-05-30 05:12:16] ssuffic...@php.net

The pull request attached to this bug report will introduce another error when 
the another statement is issued without fetching ALL the previous results:

SQLSTATE[HY000]: General error: 20019 Attempt to initiate a new Adaptive Server 
operation with results pending [20019] (severity 7) [select 1+1 as result1]

The last statement should be able to be flushed using dbcancel(), but for some 
reason this is not working as documented. I also tried dbcanquery(). Both 
render 
the statement not re-useable, but weirdly enough the column metatdata is 
repopulated with the new column names and types

code: print_r($pdo->getColumnMeta(0))

------------------------------------------------------------------------
[2013-05-29 13:51:34] capile at tecnodz dot com

Sorry, I commented without properly testing, just compiled 5.4.15 and tested 
with $statement = null; and it was possible to keep using the connection, even 
with transactions.

Also works with unset($statement);

Test script:
---------------
$db->exec('create table #test ( id int not null )');
$db->exec('begin transaction test1');
$db->exec('insert into #test (id) values (100)');
$db->exec('insert into #test (id) values (200)');
$db->exec('insert into #test (id) values (300)');
$db->exec('commit transaction test1');
$stmt = $db->query('select * from #test');
var_dump($stmt->fetchAll(PDO::FETCH_NUM));
$stmt->closeCursor();
unset($stmt);
$db->exec('drop table #test');


Expected result:
----------------
array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "100"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "200"
  }
  [2]=>
  array(1) {
    [0]=>
    string(3) "300"
  }
}

------------------------------------------------------------------------
[2013-05-29 12:48:38] capile at tecnodz dot com

using $statement = null; would make it impossible to use transactions and some 
stored procedures.

This was introduced back in late 
2011(https://github.com/php/php-src/commit/3a069e814fe01b36812b5c768dd52ccdea3ed098)
 but only on PHP 5.4+ (5.3- worked as expected).

I compiled PHP 5.4.13 with the pull request applied and it worked as expected.

------------------------------------------------------------------------
[2013-05-29 03:42:49] ssuffic...@php.net

I installed Sybase Adaptive Server and was able to reproduce. A workaround is 
to 
do a $statement=null and then reuse the $statement variable. This calls the 
statement destructor in addition to the cursorCloser(). 

This may be something new to the PDO core. From what I can see on git, no 
changes 
have been made to pdo_dblib since it was last working. I will continue to look 
into this.

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


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

    https://bugs.php.net/bug.php?id=64522


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

Reply via email to