黄昏より暗きもの、血の流れより赤きもの

黄昏より暗きもの、血の流れより赤きもの

自分の好きな事を好きなように書いて行きます。

目的地までの距離(km)を走るのに必要な、乗り物のガソリン代を算出する(PHP編)

問題(詳細はこちら)


問3:燃費p(km/ℓ)の車のガソリン代をg(JPY/ℓ)とする。このとき車でdkmの道を移動するのに必要なガソリン代を算出するプログラムを、以下の要件を満たして作成せよ。

要件1:燃費p,ガソリン代g,距離dはフォームより入力できるようにする。
要件2:「計算」ボタンをクリックすると、計算結果が出てくるようにする。
尚、PHPでフォームを作成する場合は以下のコードを使って良い。


問題3の解答と解説(PHP)


注意


今回はtest.phpに入力フォームを用意し、計算結果がtest.php(自分自身)に表示されるような物を作成する。まずPHPはサーバー上で動作する言語なので、ガソリン代の計算をサーバー上で行う事となる。つまりフォームから入力された距離(d)、燃費(p)、ガソリン代(g)の情報を一旦サーバー側に送信し、サーバー側で計算した結果を受け取るような流れとなる。


ここで一度入力した値は消えるようにしているのでご注意を。最も「何かがあったらユーザーに再度入力してもらう」と言う仕様である事をご了承願いたい。


さて今回はGET命令を使うので、$_GET['フォームのname属性']と言う形でフォームの入力内容を受け取り、受け取った内容を基に計算して行けば良い。計算においてはCalcGasoline($d,$s,$g)というメソッドで行っている。

フォームから入力された値の振る舞いについて


さてフォームに入力された値の振る舞いを見て行く。前回のJava Appletではフォームから入力されてきた値をInteger.parseIntを用いてInteger型に変換したのだった。今回のPHPも念のためフォームの各入力値をsettype(変数名,"integer");を用いてintegerとしての値に変換し、計算に用いている。


解答例


本プログラムでは、一度入力されたかどうかを調べる為に、formにflagを用意している。isset関数を用いてflagの値が存在するとき、CalcGasolineメソッドの結果をecho(出力)している。

実行結果と検証(PHP)





こちらのサイトにて動作確認。今回はテキストに数字が無事入力できるか?「Calculate!」ボタンを押すと、無事計算が正しく行われるかを検証して行く。計算は問1の状況(距離346km,燃費5km/l,ガソリン代160cost/l)を各フォームに入力し、11072がきちんと表示されるかを検証していく。


max OS 10.6.8,Firefoxで動作確認したところ、無事テキストが入力された。又問1の距離346km,燃費5km/l,ガソリン代160cost/lと入力し、「Calculate!」ボタンを押した所無事11'072が表示されているので、問題なく動作している。

付録:フォームを作成する際の4つの注意点


フォームの内容を、データーベースに入力する等の場合は以下の4つの点に注意しなくてはならない。最もこれらを注意したのは二社目に入ってからであった。それ以前に自分でフォームからデーターベースに値を入力(INSERT,UPDATE等)するようなプログラムを作っていて、見落としがちな点をまとめた。

1:フォームに○○以外の値が入力されてないか調べる事

例えば料金や番号などの数字をフォームに入力する場合、「perl の CGI や PHP でフォーム入力チェックによく使う正規表現のまとめ(人生はひまつぶし)」さんのような正規表現を使って、フォームに数字以外の値が入力されてないか調べ、入力されていたらエラーを返すようにしなくてはならない。

2:未入力、最大文字入力数を超えていないか調べる

これはMySQL等のデータベースのテーブルの設定上、特定のカラムが空ではいけない(NOT NULL)場合や、特定のカラムの型が「TEXT(30)」と文字数制限がある場合への対処法となる。この場合、各言語の文字数を調べる関数を調べて実装することとなる。尚、PHPの場合はstrlen関数を使えば良い。

3:SQLインジェクション対策を行う事

SQLインジェクションとは、フォームに「'」「"」などの文字を入力して送信すると、テーブルの内容が全て表示されると言った設計者が本来意図しない動作をする事を指す。詳細は「SQLインジェクションとは何か?その正体とクラッキング対策。(漢のコンピューター道)」を参照して欲しい。今回は「'」「"」に有効なエスケープ処理について軽く触れる。例えばMySQLの場合だと「MySQL関数(php & javascript room)」にあるmysql_escape_string関数等でエスケープ処理などを行い、インジェクションを防ぐ必要がある。

4:XSS(クロスサイト・スクリプティング)攻撃対策を行う事

XSS攻撃とは、フォームにscriptタグ等を埋め込むなどして、サイトに不正に動作させる攻撃方法の事だ。対策はhtmlタグを取り除くような処理(strip_tags,htmlspecialchars関数)を行っていく。このような事は会社に依っては研修でやる事があるので、余裕があった時に練習しておきたい。

上記1,3,4の参考に

URL:http://ryuichi64.daiwa-hotcom.com/index.php


ソースコード:https://github.com/ryuichi69/money-calculate


1,3,4の参考に自分が以前作成したこづかい帳のアプリケーションを紹介しておく。このアプリケーションは「金額」「内訳」を「収入」「支出」に入力すると、残高が表示されるというアプリケーションだ。ここで1,3,4のようなエラーチェックの関数等はcommon/string_check.phpに記述しているので参考にして欲しい。