[php-src] Issue #12603: [PDO] PDO::PARAM_XXX behavior is inconsistent

From: Date: Fri, 03 Nov 2023 10:49:29 +0000
Subject: [php-src] Issue #12603: [PDO] PDO::PARAM_XXX behavior is inconsistent
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-245730@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/12603 Author: SakiTakamachi ### Description This is a problem I found while investigating #12581 The behavior when using PDO::PARAM_XXX differs depending on the driver, and also depends on the combination of parameter type and specified type. The behavior also differs depending on whether you are in emulation mode or not. The survey results are described below. I've decided that it's a bug, so I'm posting it as an issue, but if the mailing list is more appropriate, please let me know. notes: It seems that pdo_odbc does not support emulation mode. ## unspecified or PARAM_STR | DB | EMULATE | $val = null | $val = 8 | $val = '10' | $val = 'str' | $val = false | ----|----|----|----|----|----|---- | pdo_mysql | 1 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_mysql | 0 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_pgsql | 1 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_pgsql | 0 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_sqlite | 1 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_sqlite | 0 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_odbc | 1 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_odbc | 0 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | ## PARAM_INT | DB | EMULATE | $val = null | $val = 8 | $val = '10' | $val = 'str' | $val = false | ----|----|----|----|----|----|---- | pdo_mysql | 1 | NULL | int(8) | int(10) | int(0) | int(0) | | pdo_mysql | 0 | NULL | int(8) | string(2) "10" | string(3) "str" | int(0) | | pdo_pgsql | 1 | NULL | int(8) | int(10) | int(0) | int(0) | | pdo_pgsql | 0 | NULL | string(1) "8" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_sqlite | 1 | NULL | int(8) | int(10) | int(0) | int(0) | | pdo_sqlite | 0 | NULL | int(8) | int(10) | int(0) | int(0) | | pdo_odbc | 1 | NULL | error [*1] | error [*1] | error [*1] | error [*1] | | pdo_odbc | 0 | NULL | error [*1] | error [*1] | error [*1] | error [*1] | [*1] SQLSTATE[HY090]: Invalid string or buffer length: [FreeTDS][SQL Server]Invalid string or buffer length (SQLExecute[0] at /php-src/ext/pdo_odbc/odbc_stmt.c:263) // my env ## PARAM_BOOL | DB | EMULATE | $val = null | $val = 8 | $val = '10' | $val = 'str' | $val = false | ----|----|----|----|----|----|---- | pdo_mysql | 1 | NULL | int(1) | int(1) | int(1) | int(0) | | pdo_mysql | 0 | NULL | int(1) | string(2) "10" | string(3) "str" | int(0) | | pdo_pgsql | 1 | string(1) "f" | string(1) "t" | string(1) "t" | string(1) "t" | string(1) "f" | | pdo_pgsql | 0 | NULL | string(1) "t" | string(2) "10" | string(3) "str" | string(1) "f" | | pdo_sqlite | 1 | NULL | int(1) | int(10) | int(0) | int(0) | | pdo_sqlite | 0 | NULL | int(1) | int(10) | int(0) | int(0) | | pdo_odbc | 1 | NULL | string(1) "1" | string(2) "10" | string(3) "str" | string(0) "" | | pdo_odbc | 0 | NULL | string(1) "1" | string(2) "10" | string(3) "str" | string(0) "" | ## PARAM_NULL | DB | EMULATE | $val = null | $val = 8 | $val = '10' | $val = 'str' | $val = false | ----|----|----|----|----|----|---- | pdo_mysql | 1 | NULL | NULL | NULL | NULL | NULL | | pdo_mysql | 0 | NULL | NULL | NULL | NULL | NULL | | pdo_pgsql | 1 | NULL | NULL | NULL | NULL | NULL | | pdo_pgsql | 0 | NULL | NULL | NULL | NULL | NULL | | pdo_sqlite | 1 | NULL | NULL | NULL | NULL | NULL | | pdo_sqlite | 0 | NULL | NULL | NULL | NULL | NULL | | pdo_odbc | 1 | NULL | NULL | NULL | NULL | NULL | | pdo_odbc | 0 | NULL | NULL | NULL | NULL | NULL | -------- I would like to make the behavior consistent, but what do you think of the following rules? 1. (Highest priority) If the parameter or type specification is NULL, pass NULL 2. (Otherwise) Pass the value by casting to the specified type ....What is this argument for in the first place? Regards. ### PHP Version any ### Operating System any

« previous php.bugs (#245730) next »