quatam
@quatam

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

phpでのページネーション機能がうまくいかない

解決したいこと

求人のサイトを作っています。
htmlで都道府県を選ぶと、formにてphpに情報を飛ばし、その情報を元にxmlから当てはまる県の求人のみを表示させるようにしたいです。(今回は茨城を使ってテストしています)
1ページに5求人のみを表示させようとしています。
ですので1ページ目には求人1から5まで、ページ2では求人6から求人10までというようにしたいです。
求人はこれから増えていくのでページは増えていきますがどのページでも同じような仕組みにしたいです。

現状

htmlから受け取った情報を元にxmlから茨城だけの求人情報をphpに表示させることができています。しっかり求人数は5つまでを表示してくれています。
ちなみに各ページhtml記述が必要なところ(metaやheaderなど)は省略しています。

発生している問題・エラー

ページ2を押すと求人6からが表示されずにいます。

urlはtest.php?page=2というようにページ2に飛んでいるようなのでなぜ表示されない

該当するソースコード

<?php


$selectedArea = $_POST['area']; // 選択したエリアを取得
$xml = simplexml_load_file('../xml/data.xml');

// 選択されたエリアに一致する求人情報を抽出
$matchingJobs = array();
foreach ($xml->job as $job) {
    if ((string)$job->area === $selectedArea) {
        $matchingJobs[] = $job;
    }
}

// 求人情報をランダムにシャッフル
/*shuffle($matchingJobs);*/


// ページネーションの設定
$jobsPerPage = 5;
$totalJobs = count($matchingJobs);
$totalPages = ceil($totalJobs / $jobsPerPage);
$currentPage = isset($_GET['page']) ? max(1, min($totalPages, intval($_GET['page']))) : 1;





// 現在のページに表示する求人情報を抽出
$startIndex = ($currentPage - 1) * $jobsPerPage;
$endIndex = min($startIndex + $jobsPerPage, $totalJobs);
$currentPageJobs = array_slice($matchingJobs, $startIndex, $endIndex - $startIndex);




echo "Current Page: " . $currentPage;
echo "Start Index: " . $startIndex . "<br>";
echo "End Index: " . $endIndex . "<br>";


?>


<div class="features-container">
<?php if (!empty($currentPageJobs)) : ?>
        <?php foreach ($currentPageJobs as $job) : ?>
            <!-- 求人情報の表示コード -->
            <div class="feature" id="feature-<?php echo $job['id']; ?>">
                <a href="/area-job/<?php echo $job->area; ?><?php echo $job->url; ?>">
                    <img src="<?php echo $job->imagePath; ?>" alt="特徴画像" class="feature-image">
                    <div class="feature-content">
                        <ul class="genre-list">
                            <li class="genre-1"><?php echo $job->area; ?></li>
                            <li class="genre-2"><?php echo $job->occupation; ?></li>
                            <li class="genre-3"><?php echo $job->employment; ?></li>
                        </ul>
                        <h3><?php echo $job->title; ?></h3>
                        <p><?php echo $job->description; ?></p>
                    </div>
                </a>
            </div>
        <?php endforeach; ?>


        <!-- ページネーションリンクを表示 -->
        <ul class="pagination">
    <?php for ($i = 1; $i <= $totalPages; $i++) : ?>
        <li class="page-item <?php echo ($i == $currentPage) ? 'current-page' : ''; ?>">
            <a href="?page=<?php echo $i; ?>" class="page-link"><?php echo $i; ?></a>
        </li>
    <?php endfor; ?>
</ul>

    <?php else : ?>
        <p>選択された都道府県に該当する求人情報はありません。</p>
    <?php endif; ?>
</div>

自分で試したこと

計算の方法を変えてみたりしたのですが無理でした。

0

2Answer

改めて回答します。

ページ2を押すと求人6からが表示されずにいます。

では「どのような状態なのか?(どのようなデータが表示されているのか?)」という点を分析するのが解決の糸口になると思います。
基本的に「うまくいく/うまくいかない」は当人が決めることで回答者はわからないので、具体的な状況を記載されている方が回答しやすいです。

ひとまず現時点で気になるのは次の部分です。

$selectedArea = $_POST['area']; // 選択したエリアを取得

ページネーションリンクで遷移するとGETになるので、ここのPOSTパラメータ(選択したエリア)は取れていないと思います。
おそらく最初のページは茨城でフィルタリングされたデータで、2ページはエリアの情報がないのでうまくいかない(想定したデータが表示されない or エラーになる or 何かが壊れている)という状況なのではないかと推測します。

1Like

Comments

  1. @quatam

    Questioner

    すみません。説明不足でした。
    現在の状態としてページ1では求人は1から5までが表示されており、ページ2では何も求人が表示されておらず、

    <?php else : ?>
            <p>選択された都道府県に該当する求人情報はありません。</p>
        <?php endif; ?>
    

    このコードを打っているので、画面には"選択された都道府県に該当する求人情報はありません。"と
    出ている状態です。
    ということは2ページ目で改めてareaの情報が取得できていない可能性があるかなと思いました。
    ちなみに2ページ目URLの語尾は"test.php?page=2"となっています。

    その対策としてページネーションのコードを下のようにしてみると

    <ul class="pagination">
        <?php for ($i = 1; $i <= $totalPages; $i++) : ?>
            <li class="page-item <?php echo ($i == $currentPage) ? 'current-page' : ''; ?>">
                <a href="?page=<?php echo $i; ?>&area=<?php echo $selectedArea; ?>" class="page-link"><?php echo $i; ?></a>
            </li>
        <?php endfor; ?>
    </ul>
    

    URLの語尾は"test.php?page=2&area=茨城"となりましたが、やはり求人6から10は表示されておらず、"選択された都道府県に該当する求人情報はありません。"となっています。

    ページネーションリンクで遷移するとGETになるので、ここのPOSTパラメータ(選択したエリア)は取れていないと思います。

    POSTではなくGETで取得するべきなのでしょうか?

    ちなみに、

    echo "Current Page: " . $currentPage;
    echo "Start Index: " . $startIndex . "<br>";
    echo "End Index: " . $endIndex . "<br>";
    

    を使ってページごとの各値を見たところ、
    1ページ目はCurrent Page: 1Start Index: 0 End Index: 5 と表示されており、
    2ページ目はCurrent Page: 1Start Index: 0 End Index: 0 と表示されていました。

    これが2ページ目でCurrent Page: 2 Start Index: 6 End Index: 10となれば表示することができるのかなと思っています。

  2. ということは2ページ目で改めてareaの情報が取得できていない可能性があるかなと思いました。

    これに関しては変数$selectedAreaの状態を出力してみればはっきりします。
    イメージではなく実際に確認しましょう。

    エリアの選択が必須であり、かつエリアの情報が取得できていないのであれば、問題がそこにある可能性が高いと思います。

    POSTではなくGETで取得するべきなのでしょうか?

    クエリストリングのパラメータは$_POSTではなく$_GETで取得します。
    areaの受け取りをPOSTとGETの両方に対応するなり、どちらかに統一する必要があるでしょう。

    HTTPメソッドの用途で考えるなら、検索ならばGETが適しています。

    おそらく、最初はフォームでエリアを選択しているのだと思いますが、fromタグからのリクエストはPOSTに限定されません。
    method属性を使うことでGETにもできます。

    これが2ページ目でCurrent Page: 2 Start Index: 6 End Index: 10となれば表示することができるのかなと思っています。

    だと思いますが、まずはその前の処理が正しく機能することを確認したほうが良いです。
    問題を解決するためには、問題のある所とない所をしっかり切り分けることが必要です。

  3. @quatam

    Questioner

    methodをGETにしてみると無事反映させることができました。
    解決していく中でいろいろなことが学べました。
    一つ一つ丁寧にありがとうございました。

コードが読めない状態になっているので、状況を把握するために修正していただく必要があります。
本文はMarkdown形式で記述するため、コードをそのまま記述すると読めない状態になることが多いです。

参考

"Code - コードの挿入"の項を参照してください。

0Like

Comments

  1. @quatam

    Questioner

    ご指摘ありがとうございます。初めて質問をするのでわかりませんでした。
    可能でしたら解決方法を教えていただけると幸いです。

  2. 修正ありがとうございます。コードが確認できました。

Your answer might help someone💌