PHP cURL请求XML结果用foreach循环输出时如何添加分页功能
实现逻辑说明
核心逻辑和现有代码适配,无额外依赖:
- 固定每页展示100条,和你当前接口单次返回条数对齐
- 分页链接自动携带搜索关键词,翻页时不会丢失搜索条件
- 自动校验当前页码合法性,避免出现页码小于1、大于总页数的异常
- 兼容两种场景:接口支持分页传参、接口一次性返回全量数据
完整修改后代码
<?php // 配置常量,可根据需求调整 const PER_PAGE = 100; // 每页展示条数,和接口单次返回数量保持一致 if (isset($_GET['submit2'])) { // 处理搜索参数,新增XSS转义避免安全问题 $rawKeyword = $_GET["dept-keywords"]; $search2 = preg_replace('/\s+/', '+', $rawKeyword); $sanitizeSearch2 = filter_var($search2, FILTER_SANITIZE_STRING); echo '<b>Results: ' . htmlspecialchars($rawKeyword) . '</b>'; // 处理分页参数,默认第一页 $currentPage = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $ch = curl_init(); $baseUrl = 'https://example.com/'; $templateParamNames = array('{user_id}'); $templateParamValues = array(urlencode('exl_impl')); $baseUrl = str_replace($templateParamNames, $templateParamValues, $baseUrl); // 组装接口请求参数 $queryParams = array( // 原有其他业务参数保留 'keyword' => $sanitizeSearch2, // === 以下为分页参数,根据你接口要求调整 === // 如果接口支持按页码查询,保留下面这行,参数名改为接口要求的字段名比如page_num 'page' => $currentPage, // 如果接口要求传偏移量+条数,替换上面的page参数为下面两行 // 'offset' => ($currentPage - 1) * PER_PAGE, // 'limit' => PER_PAGE ); $url = $baseUrl . "?" . http_build_query($queryParams); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $oXML = new SimpleXMLElement($response); echo '<ol>'; $totalRecordCount = intval($oXML['total_record_count']); $totalPage = ceil($totalRecordCount / PER_PAGE); $count = 0; foreach ($oXML->user as $user) { $first_name = $user->first_name; $user_link = strtolower("https://example.com/" . urlencode($first_name)); echo '<li>'; echo "<a href='" . htmlspecialchars($user_link) . "'> " . htmlspecialchars($first_name) . " </a>" . "\r\n"; echo '</li>'; $count++; } if ($count == 0) { echo '<label>Sorry, no results!</label>'; } echo '</ol>'; curl_close($ch); // 渲染分页导航 if ($totalPage > 1) { echo '<div class="pagination">'; // 分页链接保留搜索参数 $paginationBaseParams = [ 'submit2' => '1', 'dept-keywords' => $rawKeyword ]; for ($i = 1; $i <= $totalPage; $i++) { $paginationParams = $paginationBaseParams + ['page' => $i]; $pageUrl = '?' . http_build_query($paginationParams); if ($i == $currentPage) { // 当前页加粗突出 echo "<strong>{$i}</strong> "; } else { echo "<a href='" . htmlspecialchars($pageUrl) . "'>{$i}</a> "; } // 页码之间加分隔符| if ($i != $totalPage) { echo '| '; } } echo '</div>'; } }
特殊场景适配
如果你的接口不支持分页传参,是一次性返回全量1000条数据,只需要把代码里遍历$oXML->user的部分替换为以下逻辑即可:
// 替换原有foreach遍历部分 $allUsers = $oXML->user; $totalRecordCount = count($allUsers); $totalPage = ceil($totalRecordCount / PER_PAGE); $startOffset = ($currentPage - 1) * PER_PAGE; $endOffset = $startOffset + PER_PAGE; // 只遍历当前页对应的用户数据 for ($i = $startOffset; $i < min($endOffset, $totalRecordCount); $i++) { $user = $allUsers[$i]; // 原有输出用户的逻辑不变 $first_name = $user->first_name; $user_link = strtolower("https://example.com/" . urlencode($first_name)); echo '<li>'; echo "<a href='" . htmlspecialchars($user_link) . "'> " . htmlspecialchars($first_name) . " </a>" . "\r\n"; echo '</li>'; }
你可以自行给.pagination类添加CSS样式,调整分页导航的展示效果。
内容的提问来源于stack exchange,提问作者User301276
相关产品推荐
相关产品推荐

