summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Richter <georg@php.net>2006-05-09 11:27:20 +0000
committerGeorg Richter <georg@php.net>2006-05-09 11:27:20 +0000
commitb6d7fdf46576c36ada6d4fe602f37bf5f0553d72 (patch)
tree1b424ac82f11ebdb78c192ab65e17450f9f8e2b4
parent1a0f27a7078765450102d6ece73c25f39d8082d2 (diff)
downloadphp-git-b6d7fdf46576c36ada6d4fe602f37bf5f0553d72.tar.gz
Merge from 5.2
-rw-r--r--ext/mysqli/mysqli.c70
-rw-r--r--ext/mysqli/mysqli_api.c393
-rw-r--r--ext/mysqli/mysqli_fe.c2
-rw-r--r--ext/mysqli/mysqli_nonapi.c17
-rw-r--r--ext/mysqli/mysqli_prop.c160
-rw-r--r--ext/mysqli/mysqli_repl.c20
-rw-r--r--ext/mysqli/mysqli_warning.c14
-rw-r--r--ext/mysqli/php_mysqli.h74
-rw-r--r--ext/mysqli/tests/002.phpt1
-rw-r--r--ext/mysqli/tests/014.phpt2
-rw-r--r--ext/mysqli/tests/017.phpt6
-rw-r--r--ext/mysqli/tests/049.phpt10
-rw-r--r--ext/mysqli/tests/bug34810.phpt5
13 files changed, 426 insertions, 348 deletions
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
index 38b2f92ee8..f4d01b0218 100644
--- a/ext/mysqli/mysqli.c
+++ b/ext/mysqli/mysqli.c
@@ -43,6 +43,13 @@ static HashTable mysqli_result_properties;
static HashTable mysqli_stmt_properties;
static HashTable mysqli_warning_properties;
+zend_class_entry *mysqli_link_class_entry;
+zend_class_entry *mysqli_stmt_class_entry;
+zend_class_entry *mysqli_result_class_entry;
+zend_class_entry *mysqli_driver_class_entry;
+zend_class_entry *mysqli_warning_class_entry;
+zend_class_entry *mysqli_exception_class_entry;
+
extern void php_mysqli_connect(INTERNAL_FUNCTION_PARAMETERS);
typedef int (*mysqli_read_t)(mysqli_object *obj, zval **retval TSRMLS_DC);
@@ -144,25 +151,23 @@ static void mysqli_objects_destroy_object(void *object, zend_object_handle handl
if (instanceof_function(intern->zo.ce, mysqli_link_class_entry TSRMLS_CC)) {
if (my_res && my_res->ptr) {
MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr;
-
if (mysql->mysql) {
mysql_close(mysql->mysql);
}
-
php_clear_mysql(mysql);
efree(mysql);
-
my_res->ptr = NULL;
}
- } else if (intern->zo.ce == mysqli_stmt_class_entry) { /* stmt object */
+ } else if (instanceof_function(intern->zo.ce, mysqli_stmt_class_entry TSRMLS_CC)) { /* stmt obj */
if (my_res && my_res->ptr) {
- php_clear_stmt_bind((MY_STMT *)my_res->ptr);
+ MY_STMT *stmt = (MY_STMT *)my_res->ptr;
+ php_clear_stmt_bind(stmt);
}
- } else if (intern->zo.ce == mysqli_result_class_entry) { /* result object */
+ } else if (instanceof_function(intern->zo.ce, mysqli_result_class_entry TSRMLS_CC)) { /* result obj */
if (my_res && my_res->ptr) {
mysql_free_result(my_res->ptr);
}
- } else if (intern->zo.ce == mysqli_warning_class_entry) { /* warning object */
+ } else if (instanceof_function(intern->zo.ce, mysqli_warning_class_entry TSRMLS_CC)) { /* warning obj */
if (my_res && my_res->ptr) {
php_clear_warnings((MYSQLI_WARNING *)my_res->info);
}
@@ -214,22 +219,11 @@ zval *mysqli_read_property(zval *object, zval *member, int type TSRMLS_DC)
}
if (ret == SUCCESS) {
-
- /* check if mysqli object is still valid */
- if (!strcmp(obj->zo.ce->name.s, "mysqli")) {
- if (!obj->ptr ||
- !((MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql)->thread_id) {
- retval = EG(uninitialized_zval_ptr);
- return(retval);
- }
- } else
- /* check if stmt object is still valid */
- if (!strcmp(obj->zo.ce->name.s, "mysqli_stmt")) {
- if (!obj->ptr ||
- !((MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt)->mysql) {
- retval = EG(uninitialized_zval_ptr);
- return(retval);
- }
+ if (strcmp(obj->zo.ce->name.s, "mysqli_driver") &&
+ (!obj->ptr || ((MYSQLI_RESOURCE *)(obj->ptr))->status < MYSQLI_STATUS_INITIALIZED)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name );
+ retval = EG(uninitialized_zval_ptr);
+ return(retval);
}
ret = hnd->read_func(obj, &retval TSRMLS_CC);
@@ -328,7 +322,7 @@ static union _zend_function *php_mysqli_constructor_get(zval *object TSRMLS_DC)
} else if (obj->zo.ce == mysqli_driver_class_entry) {
f.handler = ZEND_FN(mysqli_driver_construct);
} else if (obj->zo.ce == mysqli_warning_class_entry) {
- f.handler = ZEND_MN(mysqli_warning___construct);
+ f.handler = ZEND_FN(mysqli_warning_construct);
}
return (union _zend_function*)&f;
@@ -347,7 +341,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
intern = emalloc(sizeof(mysqli_object));
memset(intern, 0, sizeof(mysqli_object));
intern->ptr = NULL;
- intern->valid = 0;
intern->prop_handler = NULL;
mysqli_base_class = class_type;
@@ -355,6 +348,7 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
{
mysqli_base_class = mysqli_base_class->parent;
}
+
zend_hash_find(&classes, mysqli_base_class->name.s, mysqli_base_class->name_length + 1,
(void **) &intern->prop_handler);
@@ -566,6 +560,10 @@ PHP_MINIT_FUNCTION(mysqli)
REGISTER_LONG_CONSTANT("MYSQLI_TYPE_CHAR", FIELD_TYPE_CHAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INTERVAL", FIELD_TYPE_INTERVAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_TYPE_GEOMETRY", FIELD_TYPE_GEOMETRY, CONST_CS | CONST_PERSISTENT);
+#if MYSQL_VERSION_ID > 50002
+ REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDECIMAL", FIELD_TYPE_NEWDECIMAL, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BIT", FIELD_TYPE_BIT, CONST_CS | CONST_PERSISTENT);
+#endif
/* replication */
REGISTER_LONG_CONSTANT("MYSQLI_RPL_MASTER", MYSQL_RPL_MASTER, CONST_CS | CONST_PERSISTENT);
@@ -633,10 +631,10 @@ PHP_MINFO_FUNCTION(mysqli)
{
php_info_print_table_start();
php_info_print_table_header(2, "MysqlI Support", "enabled");
- php_info_print_table_row(2, "Client API version", mysql_get_client_info());
+ php_info_print_table_row(2, "Client API library version", mysql_get_client_info());
+ php_info_print_table_row(2, "Client API header version", MYSQL_SERVER_VERSION);
php_info_print_table_row(2, "MYSQLI_SOCKET", MYSQL_UNIX_ADDR);
-
php_info_print_table_end();
DISPLAY_INI_ENTRIES();
@@ -646,7 +644,7 @@ PHP_MINFO_FUNCTION(mysqli)
/* {{{ mixed mysqli_stmt_construct()
constructor for statement object.
Parameters:
- object -> mysqli_init
+ object -> mysqli_stmt_init
object, query -> mysqli_prepare
*/
ZEND_FUNCTION(mysqli_stmt_construct)
@@ -664,17 +662,17 @@ ZEND_FUNCTION(mysqli_stmt_construct)
if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
stmt->stmt = mysql_stmt_init(mysql->mysql);
break;
case 2:
- if (zend_parse_parameters(2 TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &statement, stmt_len)==FAILURE) {
+ if (zend_parse_parameters(2 TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &statement, &stmt_len)==FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
@@ -694,9 +692,9 @@ ZEND_FUNCTION(mysqli_stmt_construct)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)stmt;
+ mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
- ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
}
/* }}} */
@@ -728,7 +726,7 @@ ZEND_FUNCTION(mysqli_result_construct)
WRONG_PARAM_COUNT;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
result = (resmode == MYSQLI_STORE_RESULT) ? mysql_store_result(mysql->mysql) :
mysql_use_result(mysql->mysql);
@@ -739,10 +737,9 @@ ZEND_FUNCTION(mysqli_result_construct)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
- ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
-
}
/* }}} */
@@ -790,7 +787,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
}
}
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if ((fetchtype & MYSQLI_BOTH) == 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH");
@@ -976,6 +973,7 @@ int php_local_infile_init(void **ptr, const char *filename, void *userdata)
mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context);
if (mysql->li_stream == NULL) {
+ sprintf((char *)data->error_msg, "Can't find file '%-.64s'.", filename);
return 1;
}
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
index a17c3e71dc..619a0457fe 100644
--- a/ext/mysqli/mysqli_api.c
+++ b/ext/mysqli/mysqli_api.c
@@ -41,7 +41,7 @@ PHP_FUNCTION(mysqli_affected_rows)
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
rc = mysql_affected_rows(mysql->mysql);
if (rc == (my_ulonglong) -1) {
@@ -62,7 +62,7 @@ PHP_FUNCTION(mysqli_autocommit)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob", &mysql_link, mysqli_link_class_entry, &automode) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_autocommit(mysql->mysql, automode)) {
RETURN_FALSE;
@@ -89,11 +89,6 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
unsigned long rc;
/* calculate and check number of parameters */
- num_vars = argc - 1;
- if (!getThis()) {
- /* ignore handle parameter in procedural interface*/
- --num_vars;
- }
if (argc < 2) {
/* there has to be at least one pair */
WRONG_PARAM_COUNT;
@@ -103,10 +98,14 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
+ num_vars = argc - 1;
if (getThis()) {
start = 1;
+ } else {
+ /* ignore handle parameter in procedural interface*/
+ --num_vars;
}
if (typelen != argc - start) {
@@ -154,23 +153,19 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
case 'b': /* Blob (send data) */
bind[ofs].buffer_type = MYSQL_TYPE_LONG_BLOB;
- bind[ofs].is_null = 0;
- bind[ofs].length = 0;
+ /* don't initialize is_null and length to 0 because we use ecalloc */
break;
case 's': /* string */
bind[ofs].buffer_type = MYSQL_TYPE_VAR_STRING;
- bind[ofs].buffer = NULL;
- bind[ofs].buffer_length = 0;
+ /* don't initialize buffer and buffer_length because we use ecalloc */
bind[ofs].is_null = &stmt->param.is_null[ofs];
break;
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %c (parameter %d)", types[ofs], i+1);
- efree(args);
- efree(bind);
- RETURN_FALSE;
- break;
+ RETVAL_FALSE;
+ goto end;
}
ofs++;
}
@@ -178,9 +173,8 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
if (rc) {
- efree(args);
- efree(bind);
- RETURN_FALSE;
+ RETVAL_FALSE;
+ goto end;
}
stmt->param.var_cnt = num_vars;
@@ -193,10 +187,10 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
stmt->param.vars[i] = NULL;
}
}
+ RETVAL_TRUE;
+end:
efree(args);
efree(bind);
-
- RETURN_TRUE;
}
/* }}} */
@@ -229,7 +223,7 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if (argc < (getThis() ? 1 : 2)) {
WRONG_PARAM_COUNT;
@@ -279,13 +273,17 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
break;
case MYSQL_TYPE_NULL:
- stmt->result.buf[ofs].type = IS_NULL;
- stmt->result.buf[ofs].buflen = 0;
+ stmt->result.buf[ofs].type = IS_NULL;
+ /*
+ don't initialize to 0 :
+ 1. stmt->result.buf[ofs].buflen
+ 2. bind[ofs].buffer
+ 3. bind[ofs].buffer_length
+ because memory was allocated with ecalloc
+ */
bind[ofs].buffer_type = MYSQL_TYPE_NULL;
- bind[ofs].buffer = 0;
bind[ofs].is_null = &stmt->result.is_null[ofs];
- bind[ofs].buffer_length = 0;
- break;
+ break;
case MYSQL_TYPE_SHORT:
case MYSQL_TYPE_TINY:
@@ -294,11 +292,12 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
case MYSQL_TYPE_YEAR:
convert_to_long_ex(args[i]);
stmt->result.buf[ofs].type = IS_LONG;
- stmt->result.buf[ofs].buflen = 0;
- stmt->result.buf[ofs].val = (char *)emalloc(sizeof(long));
+ /* don't set stmt->result.buf[ofs].buflen to 0, we used ecalloc */
+ stmt->result.buf[ofs].val = (char *)emalloc(sizeof(int));
bind[ofs].buffer_type = MYSQL_TYPE_LONG;
bind[ofs].buffer = stmt->result.buf[ofs].val;
bind[ofs].is_null = &stmt->result.is_null[ofs];
+ bind[ofs].is_unsigned = (stmt->stmt->fields[ofs].flags & UNSIGNED_FLAG) ? 1 : 0;
break;
case MYSQL_TYPE_LONGLONG:
@@ -309,6 +308,7 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
bind[ofs].buffer = stmt->result.buf[ofs].val;
bind[ofs].is_null = &stmt->result.is_null[ofs];
bind[ofs].buffer_length = stmt->result.buf[ofs].buflen;
+ bind[ofs].is_unsigned = (stmt->stmt->fields[ofs].flags & UNSIGNED_FLAG) ? 1 : 0;
break;
case MYSQL_TYPE_DATE:
@@ -323,20 +323,31 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
#ifdef FIELD_TYPE_NEWDECIMAL
case MYSQL_TYPE_NEWDECIMAL:
#endif
+ {
+#if MYSQL_VERSION_ID > 50099
+ /* Changed to my_bool in MySQL 5.1. See MySQL Bug #16144 */
+ my_bool tmp;
+#else
+ ulong tmp = 0;
+#endif
stmt->result.buf[ofs].type = IS_STRING;
/*
If the user has called $stmt->store_result() then we have asked
max_length to be updated. this is done only for BLOBS because we don't want to allocate
big chunkgs of memory 2^16 or 2^24
*/
- if (stmt->stmt->fields[ofs].max_length == 0) {
+ if (stmt->stmt->fields[ofs].max_length == 0 &&
+ !mysql_stmt_attr_get(stmt->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &tmp) && !tmp)
+ {
stmt->result.buf[ofs].buflen =
(stmt->stmt->fields) ? (stmt->stmt->fields[ofs].length) ? stmt->stmt->fields[ofs].length + 1: 256: 256;
} else {
/*
the user has called store_result(). if he does not there is no way to determine the
+ libmysql does not allow us to allocate 0 bytes for a buffer so we try 1
*/
- stmt->result.buf[ofs].buflen = stmt->stmt->fields[ofs].max_length;
+ if (!(stmt->result.buf[ofs].buflen = stmt->stmt->fields[ofs].max_length))
+ ++stmt->result.buf[ofs].buflen;
}
stmt->result.buf[ofs].val = (char *)emalloc(stmt->result.buf[ofs].buflen);
bind[ofs].buffer_type = MYSQL_TYPE_STRING;
@@ -345,6 +356,10 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
bind[ofs].buffer_length = stmt->result.buf[ofs].buflen;
bind[ofs].length = &stmt->result.buf[ofs].buflen;
break;
+ }
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Server returned unknown type %ld. Probably your client library is incompatible with the server version you use!", col_type);
+ break;
}
}
@@ -352,24 +367,27 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
if (rc) {
- efree(bind);
- efree(args);
- php_clear_stmt_bind(stmt);
- RETURN_FALSE;
- }
-
- stmt->result.var_cnt = var_cnt;
- stmt->result.vars = (zval **)safe_emalloc((var_cnt), sizeof(zval), 0);
- for (i = start; i < var_cnt+start; i++) {
- ofs = i-start;
- ZVAL_ADDREF(*args[i]);
- stmt->result.vars[ofs] = *args[i];
+ /* dont close the statement or subsequent usage (for example ->execute()) will lead to crash */
+ for (i=0; i < var_cnt ; i++) {
+ if (stmt->result.buf[i].val) {
+ efree(stmt->result.buf[i].val);
+ }
+ }
+ efree(stmt->result.buf);
+ efree(stmt->result.is_null);
+ RETVAL_FALSE;
+ } else {
+ stmt->result.var_cnt = var_cnt;
+ stmt->result.vars = (zval **)safe_emalloc((var_cnt), sizeof(zval), 0);
+ for (i = start; i < var_cnt+start; i++) {
+ ofs = i-start;
+ ZVAL_ADDREF(*args[i]);
+ stmt->result.vars[ofs] = *args[i];
+ }
+ RETVAL_TRUE;
}
-
efree(args);
efree(bind);
-
- RETURN_TRUE;
}
/* }}} */
@@ -386,7 +404,7 @@ PHP_FUNCTION(mysqli_change_user)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osss", &mysql_link, mysqli_link_class_entry, &user, &user_len, &password, &password_len, &dbname, &dbname_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
rc = mysql_change_user(mysql->mysql, user, password, dbname);
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -410,7 +428,7 @@ PHP_FUNCTION(mysqli_character_set_name)
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((char *) mysql_character_set_name(mysql->mysql), 1);
}
@@ -427,7 +445,7 @@ PHP_FUNCTION(mysqli_close)
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
mysql_close(mysql->mysql);
php_clear_mysql(mysql);
@@ -447,7 +465,7 @@ PHP_FUNCTION(mysqli_commit)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_commit(mysql->mysql)) {
RETURN_FALSE;
}
@@ -467,7 +485,7 @@ PHP_FUNCTION(mysqli_data_seek)
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -510,7 +528,7 @@ PHP_FUNCTION(mysqli_dump_debug_info)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
rc = mysql_dump_debug_info(mysql->mysql);
@@ -531,7 +549,7 @@ PHP_FUNCTION(mysqli_errno)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_errno(mysql->mysql));
}
/* }}} */
@@ -546,7 +564,7 @@ PHP_FUNCTION(mysqli_error)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((char *)mysql_error(mysql->mysql),1);
}
/* }}} */
@@ -562,7 +580,7 @@ PHP_FUNCTION(mysqli_stmt_execute)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
for (i = 0; i < stmt->param.var_cnt; i++) {
if (stmt->param.vars[i]) {
@@ -608,15 +626,14 @@ PHP_FUNCTION(mysqli_stmt_fetch)
zval *mysql_stmt;
unsigned int i;
ulong ret;
- int lval;
- double dval;
+ unsigned int uval;
my_ulonglong llval;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
/* reset buffers */
@@ -633,42 +650,73 @@ PHP_FUNCTION(mysqli_stmt_fetch)
if (!ret) {
#endif
for (i = 0; i < stmt->result.var_cnt; i++) {
- if (stmt->result.vars[i]->type == IS_STRING && stmt->result.vars[i]->value.str.len) {
- efree(stmt->result.vars[i]->value.str.val);
+ /* Even if the string is of length zero there is one byte alloced so efree() in all cases */
+ if (Z_TYPE_P(stmt->result.vars[i]) == IS_STRING) {
+ efree(stmt->result.vars[i]->value.str.val);
}
if (!stmt->result.is_null[i]) {
switch (stmt->result.buf[i].type) {
case IS_LONG:
- memcpy(&lval, stmt->result.buf[i].val, sizeof(lval));
- ZVAL_LONG(stmt->result.vars[i], lval);
+ if ((stmt->stmt->fields[i].type == MYSQL_TYPE_LONG)
+ && (stmt->stmt->fields[i].flags & UNSIGNED_FLAG))
+ {
+ /* unsigned int (11) */
+ uval= *(unsigned int *) stmt->result.buf[i].val;
+
+ if (uval > INT_MAX) {
+ char *tmp, *p;
+ int j=10;
+ tmp= emalloc(11);
+ p= &tmp[9];
+ do {
+ *p-- = (uval % 10) + 48;
+ uval = uval / 10;
+ } while (--j > 0);
+ tmp[10]= '\0';
+ /* unsigned int > INT_MAX is 10 digis - ALWAYS */
+ ZVAL_STRINGL(stmt->result.vars[i], tmp, 10, 0);
+ break;
+ }
+ }
+ if (stmt->stmt->fields[i].flags & UNSIGNED_FLAG) {
+ ZVAL_LONG(stmt->result.vars[i], *(unsigned int *)stmt->result.buf[i].val);
+ } else {
+ ZVAL_LONG(stmt->result.vars[i], *(int *)stmt->result.buf[i].val);
+ }
break;
case IS_DOUBLE:
- memcpy(&dval, stmt->result.buf[i].val, sizeof(dval));
- ZVAL_DOUBLE(stmt->result.vars[i], dval);
+ ZVAL_DOUBLE(stmt->result.vars[i], *(double *)stmt->result.buf[i].val);
break;
case IS_STRING:
if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG) {
- char tmp[50];
- memcpy (&llval, stmt->result.buf[i].val, sizeof(my_ulonglong));
- if (llval != (long)llval) {
+ my_bool uns= (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? 1:0;
+ llval= *(my_ulonglong *) stmt->result.buf[i].val;
+#if SIZEOF_LONG==8
+ if (uns && llval > 9223372036854775807L) {
+#elif SIZEOF_LONG==4
+ if ((uns && llval > L64(2147483647)) ||
+ (!uns && (( L64(2147483647) < (my_longlong) llval) || (L64(-2147483648) > (my_longlong) llval))))
+ {
+#endif
+ char tmp[22];
/* even though lval is declared as unsigned, the value
- * may be negative. Therefor we cannot use %llu and must
- * use %lld.
+ * may be negative. Therefor we cannot use MYSQLI_LLU_SPEC and must
+ * use MYSQLI_LL_SPEC.
*/
- sprintf((char *)&tmp, "%lld", llval);
+ sprintf((char *)&tmp, (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval);
ZVAL_STRING(stmt->result.vars[i], tmp, 1);
} else {
ZVAL_LONG(stmt->result.vars[i], llval);
}
} else {
- ZVAL_STRINGL(stmt->result.vars[i], stmt->result.buf[i].val, stmt->result.buf[i].buflen, 1);
+ ZVAL_STRINGL(stmt->result.vars[i], stmt->result.buf[i].val, stmt->result.buf[i].buflen, 1);
}
break;
default:
break;
}
} else {
- stmt->result.vars[i]->type = IS_NULL;
+ ZVAL_NULL(stmt->result.vars[i]);
}
}
} else {
@@ -677,6 +725,13 @@ PHP_FUNCTION(mysqli_stmt_fetch)
switch (ret) {
case 0:
+#ifdef MYSQL_DATA_TRUNCATED
+ /* according to SQL standard truncation (e.g. loss of precision is
+ not an error) - for detecting possible truncation you have to
+ check mysqli_stmt_warning
+ */
+ case MYSQL_DATA_TRUNCATED:
+#endif
RETURN_TRUE;
break;
case 1:
@@ -701,7 +756,7 @@ PHP_FUNCTION(mysqli_fetch_field)
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (!(field = mysql_fetch_field(result))) {
RETURN_FALSE;
@@ -738,11 +793,7 @@ PHP_FUNCTION(mysqli_fetch_fields)
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
-
- if (!(field = mysql_fetch_field(result))) {
- RETURN_FALSE;
- }
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
array_init(return_value);
@@ -783,7 +834,7 @@ PHP_FUNCTION(mysqli_fetch_field_direct)
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (offset < 0 || offset >= mysql_num_fields(result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field offset is invalid for resultset");
@@ -823,7 +874,7 @@ PHP_FUNCTION(mysqli_fetch_lengths)
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (!(ret = mysql_fetch_lengths(result))) {
RETURN_FALSE;
@@ -856,7 +907,7 @@ PHP_FUNCTION(mysqli_field_count)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_field_count(mysql->mysql));
}
@@ -874,7 +925,7 @@ PHP_FUNCTION(mysqli_field_seek)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &fieldnr) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (fieldnr < 0 || fieldnr >= mysql_num_fields(result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -896,7 +947,7 @@ PHP_FUNCTION(mysqli_field_tell)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_field_tell(result));
}
@@ -912,12 +963,10 @@ PHP_FUNCTION(mysqli_free_result)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
mysql_free_result(result);
MYSQLI_CLEAR_RESOURCE(&mysql_result);
-
- return;
}
/* }}} */
@@ -947,7 +996,7 @@ PHP_FUNCTION(mysqli_get_host_info)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info : "", 1);
}
@@ -963,7 +1012,7 @@ PHP_FUNCTION(mysqli_get_proto_info)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_get_proto_info(mysql->mysql));
}
@@ -979,7 +1028,7 @@ PHP_FUNCTION(mysqli_get_server_info)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((char *)mysql_get_server_info(mysql->mysql), 1);
}
@@ -996,7 +1045,7 @@ PHP_FUNCTION(mysqli_get_server_version)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_get_server_version(mysql->mysql));
}
@@ -1012,7 +1061,7 @@ PHP_FUNCTION(mysqli_info)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : "", 1);
}
@@ -1032,12 +1081,12 @@ PHP_FUNCTION(mysqli_init)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)mysql;
+ mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
if (!getThis() || !instanceof_function(Z_OBJCE_P(getThis()), mysqli_link_class_entry TSRMLS_CC)) {
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
} else {
((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
- ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
}
}
/* }}} */
@@ -1053,7 +1102,7 @@ PHP_FUNCTION(mysqli_insert_id)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
rc = mysql_insert_id(mysql->mysql);
MYSQLI_RETURN_LONG_LONG(rc)
}
@@ -1070,7 +1119,7 @@ PHP_FUNCTION(mysqli_kill)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_link, mysqli_link_class_entry, &processid) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_kill(mysql->mysql, processid)) {
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -1080,7 +1129,7 @@ PHP_FUNCTION(mysqli_kill)
}
/* }}} */
-/* {{{ proto mysqli_set_local_infile_default(object link)
+/* {{{ proto void mysqli_set_local_infile_default(object link)
unsets user defined handler for load local infile command */
PHP_FUNCTION(mysqli_set_local_infile_default)
{
@@ -1091,7 +1140,7 @@ PHP_FUNCTION(mysqli_set_local_infile_default)
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql->li_read) {
efree(Z_STRVAL_P(mysql->li_read));
@@ -1107,7 +1156,7 @@ PHP_FUNCTION(mysqli_set_local_infile_handler)
{
MY_MYSQL *mysql;
zval *mysql_link;
- zval callback_name;
+ zval callback_name;
zval *callback_func;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &mysql_link, mysqli_link_class_entry,
@@ -1115,7 +1164,7 @@ PHP_FUNCTION(mysqli_set_local_infile_handler)
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
/* check callback function */
if (!zend_is_callable(callback_func, 0, &callback_name)) {
@@ -1128,6 +1177,8 @@ PHP_FUNCTION(mysqli_set_local_infile_handler)
/* save callback function */
ALLOC_ZVAL(mysql->li_read);
ZVAL_STRING(mysql->li_read, callback_func->value.str.val, 1);
+
+ RETURN_TRUE;
}
/* }}} */
@@ -1141,12 +1192,9 @@ PHP_FUNCTION(mysqli_more_results)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
- if (!mysql_more_results(mysql->mysql)) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
+ RETURN_BOOL(mysql_more_results(mysql->mysql));
}
/* }}} */
@@ -1159,12 +1207,9 @@ PHP_FUNCTION(mysqli_next_result) {
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
- if (mysql_next_result(mysql->mysql)) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
+ RETURN_BOOL(!mysql_next_result(mysql->mysql));
}
/* }}} */
@@ -1178,7 +1223,7 @@ PHP_FUNCTION(mysqli_num_fields)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_num_fields(result));
}
@@ -1194,7 +1239,7 @@ PHP_FUNCTION(mysqli_num_rows)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result");
+ MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -1219,7 +1264,7 @@ PHP_FUNCTION(mysqli_options)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
switch (Z_TYPE_PP(&mysql_value)) {
case IS_STRING:
@@ -1231,12 +1276,7 @@ PHP_FUNCTION(mysqli_options)
ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);
break;
}
-
- if (ret != 0) {
- RETURN_FALSE;
- } else {
- RETURN_TRUE;
- }
+ RETURN_BOOL(!ret);
}
/* }}} */
@@ -1252,13 +1292,10 @@ PHP_FUNCTION(mysqli_ping)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
rc = mysql_ping(mysql->mysql);
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
- if (rc) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
+ RETURN_BOOL(!rc);
}
/* }}} */
@@ -1276,7 +1313,7 @@ PHP_FUNCTION(mysqli_prepare)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",&mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql->mysql->status == MYSQL_STATUS_GET_RESULT) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "All data must be fetched before a new statement prepare takes place");
RETURN_FALSE;
@@ -1303,18 +1340,27 @@ PHP_FUNCTION(mysqli_prepare)
memcpy(mysql->mysql->net.last_error, last_error, MYSQL_ERRMSG_SIZE);
memcpy(mysql->mysql->net.sqlstate, sqlstate, SQLSTATE_LENGTH+1);
}
- }
-
+ }
+ /* don't joing to the previous if because it won't work if mysql_stmt_prepare_fails */
if (!stmt->stmt) {
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
efree(stmt);
RETURN_FALSE;
}
+
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)stmt;
- stmt->query = (query_len) ? (char *)emalloc(query_len + 1) : NULL;
- strcpy(stmt->query, query);
+ /* don't initialize stmt->query with NULL, we ecalloc()-ed the memory */
+ /* Get performance boost if reporting is switched off */
+ if (query_len && (MyG(report_mode) & MYSQLI_REPORT_INDEX)) {
+ stmt->query = (char *)emalloc(query_len + 1);
+ memcpy(stmt->query, query, query_len);
+ stmt->query[query_len] = '\0';
+ }
+
+ /* change status */
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
}
/* }}} */
@@ -1328,7 +1374,6 @@ PHP_FUNCTION(mysqli_real_connect)
unsigned int hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
unsigned long port=0, flags=0;
zval *mysql_link;
- zval *object = getThis();
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sssslsl", &mysql_link, mysqli_link_class_entry,
&hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len,
@@ -1354,7 +1399,7 @@ PHP_FUNCTION(mysqli_real_connect)
}
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
/* remove some insecure options */
flags ^= CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */
@@ -1371,6 +1416,8 @@ PHP_FUNCTION(mysqli_real_connect)
php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
php_mysqli_throw_sql_exception( mysql->mysql->net.sqlstate, mysql->mysql->net.last_errno TSRMLS_CC,
"%s", mysql->mysql->net.last_error);
+ /* change status */
+ MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_INITIALIZED);
RETURN_FALSE;
}
@@ -1380,10 +1427,7 @@ PHP_FUNCTION(mysqli_real_connect)
/* set our own local_infile handler */
php_set_local_infile_handler_default(mysql);
-
- if (object) {
- ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1;
- }
+ MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_VALID);
RETURN_TRUE;
}
@@ -1401,7 +1445,7 @@ PHP_FUNCTION(mysqli_real_query)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
MYSQLI_DISABLE_MQ; /* disable multi statements/queries */
@@ -1431,13 +1475,13 @@ PHP_FUNCTION(mysqli_real_escape_string) {
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
newstr = safe_emalloc(2, escapestr_len, 1);
newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr, escapestr_len);
newstr = erealloc(newstr, newstr_len + 1);
- RETURN_STRING(newstr, 0);
+ RETURN_STRINGL(newstr, newstr_len, 0);
}
/* }}} */
@@ -1451,7 +1495,7 @@ PHP_FUNCTION(mysqli_rollback)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_rollback(mysql->mysql)) {
RETURN_FALSE;
@@ -1474,7 +1518,7 @@ PHP_FUNCTION(mysqli_stmt_send_long_data)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &mysql_stmt, mysqli_stmt_class_entry, &param_nr, &data, &data_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if (param_nr < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number");
@@ -1487,7 +1531,6 @@ PHP_FUNCTION(mysqli_stmt_send_long_data)
}
/* }}} */
-
/* {{{ proto mixed mysqli_stmt_affected_rows(object stmt)
Return the number of rows affected in the last query for the given link */
PHP_FUNCTION(mysqli_stmt_affected_rows)
@@ -1499,7 +1542,7 @@ PHP_FUNCTION(mysqli_stmt_affected_rows)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
rc = mysql_stmt_affected_rows(stmt->stmt);
if (rc == (my_ulonglong) -1) {
@@ -1519,13 +1562,13 @@ PHP_FUNCTION(mysqli_stmt_close)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
+
mysql_stmt_close(stmt->stmt);
stmt->stmt = NULL;
php_clear_stmt_bind(stmt);
MYSQLI_CLEAR_RESOURCE(&mysql_stmt);
RETURN_TRUE;
-
}
/* }}} */
@@ -1545,10 +1588,9 @@ PHP_FUNCTION(mysqli_stmt_data_seek)
RETURN_FALSE;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
mysql_stmt_data_seek(stmt->stmt, offset);
- return;
}
/* }}} */
@@ -1562,7 +1604,7 @@ PHP_FUNCTION(mysqli_stmt_field_count)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_stmt_field_count(stmt->stmt));
}
@@ -1579,11 +1621,9 @@ PHP_FUNCTION(mysqli_stmt_free_result)
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
mysql_stmt_free_result(stmt->stmt);
-
- return;
}
/* }}} */
@@ -1598,7 +1638,7 @@ PHP_FUNCTION(mysqli_stmt_insert_id)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
rc = mysql_stmt_insert_id(stmt->stmt);
MYSQLI_RETURN_LONG_LONG(rc)
}
@@ -1614,7 +1654,7 @@ PHP_FUNCTION(mysqli_stmt_param_count)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_stmt_param_count(stmt->stmt));
}
@@ -1631,7 +1671,7 @@ PHP_FUNCTION(mysqli_stmt_reset)
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if (mysql_stmt_reset(stmt->stmt)) {
RETURN_FALSE;
@@ -1652,7 +1692,7 @@ PHP_FUNCTION(mysqli_stmt_num_rows)
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
rc = mysql_stmt_num_rows(stmt->stmt);
MYSQLI_RETURN_LONG_LONG(rc)
@@ -1672,7 +1712,7 @@ PHP_FUNCTION(mysqli_select_db)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (!mysql_select_db(mysql->mysql, dbname)) {
RETURN_TRUE;
@@ -1693,7 +1733,7 @@ PHP_FUNCTION(mysqli_sqlstate)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_STRING((char *)mysql_sqlstate(mysql->mysql),1);
}
/* }}} */
@@ -1710,7 +1750,7 @@ PHP_FUNCTION(mysqli_ssl_set)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osssss", &mysql_link, mysqli_link_class_entry, &ssl_parm[0], &ssl_parm_len[0], &ssl_parm[1], &ssl_parm_len[1], &ssl_parm[2], &ssl_parm_len[2], &ssl_parm[3], &ssl_parm_len[3], &ssl_parm[4], &ssl_parm_len[4]) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
for (i=0; i < 5; i++) {
if (!ssl_parm_len[i]) {
@@ -1735,7 +1775,7 @@ PHP_FUNCTION(mysqli_stat)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if ((stat = (char *)mysql_stat(mysql->mysql))) {
RETURN_STRING(stat, 1);
@@ -1758,7 +1798,7 @@ PHP_FUNCTION(mysqli_stmt_attr_set)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &mysql_stmt, mysqli_stmt_class_entry, &attr, &mode) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if ((rc = mysql_stmt_attr_set(stmt->stmt, attr, (void *)&mode))) {
RETURN_FALSE;
@@ -1773,19 +1813,23 @@ PHP_FUNCTION(mysqli_stmt_attr_get)
{
MY_STMT *stmt;
zval *mysql_stmt;
- ulong value;
+#if MYSQL_VERSION_ID > 50099
+ my_bool value;
+#else
+ ulong value = 0;
+#endif
ulong attr;
int rc;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_stmt, mysqli_stmt_class_entry, &attr) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if ((rc = mysql_stmt_attr_get(stmt->stmt, attr, &value))) {
RETURN_FALSE;
}
- RETURN_LONG(value);
+ RETURN_LONG((long)value);
}
/* }}} */
@@ -1799,7 +1843,7 @@ PHP_FUNCTION(mysqli_stmt_errno)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
RETURN_LONG(mysql_stmt_errno(stmt->stmt));
}
@@ -1815,7 +1859,7 @@ PHP_FUNCTION(mysqli_stmt_error)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
RETURN_STRING((char *)mysql_stmt_error(stmt->stmt),1);
}
@@ -1834,7 +1878,7 @@ PHP_FUNCTION(mysqli_stmt_init)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",&mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
@@ -1844,6 +1888,7 @@ PHP_FUNCTION(mysqli_stmt_init)
}
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
+ mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
mysqli_resource->ptr = (void *)stmt;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
}
@@ -1862,12 +1907,14 @@ PHP_FUNCTION(mysqli_stmt_prepare)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_stmt, mysqli_stmt_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
RETURN_FALSE;
}
+ /* change status */
+ MYSQLI_SET_STATUS(&mysql_stmt, MYSQLI_STATUS_VALID);
RETURN_TRUE;
}
/* }}} */
@@ -1884,7 +1931,7 @@ PHP_FUNCTION(mysqli_stmt_result_metadata)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
if (!(result = mysql_stmt_result_metadata(stmt->stmt))){
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
@@ -1893,6 +1940,7 @@ PHP_FUNCTION(mysqli_stmt_result_metadata)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
}
/* }}} */
@@ -1908,7 +1956,7 @@ PHP_FUNCTION(mysqli_stmt_store_result)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
/*
If the user wants to store the data and we have BLOBs/TEXTs we try to allocate
@@ -1943,7 +1991,7 @@ PHP_FUNCTION(mysqli_stmt_sqlstate)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
RETURN_STRING((char *)mysql_stmt_sqlstate(stmt->stmt),1);
}
@@ -1961,7 +2009,7 @@ PHP_FUNCTION(mysqli_store_result)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (!(result = mysql_store_result(mysql->mysql))) {
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -1970,8 +2018,10 @@ PHP_FUNCTION(mysqli_store_result)
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
php_mysqli_report_index("from previous query", mysql->mysql->server_status TSRMLS_CC);
}
+
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
}
/* }}} */
@@ -1986,7 +2036,7 @@ PHP_FUNCTION(mysqli_thread_id)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_thread_id(mysql->mysql));
}
@@ -2013,7 +2063,7 @@ PHP_FUNCTION(mysqli_use_result)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (!(result = mysql_use_result(mysql->mysql))) {
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -2026,6 +2076,7 @@ PHP_FUNCTION(mysqli_use_result)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
}
/* }}} */
@@ -2040,7 +2091,7 @@ PHP_FUNCTION(mysqli_warning_count)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_warning_count(mysql->mysql));
}
diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c
index 388c5dad59..8d7bd53a5f 100644
--- a/ext/mysqli/mysqli_fe.c
+++ b/ext/mysqli/mysqli_fe.c
@@ -238,6 +238,7 @@ zend_function_entry mysqli_link_methods[] = {
* Every user visible function must have an entry in mysqli_result_functions[].
*/
zend_function_entry mysqli_result_methods[] = {
+ PHP_FALIAS(__construct, mysqli_result_construct, NULL)
PHP_FALIAS(close,mysqli_free_result,NULL)
PHP_FALIAS(free,mysqli_free_result,NULL)
PHP_FALIAS(data_seek,mysqli_data_seek,NULL)
@@ -260,6 +261,7 @@ zend_function_entry mysqli_result_methods[] = {
* Every user visible function must have an entry in mysqli_stmt_functions[].
*/
zend_function_entry mysqli_stmt_methods[] = {
+ PHP_FALIAS(__construct,mysqli_stmt_construct,NULL)
PHP_FALIAS(attr_get,mysqli_stmt_attr_get,NULL)
PHP_FALIAS(attr_set,mysqli_stmt_attr_set,NULL)
PHP_FALIAS(bind_param,mysqli_stmt_bind_param,second_arg_force_by_ref_rest)
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 9c031fab6c..36bd45f39e 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -111,12 +111,12 @@ PHP_FUNCTION(mysqli_connect)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)mysql;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
} else {
((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
- ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1;
}
}
/* }}} */
@@ -177,7 +177,7 @@ PHP_FUNCTION(mysqli_multi_query)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
MYSQLI_ENABLE_MQ;
if (mysql_real_query(mysql->mysql, query, query_len)) {
@@ -228,7 +228,7 @@ PHP_FUNCTION(mysqli_query)
RETURN_FALSE;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
MYSQLI_DISABLE_MQ;
@@ -259,6 +259,7 @@ PHP_FUNCTION(mysqli_query)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = (void *)result;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
}
/* }}} */
@@ -274,7 +275,7 @@ PHP_FUNCTION(mysqli_get_warnings)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_warning_count(mysql->mysql)) {
w = php_get_warnings(mysql->mysql);
@@ -298,7 +299,7 @@ PHP_FUNCTION(mysqli_stmt_get_warnings)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &stmt_link, mysqli_stmt_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt", MYSQLI_STATUS_VALID);
if (mysql_warning_count(stmt->stmt->mysql)) {
w = php_get_warnings(stmt->stmt->mysql);
@@ -324,9 +325,9 @@ PHP_FUNCTION(mysqli_set_charset)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
- if (!mysql->mysql->thread_id || mysql_set_character_set(mysql->mysql, cs_name)) {
+ if (mysql_set_character_set(mysql->mysql, cs_name)) {
RETURN_FALSE;
}
RETURN_TRUE;
@@ -346,7 +347,7 @@ PHP_FUNCTION(mysqli_get_charset)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
object_init(return_value);
diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c
index 19db5bc1de..db7b637728 100644
--- a/ext/mysqli/mysqli_prop.c
+++ b/ext/mysqli/mysqli_prop.c
@@ -29,51 +29,49 @@
#include "ext/standard/info.h"
#include "php_mysqli.h"
-#define CHECK_OBJECT() \
- if (!obj->valid) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet. Call the default constructor of the object first"); \
+#define CHECK_STATUS(value) \
+ if (((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet"); \
ZVAL_NULL(*retval); \
return SUCCESS; \
} \
-#define MYSQLI_GET_MYSQL() \
+#define MYSQLI_GET_MYSQL(statusval) \
MYSQL *p; \
ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
ZVAL_NULL(*retval);\
return SUCCESS; \
-} else if (!obj->valid) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", obj->zo.ce->name);\
- ZVAL_NULL(*retval);\
- return SUCCESS; \
} else { \
- p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql; \
+ CHECK_STATUS(statusval);\
+ p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
}
-#define MYSQLI_GET_RESULT() \
+#define MYSQLI_GET_RESULT(statusval) \
MYSQL_RES *p; \
ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
if (!obj->ptr) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
ZVAL_NULL(*retval);\
return SUCCESS; \
-} else if (!obj->valid) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", obj->zo.ce->name);\
- ZVAL_NULL(*retval);\
- return SUCCESS; \
} else { \
+ CHECK_STATUS(statusval);\
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
}
-#define MYSQLI_GET_STMT() \
+#define MYSQLI_GET_STMT(statusval) \
MYSQL_STMT *p; \
ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
-p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt
+if (!obj->ptr) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
+ ZVAL_NULL(*retval);\
+ return SUCCESS; \
+} else { \
+ CHECK_STATUS(statusval);\
+ p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
+}
#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type)\
static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
@@ -88,7 +86,7 @@ static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
ZVAL_LONG(*retval, l);\
} else { \
char ret[40]; \
- sprintf(ret, "%llu", (my_ulonglong)l); \
+ sprintf(ret, MYSQLI_LLU_SPEC, (my_ulonglong)l); \
ZVAL_STRING(*retval, ret, 1); \
} \
}\
@@ -126,6 +124,7 @@ static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
{
ALLOC_ZVAL(*retval);
+ CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
ZVAL_STRING(*retval, MYSQL_SERVER_VERSION, 1);
return SUCCESS;
}
@@ -135,6 +134,7 @@ static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
{
ALLOC_ZVAL(*retval);
+ CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
ZVAL_LONG(*retval, (long)MyG(error_no));
return SUCCESS;
}
@@ -144,6 +144,7 @@ static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
{
ALLOC_ZVAL(*retval);
+ CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
ZVAL_STRING(*retval, MyG(error_msg), 1);
return SUCCESS;
}
@@ -156,41 +157,46 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
my_ulonglong rc;
ALLOC_ZVAL(*retval);
- CHECK_OBJECT();
mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- rc = mysql_affected_rows(mysql->mysql);
-
- if (rc == (my_ulonglong)-1) {
- ZVAL_LONG(*retval, -1);
- return SUCCESS;
- }
-
- if (rc < LONG_MAX) {
- ZVAL_LONG(*retval, rc);
+
+ if (!mysql) {
+ ZVAL_NULL(*retval);
} else {
- char ret[40];
- sprintf(ret, "%llu", (my_ulonglong) rc);
- ZVAL_STRING(*retval, ret, 1);
+ CHECK_STATUS(MYSQLI_STATUS_VALID);
+
+ rc = mysql_affected_rows(mysql->mysql);
+
+ if (rc == (my_ulonglong)-1) {
+ ZVAL_LONG(*retval, -1);
+ return SUCCESS;
+ }
+
+ if (rc < LONG_MAX) {
+ ZVAL_LONG(*retval, rc);
+ } else {
+ char ret[40];
+ sprintf(ret, MYSQLI_LLU_SPEC, (my_ulonglong) rc);
+ ZVAL_STRING(*retval, ret, 1);
+ }
}
-
return SUCCESS;
}
/* }}} */
/* link properties */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
/* result properties */
/* {{{ property result_type_read */
@@ -199,7 +205,7 @@ static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
MYSQL_RES *p;
ALLOC_ZVAL(*retval);
- CHECK_OBJECT();
+ CHECK_STATUS(MYSQLI_STATUS_VALID);
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
if (!p) {
@@ -217,15 +223,15 @@ static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
MYSQL_RES *p;
ALLOC_ZVAL(*retval);
- CHECK_OBJECT();
+ CHECK_STATUS(MYSQLI_STATUS_VALID);
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
if (!p || !p->field_count) {
ZVAL_NULL(*retval);
} else {
ulong i;
zval *l;
-
+
array_init(*retval);
for (i=0; i < p->field_count; i++) {
@@ -239,9 +245,9 @@ static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
/* }}} */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong);
/* statement properties */
@@ -251,7 +257,7 @@ static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
MY_STMT *p;
ALLOC_ZVAL(*retval);
- CHECK_OBJECT();
+ CHECK_STATUS(MYSQLI_STATUS_VALID);
p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@@ -267,39 +273,43 @@ static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
/* {{{ property stmt_affected_rows_read */
static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
{
- MY_STMT *stmt;
+ MY_STMT *p;
my_ulonglong rc;
ALLOC_ZVAL(*retval);
- CHECK_OBJECT();
+ CHECK_STATUS(MYSQLI_STATUS_VALID);
- stmt = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- rc = mysql_stmt_affected_rows(stmt->stmt);
+ p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- if (rc == (my_ulonglong)-1) {
- ZVAL_LONG(*retval, -1);
- return SUCCESS;
- }
-
- if (rc < LONG_MAX) {
- ZVAL_LONG(*retval, rc);
+ if (!p) {
+ ZVAL_NULL(*retval);
} else {
- char ret[40];
- sprintf(ret, "%llu", (my_ulonglong) rc);
- ZVAL_STRING(*retval, ret, 1);
+ rc = mysql_stmt_affected_rows(p->stmt);
+
+ if (rc == (my_ulonglong)-1) {
+ ZVAL_LONG(*retval, -1);
+ return SUCCESS;
+ }
+
+ if (rc < LONG_MAX) {
+ ZVAL_LONG(*retval, rc);
+ } else {
+ char ret[40];
+ sprintf(ret, MYSQLI_LLU_SPEC, (my_ulonglong) rc);
+ ZVAL_STRING(*retval, ret, 1);
+ }
}
-
return SUCCESS;
}
/* }}} */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT());
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT());
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
+MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
/* }}} */
mysqli_property_entry mysqli_link_property_entries[] = {
diff --git a/ext/mysqli/mysqli_repl.c b/ext/mysqli/mysqli_repl.c
index 1093ccfab8..b68c4509b0 100644
--- a/ext/mysqli/mysqli_repl.c
+++ b/ext/mysqli/mysqli_repl.c
@@ -39,7 +39,7 @@ PHP_FUNCTION(mysqli_disable_reads_from_master)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
mysql_disable_reads_from_master(mysql);
RETURN_TRUE;
}
@@ -55,7 +55,7 @@ PHP_FUNCTION(mysqli_disable_rpl_parse)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
mysql_disable_rpl_parse(mysql);
RETURN_TRUE;
}
@@ -71,7 +71,7 @@ PHP_FUNCTION(mysqli_enable_reads_from_master)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
mysql_enable_reads_from_master(mysql);
RETURN_TRUE;
@@ -88,7 +88,7 @@ PHP_FUNCTION(mysqli_enable_rpl_parse)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
mysql_enable_rpl_parse(mysql);
RETURN_TRUE;
@@ -106,7 +106,7 @@ PHP_FUNCTION(mysqli_master_query) {
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_master_query(mysql, query, query_len)) {
RETURN_FALSE;
@@ -125,7 +125,7 @@ PHP_FUNCTION(mysqli_rpl_parse_enabled)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_rpl_parse_enabled(mysql));
}
@@ -141,7 +141,7 @@ PHP_FUNCTION(mysqli_rpl_probe)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_rpl_probe(mysql)) {
@@ -163,7 +163,7 @@ PHP_FUNCTION(mysqli_rpl_query_type)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
RETURN_LONG(mysql_rpl_query_type(query, query_len));
}
@@ -181,7 +181,7 @@ PHP_FUNCTION(mysqli_send_query)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_send_query(mysql, query, query_len)) {
RETURN_FALSE;
@@ -202,7 +202,7 @@ PHP_FUNCTION(mysqli_slave_query)
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
return;
}
- MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
if (mysql_slave_query(mysql, query, query_len)) {
RETURN_FALSE;
diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c
index 427822bdc2..f1413d57a2 100644
--- a/ext/mysqli/mysqli_warning.c
+++ b/ext/mysqli/mysqli_warning.c
@@ -100,7 +100,7 @@ PHP_METHOD(mysqli_warning, next)
return;
}
- MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning");
+ MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning", MYSQLI_STATUS_VALID);
if (w->next) {
w = w->next;
@@ -164,7 +164,7 @@ int mysqli_warning_errno(mysqli_object *obj, zval **retval TSRMLS_DC)
/* }}} */
/* {{{ mysqli_warning_construct(object obj) */
-PHP_METHOD(mysqli_warning, __construct)
+PHP_FUNCTION(mysqli_warning_construct)
{
zval *z;
mysqli_object *obj;
@@ -182,11 +182,11 @@ PHP_METHOD(mysqli_warning, __construct)
if (obj->zo.ce == mysqli_link_class_entry) {
MY_MYSQL *mysql;
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &z, "mysqli_link");
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &z, "mysqli_link", MYSQLI_STATUS_VALID);
hdl = mysql->mysql;
} else if (obj->zo.ce == mysqli_stmt_class_entry) {
MY_STMT *stmt;
- MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &z, "mysqli_stmt");
+ MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &z, "mysqli_stmt", MYSQLI_STATUS_VALID);
hdl = stmt->stmt->mysql;
} else {
RETURN_FALSE;
@@ -200,20 +200,20 @@ PHP_METHOD(mysqli_warning, __construct)
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
mysqli_resource->ptr = mysqli_resource->info = (void *)w;
+ mysqli_resource->status = MYSQLI_STATUS_VALID;
if (!getThis() || !instanceof_function(Z_OBJCE_P(getThis()), mysqli_warning_class_entry TSRMLS_CC)) {
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
} else {
((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
- ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
}
}
/* }}} */
zend_function_entry mysqli_warning_methods[] = {
- PHP_ME(mysqli_warning, __construct, NULL, ZEND_ACC_PROTECTED)
- PHP_ME(mysqli_warning, next, NULL, ZEND_ACC_PUBLIC)
+ PHP_FALIAS(mysqli_warning, mysqli_warning_construct, NULL)
+ ZEND_ME(mysqli_warning, next, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h
index 54bddadd52..d908996291 100644
--- a/ext/mysqli/php_mysqli.h
+++ b/ext/mysqli/php_mysqli.h
@@ -43,6 +43,13 @@
#define MYSQLI_VERSION_ID 101008
+enum mysqli_status {
+ MYSQLI_STATUS_UNKNOWN=0,
+ MYSQLI_STATUS_CLEARED,
+ MYSQLI_STATUS_INITIALIZED,
+ MYSQLI_STATUS_VALID
+};
+
typedef struct {
ulong buflen;
char *val;
@@ -64,10 +71,10 @@ typedef struct {
} MY_STMT;
typedef struct {
- MYSQL *mysql;
- zval *li_read;
- php_stream *li_stream;
- unsigned int multi_query;
+ MYSQL *mysql;
+ zval *li_read;
+ php_stream *li_stream;
+ unsigned int multi_query;
} MY_MYSQL;
typedef struct {
@@ -77,14 +84,14 @@ typedef struct {
} PROFILER;
typedef struct {
- void *ptr; /* resource: (mysql, result, stmt) */
- void *info; /* additional buffer */
+ void *ptr; /* resource: (mysql, result, stmt) */
+ void *info; /* additional buffer */
+ enum mysqli_status status; /* object status */
} MYSQLI_RESOURCE;
typedef struct _mysqli_object {
zend_object zo;
void *ptr;
- char valid;
HashTable *prop_handler;
} mysqli_object; /* extends zend_object */
@@ -110,8 +117,16 @@ typedef struct {
#ifdef PHP_WIN32
#define PHP_MYSQLI_API __declspec(dllexport)
+#define MYSQLI_LLU_SPEC "%I64u"
+#define MYSQLI_LL_SPEC "%I64d"
+#define L64(x) x##i64
+typedef __int64 my_longlong;
#else
#define PHP_MYSQLI_API
+#define MYSQLI_LLU_SPEC "%llu"
+#define MYSQLI_LL_SPEC "%lld"
+#define L64(x) x##LL
+typedef long long my_longlong;
#endif
#ifdef ZTS
@@ -149,12 +164,12 @@ extern void php_local_infile_end(void *);
extern int php_local_infile_error(void *, char *, uint);
extern void php_set_local_infile_handler_default(MY_MYSQL *);
extern void php_mysqli_throw_sql_exception(char *sqlstate, int errorno TSRMLS_DC, char *format, ...);
-zend_class_entry *mysqli_link_class_entry;
-zend_class_entry *mysqli_stmt_class_entry;
-zend_class_entry *mysqli_result_class_entry;
-zend_class_entry *mysqli_driver_class_entry;
-zend_class_entry *mysqli_warning_class_entry;
-zend_class_entry *mysqli_exception_class_entry;
+extern zend_class_entry *mysqli_link_class_entry;
+extern zend_class_entry *mysqli_stmt_class_entry;
+extern zend_class_entry *mysqli_result_class_entry;
+extern zend_class_entry *mysqli_driver_class_entry;
+extern zend_class_entry *mysqli_warning_class_entry;
+extern zend_class_entry *mysqli_exception_class_entry;
#ifdef HAVE_SPL
extern PHPAPI zend_class_entry *spl_ce_RuntimeException;
@@ -179,14 +194,13 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
mysqli_entry = zend_register_internal_class(&ce TSRMLS_CC); \
} \
-#define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval, __ce) \
- ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr = __ptr; \
- ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->valid = 1;
+#define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval) \
+ ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr = __ptr;
#define MYSQLI_RETURN_RESOURCE(__ptr, __ce) \
Z_TYPE_P(return_value) = IS_OBJECT; \
(return_value)->value.obj = mysqli_objects_new(__ce TSRMLS_CC); \
- MYSQLI_REGISTER_RESOURCE_EX(__ptr, return_value, __ce)
+ MYSQLI_REGISTER_RESOURCE_EX(__ptr, return_value)
#define MYSQLI_REGISTER_RESOURCE(__ptr, __ce) \
{\
@@ -196,10 +210,10 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
Z_TYPE_P(object) = IS_OBJECT;\
(object)->value.obj = mysqli_objects_new(__ce TSRMLS_CC);\
}\
- MYSQLI_REGISTER_RESOURCE_EX(__ptr, object, __ce)\
+ MYSQLI_REGISTER_RESOURCE_EX(__ptr, object)\
}
-#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name) \
+#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name, __check) \
{ \
MYSQLI_RESOURCE *my_res; \
mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
@@ -207,18 +221,18 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);\
RETURN_NULL();\
}\
- if (!intern->valid) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", intern->zo.ce->name); \
- RETURN_NULL(); \
- } \
__ptr = (__type)my_res->ptr; \
- if (!strcmp((char *)__name, "mysqli_stmt")) {\
- if (!((MY_STMT *)__ptr)->stmt->mysql) {\
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Statement isn't valid anymore");\
- RETURN_NULL();\
- }\
+ if (__check && my_res->status < __check) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid object or resource %s\n", intern->zo.ce->name); \
+ RETURN_NULL();\
}\
-}
+}
+
+#define MYSQLI_SET_STATUS(__id, __value) \
+{ \
+ mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
+ ((MYSQLI_RESOURCE *)intern->ptr)->status = __value; \
+} \
#define MYSQLI_CLEAR_RESOURCE(__id) \
{ \
@@ -411,7 +425,7 @@ PHP_FUNCTION(mysqli_warning_count);
ZEND_FUNCTION(mysqli_stmt_construct);
ZEND_FUNCTION(mysqli_result_construct);
ZEND_FUNCTION(mysqli_driver_construct);
-PHP_METHOD(mysqli_warning, __construct);
+ZEND_FUNCTION(mysqli_warning_construct);
ZEND_BEGIN_MODULE_GLOBALS(mysqli)
long default_link;
diff --git a/ext/mysqli/tests/002.phpt b/ext/mysqli/tests/002.phpt
index fa4e60e185..301af98939 100644
--- a/ext/mysqli/tests/002.phpt
+++ b/ext/mysqli/tests/002.phpt
@@ -8,6 +8,7 @@ mysqli bind_result 1
/*** test mysqli_connect 127.0.0.1 ***/
$link = mysqli_connect($host, $user, $passwd);
+ $link->query("CREATE SCHEMA test");
mysqli_select_db($link, "test");
$rc = mysqli_query($link,"DROP TABLE IF EXISTS test_fetch_null");
diff --git a/ext/mysqli/tests/014.phpt b/ext/mysqli/tests/014.phpt
index 8ed641c1d6..d6591fcab4 100644
--- a/ext/mysqli/tests/014.phpt
+++ b/ext/mysqli/tests/014.phpt
@@ -9,9 +9,9 @@ mysqli autocommit/commit/rollback
$row = mysqli_fetch_row($result);
mysqli_free_result($result);
mysqli_close($link);
-
if ($row[1] == "DISABLED" || $row[1] == "NO") {
printf ("skip innodb support is not installed or enabled.");
+ exit;
}
?>
--FILE--
diff --git a/ext/mysqli/tests/017.phpt b/ext/mysqli/tests/017.phpt
index 54d11ef719..866a118a86 100644
--- a/ext/mysqli/tests/017.phpt
+++ b/ext/mysqli/tests/017.phpt
@@ -12,15 +12,13 @@ mysqli fetch functions
mysqli_select_db($link, "test");
- $stmt = mysqli_prepare($link, "SELECT current_user(), database(), 'foo'");
+ $stmt = mysqli_prepare($link, "SELECT md5('bar'), database(), 'foo'");
mysqli_bind_result($stmt, $c0, $c1, $c2);
mysqli_execute($stmt);
mysqli_fetch($stmt);
mysqli_stmt_close($stmt);
- $c0 = ($c0 == $user . "@" . $host) ? 1 : 0;
-
$test = array($c0, $c1, $c2);
var_dump($test);
@@ -29,7 +27,7 @@ mysqli fetch functions
--EXPECT--
array(3) {
[0]=>
- int(1)
+ string(32) "37b51d194a7513e45b56f6524f2d51f2"
[1]=>
string(4) "test"
[2]=>
diff --git a/ext/mysqli/tests/049.phpt b/ext/mysqli/tests/049.phpt
index 8d16c3d4c7..4bb5bfef45 100644
--- a/ext/mysqli/tests/049.phpt
+++ b/ext/mysqli/tests/049.phpt
@@ -11,14 +11,16 @@ mysql_fetch_row (OO-Style)
$mysql = mysqli_connect($host, $user, $passwd);
$mysql->select_db("test");
- $result = $mysql->query("SELECT CURRENT_USER()");
+ $result = $mysql->query("SELECT DATABASE()");
$row = $result->fetch_row();
$result->close();
- $ok = ($row[0] == $user . "@" . $host);
- var_dump($ok);
+ var_dump($row);
$mysql->close();
?>
--EXPECT--
-bool(true)
+array(1) {
+ [0]=>
+ string(4) "test"
+}
diff --git a/ext/mysqli/tests/bug34810.phpt b/ext/mysqli/tests/bug34810.phpt
index 12d6ce2e9a..0b8a799a84 100644
--- a/ext/mysqli/tests/bug34810.phpt
+++ b/ext/mysqli/tests/bug34810.phpt
@@ -9,15 +9,16 @@ class DbConnection {
public function connect() {
include "connect.inc";
- $link = mysqli::connect($host, $user, $passwd);
+ $link = mysqli_connect($host, $user, $passwd);
var_dump($link);
- $link = mysqli::init();
+ $link = mysqli_init();
var_dump($link);
$mysql = new mysqli($host, $user, $passwd, "test");
$mysql->query("DROP TABLE IF EXISTS test_warnings");
$mysql->query("CREATE TABLE test_warnings (a int not null)");
+ $mysql->query("SET sql_mode=''");
$mysql->query("INSERT INTO test_warnings VALUES (1),(2),(NULL)");
var_dump(mysqli_warning::__construct($mysql));
}