【PHP】PDOで、チェックボックスの値をデータベースに入れるメモ（１ページで記入→確認→登録）

ど素人の勉強ノートです。
今回は、「チェックボックスの値をデータベースに入れる」をやってみました。
set型に格納しています。

細心の注意を払って書いておりますが、問題点……あるかと思います。
ご指摘いただけると、大変うれしいです。
よろしくお願いします。

## 記入→確認→登録

```php:sample.php
<?php
session_start();
$errors = array();
// 処理用関数
function e($str, $charset = 'UTF-8'){
print htmlspecialchars($str, ENT_QUOTES, $charset);
}
function m($string) {
    if (is_array($string)) {
        return array_map("m", $string);
    } else {
        return htmlspecialchars($string, ENT_QUOTES);
    }
}

if (isset($_POST['submit'])){
    if(!empty($_POST['food'])){
    $food = $_POST['food'];// $_POST['food']の値がある場合、$foodに配列を入れる。
    }

    if (!isset($_POST['test']) || $_POST['test'] === '') {
        $errors['test'] = '氏名が入力されていません';
    } else {
        $_SESSION['test'] = $_POST['test'];

    }
    
    if (!isset($_POST['food']) || $_POST['food'] === '') {
        $errors['food'] = '希望の料理が選択されていません';
    } else {
    $_SESSION['food'] = $_POST['food'];
    }
}

// チェックボックスの中身
$foodform = array('japanese' => '和食','chinese' => '中華','italian' => 'イタリアン','french' => 'フレンチ');

// データベースに挿入処理
if (!empty($_POST['register'])){
        try{
            require_once 'dbmanager.php';// データベースに接続
            $pdo = getDb();
            $stmt = $pdo->prepare('INSERT INTO foods(test,food) VALUES(:test, :food)');
            $stmt->bindParam(':test', $_SESSION['test'], PDO::PARAM_STR);
            $stmt->bindValue(':food', implode(",", $_SESSION['food']), PDO::PARAM_STR);
            $stmt->execute();
            print '登録しました。';
// データベースの切断
            $db= NULL;
            $_SESSION = array();
            session_destroy();

        } catch (PDOException $e) {
            echo $e->getMessage();
        }
} else {
}

// リライト処理
if(isset($_GET['action']) && $_GET['action'] === 'edit'){
}
?>
<html>
<body>
<?php
if(isset($errors)){
    echo"<div class=\"error\">";
    echo "<ul>";
    foreach($errors as $value){
    echo"<li>";
    echo $value;
    echo"</li>";
    }
    echo "</ul>";
    echo"</div>";
}
?>
<!-- 登録確認ボタンが押されていない、または、エラーが１つ以上ある場合 -->
<?php if (!isset($_POST['submit']) || $_POST['submit'] === '' || count($errors) > 0) : ?>
    <?php if (isset($_GET['action']) && $_GET['action'] === 'edit') : ?>
<!-- リライト処理の場合 -->
<form method="POST" action="" >
<p>
氏名：<input type="text" name="test" size="30" value="
<?php 
if(isset($_SESSION['test'])){ echo e($_SESSION['test']);} ?>">
</p>
<p>
希望の料理</p>
<p>
<?php
if(isset($_SESSION['food'])){// $_SESSION['food']の値があるならば
$food = m($_SESSION['food']);
    foreach($foodform as $key =>$val){// 値を維持。
        $kekka = array_search($key, $food);
        if($kekka === false){
            $chk = "";
        } else {
            $chk = "checked";
        }
        echo "<input type=\"checkbox\" name=\"food[]\" value=\"";
        echo $key. "\"";
        echo $chk;
        echo ">";
        echo $val; 
    }
} else {// 値がないならば、初期チェックボックスに
    foreach($foodform as $key => $val){
        echo "<input type=\"checkbox\" name=\"food[]\" value=\"";
        echo $key. "\"";
        if ($key === "japanese"){
        echo "checked";
        }
        echo ">";
        echo $val;
    }
}
?>
</p>
<input type="submit" name="submit" value="登録内容を確認する">
</form>
<?php else: ?>
<form method="POST" action="" >
<p>
氏名：<input type="text" name="test" size="30">
</p>
<p>
希望の料理</p>
<p>
<?php
if(isset($_POST['food'])){// $_POST['food']の値があるならば
$food = m($food);
    foreach($foodform as $key =>$val){// 値を維持。
        $kekka = array_search($key, $food);
        if($kekka === false){
            $chk = "";
        } else {
            $chk = "checked";
        }
        echo "<input type=\"checkbox\" name=\"food[]\" value=\"";
        echo $key. "\"";
        echo $chk;
        echo ">";
        echo $val; 
    }
} else {// 値がないならば、初期チェックボックスに
    foreach($foodform as $key => $val){
        echo "<input type=\"checkbox\" name=\"food[]\" value=\"";
        echo $key. "\"";
        if ($key === "japanese"){
        echo "checked";
        }
        echo ">";
        echo $val;
    }
}
?>
</p>
<input type="submit" name="submit" value="登録内容を確認する">
</form>
<?php endif; ?>
<!-- エラーがなく、かつ、登録確認ボタンが押されている場合、確認画面を表示する -->
<?php elseif( count($errors) === 0 && isset($_POST['submit'])): ?>
<form method="POST" action="" >
<p>
氏名：<?php echo e($_POST['test']); ?>
</p>
<p>
希望の料理</p>
<p>
<ul>
<?php
$food = m($food);
    foreach($foodform as $key =>$val){// 値を維持。
        $kekka = array_search($key, $food);
        if($kekka === false){
            print "";
        } else {
            print "<li>".$val."</li>";
        }
    }
?>
</ul>
</p>
<a href="?action=edit">&laquo;&nbsp;書き直す</a>|<input type="submit" name="register" value="登録する" /></div>
</form>
<?php else: ?>
<?php endif; ?>
<?php
echo 'var_dump($_POST):';
var_dump($_POST);
echo "<br>";
echo 'var_dump($_errors):';
var_dump($errors);
echo "<br>";
echo 'var_dump($_SESSION):';
var_dump($_SESSION);
print $food;
?>
</body>
</html>
```

##　課題
ちょっと重複が多い気がするので、もう少しスリムに書けたら良いな……
（今の知識では、これをどう削ったらよいか分からず）
submitがあるか否か、の流れのif文のelseを最後投げてしまっているので、そこをもう少しなんとかできないものでしょうか……orが複数ある条件式難しいです。と思いました。