使用PHP和MSSQL编写的语句

时间:2018-08-13 15:17:34

标签: php sql-server pdo prepared-statement

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

Prepared语句(只是不要怀疑top和offset变量。我只是为了测试目的在函数中设置它们。还为$ stackoverflow编辑了$ conn。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();
    }
}

这样我可以正确获得结果。

这怎么可能?准备好的语句有什么问题?我有很多准备好的语句,以前也能很好地工作。

感谢答案。

@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();
    }
}

1 个答案:

答案 0 :(得分:0)

不允许在PDO中将参数绑定用于sql查询的SELECT和FROM部分。

我将整个查询替换为另一个无需设置TOP的查询