Doctrine\DBALでOFFSETをバインドする方法
2024/01/27
`fetch`メソッドでOFFSETをバインドするとき、以下の書き方をすると例外が発生します。
```php
$sql = <<<SQL
SELECT
id,
name
FROM users
LIMIT 10
OFFSET :offset
SQL;
/** @var Doctrine\DBAL\Connection $connection */
$connection->fetchAllAssociative(
$sql,
['offset' => $offset]
);
```
```txt
Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''10' OFFSET '0''
```
これは、:offsetにバインドした値が文字列として埋め込まれているためです。`fetch`メソッドの第三引数でバインドする型を指定できるので、こちらで:offsetに整数型を指定すると問題なく動きます。
```diff
$sql = <<<SQL
SELECT
id,
name
FROM users
LIMIT 10
OFFSET :offset
SQL;
/** @var Doctrine\DBAL\Connection $connection */
$connection->fetchAllAssociative(
$sql,
- ['offset' => $offset]
+ ['offset' => $offset],
+ ['offset' => ParameterType::INTEGER]
);
```