phpの案件でデータを10件ずつ表示されて次のデータを表示するときに「次」「前」とかページ送りにするけど、そうではなくて「1,2,3,4」と連番をふっていくような仕組みを作成したときのメモ。
ただ自分で試してみた簡易バージョン。CSVで管理した場合なのでデータベースの場合はプログラムが変わってくる
ページ送りするときに必要な変数
ページ送りにするときに、必要な変数を用意する。最大データ表示数を格納する変数など
$id=0; //クリックした時の番号を格納する変数
$max=5 //データを表示する最大 1ページに5件。
$pageNum=0 //取得したデータが何ページになるかを格納する変数
$start=0; //データを表示位置の番号を格納する 2ページ目は6番目のデータから。
$end=0; //データの表示終了位置を格納する。 2ページ目だと10番目のデータまで。
$total=0; //データの総数を格納する変数。
$counter=0; //データの最初の行は不要なのでそれを省くために1行ごとにカウントさせて0番目以外を処理する
$datalist=arrray(); //csvで管理してるので一行ごとのデータをまとめるための多次元配列
といった具合に変数を用意しておく
ページ送りに必要なロジック部分を作成する
今回はcsvからデータを取り出してるが、全体の流れを下記のような流れで割り出す
- クリックした番号を$idに格納する
- csvから配列$dataに一行分のデータを抜き出しそれをまとめた多次元配列$datalistに格納する
- $totalにcount()関数で配列総数を格納
- $totalを$maxで割った整数が$pageNumとなる
- クリックされた番号に$maxをかけた数値を割り出し$startに格納
- $startに$maxを足すことで$endを割りだし格納する
$csvfile="csv/test.csv";
if(!empty($_GET["id"])){
$id=$_GET["id"];
}else{
$id=0;
}
$fp= fopen($csvfile,"r") or die("file open error");
flock($fp, LOCK_EX);
//
while($data=fgetcsv($fp,4000,",")){
//最初の一行は列の説明のため不要
if($counter!=0){
array_push($datalist,$data);
}
//
$counter++;
}
flock($fp,LOCK_UN);
fclose($fp);
//
$total=count($datalist); //データの総数
$pageNum= ceil($total/$max); //ページの総数
$start=$id*$max; //データ表示の開始位置
$end=$start+$max; //データ表示の終了位置 開始位置から5つのデータ
ページ送りのナビゲーションを作成
$pageNumさえ割り出せれば、ナビゲーションの作成は簡単なので説明不要です。
クリックデータは$_GETで送信させます。クリックしたidは配列インデックスが0から始まるが表示は1番目から表示させます。(配列のインデックスが0番目から始まるので・・)
データを表示させる
csvからデータを5つずつ表示させるロジック。ポイントは$startと$endがポイントになります。
上記で$startと$endの割り出し方を書きましたが、両方の変数を元にfor文で$datalistの配列のインデックス番号をずらすことでデータ表示させてます。
番号:".$id."|名前:".$name."|年齢:".$age."|職業:".$job."";
}
}
?>