会員制サイトphp+mysqlに関する質問です。

登録したユーザーの情報はテーブル(User)に記録されています。
テーブル(User)のフィールドは以下の4つです。
()内がフィールド名です。

会員コード(UserCD) text
パスワード(Pass) text
ニックネーム(Name) text
登録日時(Joined) datetime

独自タグAtimeとBtimeは以下の通りです。

if (date('H') >= 0 && date('H') <= 17)
$Atime = TRUE;
else
$Btime = TRUE;

##Atime##現在AM0時からPM6時の間です##Atime##
##Btime##現在AM0時からPM6時以外の間です##Btime##

##Atime##に囲まれた文字列はAM0時からPM6時までの間表示され
##Btime##に囲まれた文字列はそれ以外の時間帯に表示されます。

上記をカスタマイズし、登録日時から3日以内(72時間)である会員はAtime
登録日時から3日以上経過した会員はBtimeとしたいです。
登録日時はJoinedに記録されています。

ご教授いただけると幸いです。
よろしくお願い致します。

MySQL - 5.0.45

回答の条件
  • 1人3回まで
  • 登録:2009/05/20 14:26:59
  • 終了:2009/05/23 14:24:13

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/05/20 20:32:52

ポイント100pt
$query = "
    SELECT CASE WHEN NOW() > DATE_ADD(Joined, INTERVAL 3 DAY) THEN 'A' ELSE 'B' END TAG
    FROM User
    WHERE UserCD = 'kn1967'
";
$rs = mysql_query($query);
$row = mysql_fetch_row($rs);

$Atime = FALSE;
$Btime = FALSE;
if ($row[0] == 'A' && date('H') >= 0 && date('H') <= 18) {
    $Atime = TRUE;
} elseif($row[0] == 'B' && date('H') > 18) {
    $Btime = TRUE;
}

現在日時 now() と joined+3日(72時間)を比較して

AもしくはBを返すというSQLを使った例ですが

動作確認せずに投稿しておりますので適宜調整願います。

id:xptree

回答ありがとうございます。

参考になりました。

説明不足ですいません、この場合SELECT文は必要ありませんでした。

if (現在日時 > 登録日時より3日加算した日時)

のみで構いません。

会員それぞれのJoinedは$Joinedに格納されています。

既に会員それぞれの情報を取得していることが前提です。

とりあえず自分で適当に当てはめてみたのが

if (getdate() > date_add($Joined, interval 3 day))

なのですが

この場合の正しい書き方を教えて頂けたら幸いです。

よろしくお願い致します。

2009/05/21 09:51:53

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/05/20 20:32:52ここでベストアンサー

ポイント100pt
$query = "
    SELECT CASE WHEN NOW() > DATE_ADD(Joined, INTERVAL 3 DAY) THEN 'A' ELSE 'B' END TAG
    FROM User
    WHERE UserCD = 'kn1967'
";
$rs = mysql_query($query);
$row = mysql_fetch_row($rs);

$Atime = FALSE;
$Btime = FALSE;
if ($row[0] == 'A' && date('H') >= 0 && date('H') <= 18) {
    $Atime = TRUE;
} elseif($row[0] == 'B' && date('H') > 18) {
    $Btime = TRUE;
}

現在日時 now() と joined+3日(72時間)を比較して

AもしくはBを返すというSQLを使った例ですが

動作確認せずに投稿しておりますので適宜調整願います。

id:xptree

回答ありがとうございます。

参考になりました。

説明不足ですいません、この場合SELECT文は必要ありませんでした。

if (現在日時 > 登録日時より3日加算した日時)

のみで構いません。

会員それぞれのJoinedは$Joinedに格納されています。

既に会員それぞれの情報を取得していることが前提です。

とりあえず自分で適当に当てはめてみたのが

if (getdate() > date_add($Joined, interval 3 day))

なのですが

この場合の正しい書き方を教えて頂けたら幸いです。

よろしくお願い致します。

2009/05/21 09:51:53
id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/05/22 10:36:18

ポイント50pt
if (time() > strtotime($Joined) + 3*24*60*60) {
  $Atime = TRUE;
} else {
  $Atime = FALSE;
}
$Btime = !$Atime;

$JoinedがDATETIMEなら、上でいけると思います。

id:xptree

回答ありがとうございました。

無事できるようになりました。

助かりました。

2009/05/23 14:20:01
  • id:kn1967
    質問文からコピペして不要箇所削るの忘れてました。
    if ($row[0] == 'A' && date('H') >= 0 && date('H') <= 18) {
         ↓
    if ($row[0] == 'A' && date('H') <= 18) {

  • id:kn1967
    phpでは データベースのdatetime型に相当するものはなく
    中身としては数値が格納されているだけなので
    秒数を足したり引いたりすることで計算ができます。

    一日は 60秒 x 60分 x 24時間 = 86400秒 なので3日ならば
     86400 * 3 秒(259200秒としても結構ですが
    メンテナンス時に判りづらいので 86400 x 日数としておく場合が多いです。)

    現在日時の取得はtime関数を使います。
    getdate関数は、時分秒などをバラバラにして連想配列に入れたい場合などに使います。

    結論としては
      if (time() > $Joined + 86400 * 3) {
    となります。
  • id:xptree
    何度も回答してくださってありがとうございます。
    とても助かります。
    $Joined + 86400 * 3はなぜか2009年にしか加算されないようです…
    echo "$Joined";
    の場合は正確に2009-05-21 19:06:07のように表示されるのですが
    $Joined2 = $Joined + 86400 * 3;
    echo "$Joined2";
    の場合は261209と表示されてしまいます。
    秒ではなく年に加算されてしまいます…
    このような場合どうしたらよいでしょうか?
    何度も申し訳ありません。
    ご教授いただけると幸いです。
  • id:kn1967
    既に sphire 氏が回答を寄せてくださっておりますので蛇足ではありますが・・・

    >echo "$Joined";
    >の場合は正確に2009-05-21 19:06:07のように表示される

    $Joined の中身が日時をあらわす数値ではなく
    文字列が入っているため単純に計算する事が出来なかったわけです。

    挙動確認用のサンプルプログラムを作ってみましたので確認してみてくださいませ。
    echo "数値として変数に保持されている場合の挙動";
    $Joined = time();
    echo "<br />(1)そのままの形で出力<br />";
    echo $Joined;
    echo "<br />(2)フォーマットして出力<br />";
    echo date("Y/m/d H:i:s", $Joined);
    echo "<br />(3)3日分を足して、そのままの形で出力<br />";
    echo $Joined + 86400 * 3;
    echo "<br />(4)3日分を足して、フォーマットして出力<br />";
    echo date("Y/m/d H:i:s", $Joined + 86400 * 3);
    echo "<hr />";
    echo "文字列として変数に保持されている場合の挙動";
    $Joined = date("Y/m/d H:i:s");
    echo "<br />(1)そのままの形で出力<br />";
    echo $Joined;
    echo "<br />(2)フォーマットして出力<br />";
    echo date("Y/m/d H:i:s", $Joined);
    echo "<br />(3)3日分を足して、そのままの形で出力<br />";
    echo $Joined + 86400 * 3;
    echo "<br />(4)3日分を足して、フォーマットして出力<br />";
    echo date("Y/m/d H:i:s", $Joined + 86400 * 3);
  • id:xptree
    kn1967さん何度もありがとうございました。
    詳しく書いて頂いて理解も深まりました。
    少ないですが、気持ち多めにポイントを加算させて頂きました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません