php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #44203 ibm_db2 / db2_execute failure
Submitted: 2008-02-21 14:37 UTC Modified: 2008-02-23 20:03 UTC
From: the_dude61 at hotmail dot com Assigned:
Status: Not a bug Package: *Database Functions
PHP Version: 5.2.5 OS: openSUSE 10.2
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: the_dude61 at hotmail dot com
New email:
PHP Version: OS:

 

 [2008-02-21 14:37 UTC] the_dude61 at hotmail dot com
Description:
------------
Problem relates to ibm_db2-1.6.5 and DB2 v9.5.0.0 LINUXAMD6495.

I called a stored procedure with a blob parameter as follows:

    $stmt = db2_prepare($conn, $sqlcmd);
    $par_inid = 0;
    $par_indata = "00000000001111111111";
    $par_outrc = 0;
    db2_bind_param($stmt, 1, "par_inid", DB2_PARAM_IN);
    db2_bind_param($stmt, 2, "par_indata", DB2_PARAM_IN,DB2_BINARY);
    db2_bind_param($stmt, 3, "par_outrc", DB2_PARAM_OUT);
    if (db2_execute($stmt) )
      <ok>
    else
      <error>

The DB2 stored procedure raises an error with [IBM][CLI Driver][DB2/LINUXX8664] SQL0438N  Application raised error with diagnostic text: "Id not found".  SQLSTATE=77100.

But the db2_execute() function returns TRUE as if it was successfull.

I added some missing error handling code in ibm_db2.c - db2_execute() to get the correct behaviour (see code below). The while loop did not handle a SQL_ERROR of SQLParamData() as it occurs in my case. My case was that the SQLExecute() requested one more data packet (SQL_NEED_MORE). The next call to SQLParamData() within the while-loop returned a sql error raised by the application because of an invalid id. This error was not covered and db2_execute() returned with TRUE (=successful).

Modified code (starts at line# 3277):

if ( rc == SQL_NEED_DATA ) {
	while ( (rc = SQLParamData((SQLHSTMT)stmt_res->hstmt, (SQLPOINTER *)&valuePtr)) == SQL_NEED_DATA ) {
		/* passing data value for a parameter */
		rc = SQLPutData((SQLHSTMT)stmt_res->hstmt, (SQLPOINTER)(((zvalue_value*)valuePtr)->str.val), ((zvalue_value*)valuePtr)->str.len);
		if ( rc == SQL_ERROR ) {
			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sending data failed");
			_php_db2_check_sql_errors(stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1 TSRMLS_CC);
			RETVAL_FALSE;
		}
	}
	if ( rc == SQL_ERROR ) {
		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Statement Execute Failed");
		_php_db2_check_sql_errors(stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1 TSRMLS_CC);
		RETVAL_FALSE;
	}
	
}

Hope that this is not a "huge text" ;-)







Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2008-02-23 20:03 UTC] jani@php.net
Report bugs in this PECL extension here: 
http://pecl.php.net/bugs/report.php?package=ibm_db2

 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Fri Mar 14 15:01:30 2025 UTC