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