如何使用预准备语句通过PDOsqlsrv设置获取和偏移值?



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

$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();

返回错误:

为顶部或获取条款行计提供的行数 参数必须是整数。

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

$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对象上支持

是否可以使用准备好的语句设置Fetch&使用PDO SQLSRV?

偏移值

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

尝试以下:

$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();

您正在混合做准备的语句的多种方法。尝试以下操作:

// 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/en/pdo.prepared-statements.php


关于您的评论,您可以尝试以下内容,但是如果我回想起上次尝试使用限制并抵消它将行不通的话。我想实现的东西。无论如何都要尝试一下:

$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]);

相关内容

  • 没有找到相关文章

最新更新