php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #2886 Access - unhandled exception, output hangs
Submitted: 1999-12-01 12:23 UTC Modified: 2000-02-29 04:34 UTC
From: phil at dialsolutions dot co dot uk Assigned:
Status: Closed Package: ODBC related
PHP Version: 4.0 Beta 3 OS: NT4.0 SP4
Private report: No CVE-ID: None
 [1999-12-01 12:23 UTC] phil at dialsolutions dot co dot uk
I encounter a problem every time I do an odbc_prepare or odbc_exec call. The function call works fine and the correct results are generated (and displayed if I do an
odbc_result_all), but the output from php hangs once all of the page has been output - ie the browser still thinks that there is more to come. The system log in the event viewer shows an error, 
source WAM,
description
The HTTP server encountered an unhandled exception while processing the ISAPI Application 'C:\WINNT\system32\php4isapi.dll'.

Here's a simple page that causes the error (as a data source I'm using the adventureworks database which comes with the IIS for use with an ASP example):

<html>
<head></head>
<body>
<?php
$a=odbc_connect("Adventure","",""); /*always returns 1 (NB I've tried this
with sundry cursor types but with no change in behaviour)*/
if(!$a)
{
print("failed connecting");
exit();
}

$test=odbc_exec($a,"select ShipDate from Orders where
ShipCity='Anchorage'"); /*always returns 2*/
if(!$test)
{
printf("failed in exec");
odbc_close($a);
exit();
}

$closed=odbc_close($a);/*always returns 0*/
?>
</body>
</html>

Note that the above script works perfectly on php 3.0.11 running on the same machine.

If it helps, here's the output of the ODBC trace:

inetinfo        119:11f ENTER SQLAllocEnv
  HENV *              0x002b4890

inetinfo        119:11f EXIT  SQLAllocEnv  with return code 0 (SQL_SUCCESS)
  HENV *              0x002b4890 ( 0x05801500)

inetinfo        119:11f ENTER SQLAllocConnect
  HENV                0x05801500
  HDBC *              0x002b4894

inetinfo        119:11f EXIT  SQLAllocConnect  with return code 0
(SQL_SUCCESS)
  HENV                0x05801500
  HDBC *              0x002b4894 ( 0x058022e0)

inetinfo        119:11f ENTER SQLConnectW
  HDBC                0x058022e0
  WCHAR *             0x058016b0 [      -3] "Adventure\ 0"
  SWORD                       -3
  WCHAR *             0x1f4be05c [      -3] "******\ 0"
  SWORD                       -3
  WCHAR *             0x1f4be05c [      -3] "******\ 0"
  SWORD                       -3

inetinfo        119:11f EXIT  SQLConnectW  with return code 0 (SQL_SUCCESS)
  HDBC                0x058022e0
  WCHAR *             0x058016b0 [      -3] "Adventure\ 0"
  SWORD                       -3
  WCHAR *             0x1f4be05c [      -3] "******\ 0"
  SWORD                       -3
  WCHAR *             0x1f4be05c [      -3] "******\ 0"
  SWORD                       -3

inetinfo        119:11f ENTER SQLAllocStmt
  HDBC                0x058022e0
  HSTMT *             0x002b59e0

inetinfo        119:11f EXIT  SQLAllocStmt  with return code 0 (SQL_SUCCESS)
  HDBC                0x058022e0
  HSTMT *             0x002b59e0 ( 0x05802520)

inetinfo        119:11f ENTER SQLGetInfoW
  HDBC                0x058022e0
  UWORD                        8 <SQL_FETCH_DIRECTION>
  PTR                 0x00f3fa74
  SWORD                        4
  SWORD *             0x00f3fa5a

inetinfo        119:11f EXIT  SQLGetInfoW  with return code 0 (SQL_SUCCESS)
  HDBC                0x058022e0
  UWORD                        8 <SQL_FETCH_DIRECTION>
  PTR                 0x00f3fa74
  SWORD                        4
  SWORD *             0x00f3fa5a (4)

inetinfo        119:11f ENTER SQLSetStmtOption
  HSTMT               0x05802520
  UWORD                        6 <SQL_CURSOR_TYPE>
  UDWORD                     2

inetinfo        119:11f EXIT  SQLSetStmtOption  with return code 1
(SQL_SUCCESS_WITH_INFO)
  HSTMT               0x05802520
  UWORD                        6 <SQL_CURSOR_TYPE>
  UDWORD                     2

  DIAG [01S02] [Microsoft][ODBC Microsoft Access Driver]Option value changed
(10)

inetinfo        119:11f ENTER SQLExecDirect
  HSTMT               0x05802520
  UCHAR *             0x0029f7e0 [      -3] "select ShipDate from Orders
where ShipCity='Anchorage'\ 0"
  SDWORD                    -3

inetinfo        119:11f EXIT  SQLExecDirect  with return code 0
(SQL_SUCCESS)
  HSTMT               0x05802520
  UCHAR *             0x0029f7e0 [      -3] "select ShipDate from Orders
where ShipCity='Anchorage'\ 0"
  SDWORD                    -3

inetinfo        119:11f ENTER SQLNumResultCols
  HSTMT               0x05802520
  SWORD *             0x002b59e8

inetinfo        119:11f EXIT  SQLNumResultCols  with return code 0
(SQL_SUCCESS)
  HSTMT               0x05802520
  SWORD *             0x002b59e8 (1)

inetinfo        119:11f ENTER SQLColAttributes
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        1 <SQL_COLUMN_NAME>
  PTR                0x002a68b0
  SWORD                       32
  SWORD *             0x00f3fa4e
  SDWORD *            0x00000000

inetinfo        119:11f EXIT  SQLColAttributes  with return code 0
(SQL_SUCCESS)
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        1 <SQL_COLUMN_NAME>
  PTR                0x002a68b0
  SWORD                       32
  SWORD *             0x00f3fa4e (8)
  SDWORD *            0x00000000

inetinfo        119:11f ENTER SQLColAttributes
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        2 <SQL_COLUMN_TYPE>
  PTR                0x00000000
  SWORD                        0
  SWORD *             0x00000000
  SDWORD *            0x002a68d8

inetinfo        119:11f EXIT  SQLColAttributes  with return code 0
(SQL_SUCCESS)
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        2 <SQL_COLUMN_TYPE>
  PTR                0x00000000
  SWORD                        0
  SWORD *             0x00000000
  SDWORD *            0x002a68d8 (11)

inetinfo        119:11f ENTER SQLColAttributes
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        6 <SQL_COLUMN_DISPLAY_SIZE>
  PTR                0x00000000
  SWORD                        0
  SWORD *             0x00000000
  SDWORD *            0x00f3fa50

inetinfo        119:11f EXIT  SQLColAttributes  with return code 0
(SQL_SUCCESS)
  HSTMT               0x05802520
  UWORD                        1
  UWORD                        6 <SQL_COLUMN_DISPLAY_SIZE>
  PTR                0x00000000
  SWORD                        0
  SWORD *             0x00000000
  SDWORD *            0x00f3fa50 (19)

inetinfo        119:11f ENTER SQLBindCol
  HSTMT               0x05802520
  UWORD                        1
  SWORD                        1 <SQL_C_CHAR>
  PTR                0x002b5ac0
  SDWORD                    20
  SDWORD *            0x002a68d4

inetinfo        119:11f EXIT  SQLBindCol  with return code 0 (SQL_SUCCESS)
  HSTMT               0x05802520
  UWORD                        1
  SWORD                        1 <SQL_C_CHAR>
  PTR                0x002b5ac0
  SDWORD                    20
  SDWORD *            0x002a68d4 (91927008)

inetinfo        119:11f ENTER SQLDisconnect
  HDBC                0x058022e0

inetinfo        119:11f EXIT  SQLDisconnect  with return code 0
(SQL_SUCCESS)
  HDBC                0x058022e0

inetinfo        119:11f ENTER SQLFreeConnect
  HDBC                0x058022e0

inetinfo        119:11f EXIT  SQLFreeConnect  with return code 0
(SQL_SUCCESS)
  HDBC                0x058022e0

inetinfo        119:11f ENTER SQLFreeEnv
  HENV                0x05801500

inetinfo        119:11f EXIT  SQLFreeEnv  with return code 0 (SQL_SUCCESS)
  HENV                0x05801500

inetinfo        119:11f ENTER SQLFreeStmt
  HSTMT               0x05802520
  UWORD                        1 <SQL_DROP>

...and heres the php.ini file

[PHP]

;;;;;;;;;;;;;;;;;;;
; About this file ;
;;;;;;;;;;;;;;;;;;;
; This file controls many aspects of PHP's behavior.  In order for PHP to
; read it, it must be named 'php.ini'.  PHP looks for it in the current
; working directory, in the path designated by the environment variable
; PHPRC, and in the path that was defined in compile time (in that order).
; Under Windows, the compile-time path is the Windows directory.  The
; path in which the php.ini file is looked for can be overriden using
; the -c argument in command line mode.
;
; The syntax of the file is extremely simple.  Whitespace and Lines
; beginning with a semicolon are silently ignored (as you probably guessed).
; Section headers (e.g. [Foo]) are also silently ignored, even though
; they might mean something in the future (they probably won't).
;
; Options are specified using the syntax key = value or key = "complex value".
; Key names are *case sensitive*.  foo = bar is different from FOO = bar.
; 'value' can be any number, word or keyword (keywords are On, Off, True,
; False, Yes and No, and are case insensitive).
; 'complex value' can be just about anything, expcept for " and a newline
; Boolean flags can be turned on using the values 1, On, True or Yes.
; They can be turned off using the values 0, Off, False or No.
;
; All the values in the php.ini-dist file correspond to the builtin
; defaults (that is, if no php.ini is used, or if you delete these lines,
; the builtin defaults will be identical).


;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;

engine			=	On	; Enable the PHP scripting language engine under Apache
short_open_tag	=	Off	; allow the <? tag.  otherwise, only <?php and <script> tags are recognized.
asp_tags		=	Off ; allow ASP-style <% %> tags
precision		=	14	; number of significant digits displayed in floating point numbers
y2k_compliance	=	Off	; whether to be year 2000 compliant (will cause problems with non y2k compliant browsers)
; Safe Mode
safe_mode		=	Off
safe_mode_exec_dir	=
; Colors for Syntax Highlighting mode.  Anything that's acceptable in <font color=???> would work.
highlight.string	=	#DD0000
highlight.comment	=	#FF8000
highlight.keyword	=	#007700
highlight.bg		=	#FFFFFF
highlight.default	=	#0000BB
highlight.html		=	#000000
; Misc
allow_builtin_links	=	Off		; Sets whether phpinfo() will generate built-in links that display the PHP
								; and Zend logos, and tells PHP whether to honor them or not.
								; It is no security threat in any way, but it makes it possible
								; to determine whether you use PHP on your server or not.



;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30     ; Maximum execution time of each script, in seconds (UNIX only)
memory_limit = 8388608		; Maximum amount of memory a script may consume (8MB)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; error_reporting is a bit-field.  Add each number up to get desired error reporting level
;  1 = Normal errors
;  2 = Normal warnings
;  4 = Parser errors
;  8 = Notices - warnings you can ignore, but sometimes imply a bug (e.g., using an uninitialized variable)
error_reporting	=	7
display_errors	=	On	; Print out errors (as a part of the HTML script)
log_errors		=	Off	; Log errors into a log file (server-specific log, stderr, or error_log (below))
track_errors	=	Off	; Store the last error/warning message in $php_errormsg (boolean)
;error_prepend_string = "<font color=ff0000>"   ; string to output before an error message
;error_append_string = "</font>"                ; string to output after an error message
;error_log	=	filename	; log errors to specified file
;error_log	=	syslog		; log errors to syslog (Event Log on NT, not valid in Windows 95)
warn_plus_overloading	=	Off		; warn if the + operator is used with strings


;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
magic_quotes_gpc	=	On		; magic quotes for incoming GET/POST/Cookie data
magic_quotes_runtime=	Off		; magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_sybase	=	Off		; Use Sybase-style magic quotes (escape ' with '' instead of \')
track_vars			=	On		; enable $HTTP_GET_VARS[], $HTTP_POST_VARS[] and $HTTP_COOKIE_VARS[] arrays
; automatically add files before or after any PHP 3.0 document
auto_prepend_file	=
auto_append_file	=


;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path	=                   ; UNIX: "/path1:/path2"  Windows: "\path1;\path2"
doc_root		=					; the root of the php pages, used only if nonempty
user_dir		=					; the directory under which php opens the script using /~username, used only if nonempty
;upload_tmp_dir	=	                ; temporary directory for HTTP uploaded files (will use system default if not specified)
upload_max_filesize = 2097152       ; 2 Meg default limit on file uploads
extension_dir	=					; directory in which the loadable extensions (modules) reside


;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; if you wish to have an extension loaded automaticly, use the
; following syntax:  extension=modulename.extension
; for example, on windows,
; extension=msql.dll
; or under UNIX,
; extension=msql.so
; Note that it should be the name of the module only, no directory information 
; needs to go here.  Specify the location of the extension with the extension_dir directive above.


;Windows Extensions
extension=php_mysql.dll
;extension=php_nsmail.dll
;extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
;extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll
;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[Syslog]
define_syslog_variables	= Off	; Whether or not to define the various syslog variables,
								; e.g. $LOG_PID, $LOG_CRON, etc.  Turning it off is a
								; good idea performance-wise.  In runtime, you can define
								; these variables by calling define_syslog_variables()


[mail function]
SMTP			=	post.demon.co.uk			;for win32 only
sendmail_from	=	phil@dialsolutions.com	;for win32 only
sendmail_path	=						;for unix only, may supply arguments as well (default is sendmail -t)

[Debugger]
debugger.host	=	localhost
debugger.port	=	7869
debugger.enabled	=	False

[Logging]
; These configuration directives are used by the example logging mechanism.
; See examples/README.logging for more explanation.
;logging.method    = db
;logging.directory = /path/to/log/directory

[SQL]
sql.safe_mode	=	Off

[ODBC]
;uodbc.default_db		=	Not yet implemented
;uodbc.default_user		=	Not yet implemented
;uodbc.default_pw		=	Not yet implemented
uodbc.allow_persistent	=	On	; allow or prevent persistent links
uodbc.max_persistent	=	-1	; maximum number of persistent links. -1 means no limit
uodbc.max_links			=	-1	; maximum number of links (persistent+non persistent). -1 means no limit
uodbc.defaultlrl	=	4096	; Handling of LONG fields. Returns number of bytes to variables, 0 means passthru
uodbc.defaultbinmode	= 	1	; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation of uodbc.defaultlrl
; and uodbc.defaultbinmode

[MySQL]
mysql.allow_persistent	=	On	; allow or prevent persistent link
mysql.max_persistent	=	-1	; maximum number of persistent links. -1 means no limit
mysql.max_links			=	-1	; maximum number of links (persistent+non persistent).  -1 means no limit
mysql.default_port		=		; default port number for mysql_connect().  If unset,
								; mysql_connect() will use the $MYSQL_TCP_PORT, or the mysql-tcp
								; entry in /etc/services, or the compile-time defined MYSQL_PORT
								; (in that order).  Win32 will only look at MYSQL_PORT.
mysql.default_host		=		; default host for mysql_connect() (doesn't apply in safe mode)
mysql.default_user		=		; default user for mysql_connect() (doesn't apply in safe mode)
mysql.default_password	=		; default password for mysql_connect() (doesn't apply in safe mode)
								; Note that this is generally a *bad* idea to store passwords
								; in this file.  *Any* user with PHP access can run
								; 'echo cfg_get_var("mysql.default_password")' and reveal that
								; password!  And of course, any users with read access to this
								; file will be able to reveal the password as well.

[mSQL]
msql.allow_persistent	=	On	; allow or prevent persistent link
msql.max_persistent		=	-1	; maximum number of persistent links. -1 means no limit
msql.max_links			=	-1	; maximum number of links (persistent+non persistent).  -1 means no limit

[PostgresSQL]
pgsql.allow_persistent	=	On	; allow or prevent persistent link
pgsql.max_persistent	=	-1	; maximum number of persistent links. -1 means no limit
pgsql.max_links			=	-1	; maximum number of links (persistent+non persistent).  -1 means no limit

[Sybase]
sybase.allow_persistent	=	On	; allow or prevent persistent link
sybase.max_persistent	=	-1	; maximum number of persistent links. -1 means no limit
sybase.max_links		=	-1	; maximum number of links (persistent+non persistent).  -1 means no limit
;sybase.interface_file	=	"/usr/sybase/interfaces"
sybase.min_error_severity	=	10	; minimum error severity to display
sybase.min_message_severity	=	10	; minimum message severity to display
sybase.compatability_mode	= Off	; compatability mode with earlier versions of PHP 3.0.
									; If on, this will cause PHP to automatically assign types to results
									; according to their Sybase type, instead of treating them all as
									; strings.  This compatability mode will probably not stay around
									; forever, so try applying whatever necessary changes to your code,
									; and turn it off.

[Sybase-CT]
sybct.allow_persistent	=	On		; allow or prevent persistent link
sybct.max_persistent	=	-1		; maximum number of persistent links. -1 means no limit
sybct.max_links			=	-1		; maximum number of links (persistent+non persistent).  -1 means no limit
sybct.min_server_severity	=	10	; minimum server message severity to display
sybct.min_client_severity	=	10	; minimum client message severity to display

[bcmath]
bcmath.scale	=	0	; number of decimal digits for all bcmath functions

[browscap]
;browscap	=	extra/browscap.ini

[Informix]
ifx.default_host		=		; default host for ifx_connect() (doesn't apply in safe mode)
ifx.default_user		=		; default user for ifx_connect() (doesn't apply in safe mode)
ifx.default_password		=		; default password for ifx_connect() (doesn't apply in safe mode)
ifx.allow_persistent		=	On	; allow or prevent persistent link
ifx.max_persistent		=	-1	; maximum number of persistent links. -1 means no limit
ifx.max_links			=	-1	; maximum number of links (persistent+non persistent).  -1 means no limit
ifx.textasvarchar		=	0	; if set on, select statements return the contents of a text blob instead of it's id
ifx.byteasvarchar		=	0	; if set on, select statements return the contents of a byte blob instead of it's id
ifx.charasvarchar		=	0	; trailing blanks are stripped from fixed-length char columns. May help the life
						; of Informix SE users. 
ifx.blobinfile			=	0	; if set on, the contents of text&byte blobs are dumped to a file instead of
						; keeping them in memory
ifx.nullformat			=	0	; NULL's are returned as empty strings, unless this is set to 1. In that case,
						; NULL's are returned as string 'NULL'.

[Session]
session.save_handler = files        ; handler used to store/retrieve data
session.save_path = /tmp            ; argument passed to save_handler
                                    ; in the case of files, this is the
                                    ; path where data files are stored
session.name = PHPSESSID            ; name of the session
                                    ; is used as cookie name
session.auto_start = 0              ; initialize session on request startup
session.lifetime = 0                ; lifetime in seconds of cookie
                                    ; or if 0, until browser is restarted
session.serialize_handler = php     ; handler used to serialize data
                                    ; php is the standard serializer of PHP
session.gc_probability = 1          ; procentual probability that the 
                                    ; 'garbage collection' process is started
                                    ; on every session initialization
session.gc_maxlifetime = 1440       ; after this number of seconds, stored
                                    ; data will be seen as 'garbage' and
                                    ; cleaned up by the gc process

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-02-13 18:34 UTC] phil at dialsolutions dot co dot uk
Just tested with Andi Gutmans pre beta 4 version. The problem is still there.
 [2000-02-29 04:34 UTC] kara at cvs dot php dot net
Fixed in CVS
 [2000-02-29 04:34 UTC] kara at cvs dot php dot net
Fixed in CVS
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Apr 18 05:01:28 2024 UTC