Skip to content

Commit 960490c

Browse files
staabmclxmstaab
andauthored
support PDO->query() when no fetch-type given (#38)
Co-authored-by: Markus Staab <[email protected]>
1 parent ac7846e commit 960490c

File tree

2 files changed

+40
-36
lines changed

2 files changed

+40
-36
lines changed

src/Extensions/PdoQueryDynamicReturnTypeExtension.php

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,26 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
4242
new ConstantBooleanType(false)
4343
);
4444

45-
if (\count($args) < 2) {
45+
if (\count($args) < 1) {
4646
return $defaultReturn;
4747
}
4848

49-
$fetchModeType = $scope->getType($args[1]->value);
50-
if (!$fetchModeType instanceof ConstantIntegerType) {
51-
return $defaultReturn;
52-
}
49+
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
50+
if (\count($args) >= 2) {
51+
$fetchModeType = $scope->getType($args[1]->value);
52+
if (!$fetchModeType instanceof ConstantIntegerType) {
53+
return $defaultReturn;
54+
}
5355

54-
if (PDO::FETCH_ASSOC === $fetchModeType->getValue()) {
55-
$reflectionFetchType = QueryReflector::FETCH_TYPE_ASSOC;
56-
} elseif (PDO::FETCH_NUM === $fetchModeType->getValue()) {
57-
$reflectionFetchType = QueryReflector::FETCH_TYPE_NUMERIC;
58-
} elseif (PDO::FETCH_BOTH === $fetchModeType->getValue()) {
59-
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
60-
} else {
61-
return $defaultReturn;
56+
if (PDO::FETCH_ASSOC === $fetchModeType->getValue()) {
57+
$reflectionFetchType = QueryReflector::FETCH_TYPE_ASSOC;
58+
} elseif (PDO::FETCH_NUM === $fetchModeType->getValue()) {
59+
$reflectionFetchType = QueryReflector::FETCH_TYPE_NUMERIC;
60+
} elseif (PDO::FETCH_BOTH === $fetchModeType->getValue()) {
61+
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
62+
} else {
63+
return $defaultReturn;
64+
}
6265
}
6366

6467
$queryReflection = new QueryReflection();

tests/data/pdo-fetch-types.php

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,28 @@
77

88
class Foo
99
{
10-
public function supportedFetchTypes(PDO $pdo)
11-
{
12-
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_NUM);
13-
assertType('PDOStatement<array{string, int<0, 4294967295>}>', $stmt);
14-
15-
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_ASSOC);
16-
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
17-
18-
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_BOTH);
19-
assertType('PDOStatement<array{email: string, 0: string, adaid: int<0, 4294967295>, 1: int<0, 4294967295>}>', $stmt);
20-
}
21-
22-
public function unsupportedFetchTypes(PDO $pdo)
23-
{
24-
$stmt = $pdo->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada');
25-
assertType('PDOStatement<array>|false', $stmt);
26-
27-
$stmt = $pdo->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada', PDO::FETCH_COLUMN);
28-
assertType('PDOStatement<array>|false', $stmt);
29-
30-
$stmt = $pdo->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada', PDO::FETCH_OBJ);
31-
assertType('PDOStatement<array>|false', $stmt);
32-
}
10+
public function supportedFetchTypes(PDO $pdo)
11+
{
12+
// default fetch-type is BOTH
13+
$stmt = $pdo->query('SELECT email, adaid FROM ada');
14+
assertType('PDOStatement<array{email: string, 0: string, adaid: int<0, 4294967295>, 1: int<0, 4294967295>}>', $stmt);
15+
16+
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_NUM);
17+
assertType('PDOStatement<array{string, int<0, 4294967295>}>', $stmt);
18+
19+
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_ASSOC);
20+
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
21+
22+
$stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_BOTH);
23+
assertType('PDOStatement<array{email: string, 0: string, adaid: int<0, 4294967295>, 1: int<0, 4294967295>}>', $stmt);
24+
}
25+
26+
public function unsupportedFetchTypes(PDO $pdo)
27+
{
28+
$stmt = $pdo->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada', PDO::FETCH_COLUMN);
29+
assertType('PDOStatement<array>|false', $stmt);
30+
31+
$stmt = $pdo->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada', PDO::FETCH_OBJ);
32+
assertType('PDOStatement<array>|false', $stmt);
33+
}
3334
}

0 commit comments

Comments
 (0)