@@ -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 }
0 commit comments