@@ -176,8 +176,7 @@ PHP_FUNCTION(mysqli_autocommit)
176
176
/* {{{ mysqli_stmt_bind_param_do_bind */
177
177
#ifndef MYSQLI_USE_MYSQLND
178
178
static
179
- int mysqli_stmt_bind_param_do_bind (MY_STMT * stmt , unsigned int argc , unsigned int num_vars ,
180
- zval * args , unsigned int start , const char * const types )
179
+ int mysqli_stmt_bind_param_do_bind (MY_STMT * stmt , unsigned int num_vars , zval * args , const char * const types , unsigned int num_extra_args )
181
180
{
182
181
int i , ofs ;
183
182
MYSQL_BIND * bind ;
@@ -192,7 +191,7 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
192
191
bind = (MYSQL_BIND * ) ecalloc (num_vars , sizeof (MYSQL_BIND ));
193
192
194
193
ofs = 0 ;
195
- for (i = start ; i < argc ; i ++ ) {
194
+ for (i = 0 ; i < num_vars ; i ++ ) {
196
195
zval * param ;
197
196
if (Z_ISREF (args [i ])) {
198
197
param = Z_REFVAL (args [i ]);
@@ -229,7 +228,7 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
229
228
break ;
230
229
231
230
default :
232
- php_error_docref (NULL , E_WARNING , "Undefined fieldtype %c (parameter %d)" , types [ofs ], i + 1 );
231
+ php_error_docref (NULL , E_WARNING , "Undefined fieldtype %c (parameter %d)" , types [ofs ], i + num_extra_args + 1 );
233
232
rc = 1 ;
234
233
goto end_1 ;
235
234
}
@@ -245,7 +244,7 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
245
244
stmt -> param .vars = safe_emalloc (num_vars , sizeof (zval ), 0 );
246
245
for (i = 0 ; i < num_vars ; i ++ ) {
247
246
if (bind [i ].buffer_type != MYSQL_TYPE_LONG_BLOB ) {
248
- ZVAL_COPY (& stmt -> param .vars [i ], & args [i + start ]);
247
+ ZVAL_COPY (& stmt -> param .vars [i ], & args [i ]);
249
248
} else {
250
249
ZVAL_UNDEF (& stmt -> param .vars [i ]);
251
250
}
@@ -257,22 +256,21 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
257
256
}
258
257
#else
259
258
static
260
- int mysqli_stmt_bind_param_do_bind (MY_STMT * stmt , unsigned int argc , unsigned int num_vars ,
261
- zval * args , unsigned int start , const char * const types )
259
+ int mysqli_stmt_bind_param_do_bind (MY_STMT * stmt , unsigned int num_vars , zval * args , const char * const types , unsigned int num_extra_args )
262
260
{
263
261
unsigned int i ;
264
262
MYSQLND_PARAM_BIND * params ;
265
263
enum_func_status ret = FAIL ;
266
264
267
265
/* If no params -> skip binding and return directly */
268
- if (argc == start ) {
266
+ if (num_vars == 0 ) {
269
267
return PASS ;
270
268
}
271
269
params = mysqlnd_stmt_alloc_param_bind (stmt -> stmt );
272
270
if (!params ) {
273
271
goto end ;
274
272
}
275
- for (i = 0 ; i < ( argc - start ) ; i ++ ) {
273
+ for (i = 0 ; i < num_vars ; i ++ ) {
276
274
zend_uchar type ;
277
275
switch (types [i ]) {
278
276
case 'd' : /* Double */
@@ -293,12 +291,12 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
293
291
break ;
294
292
default :
295
293
/* We count parameters from 1 */
296
- php_error_docref (NULL , E_WARNING , "Undefined fieldtype %c (parameter %d)" , types [i ], i + start + 1 );
294
+ php_error_docref (NULL , E_WARNING , "Undefined fieldtype %c (parameter %d)" , types [i ], i + num_extra_args + 1 );
297
295
ret = FAIL ;
298
296
mysqlnd_stmt_free_param_bind (stmt -> stmt , params );
299
297
goto end ;
300
298
}
301
- ZVAL_COPY_VALUE (& params [i ].zv , & args [i + start ]);
299
+ ZVAL_COPY_VALUE (& params [i ].zv , & args [i ]);
302
300
params [i ].type = type ;
303
301
}
304
302
ret = mysqlnd_stmt_bind_param (stmt -> stmt , params );
@@ -313,41 +311,24 @@ int mysqli_stmt_bind_param_do_bind(MY_STMT *stmt, unsigned int argc, unsigned in
313
311
PHP_FUNCTION (mysqli_stmt_bind_param )
314
312
{
315
313
zval * args ;
316
- int argc = ZEND_NUM_ARGS ();
317
- int num_vars ;
318
- int start = 2 ;
314
+ int argc ;
319
315
MY_STMT * stmt ;
320
316
zval * mysql_stmt ;
321
317
char * types ;
322
318
size_t types_len ;
323
- zend_ulong rc ;
324
319
325
- /* calculate and check number of parameters */
326
- if (argc < 2 ) {
327
- /* there has to be at least one pair */
328
- WRONG_PARAM_COUNT ;
329
- }
330
-
331
- if (zend_parse_method_parameters ((getThis ()) ? 1 :2 , getThis (), "Os" , & mysql_stmt , mysqli_stmt_class_entry ,
332
- & types , & types_len ) == FAILURE ) {
320
+ if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (), "Os*" , & mysql_stmt , mysqli_stmt_class_entry , & types , & types_len , & args , & argc ) == FAILURE ) {
333
321
RETURN_THROWS ();
334
322
}
335
323
336
324
MYSQLI_FETCH_RESOURCE_STMT (stmt , mysql_stmt , MYSQLI_STATUS_VALID );
337
325
338
- num_vars = argc - 1 ;
339
- if (getThis ()) {
340
- start = 1 ;
341
- } else {
342
- /* ignore handle parameter in procedural interface*/
343
- -- num_vars ;
344
- }
345
326
if (!types_len ) {
346
327
php_error_docref (NULL , E_WARNING , "Invalid type or no types specified" );
347
328
RETURN_FALSE ;
348
329
}
349
330
350
- if (types_len != (size_t )( argc - start ) ) {
331
+ if (types_len != (size_t ) argc ) {
351
332
/* number of bind variables doesn't match number of elements in type definition string */
352
333
php_error_docref (NULL , E_WARNING , "Number of elements in type definition string doesn't match number of bind variables" );
353
334
RETURN_FALSE ;
@@ -358,19 +339,8 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
358
339
RETURN_FALSE ;
359
340
}
360
341
361
- args = safe_emalloc (argc , sizeof (zval ), 0 );
362
-
363
- if (zend_get_parameters_array_ex (argc , args ) == FAILURE ) {
364
- zend_wrong_param_count ();
365
- rc = 1 ;
366
- } else {
367
- rc = mysqli_stmt_bind_param_do_bind (stmt , argc , num_vars , args , start , types );
368
- MYSQLI_REPORT_STMT_ERROR (stmt -> stmt );
369
- }
370
-
371
- efree (args );
372
-
373
- RETURN_BOOL (!rc );
342
+ RETVAL_BOOL (!mysqli_stmt_bind_param_do_bind (stmt , argc , args , types , getThis () ? 1 : 2 ));
343
+ MYSQLI_REPORT_STMT_ERROR (stmt -> stmt );
374
344
}
375
345
/* }}} */
376
346
0 commit comments