diff options
author | Xinchen Hui <laruence@php.net> | 2014-05-08 16:11:50 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2014-05-08 16:11:50 +0800 |
commit | be79628b8747ea1311964d9834d99c06abe76278 (patch) | |
tree | bc8402b38592c063555cb2482d1a98c8211ac757 /ext/pdo/pdo_sql_parser.c | |
parent | c242518bf0d2c3132c60c8f8dfba64329f73e90e (diff) | |
download | php-git-be79628b8747ea1311964d9834d99c06abe76278.tar.gz |
Fixed REFERENCE handling
Diffstat (limited to 'ext/pdo/pdo_sql_parser.c')
-rw-r--r-- | ext/pdo/pdo_sql_parser.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 50b2b5d6ec..cf108991e5 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -527,7 +527,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) { int ok = 1; for (plc = placeholders; plc; plc = plc->next) { - if ((params = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { + if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { ok = 0; break; } @@ -561,10 +561,16 @@ safe: goto clean_up; } if (stmt->dbh->methods->quoter) { - if (param->param_type == PDO_PARAM_LOB && Z_TYPE(param->parameter) == IS_RESOURCE) { + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) { php_stream *stm; - php_stream_from_zval_no_verify(stm, ¶m->parameter); + php_stream_from_zval_no_verify(stm, parameter); if (stm) { zend_string *buf; @@ -590,7 +596,7 @@ safe: plc->freeq = 1; } else { zval tmp_param; - ZVAL_DUP(&tmp_param, ¶m->parameter); + ZVAL_DUP(&tmp_param, parameter); switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; @@ -625,8 +631,14 @@ safe: zval_dtor(&tmp_param); } } else { - plc->quoted = Z_STRVAL(param->parameter); - plc->qlen = Z_STRLEN(param->parameter); + zval *parameter; + if (Z_ISREF(param->parameter)) { + parameter = Z_REFVAL(param->parameter); + } else { + parameter = ¶m->parameter; + } + plc->quoted = Z_STRVAL_P(parameter); + plc->qlen = Z_STRLEN_P(parameter); } newbuffer_len += plc->qlen; } |