Я знаю досконально с PDO.
Вот мой sql (количество параметров, которые могут появиться в, ГДЕ является переменным).
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
Действительно ли невозможно объединить позиционные и именованные параметры в том же запросе? Или я пропускаю что-то?
Спасибо!
Используйте функцию-оболочку, достаточно простой функции замены.
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 нельзя использовать как именованные параметры, так и параметры с вопросительным знаком; выберите один или другой стиль параметров.