You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:45:02