我正在尝试使用带参数的准备好的语句传递值来设置偏移量和限制(下一行):
$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
答案 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]);