diff options
Diffstat (limited to 'ext/pdo')
| -rw-r--r-- | ext/pdo/pdo_dbh.c | 2 | ||||
| -rw-r--r-- | ext/pdo/pdo_stmt.c | 25 | ||||
| -rw-r--r-- | ext/pdo/tests/bug_39656.phpt | 2 |
3 files changed, 20 insertions, 9 deletions
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index aca52ebf20..8e35c1ee9a 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -472,7 +472,7 @@ static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt } /* }}} */ -/* {{{ proto object PDO::prepare(string statment [, array options]) +/* {{{ proto object PDO::prepare(string statement [, array options]) Prepares a statement for execution and returns a statement object */ static PHP_METHOD(PDO, prepare) { diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 705d08bacf..27cc157ed7 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2016,7 +2016,7 @@ static PHP_METHOD(PDOStatement, setFetchMode) /* }}} */ /* {{{ proto bool PDOStatement::nextRowset() - Advances to the next rowset in a multi-rowset statement handle. Returns true if it succeded, false otherwise */ + Advances to the next rowset in a multi-rowset statement handle. Returns true if it succeeded, false otherwise */ static int pdo_stmt_do_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) { @@ -2486,6 +2486,7 @@ static zval *row_prop_read(zval *object, zval *member, int type, void **cache_sl pdo_stmt_t *stmt = row->stmt; int colno = -1; zval zobj; + zend_long lval; ZVAL_NULL(rv); if (stmt) { @@ -2493,6 +2494,11 @@ static zval *row_prop_read(zval *object, zval *member, int type, void **cache_sl if (Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count) { fetch_value(stmt, rv, Z_LVAL_P(member), NULL TSRMLS_CC); } + } else if (Z_TYPE_P(member) == IS_STRING + && is_numeric_string_ex(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0, NULL) == IS_LONG) { + if (lval >= 0 && lval < stmt->column_count) { + fetch_value(stmt, rv, lval, NULL TSRMLS_CC); + } } else { convert_to_string(member); /* TODO: replace this with a hash of available column names to column @@ -2541,19 +2547,24 @@ static int row_prop_exists(zval *object, zval *member, int check_empty, void **c pdo_row_t *row = (pdo_row_t *)Z_OBJ_P(object); pdo_stmt_t *stmt = row->stmt; int colno = -1; + zend_long lval; if (stmt) { if (Z_TYPE_P(member) == IS_LONG) { return Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count; + } else if (Z_TYPE_P(member) == IS_STRING) { + if (is_numeric_string_ex(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0, NULL) == IS_LONG) { + return lval >=0 && lval < stmt->column_count; + } } else { convert_to_string(member); + } - /* TODO: replace this with a hash of available column names to column - * numbers */ - for (colno = 0; colno < stmt->column_count; colno++) { - if (strcmp(stmt->columns[colno].name, Z_STRVAL_P(member)) == 0) { - return 1; - } + /* TODO: replace this with a hash of available column names to column + * numbers */ + for (colno = 0; colno < stmt->column_count; colno++) { + if (strcmp(stmt->columns[colno].name, Z_STRVAL_P(member)) == 0) { + return 1; } } } diff --git a/ext/pdo/tests/bug_39656.phpt b/ext/pdo/tests/bug_39656.phpt index 7d113ef4aa..9ee54916bb 100644 --- a/ext/pdo/tests/bug_39656.phpt +++ b/ext/pdo/tests/bug_39656.phpt @@ -1,5 +1,5 @@ --TEST-- -PDO Common: Bug #39656 (Crash when calling fetch() on a PDO statment object after closeCursor()) +PDO Common: Bug #39656 (Crash when calling fetch() on a PDO statement object after closeCursor()) --SKIPIF-- <?php if (!extension_loaded('pdo')) die('skip'); |
