Skip to content

ext/pdo: Throw a ValueError from bindColumn() for an unknown column - #23835

Merged
iliaal merged 1 commit into
php:masterfrom
iliaal:pdo-bindcolumn-valueerror
Sep 29, 2026
Merged

iliaal merged 1 commit into
php:masterfrom
iliaal:pdo-bindcolumn-valueerror

Conversation

@iliaal

@iliaal iliaal commented Sep 22, 2026

Copy link
Copy Markdown
Member

Follow-up to #23799, where kamil-tekiela asked for a ValueError here. A column name that is not in the result set is a programming error, so bindColumn() now throws instead of reporting through PDO::ATTR_ERRMODE and returning false, matching how the same argument already rejects an empty name or an index below one.

bindParam() and bindValue() keep their ERRMODE error. The equivalent site in rewrite_name_to_position() is reachable only after execute() has populated bound_param_map, so the bind methods never get there; instrumenting it across ext/pdo, ext/pdo_mysql and ext/pdo_sqlite showed every hit coming from execute(). Converting it would change execute(), which is a separate decision.

iliaal added a commit to iliaal/php-src that referenced this pull request Sep 22, 2026
A column name that is not in the result set is a programming error, so
report it the way the method already reports an empty name or an index
below one, rather than through PDO::ATTR_ERRMODE. The equivalent parameter
failure in bindParam() and bindValue() stays an ERRMODE error: its site in
rewrite_name_to_position() is only reachable once execute() has populated
bound_param_map, never from the bind methods themselves.

Closes phpGH-23835
@iliaal
iliaal force-pushed the pdo-bindcolumn-valueerror branch from 6e43946 to 67cfe51 Compare September 22, 2026 02:14
@NickSdot

NickSdot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Maybe having the wrong column name in the message as before is quite helpful?

iliaal added a commit to iliaal/php-src that referenced this pull request Sep 22, 2026
A column name that is not in the result set is a programming error, so
report it the way the method already reports an empty name or an index
below one, rather than through PDO::ATTR_ERRMODE. The equivalent parameter
failure in bindParam() and bindValue() stays an ERRMODE error: its site in
rewrite_name_to_position() is only reachable once execute() has populated
bound_param_map, never from the bind methods themselves.

Closes phpGH-23835
@iliaal
iliaal force-pushed the pdo-bindcolumn-valueerror branch from 67cfe51 to 67af1dd Compare September 22, 2026 12:19
@iliaal

iliaal commented Sep 22, 2026

Copy link
Copy Markdown
Member Author

Ah, indeed. The message now carries it: Argument #1 ($column) must refer to a column present in the result set, "nosuchcolumn" given.

@SakiTakamachi SakiTakamachi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

A column name that is not in the result set is a programming error, so
report it the way the method already reports an empty name or an index
below one, rather than through PDO::ATTR_ERRMODE. The equivalent parameter
failure in bindParam() and bindValue() stays an ERRMODE error: its site in
rewrite_name_to_position() is only reachable once execute() has populated
bound_param_map, never from the bind methods themselves.

Closes phpGH-23835
@iliaal
iliaal force-pushed the pdo-bindcolumn-valueerror branch from 67af1dd to 65b257d Compare September 29, 2026 15:36
@iliaal
iliaal merged commit 7f1e8cb into php:master Sep 29, 2026
15 of 18 checks passed
bukka added a commit to bukka/php-src that referenced this pull request Sep 29, 2026
* upstream/master: (99 commits)
  NEWS
  Fix property hook escape analysis causing misoptimization
  Fix __isset escape analysis causing misoptimization
  Fix memory leak when closing a statement on a killed connection
  Reset field_count for OK packet (php#23890)
  Fix phpGH-23986: Clear the realpath cache in the child after pcntl_fork() (php#23987)
  ext/standard: Remove redundant if-branch in rot13 (php#23795)
  ext/pdo: Throw a ValueError from bindColumn() for an unknown column (php#23835)
  Zend: rename zend_object* parameter to "this_ptr" for zend_call_* functions (php#23989)
  ext/pdo: Release driver options after bindParam and bindColumn
  tests: Raise test stack for stream error depth limit under MSan (php#23985)
  Zend: Remove zend_atomic.[ch] abstraction (php#23927)
  fibers: fix phpGH-23921 (Fibers start with error_reporting = 0 when the error_reporting INI directive is not set)
  ext/pdo: Keep statement class when ATTR_STATEMENT_CLASS is rejected
  Verify bundled sources using CI - Opcache JIT IR (php#20179)
  zend_portability: Simplify definition of `ZEND_NORETURN` (php#23908)
  Fix phpGH-23758: PDO_Firebird returns null for empty BLOBs (php#23763)
  Remove redundant parentheses in session tests (php#23609)
  Update IR (php#23861)
  Fix OSS-Fuzz #552682112: assertion failure wrt zp_arg_must_be_sent_by_ref() (php#23760)
  ...

# Conflicts:
#	ext/openssl/xp_ssl.c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants