如何使用Prepared语句通过PDO sqlsrv设置访存和偏移值?

时间:2019-05-25 02:34:15

标签: php sql-server pdo

我正在尝试使用带参数的准备好的语句传递值来设置偏移量和限制(下一行):

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY');
$statement->execute(['offset' => 0, 'limit' => 5]);
$livro = $statement->fetch();

返回错误:

  

为TOP或FETCH子句提供的行数   参数必须是整数。

但是,如果我尝试硬编码:

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY');
$statement->execute();
$livro = $statement->fetch();

效果很好 我知道使用mysql必须使用PDO::ATTR_EMULATE_PREPARES => false才能达到极限。但是我尝试使用sqlsrv并收到错误:

  

仅PDOStatement对象支持给定属性

有没有一种方法可以使用预准备语句通过PDO sqlsrv设置访存和偏移值?

我的环境:Windows 10,PHP 7.3,MSSQL 2014

2 个答案:

答案 0 :(得分:3)

尝试一下:

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET CAST(:offset AS INT) ROWS FETCH NEXT CAST(:limit AS INT) ROWS ONLY');
$statement->execute(['offset' => 0, 'limit' => 5]);
$livro = $statement->fetch();

答案 1 :(得分:0)

您正在混合执行准备好的语句的多种方式。试试这个:

// You could have your values in variables (or hardcoded)
$offset = 0;
$limit = 5;

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY');

// Next you need to bind the values
$statement->bindValue(':offset', (int) $offset, PDO::PARAM_INT); 
$statement->bindValue(':limit', (int) $limit, PDO::PARAM_INT); 

// Now execute your statement
$statement->execute();

当您使用?而不是:limit之类的东西时,您可以传递一个值数组来执行,它将自动处理绑定-但是这种方式允许您强制数据类型。

了解更多:https://www.php.net/manual/en/pdo.prepared-statements.php


关于您的评论,您可以尝试以下操作,但是,如果我上次使用LIMIT和OFFSET进行尝试时没有记错的话,将无法使用。我猜想实现中有些古怪。仍然尝试一下:

$offset = 0;
$limit = 5;
$q = "SELECT * FROM livro ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
$stmt = $pdo->prepare($query);
$stmt->execute([$offset, $limit]);