Я изучаю веревки с 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, а не данными.