3.ページ分岐を作ろう〜制御構造
あなたネスケ派?

最近ではあまり使わなくなったかも知れないMSIEとNNのブラウザによる分岐をさせてみましょう。
それには if 〜 else 文を使います。名のとおり、「もし〜なら**、そうじゃないなら**」という意味です。

簡単な例−変数$aが5以上なら上の文を表示します

if ($a > 5) {
  echo "aは5よりも大きい";
} else {
  echo "aは5よりも大きくない";
}

で、今回「もしMSIEならindex.htmlへジャンプ、そうじゃない(IE以外)ならindex2.htmlへジャンプ」というのを作成してみます。

「もしMSIEなら」という部分の判別には、「もし変数$HTTP_USER_AGENT(ブラウザ情報)に文字列’MSIE’が含まれていたら」と置き換えることが出来ます。

文字列’MSIE’を判別するには、正規表現関数ereg() を使ってマッチさせます。

ページへジャンプさせるには、header() 関数をつかってリダイレクトさせます。
まとめると次のようになります。exitはプログラムの終了です

if ( ereg ("MSIE", $_SERVER["HTTP_USER_AGENT"])){ 
  header("Location: index.html");
  exit;
} else {
  header("Location: index2.html");
  exit;
}
注:文字列の判定にeregを使ってますが、正規表現を使わない場合はstrstr関数でいいと思います。
if ( strstr ($_SERVER["HTTP_USER_AGENT"], "MSIE")){←書き方が逆

携帯電話で分岐

今度は携帯電話のブラウザ種類によるページ分岐を作ってみましょう。 サンプルはこちら

<?
 1|$ua = $_SERVER["HTTP_USER_AGENT"];
 2|if(ereg("DoCoMo",$ua)){           
 3|  header("Location: http://example.com/i.php");
 4|  exit;
 5|}elseif(ereg("J-PHONE",$ua)){     
 6|   header("Location: http://example.com/j.php");
 7|   exit;
 8|}elseif(ereg("UP\.Browser",$ua)){ 
 9|  header("Location: http://example.com/ez.php");
10|  exit;
11|}elseif(ereg("PDXGW",$ua)){       
12|  header("Location: http://example.com/h.php");
13|  exit;
14|}else{ 
15|  header("Location: index.php");
16|  exit;
17|}?>

いきなり答え書いてしまいましたが、1行目から見ていきましょう。

1|$ua = $_SERVER["HTTP_USER_AGENT"];
のちのち書きやすくする為、ブラウザ変数$_SERVER["HTTP_USER_AGENT"]を $ua という変数に入れます。

2|if(ereg("DoCoMo",$ua)){
3| header("Location: http://example.com/i.php");
4| exit
;
i-modeの判別をします。「DoCoMo」という文字がブラウザ情報にあれば、i.phpにリダイレクトさせます。

5|}elseif(ereg("J-PHONE",$ua)){
ここで elseif というのが出てきました。elseif は if 文でマッチしなかった後でさらに評価したい場合に使います。
この場合「DoCoMo」という文字が入ってなかって、さらにもし「J-PHONE」という文字があるかどうか評価します。

つづいて、Ez-Web、H"の分岐をさせます。
UP\.Browser これは'.'(ドット)が正規表現で任意の一文字を表すのでエスケープします。

14|}else{
15|header("Location: index.php");
16|exit;
17|}?>

最後にどの携帯ブラウザにもマッチしなかったら、index.phpにリダイレクトさせます。
尚このスクリプトは試してないので、実際にうまく動くかわかりません

if 文はこんな感じですが、次のように書くこともできます。

if($aaa) echo '$aaa には何か値が入ってます。TRUEです';
if(!$bbb) echo '$bbb には何もはいってません。FALSEです';

// ↑のは次の式と同じ意味です。一行なら括弧は省略できます
if($aaa==TRUE){ echo '$aaa には何か値が入ってます。TRUEです'; }
if($bbb==FALSE){ echo '$bbb には何もはいってません。FALSEです'; }

変数のセット関する評価は次の式を参考にして下さい

$var = 0;
if ( empty($var) ) { // trueと評価された場合
    print '$var は 0 か 空です';
}
if ( !isset($var) ) { // falseと評価された場合
    print '$var は 設定されてません';
}
ループ処理

ついでにループ処理も覚えてしまいましょう。ループ処理とは、くりかえしの作業をひとつにまとめてしまう事です。

forループは次のようになります

for ( $i=1; $i<=10; $i++ ){
  echo $i;
}
実行すると 12345678910 と表示します。式の意味は「最初に1を代入して($i=1)、10より小さい間($i<=10)、$iを1ずつ増やしていく($i++)」という事です

つまり括弧の中(echo $i;)を10回繰り返すのです。


forを使って、配列の中身をすべて表示させるには次のように書けます

$arr = array(1,2,3,4,5,6,7,8,9,10);

for ( $i=0; $i<sizeof($arr); $i++){
  echo $arr[$i];
}
sizeof()は配列の数をかぞえる関数です。配列は[0]からなので $i=0 から始めます。ここでsizeof($arr)の値は10となります。0からスタートしたので、9でループを終わるためには $i<sizeof($arr)[10] とすればいいのです。

forの括弧の中身には、別に$iをいれなくてもOKです。10回"アホ"と出力されます

for($i=0; $i<10; $i++){ echo "アホ"; }

whileループもforと同じ動作をします。以下は1から10を表示します

$i = 1;
while ($i <= 10) {
  echo $i;
  $i++;
}

forより解釈は単純です「$i が10以下の間、括弧の中をくりかえす」
詳しく書くと、最初$iに1を代入して表示。1足して10以下なので括弧の中実行。つまり2表示1足して3。10以下なので・・・ という具合です。

whileの場合は括弧の中で$i増やさないとダメです。

while($j<10){ echo "バカ";$j++; }

if文でちょっと追加。よく使う演算子を紹介します。

if($a == $b){ echo "$aと$bは等しい"; }
if($a != $b){ echo "$aと$bは等しくない"; }
if($a && $b){ echo "$aと$bはともにTRUE"; }
if($a || $b){ echo "$aと$bのどちらかがTRUE"; }

よく使うのはこの4つです。「&&」の変わりに「and」、「||」の変わりに「or」が使えます「eq」は使えません。
優先順位をつける場合は括弧を使いましょう。詳しくは第10章演算子をご覧下さい

某所で使用している携帯振り分けの方法です。

$host = gethostbyaddr(getenv('REMOTE_ADDR'));

if(preg_match("/\.(ido|ezweb)\.ne\.jp$/",$host)){
	$env = "au"; // EZweb WAP2.0 端末用の処理
}elseif(preg_match("/docomo\.ne\.jp$/",$host)){
	$env = "i"; // i-mode 用の処理
}elseif(preg_match("/vodafone\.ne\.jp$/",$host)){
	$env = "v"; // Vodafone 用の処理
}elseif(preg_match("/jp-[cdhknqrst]\.ne\.jp$/",$host)){
	$env = "j"; // Vodafone 旧機種用の処理
}else{
	$env = "pc"; // それ以外
}

この他に良く使う構文としてforeach構文があります。foreach構文は配列を展開するためにつかいます。

$arr = array(1,2,3,4,5,6,7,8,9,10);
foreach ($arr as $num){
  echo "$num<br>";
}
// 配列のキーも使う場合
$arr['赤'] = '#FF0000';   $arr['緑']='#00FF00';    $arr['青'] = '#0000FF';
// 上と同じ意味です
//$arr = array('赤'=>'#FF0000','緑'=>'#00FF00','青'=>'#0000FF');

foreach ($arr as $key=>$val){
  echo "<option value='$val'>$key</option>\n";
}



<<Prev  Next>>


LastModified