Home > Archives > May 2012

May 2012

PHP 演算子 (2)

  • 2012-05-30 (Wed)
  • PHP
今回も、演算子の続きを紹介します。
算術演算子は、加減乗除などの計算に使う記号と同じですので、特に問題なく使えますね。
例えば、変数$aにもう一度$aの値を足したい場合は次のように記述できます。
 $a = $a + $a または  $a .= $a
もし、$aの値が「10」であれば、$a = $a + $aでは「20」になりますが、$a .= $aの値は「2020」となります。「.」は連結演算子であり文字列をつなげる処理を行いますので、数字であっても文字列として扱うからです。
よって、数字を計算したいのであれば「$a = $a + $a」と記述することになります。

しかし、「$a = $a + $a」の記述は効率よい書き方ではありません。そこで、プログラムでは複合演算子という次のような書き方があります。
 $a = $a + $a → $a += $a
 $a = $a - $a → $a -= $a
 $a = $a * $a → $a *= $a
 $a = $a / $a → $a /= $a
 $a = $a % $a → $a %= $a
等号「=」の前に記号を記述することで、左辺の値に右辺の値で計算処理した結果を再度左辺に代入するということになります。
仮に$aの値を「5」として、再度$aの値を足すときには次のように書けます。
 $a = $a + $a;  結果は「10」
 $a += $a;    結果は「10」
どちらの書き方がスマートであるかというと下の方ですね。しかも、処理の速さも下の書き方の方が速いと言われています。
この複合演算子は、算術演算子と連結演算子を合体させた書き方になります。

次に「加算子/減算子」を紹介します。これは、被演算子(オペランド)の値を「1」だけ増減させるための演算子です。加算子をインクリメント、減算子をデクリメントと呼びます。これには4つの種類があります。
 ++$a 前置加算子 「$a」に「1」を足して、その結果を返します。
 $++a 後置加算子 「$a」の値を返し、「$a」に「1」を足す。
 --$a 前置減算子 「$a」から「1」を引いて、その結果を返します。
 $a-- 後置減算子 「$a」の値を返し「$a」から「1」を引く。
加算子と減算子には前置と後置の2つがあるという事になります。どのように処理されるか、少し分かりづらいので次の例を見てください。
<?php
 $a = 10;
 echo ++$a;
 echo "<br>";
 echo $a;
?>

20120530-p01.jpg
結果の図を見るとどちらとも「11」という結果を出力しています。
「echo ++$a;」は「$aに1を加算させてから出力する」という意味になります。よって、その後の「echo $a;」は、すでに1足されている$aの値が出力されます。この前置加算子は、変数に「1」を足してから処理することになります。

次は、後置加算子を見てみましょう。
<?php
 $a = 10;
 echo $a++;
 echo "<br>";
 echo $a;
?>

20120530-p02.jpg
結果の図を見ると、「echo $a++;」の出力が「10」でその後に記述している「echo $a;」の出力は「11」となっています。
つまり、「echo $a++;」は、「$aを出力(処理)した後に1を足す」ということになり、結果は10となります。その後、1が足された結果として「echo $a;」の出力が11となります。これが後置加算子です。

前置減算子、後置減算子もプラスがマイナスに変わっただけで同じ考え方になります。
<?php
 $a = $b = 10;
 echo --$a;
 echo "<br>";
 echo $a;
 echo "<br>";
 echo $b--;
 echo "<br>";
 echo $b;
?>

20120530-p03.jpg
最初が前置減算子で、1を引いてから処理を行います。次が後置減算子で処理をしてから1を引くことになります。だから、変数$bは「10」なので、その「10」をいう値を表示してから1を引き、その後の「echo $b;」で$bから1を引いた$bが出力されることになります。

前置型の書き方は以下の省略となっていると考えてください。
 $a = $a + 1 → $a += 1 → ++$a
 $a = $a - 1 → $a -= 1 → --$a

加算子、減算子は繰り返し処理の時に良く利用されます。
<php
 for($i=1;$i<=5;$i++){
  echo $i."<br>";
 }
?>

20120530-p04.jpg
上の例では、後置加算子になっていますが、「++$i」という前置加算子でも結果は同じです。
他のプログラミングでも加算子、減算子は存在しますので、基礎の演算子であることは理解できるかと思います。

PHP 演算子 (1)

  • 2012-05-27 (Sun)
  • PHP
前回は演算子とは何か?ということを紹介しました。その最初として「代入演算子」である「」記号は、「右辺の値を左辺に代入し、その値を返す」ものであるということは理解できたと思います。

今回は、文字列演算子と代数演算子について紹介します。文字列演算子は「連結演算子」、代数演算子を「算術演算子」とも呼びます。ここでは、一般的に呼ばれる、連結演算子・算術演算子という名称を使います。

連結演算子は、文字列をつなげるもので、「.(ピリオド)」を使います。
例えば、「こんにちは」と「お元気ですか」という2つの文字列をつなげたい時は次のように記述します。
 "こんにちは" . "お元気ですか"
文字列はダブルクォーテーションで囲み、つなげる文字列の間にピリオドを記述します。

では、簡単な例を紹介します。
<?php
 $a ="Hallo" . "!!";
 echo $a;
 echo "<br>";
 echo $a .= "!!";
 echo "<br>";
 echo $a .= $a;
?>

20120527-p01.jpg
見て分かるように、文字列をつなげたものを一旦変数に格納します。上の場合は、$aという変数を使用しています。
最初は、「Hello」と「!!」を繋げた文字列が表示されます。次に、「 $a .= "!!"」という記述があります。
これは、連結代入演算子となり、$aに「 "!!"」をつなげて、再度$aの処理をしています。つまり、次の記述を省略したものになります。
 $a =$a . "!!" →  $a .= "!!"
また、3つ目の「$a .= $a」は、$aの値をもうひとつつなげるという書き方になるので、文字列を繰り返したいときの書き方です。

次に算術演算子は、日頃使用している計算記号になります。算術演算子は5つあり、以下のような種類があります。
  加算演算子(両オペランドを足した値を返す)
  減算演算子(左辺と右辺の差の値を返す)
  乗算演算子(左辺と右辺の積の値を返す)
  除算演算子(左辺と右辺の商の値を返す)
  剰余演算子(左辺を右辺で割った余りの値を返す)

簡単な例を紹介します。
<?php
 $a = 10;
 $b = 3;
 echo "$a+$b=".$c=$a+$b."<br>";
 echo "$a-$b=" .$c=$a-$b."<br>";
 echo "$a*$b=" .$c=$a*$b."<br>";
 echo "$a/$b=" .$c=$a/$b."<br>";
 echo "$a%$b=" .$c=$a%$b."<br>";
?>

20120527-p02.jpg
上の例を見てもらったよう、計算結果が変数$cに代入されて表示されます。

連結演算子、算術演算子ともプログラミングを記述する時には基本的な処理ですので、問題なく解釈しておきましょう。

PHP 演算子とは

  • 2012-05-23 (Wed)
  • PHP
今週21日の金環日食・・あいにくの雨で見れませんでした。
本州では見れたところもあったようで、TVのLIVEで見ましたが、やはり綺麗でしたね。
直接、見たかった!という感想です。

昨日、「ワイルド7」なる邦画を鑑賞しました。
最初の出だしは「おお!」っと思うほど、展開の成り行きに期待をしましたが、何か物足りない終わり方でした。無理な展開と不自然な銃撃戦がそう思わせたのかもしれませんが。
まぁ、見る人によって評価は異なるでしょう。

今回から演算子について書いていきます。さまざまなプログラミングで利用される演算子は、同じような使い方や異なる解釈があるようです。
ここではPHPの演算子という立場で書いていきます。
第25回 演算子とは
演算子は「オペレータ」とも呼ばれ、演算の対象となる「被演算子(オペランド)」を評価して、その結果を返すものです。
つまり、プログラミングによって演算(加減乗除など)内容を指示する記号が演算子です。それに対して演算の対象となる値や変数、引数などを被演算子と言います。
「X+100」という式であれば、「X」と「100」がオペランド(被演算子)で、「+」が演算子(オペレータ)です。

演算子の種類には以下のようなものがあります。
  • 代入演算子

  • 代数演算子(算術演算子)

  • 文字列演算子(連結演算子)

  • 加算子/減算子

  • 比較演算子

  • 条件演算子

  • 論理演算子

  • 配列演算子

  • エラー制御演算子

  • ビット演算子

  • 実行演算子

各演算子はそれぞれ演算対象(オペランド)の数が決まっていて、その数によってオペランドが1つの場合は「単項演算子」、2つの場合は「2項演算子」、3つの場合は「3項演算子」と呼ばれます。
PHPで使える演算子は50個あまり存在しますが、上の11種類に分類されるようです。

では、今回はその中の代入演算子を紹介します。
代入演算子
代入演算子は「=」(イコール)です。
例)$a = 1000;
上の例の中での演算子は「=」です。$aと1000が被演算子(オペランド)になります。一般的な計算では「=」は「等しい」という表現となりますが、プログラミングの世界では「代入する」という意味になります。
要約すると、代入演算子が行う処理は「左辺(第1オペランド)の値を右辺(第2オペランド)に値を代入し、代入した値を返す」ということになります。

では、次のようなコードを紹介します。
<?php
 $box = $hako = "Hello!";
 echo $hako;
 echo "<br />";
 echo $box;
?>

ブラウザでレンダリングすると以下のように出力されます。
20120523-p01.jpg
$box = $hako = "Hello!";」の部分で代入演算子を使っています。これの説明をしますと、最初に「$hako = "Hello!";」の部分が処理され、代入演算子(=)は、結果として代入した値を返すので、この部分の変数$hakoの値は「Hello!」となります。
そして、もう一つの代入演算子によって「$box = "Hello!";」が処理されます。このように、代入演算子は1か所に複数ある場合は、右側から順に処理されます。
代入演算子(=)は「右辺の値を左辺に代入する」と覚えておきましょう。という事は、通常左辺には変数(値を代入する入れ物)を記述することになります。

では、「等しい」という記号は何かというと「==」または「===」となります。これは比較演算子になりますので後日に紹介します。

代入演算子のないプログラミングはないでしょう。また、プログラミングは演算子の羅列と考えても良いでしょうね。比較的理解しやすいものなので、身に付けておきたいですね。

PHP HTTP認証

  • 2012-05-20 (Sun)
  • PHP
今日は、PHPにおけるHTTP認証の紹介をします。認証にはいくつかの種類があるようなのですが、ここでは最もポピュラーなベーシック認証を取り上げます。

通常、ユーザがホームページにアクセスした場合は、Webサーバはリクエストのページをそのままレスポンスして、ブラウザに表示される仕組みです。
認証とは、ある情報を持っている人でなければ、表示をしてくれない仕組みです。よくあるのが、会員だけ閲覧できるページ等です。
一般にユーザ名とパスワードを知っている人でなければ、そのページを閲覧できないので、いろんな意味でセキュリティを付けているという考え方です。

ベーシック認証は、ユーザ認証が必要なページにアクセスした時に「Authorization」ヘッダの有無を確認します。
PHPで確認するには、スーパーグローバル変数の「$_SERVER」の値をチェックします。この$_SERVER変数は、ヘッダ、パス、スクリプトの位置などの情報を有する配列変数です。
この配列の中の「PHP_AUTH_USER」に対応する値の有無を利用します。

$_SERVER変数のPHP_AUTH_USERの有無を調べるには次のように記述します。
if (!isset($_SERVER['PHP_AUTH_USER'])){
  // 認証のためのユーザ名がない時の処理
}

isset関数は、変数がセットされているかを確認するもので、頭に「!」を付けると「セットされていない」という判断になる。
ifステートメントを使って、処理を分岐しますが、もし、「Authorization」ヘッダがなければ、認証ダイアログをブラウザ上で表示させ、Webサーバからクライアントへ指示を出します。これには「header関数」を使って下のように記述します。
if (!isset($_SERVER['PHP_AUTH_USER'])){
 header('WWW-Authenticate:Basic realm="Private Page"');
 header('HTTP/1.0 401 Unauthorized');
}

「header関数」はHTTPヘッダをクライアントへ送信するための関数です。上のように記述すれば、クライアントのブラウザ上に認証画面を表示させるものだと考えてください。

認証画面が表示されたら、ユーザ名とパスワードを入力することになりますが、ユーザによってはキャンセルボタンを押すかもしれません。その時は、ページを見るには認証が必要であるというメッセージを表示させるようにします。
キャンセルしてプログラムを終了させ、メッセージを表示させるときは「die関数」を使います。
die('ページを表示するには認証が必要です。');


確認画面でユーザ名とパスワードを入力して、OKボタンを押したときの処理を考えます。この時、ユーザ名とパスワードの両方とも正しい入力がされている必要があります。どちらか片方でも間違えてしまうとページを表示させないようにするには、ifステートメントのelseの処理に以下のようなコードを記述します。
if($_SERVER['PHP_AUTH_USER'] !=$id || $_SERVER['PHP_AUTH_PW'] !=$pwd){
 header('WWW-Authenticate:Basic realm="Private Page"');
 header('HTTP/1.0 401 Unauthorized');
 die('正しい入力を行ってください。');
}

ここでは、ユーザ名、またはパスワードが一致しなければ、プログラムを終了してメッセージを表示させています。

では、これまでのコードを組み合わせたコードは以下のようになります。
<?php
 $id = "user";
 $pwd = "passOK";

 if(!isset($_SERVER['PHP_AUTH_USER'])){
  header('WWW-Authenticate:Basic realm="Private Page"');
  header('HTTP/1.0 401 Unauthorized');
  die('ページを表示するには認証が必要です。');
 }else{
  if($_SERVER['PHP_AUTH_USER'] !=$id || $_SERVER['PHP_AUTH_PW'] !=$pwd){
   header('WWW-Authenticate:Basic realm="Private Page"');
   header('HTTP/1.0 401 Unauthorized');
   die('正しい入力を行ってください。');
  }
 }
?>
<html>
 <head><title>ようこそ</title></head>
 <body>
 <p>こんにちは<?php echo $_SERVER['PHP_AUTH_USER']."さん";?>。ようこそ!</p>
 </body>
</html>

ブラウザにアクセスすると以下のように表示されます。
20120520-p01.jpg
もし、キャンセルボタンが押されると以下のようにブラウザ上に表示されます。
20120520-p02.jpg
ユーザ名とパスワードが正しく入力されるとページの内容が表示されます。
20120520-p04.jpg
もっともシンプルな認証ですが、これだけでも少しだけですがセキュリティを思わせるページになります。

ただし、ユーザ名とパスワードは他のファイルに記述するか、またはデータベース機能を使って認証する方法をお勧めします。

PHP - $_COOKIE -

  • 2012-05-17 (Thu)
  • PHP
来週の5月21日月曜日は金環日食が見られるらしいです。175年ぶりに日本で見られるそうで、次は300年後ぐらいになるとか・・。見るに値するかもしれませんね。

しかし・・、現在の天気予報では曇り/雨のようです。その前後は天気が良さそうなので、間の悪い日にちになりそうです。日本ではけっこう広い範囲で見られるそうですから、どこかではしっかりと見られるのでは。でも、見たいですね。
その日のために、日食用のグラスを買った方も多いようです。もし、見れなかったら、そのグラスは何に使えるのでしょうか?^^;

今回のPHPは、スーパーグローバル変数の$_COOKIEについて紹介します。
第24回 $_COOKIE
COOKIEは、Webサーバとブラウザで取り交わされる情報で、これによって動的なホームページが実現できます。$_COOKIEは、現在のスクリプトにHTTPクッキーから渡された変数の配列です。

Cookieに値を保存するには、setcookie関数を使用します。書式は次のようになります。
setcookie(name,value[,expire][,path][,domain][,secure][,httponly])

引数の数は多いですが、必須なのは、クッキーの名前と値です。
 name:クッキーの名前
 value:クッキーの値。この値がクライアントのPCに保存される。
 expire:クッキーの有効期限。保存期間を1日にするには、time()+60*60*24をセット。
 path:サーバ上でのクッキーを有効としたいパスを指定。
 domain:クッキーが有効なドメインを指定。
 secure:セキュアなHTTPS接続の場合のみクッキーが送信されるには、TRUEを設定。
 httponly:TRUEを設定すると、HTTPを通してのみクッキーにアクセスできる。
もし、この関数を宣言する前に何かしらの出力がある場合は、setcookie()は失敗し、FALSEを返します。また、この関数でユーザがクッキーを受け取ったかどうかを判断することはできない。

では、簡単な例を紹介します。test_1.phpのページで、クッキーを設定し、test_2.phpのページに遷移したら、クッキーの値を表示させます。
test_1.php
<?php
 $value = "Cookie Data";
 setcookie("cdata",$value,time()+60);
?>
<html>
 <body>
 <p><a href="test_2.php">確認画面へ</a></p>
 </body>
 </html>

20120517-p01.jpg
test_2.php
<html>
 <head></head>
 <body>
 <p><?php echo "クッキーデータ:". $_COOKIE["cdata"];?></p>
 </body>
</html>

20120517-p02.jpg
結果から分かるように、遷移元のページのクッキーの名前をアクセス先のページで指定すると、クッキーの値が表示されることになります。また、有効期間を1分にしていますので、1分を経った時にtest_2.phpをリロードするとクッキーの値は表示されなくなります。
20120517-p03.jpg

次のサンプルコードは、フォームで入力した値をクッキーの値として保管し、それを表示させるコードを1ファイルで記述したものです。
<?php
 $cookie_value = $_POST["name"];
 setcookie("key",$cookie_value)
?>
<html>
 <body>
  <form action="sample.php" method="post">
   <p><input type="text" name="name" value="" /> 
   <input type="submit" value="送信" /></p>
  </form>
  <?php
   if (isset($_POST["name"])){
    echo "クッキーの値は".$_COOKIE["key"]."です。";
   }else{
    echo "";
   }
  ?>
 </body>
</html>

まず、POST属性で送信された「name」を変数$cookie_valueに格納し、setcookieのクッキーの値にセットします。この時のクッキー名は「key」を指定しています。
html内では、フォームを形成し、テキストボックス名を「name」としています。
PHPコード内では、IFステートメントを使って、POST送信のnameという名前に値がセットされていたら、クッキーの名前を指定して値を表示させます。
もし、名前がない場合は何も出力させない(空白)を出力させます。つまり、最初にこの初めてページにアクセスした時は、POST送信していないので、$_POST["name"]の値は存在しませんので、IFステートメントで分岐処理をさせます。
結果は次のようになります。まず、test_1.phpにアクセスして、「LOOK ME!」などという任意の値を入力して、送信します。
20120517-p04.jpg
送信すると、同ページに入力されたクッキーの値が表示されます。
20120517-p05.jpg

ページを遷移して、閲覧しているユーザ名を各ページに表示させておくことが可能です。例えばログインして自分のページにアクセスすると、ブラウザの上の方に自分のログイン名などが表示されているのを見たことがあると思います。
この表示はログインしているときだけ表示させ、ログアウトすると表示させない仕組みなどに利用できると思います。
また、クッキーの保存期間を1ヶ月ぐらいにしておけば、1ヶ月以内にログインした時は自分のユーザー名を入れなくても、ログインできるメリットも含まれます。

ただし、クッキーはブラウザに保管されるので、他の方がそのブラウザを使って成りすまし的なことができるので、セキュリティ的に疑問が出ます。
もし、1台のパソコンで複数の方が利用されるようであれば、クッキーの事も考慮してブラウザを閲覧する必要があるでしょうね。

PHP - $_SESSION - (2)

  • 2012-05-15 (Tue)
  • PHP
地震が続きますね。各地で起こる震度3以上の地震発生をよく聞きます。昨日も部屋にいた時に、ドンという音とともに揺れました。
地震のほどは、震度3だということでしたが、やはり怖いです。

東北の震災から1年半余りたちますが、いつ起こってもおかしくない自然現象ですから、備えあって憂いなしの精神で備えましょう。

さて、今回は前回に続き$_SESSIONについて紹介します。PHPでは、セッションを用いた遷移を頻繁に使います。
第23回 $_SESSION (2)
あるページの情報を遷移したページで利用するためにセッションを用います。セッションの開始は、session_start関数です。この関数を使うとセッション機能が使えることは前回紹介しました。
session_start関数を宣言すると、セッションIDを作成します。セッションIDはランダムな32文字の数字です。では、そのセッションIDの中身を見たい時は、session_id関数を使います。
session_id関数は、セッションIDを取得して返します。もし、存在しない場合は、空文字を返します。

では、簡単なコードで紹介します。
「test_1.php」のページで、セッションを開始して、作成されたセッションIDを出力しています。
<?php
 session_start();
?>
<html>
 <head></head>
 <body>
 <p><?php echo "セッションID:". session_id();?></p>
 <p><a href="test_2.php">ページへの遷移</a></p>
 </body>
</html>

20120515-p01.jpg
ページにアクセスした時にセッションが開始されて、セッションIDが作成されます。このセッションIDはWebサーバ上で作られてセッションファイルに保管されます。そのセッション情報をWebサーバは、アクセスしたブラウザに返して、クッキーとしてブラウザに保管させます。
「test_1.php」のページのリンクは「test_2.php」へ遷移(ジャンプ)します。「test_2.php」のコードは以下の通りに記述します。
<?php
 session_start();
?>
<html>
 <head></head>
 <body>
 <p><?php echo "セッションID:". session_id();?></p>
 </body>
</html>

20120515-p02.jpg
「test_2.php」のページの先頭にsession_start()を記述しています。これは、遷移元(test_1.php)のセッションを復元するために記述しています。そして、遷移元で作成されたセッションIDを出力しています。
二つのページのセッションIDが同じであることが確認できます。これで、test_1.phpの情報が、test_2.phpへちゃんと伝わったことになります。

セッションの伝わり方をもう一つ見てみます。
「test_1.php」と「test_2.php」のコードを見てください。
test_1.php
<?php
 session_start();
 $_SESSION["no"] = 2500;
?>
<html>
 <head></head>
 <body>
 <form action="test_2.php" method="post">
 <p><input type="text" name="password" value=""></p>
 <p><input type="submit" value="送信"></p>
 </form>
 </body>
</html>

20120515-p03.jpg
test_2.php
<?php
 session_start();
 $_SESSION["password"] = $_POST["password"];
?>
<html>
 <head></head>
 <body>
 <p><?php echo "no:". $_SESSION["no"];?></p>
 <p><?php echo "パスワード:". $_SESSION["password"];?></p>
 </body>
</html>

20120515-p04.jpg
test_1.phpのページでは、フォームでパスワードを入力させます。と同時に、セッションのNoを設定しています。
test_2.phpでは、遷移元から取得したパスワードを一旦セッションの中に移して、表示しています。また、セッションのNoも遷移元で指定された数字が表示されます。

基本的には、フォームを使った送信であれば$_POSTや$_GETとして格納されたname属性の値を$_SESSIONの配列に格納して、それをページ内で利用する形態をとることが多いです。
遷移元でセッション情報が設定されているのであれば、そのまま$_SESSIONを使って取得した情報を利用します。

セッションの使い方は多用しますし、あらゆるところで欲しい情報が利用できます。

PHP - $_SESSION -

  • 2012-05-12 (Sat)
  • PHP
5月にしては、冷たい風が吹いているようで、肌寒さを感じます。

昨日、「ステキな金縛り」という邦画を見ました。三谷幸喜監督のコメディ映画で、楽しく鑑賞できました。キャストは、これまで三谷監督の映画に登場している常連の俳優さんだらけでしたが、それぞれの個性がしっかりとして、それも一つの味わいがあったと感じました。
一つひとつに笑いのネタが仕組んであり、そのたびに顔がほころんでしまう映画でした。久々に頭を真っ白な状態で楽しめました。

今回は、セッション変数となる$_SESSIONを2回に分けて紹介します。今回はその1回目とします。
第22回 $_SESSION (1)
ユーザが使用するブラウザとWebサーバとの間で継続した通信を行う時に、セッションと言われる機能を多用しています。
通常、閲覧しているホームページはページごとにセッションは切られます。Googleで料理のレシピを閲覧している場合、カボチャのレシピを見てから、キャベツのレシピを見たとします。まず、ブラウザはカボチャのレシピページにアクセスすると、Webサーバはそのページをブラウザに転送し、転送を終えたらそこで一旦ネットワークは切断されます。次にキャベツのレシピページに移動する時、ブラウザは再度Webサーバと通信を開始してそのページを要求します。するとWebサーバはその要求に対して応答をして、キャベツのレシピページをブラウザに転送してくれます。
このように、ホームページの閲覧はページが表示されたら、その時点で一旦通信は切断されます。もし、そのまま繋がっているとすると、サーバに負担をかけてしまい、世界中からのアクセスに対応できなくなります。

しかし、皆さんがショッピングモールに行って買い物をされる場合、買い物をするページと送り先の情報を入力するページは違いますよね。このような時は、買い物をするページで何を購入するのかというデータを、送り先情報のページにも伝える必要があります。
この時に使用するのがセッションという事になります。

セッションは、Webサーバとブラウザ間で継続した通信を行え、クッキー機能を利用したものとなります。
セッション機能を使うには、$_SESSIONというスーパーグローバル変数を利用し、それに値を格納します。この$_SESSIONは連想配列としてWebサーバ上のファイルに保管します。
また、PHPのsession_start関数は、ブラウザから送られてくるクッキーの値を元にして、どのブラウザかを特定し、そのブラウザ専用のセッション変数を復元させます。

セッションの流れ

1.ユーザがtest_1.phpにアクセスします。これは初めてのリクエストとなります。

2.test_1.phpは、次のように記述されているとします。
<?php
 session_start();
 $_SESSION["no"]= "abc";
?>
<html>
 <head></head>
 <body>
  <p><a href="test_2.php">確認ページへ</a></p>
 </body>
</html>

20120512-p01.jpg
session_start()関数は、初めてのアクセスか、2回目以降のアクセスかを判別して、初めてであればセッションIDを作成します。セッションIDは32文字のランダムな数字で、アクセスを特定するものです。
このセッションIDを元にして$_SESSIONに格納された値を保持するためのファイルをWebサーバ上に生成します。この時点では、ファイルの中身は空になります。

3.そして、$_SESSION["no"]= "abc";というコードで、noというキーに「abc」という文字列をセッションファイルに書き込みます。

4.次にWebサーバはアクセスしてきたブラウザに対してレスポンスを送ります。このレスポンスのヘッダ内にセッションIDが記載されます。

5.ブラウザはWebサーバから送られてきたレスポンスの中身を見て、セッションIDが含まれていたらそれをクッキーとして保存します。

6.次にtest_2.phpにアクセスする時は、自動的にクッキーの値をWebサーバに通知します。

7.test_2.phpの記述は以下だとします。
<?php
session_start();
echo $_SESSION["no"];
?>

WebサーバはセッションIDを受け取ると、session_start関数はセッション変数を復元させます。そして、セッションIDがWebサーバに保存されていたセッションファイル内に存在していれば、ファイルの中身を取り出します。

8.sessio_start関数の後に、$_SESSIONが復元され、「no」というキーの値を取り出して、echo関数で出力され、それをユーザのブラウザにレスポンスします。
20120512-p02.jpg
大体の流れが理解できたでしょうか。

まとめてみると、session_start関数は、「セッションを開始します」という宣言で、これを記述しないと$_SESSION変数はセッション機能を使えません。
セッション変数の受け渡しは、ユーザが任意のキーを使って、同一のセッションで共有した値として用いることができます。
 $_SESSION["Key"] = 100;
上の例では、Keyというセッション変数に「100」を代入します。このkeyは同一のセッションで共有できるので、遷移したページで値となっている「100」を利用できることになります。

また、セッションを終了したい場合があります。例えば、管理画面などでログインページでユーザIDとパスワードを入力して、それらを管理画面内で遷移していくページで使っているとします。管理画面から抜けるにはログアウトします。ブラウザの閉じるボタンを押してしまうと、実はクッキーとして残っている場合があり、他の人が覗き見ることができてしまいます。
そこで、ログアウトする時に、すべてのセッションを削除して、セッションファイルを削除する必要があります。
セッションを終了するには以下の記述をします。
 $_SESSION = Array();  
これは、空の配列をセッションに入れることにより、データのない状態にします。
 session_destroy();
生成されているセッションファイルを削除します。
通常は、この2つを記述しておくと良いでしょう。

PHP - $_GET $_POST -

  • 2012-05-10 (Thu)
  • PHP
最近の天候は最悪みたいです。東日本は竜巻、雷雨、強風の被害が多数発生しているようです。この時期では珍しく強い寒気が北から降りてきて、南から暖かい空気が昇り、それらがぶつかる箇所で被害が発生しているようです。

地球温暖化・・という話は以前から聞いていますが、温暖化と言っても地球すべてが暖かくなるわけではなく、地球は絶えずバランスを維持しようとして、どこかが暑くなれば違うところは寒くなるというように、それらの差が激しい様子見たいです。
地球にやさしい行動をしたいものですね。

今回は、PHPでは必須となるグローバル変数の$_GETと$_POSTを紹介します。
第21回 $_GET $_POST
通常、ブラウザからの要求には2種類あります。ひとつがGETメソッド、もう一つがPOSTメソッドです。
ユーザの要求はブラウザのform要素で記述され、そのmethod属性の部分でどちらのメソッドを使用するかを指定しています。

PHPがフォームからの要求を受けた場合、GETメソッドで要求を受けたら$_GET変数、POSTメソッドで要求を受けたら$_POST変数に連想配列として格納されます。
配列のキーとしてはフォームの部品として使われているinput要素等の中に記述されたname属性の値が格納され、値として各部品のvalue属性の値を持ちます。

では、簡単なコードで動作を確認してみましょう。
通常はフォームのページと要求を処理するPHPのページを分けますが、ここでは1つにまとめています。
<form action="sample.php" method="get">
<input type="submit" name="Click" value="送信">
</form>
<?php
print $_GET["Click"];
?>

form要素内のmethod属性をgetに設定し、phpの出力には$_GET["Click"]としています。これをブラウザでレンダリングすると以下のようになり、単に「送信」ボタンが配置されているだけです。
20120510-p01.jpg
この「送信」ボタンをクリックすると、以下のような結果になります。
20120510-p02.jpg
結果を見ると、「送信」という文字が表示されます。これは、input要素のvalueの値をそのまま表示しています。このボタンのname属性を指定していますので、このボタンのvalue属性の値をそのままphpに渡して処理していることになります。
また、注目してもらいたいのがアドレス部分です。「sample.php?Click=送信」と表示され、どの値が渡されたのかが分かります。

では、これをPOSTメソッドに変えてみます。コードはほとんど同じで、method属性がpostになり、PHPがprint $_POST["Click"];に変わるだけです。
<form action="sample.php" method="post">
<input type="submit" name="Click" value="送信">
</form>
<?php
print $_POST["Click"];
?>

ブラウザでレンダリングした結果は、さきほどと全く同じです。「送信」ボタンをクリックした結果は以下のようになります。
20120510-p03.jpg
出力結果は全く同じですが、アドレス部分が異なります。GETと違って、アドレスの最後には何も表示されません。

ここで$_GETと$_POSTの違いは何かを説明します。まず、POST要求をするには明示的に宣言する必要があります。つまり、method属性を省略したらすべてGET要求になってしまうという事です。
HTMLはハイパーリンクを使ったものですが、このハイパーリンクをクリックした要求はGET要求です。要するに、一般的なサーバへの要求はGETとしてリクエストされます。
GET要求はユーザが意識しない場所で使われていて、特に宣言をしなくてもちゃんとサーバへ要求してくれます。

$_GETと$_POSTは送信方法が違うところがポイントです。この送信方法は全く異なる方法で行われていますが、ユーザが意識して使い分ける必要はありません。但し、以下のことだけを覚えておけば大丈夫でしょう。
・明示的に宣言していない場合は、GET要求となる。
・GET要求は、送信内容がURLとして渡される。
・GET要求は、送信できる情報量に制限がある。
・GET要求では、日本語などの全角文字を送信できないときもある。

以上のことを考慮すると、フォームで送信する場合はPOST要求の方がメリットが多いようです。
では、最後にユーザが入力したものがどのように反映されるかを簡単なコードで見てみましょう。
<form action="sample.php" method="get">
<input type="text" name="name" size="20" />
<input type="submit" value="送信">
</form>
<?php
if(empty($_GET)){
echo "入力されていません";
}else{
print "こんにちは!" . htmlspecialchars($_GET["name"]). "さん";
}
?>

ブラウザでレンダリングすると以下のようになります。
20120510-p04.jpg
入力欄に「Tanaka」と入力して、「送信」ボタンをクリックすると以下のように表示されます。
20120510-p05.jpg
ここでは、GET要求を行っているのでアドレスの部分も確認してください。

PHPは動的なHTMLを実現するプログラミング言語です。サーバとユーザの対話が成り立ち、ユーザの要求の違いによって、サーバがその要求によって処理を分けることができます。
フォームを使うという事は、GET要求するのかPOST要求をするのかを考えて作る必要があります。どちらを使えば良いかを考えてしまいますが、分からない時はPOST要求で間違いはないでしょう。ただし、POSTの場合は明示的に宣言してあげる必要があるので、必ずフォーム要素にmethod="post"と記述してください。

PHP - $_SERVER -

  • 2012-05-07 (Mon)
  • PHP
GWも終わりましたね。各地でいろいろな災害があったようです。
それぞれの過ごし方もあったと思いますが、また普段の生活に慣れるような努力も必要です。

さて、今日はグローバル変数の$_SERVERについて紹介します。
第20回 $_SERVER
$_SERVERは、ヘッダ、パス、スクリプトの位置のような情報を有する配列の変数です。この配列は、Webサーバによって生成されますが、これらすべてを提供する保証はありません。つまり、サーバによって使えるものと使えないものがあり、使う時はサーバで使えるかどうかを確認しておきます。
通常は、だいたいのサーバ変数は使えますが、設定によって使えなかったりしますので、注意して使用してください。

ここでは、一般的に利用されるサーバ変数だけを紹介します。以下のコードは、それぞれの変数を使ったときに、どのような情報が返ってくるかを試したものです。
<?php
echo $_SERVER["SERVER_NAME"]."<br>";
echo $_SERVER["SERVER_SOFTWARE"]."<br>";
echo $_SERVER["DOCUMENT_ROOT"]."<br>";
echo $_SERVER["HTTP_ACCEPT_CHARSET"]."<br>";
echo $_SERVER["HTTP_ACCEPT_LANGUAGE"]."<br>";
echo $_SERVER["HTTP_CONNECTION"]."<br>";
echo $_SERVER["HTTP_HOST"]."<br>";
echo $_SERVER["HTTP_USER_AGENT"]."<br>";
echo $_SERVER["SCRIPT_FILENAME"]."<br>";
echo $_SERVER["SCRIPT_NAME"]."<br>";
echo $_SERVER["PHP_SELF"]."<br>";
echo $_SERVER["REQUEST_METHOD"]."<br>";
?>

20120507-p01.jpg
一つひとつの表示が1行で終わるように、各コードの最後に改行を挿入しています。

では、一つずつ紹介しましょう。
$_SERVER["SERVER_NAME"]
 サーバのホスト名を取得します。
$_SERVER["SERVER_SOFTWARE"]
 サーバの認識文字列、つまりサーバのソフト名を取得します。
$_SERVER["DOCUMENT_ROOT"]
 現在実行されているスクリプトのドキュメントルートディレクトリを取得します。
$_SERVER["HTTP_ACCEPT_CHARSET"]
 現在のリクエストのAccept-Charsetで、ヘッダがあれば文字コードを取得します。
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
 現在のリクエストのAccept-Languageで、ヘッダがあれば言語コードを取得します。
$_SERVER["HTTP_CONNECTION"]
 現在のリクエストのConnectionで、ヘッダがあればその接続内容を取得します。
$_SERVER["HTTP_HOST"]
 現在のリクエストしているホスト名を取得します。
$_SERVER["HTTP_USER_AGENT"]
 現在のリクエストしているブラウザの種類を取得します。
$_SERVER["SCRIPT_FILENAME"]
 現在実行されているスクリプトの絶対パス名を取得します。
$_SERVER["SCRIPT_NAME"]
 現在のスクリプトのパスを取得します。
$_SERVER["PHP_SELF"]
 現在実行しているスクリプトのファイル名を取得します。
$_SERVER["REQUEST_METHOD"]
 ページがリクエストされた時のリクエストメソッド名を取得します。

以上の他にもたくさんあります。すべてを覚える必要はありませんが、頻繁に利用されるサーバ変数ぐらいは覚えておきたいものです。

PHP 定義済みの変数

  • 2012-05-03 (Thu)
  • PHP
GWも後半。どこもかしこも渋滞模様です。
昨日、観賞した「New Year's Eve」は、とても味わい深いものでした。
何人かのドラマを描き、新年を迎えるカウントダウンのそれぞれの思いを描写していました。ほのぼのとした映画で、感動を味わいたい方は必見です。

見る人によってジーンとくる人もあれば、ふ~んと鼻であしらう人もいるかも知れませんが、それが映画というものでしょう。
それぞれの感じ方が違って、映画もいろいろなものが登場するでしょうから・・。

今日から定義済みの変数について紹介します。一般的にはスーパーグローバル変数とも呼ばれます。PHPでは、欠かせない予約済みの変数と考えてください。
このスーパーグローバルは、スクリプト全体を通して、すべてのスコープで使用可能な変数のことで、関数やメソッドの内部からアクセスする時にも「global $variable」などと記述する必要はありません。
第19回 $GLOBALS
$GLOBALSは、グローバルスコープで使用可能なすべての変数への参照が可能です。また、連想配列の一つです。
参照の方法は次のようになります。
$GLOBALS["変数名"];

どこからも参照できるので、スコープ(適用範囲)を考えなくても良い、とても便利な変数となります。
簡単な例を見てみます。
<?php
 function test(){
  $foo = "Local variable"; //ローカル変数

  echo 'グローバル範囲の変数$foo:' . $GLOBALS["foo"] . "<br>\n";
  echo '現在の範囲の変数$foo:' . $foo . "<br>\n";
 }
 $foo = "Content Display";
 test();
?>

20120503-p05.jpg
上のコードを見てもらうと分かるように、$fooという変数が2つあります。1つは、関数function test()の内部、もう一つがfunction test()の後ろにあります。どちらも異なる文字列を代入しています。
最後の test(); を実行した場合、関数testが実行され、内部に記述されているechoで出力します。
最初のechoでは、$GLOBALS["foo"]となっているので、関数の外にある$fooを参照します。2つ目のechoでは、単に$fooと記述されているので、関数の内部だけしか参照できないので関数testの中の$fooを参照します。
よって、2つの結果はそれぞれのアクセスした文字列を参照します。

一般に、グローバル変数はglobalというキーワードを用いて使用しますが、$GLOBALSを使うことによって、簡便に記述できるというメリットがあります。

PHP - クラスの考え方2 -

  • 2012-05-01 (Tue)
  • PHP
あいにくの天気の悪さ・・GW。
今日から5月、だいぶ過ごしやすくなってきました。沖縄はすでの梅雨になったそうで、天気が気になる毎日になりそうです。

今日は、前回の復習という形で、クラスの考え方をおさらいします。
第18回 クラスとは(2)
PHPでは、オブジェクト指向と呼ばれるプログラミング手法を利用できます。オブジェクト指向を導入することで、プログラムの再利用、保守性がアップして、プログラミングを効率よく作ることができます。
このオブジェクトをテンプレート(ひな形)として構築することで、データをまとめて管理でき、変数や関数を一個ずつ定義するより、まとめて効率よく保守性を向上できます。これがクラスの考え方となります。

クラスからオブジェクトを作る作業は、設計図から部品を作成する作業に例えられるようです。前もって良く利用するような変数、関数を作っておき、必要な時にそこから拝借してくるようなイメージになります。

クラスが持つ変数はプロパティと呼ばれ、publicまたはprivateで定義します。前回は、varで定義すると紹介しましたが、PHP5.0のバージョンからvarからpublic、privateになりました。新しいバージョンは、public、privateに対応していると考えてください。
publicは、クラスの外から直接アクセスできる変数で、privateではクラスの外から直接アクセスできない変数となります。
クラスが持つ関数をメソッドと呼び、関数と同様にfunctionで定義します。

定義したクラスからオブジェクトを作成するには「new」を使用します。
作成したオブジェクトは各々が、クラスで定義したプロパティやメソッドを持ち、それらにアクセスするにはオブジェクトに対してアロー演算子を使用します。

では、簡単な例で確認してみましょう。
<?php
 class Math{
  public $num1;
  public $num2;

  function plus(){
   return $this->num1 + $this->num2;
  }
  function minus(){
   return $this->num1 - $this->num2;
  }
 }
 $math = new Math;

 $math -> num1 = 8;
 $math -> num2 = 3;

 $result1 = $math -> plus();
 $result2 = $math -> minus();

 echo "足し算の結果は{$result1}、引き算の結果は{$result2}です。";
?>

20120501-p03.jpg
コードの中の$mathは、クラスMathのオブジェクトになります。名前は変数と同じように任意に付けることができます。$mathに対して -> を使用して、プロパティやメソッドにアクセスします。
また、クラス内でプロパティやメソッドを参照する時は、$thisという変数を使って呼び出すことができます。$thisはメソッドの定義の中でのみ使用できる特殊な変数です。

クラスは基本的にnewを使ってオブジェクトを生成してから利用しますが、スコープ演算子を使うことで、クラスの内容に直接アクセスできます。
スコープ演算子は「::」と表示します。
<?php
 class Mes{
  function morning(){
   return "おはよう!";
  }

  function evening(){
   return "こんばんわ";
  }
 }

 $messageA = Mes::morning();
 $messageB = Mes::evening();

 echo "変数messageAは「{$messageA}」、変数messageBは「{$messageB}」です。";
?>

20120501-p04.jpg
規模の大きなプログラムを複数の人で作る場合は、関数名や変数名が重複してしまうと正しく動作しません。しかし、オブジェクト指向を利用すれば、クラス名さえ重複しなければ、変数名や関数名が被ってしまっていても、大丈夫です。

クラスの大まかな考え方をまず覚えておけば、既存のクラスを使うことはできると思います。

More...

Home > Archives > May 2012

Search
Feeds

Page Top