6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

記入→確認→登録

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>";
}
?>
<!-- 登録確認ボタンが押されていない、または、エラーが1つ以上ある場合 -->
<?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が複数ある条件式難しいです。と思いました。

6
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?