PDO позиционные и именованные параметры как часть одного и того же подготовленного запроса? - PullRequest
11 голосов
/ 24 июня 2010

Я учу веревки с помощью 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

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

Спасибо!

Ответы [ 2 ]

10 голосов
/ 24 июня 2010

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

PDO.prepare

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

2 голосов
/ 24 июня 2010

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

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

...