static int really_register_bound_param(struct pdo_bound_param_data *param, pdo_stmt_t *stmt, int is_param TSRMLS_DC) /* {{{ */
{
HashTable *hash;
+ zval *parameter;
struct pdo_bound_param_data *pparam = NULL;
hash = is_param ? stmt->bound_params : stmt->bound_columns;
}
}
- if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && !ZVAL_IS_NULL(¶m->parameter)) {
- if (Z_TYPE(param->parameter) == IS_DOUBLE) {
+ if (!Z_ISREF(param->parameter)) {
+ parameter = ¶m->parameter;
+ } else {
+ parameter = Z_REFVAL(param->parameter);
+ }
+
+ if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && !ZVAL_IS_NULL(¶meter)) {
+ if (Z_TYPE_P(parameter) == IS_DOUBLE) {
char *p;
- int len = spprintf(&p, 0, "%.*H", (int) EG(precision), Z_DVAL(param->parameter));
- ZVAL_STRINGL(¶m->parameter, p, len);
+ int len = spprintf(&p, 0, "%.*H", (int) EG(precision), Z_DVAL_P(parameter));
+ ZVAL_STRINGL(parameter, p, len);
efree(p);
} else {
- convert_to_string(¶m->parameter);
+ convert_to_string(parameter);
}
- } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE(param->parameter) == IS_BOOL) {
- convert_to_long(¶m->parameter);
- } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE(param->parameter) == IS_LONG) {
- convert_to_boolean(¶m->parameter);
+ } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(parameter) == IS_BOOL) {
+ convert_to_long(parameter);
+ } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(parameter) == IS_LONG) {
+ convert_to_boolean(parameter);
}
param->stmt = stmt;
ZEND_HASH_FOREACH_PTR(stmt->bound_columns, param) {
if (param->paramno >= 0) {
- convert_to_string(¶m->parameter);
+ if (!Z_ISREF(param->parameter)) {
+ continue;
+ }
+ // ???? convert_to_string(¶m->parameter);
/* delete old value */
- zval_ptr_dtor(¶m->parameter);
+ zval_dtor(Z_REFVAL(param->parameter));
/* set new value */
- fetch_value(stmt, ¶m->parameter, param->paramno, (int *)¶m->param_type TSRMLS_CC);
+ fetch_value(stmt, Z_REFVAL(param->parameter), param->paramno, (int *)¶m->param_type TSRMLS_CC);
/* TODO: some smart thing that avoids duplicating the value in the
* general loop below. For now, if you're binding output columns,
static PHP_METHOD(PDOStatement, bindColumn)
{
PHP_STMT_GET_OBJ;
- RETURN_BOOL(register_bound_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, stmt, FALSE));
+ RETURN_BOOL(register_bound_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, stmt, 0));
}
/* }}} */