Web言語のお勉強~ど素人が往く~

かつてVB6を1年くらい触った事があるだけのど素人がWeb言語に挑戦します。勉強結果を随時発表します。

PHPのお勉強「多くのお師匠さん達のアドバイスをソースコードに反映してみる!」


多数のお師匠さん現る!

昨日、始めてアップしたWebサービスのソースコードを公開したら多くのプログラマーさん達からご指導を仰ぐことが出来ました!
早速ソースコードに反映しアップし直しました!

その詳細をご紹介させて頂きたいと思います(^^)/

ブコメにて教えて頂く

id:deamuさんからブコメにて教えて頂きました!

id:deamuさん
htmlspecialcharsの第二引数を省略するとシングルクォートが処理されないので、万全を期すなら第二引数にENT_QUOTESを指定したほうがより安全かも
http://www.php.net/manual/ja/function.htmlspecialchars.php

htmlspecialcharsには第二引数を付けた方が良いんですか?
というか第二引数を付けられるのも知りませんでした(^^;

ENT_QUOTESを第二引数に追加して対応したいと思います!
id:deamuさん、どうもありがとうございます(^^)/

コメントにて教えて頂く

id:livingさんから素晴らしいコメントを頂きました(^-^)/
初心者が迷いがちな「GETとPOSTの使い分け」についてと、明らかな誤用であるhtmlspecialcharsについて教えて頂きました。
GETは以前別のところで使った時にPOSTにした方が良いよと、他の方にアドバイスをもらってPOSTを使用してみました。

htmlspecialcharsについては思いっきり私が間違って使っていた様で、教えて頂いた上にサンプルソースまで書いてくれました!

2. htmlspecialcharsについて

リクエストのデータ受け取り時にhtmlspecialcharsを使うのは誤用です。
htmlspecialcharsはHTMLとして出力する手前で使うものです。
$hoge = htmlspecialchars($_GET['hoge']); ではなく、
echo htmlspecialchars($hoge); として使います。
(このアプリの場合、受け取ってすぐに出力しているのでどちらの実装でも差はありませんが、途中に多くの処理が挟まれるようになると、大きな違いが出てきます)

また、文字コードの指定をしないと正しくエスケープできないことがあるため、 htmlspecialchars($hoge, ENT_QUOTES, 'UTF-8') といった形で、第3引数に文字コードを渡して使ったほうがセキュリティ的には良いです(第2引数にはENT_QUOTESを指定して、ダブルクォートをエスケープするように指定しています)。

さらに、htmlspecialcharsはいちいち書くのが面倒なので、以下のような関数を定義して使用するのも一般的です。
function h ($var) {
  return htmlspecialchars($hoge, ENT_QUOTES, 'UTF-8');
}

以上を踏まえてちょっとだけ手直ししたものを以下に置いてます。参考までに。
https://gist.github.com/ryo-utsunomiya/f9763c8f8ce8e0e893ee

id:livingさん、どうもありがとうございます(^-^)/

早速教えてもらったhtmlspecialcharsを別functionで共通化し、各HTML出力部分でそのfunctionを呼ぶ様に修正しました。
また後のコメントでは

echo, mb_convert_kana, htmlspecialcharsはいずれも例外をスローしないので、try-catchは不要だと考え、上記手直しではtry-catchを削除しています。

と教えてもらったので、こちらもtry-catchを除外しました。
本当にありがとうございます。

教えてもらった「PHP逆引きレシピ」という書籍も近日購入して必携しつつ開発にあたりたいと思います(^^)/

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)


Twitterにて教えて頂く

@arayutwさんからTwitterのリプライで情報をお寄せ頂きました!

ぬわんですと!
文字化けしてたんですか!?
全然気付きませんでした(T_T)
幾つかの環境では表示して文字化けがしないのをチェックしていたつもりでいたのですが、確かに文字コード指定とか何もしてませんでした(^^;
meta charset=utf8のタグを追加しました!

7gogoにて教えて頂く

id:QsFさんにはトークアプリ7gogoの方で色々と教えてもらいました!

755

ヘッダーやHTMLの書式周りに付いて教えてもらいました。

あまりにも素のままだったHTMLやhead部分に最低限追加すべき物を教えてもらって調整しました!

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>マネー報道 WebService - 生命保険計算 入力側</title>
 </head>
 <body>
 </body>
</html> 

あと戻るボタンもあった方が良いとのアドバイスを頂いたので、戻るリンクを付けてみました!

f:id:MoneyReport:20140709195454p:plain

id:QsFさん、どうもありがとうございました(^^)/

こうして多くの師匠の皆さんから教えてもらった内容を早速反映してアップし直しました!
ソースも改めて大公開!


【入力側のページ】

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>マネー報道 WebService - 生命保険計算 入力側</title>
 </head>
 <body>
  <?php echo '<h3>マネー報道 WebService ~生命保険計算~</h3>'; ?> 
  <?php echo 'あなたの生命保険の必要な死亡保障金額を算出します。こちらが入力側ページになります。<br /><br />'; ?> 
  <form action="seimeihoken02.php" method="post">
   子供の独立までの年数: <input type="text" name="nensu" /><br /><br />
   
   【毎年掛かる金額】以下は全て万円単位で記入して下さい。<br />
   現在の年間生活費: <input type="text" name="nenkan_seikatsuhi" /><br />
   - 夫の死亡後、不要になる支出: <input type="text" name="fuyo_shishutsu" /><br />
   + 夫の死亡後、必要になる支出: <input type="text" name="hitsuyo_shishutsu" /><br />
   - 遺族年金額: <input type="text" name="izoku_nenkin" /><br />
   - 妻の年収: <input type="text" name="tsuma_nenshu" /><br /><br />
   
   【一度きりの金額】<br />
   + その他の支出: <input type="text" name="sonota_shishutsu" /><br />
   - 現在の貯蓄額: <input type="text" name="chochiku" /><br />
   <input type="submit" />
  </form>
 </body>
</html> 

【出力側のページ】

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>マネー報道 WebService - 生命保険計算 結果表示側</title>
 </head>
 <body>
  <?php echo '<h3>マネー報道 WebService ~生命保険計算~</h3>'; ?> 
  <?php echo '入力した数値を元に、あなたの適切な生命保険金額を算出します。こちらが受け側で結果を返すページになります。<br /><br />'; ?>
  <?php
    // 受け取った値を変数へ格納
    $nensu = $_POST['nensu'];
    $seikatsuhi = $_POST['nenkan_seikatsuhi'];
    $fuyo_shishutsu = $_POST['fuyo_shishutsu'];
    $hitsuyo_shishutsu = $_POST['hitsuyo_shishutsu'];
    $izoku_nenkin = $_POST['izoku_nenkin'];
    $tsuma_nenshu = $_POST['tsuma_nenshu'];
    $sonota_shishutsu = $_POST['sonota_shishutsu'];
    $chochiku = $_POST['chochiku'];

    // 全角英数字を半角英数字へ変換
    $nensu = mb_convert_kana($nensu,"a");
    $seikatsuhi = mb_convert_kana($seikatsuhi,"a");
    $fuyo_shishutsu = mb_convert_kana($fuyo_shishutsu,"a");
    $hitsuyo_shishutsu = mb_convert_kana($hitsuyo_shishutsu,"a");
    $izoku_nenkin = mb_convert_kana($izoku_nenkin,"a");
    $tsuma_nenshu = mb_convert_kana($tsuma_nenshu,"a");
    $sonota_shishutsu = mb_convert_kana($sonota_shishutsu,"a");
    $chochiku = mb_convert_kana($chochiku,"a");
    
    // 入力値確認
    echo '【入力値確認】<br />';
    echo '子供の独立までの年数: '.h($nensu).'<br />';
    echo '現在の年間生活費: '.h($seikatsuhi).'<br />';
    echo '夫の死亡後、不要になる支出: '.h($fuyo_shishutsu).'<br />';
    echo '夫の死亡後、必要になる支出: '.h($hitsuyo_shishutsu).'<br />';
    echo '遺族年金額: '.h($izoku_nenkin).'<br />';
    echo '妻の年収: '.h($tsuma_nenshu).'<br /><br />';
    echo 'その他の支出: '.h($sonota_shishutsu).'<br />';
    echo '現在の貯蓄額: '.h($chochiku).'<br /><br />';

    // 必要金額計算
    $nengaku = ((int)$seikatsuhi - (int)$fuyo_shishutsu + (int)$hitsuyo_shishutsu - (int)$izoku_nenkin - (int)$tsuma_nenshu) * (int)$nensu;
    $sougaku = (int)$nengaku + (int)$sonota_shishutsu - (int)$chochiku;
    
    echo '<h3>あなたが加入しなければいけない生命保険の必要死亡保障額は ';
    echo (int)$sougaku;
    echo ' 万円です。</h3> ';

    
    /**
    * 特殊文字を HTML エンティティに変換する
    *
    * @param $string
    * @return string
    */
    function h($string)
    {
        return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
    }
  ?>
 </body>
</html> 


実際にアップし直したファイルは下記に。

マネー報道 WebService~生命保険計算~
http://moneyreport.link/service/seimeihoken01.php

次回はid:QsFさんにアドバイスをもらった1phpファイルで入力と出力の両方の機能を持たせるのに挑戦したいと思います!