【PHP】POSTメソッドとHTMLエスケープをしよした割り勘の金額を求めるプログラムの作成

本日は、割り勘する時の一人当たりの金額を調べるプログラムを作成しようと思う。

始めに、HTMLエスケープを実行するためのes()を作成していく

```util.php
<?php
function es($data){
    if(is_array($data)){
        return array_map(__METHOD__,$data);
    }else{
        return htmlspecialchars($data,ENT_QUOTES,'utf-8');
    }
}
```
これにより、引数のデータが配列になっている時は、array_mapによって要素一つ一つをエスケープさせ、
esメソッドの配列を作成する。

そして、それ以外は、通常通りエスケープを実行する。

次に、文字のエンコードのチェックを行うckenメソッドを作成する。

```util.php
function cken(array $data){
    $result=true;
    foreach($data as $key=>$value){
        //foreach文で配列から値を順に取り出す
 if(is_array($value)){
     //引数が配列のとき
     $value=implode("",value);
      //配列を連結させる
 }
 if(!mb_check_encoding($value)){
     //文字エンコードをチェックしたときに違う値だったという条件
     $result=false;
 break;
 }
 }
 return $result;
}
```
次にデータの入力の画面を作成する

```name_Check.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>フォーム入力</title>

</head>
<body>
    <div>
    <form action="warikan.php"method="post">
//ここではpostメソッドを指定
    <ul>
        <li><label>合計金額<input type="number" name="goukei"></label></li>
        <li><label>人数<input type="number"name="ninzu"></label></li>
        <li><input type="submit" value="割り勘する"></li>
    </ul>
    </form>
    </div>
</body>
```
これらのデータを処理するwarikan.php というphpファイルを作成する

```warikan.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>フォーム入力</title>

</head>
<body>
    <div>
   <?php
   require_once('util.php');//util.php を読み込み
  
   if(!cken($_POST)){
       $encoding=mb_internal_encoding();
       $err="ENcoding error the expected encoding is".$encoding;
       exit($err);
   }
   $_POST=es($_POST);
   ?>
   <?php
   $errors=[];
   ?>
   <?php
   if(isset($_POST['goukei'])){
$goukei=$_POST['goukei'];
if(!ctype_digit($goukei)){
    $errors[]="合計金額を整数で入力してください";
}}
else{
    $errors[]="合計金額が未設定";
}
   ?>
<?php
if(isset($_POST['ninzu'])){
   $ninzu=$_POST['ninzu'];
if(!ctype_digit($ninzu)){
    $errors[]="人数を整数値で入力してください";
}
elseif($ninzu==0){
    $errors[]="0では割り切れません";
}
}
else{
    $errors[]="人数が未設定";
}
?>
 <?php
 if(count($errors)>0){
echo '<ol class="errror">';
foreach($errors as $value){
    echo "<li>","$value","</li>";
}
echo "</ol>";
?>
<form action="nameCheck.php" method="post">
<ul>
<li><input type="submit"value="戻る"></li>
</ul>
</form>
<?php
}else{
    $amari=$goukei%$ninzu;
    $price=($goukei-$amari)/$ninzu;
    $goukei_fmt=number_format($goukei);
    $price_fmt=number_format($price);
    echo "{$goukei_fmt}を{$ninzu}で割ります","<br>";
    echo "1にん当たり{$price_fmt}円を払えば、{$amari}円です";
}

  ?>
  
    </div>
</body>
```

```php
   <?php
   require_once('util.php');//util.php を読み込み
  
   if(!cken($_POST)){
       $encoding=mb_internal_encoding();
       $err="ENcoding error the expected encoding is".$encoding;
       exit($err);
   }
   $_POST=es($_POST);
   ?>
```
文字のエンコードに失敗した場合に、エラーメッセージを出力しており、
正常に出力しているときには、esメソッドを作成している。

```php
  <?php
   if(isset($_POST['goukei'])){
$goukei=$_POST['goukei'];
if(!ctype_digit($goukei)){
    $errors[]="合計金額を整数で入力してください";
}}
else{
    $errors[]="合計金額が未設定";
}
   ?>
<?php
if(isset($_POST['ninzu'])){
   $ninzu=$_POST['ninzu'];
if(!ctype_digit($ninzu)){
    $errors[]="人数を整数値で入力してください";
}
elseif($ninzu==0){
    $errors[]="0では割り切れません";
}
}
else{
    $errors[]="人数が未設定";
}
?>
```
こちらでは、$_POSTメソッドがセットされている時のエラーのメッセージを出力するプログラムを作成。

```warikan.php
 <?php
 if(count($errors)>0){
echo '<ol class="errror">';
foreach($errors as $value){
    echo "<li>","$value","</li>";
}
echo "</ol>";
?>
<form action="nameCheck.php" method="post">
<ul>
<li><input type="submit"value="戻る"></li>
</ul>
</form>
<?php
}else{
    $amari=$goukei%$ninzu;
    $price=($goukei-$amari)/$ninzu;
    $goukei_fmt=number_format($goukei);
    $price_fmt=number_format($price);
    echo "{$goukei_fmt}を{$ninzu}で割ります","<br>";
    echo "1にん当たり{$price_fmt}円を払えば、{$amari}円です";
}
?>
</div>
</body>
```
割り勘を処理するプログラムは以下の通りである。

```php
  $amari=$goukei%$ninzu;
    $price=($goukei-$amari)/$ninzu;
    $goukei_fmt=number_format($goukei);
    $price_fmt=number_format($price);
```

これで一人当たりの割り勘の金額を求めるプログラムが完成した。