MB-Support

パソコン初心者のサポートページ

掲示板の投稿データに含める日付の形式2


前回 、もし MySQL と PHP を勉強するのであれば、掲示板制作から始めた方が勉強しやすい事を掲載しました。 まず、データベースに格納する投稿日を、RFC822形式「Wed, 22 Mar 2006 19:20:50 +0900」が一番適していると説明したました(管理人の勝手な判断です)。

この形式には曜日情報も含まれているため、あとあと掲示板を加工するのに便利だと思ったのですが、面倒な事にも気が付いてしまいました。 単刀直入に言えば、日付データを昇順/降順に並べ替える事ができない点です。試しに、MySQL にデータベース「test」を作成して、さらにテーブル「test」を作成しました。 この中に日付を格納するカラム「day( タイプ : VARCHAR / 長さ : 31 / )」を作成して6件の日付を入力して「select * from test;」で表示したのが以下です。


mysql> select * from test;
+---------------------------------+
| day                             |
+---------------------------------+
| Wed, 22 Mar 2006 17:03:10 +0900 |
| Wed, 22 Mar 2006 18:03:10 +0900 |
| Wed, 22 Mar 2006 19:03:10 +0900 |
| Tue, 23 Mar 2006 17:03:10 +0900 |
| Fri, 24 Mar 2006 18:03:10 +0900 |
| Fri, 24 Mar 2006 19:03:10 +0900 |
+---------------------------------+

上から日付の古い順になっています。しかし、掲示板は新着順に表示するのが一般的です。 そこで並べ替えを実行してみました。日付の降順(新しい順)に並べ変えてデータを取得するには「select 抽出するカラム(「*」は全てのカラム) from テーブル名 order by 並べ替えの条件(day カラム) desc;」です。


mysql> select * from test order by day desc;
+---------------------------------+
| day                             |
+---------------------------------+
| Wed, 22 Mar 2006 19:03:10 +0900 |
| Wed, 22 Mar 2006 18:03:10 +0900 |
| Wed, 22 Mar 2006 17:03:10 +0900 |
| Tue, 23 Mar 2006 17:03:10 +0900 |
| Fri, 24 Mar 2006 19:03:10 +0900 |
| Fri, 24 Mar 2006 18:03:10 +0900 |
+---------------------------------+

day カラムが日付の新しい順に並べかえられ・・・・ませんね。 RFC822 形式の日付は並べ替えができないの? できる様な気がするのですが、できない様な気もします。 これを日付の新しい順に並べ替えるには、もう一つカラムを使用します。 例えば、投稿ごとに重複しない番号を「number」カラムに格納します。


mysql> select * from test;
+--------+---------------------------------+
| number | day                             |
+--------+---------------------------------+
|      1 | Wed, 22 Mar 2006 17:03:10 +0900 |
|      2 | Wed, 22 Mar 2006 18:03:10 +0900 |
|      3 | Wed, 22 Mar 2006 19:03:10 +0900 |
|      4 | Tue, 23 Mar 2006 17:03:10 +0900 |
|      5 | Fri, 24 Mar 2006 18:03:10 +0900 |
|      6 | Fri, 24 Mar 2006 19:03:10 +0900 |
+--------+---------------------------------+

投稿が新しいほど、「number」カラムに格納される数字は大きくなるはずです。 そこで日付の新しい順に並べ替えるには「number」カラムの数字が大きい順に並べ替えれば可能になります。


 
mysql> select * from test order by number desc;
+--------+---------------------------------+
| number | day                             |
+--------+---------------------------------+
|      6 | Fri, 24 Mar 2006 19:03:10 +0900 |
|      5 | Fri, 24 Mar 2006 18:03:10 +0900 |
|      4 | Tue, 23 Mar 2006 17:03:10 +0900 |
|      3 | Wed, 22 Mar 2006 19:03:10 +0900 |
|      2 | Wed, 22 Mar 2006 18:03:10 +0900 |
|      1 | Wed, 22 Mar 2006 17:03:10 +0900 |
+--------+---------------------------------+

強引にやろうとすれば、これでも立派に掲示板が作れますね。 しかし、日付のデータだけで並べ替えができないのは、後々不便を感じそうです。 日付に英語の「曜日」や「月」情報を直接入力すると、並べ替えができないのか? では日付を数字だけで格納すれば良いのでは?例えば、「曜日」と「日付」を別カラムに格納する場合、「Fri」と「20060324190310(2006年03月24日19時03分10日)」などとすれば、日付カラムだけで並べ替えが可能になります。 しかし、これを後から抽出してPHPで出力するには少々面倒ですね(いくらでも可能ではありますが・・・)。 だったら日付の情報を数字だけで表す上に、曜日も抽出できる方法を使うのが良いでしょう。 どうすれば良いのか?ある一定の日付からの通算時間を記録するのです。ここでポイントなのは年や日付ではなく、経過した時間だけを記録する事です。 これは、1970 年 1 月 1 日 00:00:00 (GMT)からの通算秒を記録する「UNIXタイムスタンプ」と呼ばれる形式です。


UNIXタイムスタンプを取得するには以下。


time();

これを変数「$time」に、print で出力する場合は以下。

<?php
$time = time();
print ("$time");
?>

このファイルを WEB サーバーにアクセスして(127.0.0.1やlocalhost)、ブラウザで表示すると右上画像の様に表示されます。 通算時間なので、掲示板の投稿データを一緒に格納すれば、事実上、日付による並べ替えが可能になります。



今度は MySQL に格納された「UNIX タイムスタンプ」を取り出し、掲示板で表示する日付の形式に加工します。 日付を表示する部分に「1143158435」などとそのまま表示しても意味不明ですから。


MySQLから取り出したUNIXタイムスタンプ:


1143158435

変換後:


2006年3月24日 (Fri) AM 09:32:04

やり方は、MySQLから取り出したUNIXタイムスタンプを変数「$time」に代入します。


$time = "1143158435"

変数「$time」を「2006年3月24日 (Fri) AM 09:32:04」の形式に変換するには以下の命令になります。「Y」は4桁の年、「n」は1〜12までの月、「j」は1〜31までの日、「D」はSun〜Satまでの英語の曜日、「A」は大文字のAM/PM、「h」は2桁の12時間制の時間、「i」は00〜59までの分、「s」は00〜59までの秒に変換します。


date('Y年n月j日 (D) A h:i:s',$time)

出力したい場合は以下。


print ("".date('Y年n月j日 (D) A h:i:s',$time)."");

上で現在の UNIX タイムスタンプを格納した変数「$time」に入れ替えるなら以下。


$time = date('Y年n月j日 (D) A h:i:s',$time);

「2006/03/22」に変換したい場合は以下。


$time = date('Y/m/j',strtotime($time));

「'Y/m/j'」の記号を変更するだけ表示を変更できます。よく使うフォーマットは以下。


指定する文字 機能
a am か pm を表す
A AM か PM を表す
d 2桁の日付 01 〜 31
D 3文字の曜日 Sun 〜 Sat
F 月名 January 〜 December
g 1桁の12時間制の時間 1 〜 12
G 1桁の24時間制の時間 0 〜 23
h 2桁の12時間制の時間 01 〜 12
H 2桁の24時間制の時間 00 〜 24
i 2桁の分 00 〜 59
j 1桁の日 1 〜 31
l フルネームの曜日 Sunday 〜 Saturday
m 2桁の月 01 〜 12
M 3文字の月 Jun 〜 Dec
n 1桁の月 1 〜 12
s 2桁の秒数 00 〜 59
w 数値の曜日 0 (Sunday) 〜 6 (Suturday)
Y 4桁の年 2006
y 2桁の年 06

RSS の PubData(コメントが投稿された日時)に埋め込むために変換する場合は以下。


$time = date('D, j M Y H:i:s +0900',$time);

結果は以下。RFC822 形式の日付に変換できました。


Fri, 24 Mar 2006 13:15:14 +0900

下は MySQL に「UNIXタイムスタンプ」を 6 件格納して表示した場合です。掲示板に投稿された日付なので、上から古い日付順になります。 「UNIXタイムスタンプ」だけだと並べ替えられたのか解釈するのが面倒なので、カラム「number」も表示しています。日付の新しい順に並べ替える事ができれば、カラム「number」の数字が大きい順になるはずです。


mysql> select * from test;
+--------+---------------------------------+
| number | day                             |
+--------+---------------------------------+
|      1 | 1143174359           |
|      2 | 1143174772           |
|      3 | 1143175772           |
|      4 | 1143184772           |
|      5 | 1143214772           |
|      6 | 1143224662           |
+--------+---------------------------------+

日付の降順(新しい順)に並べ変えてデータを取得するには「select 抽出するカラム from テーブル名 order by 並べ替えの条件(day カラム) desc;」です。


mysql> select * from test order by day desc;
+--------+------------+
| number | day        |
+--------+------------+
|      6 | 1143224662 | ← Sat, 25 Mar 2006 03:24:22 +0900
|      5 | 1143214772 | ← Sat, 25 Mar 2006 00:39:32 +0900
|      4 | 1143184772 | ← Fri, 24 Mar 2006 16:19:32 +0900
|      3 | 1143175772 | ← Fri, 24 Mar 2006 13:49:32 +0900
|      2 | 1143174772 | ← Fri, 24 Mar 2006 13:32:52 +0900
|      1 | 1143174359 | ← Fri, 24 Mar 2006 13:25:59 +0900
+--------+------------+

まぁ〜、実行するまでもなく、あたり前の結果ですね。 日付が新しい順に並べ替えられました。これでカラムの「number」に依存しないで、カラム「day」だけで並べ替えが可能になります。


単純に掲示板を作ると言っても、1 から自分で制作する事になると、その仕様を全て自分が知る事にないます。 いろんな機能を付け足していくうちに、いつしかブログみたいな機能や表示方法へと変貌する可能性もあります。 投稿データを RSS として発行する様になれば、投稿データごとのアドレスも必要になりますし(そこまでやらなくても別にいい)、投稿の親に当たるスレッド、スレッドに対するレス(返信)などを考えていく事になるでしょう。 「UNIX タイムスタンプ」で日付データを記録した場合、日付を単位の抽出方法が管理人には分かりません。 とりあえず・・・これで掲示板を作ってみましょう・・・・・いつしか更新。





BTOパソコン・ゲームPC・自作パソコンなら【TSUKUMO】 - 自作PCに必要なパーツ、豊富な品揃え

Copyright © 2013 MB-Support パソコン初心者のサポートページ All Rights Reserved.

管理人サイト閲覧方法プライバシーポリシー著作権/免責事項