fetchAll и bindTypes в phalconphp

Согласно документации описание метода fetchAll класса Phalcon\Db\Adapter\Pdo\Mysql выглядит так:

public array fetchAll (
    string $sqlQuery,  
    [int $fetchMode],
    [unknown $placeholders]
) inherited from Phalcon\Db\Adapter

подготовил запрос, включил туда

LIMIT :offset, :limit

массив bind:

$bind = array(
    'offset'=>$offset,
    'limit'=>$limit
);

Вызываю fetchAll

getDi()->getDb()->fetchAll(
    $sql, 
    \Phalcon\Db::FETCH_ASSOC, 
    $bind
);

— и на тебе:
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 ‘ ‘0’, ’25’ ‘
Похоже целочисленные значения подставились в запрос как строки.
Пробую явно привести значения к целочисленному типу:

$bind = array(
    'offset'=>intval($offset), 
    'limit'=>intval($limit)
);

Нифига, все по-прежнему, та же самая ошибка.
Как оказалось, в официальной документации есть неточность, описание метода должно выглядеть так:

public array fetchAll (
    string $sqlQuery
    [, int $fetchMode]
    [, array $placeholders]
    [, array $types]
) inherited from Phalcon\Db\Adapter

Стоило лишь добавить в вызов четвертый параметр

$types = array(
    'limit' => \Phalcon\Db\Column::BIND_PARAM_INT,
    'offset' => \Phalcon\Db\Column::BIND_PARAM_INT
);
getDi()->getDb()->fetchAll(
    $sql,
    \Phalcon\Db::FETCH_ASSOC,
    $bind,
    $types
);

и все заработало.

Добавить комментарий