Jul10:管理画面作成3

更新が遅くなりすみません。

さて、課題は
「最初にすべてレコードをとってくるのではなく、表示する件数だけとってくるようにする。」
「3pに分かれている管理画面表示ページを一つにする」
「getの値に変な値が入っても対応できるようにする」
の3つ。

頑張ったところをメモしておきます。

$sql2 = "SELECT * FROM user_info INNER JOIN pref_info ON user_info.prefid=pref_info.prefid ORDER BY userid ASC LIMIT ?,5";
$sql3 = "SELECT COUNT(*) FROM user_info";

$sql2で、

LIMIT ?,5

とありますが、これを使うことによって、?番目のデータから5つだけデータを取ってきてください。っていう制限をかけることが出来る。試しに、

mysql> select * from user_info inner join pref_info on user_info.prefid=pref_info.prefid order by userid asc limit 0,5;

と打つと、頭から5つ、useridの降順でとってきてくれます。limitの初期値が0なので、注意が必要です。

話を戻して、そのプレースホルダを使って動的にデータをとってこれるようにする。

$sql3は、レコード総数を取ってくるクエリ。ここは特に工夫は無いですが、オブジェクト変数からレコード総数を取り出すやり方は以下、

$sql3_result = $db_connect->query($sql3);
if(DB::isError($sql3_result)){
   $sql3_result->getmessage();
   echo "DBからのレコード件数の取得に失敗しました。<br>";
}
$res = $sql3_result->fetchrow();
$all_records = $res[0];
settype($all_records,"int");

queryメソッドの返り値はDB_resultオブジェクトを返してくるので、そのfethcrowにオブジェクト変数を当ててあげて、配列として$resでとる。とってきた値がstr型だったので、今後のことも考えてint型に変更した。

$perpages = 5;       
$allpages = ceil($all_records/$perpages);   
if(isset($_GET["page"])){
    if(is_numeric($_GET["page"])){
        if($_GET["page"] > $allpages){
            $_GET["page"] = $allpages;
        }elseif($_GET["page"] <= 0){
            $_GET["page"] = 1;
        }
    }else{
         $_GET["page"] =1;
    }
    settype($_GET["page"],"int");
    $current_p = $_GET["page"];
}else{
    $current_p = 1;    
}

$_GET["page"]変数(ここでは数値で入ってきても必ず文字列として返されるらしい。)が入ってきたら、それがまず数字文字列がどうかを判断する。("34"なのか"test")なのか。
数字文字列ならその数字が$allpage(総ページ数)より大きいのか小さいのか、またはマイナスとかゼロとかを入れる不届き者がいないかチェックして、フィルタをかけてあげる。
この時気になったのが、
比較演算子を用いて数字文字列と整数値の比較する時、文字列が数値に変換されること
意外にこういうの大事にした方がよいと思うので、しっかりチェックだ。
まぁ、てな感じで$current_pを正しいページに代入してあげます。

$first_record = (5*$current_p)-5;
$array = array($first_record);
$info_array = $db_connect->getAll($sql2,$array,DB_FETCHMODE_ASSOC);
if(DB::isError($info_array)){
   $info_array->getmessage();
   echo $db_connect->last_query;
   echo "DBからのレコード情報の取得に失敗しました。<br>";
}
$num = count($info_array);
$last_record = $num;

$first_recordは各ページの最初のレコードを指定しています。この$first_recordがプレースホルダの値としてはいります。さっきも書いたけども、LIMITの初期値は0なので、

1P→0,2P→5,3P→10

まぁ一般項が5p-5(p:$current_p)と定まる。
getで配列を取るやり方でプレースホルダを使う時は、その?の数が1つでも配列にしてあげなければいけないので、配列にして、user_infoの配列を取り出している。
$last_recordは何個レコードの値をとったか定義しています。「そんなん5つにきまっとるやんw」とか思うが、最終ページに限り1〜4つしか取れない場合が出来きますんで。