Skip to content

Commit b074690

Browse files
staabmclxmstaab
andauthored
Skip queries containing placeholders in SyntaxErrorInQueryMethodRule (#119)
Co-authored-by: Markus Staab <[email protected]>
1 parent 899d5b8 commit b074690

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

.phpunit-phpstan-dba.cache

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,64 @@
22
'schemaVersion' => 'v3-rename-props',
33
'records' =>
44
array (
5+
'
6+
SELECT email adaid
7+
WHERE gesperrt = \'1\' AND email LIKE \'%@example.com\'
8+
FROM ada
9+
LIMIT 1
10+
' =>
11+
array (
12+
'error' =>
13+
staabm\PHPStanDba\Error::__set_state(array(
14+
'message' => 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL/MariaDB server version for the right syntax to use near \'FROM ada LIMIT 0\' at line 3',
15+
'code' => 1064,
16+
)),
17+
),
18+
'
19+
SELECT email, adaid
20+
FROM ada
21+
WHERE gesperrt = \'1\'
22+
LIMIT \'1\'
23+
' =>
24+
array (
25+
'error' => NULL,
26+
),
27+
'
28+
SELECT email, adaid
29+
FROM ada
30+
WHERE gesperrt = \'1\'
31+
LIMIT \'1\', \'1\'
32+
' =>
33+
array (
34+
'error' => NULL,
35+
),
36+
'
37+
SELECT email, adaid
38+
FROM ada
39+
WHERE gesperrt = \'1\'
40+
LIMIT \'1\', \'1\'
41+
' =>
42+
array (
43+
'error' => NULL,
44+
),
45+
'
46+
SELECT email, adaid
47+
FROM ada
48+
WHERE gesperrt = \'1\' AND email LIKE \'%@example%\'
49+
LIMIT 1
50+
' =>
51+
array (
52+
'error' => NULL,
53+
),
54+
'
55+
SELECT email, adaid
56+
FROM ada
57+
WHERE gesperrt = \'1\' AND email LIKE NULL
58+
LIMIT 1
59+
' =>
60+
array (
61+
'error' => NULL,
62+
),
563
'
664
SELECT email adaid
765
WHERE gesperrt = \'1\' AND email LIKE \'%@example.com\'
@@ -1509,6 +1567,14 @@
15091567
)),
15101568
),
15111569
),
1570+
'SELECT email, adaid, gesperrt, freigabe1u1 FROM ada WHERE adaid=?' =>
1571+
array (
1572+
'error' =>
1573+
staabm\PHPStanDba\Error::__set_state(array(
1574+
'message' => 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL/MariaDB server version for the right syntax to use near \'? LIMIT 0\' at line 1',
1575+
'code' => 1064,
1576+
)),
1577+
),
15121578
'SELECT email, adaid, gesperrt, freigabe1u1 FROM ada WHERE email=\'foo\'' =>
15131579
array (
15141580
'error' => NULL,

src/QueryReflection/QueryReflection.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public function validateQueryString(string $queryString): ?Error
4040
return null;
4141
}
4242

43+
// this method cannot validate queries which contain placeholders.
44+
if (0 !== $this->countPlaceholders($queryString)) {
45+
return null;
46+
}
47+
4348
return self::reflector()->validateQueryString($queryString);
4449
}
4550

src/Rules/PdoStatementExecuteMethodRule.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use PHPStan\Rules\Rule;
1313
use PHPStan\Rules\RuleError;
1414
use PHPStan\Rules\RuleErrorBuilder;
15-
use PHPStan\ShouldNotHappenException;
1615
use staabm\PHPStanDba\PdoReflection\PdoStatementReflection;
1716
use staabm\PHPStanDba\QueryReflection\QueryReflection;
1817

tests/data/syntax-error-in-query.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ public function syntaxErrorPdoPrepare(PDO $pdo)
7070
public function syntaxErrorDoctrineDbal(\Doctrine\DBAL\Connection $conn)
7171
{
7272
$sql = 'SELECT email adaid WHERE gesperrt freigabe1u1 FROM ada';
73-
$stmt = $conn->query($sql);
73+
$conn->query($sql);
74+
}
75+
76+
public function noErrorOnQueriesContainingPlaceholders(\Doctrine\DBAL\Connection $conn)
77+
{
78+
// errors in this scenario are reported by SyntaxErrorInPreparedStatementMethodRule only
79+
$conn->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada WHERE adaid=?');
7480
}
7581
}

0 commit comments

Comments
 (0)