ID:               34515
 Comment by:       mark at tranchant dot plus dot com
 Reported By:      jaba at inbox dot lv
 Status:           Feedback
 Bug Type:         MySQLi related
 Operating System: Debian GNU/Linux
 PHP Version:      5.0.5
 New Comment:

Gah. I think I've got as far as my abilities allow.

Basically, if either add_assoc_zval or add_assoc_null are called with
anything other than a static string, crash. Even:

char *tmp;
...
sprintf(tmp, "hello");
add_assoc_zval(return_value, tmp, res);

fails, although:

add_assoc_zval(return_value, "hello", res);

does not, and $array['hello'] returns the first value as expected.
There is no issue with the mysql_fetch_fields() function: the failure
occurs even with that commented out.

I've traced the code path down to _zend_hash_add_or_update(), but I
don't know enough to see any problems on the way there.

***********************************

#define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg,
__key, strlen(__key)+1, __value)

***********************************

ZEND_API int add_assoc_zval_ex(zval *arg, char *key, uint key_len, zval
*value)
{
   return zend_symtable_update(Z_ARRVAL_P(arg), key, key_len, (void *)
&value, sizeof(zval *), NULL);
}

***********************************

static inline int zend_symtable_update(HashTable *ht, char *arKey, uint
nKeyLength, void *pData, uint nDa
taSize, void **pDest)                                   \
{
   HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_update(ht, idx,
pData, nDataSize, pDest));
   return zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize,
pDest);
}

***********************************

#define zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize,
pDest) \
   _zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize,
pDest, HASH_UPDATE ZEND_FILE_LINE_CC)

***********************************


Previous Comments:
------------------------------------------------------------------------

[2005-10-27 14:22:43] mark at tranchant dot plus dot com

I've just written a quick C program using the MySQL C API and can
confirm that mysql_fetch_fields() works fine. The problem does appear
to be with the PHP code. I'll keep looking.

------------------------------------------------------------------------

[2005-10-27 13:09:52] mark at tranchant dot plus dot com

Not easily, no. I'm not set up for external users. If it would really
help, I could try. I've done some more digging:

In ext/mysqli/mysqli.c, there is the following code:

line 653:
 if (fetchtype & MYSQLI_ASSOC) {
    fields = mysql_fetch_fields(result);
 }

line 677:
 if (fetchtype & MYSQLI_ASSOC) {
    if (fetchtype & MYSQLI_NUM) {
       ZVAL_ADDREF(res);
    }
    add_assoc_zval(return_value, fields[i].name, res);
 }

line 687:
 if (fetchtype & MYSQLI_ASSOC) {
    add_assoc_null(return_value, fields[i].name);
 }

If I change the fields[i].name argument to "hello", the offending
functions then work. I successfully used fetch_array with MYSQLI_BOTH,
and $array['hello'] referred to the last element in the fetched array.

It seems as though the call to mysql_fetch_fields (part of the MySQL
API) is failing, which is not being detected by the PHP code. More
soon...

------------------------------------------------------------------------

[2005-10-27 12:34:42] [EMAIL PROTECTED]

Is there any chance to get an account on this server?

------------------------------------------------------------------------

[2005-10-27 12:29:06] mark at tranchant dot plus dot com

Yeah, I was right. Latest CVS snapshot (php5-STABLE-200510270836) does
not fix the issue.

------------------------------------------------------------------------

[2005-10-27 12:05:40] mark at tranchant dot plus dot com

In fact, any function that tries to do the assoc thing fails:
fetch_object fails, as does fetch_array with a resulttype of
MYSQLI_ASSOC or MYSQLI_BOTH. fetch_array works when called with
MYSQLI_NUM.

I'm just compiling the latest CVS snapshot, although the diff 'twixt
5.05's ext/mysqli directory and the CVS one doesn't give me much
hope...

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/34515

-- 
Edit this bug report at http://bugs.php.net/?id=34515&edit=1

Reply via email to