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 

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

Благодаря!

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

PDO.prepare

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

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

 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); } } не 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, а не данными.