PDO позиционные и именованные параметры как часть того же подготовленного запроса?

Я знаю досконально с 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

Действительно ли невозможно объединить позиционные и именованные параметры в том же запросе? Или я пропускаю что-то?

Спасибо!

11
задан Travis 24 June 2010 в 09:14
поделиться

2 ответа

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

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, а не данные.

1
ответ дан 3 December 2019 в 09:40
поделиться

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

PDO.prepare

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

10
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: