Skip to content

Commit a6c1787

Browse files
staabmclxmstaab
andauthored
support optional parameter values (#181)
Co-authored-by: Markus Staab <[email protected]>
1 parent a18ff27 commit a6c1787

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

.phpunit-phpstan-dba.cache

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/QueryReflection/PlaceholderValidation.php

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private function checkErrors(string $queryString, array $parameters): iterable
5858
}
5959

6060
/**
61-
* @param array<string|int, Parameter> $parameters
61+
* @param non-empty-array<string|int, Parameter> $parameters
6262
*
6363
* @return iterable<string>
6464
*/
@@ -67,16 +67,27 @@ private function checkParameterValues(string $queryString, array $parameters, in
6767
$queryReflection = new QueryReflection();
6868

6969
$parameterCount = \count($parameters);
70+
$minParameterCount = 0;
71+
foreach ($parameters as $parameter) {
72+
if ($parameter->isOptional) {
73+
continue;
74+
}
75+
++$minParameterCount;
76+
}
7077

71-
if ($parameterCount !== $placeholderCount) {
78+
if ($parameterCount !== $placeholderCount && $placeholderCount !== $minParameterCount) {
7279
$placeholderExpectation = sprintf('Query expects %s placeholder', $placeholderCount);
7380
if ($placeholderCount > 1) {
7481
$placeholderExpectation = sprintf('Query expects %s placeholders', $placeholderCount);
7582
}
7683

77-
$parameterActual = sprintf('but %s value is given', $parameterCount);
78-
if ($parameterCount > 1) {
79-
$parameterActual = sprintf('but %s values are given', $parameterCount);
84+
if ($minParameterCount !== $parameterCount) {
85+
$parameterActual = sprintf('but %s values are given', $minParameterCount.'-'.$parameterCount);
86+
} else {
87+
$parameterActual = sprintf('but %s value is given', $parameterCount);
88+
if ($parameterCount > 1) {
89+
$parameterActual = sprintf('but %s values are given', $parameterCount);
90+
}
8091
}
8192

8293
yield $placeholderExpectation.', '.$parameterActual.'.';
@@ -91,10 +102,13 @@ private function checkParameterValues(string $queryString, array $parameters, in
91102
}
92103
}
93104

94-
foreach ($parameters as $placeholderKey => $value) {
105+
foreach ($parameters as $placeholderKey => $parameter) {
95106
if (\is_int($placeholderKey)) {
96107
continue;
97108
}
109+
if ($parameter->isOptional) {
110+
continue;
111+
}
98112
if (!\in_array($placeholderKey, $namedPlaceholders)) {
99113
yield sprintf('Value %s is given, but the query does not contain this placeholder.', $placeholderKey);
100114
}

tests/data/syntax-error-in-prepared-statement.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,15 @@ public function noErrorOnLockedRead(Connection $connection, int $limit, int $off
282282
FOR SHARE
283283
', [':gesperrt' => 1, ':limit' => $limit, ':offset' => $offset]);
284284
}
285+
286+
public function noErrorInBug174(Connection $connection, string $name, ?int $gesperrt = null, ?int $adaid = null) {
287+
$sql = 'SELECT adaid FROM ada WHERE email = :name';
288+
$args = ['name' => $name];
289+
if (null !== $gesperrt) {
290+
$sql .= ' AND gesperrt = :gesperrt';
291+
$args['gesperrt'] = $gesperrt;
292+
}
293+
294+
$connection->preparedQuery($sql, $args);
295+
}
285296
}

0 commit comments

Comments
 (0)