人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpに関する質問です。
アクセス毎にランダム文字列を発生させるには
$Random = round(rand(1,3));
switch($Random){
case 1:
$Random = "A";break;
case 2:
$Random = "B";break;
case 3:
$Random = "C";break;
}
としているのですが
日毎にランダム文字列を発生させるにはどうしたらよいでしょうか?
今日は何度アクセスしても同じ文字列で
明日は昨日と異なる文字列が何度アクセスしても同じになる
これを実現するソースコードを書いて頂ければ幸いです。
よろしくお願い致します。

●質問者: xptree
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CASE PHP Rand switch アクセス
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● kn1967
●19ポイント

前回アクセスしてきた日を相手のパソコン上に記憶させます。

その仕組みとしてcookieというものがあります。

とほほのCookie入門

(サーバ側でパソコンを特定する事は出来ないため

パソコン側のcookieにて情報を保持してもらって

次回以降、その情報を元に同じパソコンかどうかを判断させます)


以下ではクッキーに LastAccess と Random という2つの値を持たせています。

流れとしては

(1)LastAccess が存在すれば アクセス日と比較して

前回も本日中であれば Random を読み取ります。

(2)Randomが""ならば新たに生成します。

(3)最終アクセス日を新たにセットしなおします。

ただし、動作確認せずにいきなり回答しておりますので

最下部マニュアルなどを参照しながら適宜対応してくださいませ。

<?php
// (0)変数準備
$now_time = time();// アクセス時刻
$now_date = gmdate("Ymd", $now_time); // アクセス日
$Random = "";

// (1)クッキー読み取り
if (isset($_COOKIE['LastAccess'])) {
 if ($_COOKIE['LastAccess'] < $now_date) {
 if (isset($_COOKIE['Random'])) {
 $Random = $_COOKIE['Random'];
 }
 }
}

// (2)文字列生成
if ($Random == "") {
 $Random = round(rand(1,3));
 switch($Random){
 case 1:
 $Random = "A";break;
 case 2:
 $Random = "B";break;
 case 3:
 $Random = "C";break;
 }
}

// (3)クッキーに保存させる(生存期間はアクセス時刻から24時間)
setcookie("LastAccess", "$now_date", $now_time + 24 * 3600);
setcookie("Random", "$Random", $now_time + 24 * 3600);

// (4)表示
echo $Random;
?>

※生存期間は期間を区切らず永続的にというのも可能ですが、適当な期間をいれるのが慣例。

(本日か、それとも前日かが判れば良いので24時間としています)

PHP: $_COOKIE - Manual

PHP: setcookie - Manual

PHP: gmdate - Manual


2 ● GoldenDawn
●19ポイント

まず、いくつかの中から選ぶというのは配列にして array_rand や shuffle を使うと語句を増減した際に Case とかいちいち書かずにすむので楽です。

乱数は srand という初期化関数があり、同じ値で初期化すると同じパターンで乱数を生成します。これに date を用いて年月日で乱数を初期化してみました。

<?php
srand(date('Ymd')) ;

$words = array('Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo') ;
$put = $words[array_rand($words)] ;

echo $put ;
?>

3 ● Mook
●18ポイント

お使いのPHPのバージョンはいくつでしょうか。

プログラムが発生する乱数は、疑似乱数なので通常初期化関数(乱数のシード(seed)設定)を最初に呼び出す必要があります。


ただ、PHP では 4.2 以降内部的にこの処理を行っているので、普通に呼び出すだけでランダムな数列を得られるはずなのですが、

変わらないということであれば、バージョンが古いか、日付で srand を呼んでいるためだと思います。


バージョンが 4.2 以降であれば、上記の関数を削除してください。

バージョンがこれより前のバージョンであれば、

srand(time());

のように現在時間で初期化する処理を追加してみてください。

http://always-pg.com/php/std_rd/number/srand.html


4 ● pahoo
●18ポイント

$Random にはアルファベット1文字が入るという想定で回答します。

今日の日付(yyymmdd)の md5 ハッシュ値を取り出し、その先頭2バイトを使ってアルファベット1文字を取り出す方法を以下に示します。

$table の内容、長さは自由に変えることができます。ただし、マルチバイト文字(日本語)は利用できません。

$table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //このうち1文字を返す
$d1 = date('Ymd'); //今日の日付
$d2 = md5($d1); //MD5ハッシュ値
$d3 = hexdec(substr($d2, 0, 4)) % strlen($table);
$Random = substr($table, $d3, 1); //適当な1文字

5 ● scrap49
●18ポイント

日付を取得

$date = strftime("%Y-%m-%d %T");

類推されないようにkeywordを追記

$date = $date . "keyword";

MD5でハッシュ値を求める

$hash = md5($date);

先頭から5文字切り出す

$Random = substr($hash, 0, 5)

生成するランダム文字列が重複する可能性に付いては考慮されてません。

http://q.hatena.ne.jp/1243445473


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ