チェックボックスとデータベースを一体化させる方法

ググってもチェックボックスのやり方は書いてあっても、
データベースの連携の記事がなかったため、自分が学習した内容をまとめます。
軽い気持ちで読んでいただければと思います。

▼基本フローは下記になります。
1.編集ボタンを押す 
2.チェックボックスをチェックする
3.完了ボタンを押す
4.チェックボックスにチェックがついている。

1.編集ボタンを押す 
2.チェックボックスをなくす
3.完了ボタンを押す
4.チェックボックスのチェックがなくなっている

使用シート
reg_list.php(一覧画面)
reg_edit.php(編集画面)
reg_update.php(編集実行画面)


reg_list.php(一覧画面)
```php
<div class="reg_list">
        <?php foreach($titless as $titles): ?>
          <div class="task_list">
            
            ---***---
            <input type="checkbox" name="done_at" readonly="readonly" <?php if($titles["done_at"]) echo "checked"; ?>>
            <label for="01-B" class="checkbox01"></label>
            ---***---

            <div class="reg_text">日付：<?php echo date("m月d日");?></div>
            <p class="reg_text"><?php echo h($titles["title"]) ?></p>
            <button class="edit_button">
              <a href="reg_edit.php?id=<?php echo $titles['id'] ?>">編集</a>
            </button>
            <form method="post" action="reg_delete.php">
              <input type="hidden" name="id" value="<?php echo $titles["id"] ?>">
              <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']?>">
              <button >削除</button>
            </form>
          </div>
        <?php endforeach ?>  
      </div>
```

```php

<input type="checkbox" name="done_at" readonly="readonly" <?php if($titles["done_at"]) echo "checked"; ?>>


※「readonly="readonlyを作成しシート内では動かないようにした。」
※「<?php if($titles["done_at"]) echo "checked"; ?>を作成した。
意味はもし、done_atが表示された場合は、チェックされる。」

```


reg_edit.php(編集画面)
```php

<div class="reg_list">
        <form method="post" action="reg_update.php">
          <div class="task_list">
            <input type="checkbox" name="done_at" id="01-B" <?php if($titles["done_at"]) echo "checked"; ?>>
            <label for="01-B" class="checkbox01"></label>
            <div class="reg_text">日付：<?php echo date("m月d日");?></div>
            <input type="text" class="reg_text" name="title" value="<?php echo $titles['title'] ?>">
            <input type="hidden" name="id" value="<?php echo $titles['id'] ?>">
            <input type="submit" value="完了" class="edit_button">  
          </div>
        </form>  
      </div>

```

```php

            <input type="checkbox" name="done_at" id="01-B" <?php if($titles["done_at"]) echo "checked"; ?>>
            <label for="01-B" class="checkbox01"></label>
            <input type="hidden" name="id" value="<?php echo $titles['id'] ?>">


※inputタグの中の「id」とlabelの中のforの名前を合わせて紐付けを行っている。
※idもどれをチェックするのかしてするためidも合わせて選択する。

```


reg_update.php(編集実行画面)
```php


// 新規作成 start このページにアクセスしたら、
// ポストデータを取得する。
if(isset($_POST["id"]) || isset($_POST["title"]) || isset($_POST["done_at"])){  
  $id    = $_POST["id"];  
  $title = $_POST["title"]; 
  $done = $_POST["done_at"];

//バリデーション　nullかdome_atが文字列のOnであったならば、
  $done_at = null;
  if($done === "on"){
    // $done_at = "CURRENT_TIMESTAMP";
    $done_at = date("Y/m/d H:i:s");
  } 

    try {
      //途中で何かしらのエラーが起こしたら、その場で処理が止まって、catchより以下がエラーで返却される。
      //catchされず、滞りなく進むとそのままで良い

      // トランザクション開始(ロック)...何かの処理をひとまとめにした状態で、何か処理をする中で処理が失敗した場合に最初からやり直すという意味
      $pdo->beginTransaction();
  
      // データを登録するSQL
      $stmt = $pdo->prepare("UPDATE tasks SET title=:title, done_at=:done_at  where id=:id");
  
      // 値をセット
      // バインドパラムでセットする
      $stmt->bindParam( ':id',    $id,    PDO::PARAM_STR);
      $stmt->bindParam( ':title', $title, PDO::PARAM_STR);
      $stmt->bindParam( ':done_at', $done_at, PDO::PARAM_STR);

 
      // SQL実行
      $res = $stmt->execute();
  
      // コミット
      if( $res ) {
        $pdo->commit();
      }
      //ここでトランザクション終了。
    } catch(PDOException $e) {
  
      // エラーメッセージを出力
      echo $e->getMessage();
      
      // ロールバック
      $pdo->rollBack();
    }
};

```

```php


$done = $_POST["done_at"];

  $done_at = null;
  if($done === "on"){
    $done_at = date("Y/m/d H:i:s");
  } 
 
※$done_at = null;　は何もなし（チェックボックスがチェックされていない状態）
※done_at = date("Y/m/d H:i:s"); はチェックボックスにチェックされている状態。

```


上記の処理をすることによってうまくチェックボックスとデータベースの連携がうまくいく。