ID: 15719
Updated by: [EMAIL PROTECTED]
Reported By: [EMAIL PROTECTED]
-Status: Open
+Status: Closed
Bug Type: ODBC related
Operating System: Redhat 7.1
PHP Version: 4.1.1
New Comment:
This bug has been fixed in CVS.
Thanks for your patch.
Previous Comments:
------------------------------------------------------------------------
[2002-02-26 10:22:28] [EMAIL PROTECTED]
patch for php-latest
*** php_odbc.c.orig Fri Feb 15 11:34:57 2002
--- php_odbc.c.new Tue Feb 26 09:01:21 2002
***************
*** 878,883 ****
--- 878,884 ----
SWORD sqltype, ctype, scale;
SWORD nullable;
UDWORD precision;
+ unsigned char otype;
odbc_result *result;
int numArgs, i, ne;
RETCODE rc;
***************
*** 925,930 ****
--- 926,932 ----
efree(params);
RETURN_FALSE;
}
+ otype = (*tmp)->type;
convert_to_string(*tmp);
if (Z_TYPE_PP(tmp) != IS_STRING) {
php_error(E_WARNING,"Error converting parameter");
***************
*** 984,989 ****
--- 986,995 ----
#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,
Z_STRVAL_PP(tmp), 0,
------------------------------------------------------------------------
[2002-02-25 18:20:38] [EMAIL PROTECTED]
as requested, patch.....
881d880
< unsigned char otype;
927d925
< otype = (*tmp)->type;
973,976d970
< if(otype == IS_NULL)
< {
< params[i-1].vallen = SQL_NULL_DATA;
< }
------------------------------------------------------------------------
[2002-02-25 17:59:28] [EMAIL PROTECTED]
can you please submit this change as a patch? This fix would become
infinately simplier to make :)
------------------------------------------------------------------------
[2002-02-25 17:10:20] [EMAIL PROTECTED]
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,
¶ms[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,
¶ms[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