Skip to content

Commit c1f0fd3

Browse files
committed
Mysqli: bind-in-execute (mysqlnd)
1 parent 1079622 commit c1f0fd3

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

ext/mysqli/mysqli_api.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,15 +817,44 @@ PHP_FUNCTION(mysqli_stmt_execute)
817817
{
818818
MY_STMT *stmt;
819819
zval *mysql_stmt;
820+
zval *input_params = NULL;
820821
#ifndef MYSQLI_USE_MYSQLND
821822
unsigned int i;
822823
#endif
823824

824-
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
825+
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|a", &mysql_stmt, mysqli_stmt_class_entry, &input_params) == FAILURE) {
825826
RETURN_THROWS();
826827
}
827828
MYSQLI_FETCH_RESOURCE_STMT(stmt, mysql_stmt, MYSQLI_STATUS_VALID);
828829

830+
// bind-in-execute
831+
#if defined(MYSQLI_USE_MYSQLND)
832+
if(input_params) {
833+
zval *tmp;
834+
zend_ulong num_index;
835+
unsigned int index;
836+
MYSQLND_PARAM_BIND *params;
837+
838+
params = mysqlnd_stmt_alloc_param_bind(stmt->stmt);
839+
if (!params) {
840+
// can we safely return here?
841+
RETVAL_FALSE;
842+
}
843+
844+
index = 0;
845+
ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(input_params), num_index, tmp) {
846+
ZVAL_COPY_VALUE(&params[index].zv, tmp);
847+
params[index].type = MYSQL_TYPE_VAR_STRING;
848+
index++;
849+
} ZEND_HASH_FOREACH_END();
850+
851+
if(mysqlnd_stmt_bind_param(stmt->stmt, params)) {
852+
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
853+
RETVAL_FALSE;
854+
}
855+
}
856+
#endif
857+
829858
#ifndef MYSQLI_USE_MYSQLND
830859
if (stmt->param.var_cnt) {
831860
int j;

0 commit comments

Comments
 (0)