diff --git a/NEWS b/NEWS index 982945e5ebfc..b2b134d8535a 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,8 @@ PHP NEWS - PDO: . Fixed PDOStatement::getColumnMeta() reading out of bounds for an invalid column index. (Ilia Alshanetsky) + . Fixed PDOStatement::bindColumn() registering a binding for a column name + that is not in the result set. (Ilia Alshanetsky) - Readline: . Fixed a heap over-read in the interactive shell prompt when cli.prompt is diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 8612a01e0444..97d1a058fd52 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -311,6 +311,7 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_ spprintf(&tmp, 0, "Did not find column name '%s' in the defined columns; it will not be bound", ZSTR_VAL(param->name)); pdo_raise_impl_error(stmt->dbh, stmt, "HY000", tmp); efree(tmp); + return 0; } } diff --git a/ext/pdo/tests/pdo_bindcolumn_unknown_column.phpt b/ext/pdo/tests/pdo_bindcolumn_unknown_column.phpt new file mode 100644 index 000000000000..44e85ec07c31 --- /dev/null +++ b/ext/pdo/tests/pdo_bindcolumn_unknown_column.phpt @@ -0,0 +1,41 @@ +--TEST-- +PDO: bindColumn() must fail for a column name that is not in the result set +--EXTENSIONS-- +pdo +--SKIPIF-- + +--FILE-- +exec('CREATE TABLE pdo_bindcolumn_unknown_column (name varchar(255))'); + +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); +$stmt = $db->query('SELECT name FROM pdo_bindcolumn_unknown_column'); +var_dump(@$stmt->bindColumn('nosuchcolumn', $var)); + +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +try { + $stmt->bindColumn('nosuchcolumn', $var); +} catch (PDOException $e) { + echo $e::class, ": ", $e->getMessage(), PHP_EOL; +} +?> +--CLEAN-- +exec('DROP TABLE pdo_bindcolumn_unknown_column'); +?> +--EXPECT-- +bool(false) +PDOException: SQLSTATE[HY000]: General error: Did not find column name 'nosuchcolumn' in the defined columns; it will not be bound