使用 PHP 和 MSSQL 准备好的语句

Prepared statement with PHP and MSSQL

我对 pdo 有一个奇怪的看法。使用准备好的语句,我从数据库中得到 0 个结果。但是硬编码我得到了正常的结果。这是针对 mssql(< 2012)的 sql 查询,以获得有限的结果。

Prepared Statement(只是不要怀疑 top 和 offset 变量。我在函数中设置它们只是为了测试目的。另外 $conn 是为 Whosebug 编辑的。prepare 函数可以从函数中访问,所以没问题):

public function myFunction($top, $offset) {
    try {
        $top = 20;
        $offset = 1;

        $sql = "SELECT TOP :top * FROM (
            SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
            FROM myTable) AS nU WHERE t1 >= :offset";

        $statement = $conn->prepare($sql);
        $statement->execute(array(':top' => $top, ':offset' => $offset));

        return $statement->fetchAll();

    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

结果是一个包含 0 个元素的数组。

但是有了这个它就完美地工作了:

public function myFunction($top, $offset) {
    try {
        $top = 20;
        $offset = 1;

        $sql = "SELECT TOP 20 * FROM (
            SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
            FROM myTable) AS nU WHERE t1 >= 1";

        $statement = $conn->prepare($sql);
        $statement->execute();

        return $statement->fetchAll();

    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

有了这个我得到了正确的结果。

这怎么可能?准备好的陈述有什么问题?我有很多prepared statements,之前用的很好

感谢您的回答。

@EDIT - 更新代码 - 仍然工作:

public function myFunction($top, $offset) {
    try {
        $top = 20;
        $offset = 1;

        $sql = "SELECT TOP :top * FROM (
            SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
            FROM myTable) AS nU WHERE t1 >= :offset";

        $statement = $conn->prepare($sql);

        $statement->bindParam(':top', $top, PDO::PARAM_INT);
        $statement->bindParam(':offset', $offset, PDO::PARAM_INT);

        $statement->execute();
        return $statement->fetchAll();
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

不允许在 PDO 中为 SELECT 和 sql 查询的一部分使用参数绑定。

我用另一个不需要设置 TOP

的查询替换了整个查询