PDO позиционные и именованные параметры как часть одного и того же подготовленного запроса?

Я изучаю веревки с PDO.

Вот мой sql (число параметров, которое может появиться в WHERE, является переменной).

    SELECT
        ID, title

    FROM
        table

    WHERE
        something = ?

    ORDER BY 
        :sort :dir 

    LIMIT 
        :start, :results

Вот мой код:

        $query = $conn->prepare($sql);

        if ($parameters) {

            $i = 0;
            foreach ($parameters AS $parameter) {

                $i++;
                $query->bindParam($i, $parameter);

            }

        }

        $query->bindParam(':start', $pagination['start'], PDO::PARAM_INT);
        $query->bindParam(':results', $pagination['results'], PDO::PARAM_INT);
        $query->bindParam(':sort', $pagination['sort']);
        $query->bindParam(':dir', $pagination['dir']);

        $query->execute();

... и здесь есть исключение, которое он генерирует:

 Invalid parameter number: mixed named and positional parameters

Невозможно ли совместить позиционные и именованные параметры в одном запросе? Или я что-то упускаю?

Спасибо!

Ответ 1

Да, это невозможно.

PDO.prepare

Вы не можете использовать маркеры параметров имени и вопросительного знака в одном и том же выражении SQL; выберите один или другой стиль параметра.

Ответ 2

Используйте функцию-обертку, достаточно простой функции замены.

if (strpos($sql, ":")) {
    $i = -1;
    while (strpos($sql, "?") && isset($parameters[++$i])) {
        $parameters[":p$i"] = $parameters[$i];
        unset($parameters[$i]);
        $sql = preg_replace("/[?]/", ":p$i", $sql, 1);
    }
}

Смешайте $sort и $dir непосредственно в запросе $sql. Это два идентификатора SQL, а не данные.