From c07be0ff2b2e1b53cb53d0c58748c4d061433bae Mon Sep 17 00:00:00 2001 From: guiqibusixin <44723312+guiqibusixin@users.noreply.github.com> Date: Thu, 18 Aug 2022 11:09:08 +0800 Subject: [PATCH] Fixed bug that sql listener cannot work when the value contains `?`. (#78) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 李铭昕 <715557344@qq.com> --- app/Listener/DbQueryExecutedListener.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/Listener/DbQueryExecutedListener.php b/app/Listener/DbQueryExecutedListener.php index df3adeb0..e7e30556 100644 --- a/app/Listener/DbQueryExecutedListener.php +++ b/app/Listener/DbQueryExecutedListener.php @@ -16,7 +16,6 @@ use Hyperf\Event\Contract\ListenerInterface; use Hyperf\Logger\LoggerFactory; use Hyperf\Utils\Arr; -use Hyperf\Utils\Str; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; @@ -48,8 +47,15 @@ public function process(object $event): void if ($event instanceof QueryExecuted) { $sql = $event->sql; if (! Arr::isAssoc($event->bindings)) { - foreach ($event->bindings as $key => $value) { - $sql = Str::replaceFirst('?', "'{$value}'", $sql); + $position = 0; + foreach ($event->bindings as $value) { + $position = strpos($sql, '?', $position); + if ($position === false) { + break; + } + $value = "'$value'"; + $sql = substr_replace($sql, $value, $position, 1); + $position += strlen($value); } }