カテゴリー
PHP

正規表現を理解しよう

この章では正規表現について説明します。
ショッピングサイトでお買い物をする時、電子メールや住所などの個人情報を入力することがありますが、電子メールや郵便番号などが正しく入力されているのかを調べる必要があります。
そのような時に正規表現を使います。
正規表現とは電子メールや郵便番号などの文字の並びをパターン化して、正規表現特有の記号で表現する形式です。
では例を見てみましょう。1正規表現にはメールアドレスなどの文字列が正規表現のパターンに一致するかを調べるためにpreg_match関数が用意されています。
preg_match関数は一致した回数を返すのですが、一回目で一致した時点で一致するかどうかのチェックを止めるので,マッチしたのならば1を、マッチしなかったのならば0を返します。
では例をみてみましょう。
1この例は1の中に正規表現である1と言う文字列が含まれているかどうか調べています。
このように正規表現パターン文字列は1で囲みます。
この例では1の中の1にマッチしているので1を出力します。
例えば、$kensaku の中身を1のように変更した場合には正規表現の1にマッチしません。
また、$kensaku の中身が1と言うように空白が含まれていても、正規表現の1にマッチしません。
このように正規表現というのはチェックする機能を持っています。
電話番号などが正しく入力されているのかを簡単にチェックできますので、とても便利な機能です。

次の例をみてみましょう。1 正規表現において1の中の1は、文字の初めにマッチするかどうかを調べる時に使います。
この例の場合は1は文字の初めにはないので、マッチしません。
1のように1が前にあればマッチします。
1をメタ文字と言います。

次の例をみてみましょう。1 正規表現において1は、文字の終わりにマッチするかどうかを調べる時に使うメタ文字です。
この例の場合は1は文字の終わりにはないので、マッチしません。
1であればマッチします。

次の例をみてみましょう。1 正規表現パターンの初めに1終わりに1を付けると1のみにマッチしますが、この例の場合は$kensakuの中には1が含まれているのでマッチしません。

次の例をみてみましょう。1 「”/sekai[0-9]/”」は1という文字列とsekaiの後の最初の1文字が0から9までの数字のうちどれか1つにマッチするかどうかを調べます。
パターンのなかの1にはマッチさせたい文字列や数字を並べます。
この例では1の後ろの1文字目が0から9までの数字かどうかを調べるので1と書いています。
1は0から9までという意味です。
1を書き換えると1になりますので、以下のように書いても同じ意味です。1 例の場合は「sekai」にはマッチしているので、後は1の中を判定するのですが、1の後の最初の1文字が数字の5なのでマッチします。1 なぜなら、パターンは1であり、1 の後の最初の1文字は数字の5だからです

1 の場合、sekaiの次の文字がnで0から9までの数字ではないのでマッチしません。

次の例をみてみましょう。1 「sekai[0-9]{7}」は1の後ろに0から9までの数字が7桁含まれているかどうかを判定しています。
1の中にはマッチさせたい桁数を3桁なら3、5桁なら5と指定してください。
$kensaku2の中の数字は3桁しかないので、マッチしません。

次の例をみてみましょう。1 「sekai]の後ろの2から9までの数字が2桁以上7桁以下であるか判定しています。
この例では2桁以上なのでマッチしますが1桁の場合はマッチしません。
「{2,7}」の中の左辺は始まりの数字で、右辺は終わりの数字で、始まりの数字以上終わりの数字以下繰り返しているかを判定できます。

次の例をみてみましょう。1 「sekai」の後ろに1が付いていますが、これはメタ文字です。
このメタ文字は任意の1文字にマッチする機能を持っています。
これは数字でも文字でもなんでもマッチします。
この例ではsekaiの後ろの1にマッチしています。
しかしこのメタ文字は改行文字にはマッチしませんので注意してください。

次の例をみてみましょう。1 正規表現の中でドット「.」そのものにマッチさせたい場合は1のようにドットの前に1を入れてください。
「¥」を入れないとメタ文字になってしまいます。
この例ではsekaiの後ろのドットそのものにマッチします。

次の例をみてみましょう。1 「[a-zA-Z0-9_]」は英大文字と英小文字、数字,アンダーバーのどれか1文字にマッチするかどうかを調べる時に使います。
これをメタ文字で表すと1です。
つまり、1と書いても同じ意味です。
この例ではsekaiのうしろのアンダーバーにマッチしています。

次の例をみてみましょう。1  [^0-9]は0から9以外という意味です。
1のカッコのなかで1を使うと1という意味になります。
この例の場合には指定した数字以外の任意の1文字にマッチします。
「^」は、左ブラケットの直後に入れてください。
注意点は[a-z^0-9]というように「^」を先頭ではなくて途中に書くとただ単にキャレットと言う意味になります。
ブラケットを使わないで、1のように1の中で1を使うと文字の初めにマッチする表現になりますので違いに注意してください。
この例の答えは1の次の文字が数字なので1が出力されます。
[^0-9]を別の表現で表すと1になります。
他の例を以下に紹介します。
「/sekai[^abcd]/」と書けば1の次の文字がabcd以外という意味になります。

次の例をみてみましょう。1 「?」(メタ文字)の意味は「?」の直前のものが、あってもいいし、なくてもいい、別の表現で言いますと「?」の直前の物が0個か1個という意味です。
つまり、直前のものが 0 回または1 回出現するものとマッチします。
この例の場合にはeがない状態である1でもマッチしますし、eがある状態である1でもマッチします。
「”/se?kai/”」は1と書き替えても同じ意味になります。
この例では1の中の「e」はあってもなくてもいいのでマッチします。

次の例をみてみましょう。1 「+」(メタ文字)は「+」の直前のものが1個以上マッチするという意味です。
つまり、直前のものが 1 回以上の繰り返しをした時にマッチします。
ですのでこの例は「+」の直前の文字「a」が1 回以上の繰り返しをしていないのでマッチしません。
「”/seka+i/”」は1と同じ意味です。
「x{n,}」の意味は1という意味です。

次の例をみてみましょう。1 「*」(メタ文字)は直前のものに0回以上マッチするのかと言う意味です。
ですので1のように「a」があってもなくてもマッチします。

次の例をみてみましょう。1 「”/(seki)+/”」のようにカッコで囲んでグループ化してそのグループ化したものに対してのパターンを判定します。
このカッコを外すと直前のiだけが対象になりiの1個以上のマッチを判定することになります。
この例の結果は1は1回以上繰り返しているので、1になります。

次の例をみてみましょう。1 (world|japan)の中の「|」は「もしくは」と言う意味で11のどれかが当てはまればマッチします。
英語のorに相当します。
注意点はブランケットの中で1と書いても「もしくは」の意味では使うことが出来ませんので注意してください。

次の例をみてみましょう。1 パターン文字列の右下に「i」が付いていますが、これは修飾子といいます。
これは大文字と小文字を区別しないでマッチングを行います。
例で説明しますと1の先頭が大文字で、正規表現の1の先頭は小文字ですが、「i」があるお蔭で1が出力されます。

次の例をみてみましょう。1 メタ文字「.」は通常は改行文字 にはマッチしませんが,1と言う「修飾子」を付けることによって改行文字を含めてあらゆる文字にマッチさせることが出来ます。
1のようにiとsを両方指定することも出来ます。
1と順番を変えても動作は同じです。

次の例をみてみましょう。1 この例では郵便番号が正しく入力されているかをチェックしています。
つまり、以下のような意味になります。1 結果は1が出力されます。

次の例をみてみましょう。1 この例では正規表現パターンにマッチしたものを取り出す方法について説明します。
もう一度、preg_match関数の構文を見直してみてください。
第三引数に検索結果が代入される配列という引数がありますので、マッチしたものをこの配列に入れます。
配列$rtの1番前にマッチした文字列の全てが入っていますので, 1にはマッチした「320-0906」
が入っています。

次の例をみてみましょう。11 (紙面の都合で$aの中の正規表現を複数行で書いていますが1行で書いてください)
これはメールアドレスの形式が正しいかどうかを調べる正規表現です。
メールアドレスの形式はある程度決まっているので、その形式をパターン化して、正しいかどうかをチェックすることが出来ます。
これまではパターン文字列は1のように直接書いていましたが、この例の場合にはパターン文字列を1のように変数に入れて使用しています。
メールアドレスの正規表現は少し長いですが、少しずつ区切って説明していきます。1 パターン文字列の中にカッコで囲まれている箇所がありますが、この箇所をサブマッチパターンといいます。
サブマッチした箇所は配列の2番目の要素から順に代入されていきます。
配列の1番目の要素にはマッチした文字列全部が代入されます。1 1結果は以下の通りです。1 =>配列の1番目の要素にはマッチした文字列全部が代入されますので、結果は1です。1 =>サブマッチした箇所は配列の前の要素から順に代入されていきますので、二つある中で一番初めの1 のサブマッチパターンにマッチした文字列が1に入っています。
結果は1です。1 =>サブマッチした箇所は配列の前の要素から順に代入されていきますので、二つある中で二番目の1のサブマッチパターンにマッチした文字列が1に入っています。
結果は1です。

preg_matchは1回マッチしたら検索を中止しますが、すべてのマッチングの結果を得たい場合はpreg_match_all関数を使ってください。1 [マッチした結果を入れる配列]は多次元配列(この本では2次元配列を説明しましたが、原理的には3次元、4次元…..も実現できます。
それを総称して多次元配列と言っています)になります。1 では例をみてみましょう。11 (紙面の都合で$aの中の正規表現を複数行で書いていますが1行で書いてください)
ではpreg_match_allについて説明します。
使い方はpreg_matchと同じですが、[マッチした結果を入れる配列]が多次元配列になりますので、結果は以下の通りになります。1 この例は[PREG_PATTERN_ORDERを指定した場合]ですので、連想配列のそれぞれには以下のものが格納されています。
$rt[0][0]にはメールアドレス全体
$rt[1][0]には1番前のサブパターンマッチでマッチした文字列
$rt[2][0] には2番目のサブパターンマッチでマッチした文字
次は[PREG_SET_ORDERを指定した場合]の結果を見てみましょう。11 (紙面の都合で$aの中の正規表現を複数行で書いていますが1行で書いてください)
結果は以下の通りです。1
連想配列のそれぞれには以下のものが格納されています。
PREG_PATTERN_ORDERとの違いを確認してください。
$rt[0][0]にはメールアドレス全体
$rt[0][1]には1番前のサブパターンマッチでマッチした文字列
$rt[0][2] には2番目のサブパターンマッチでマッチした文字列

次は文字列の検索と置換を行う関数について説明します。1 preg_replace関数は正規表現によって文字列の検索と置換を行う関数です。
検索や置換の対象となる文字列に対して正規表現のパターンで検索を行い、別の文字列に置換します。
では例をみてみましょう。1 以下のように正規表現のパターンにマッチした文字列全体が1に入り、そしてカッコで囲まれた1番前のサブマッチパターンにマッチした箇所が1、2番目のカッコが1という順番で参照されます。

対象があれば3番目は14番目は1と続きます。
これを後方参照と言います。このようにマッチした箇所を簡単に取り出せるので便利です。1 つまり、ここでは正規表現パターンに合致した文字列(この例の場合意にはURL)に対してリンクを張っているわけです。
この例では「¥0」 の部分つまりURLを取り出して、以下の箇所でリンクを張っています。1 結果は以下のようにリンクされたURLが出力されます。1111111

カテゴリー
PHP

アクセスカウンタを作ろう

この章ではファイルの入出力を使用して、簡単なアクセスカウンタを作成します。11 初めに「count.txt」を準備して、行頭に0を入力してください。ファイル名は自由です。11 =>モードには1を指定しますが、これは読み込みと書き込み用です。1 =>ファイルをロックします。1 =>fgets関数はファイルの中身を取得する関数ですが、最初は「count.txt」には0が入っていますので、$countには0が入ります。1 =>ここでは$countに1を足しますので一番初めは1になります。1 =>rewind関数はファイルポインタを先頭に戻す関数です。
成功したときにはtrue、失敗したときはfalseを返します。1 ファイルポインタを先頭に戻さないとカウント数を上書きできません。1 =>$countの値をファイルに書き込みます。
初めは1を書き込んだので以下のように「count.txt」の中身は1になります。11 =>ファイルのロックを解除します。1 =>ファイルを閉じます。1 =>ここでカウントを画面に表示します。
初めのアクセスでは1が表示されます。
ブラウザの更新ボタンを押しますとアクセスカウンタが1ずつ増えます。

カテゴリー
PHP

他のファイルを取り込もう

この章では他のファイルを取り込む方法について説明します。
よく使う関数を他のファイルに分離して、その関数を使う時にだけそのファイルを現在のプログラムに取り込むという手法を使う時があります。
ファイルを取り込む関数を4つ紹介します。
include
=>ファイルの取り込みに失敗したときには警告が出力されますが、処理は継続されます。
同じファイルを色々な箇所で何回も取り込もうとする時にその都度ファイルを読み込みます。
include_once
=>ファイルの取り込みに失敗したときには警告が出力されますが、処理は継続されます。
同じファイルを何回も取り込もうとするときに1回のみファイルを読み込みます。
require
=>ファイルの取り込みに失敗したときにはエラーが出力され、処理は停止します。
同じファイルを色々な箇所で何回も取り込もうとしても、その都度ファイルを読み込みます。
require_once
=>ファイルの取り込みに失敗したときにはエラーが出力され、処理は停止します。
同じファイルを何回も取り込もうとするときに1回のみファイルを読み込みます。
requireとincludeの違いはファイルの取り込みに失敗したときに処理を停止したければrequire、続行したければincludeを選択します。
通常、取り込もうとするファイルがないとプログラムが動作しない可能性がありますので、どれを指定していいか迷う場合にはrequire_onceを使ってください。
では例を見てみましょう。
次の例は「ファイル操作について知ろう」のLesson39.phpと同じブログラムですが(一部省略しています)、この中のhtmlspecial関数をLesson43.phpに移します。1 以下の例はLesson43.phpですが、 関数だけのファイルです。1 そして、Lesson39.phpの中でLesson43.phpをrequire_onceなどで取り込みます。1このようによく使うファイルは別のファイルに保存しておくと改めてゼロから作成する手間を省けます。

カテゴリー
PHP

ファイル操作について知ろう

この章ではプログラム上でのファイルの操作について説明します。
PHPでは簡単にプログラム上からテキストファイルなどに書いたり、またそのファイルのデータをプログラム上に読み込むことが出来ます。
以下のファイルはLesson38.htmlです。
ここから送信された名前、メールアドレス、コメント、性別をLesson39.phpに飛ばしてファイルに保存していきます。2015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_181054Lesson38.htmlは以下のような画面構成になります。2015-05-06_181054 以下のファイルは「Lesson39.php」です。2015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_181054111 ファイルの基本操作の流れは以下の通りになります。
〇ファイルを開く
〇その開いたファイルを読み込んだり、ファイルに書き込む
〇ファイルを閉じる
では1の「ファイルを開く」から説明していきます。1fopen関数はファイルを開く関数です。11111 fopen関数でファイルを開きます。
ファイルのオープンに成功したらファイルハンドルを返します。
例の場合には$openにファイルハンドルが返されます。
ファイルハンドルとは現在どのファイルに対して操作を行っているかを区別するための名前です。
ファイルハンドル名を付けてからはそのファイルハンドルで実行するための指示を出します。
ファイルハンドルはファイルを操作するためのIDみたいなものです。
モード一覧の中にあるファイルポインタとは、ファイルに書き込んだり、ファイルを読み込んだりする位置のことです。
ではプログラム内の説明をしていきます。1 ファイル名は1を指定しています。
モードに1を指定していますので、ファイルポインタは常にファイルの末尾なので、これまでのデータに追加して書くことが出来ます。
ファイルを開くことに成功しているのならば$openにはファイルハンドルが入っています。1 もし、ファイルを開くのが失敗しているのならば1が出力されます。
ファイルを開くのが失敗しているということは$openにはfalseが入っていることになります。
exit関数はメッセージを出力し、現在のプログラムを終了する関数です。
1 flock関数はファイルをロックする関数です。

戻り値は成功した時にTRUE, 失敗した時にFALSEが返されます
ファイルに何かを書くときに、複数の人が同時に同じファイルに書き込みを行うとファイルが壊れる可能性があるので、ファイルに書き込みを行う前にファイルをロックして、書き込んでいる間は他の人がファイルに書き込みを行えないようにするのがflock関数です。
つまり誰かが書き込んでいる間は書き込みを待ってもらうことが必要になります。
[ロックの種類]1 1fputs関数はファイルポインタの位置に文字列を1行分書き込む関数です。
「長さ」は、指定した長さまで書き込んだら、書き込みが終了になりますが、この「長さ」は省略できます。
戻り値は成功したら書き込んだバイト数, 失敗したらFALSEが返されます。
この例では以下の箇所がファイルに書き込んでいる箇所です。1 フォームのコメント欄からPOSTで送られてきたデータは以下のように$contentsに入れています。
$contentsには文字列連結演算子で名前、メールアドレス、コメント、性別、日付をつないだデータがカンマ区切りで入っています。
date関数の末尾に1がありますが、これは改行を意味しています。
これは名前、メールアドレス、コメント、性別、日付を1行ごとに書きたいためです。1
次は以下の箇所の説明をします。1 =>ここではロックをここで解除しています。
解除するには第2引数に1を付けてください。
次にファイルを閉じる方法について説明します。1 戻り値は成功した時にTRUE, 失敗した時にFALSEが返されます。
この例では以下の箇所でファイルを閉じています。1 最後にファイルを閉じるのですが、fclose関数がファイルを閉じる関数です。
ファイルを閉じるのに成功したのならばTRUE,失敗したのならばFALSEを返します。
AH.txtファイルには以下のように改行されて書き込まれます。

1 次は書き込んだファイルからデータを取り出す方法について説明します。
では、「”AH.txt”」に書き込まれたデータを取り出す方法について説明します。1 今度はファイルからデータを読み込むので、モードは1で指定しています。
初めにファイルが存在しているかどうかを調べ、その後に
ファイルの内容を読み込みます。1 ファイルやディレクトリが存在するのかどうかを調べるにはfile_exists関数を使います。
戻り値はファイルが存在すればtrue,存在しなければfalseを返します。
この例の場合には1は存在しますのでTRUEになります。
次にファイルの内容を読み込みます。1 この例では以下の箇所です。1 fgets関数はファイルから文字列を1行分取得する関数です。
戻り値は成功したら取り出した文字列が返り, ファイルの終端もしくは行の末端の改行に達したらFALSEが返されます。
「1行分」とは行の中の改行までの部分です。
この関数を実行すると1行分しかデータを取得できませんが、whileと組み合わせることにより、すべてのデータを読み込むことが可能になります。
次にそのファイルの中身を区切り文字で区切って
表示させます。1 =>explode関数は説明済みですが、もう一度復習してみましょう。1 文字列を指定した文字で区切ります。
AH.txtファイルの内容を区切り文字「”,”」で区切リ取ると例えば1 という配列を作成されます。
あとは添え字を指定してそれぞれのデータを取り出します。1 結果は以下のように表示されます。1

カテゴリー
PHP

日付に関する関数を知ろう

この章では日付に関する関数について説明します。
プログラム内で日付を扱うことがありますが、その時に「日付を扱う関数」を使います。2015-05-06_181054 date関数はフォーマット文字に応じた日付や時刻を取得します。
フォーマット文字については後ほど説明します。
では例をみてみましょう。2015-05-06_181054 結果は以下の通りです。
「現在の時刻は2012年08月17日14時 01分 53秒です」

この関数は第2引数のタイムスタンプを第1引数のフォーマット文字で変換した日付文字列を返します。
タイムスタンプは省略できますが、省略すると現在の時刻をフォーマット文字で変換した日付文字列を返します。
タイムスタンプとは1970年 1月 1日 0時 0分 0秒からの経過を秒数を表しています。
例えば2012年 1月 25日 22時 20分のタイムスタンプは2015-05-06_181054と表示されます。
次はフォーマット文字について説明します。
先ほどの例のフォーマット文字は2015-05-06_181054です。2015-05-06_1810542015-05-06_1810542015-05-06_181054 strtotime関数は日付/時刻文字列をタイムスタンプに変換する関数です。
タイムスタンプは省略された場合は現在時刻が適用されます。
戻り値は成功したときはタイムスタンプ、失敗した時にはFALSEになります。
では例をみてみましょう。2015-05-06_181054 1時間後の日付時刻を求めたい時はstrtotime関数で1時間後のタイムスタンプを得てから、date関数の引数に入れます。
1時間後は2015-05-06_181054と書きます。
その他にも1日後は2015-05-06_1810542012年09月10日は2015-05-06_181054次の月曜日は2015-05-06_181054と、書きます。2015-05-06_1810542015-05-06_181054 mktime関数は指定した日時のタイムスタンプを取得する関数です。
引数は右端から省略できますが、省略した箇所は現在の日付時刻が使われます。
引数をすべて省略しますと現在のタイムスタンプが返ってきます。2015-05-06_181054 date関数の第2引数にmktimeの戻り値を指定します。
結果は2015-05-06_181054 です。2015-05-06_181054 「年」を省略しますと現在の日付時刻が使われますので、
結果は2015-05-06_181054 です。
2015-05-06_181054getdate関数は指定したタイムスタンプの日付情報を連想配列で返します。
タイムスタンプが指定されない場合は、現在の時間に関する情報を返します。2015-05-06_181054 結果は現在の日付である2015-05-06_181054です。
$dには現在の時間に関する情報が連想配列の形式で入っているので、キーに2015-05-06_181054を指定すると月の情報が得られます。2015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_181054

カテゴリー
PHP

セッションについて知ろう

この章ではセッションについて説明します。
連続するアクセスを通じて特定のデータを保持する機能を持っているのがセッションです。
クッキーの箇所で説明した通り、通信というのはページを移動するたびに1回接続を切断してから、また接続し直すという行為を繰り返すので、ページ間でデータの引継ぎはできません。そこでセッションを使うと前のページの情報を引き継ぐことができるので、同じユーザーが接続していると認識することが出来ます。
以下の図で詳しく説明します。2015-05-06_181054 セッションの仕組みは初めてアクセスしたユーザーに対して、サーバの中でユーザーに2015-05-06_181054を発行します。
そして、そのIDに関連したデータを2015-05-06_181054(後ほど説明します)に格納します。
そしてデータはサーバで管理されて、セッションIDのみをユーザーに送り、そのIDはクッキーとしてファイルに保存されます。

次にユーザーはセッションIDをサーバに送って、そのIDに関連するデータをサーバから収得することが出来ます。
この仕組みにより複数のページ間で情報の共有をすることが出来ます。
具体的にWebのショッピングサイトを例にすると、ユーザーは商品の選択、他の商品を検索、選択した商品の取り消しなど、サイト内のページをいろいろ移動したあと、精算画面に移ります。
このときに、どの商品を選択したかの情報をどこかに蓄積してしないと、レジで金額計算ができなくなってしまいます。
そこで、選択された商品などをセッション情報としてセットして、ユーザーがサイトに滞在している間は保持しておくような仕組みがセッションです。
では例を元にセッションについて説明します。
次のファイル名はLesson33.phpです。2015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_181054
次のファイル名はLesson34.phpです。2015-05-06_1810542015-05-06_1810542015-05-06_181054 下のファイル名はLesson35.phpです。2015-05-06_1810542015-05-06_1810542015-05-06_181054 セッションを使用するファイルには2015-05-06_181054をプログラムの先頭に配置します。つまり、
Lesson33.phpとLesson34.phpとLesson35.phpの先頭にsession_start();を書いてください。

Lesson33.phpにアクセスしますと以下の登録フォームが現れます。2015-05-06_181054 以下の一番上のアルファベットと数字の組み合わせがセッションIDです。
ユーザーを識別するために、サーバ側が決めた番号をセッションIDといいます。セッションIDを取得するにはsession_id関数を使用します。
その下の「セッション名」は、セッションIDを受け渡すために使われます。
例えば2015-05-06_181054のように2015-05-06_181054というセットでユーザーとサーバ間を行き来します。
セッション名を取得するにはsession_name関数を使用します。
その下の2015-05-06_181054はセッションファイルの保管場所を意味しています。
セッションファイルの保管場所を取得するにはsession_save_path関数
を使用します。

セッションID、セッション名、セッションファイルの保管場所はこれらの意味を説明するために表示させましたが、あえて表示させる必要はありません。
次に参加者登録に「近藤」と入力し、「登録する」をクリックしますとLesson34.phpに移りますが、「近藤」というデータは2015-05-06_181054に入ります。
そして、2015-05-06_181054$_SESSIONに代入するのですが、
これは連想配列の形式で値を保持する変数です。


$_SESSIONを使用することで複数のページ間でデータを共有することができます。2015-05-06_181054 例ではセッション名をpersonsnameにしたので2015-05-06_1810542015-05-06_181054を代入しています。
1のようにセッション変数の先頭に2015-05-06_181054が付いていますが、これは2015-05-06_181054に何もデータが入っていない状態でこの変数を使用すると警告が出るので、これを出ないようにするために2015-05-06_181054をセッション変数の先頭に入れています。
結果は以下のように近藤が登録されました。2015-05-06_181054 Lesson33.phpとLesson34.phpのセッションIDが同じですが、これはページが遷移しても同じユーザーであることを意味します。
つまり、データが受け継がれている事を意味します。
次に上の画面のbackをクリックしてください。
クリックしますと以下のLesson33.phpのフォームに戻りますので今度は島田と入力して「登録する」をクリックしてください。2015-05-06_181054 「登録する」をクリックした結果、Lesson34.phpにジャンプしますが、島田というデータは2015-05-06_181054に入ります。
そして、2015-05-06_1810542015-05-06_181054に代入します。
ここでの注目点は2015-05-06_181054の右横に文字列連結演算子がありますが、これで文字列同士を連結しています。
つまり近藤と島田をつなげているわけです。2015-05-06_1810542015-05-06_181054 次にログアウトする時に、セッションの情報を削除する方法について説明します。
セッション情報は用事が終えたら、セキュリティの観点から削除することが必要です。
Lesson34.phpの中の2015-05-06_181054をクリックしてください。
クリックしますとLesson35.phpにジャンプするのですが、次の3か所の記述がセッション情報のすべてを削除するプログラムです。2015-05-06_181054 2015-05-06_181054セッション変数のデータの破棄を行っています。
セッション変数は連想配列なので2015-05-06_181054という何も入っていない配列を代入することで$_SESSIONは初期化されます。
つまり2015-05-06_181054の中の近藤、島田というデータは破棄されることになります。2015-05-06_181054 ブラウザに記録されているセッションIDの破棄を行います。
実はセッションIDをブラウザに記録する仕組みはクッキーを使用していますので、クッキーのデータを消す方法と同じ手法で消します。
session_name関数はセッション名を取得する関数ですので、これを$_COOKIEのキーにして、セッションIDが存在していれば削除します。
setcookieのクッキー名は2015-05-06_181054にします。
2015-05-06_181054サーバに記録されているセッションIDの破棄を行います。
セッション変数のデータを破棄、ブラウザに記録されているセッションIDの破棄、サーバに記録されているセッションIDの破棄がセットになって初めて完全にセッション情報を削除することが出来るわけです。

カテゴリー
PHP

クッキーについて知ろう

この章ではクッキーについて説明します。
ブラウザとサーバ間のやり取りにおいて、入力内容やユーザーの情報、アクセスした回数などをユーザーのパソコン内部のハードディスクに保存する仕組みをクッキーといいます。
つまり、サーバからのデータをパソコンに保存するしくみです。
通信というのはページを移動するたびに1回接続を切断してから、また接続し直すという行為を繰り返すので、ページ間でデータの引継ぎはできません。
しかし、クッキーと言う仕組みを使うことでデータをパソコン内部に保存することが出来ますので、ページ間の受け渡しが可能になります。
皆さんはショッピングサイトでお買い物をしたことがあると思いますが、1回目は名前などの個人情報を入力しますが2回目アクセスしたときには改めて名前などを入力しなくても、すでに入力されている状態になっているという経験をしたことがあると思いますが、これはクッキーという機能を利用しているのです。
以下の図で詳しく説明します。1 初めてサイトなどにアクセスしたときは以下の順序で進みます。
①ブラウザからサーバへリクエストします。
②次にサーバでクッキーを発行してブラウザ側にレスポンスします。
setcookieでブラウザにクッキーをセットします。setcookieについては後ほど説明します。
③ブラウザはサーバからのクッキー情報を記録します。
初めてのアクセス時にはまだクッキーはブラウザからサーバに送られません。
2回目のアクセス時にはクッキーがすでにセットされているのでサーバに送られます。
次は2回目の訪問した時について説明します。
①今度は上記3で保存したクッキーをサーバに送ります。
②サーバはこのクッキーを参照してクッキーの値を取得します。
ブラウザから送信されたクッキー情報は1で取得できます。
$_COOKIEについては後ほど説明します。
③クッキーに応じて情報やデータを表示する。
では例を見てみましょう。
以下のファイル名は1です。1111112015-05-06_18105411下のファイル名は1です。2015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_1810542015-05-06_181054
Lesson29.phpで名前とメールアドレスなどを入力フォームから2015-05-06_181054に送ります。
初めてLesson29.phpにアクセスした場合には以下の画面が表示されます。2015-05-06_181054 このフォームに名前などを入力して2015-05-06_181054をクリックしますと2015-05-06_181054にデータが送られます。
結果は以下のように表示されます。2015-05-06_181054
次にこの状態からブラウザの戻るボタンで2015-05-06_181054に戻ってください。
この後にブラウザの更新ボタンをクリックしてください。
クッキーを設定していない状態では何もデータは残りませんが、クッキーを設定すると以下のように名前、メールアドレスにデータが残ります。2015-05-06_181054 どのようにクッキーを設定するかを説明します。
PHPでクッキーを発行するにはsetcookie関数を使います。
このsetcookie関数をデータの送り先であるLesson30.phpの中で使用しています。
この関数で名前などの情報をブラウザに保存します。
setcookie関数は正常にクッキーが発行されたらTRUEを、失敗したらFALSEを返します。
setcookie関数の構文は以下の通りです。2015-05-06_181054 setcookie注意点としてはsetcookieの設定は2015-05-06_1810542015-05-06_181054や空白などあらゆる出力よりも前にsetcookieを記述してください。
そうしないと2015-05-06_181054というエラーが出ます。
ですので、この例ではHTMLのタグより前にsetcookie関数を記述しています。
では例を見てみましょう。2015-05-06_181054 「クッキー名」には好きな名前を付けます。例えばメールアドレスに関係しているのならばsetmailなどと付けます。
「保存したい内容(値)」には保存したい値を記述しますが、
この例では2015-05-06_1810542015-05-06_181054を指定しました。
これらはフォームに入力したデータです。
「有効期限」には2015-05-06_181054を指定しました。
これは1分を意味します。
time()は関数ですが、この関数は1970年1月1日00時00分00秒からの経過秒数を返す関数です。
つまり、この例の場合にはクッキーの有効期限は1分で、それを過ぎますとデータの保存は消えます。
他に以下の時刻を設定できます。2015-05-06_181054 setcookieのその他の引数の意味は以下の通りになります。
「クッキーが有効なパス」は今回は省略していますが、デフォルトではカレントディレクトリとなります。
以下の通り2015-05-06_181054を指定すると今の演習の環境であればlocalhostの下で有効になります。2015-05-06_181054 また、以下の通り2015-05-06_181054などと指定するとuserディレクトリとその下のディレクトリのみ有効になります。2015-05-06_181054 [クッキーが有効なドメイン] は今回は省略していますが、例えば以下の通り2015-05-06_181054というドメインを設定すると、そのサブドメインすべてでクッキーを有効にできます。2015-05-06_181054 「SSLフラグ」は今回は省略していますが、trueを設定するとJavaScript のようなスクリプト言語からはアクセスできなくできます。
しかしながら、このSSLフラグは全てのブラウザでサポートされているわけではありません。
次にその保存したクッキーのデータを取得する方法について説明します。
保存したクッキーのデータを取得するには2015-05-06_181054を使用します。2015-05-06_181054 「クッキーの名前」はsetcookie内の先頭の引数を書きます。2015-05-06_181054 この例では以下の箇所でクッキーのデータを取得しています。2015-05-06_181054 では具体的にこのプログラムについて説明します。
初めに2015-05-06_181054にアクセスする時には2015-05-06_181054には何もデータが入っていないので、else以下のプログラムに移動します。
つまり、カラのデータが代入されます。
2回目のアクセスの時には$nameと$mailにデータが代入されます。2015-05-06_181054 そして、次に保存したデータをフォームのテキスト欄に表示させたいのでvalue属性の箇所にクッキーで取得したデータが入っている$nameや$mailを記述しています。
それをprintで出力しています。
これで改めて最初から入力しなくても、以前入力したデータが表示されるようになります。2015-05-06_181054
次にクッキーを削除する方法について説明します。
クッキーはセキュリティの観点からずっと保存しておくのは良くありません。
そこである一定の時間が過ぎたら削除するのが良いでしょう。
この例ではクッキーを削除するために新たに2015-05-06_181054を作成しました。2015-05-06_1810542015-05-06_181054 Lesson29.phpに以下の「クッキーを削除する」というリンクがありますので、これをクリックすると2015-05-06_181054のリンクに飛んでクッキーを消すことが出来ます。2015-05-06_181054 「nekota1.php」に飛びますと以下の2行が書いてありますが、setcookieの有効期限に過去の時間を設定することにより、クッキーを削除しています。2015-05-06_181054 この例では2015-05-06_181054に設定しています。
クッキー名には消したいクッキー名を記述し、保存したい内容(値)には2015-05-06_181054を記述します。
これでクッキーが削除されたので、戻るボタンを押して、フォームの入力画面に戻ってください。名前、メールアドレスのデータが消えているのが分かります。

カテゴリー
PHP

フォームからの情報を受け取ろう

この章ではフォームについて説明します。
会員登録で名前、住所などを入力したことがあると思いますが、これがフォームです。
フォーム自体はHTMLで作るのですが、その入力した内容をサーバーに送るにはPHPを使います。
以下のプログラムはHTMLで作成しています。
ファイル名は1です。1111111 このHTMLファイルを画面に表示させると以下のようになります。
ここから「名前」「メールアドレス」などの情報を送信して、PHPプログラムで処理するというプログラムを作成します。1 HTMLの説明は後ほどしますが、ここでは送信方式について説明します。1 =>action属性の値にはデータの送り先を指定します。
この例で説明しますと1から1にデータを送ることを意味します。
method属性にはサーバへの送信方法を指定します。
フォームからサーバへの送信方法にはPOSTとGETの2つがあります。POSTを指定した場合、フォームに入力したデータはHTTPプロトコル(後ほど補足で説明します)という通信の機能によりリクエストボディつまり本体部分に入力されてサーバに送られますが、送る文字数には制限はありません。
POSTの場合は入力したデータの他にもWebブラウザの種類やバージョンなどの情報、どの言語を使っているか、どのサイトから訪問してきたかなどの情報も一緒に送信します。
GETはURLの後ろに1を付けて送ります。
複数の情報を付加する場合には1を使います。
つまり1が1つの情報になりますので、複数の情報を付け加えたい場合は1で連結します。
例えば1のように連結します。
つまり、フォームの送信データがURLとして渡されると言うことです。
そのため送信する情報には制限が有り、最大で約2000文字位です。
例を示すとヤフーなどで検索していると1のように1の後ろに1が連なっているURLを見たことがあると思いますが、これはGETでサーバにデータを送っているのです。
そして、サーバはその検索語を元に検索結果を返しています。
get方式でデータを送るときにはmethodの値をgetに変更します。1 補足ですがHTTPプロトコルについて説明します。
HTTPプロトコルとはユーザーのコンピューターとサーバの間のやり取りに関する通信規約であり、ユーザーのブラウザからリクエストを発信し、その結果をサーバがレスポンスするとその処理が完結すると言う単純な構造から出来ています。1 属性にtextを入れると1行のテキスト入力欄を作成します。
size属性はテキストボックスの横幅で、valueは入力欄の初期値です。
1と入力すれば最初から入力欄に「猫」が入力された状態になります。name 属性はtextに名前を付けるためにあります。
11 これは1行のテキスト入力欄です。
name 属性はtextに名前を付けるためにあります。11 rowsは入力欄の行数を入力し、この例では5行分になります。
colsは1行に入力できる文字数です。11 type属性にradioを入れるとラジオボタンを作ることが出来ます。
name属性はradioに名前を付けるためにあります。11 <select>はセレクトボックスを作成します。
name属性はセレクトボックスに名前を付けるためにあります。11 type属性にcheckboxを入れますとチェックボックスを作ることが出来ます。
name属性はチェックボックスに名前を付けるためにあります。1 1属性に「submit」を入れると送信ボタンを作ることが出来ます。
value属性にはsubmitボタンに付ける名前を書きます。1
次は送信先のPHPの部分について説明します。
以下のファイルは1です。1111111Lesson21.phpにLesson21.htmlの中のフォームデータを送る方法について説明します。
ユーザーが送信ボタンを押すとmthodに指定した方式で送信されます。
post方式は大量のデータを送るときに便利です。
1を使うことで、POSTメソッドで送信されたHTMLのデータを取得できます。
1については後ほど説明します。
例えばpost方式で送信した以下のフォームのメールアドレスのデータを得たいのであればname属性の値をキーとして1と、記述してデータを受け取ります。1 GRTで送信された場合には1で受け取ります。
getの場合はフォームのmethodの部分を以下の通りgetと書きます。1 そして$_GET変数を使うことで、GETメソッドで送信されたフォームのデータを取得できます。
では具体的に11について説明します。
フォームから送信されたデータを受け取るには送信方法がPOSTであれば1GETであればで1で受け取ります。
まずはPOSTから説明します。
1を押しますとデータが送信されますが、そのデータを受け取るには以下の構文で受け取ります。1 この構文を見ていただくと分かりますが1は連想配列です。
フォームで入力された氏名を受け取りたいのであれば
1と記述してデータを受け取ります。

name属性の値を連想配列のキーに入れます。1 フォームのメールアドレスを受け取りたいのであれば1と記述してデータを受け取ります。
では実際、PHP側でどのようにデータを受け取っているかを見てみましょう。11にはフォームの名前欄に入力された情報が連想配列の形で代入されます。
例えば1 と、名前を入力して1 を押しますと1には「近藤雅夫」と言うデータが代入されます。
つまり1と、同じことを意味します。

ですので、
結果は1が表示されます。
「htmlspecial」はユーザー定義関数ですが、これについては後ほど説明します。

次にempty関数について説明します。
通常、フォームからデータを送った時、そのデータが間違っていないのかをチェックする必要があります。
例えば名前が入力しているかどうかをチェックして、入力していないのならば入力するようにメッセージを表示することが必要になります。
会員登録で名前の入力が間違っていて、もう1度入力するようにメッセージを表示された経験が1度はあると思います。
empty関数は引数に値が入っているかどうかを確認する関数であり、〇数字の0
〇文字列の1 〇何も入ってないカラ文字、
〇null
の場合はTRUEで、それ以外はFALSEを返します。
nullとは何も変数に入ってない状態をさします。
ですので1に仮に何もデータが入っていないのならばelse以下の1が出力されます。

似たような関数としてisset関数があります。
この関数は変数がセットされているのかを調べる関数です。
変数 が NULL 以外であれば TRUE、そうでなければ FALSE を返します。
以下のようにissetは値がカラでもTRUEを返すので、送信データがカラでもそのまま警告もなく進んでしまいます。1 結果は以下の通りです。
「値が入っている」
カラではなくで本当に値が入っているか確認するにはempty関数かstrlen関数を使いましょう。
strlen関数については説明しましたが、もう一度復習しましょう。1 strlen関数は文字列の長さを測る関数です。
引数に文字列を設定すると長さを返してくれます。
長さとはバイト数のことです。
半角英数字は1文字1バイトとして数えています。
おおよそ日本語のようなマルチバイト文字は1文字2バイトですが、文字コードがUTF-8では概ね3文字バイトで表されます。1 結果は以下の通りです。
21バイト
13バイト
ではstrlenをif文で使ってみましょう。111
結果は以下の通りです。
値が入っている
値が入ってない
値が入っている
strlenをこのように使うことによってissetと違ってカラ文字には値が入っていないことを確認できます。
これでフォームの名前や住所などがカラの場合にはメッセージを表示させることができます。

ここで補足としてis_numeric関数について説明します。1 この関数は変数が数値であるかどうかを調べることが出来ます。
変数が数値、または数値文字列ならばTRUEを、そうでなければFALSEを返します。
数値文字列とは造語ですが、例えば1のように数値をダブルクォートやシングルクォートで囲んでも数値とみなされます。
このis_numeric関数はフォームの入力値を数字に設定しているのに文字を送ってきてしまう場合にチェックすることが出来ます。11
結果は以下の通りです。
数字です
数字以外が入っています
数字です
次はチェックボックスのデータをPHP側に渡す方法について説明します。1 チェックボックスでは複数の箇所に印を付けることが出来ますが、印をつけた部分をすべてPHPプログラムに送りたい場合はどうするかと言いますと、1のようにname属性の値の部分に1を付けてください。
これを付けることにより、配列としてPHP側にデータを渡すことができます。
1にはチェックボックスでチェックしたデータが配列の形式で入っていますのでforeachですべてを取り出すことが出来ます。1 次に以下のユーザー定義関数についての説明をします。1 これはhtmlspecialと言うユーザー定義関数ですが、この関数を説明するより先にhtmlspecialchars関数について説明します。
htmlspecialhars関数はフォームから入力した文字や数値を画面に表示するときには必ずhtmlspecialchars関数を使います。
これは外部からの悪質なサイトへの攻撃を防ぐことに有益な関数です。1 htmlspecialchars関数の機能は指定した文字列を変換スタイル、文字コードに従ってHTMLでの特別な意味を持った文字を表示可能な形式に変えます。
具体的には
〇 ‘&’ (アンパサンド) は1に変換されます。

〇「変換スタイル」に1が設定されている場合、ダブルクォートは1になり、シングルクォートは1になります。

〇 ‘<‘ (小なり) は1に変換されます。

〇 ‘>’ (大なり) は1に変換されます。
「変換スタイル」はデフォルトでは1が設定されています。
1はダブルクォートは変換されますが、シングルクォートは変換されません。
1はシングルクォートも1に変換してくれますので、変換スタイルは1に設定してください。
構文の「文字コード 」は変換をどの文字コードで行うかを指定します。

この例では1を使用しています。
では説明をしていきます。
ユーザーが入力したデータが1に入っていますので、このデータをhtmlspecial 関数を呼び出して、htmlspecialchars関数で処理しています。1 では次にユーザー定義関数の中身について説明します。
このユーザー定義関数はよく使う関数なので覚えておいてください。1 is_array関数は引数が配列の場合にTRUE、配列ではない時にFALSEになる関数です。
引数が配列ではない時に1 が実行されますので、1
1などはここで処理されます。
問題は引数が配列の時です。
配列の場合は1が実行されますが、1は指定した配列の要素のすべてを指定した関数に渡すという機能を持った関数です。1 array_map関数は渡されてきたデータが配列の場合に配列の要素を1つずつhtmlspecial関数の引数$strに渡すので、その要素は最終的には以下の箇所で処理されます。 1 図式にすると以下の順番で進みます。  
以下の過程を配列の数だけ繰り返します。1POST方式でのデータの送信方法については説明したので、今度はGET方式でデータを送ってみましょう。
以下のファイル名は1です。111

Lesson21.htmlから以下の1にGET方式で送ります。11111 GETで送信された場合はURLの1番後ろに1を付けて送ります。
複数ある場合は111で連結できます。
しかし、文字数に制限があり(2000文字くらい)、少ないデータを送るのに適しています。
以下の形式でGETのデータを受け取ります。1 例えば次の箇所でGETのデータを受け取っています。1 データを1から1にGETで送ると以下のようにURLに埋め込んで送ってくれます。
つまり、name 属性の値と入力された値が1で連結されます。
渡すデータが複数ある場合には各データを1で連結します。
例えば以下のように送信されます。1 上のURLの中に1のような箇所がありますが、これはブラウザがURLエンコードを行ってくれているからです。
日本語などはURLとして認められていないので、通常はそのままでは送ることはできませんが、URLエンコードを行うとURLとして認められている文字に変換して送ってくれます。
このエンコードの作業はフォームから送る場合には自動で変換してくれます。
では例を見てみましょう。
フォームで送る場合には勝手にブラウザがURLエンコードを行ってくれるのですが、リンクに埋め込んでデータを送る場合には自身でURLエンコード処理を行わなくてはいけません。
下のファイル名は1です。11 Lesson27.phpから下の1にデータを送ります。11
Lesson27.phpの中に1と言う箇所がありますが、urlencode関数は日本語などURLとして認められていない文字を規定に則って変換して送ってくれます。
urlencode関数を記述しませんと文字化けしますので気を付けてください。
$_GETのキーには以下の「name2」を入れます。1 以下のリンクをクリックしますと「近藤」と出力されます。1

カテゴリー
PHP

ユーザー定義関数内の変数の影響範囲を知ろう

この章では変数の影響範囲について説明します。
ユーザー定義関数内で作成した変数はローカル変数と呼ばれ、その関数内でしか使用することはできません。11
また、関数外の変数(関数外の変数をグローバル変数と言います)も関数内で使用することが出来ません。
以下のように使用しますとエラーになります。11 どうしても、グローバル変数を関数内で使用したい場合には関数内の変数に「global」を付けてください。11 もう1つ、グローバル変数をローカル変数内で使用する方法があります。
それはスーパーグローバル変数と呼ばれる$GLOBALを使います。
$GLOBALはグローバル変数をプログラムのどこでも使えるようにする連想配列ですが、グローバル変数の変数名がキーになります。
$garlicを関数内で使いたい場合には1と、記述します。
このように書くことにより$garlicの値である290を使うことが出来ます。1 では例をみてみましょう。11

カテゴリー
PHP

参照渡しと値渡しについて知ろう

この章では参照渡しと値渡しについて説明します。
PHPには変数に値を渡す方法が2種類あります。
1つが値渡しで、もう一つが参照渡しです。
値渡しとは今までと同じ代入の仕方ですが、ある変数に代入したデータを他の変数へ代入することを意味します。
ただデータを移しているだけなので、当たり前ですが$aも$bも違う変数になります。
$bには$aの値が代入されているのでリンゴが出力されます。
1
以下のようにユーザー定義関数に変数の値を渡しましたが、これも値渡しになります。
11参照渡しは値を渡すときに変数の前に1を付けます。1 「&」を付けて変数を代入しますと代入する変数と代入される変数の両方が同じものを指すようになります。
つまり、$aに1を付けて$bに代入しますと2つの変数は一心同体になりますので、$bにトマトを代入すると$aまでトマトに書き替わります。
専門的に言いますとデータが保存してあるアドレスが同じになるということです。
アドレスとはデータが保管してある場所です。
この参照渡しは関数でも使うことが出来ます。
仮引数に1を付けますと参照渡しになります。
この関数の中の$n1は1を掛けた結果、1050に変わっています。
この戻り値が$resultに入りますので1は1050になります。
1
ではecho $a;はどうでしょうか?
参照渡しでデータを渡した結果、$aと$n1は同じものを指すようになりましたので、$aも1050になります。