15.MyQSLのレコードを後ろから表示してみる。
チャットなどでメッセージを表示する場合、表示順が新しいメッセージは上のほうに、古いメッセージは
下のほうに表示される。
いわゆるLILO(末尾に追加書き込み、末尾から前方読み込み)になっている。
ここでは、データベースに末尾に追加で書き込まれたレコードを逆転して表示する方法について学びます。
1)レコードポインタを知る。
ここでは、指定したレコードポイントのレコードに移動する方法を学びます。
SELECT文で取り出されたレコードに対して、指定したレコードポインタのレコードに移動する関数が
mysqli_data_seek(読み込んだレコード,レコードポインタ)である。
<書式>mysqli_data_seek(読み込んだレコード,レコードポインタ);
レコードポインタの先頭は0から始まります。
<ファイル名:recordPointer.php>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>レコードポインタを知る。</title>
</head>
<body>
<?php
$conn=mysqli_connect('localhost','root','*****') or print("データベースに接続できませんでした。<br>");
mysqli_select_db($conn,'userid_db') or print("データベースが存在しません。<br>");
$sql="select * from userid_tbl;";
$result=mysqli_query($conn,$sql) or print("SQLが実行できませんでした。<br>");
//数値添字配列
$row=mysqli_fetch_array($result,MYSQL_NUM);
printf("%s %s %s %s<br><hr>",$row[0],$row[1],$row[2]," 初めてmysqli_fetch_array()を実行したので最初のレコード(レコードポインタ:0)が取り出されている。");
//連想配列(フィールド名で呼び出し)
$row=mysqli_fetch_array($result,MYSQL_ASSOC);
printf("%s %s %s %s<br><hr>",$row["id"],$row["userName"],$row["passWd"]," 2回目のmysqli_fetch_array()の実行なので2番目のレコードレ(コードポインタ:1)が取り出されている。");
//全てのレーコードの取り出し、前の行で取り出したレコードの続きになっていますか?
while($row=mysqli_fetch_array($result,MYSQL_ASSOC)){
printf("%s %s %s %s<br>",$row["id"],$row["userName"],$row["passWd"]," 3回目以降、最後のレコードまでmysqli_fetch_array()を実行しているので、残りのすべてのレコードが取り出されている。");
}
//mysqli_fetch_array()を実行するたびにレコードポインタがインクリメントされていますか?
print("<hr>");
//指定したレコードの取り出し
mysqli_data_seek($result,2); //レコードポインタを2にしているので、3番目のレコードが取り出される。
$row=mysqli_fetch_array($result,MYSQL_ASSOC);
printf("%s %s %s %s<br><hr>",$row["id"],$row["userName"],$row["passWd"]," レコードポインタを2にしているので、3番目のレコードが取り出されている。");
mysqli_close($conn);
?>
</body>
</html>
2)mysqli_data_seek()を使ってレコードの順を逆に表示する。(ファイル名:recordReverseDisp1.php)
<考え方>
①SELECT文で取り出されたレコードがいくあるかを調べる。
mysqli_num_rows(読み込んだレコード)
②取り出されたレコードの数が仮に5レコードの場合。
mysqli_data_seek(読み込んだレコード,レコードポインタ)の、レコードポインタは、0から4になる。
③レコードポインタの最後の番号から前方に向かってレコードポインタを移動しながら表示させる。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>mysqli_data_seek()を使ってレコードの順を逆に表示する。</title>
</head>
<body>
<?php
$conn=mysqli_connect('localhost','root','*****') or print("データベースに接続できませんでした。<br>");
mysqli_select_db($conn,'userid_db') or print("データベースが存在しません。<br>");
$sql="select * from userid_tbl;";
$result=mysqli_query($conn,$sql) or print("SQLが実行できませんでした。<br>");
//$resultのデータを後ろから読む。
//SELECT文で読み込まれたレコード数を調べている。
$rowNum=mysqli_num_rows($result);
while($rowNum>0){
//レコードポインタを設定している。(最後のレコードポインタに移動している。)
//($rowNum-1にしているのは、レコードポインタが0から始まるからです。)
mysqli_data_seek($result,$rowNum-1);
//指定したレコードを読み込んでいる。
$row=mysqli_fetch_array($result,MYSQL_ASSOC);
printf("%s %s %s<br>",$row["id"],$row["userName"],$row["passWd"]);
//レコードを前方に移動するためにデクリメントしている。
$rowNum--;
}
mysqli_close($conn);
?>
</body>
</html>
3)select * from userid_tbl order by フィールド名 descを使ってレコードの後ろから前方に向って取り出す。
SELECT文のORDER BY フィールド名 DESCを使って、データベースのレコードを降順で読み込む方法で処理する。
ORDER BY フィールド名 ASCを使えば、データベースのレコードを昇順に読み込むが、
デフォルトでこの処理になるので、特に書く必要はありません。
<ファイル名:recordReverseDisp2.php>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>select * from userid_tbl order by フィールド名 descを使ってレコードの後ろから前方にとりだす。</title>
</head>
<body>
<?php
$conn=mysqli_connect('localhost','root','*****') or print("データベースに接続できませんでした。<br>");
mysqli_select_db($conn,'userid_db') or print("データベースが存在しません。<br>");
$sql="select * from userid_tbl order by id desc;";
$result=mysqli_query($conn,$sql) or print("SQLが実行できませんでした。<br>");
while($row=mysqli_fetch_array($result,MYSQL_ASSOC)){
printf("%s %s %s<br>",$row["id"],$row["userName"],$row["passWd"]);
}
mysqli_close($conn);
?>
</body>
</html>
<課題1>3)のプログラムをテーブルを使って表示できるようにしなさい。(ファイル名:recordReverseDispExp.php)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>select * from userid_tbl order by フィールド名 descを使ってレコードの後ろから前方にとりだす。(テーブル版)</title>
</head>
<body>
<?php
$conn=mysqli_connect('localhost','root','*****') or print("データベースに接続できませんでした。<br>");
mysqli_select_db($conn,'userid_db') or print("データベースが存在しません。<br>");
$sql="select * from userid_tbl order by id desc;";
$result=mysqli_query($conn,$sql) or print("SQLが実行できませんでした。<br>");
print("<table border='1'>\n");
print("<tr>\n");
print("<th>id</th><th>userName</th><th>passWd</th>\n");
print("</tr>\n");
while($row=mysqli_fetch_array($result,MYSQL_ASSOC)){
print("<tr><td>".$row["id"]."</td>");
print("<td>".$row["userName"]."</td>");
print("<td>".$row["passWd"]."</td></tr>\n");
}
print("</table>\n");
mysqli_close($conn);
?>
</body>
</html>