プロが教えるわが家の防犯対策術!

ご覧いただきありがとうございました。
初心者です。今まで、form action=" " method="post"によるページ転移してます。
仮に、今、begin.php, a.php, b.php, c.php, end.phpの5つのページがあって、begin.phpから初めて、a.php, b.php, c.phpランダムの順番で転移したあと、最後end.phpに辿り着くのがやりたいことです。
上記を実現する方法がありますか?php, js等と併用するのは無論大丈夫です。

どうぞご指導のほどよろしくお願いします!

A 回答 (6件)

>もしa,b,cだけではなく、結構数の多い場合は



定型処理はリストをつくっておいてforeachなどで回せばよいでしょう

$elements=array("a","b","c");
foreach ($elements as $val){
if(isset($_POST[$val])) $_SESSION[$val]= $_POST[$val];
}
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2014/06/16 10:46

>PATH_INFOでやるのなら、具体的にどうやれば良いのですか?


 これが一番単純で分かりやすい方法でページ数が増減しても関係ない方法です。私はPerlですので、PHPでも同じ方法で出来ます。

1) hoge というPHPファイルを作成します。拡張子はつけないほうがスマートでしょう。
2) それをサイトの特定のディレクトリに置きます。
 .htaccessにて
   hogeファイルをPHPとして動作するよう指定する。
   index.php をDIRECTORY INDEXに指定する。
 これで、hoge/index.htmlまたは、ファイル名指定なしでhogeを要求されると、hogeが実行されて表示される。URL欄は、****/hoge/ または、**/hoge/indexhtmlになる。
4) サブページを隠しフォルダーに入れる。
ここから・・

3) hogeの内容、フローチャート□(処理)、<>判断、○端子
 □ 環境変数 PATH_INFOがあれば記憶しておく
  □ 環境変数 HTTP_COOKIEを解釈しておく(例 b>d>a>c> )
  □ サブフォルダーを開いて、中にあるファイルの一覧を用意する。
 <PATH_INFOの値>
  ├ ○ /a.php、b.php、c.php・・などの場合(例)b.php
  │ HTTP_COOKIE が "b>d>a>c>だったら、次はa.php
  |  リンク文字列を $LINK = '<a href="./a.php">Aに</a>'などにする。
  | 開くファイル名を $FILE = b.phpとする。
  └-○ それ以外
    サブフォルダーのファイル名をランダムに並べる
    cookieを作る。
     リンク文字を$LINK = '<a href="./b.php">BAに</a>'などにする。
    開くファイル名を $FILE = b.phpとする。
 □ $Fileをインクルードする。その時にリンク部分は書き換える。

 COOKIEの有効期間は、セッション間で良いでしょう。期間を設けても良いかも。


 ブラウザのURL欄とページ内リンクには、上記配列(b>d>a>c)の場合、普通に
****hoge/ ないし****hoge/index.php
  <a href="b.php">Bへ</a>

****hoge/b.php
  <a href="d.php">Dへ</a>

****hoge/d.php
  <a href="a.php">Aへ</a>

****hoge/a.php
  <a href="c.php">Cへ</a>
となります。
 PATH_INFOは動的なサイトの場合、とてもよく利用される手法です。大規模なサイトはほとんどすべてPATH_INFOと考えてよいです。



    
    • good
    • 0
この回答へのお礼

いろいろご指導頂きまして、ありがとうございました!

お礼日時:2014/06/16 10:45

全然違う質問ということでよろしいですね?



>今までのやり方で$_SESSION['a'] = $_POST['c']となってしまし

フロー上そうはならないでしょう?

ポストで飛んできたデータを継承するだけであれば

if(isset($_POST['a'])) $_SESSION['a']= $_POST['a'];
if(isset($_POST['b'])) $_SESSION['b']= $_POST['b'];
if(isset($_POST['c'])) $_SESSION['c']= $_POST['c'];

のようにしておけばいいのでは?
もしくは前回例示したvisitedのように、追記していくような方法でもよいかと

この回答への補足

ご回答ありがとうございます!
この方法知りませんでした、お陰で一応問題が解決できそうです。
しかし、毎度毎度すいませんが、もしa,b,cだけではなく、結構数の多い場合は、どうすればよろしいですか?全部そのように書くのは確かに問題ないですが、なんだか効率的によくない感じです。

補足日時:2014/06/11 19:00
    • good
    • 0
この回答へのお礼

自分としては大問題の中の小問題として捉えてますが。
毎度毎度ありがとうございます!

お礼日時:2014/06/11 19:01

>もっと具体に



では、こんな感じで
formだとちょっとわかりづらいのでアンカーしときます。
formでやるならactionに指定してください

//begin.php
<?PHP
session_start();
unset($_SESSION["visited"]); //セッションvisitedの初期化
$list=array("a.php","b.php","c.php"); //listの初期値
$_SESSION["list"]=$list; //listをとりあえずセッションに保存
$key=mt_rand(0,count($list)-1); //ランダムにファイルを選んで
$href=$list[$key]; //飛び先に指定
?>
<a href="<?PHP print $href;?>">next</a>

//a.php、b.php、c.php・・・とりあえず同じ内容で
<?PHP
session_start();
$list=$_SESSION["list"]; //listを受け取る
$fname=basename($_SERVER["SCRIPT_NAME"]); //自分自身の名前を受け取る
$visited=isset($_SESSION["visited"])?$_SESSION["visited"]:array(); //visitedが空の場合の初期設定
$key=array_search($fname,$visited); //visitedの中に、自分自身がいるかチェックして
if($key!==0 and empty($key)) array_push($visited,$fname); //いなければvisitに追加
$list=array_merge(array_diff($list,$visited)); //listからvisitを除外して
$key=mt_rand(0,count($list)-1); //残ったlistからランダムに選ぶ
$href=count($list)>0? $list[$key]:"end.php"; //listが空ならendにいく
$_SESSION["visited"]=$visited; //visitedは上書きしておく
?>
<a href="<?PHP print $href;?>">next</a><br>
<?PHP
print implode($visited,"-&gt;"); //念のため経路表示しときます
?>

この回答への補足

詳しくご指導頂きありがとうございます!
恐れ入りますが、また補足問題があります。
今まで、SESSIONでデータを保存してきました。
a.phpでpostしたあと、b.phpで$_SESSION['a'] = $_POST['a']のやり方で。
しかし、ランダムの順番となったら、例えばcからbに行く時、今までのやり方で$_SESSION['a'] = $_POST['c']となってしまします。この問題を解決する方法はありますか?

補足日時:2014/06/11 11:04
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2014/06/11 11:04

セッションを利用して、とおってきた経路を記録していけばよいでしょう

この回答への補足

ご回答ありがとうございます!
すいません、初心者なので、セッションはぎりぎりしかできませんので、もっと具体に教えていただけばと思います。

補足日時:2014/06/10 16:30
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2014/06/11 10:56

単純にPATH_INFOで・・cookieと併用すると効率的かも。


hogeという実行ファイルがあるとする。
 PATH_INFO index.htmlまたは、ない時に乱数を作り、順番を作成してcookieを発行する。最初のページ用のリンクを合わせて作る。<a href="./a.html">次ぎ</a>
 hoge/a.htmlでcookieを読み、次のリンクを作る。

 10行もあればよいかと。

この回答への補足

ご回答ありがとうございます。PATH_INFOでやるのなら、具体的にどうやれば良いのですか?

補足日時:2014/06/11 10:57
    • good
    • 0
この回答へのお礼

ありがとうございます!

お礼日時:2014/06/11 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!