※ ChatGPTを利用し、要約された質問です(原文:phpphp,mysqlページングについて)
phpphp,mysqlページングについて
このQ&Aのポイント
phpファイルでのページング機能についての質問です。1ページ目は正常に表示されるが、2ページ目以降の表示ができず、データ保持ができないとのことです。
初心者のため、ページングのロジックが理解できないため、記述で教えていただきたいとのことです。
検索後にページング機能を作成しようとしていますが、うまくいっていません。ページの表示数や前後のページへの移動などを実装したいです。
1つのphpファイルで作成を考えています。検索後(if($subsub){}を消せば)でなければページング機能は、可能です。1ページ目は、正常に表示しますが、2ページ目以降表示できません。データ保持ができません。同じ類の質問は、たくさん出てると思いますが・・・初心者ということもあり、ロジックがまだわかっていないのでできれば記述で教えていただければ幸いです。よろしくお願いします。
検索項目は、1項目で省略していますが、本来4~5項目で考えています。
<?php
// データベースに接続する
省略
$test = $_POST[test];
echo'
<form method="POST" action="".$_SERVER["PHP_SELF"]."">
<tr>
<input type="text" name="test">
<td><input type="submit" value="検索" name="subsub"></td>
</form>
';
//検索ボタンを押したら表示
if((isset($_POST['subsub']))or(isset($_GET['p'] ))){
//ページング処理
//総レコード数を取得する
//条件がある場合は、where 条件式を書く
$sql = "SELECT COUNT(*) AS reccnt FROM faq;";
$res = mysql_query($sql, $conn) or die ("データ抽出エラー");
$row = mysql_fetch_array($res, MYSQL_ASSOC);
$reccnt = $row["reccnt"];
//取り出す最大レコード数
$lim = 3;
//最初と最後のページ番号を定義
$first = 1;
$last = ceil($reccnt / $lim);
//表示するページ位置を取得
$p = intval($_GET['p']);
if ($p < $first) {
$p = $first;
}
elseif ($p > $last) {
$p = $last;
}
//表示するレコード位置を取得
$st = ($p - 1) * $lim;
//前後のページ移動数と表示数
$page = 3;
//前後$pageページ移動した際のページ番号を取得
$prev = $p - $page;
$next = $p + $page;
//前後1ページ移動した際のページ番号を取得
$prev1 = $p - 1;
$next1 = $p + 1;
//SELECTコマンドを実行して、$stレコード目から$lim件の各データを取得し、大きい順に並べる
$sql = "SELECT test FROM testtest WHERE test like '$test' ORDER BY id DESC LIMIT $st, $lim;";
$res = mysql_query($sql, $conn) or die ("データ抽出エラー");
echo'
<table border="1">
<tr>
<td>ID</td>
<td>テスト</td>
</tr>
';
//取得したデータを一件ずつ表示
while($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
echo'
<tr>
<td>'.$row["id"].'</td>
<td>'.$row["test"].'</td>
</tr>
';
}
echo '</table>';
//ページ移動リンクの組み立て
//1ページ前のページ
if ($p > 1) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev1\"><</a></font> ";
}
//各ページ番号への移動リンクを表示
for ($cnt = $p - $page; $cnt <= $last; $cnt++) {
if ($cnt < 1) {
$cnt = 1;
}
$pageno = "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$cnt\">$cnt</a></font> ";
//表示番号を指定数に区切る
//ページ番号と現在のページが同一の場合は
//リンク無しにする
if ($cnt <= $p + $page) {
if ($cnt == $p) {
$pageno = "<font size=\"1\">$p</font> ";
}
echo $pageno;
}
}
//1ページ後のページ
if (($next1 - 1) * $lim < $reccnt) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next1\">></a></font> ";
}
echo "<br>\n";
//最初のページへ移動
if ($p > 1) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$first\">最初</a></font> ";
}
//前の$pageページへ移動
if ($p > $page) {
// << を $page"."ページ戻る にする事もできる
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev\"><<</a></font> ";
}
//次の$pageページへ移動
if (($next - 1) * $lim < $reccnt) {
// >> を $page"."ページ進む にする事もできる
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next\">>></a></font> ";
}
//最後のページへ移動
if ($p < $last) {
echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$last\">最後</a></font> ";
}
}
?>
お礼
ご指摘ありがとうございます!