Bug #46195 [Asn->Opn]: odbc_prepare use SQLNumResultCols

From: Date: Tue, 24 Oct 2017 06:56:45 +0000
Subject: Bug #46195 [Asn->Opn]: odbc_prepare use SQLNumResultCols
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-212033@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=46195&edit=1 ID: 46195 Updated by: kalle@php.net Reported by: marcus dot kunze at syntela dot de Summary: odbc_prepare use SQLNumResultCols -Status: Assigned +Status: Open Type: Bug Package: ODBC related Operating System: Windows PHP Version: 5.2.6 -Assigned To: iodbc +Assigned To: Block user comment: N Private report: N Previous Comments: ------------------------------------------------------------------------ [2008-11-07 12:41:37] marcus dot kunze at syntela dot de Hallo, if the result depends on parameter from Execute, SQLNumResultCols can not return die correct result. Sample: create procedure test ( @param int ) as if @param = 1 select 1 as col1 else if @param = 2 select 2 as col2 else if @param = 3 select 3 as col3 else select 'other' as other odbc_prepare('exec test(?)'); bevor not execute with the paramter vor ?, SQLNumResultCols can not have the name vor the column. ------------------------------------------------------------------------ [2008-11-07 12:03:43] iodbc@php.net Strictly speaking from an ODBC API point of view, you can call SQLNumResultCols directly after SQLPrepare, but not all drivers/databases evaluate the SQL statement at prepare time and therefor can only return this information after SQLExecute. I am working on a patch that will resolve calling SQLNumResultCols and more importantly the odbc_bindcols call multiple times, without the possibility of breaking backward compatibility on existing apps. ------------------------------------------------------------------------ [2008-09-29 12:09:01] marcus dot kunze at syntela dot de Description: ------------ odbc_prepare use SQLNumResultCols to get the count and description of den result column. The problem is a resultset the is depends on the paremeter or a multiple resultset with differens column. SQLNumResultCols return only the correct result after SQLExecute is call! In odbc_execute is the same code, the code in odbc_prepare is needless. Testet Solution on Windows, SQL Server 2005 php_odbc.c[908] result->numcols = 0; /* SQLNumResultCols(result->stmt, &(result->numcols)); if (result->numcols > 0) { if (!odbc_bindcols(result TSRMLS_CC)) { efree(result); RETURN_FALSE; } } else { result->values = NULL; } */ zend_list_addref(conn->id); Reproduce code: --------------- $connstr = "Driver={SQL Server};SERVER=localhost;DATABASE=master"; $sql = "select 1 as col1 \n". "select 2 as col2, 3 as col3 \n". "select 4 as col4, 5 as col5, 6 as col6"; $conn = odbc_connect($connstr, $username, $password); $result = odbc_prepare($conn, $sql ); odbc_execute( $result ); do { odbc_result_all( $result ); } while ( odbc_next_result( $result ) ); Expected result: ---------------- col1 1 col2 col3 2 3 col4 col5 col6 4 5 6 Actual result: -------------- col4 col5 col6 1 ÷xÈøx4[ú øx÷x4[ú col2 col3 2 3 col4 col5 col6 4 5 6 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=46195&edit=1

« previous php.bugs (#212033) next »