Bug #15719 Updated: odbc_execute does not pass null values into the database

From: Date: Mon, 25 Feb 2002 23:20:38 +0000
Subject: Bug #15719 Updated: odbc_execute does not pass null values into the database
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-1035@lists.php.net to get a copy of this message
ID: 15719 Updated by: joseph@ud.com Reported By: joseph@ud.com -Status: Feedback +Status: Open Bug Type: ODBC related Operating System: Redhat 7.1 PHP Version: 4.1.1 New Comment: as requested, patch..... 881d880 < unsigned char otype; 927d925 < otype = (*tmp)->type; 973,976d970 < if(otype == IS_NULL) < { < params[i-1].vallen = SQL_NULL_DATA; < } Previous Comments: ------------------------------------------------------------------------ [2002-02-25 17:59:28] kalowsky@php.net can you please submit this change as a patch? This fix would become infinately simplier to make :) ------------------------------------------------------------------------ [2002-02-25 17:10:20] joseph@ud.com In the file ext/odbc/php_odbc.c add an unsigned char called otype to the php function odbc_execute after populating *TMP, before calling convert_to_string save the value of (*TMP)->type into the otype buffer. Then at the end right before calling SQLPrepare (make sure it is the second call to SQLPrepare as the first is for pulling data from a file pointer and can't be null.) Check to see if otype == IS_NULL and if so set params[i-1].vallen = SQL_NULL_DATA. Problem solved. ex: starting at line 919: for(i = 1; i <= result->numparams; i++) { if (zend_hash_get_current_data((*pv_param_arr)->value.ht, (void **) &tmp) == FAILURE) { php_error(E_WARNING,"Error getting parameter"); SQLFreeStmt(result->stmt,SQL_RESET_PARAMS); efree(params); RETURN_FALSE; } otype = (*tmp)->type; convert_to_string(*tmp); if ((*tmp)->type != IS_STRING) { php_error(E_WARNING,"Error converting parameter"); SQLFreeStmt(result->stmt, SQL_RESET_PARAMS); efree(params); RETURN_FALSE; } SQLDescribeParam(result->stmt, (UWORD)i, &sqltype, &precision, &scale, &nullable); params[i-1].vallen = (*tmp)->value.str.len; params[i-1].fp = -1; if (IS_SQL_BINARY(sqltype)) ctype = SQL_C_BINARY; else ctype = SQL_C_CHAR; if ((*tmp)->value.str.val[0] == '\'' && (*tmp)->value.str.val[(*tmp)->value.str.len - 1] == '\'') { filename = &(*tmp)->value.str.val[1]; filename[(*tmp)->value.str.len - 2] = '\0'; if ((params[i-1].fp = open(filename,O_RDONLY)) == -1) { php_error(E_WARNING,"Can't open file %s", filename); SQLFreeStmt(result->stmt, SQL_RESET_PARAMS); for(i = 0; i < result->numparams; i++) { if (params[i].fp != -1) { close(params[i].fp); } } efree(params); RETURN_FALSE; } params[i-1].vallen = SQL_LEN_DATA_AT_EXEC(0); rc = SQLBindParameter(result->stmt, (UWORD)i, SQL_PARAM_INPUT, ctype, sqltype, precision, scale, (void *)params[i-1].fp, 0, &params[i-1].vallen); } else { #ifdef HAVE_DBMAKER precision = params[i-1].vallen; #endif if(otype == IS_NULL) { params[i-1].vallen = SQL_NULL_DATA; } rc = SQLBindParameter(result->stmt, (UWORD)i, SQL_PARAM_INPUT, ctype, sqltype, precision, scale, (*tmp)->value.str.val, 0, &params[i-1].vallen); } zend_hash_move_forward((*pv_param_arr)->value.ht); } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=15719&edit=1

« previous php.bugs (#1035) next »