Skip to content

Commit 5889874

Browse files
authored
support encapsed strings (#433)
1 parent 22b82d5 commit 5889874

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/QueryReflection/QueryReflection.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use PhpParser\Node\Expr\BinaryOp\Concat;
99
use PhpParser\Node\Identifier;
1010
use PhpParser\Node\Name;
11+
use PhpParser\Node\Scalar\Encapsed;
12+
use PhpParser\Node\Scalar\EncapsedStringPart;
1113
use PHPStan\Analyser\Scope;
1214
use PHPStan\ShouldNotHappenException;
1315
use PHPStan\Type\Constant\ConstantArrayType;
@@ -231,6 +233,19 @@ private function resolveQueryStringExpr(Expr $queryExpr, Scope $scope): ?string
231233
return $leftString.$rightString;
232234
}
233235

236+
if ($queryExpr instanceof Encapsed) {
237+
$string = '';
238+
foreach ($queryExpr->parts as $part) {
239+
$string .= $this->resolveQueryStringExpr($part, $scope);
240+
}
241+
242+
return $string;
243+
}
244+
245+
if ($queryExpr instanceof EncapsedStringPart) {
246+
return $queryExpr->value;
247+
}
248+
234249
$type = $scope->getType($queryExpr);
235250

236251
return QuerySimulation::simulateParamValueType($type, false);

tests/default/data/pdo.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,16 @@ public function mixInUnionParam(PDO $pdo, $adaid, $gesperrt)
212212
$stmt = $pdo->query("SELECT email, adaid FROM ada WHERE gesperrt = '".$gesperrt."'", PDO::FETCH_ASSOC);
213213
assertType('PDOStatement<array{email: string, adaid: int<-32768, 32767>}>', $stmt);
214214
}
215+
216+
public function queryEncapsedString(PDO $pdo, int $adaid)
217+
{
218+
$stmt = $pdo->query("SELECT email, adaid FROM ada WHERE adaid=$adaid", PDO::FETCH_ASSOC);
219+
assertType('PDOStatement<array{email: string, adaid: int<-32768, 32767>}>', $stmt);
220+
221+
$fn = function (): int {
222+
return self::INT;
223+
};
224+
$stmt = $pdo->query("SELECT email, adaid FROM ada WHERE adaid={$fn()}", PDO::FETCH_ASSOC);
225+
assertType('PDOStatement<array{email: string, adaid: int<-32768, 32767>}>', $stmt);
226+
}
215227
}

0 commit comments

Comments
 (0)