PDO位置和命名参数作为同一个准备查询的一部分?

时间:2010-06-24 09:14:56

标签: php mysql pdo prepared-statement

我正在学习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 个答案:

答案 0 :(得分:10)

是的,这是不可能的。

PDO.prepare

您不能在同一SQL语句中同时使用命名和问号参数标记;选择一个或另一个参数样式。

答案 1 :(得分: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标识符,而不是数据。