ど素人の勉強ノートです。
今回は、「チェックボックスの値をデータベースに入れる」をやってみました。
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">« 書き直す</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が複数ある条件式難しいです。と思いました。