summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/mysqli/mysqli.c6
-rw-r--r--ext/mysqli/mysqli_api.c23
-rw-r--r--ext/mysqli/mysqli_prop.c2
-rw-r--r--ext/mysqli/mysqli_report.c2
-rw-r--r--ext/mysqli/php_mysqli.h2
5 files changed, 31 insertions, 4 deletions
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
index b2d71457a2..e8b1a9d9c8 100644
--- a/ext/mysqli/mysqli.c
+++ b/ext/mysqli/mysqli.c
@@ -64,11 +64,14 @@ void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
}
for (i=0; i < bbuf.var_cnt; i++) {
+
+ /* free temporary bind buffer */
if (type == FETCH_RESULT) {
if (bbuf.buf[i].type == IS_STRING) {
efree(bbuf.buf[i].val);
}
}
+
if (bbuf.vars[i]) {
zval_ptr_dtor(&bbuf.vars[i]);
}
@@ -96,6 +99,9 @@ void php_clear_stmt_bind(STMT *stmt)
php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
+ if (stmt->query) {
+ efree(stmt->query);
+ }
efree(stmt);
return;
}
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
index 6a25920f93..d3ad49837a 100644
--- a/ext/mysqli/mysqli_api.c
+++ b/ext/mysqli/mysqli_api.c
@@ -578,7 +578,7 @@ PHP_FUNCTION(mysqli_stmt_execute)
RETURN_FALSE;
}
if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
- php_mysqli_report_index(stmt->stmt->query, stmt->stmt->mysql->server_status TSRMLS_CC);
+ php_mysqli_report_index(stmt->query, stmt->stmt->mysql->server_status TSRMLS_CC);
}
RETURN_TRUE;
@@ -1225,6 +1225,8 @@ PHP_FUNCTION(mysqli_prepare)
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);
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
}
/* }}} */
@@ -1502,6 +1504,25 @@ PHP_FUNCTION(mysqli_stmt_free_result)
return;
}
/* }}} */
+
+/* {{{ proto void mysqli_stmt_reset(object stmt)
+ reset a prepared statement */
+PHP_FUNCTION(mysqli_stmt_reset)
+{
+ STMT *stmt;
+ zval *mysql_stmt;
+
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+ return;
+ }
+
+ MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt");
+
+ mysql_stmt_reset(stmt->stmt);
+
+ return;
+}
+/* }}} */
#endif
/* {{{ proto mixed mysqli_stmt_num_rows(object stmt)
diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c
index 18587f8937..7e230c257b 100644
--- a/ext/mysqli/mysqli_prop.c
+++ b/ext/mysqli/mysqli_prop.c
@@ -189,7 +189,6 @@ MYSQLI_MAP_PROPERTY_LONG_LONG(stmt_affected_rows_read, STMT, stmt->mysql->last_u
MYSQLI_MAP_PROPERTY_LONG_LONG(stmt_affected_rows_read, STMT, stmt->affected_rows);
#endif
MYSQLI_MAP_PROPERTY_LONG_LONG(stmt_num_rows_read, STMT, stmt->result->row_count);
-MYSQLI_MAP_PROPERTY_STRING(stmt_query_read, STMT, stmt->query);
MYSQLI_MAP_PROPERTY_LONG(stmt_param_count_read, STMT, stmt->param_count);
MYSQLI_MAP_PROPERTY_LONG(stmt_field_count_read, STMT, stmt->field_count);
MYSQLI_MAP_PROPERTY_LONG(stmt_id_read, STMT, stmt->stmt_id);
@@ -236,7 +235,6 @@ mysqli_property_entry mysqli_result_property_entries[] = {
mysqli_property_entry mysqli_stmt_property_entries[] = {
{"affected_rows", stmt_affected_rows_read, NULL},
{"num_rows", stmt_num_rows_read, NULL},
- {"query", stmt_query_read, NULL},
{"param_count", stmt_param_count_read, NULL},
{"field_count", stmt_field_count_read, NULL},
{"id", stmt_id_read, NULL},
diff --git a/ext/mysqli/mysqli_report.c b/ext/mysqli/mysqli_report.c
index c344fad434..ac7725f92a 100644
--- a/ext/mysqli/mysqli_report.c
+++ b/ext/mysqli/mysqli_report.c
@@ -62,7 +62,7 @@ void php_mysqli_report_index(char *query, unsigned int status TSRMLS_DC) {
} else {
return;
}
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s used in query %s", index, query);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s used in query/prepared statement %s", index, query);
#else
return;
#endif
diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h
index a19c51eaa1..87d2851aec 100644
--- a/ext/mysqli/php_mysqli.h
+++ b/ext/mysqli/php_mysqli.h
@@ -47,6 +47,7 @@ typedef struct {
MYSQL_STMT *stmt;
BIND_BUFFER param;
BIND_BUFFER result;
+ char *query;
} STMT;
typedef struct {
@@ -349,6 +350,7 @@ PHP_FUNCTION(mysqli_stmt_errno);
PHP_FUNCTION(mysqli_stmt_error);
#ifndef HAVE_MYSQLI_OLDAPI
PHP_FUNCTION(mysqli_stmt_free_result);
+PHP_FUNCTION(mysqli_stmt_reset);
#endif
PHP_FUNCTION(mysqli_stmt_num_rows);
#if MYSQL_VERSION_ID >= 40101