Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit db7562d

Browse files
authored
Fix escaped placeholder and interpolate paramters with non sequential numeric keys (#2073)
1 parent b2e3286 commit db7562d

2 files changed

Lines changed: 25 additions & 11 deletions

File tree

src/Twig/DoctrineExtension.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
use Twig\TwigFilter;
1616

1717
use function addslashes;
18+
use function array_filter;
1819
use function array_key_exists;
20+
use function array_keys;
1921
use function array_merge;
22+
use function array_values;
2023
use function bin2hex;
2124
use function class_exists;
25+
use function count;
2226
use function implode;
2327
use function is_array;
2428
use function is_bool;
@@ -121,26 +125,26 @@ public function replaceQueryParameters($query, $parameters)
121125
$parameters = $parameters->getValue(true);
122126
}
123127

124-
$i = 0;
125-
126-
if (! array_key_exists(0, $parameters) && array_key_exists(1, $parameters)) {
127-
$i = 1;
128+
$keys = array_keys($parameters);
129+
if (count(array_filter($keys, 'is_int')) === count($keys)) {
130+
$parameters = array_values($parameters);
128131
}
129132

133+
$i = 0;
134+
130135
return preg_replace_callback(
131-
'/\?|((?<!:):[a-z0-9_]+)/i',
136+
'/(?<!\?)\?(?!\?)|(?<!:)(:[a-z0-9_]+)/i',
132137
static function ($matches) use ($parameters, &$i) {
133138
$key = substr($matches[0], 1);
134139

135140
if (! array_key_exists($i, $parameters) && ! array_key_exists($key, $parameters)) {
136141
return $matches[0];
137142
}
138143

139-
$value = array_key_exists($i, $parameters) ? $parameters[$i] : $parameters[$key];
140-
$result = DoctrineExtension::escapeFunction($value);
144+
$value = array_key_exists($i, $parameters) ? $parameters[$i] : $parameters[$key];
141145
$i++;
142146

143-
return $result;
147+
return DoctrineExtension::escapeFunction($value);
144148
},
145149
$query,
146150
);

tests/Twig/DoctrineExtensionTest.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ public function testReplaceQueryParametersWithPostgresCasting(): void
2323
$this->assertEquals('a=1 OR (1)::string OR b=2', $result);
2424
}
2525

26-
public function testReplaceQueryParametersWithStartingIndexAtOne(): void
26+
public function testReplaceQueryParametersWithNonSequentialNumericKeys(): void
2727
{
2828
$extension = new DoctrineExtension();
2929
$query = 'a=? OR b=?';
3030
$parameters = [
31-
1 => 1,
32-
2 => 2,
31+
2 => 1,
32+
5 => 2,
3333
];
3434

3535
$result = $extension->replaceQueryParameters($query, $parameters);
@@ -74,6 +74,16 @@ public function testReplaceQueryParametersWithEmptyArray(): void
7474
$this->assertEquals('IN (NULL)', $result);
7575
}
7676

77+
public function testReplaceQueryParametersWithEscapedParameterPlaceholder(): void
78+
{
79+
$extension = new DoctrineExtension();
80+
$query = 'column->>field ?? ?';
81+
$parameters = ['foo'];
82+
83+
$result = $extension->replaceQueryParameters($query, $parameters);
84+
$this->assertEquals("column->>field ?? 'foo'", $result);
85+
}
86+
7787
public function testEscapeBinaryParameter(): void
7888
{
7989
$binaryString = pack('H*', '9d40b8c1417f42d099af4782ec4b20b6');

0 commit comments

Comments
 (0)