Используйте функцию обертки, наивная функция замены будет достаточной.
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. Эти два являются идентификаторами SQL, а не данными.