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