wez Thu Nov 24 19:29:06 2005 EDT
Modified files: (Branch: PHP_5_1)
/php-src/ext/pdo pdo_stmt.c
Log:
Fix for #35332.
The problem is caused by the user mixing positional and named parameters.
PDO was blindly adding the parameters, unaware that the same parameters were
already allocated by position.
What we do now is register the parameter with the driver before adding it to
any hash. This gives the driver an opportunity to normalize the name and
parameter number. PDO can then ensure that only one entry is occupied in the
hash for a given parameter.
http://cvs.php.net/diff.php/php-src/ext/pdo/pdo_stmt.c?r1=1.118.2.18&r2=1.118.2.19&ty=u
Index: php-src/ext/pdo/pdo_stmt.c
diff -u php-src/ext/pdo/pdo_stmt.c:1.118.2.18
php-src/ext/pdo/pdo_stmt.c:1.118.2.19
--- php-src/ext/pdo/pdo_stmt.c:1.118.2.18 Thu Nov 24 11:21:41 2005
+++ php-src/ext/pdo/pdo_stmt.c Thu Nov 24 19:29:04 2005
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: pdo_stmt.c,v 1.118.2.18 2005/11/24 16:21:41 iliaa Exp $ */
+/* $Id: pdo_stmt.c,v 1.118.2.19 2005/11/25 00:29:04 wez Exp $ */
/* The PDO Statement Handle Class */
@@ -288,7 +288,7 @@
ZVAL_ADDREF(param->driver_params);
}
- if (param->name && stmt->columns) {
+ if (!is_param && param->name && stmt->columns) {
/* try to map the name to the column */
int i;
@@ -299,13 +299,15 @@
}
}
-#if 0
/* if you prepare and then execute passing an array of params
keyed by names,
* then this will trigger, and we don't want that */
if (param->paramno == -1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Did not
found column name '%s' in the defined columns; it will not be bound",
param->name);
}
-#endif
+ }
+
+ if (is_param && !rewrite_name_to_position(stmt, param TSRMLS_CC)) {
+ return 0;
}
if (param->name) {
@@ -317,30 +319,26 @@
} else {
param->name = estrndup(param->name, param->namelen);
}
- zend_hash_update(hash, param->name, param->namelen, param,
sizeof(*param), (void**)&pparam);
- } else {
- zend_hash_index_update(hash, param->paramno, param,
sizeof(*param), (void**)&pparam);
- }
-
- if (is_param && !rewrite_name_to_position(stmt, pparam TSRMLS_CC)) {
- return 0;
}
/* tell the driver we just created a parameter */
if (stmt->methods->param_hook) {
- if (!stmt->methods->param_hook(stmt, pparam,
+ if (!stmt->methods->param_hook(stmt, param,
PDO_PARAM_EVT_ALLOC TSRMLS_CC)) {
- /* driver indicates that the parameter doesn't exist.
- * remove it from our hash */
- if (pparam->name) {
- zend_hash_del(hash, pparam->name,
pparam->namelen);
- } else {
- zend_hash_index_del(hash, pparam->paramno);
- }
return 0;
}
}
+ if (param->paramno >= 0) {
+ zend_hash_index_del(hash, param->paramno);
+ }
+
+ if (param->name) {
+ zend_hash_update(hash, param->name, param->namelen, param,
sizeof(*param), (void**)&pparam);
+ } else {
+ zend_hash_index_update(hash, param->paramno, param,
sizeof(*param), (void**)&pparam);
+ }
+
return 1;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php