Ответ 1
Да, это невозможно.
Вы не можете использовать маркеры параметров имени и вопросительного знака в одном и том же выражении SQL; выберите один или другой стиль параметра.
Я изучаю веревки с 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
Невозможно ли совместить позиционные и именованные параметры в одном запросе? Или я что-то упускаю?
Спасибо!
Да, это невозможно.
Вы не можете использовать маркеры параметров имени и вопросительного знака в одном и том же выражении 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);
}
}
Смешайте $sort
и $dir
непосредственно в запросе $sql
. Это два идентификатора SQL, а не данные.