diff --git a/NEWS b/NEWS index d5cc6b6bfe0..88b961a8ce1 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,9 @@ PHP NEWS . Fixed bug #81015 (Opcache optimization assumes wrong part of ternary operator in if-condition). (Nikita) +- PDO_ODBC: + . Fixed bug #44643 (bound parameters ignore explicit type definitions). (cmb) + - PDO_pgsql: . Reverted bug fix for #80892 (PDO::PARAM_INT is treated the same as PDO::PARAM_STR). (Matteo) diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c index db15ab1bf35..c5c3fd79d17 100644 --- a/ext/pdo_odbc/odbc_stmt.c +++ b/ext/pdo_odbc/odbc_stmt.c @@ -321,9 +321,16 @@ static int odbc_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *p if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { /* MS Access, for instance, doesn't support SQLDescribeParam, * so we need to guess */ - sqltype = PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB ? - SQL_LONGVARBINARY : - SQL_LONGVARCHAR; + switch (PDO_PARAM_TYPE(param->param_type)) { + case PDO_PARAM_INT: + sqltype = SQL_INTEGER; + break; + case PDO_PARAM_LOB: + sqltype = SQL_LONGVARBINARY; + break; + default: + sqltype = SQL_LONGVARCHAR; + } precision = 4000; scale = 5; nullable = 1; diff --git a/ext/pdo_odbc/tests/bug44643.phpt b/ext/pdo_odbc/tests/bug44643.phpt new file mode 100644 index 00000000000..eb96af8ba5b --- /dev/null +++ b/ext/pdo_odbc/tests/bug44643.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #44643 (bound parameters ignore explicit type definitions) +--SKIPIF-- + +--FILE-- +prepare($sql); +$id1 = 1; +$stmt->bindParam(':id1', $id1, PDO::PARAM_INT); +$id2 = 1; +$stmt->bindParam(':id2', $id2, PDO::PARAM_INT); +var_dump($stmt->execute()); +?> +--EXPECT-- +bool(true)