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:
Another data point: mysql_fetch_assoc() (the mysql extension, not the mysqli one) works fine with similar code and calls to add_assoc_zval. I tried "forward-porting" some of the differences to the mysqli code but just broke it completely. Is there an easy way to add debug printing to a log file or syslog into the module code? I want to explore the output values from MYSQLI_FETCH_RESOURCE(), which is different from the ZEND_FETCH_RESOURCE used in mysql. Previous Comments: ------------------------------------------------------------------------ [2005-10-27 20:55:32] mark at tranchant dot plus dot com Upgraded from gcc-3.3.2 to gcc-3.4.4, completely recompiled PHP-5.0.5. No change: bug still there. Also tried allocating a static buffer (char tmp[64];) and strcpy'ing fields[i].name to it, then using that in the add_assoc calls. No joy there, either. ------------------------------------------------------------------------ [2005-10-27 16:10:31] mark at tranchant dot plus dot com 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) *********************************** ------------------------------------------------------------------------ [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? ------------------------------------------------------------------------ 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