diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c index 368648c36ae2f..b1307be543392 100644 --- a/ext/pdo_odbc/odbc_stmt.c +++ b/ext/pdo_odbc/odbc_stmt.c @@ -323,9 +323,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 0000000000000..eb96af8ba5bd0 --- /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)