Skip to content

Commit 73bb48f

Browse files
staabmclxmstaab
andauthored
cover quoted query strings with tests (#31)
Co-authored-by: Markus Staab <[email protected]>
1 parent 8477d25 commit 73bb48f

File tree

3 files changed

+123
-0
lines changed

3 files changed

+123
-0
lines changed

.phpstan-dba.cache

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,75 @@
429429
)),
430430
),
431431
),
432+
'SELECT email, adaid FROM ada WHERE adaid=1' =>
433+
array (
434+
'error' => NULL,
435+
'result' =>
436+
array (
437+
1 =>
438+
PHPStan\Type\Constant\ConstantArrayType::__set_state(array(
439+
'keyType' =>
440+
PHPStan\Type\UnionType::__set_state(array(
441+
'types' =>
442+
array (
443+
0 =>
444+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
445+
'value' => 'adaid',
446+
'isClassString' => false,
447+
)),
448+
1 =>
449+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
450+
'value' => 'email',
451+
'isClassString' => false,
452+
)),
453+
),
454+
)),
455+
'itemType' =>
456+
PHPStan\Type\UnionType::__set_state(array(
457+
'types' =>
458+
array (
459+
0 =>
460+
PHPStan\Type\IntegerRangeType::__set_state(array(
461+
'min' => 0,
462+
'max' => 4294967295,
463+
)),
464+
1 =>
465+
PHPStan\Type\StringType::__set_state(array(
466+
)),
467+
),
468+
)),
469+
'keyTypes' =>
470+
array (
471+
0 =>
472+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
473+
'value' => 'email',
474+
'isClassString' => false,
475+
)),
476+
1 =>
477+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
478+
'value' => 'adaid',
479+
'isClassString' => false,
480+
)),
481+
),
482+
'valueTypes' =>
483+
array (
484+
0 =>
485+
PHPStan\Type\StringType::__set_state(array(
486+
)),
487+
1 =>
488+
PHPStan\Type\IntegerRangeType::__set_state(array(
489+
'min' => 0,
490+
'max' => 4294967295,
491+
)),
492+
),
493+
'nextAutoIndex' => 0,
494+
'optionalKeys' =>
495+
array (
496+
),
497+
'allArrays' => NULL,
498+
)),
499+
),
500+
),
432501
'SELECT email, adaid, gesperrt, freigabe1u1 FROM ada' =>
433502
array (
434503
'error' => NULL,

tests/data/mysqli.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,31 @@ public function escape(mysqli $mysqli, int $i, float $f, $n, string $s, $nonE, s
7070
assertType('non-empty-string', $mysqli->real_escape_string($nonE));
7171
assertType('string', $mysqli->real_escape_string($s));
7272
}
73+
74+
/**
75+
* @param numeric $n
76+
* @param non-empty-string $nonE
77+
* @param numeric-string $numericString
78+
*/
79+
public function quotedArguments(mysqli $mysqli, int $i, float $f, $n, string $s, $nonE, string $numericString)
80+
{
81+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string((string) $i));
82+
assertType('mysqli_result<array{email: string, adaid: int<0, 4294967295>}>|false', $result);
83+
84+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string((string) $f));
85+
assertType('mysqli_result<array{email: string, adaid: int<0, 4294967295>}>|false', $result);
86+
87+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string((string) $n));
88+
assertType('mysqli_result<array{email: string, adaid: int<0, 4294967295>}>|false', $result);
89+
90+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string($numericString));
91+
assertType('mysqli_result<array{email: string, adaid: int<0, 4294967295>}>|false', $result);
92+
93+
// when quote() cannot return a numeric-string, we can't infer the precise result-type
94+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string($s));
95+
assertType('bool|mysqli_result', $result);
96+
97+
$result = $mysqli->query('SELECT email, adaid FROM ada WHERE adaid='.$mysqli->real_escape_string($nonE));
98+
assertType('bool|mysqli_result', $result);
99+
}
73100
}

tests/data/pdo.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,31 @@ public function quote(PDO $pdo, int $i, float $f, $n, string $s, $nonE, string $
172172
assertType('non-empty-string|false', $pdo->quote($nonE, PDO::PARAM_LOB));
173173
assertType('string|false', $pdo->quote($s, PDO::PARAM_LOB));
174174
}
175+
176+
/**
177+
* @param numeric $n
178+
* @param non-empty-string $nonE
179+
* @param numeric-string $numericString
180+
*/
181+
public function quotedArguments(PDO $pdo, int $i, float $f, $n, string $s, $nonE, string $numericString)
182+
{
183+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote((string) $i), PDO::FETCH_ASSOC);
184+
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
185+
186+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote((string) $f), PDO::FETCH_ASSOC);
187+
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
188+
189+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote((string) $n), PDO::FETCH_ASSOC);
190+
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
191+
192+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote($numericString), PDO::FETCH_ASSOC);
193+
assertType('PDOStatement<array{email: string, adaid: int<0, 4294967295>}>', $stmt);
194+
195+
// when quote() cannot return a numeric-string, we can't infer the precise result-type
196+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote($s), PDO::FETCH_ASSOC);
197+
assertType('PDOStatement<array>|false', $stmt);
198+
199+
$stmt = $pdo->query('SELECT email, adaid FROM ada WHERE adaid='.$pdo->quote($nonE), PDO::FETCH_ASSOC);
200+
assertType('PDOStatement<array>|false', $stmt);
201+
}
175202
}

0 commit comments

Comments
 (0)