Skip to content

Commit 6f438a9

Browse files
staabmclxmstaab
andauthored
refactor placeholder validation to ease re-use (#139)
Co-authored-by: Markus Staab <m.staab@complex-it.de>
1 parent a8253f4 commit 6f438a9

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

src/QueryReflection/PlaceholderValidation.php

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,19 @@
44

55
namespace staabm\PHPStanDba\QueryReflection;
66

7-
use PhpParser\Node\Expr\MethodCall;
8-
use PHPStan\Analyser\Scope;
9-
107
final class PlaceholderValidation
118
{
129
/**
10+
* @param array<string|int, scalar|null> $parameters
11+
*
1312
* @return iterable<string>
1413
*/
15-
public function checkErrors(string $queryString, MethodCall $methodCall, Scope $scope): iterable
14+
public function checkErrors(string $queryString, array $parameters): iterable
1615
{
1716
$queryReflection = new QueryReflection();
18-
$args = $methodCall->getArgs();
1917
$placeholderCount = $queryReflection->countPlaceholders($queryString);
2018

21-
if (0 === \count($args)) {
19+
if (0 === \count($parameters)) {
2220
if (0 === $placeholderCount) {
2321
return;
2422
}
@@ -33,22 +31,18 @@ public function checkErrors(string $queryString, MethodCall $methodCall, Scope $
3331
return;
3432
}
3533

36-
yield from $this->checkParameterValues($methodCall, $scope, $queryString, $placeholderCount);
34+
yield from $this->checkParameterValues($queryString, $parameters, $placeholderCount);
3735
}
3836

3937
/**
38+
* @param array<string|int, scalar|null> $parameters
39+
*
4040
* @return iterable<string>
4141
*/
42-
private function checkParameterValues(MethodCall $methodCall, Scope $scope, string $queryString, int $placeholderCount): iterable
42+
private function checkParameterValues(string $queryString, array $parameters, int $placeholderCount): iterable
4343
{
4444
$queryReflection = new QueryReflection();
45-
$args = $methodCall->getArgs();
4645

47-
$parameterTypes = $scope->getType($args[0]->value);
48-
$parameters = $queryReflection->resolveParameters($parameterTypes);
49-
if (null === $parameters) {
50-
return;
51-
}
5246
$parameterCount = \count($parameters);
5347

5448
if ($parameterCount !== $placeholderCount) {

src/QueryReflection/QueryReflection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private function getQueryType(string $query): ?string
156156
}
157157

158158
/**
159-
* @return array<string|int, scalar|null>
159+
* @return array<string|int, scalar|null>|null
160160
*/
161161
public function resolveParameters(Type $parameterTypes): ?array
162162
{

src/Rules/PdoStatementExecuteMethodRule.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,26 @@ public function processNode(Node $methodCall, Scope $scope): array
5555
*/
5656
private function checkErrors(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): array
5757
{
58+
$queryReflection = new QueryReflection();
5859
$stmtReflection = new PdoStatementReflection();
5960
$queryExpr = $stmtReflection->findPrepareQueryStringExpression($methodReflection, $methodCall);
6061

6162
if (null === $queryExpr) {
6263
return [];
6364
}
6465

66+
$args = $methodCall->getArgs();
67+
if (\count($args) < 1) {
68+
$parameters = [];
69+
} else {
70+
$parameterTypes = $scope->getType($args[0]->value);
71+
$parameters = $queryReflection->resolveParameters($parameterTypes) ?? [];
72+
}
73+
6574
$errors = [];
66-
$queryReflection = new QueryReflection();
6775
$placeholderReflection = new PlaceholderValidation();
6876
foreach ($queryReflection->resolveQueryStrings($queryExpr, $scope) as $queryString) {
69-
foreach ($placeholderReflection->checkErrors($queryString, $methodCall, $scope) as $error) {
77+
foreach ($placeholderReflection->checkErrors($queryString, $parameters) as $error) {
7078
// make error messages unique
7179
$errors[$error] = $error;
7280
}

0 commit comments

Comments
 (0)