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] ); ```