Edit report at http://bugs.php.net/bug.php?id=7507&edit=1
ID: 7507 Updated by: j...@php.net Reported by: tor...@php.net Summary: Better ODBC error reporting/fetching -Status: Open +Status: Wont fix Type: Feature/Change Request -Package: Feature/Change Request +Package: *General Issues Operating System: Any PHP Version: 4.0 Latest CVS (28/10/2000) Block user comment: N Private report: N New Comment: Use PDO. :) Previous Comments: ------------------------------------------------------------------------ [2000-10-28 05:23:26] tor...@php.net Sent from one of my workmates: We've had some problems using the PHP4 ODBC extension. The return values of some ODBC functions don't seem to be handled properly. SQLPrepare() returns sometimes the return code SQL_SUCCESS_WITH_INFO when using DB2 (SQLError() giving the warning state 01589 "A statement contains redundant specifications."), but in php_odbc.c accept only SQL_SUCCESS as the return value of SQLPrepare(). Also when using DB2, SQLExecute() and SQLExecDirect() return SQL_NO_DATA_FOUND after a searched update or delete when no rows were found to update or delete. php_odbc.c only accepts return codes SQL_SUCCESS and SQL_SUCCESS_WITH_INFO. (I'm not sure if this is intentional, that is am I supposed to check with a where query beforehand whether the to be updated or deleted rows exist.) A patch to fix these two things is attached [below]. Is the return code handling the way it is because of keeping PHP4 ODBC module compatible with various different dbms's or is it just that no one has had the time to go through checking it for each CLI function call? Also: Is anyone about to add a way for the application to access the error/warning messages and sqlstates returned by the latest calls to SQLError(), like mysql_error() and mysql_errno() functions in the MySQL extension? Or is there some sort of design issue that prevents doing this? *** php_odbc.c.old Fri Oct 27 15:47:32 2000 --- php_odbc.c Fri Oct 27 15:47:35 2000 *************** *** 771,777 **** } #endif ! if ((rc = SQLPrepare(result->stmt, query, SQL_NTS)) != SQL_SUCCESS) { odbc_sql_error(conn->henv, conn->hdbc, result->stmt, "SQLPrepare"); SQLFreeStmt(result->stmt, SQL_DROP); RETURN_FALSE; --- 771,778 ---- } #endif ! SQLPrepare(result->stmt, query, SQL_NTS); ! if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { odbc_sql_error(conn->henv, conn->hdbc, result->stmt, "SQLPrepare"); SQLFreeStmt(result->stmt, SQL_DROP); RETURN_FALSE; *************** *** 930,936 **** } } } else { ! if (rc != SQL_SUCCESS) { odbc_sql_error(result->conn_ptr->henv, result->conn_ptr->hdbc, result->stmt, "SQLExecute"); RETVAL_FALSE; } --- 931,937 ---- } } } else { ! if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND) { odbc_sql_error(result->conn_ptr->henv, result->conn_ptr->hdbc, result->stmt, "SQLExecute"); RETVAL_FALSE; } *************** *** 945,951 **** efree(params); } ! if (rc == SQL_SUCCESS) { RETVAL_TRUE; } --- 946,952 ---- efree(params); } ! if (rc == SQL_SUCCESS || rc == SQL_NO_DATA_FOUND) { RETVAL_TRUE; } *************** *** 1099,1105 **** #endif rc = SQLExecDirect(result->stmt, query, SQL_NTS); ! if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { /* XXX FIXME we should really check out SQLSTATE with SQLError * in case rc is SQL_SUCCESS_WITH_INFO here. */ --- 1100,1106 ---- #endif rc = SQLExecDirect(result->stmt, query, SQL_NTS); ! if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA_FOUND) { /* XXX FIXME we should really check out SQLSTATE with SQLError * in case rc is SQL_SUCCESS_WITH_INFO here. */ ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=7507&edit=1