Azure表存储php分页不工作
我是azure table storage的新手,我正在使用php构建一个带有分页链接的表,其中包含来自azure table storage的数据。例如,您可以检查。在1000条记录之前,所有操作都正常,但当我转到1010条记录时,它返回此错误:- 失败:代码:400值:错误请求详细信息(如果有): {“odata.error”:{“code”:“InvalidInput”,“message”:{“lang”:“en-US”,“value”:“One” 请求输入的数量无效 因此,示例的Azure表存储php分页不工作,php,azure,pagination,Php,Azure,Pagination,我是azure table storage的新手,我正在使用php构建一个带有分页链接的表,其中包含来自azure table storage的数据。例如,您可以检查。在1000条记录之前,所有操作都正常,但当我转到1010条记录时,它返回此错误:- 失败:代码:400值:错误请求详细信息(如果有): {“odata.error”:{“code”:“InvalidInput”,“message”:{“lang”:“en-US”,“value”:“One” 请求输入的数量无效 因此,示例的quer
queryPaginationEntitiesSample函数{$options->setTop($numPerPage*($page-1));}
中的代码导致了此错误。有人能帮我解决此问题吗
function queryPaginationEntitiesSample($tableClient,$tableName,$numPerPage,$page,$filter) {
try {
$options = new QueryEntitiesOptions();
$options->setFilter(Filter::applyQueryString($filter));
if($page==1){
$options->setTop($numPerPage);
$options->setSelectFields(array('PartitionKey','RowKey','Timestamp'));
$result = $tableClient->queryEntities($tableName, $options);
$entities = $result->getEntities();
} else{
//skip $numPerPage * ($page-1) records
$options->setTop($numPerPage * ($page-1));
$options->setSelectFields(array('PartitionKey','RowKey','Timestamp'));
$result = $tableClient->queryEntities($tableName, $options);
$nRowKey = $result->getNextRowKey();
$nPartitionKey = $result->getNextPartitionKey();
$options = new QueryEntitiesOptions();
$options->setFilter(Filter::applyQueryString($filter));
$options->setTop($numPerPage);
$options->setNextRowKey($nRowKey);
$options->setNextPartitionKey($nPartitionKey);
$result = $tableClient->queryEntities($tableName, $options);
$entities = $result->getEntities();
}
return $entities;
}catch(ServiceException $e){
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message.PHP_EOL;
return null;
}
}
在对表服务的单个请求中可以获取的最大实体数为
1000
。由于您要求表服务返回1010
实体,因此出现此错误
我认为您需要以某种方式更改您的逻辑(抱歉,我对PHP不太熟悉,因此无法提供代码)。但本质上,您需要返回延续标记(下一个PartitionKey和下一个RowKey)以及实体,并将这些值传递给QueryPaginationEntitySample
方法并使用它们
请参阅作为参考(解决方案在.Net中)。您在这里的主要问题是您试图在每次迭代中修改
$top
的值,这与跳过
不同
从这里的文档:
$top
仅返回集合中前n个表或实体
基本上,您需要获得延续令牌并每次提供相同的过滤器和$top
您当前所做的是有效地增加您想要的每个“页面”数据的结果量。例如,$top
为10:
Page 1: 10 entries retrieved. 10 total entries retrieved.
Page 2: 10 entries retrieved. 20 total entries retrieved.
Page 3: 20 entries retrieved. 40 total entries retrieved.
Page 4: 30 entries retrieved. 70 total entries retrieved.
...
Page 99: 990 entries retrieved. 49510 total entries retrieved.
Page 101: 1000 entries retrieved. 50510 total entries retrieved.
Page 102: 1010 entries attempted. <-- Not allowed by design.
第1页:检索到10个条目。总共检索到10个条目。
第2页:检索到10个条目。总共检索到20个条目。
第3页:检索到20个条目。共检索到40个条目。
第4页:检索到30个条目。共检索到70个条目。
...
第99页:检索到990条条目。检索到的条目总数为49510条。
第101页:检索到1000条条目。共检索到50510条条目。
第102页:尝试了1010个条目。$numPerPage
的值设置是多少?$numPerPage设置为10,并且我正在使用JasonGrimes\Paginator进行分页。请编辑您的问题并包含您正在使用的代码。我现在添加了完整的分页功能。是否有方法跳过记录并获取下一个记录?我已设置每页记录s到10,所以在第101页和setTop设置为1000之前都可以正常工作,但是当我请求将第102页的setTop设置为1010时,出现了错误,所以请告诉我一些想法,如何在第101页之后将setTop设置为1000?我也可以获得下一个分区键和下一行键,但在第102页时它会中断