Skip to content

Commit d0166d7

Browse files
Seldaekclxmstaabstaabm
authored
Support complete placeholder name matching (#111)
Co-authored-by: Markus Staab <[email protected]> Co-authored-by: Markus Staab <[email protected]>
1 parent c65c961 commit d0166d7

File tree

3 files changed

+54
-47
lines changed

3 files changed

+54
-47
lines changed

.phpstan-dba.cache

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,8 @@
212212
)),
213213
'result' =>
214214
array (
215-
2 => NULL,
216215
1 => NULL,
216+
2 => NULL,
217217
3 => NULL,
218218
),
219219
),
@@ -984,27 +984,31 @@
984984
'error' => NULL,
985985
'result' =>
986986
array (
987-
2 =>
987+
1 =>
988988
PHPStan\Type\Constant\ConstantArrayType::__set_state(array(
989989
'keyType' =>
990990
PHPStan\Type\UnionType::__set_state(array(
991991
'types' =>
992992
array (
993993
0 =>
994-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
995-
'value' => 0,
994+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
995+
'value' => 'adaid',
996+
'isClassString' => false,
996997
)),
997998
1 =>
998-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
999-
'value' => 1,
999+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1000+
'value' => 'email',
1001+
'isClassString' => false,
10001002
)),
10011003
2 =>
1002-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1003-
'value' => 2,
1004+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1005+
'value' => 'freigabe1u1',
1006+
'isClassString' => false,
10041007
)),
10051008
3 =>
1006-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1007-
'value' => 3,
1009+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1010+
'value' => 'gesperrt',
1011+
'isClassString' => false,
10081012
)),
10091013
),
10101014
)),
@@ -1026,20 +1030,24 @@
10261030
'keyTypes' =>
10271031
array (
10281032
0 =>
1029-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1030-
'value' => 0,
1033+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1034+
'value' => 'email',
1035+
'isClassString' => false,
10311036
)),
10321037
1 =>
1033-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1034-
'value' => 1,
1038+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1039+
'value' => 'adaid',
1040+
'isClassString' => false,
10351041
)),
10361042
2 =>
1037-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1038-
'value' => 2,
1043+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1044+
'value' => 'gesperrt',
1045+
'isClassString' => false,
10391046
)),
10401047
3 =>
1041-
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1042-
'value' => 3,
1048+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1049+
'value' => 'freigabe1u1',
1050+
'isClassString' => false,
10431051
)),
10441052
),
10451053
'valueTypes' =>
@@ -1063,36 +1071,32 @@
10631071
'max' => 127,
10641072
)),
10651073
),
1066-
'nextAutoIndex' => 4,
1074+
'nextAutoIndex' => 0,
10671075
'optionalKeys' =>
10681076
array (
10691077
),
10701078
)),
1071-
1 =>
1079+
2 =>
10721080
PHPStan\Type\Constant\ConstantArrayType::__set_state(array(
10731081
'keyType' =>
10741082
PHPStan\Type\UnionType::__set_state(array(
10751083
'types' =>
10761084
array (
10771085
0 =>
1078-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1079-
'value' => 'adaid',
1080-
'isClassString' => false,
1086+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1087+
'value' => 0,
10811088
)),
10821089
1 =>
1083-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1084-
'value' => 'email',
1085-
'isClassString' => false,
1090+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1091+
'value' => 1,
10861092
)),
10871093
2 =>
1088-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1089-
'value' => 'freigabe1u1',
1090-
'isClassString' => false,
1094+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1095+
'value' => 2,
10911096
)),
10921097
3 =>
1093-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1094-
'value' => 'gesperrt',
1095-
'isClassString' => false,
1098+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1099+
'value' => 3,
10961100
)),
10971101
),
10981102
)),
@@ -1114,24 +1118,20 @@
11141118
'keyTypes' =>
11151119
array (
11161120
0 =>
1117-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1118-
'value' => 'email',
1119-
'isClassString' => false,
1121+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1122+
'value' => 0,
11201123
)),
11211124
1 =>
1122-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1123-
'value' => 'adaid',
1124-
'isClassString' => false,
1125+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1126+
'value' => 1,
11251127
)),
11261128
2 =>
1127-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1128-
'value' => 'gesperrt',
1129-
'isClassString' => false,
1129+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1130+
'value' => 2,
11301131
)),
11311132
3 =>
1132-
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
1133-
'value' => 'freigabe1u1',
1134-
'isClassString' => false,
1133+
PHPStan\Type\Constant\ConstantIntegerType::__set_state(array(
1134+
'value' => 3,
11351135
)),
11361136
),
11371137
'valueTypes' =>
@@ -1155,7 +1155,7 @@
11551155
'max' => 127,
11561156
)),
11571157
),
1158-
'nextAutoIndex' => 0,
1158+
'nextAutoIndex' => 4,
11591159
'optionalKeys' =>
11601160
array (
11611161
),

src/Rules/PdoStatementExecuteMethodRule.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
*/
2424
final class PdoStatementExecuteMethodRule implements Rule
2525
{
26+
public const REGEX_PLACEHOLDER = '{:[a-zA-Z0-9_]+}';
27+
2628
public function getNodeType(): string
2729
{
2830
return MethodCall::class;
@@ -148,7 +150,7 @@ private function countPlaceholders(string $queryString): int
148150
return $numPlaceholders;
149151
}
150152

151-
$numPlaceholders = preg_match_all('{:[a-z]+}', $queryString);
153+
$numPlaceholders = preg_match_all(self::REGEX_PLACEHOLDER, $queryString);
152154
if (false === $numPlaceholders || $numPlaceholders < 0) {
153155
throw new ShouldNotHappenException();
154156
}
@@ -168,7 +170,7 @@ private function extractNamedPlaceholders(string $queryString): array
168170
return [];
169171
}
170172

171-
if (preg_match_all('{:[a-z]+}', $queryString, $matches) > 0) {
173+
if (preg_match_all(self::REGEX_PLACEHOLDER, $queryString, $matches) > 0) {
172174
return $matches[0];
173175
}
174176

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,9 @@ public function preparedNamedParams(Connection $connection)
9494
{
9595
$connection->preparedQuery('SELECT email, adaid FROM ada WHERE gesperrt = :gesperrt', ['gesperrt' => 1]);
9696
}
97+
98+
public function camelCase(Connection $connection)
99+
{
100+
$connection->preparedQuery('SELECT email, adaid FROM ada WHERE gesperrt = :myGesperrt', ['myGesperrt' => 1]);
101+
}
97102
}

0 commit comments

Comments
 (0)