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

 ID:               46050
 User updated by:  RQuadling at GMail dot com
 Reported by:      RQuadling at GMail dot com
 Summary:          odbc_next_result corrupts prepared resource
-Status:           Feedback
+Status:           Open
 Type:             Bug
 Package:          ODBC related
 Operating System: Windows XP SP3
 PHP Version:      5.3.0alpha2

 New Comment:

As requested. Win32 Backtrace.





php__PID__3656__Date__04_26_2010__Time_11_19_52AM__889__Second_Chance_Exception_C0000005.dmp

Type of Analysis Performed   Crash Analysis 

Machine Name   BV-DEV-SVR-4 

Operating System   Windows Server 2003 Service Pack 2 

Number Of Processors   2 

Process ID   3656 

Process Image   C:\php5\php.exe 

System Up-Time   9 day(s) 22:59:24 

Process Up-Time   00:00:00 





Thread 0 - System ID 2296

Entry point   php!mainCRTStartup 

Create time   26/04/2010 11:19:52 

Time spent in user mode   0 Days 0:0:0.93 

Time spent in kernel mode   0 Days 0:0:0.15 













Function     Arg 1     Arg 2     Arg 3   Source 

php5!zif_odbc_exec+31c     01b127e8     00000002     10022c5f    

php5!zif_odbc_fetch_array+10     00000001     01b127e8     00000000    

php5!execute+cdf     01b40080     01b10108     01b40080    

php5!execute+4c25     00c0ec28     00c0fed4     00c0fcbc    

php5!execute+1f0     01b10108     00c0fed4     00c0fcb8    

php5!zend_execute_scripts+be     00000008     00000000     00000003    

php5!php_execute_script+1e2     00c0fed4     0040642c     00000001    

php!main+a9a     00000004     003c4fc0     003c3730    

php!memcpy+160     00000000     00000000     7ffde000    

kernel32!BaseProcessStart+23     00402dda     00000000     00000000    









PHP5!ZIF_ODBC_EXEC+31CIn
php__PID__3656__Date__04_26_2010__Time_11_19_52AM__889__Second_Chance_Exception_C0000005.dmp
the assembly instruction at 

php5!zif_odbc_exec+31c in C:\php5\php5.dll from The PHP Group has caused
an access violation exception (0xC0000005) when trying to read from
memory 

location 0x00000028 on thread 0



Module Information 

Image Name: C:\php5\php5.dll   Symbol Type:  PDB 

Base address: 0x10000000   Time Stamp:  Wed Mar 03 20:45:15 2010  

Checksum: 0x00569e17   Comments:   

COM DLL: False   Company Name:  The PHP Group 

ISAPIExtension: False   File Description:  PHP Script Interpreter 

ISAPIFilter: False   File Version:  5.3.2 

Managed DLL: False   Internal Name:  PHP Script Interpreter 

VB DLL: False   Legal Copyright:  Copyright © 1997-2009 The PHP Group 

Loaded Image Name:  php5.dll   Legal Trademarks:  PHP 

Mapped Image Name:     Original filename:  php5.dll 

Module name:  php5   Private Build:   

Single Threaded:  False   Product Name:  PHP 

Module Size:  5.50 MBytes   Product Version:  5.3.2 

Symbol File Name:  C:\php5\debug\php5.pdb   Special Build:  &


Previous Comments:
------------------------------------------------------------------------
[2010-04-23 23:13:04] fel...@php.net

Thank you for this bug report. To properly diagnose the problem, we
need a backtrace to see what is happening behind the scenes. To
find out how to generate a backtrace, please read
http://bugs.php.net/bugs-generating-backtrace.php for *NIX and
http://bugs.php.net/bugs-generating-backtrace-win32.php for Win32

Once you have generated a backtrace, please submit it to this bug
report and change the status back to "Open". Thank you for helping
us make PHP better.



------------------------------------------------------------------------
[2010-04-12 17:40:35] RQuadling at GMail dot com

Using PDO-ODBC is fine.





// Connect to the SQL Server using a DNS-less connection.

// $r_Connection = odbc_pconnect("Driver={SQL 

Server};Server={$s_Server};Database={$s_Database}", $s_Username,
$s_Password);

$r_Connection = new PDO("odbc:Driver={SQL Server Native Client 

10.0};Server={$s_Server};Database={$s_Database}", $s_Username,
$s_Password);



// Prepare the statement.

// $r_Statement = odbc_prepare($r_Connection, "EXEC 

{$s_Database}.dbo.{$s_StoredProc} ?");

$r_Statement = $r_Connection->prepare("EXEC
{$s_Database}.dbo.{$s_StoredProc} 

?");



// Execute the statement for each parameter.

foreach($a_Params as $s_Param)

        {

        echo 'About to process : ', $s_Param, PHP_EOL;

//      $b_Executed = odbc_execute($r_Statement, array($s_Param));

        $b_Executed = $r_Statement->execute(array($s_Param));

        do

                {

//              while(False !== ($a_Row = odbc_fetch_array($r_Statement)))

                while(False !== ($a_Row = $r_Statement-

>fetch(PDO::FETCH_ASSOC)))

                        {

                        print_r($a_Row);

                        }

                }

//      while(True === ($b_MoreResults = odbc_next_result($r_Statement)));

        while(True === ($b_MoreResults = $r_Statement->nextRowset()));

        $r_Statement->closeCursor();

        }

------------------------------------------------------------------------
[2008-10-24 08:58:35] j...@php.net

Reclassified in correct category. And you should use PDO ODBC instead
anyway.

------------------------------------------------------------------------
[2008-09-11 13:33:33] RQuadling at GMail dot com

Description:
------------
Using PHP 5.3.0alpha3-dev (cli) (built: Sep 11 2008 09:01:08)



Using ODBC to talk to Microsoft SQL Server 7.



Using a prepared statement to run a Stored Procedure on the SQL 

server.



Using the function odbc_next_result() to determine if there are more 

result sets after having retrieved the first result sets kills the 

prepared statement from re-use and results in an unhandled win32 

exception.



The SP is not the issue and as a test is the following code:



CREATE PROCEDURE dbo.SimpleIdentity

        @s_Identity AS VARCHAR(500)

AS

        SELECT

                @s_Identity AS [Simple Identity]

GO





Removing the odbc_next_result() loop makes everything work.



The example code below is from a larger code which deals with getting 

data from an SP and caching the result(s). Currently I am unable to 

retrieve multiple result sets AND use stored procedures together.











Reproduce code:
---------------
<?php

// Configure this script.

$s_Server     = 'BANDVULCSQL';

$s_Database   = 'CONTRACTS';

$s_Username   = 'sa';

$s_Password   = 'sa';

$s_StoredProc = 'SimpleIdentity';

$a_Params     = array

        (

        'Richard',

        'Simon',

        'John',

        );



/******************************************/



// Connect to the SQL Server using a DNS-less connection.

$r_Connection = odbc_pconnect("Driver={SQL
Server};Server={$s_Server};Database={$s_Database}", $s_Username,
$s_Password);



// Prepare the statement.

$r_Statement = odbc_prepare($r_Connection, "EXEC
{$s_Database}.dbo.{$s_StoredProc} ?");



// Execute the statement for each parameter.

foreach($a_Params as $s_Param)

        {

        echo 'About to process : ', $s_Param, PHP_EOL;

        $b_Executed = odbc_execute($r_Statement, array($s_Param));

        do

                {

                while(False !== ($a_Row = odbc_fetch_array($r_Statement)))

                        {

                        print_r($a_Row);

                        }

                }

        while(True === ($b_MoreResults = odbc_next_result($r_Statement)));

        }





Expected result:
----------------
About to process : Richard

Array

(

    [Simple Identity] => Richard

)

About to process : Simon

Array

(

    [Simple Identity] => Simon

)

About to process : John

Array

(

    [Simple Identity] => John

)











Actual result:
--------------
About to process : Richard

Array

(

    [Simple Identity] => Richard

)

About to process : Simon



and then an unhandled win32 exception in php.cli














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



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

Reply via email to