1: <?php
2:
3: declare(strict_types=1);
4:
5: namespace Atk4\Data\Persistence\Sql\Mysql;
6:
7: trait ExpressionTrait
8: {
9: #[\Override]
10: protected function escapeStringLiteral(string $value): string
11: {
12: return str_replace('\\', '\\\\', parent::escapeStringLiteral($value));
13: }
14:
15: #[\Override]
16: protected function hasNativeNamedParamSupport(): bool
17: {
18: $dbalConnection = $this->connection->getConnection();
19:
20: return !$dbalConnection->getNativeConnection() instanceof \mysqli;
21: }
22:
23: #[\Override]
24: protected function updateRenderBeforeExecute(array $render): array
25: {
26: [$sql, $params] = $render;
27:
28: $sql = preg_replace_callback(
29: '~' . self::QUOTED_TOKEN_REGEX . '\K|:\w+~',
30: static function ($matches) use ($params) {
31: if ($matches[0] === '') {
32: return '';
33: }
34:
35: $sql = $matches[0];
36: $value = $params[$sql];
37:
38: // emulate bind param support for float type
39: // TODO open php-src feature request
40: if (is_float($value)) {
41: $sql = '(' . $sql . ' + 0.00)';
42: }
43:
44: return $sql;
45: },
46: $sql
47: );
48:
49: return parent::updateRenderBeforeExecute([$sql, $params]);
50: }
51: }
52: