From 77440026d7916b9a7882b3ba9d3a628c9d8c9ec6 Mon Sep 17 00:00:00 2001 From: Sergei Morozov Date: Fri, 29 Jul 2022 18:28:16 -0700 Subject: [PATCH] Deprecate using NULL as prepared statement parameter type --- UPGRADE.md | 4 ++++ src/Connection.php | 19 +++++++++++++++++++ src/Query/QueryBuilder.php | 13 ++++++++++--- tests/Query/QueryBuilderTest.php | 14 +++++++------- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index f6f92660755..6cb2c4db8ff 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -8,6 +8,10 @@ awareness about deprecated code. # Upgrade to 3.4 +## Deprecated using NULL as prepared statement parameter type. + +Omit the type or use `Parameter::STRING` instead. + ## Deprecated passing asset names as assets in `AbstractPlatform` and `AbstractSchemaManager` methods. Passing assets to the following `AbstractPlatform` methods and parameters has been deprecated: diff --git a/src/Connection.php b/src/Connection.php index 46753512aaa..fe0fd69c723 100644 --- a/src/Connection.php +++ b/src/Connection.php @@ -28,6 +28,7 @@ use Throwable; use Traversable; +use function array_key_exists; use function assert; use function count; use function get_class; @@ -1677,6 +1678,15 @@ private function _bindTypedValues(DriverStatement $stmt, array $params, array $t [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($bindIndex, $value, $bindingType); } else { + if (array_key_exists($key, $types)) { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/5550', + 'Using NULL as prepared statement parameter type is deprecated.' + . 'Omit or use Parameter::STRING instead' + ); + } + $stmt->bindValue($bindIndex, $value); } @@ -1690,6 +1700,15 @@ private function _bindTypedValues(DriverStatement $stmt, array $params, array $t [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($name, $value, $bindingType); } else { + if (array_key_exists($name, $types)) { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/5550', + 'Using NULL as prepared statement parameter type is deprecated.' + . 'Omit or use Parameter::STRING instead' + ); + } + $stmt->bindValue($name, $value); } } diff --git a/src/Query/QueryBuilder.php b/src/Query/QueryBuilder.php index 16b3d66eb33..fa0b49a5cc6 100644 --- a/src/Query/QueryBuilder.php +++ b/src/Query/QueryBuilder.php @@ -400,10 +400,17 @@ public function getSQL() * * @return $this This QueryBuilder instance. */ - public function setParameter($key, $value, $type = null) + public function setParameter($key, $value, $type = ParameterType::STRING) { if ($type !== null) { $this->paramTypes[$key] = $type; + } else { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/5550', + 'Using NULL as prepared statement parameter type is deprecated.' + . 'Omit or use Parameter::STRING instead' + ); } $this->params[$key] = $value; @@ -476,11 +483,11 @@ public function getParameterTypes() * * @param int|string $key The key of the bound parameter type * - * @return int|string|Type|null The value of the bound parameter type + * @return int|string|Type The value of the bound parameter type */ public function getParameterType($key) { - return $this->paramTypes[$key] ?? null; + return $this->paramTypes[$key] ?? ParameterType::STRING; } /** diff --git a/tests/Query/QueryBuilderTest.php b/tests/Query/QueryBuilderTest.php index 945ffe3b879..9c8c2be2e34 100644 --- a/tests/Query/QueryBuilderTest.php +++ b/tests/Query/QueryBuilderTest.php @@ -882,16 +882,16 @@ public function testGetParameterType(): void $qb->select('*')->from('users'); - self::assertNull($qb->getParameterType('name')); + self::assertSame(ParameterType::STRING, $qb->getParameterType('name')); $qb->where('name = :name'); $qb->setParameter('name', 'foo'); - self::assertNull($qb->getParameterType('name')); + self::assertSame(ParameterType::STRING, $qb->getParameterType('name')); - $qb->setParameter('name', 'foo', ParameterType::STRING); + $qb->setParameter('name', 'foo', ParameterType::INTEGER); - self::assertSame(ParameterType::STRING, $qb->getParameterType('name')); + self::assertSame(ParameterType::INTEGER, $qb->getParameterType('name')); } public function testGetParameterTypes(): void @@ -905,9 +905,9 @@ public function testGetParameterTypes(): void $qb->where('name = :name'); $qb->setParameter('name', 'foo'); - self::assertSame([], $qb->getParameterTypes()); - - $qb->setParameter('name', 'foo', ParameterType::STRING); + self::assertSame([ + 'name' => ParameterType::STRING, + ], $qb->getParameterTypes()); $qb->where('is_active = :isActive'); $qb->setParameter('isActive', true, ParameterType::BOOLEAN);