Skip to content

Commit c07be0f

Browse files
Fixed bug that sql listener cannot work when the value contains ?. (#78)
Co-authored-by: 李铭昕 <[email protected]>
1 parent 3355a4c commit c07be0f

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

app/Listener/DbQueryExecutedListener.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Hyperf\Event\Contract\ListenerInterface;
1717
use Hyperf\Logger\LoggerFactory;
1818
use Hyperf\Utils\Arr;
19-
use Hyperf\Utils\Str;
2019
use Psr\Container\ContainerInterface;
2120
use Psr\Log\LoggerInterface;
2221

@@ -48,8 +47,15 @@ public function process(object $event): void
4847
if ($event instanceof QueryExecuted) {
4948
$sql = $event->sql;
5049
if (! Arr::isAssoc($event->bindings)) {
51-
foreach ($event->bindings as $key => $value) {
52-
$sql = Str::replaceFirst('?', "'{$value}'", $sql);
50+
$position = 0;
51+
foreach ($event->bindings as $value) {
52+
$position = strpos($sql, '?', $position);
53+
if ($position === false) {
54+
break;
55+
}
56+
$value = "'$value'";
57+
$sql = substr_replace($sql, $value, $position, 1);
58+
$position += strlen($value);
5359
}
5460
}
5561

0 commit comments

Comments
 (0)