vol4

http://www.phppro.jp/school/phpschool/vol4/1

PHPで情報を受け取る、GET方式について

GET方式の場合、URLの後ろに?変数名=値といった形式で指定することで、PHPに値を渡すことができる
http://localhost/uranai.php?age=22

この場合ageが変数名、22が値である。

このURLで受け取った値を出力するプログラムを作る
<?php
if (is_numeric($_GET["age"]) == true) {
  print("あなたの年齢は:");
  print(htmlspecialchars($_GET["age"]));
  print("才です");
} else {
  print("入力された値は数字ではありません。");
}
?> 
上記プログラムの実行結果

あなたの年齢は:22才です

$_GETは特別な変数で、スーパーグローバル変数である

連想配列になっていて、URLで渡された変数名がキー、URLで渡された値が配列の値になっている
今回の例の場合、age=22のうちの、ageが配列のキー、22が配列の値という事になる。

is_numeric関数は、引数が数字かどうかを調べるための関数

戻り値ががtrueの場合、$_GET["age"]は数字が入っているとわかる
変な値を入れられたときはじくようにするための仕組み
数字ではなかった場合にはfalseという値が返ってくる

htmlspecialchars関数はHTMLで特殊な文字として扱われる危険な文字を安全な形式に置き換えてくれる

これはセキュリティにつながる話である
コードに入れておいたユーザーの入力をそのまま画面に出すと、クロスサイトスクリプティングという攻撃に対して脆弱になってしまう。htmlspecialchars関数は、そういった脆弱性の原因になるような、HTMLで特殊な文字として扱われる危険な文字を安全な形式に置き換えてくれる

$_GET変数を使う際に特に注意が必要なこと

画面に表示するときは、

print($_GET["nanisore"]);

としては絶対にいけない。その代わり

print(htmlspecialchars($_GET["nanisore"]));

と、htmlspecialcharsを使うようにする。これは、

$data = $_GET["nanisore"];

のように、値をいったん別の変数に入れたりした場合でも、必ずやらなければいけない。

占いページ

<?php

if (is_numeric($_GET["age"]) == false) {
  print("年齢は数字で教えてください!");
  exit();
}

$uranai_message[0] = 
        "ちょっとあなたの年齢は対象年齢に含まれていません・・・";
$uranai_message[1] = 
        "10代のあなたには、PHPをお守り代わりに勉強するのが良いみたい。";
$uranai_message[2] = 
        "20代のあなたには、趣味でPHPを使うと良いみたい。";
$uranai_message[3] = 
        "30代のあなたには、ビジネススキルとしてPHPを勉強すると良いみたい。";
$uranai_message[4] = 
        "40代のあなたには、PHPは新たなフロンティアとなるでしょう。";

if ($_GET["age"] >= 50 || $_GET["age"] < 10) {
  $sedai = 0;
} elseif ($_GET["age"] >= 40) {
  $sedai = 4;
} elseif ($_GET["age"] >= 30) {
  $sedai = 3;
} elseif ($_GET["age"] >= 20) {
  $sedai = 2;
} else {
  $sedai = 1;
}

print($uranai_message[$sedai]);
?>
exit関数はそこでプログラムを終了させる。
$_GET["age"] >= 50

はageが50以上のとき、を表す。

$_GET["age"] < 10

はageが10未満のとき、を表す。

||はOR演算子

といって、「A || B」と書いて、「条件Aまたは条件Bが正しいかどうか」という判別をするためのもの
今回の例だと「$_GET["age"]の値が50以上、または10未満の場合」という事になる。

占いページをさらに洗練させた例

<?php

// ageが数字で無かった場合、メッセージを表示してプログラムを終了。
if (is_numeric($_GET["age"]) == false) { 
  print("年齢は数字で教えてください!");
  exit();
}

$sorry_message = 
        "ちょっとあなたの年齢は対象年齢に含まれていません・・・";
$uranai_message[1] = 
        "10代のあなたには、PHPをお守り代わりに勉強するのが良いみたい。";
$uranai_message[2] = 
        "20代のあなたには、趣味でPHPを使うと良いみたい。";
$uranai_message[3] = 
        "30代のあなたには、ビジネススキルとしてPHPを勉強すると良いみたい。";
$uranai_message[4] = 
        "40代のあなたには、PHPは新たなフロンティアとなるでしょう。";

$sedai = floor($_GET["age"] / 10);

if (isset($uranai_message[$sedai])) {
  print($uranai_message[$sedai]);
} else {
  print($sorry_message);
}

?>

10才未満、50才以上の処理を、配列のキーがあるかないかで判断している。

floor関数は、小数点以下の切り捨てをする関数
$sedai = floor($_GET["age"] / 10); 

なら、$sedaiには入力された年齢の10の位が代入される。

isset関数は、変数がセットされているかどうかを検査する

値が存在するか、とは、簡単に言うとその変数に値を代入したかどうか、ということ。
issetを使ったif分は、変数内の値が「ある」「ない」の判定にとても便利で、よく登場する。

PHPでは、「==」や「>」などの比較演算子を使わないで判定することもできる。

例えば、ifの判定の際には、次のような書き方もできる。

<?php
$message = "あいうえお";
 
if ($message) {
  print($message);
}
?> 

この場合、if($message)は、「$messageに何らかの値がある」場合。
何らかの値とは、0以外の数字や、文字列や、1つ以上の要素がある配列や、trueなど。