checkboxの扱い方(未チェックは送信されない、valueで使える値)等 覚え書き

完成したページ
http://member.modernkatze.com/2023/03/14/post-1113/

checkboxがchecked状態以外のデータをサーバーに送ってくれないため、データベースへの登録が難儀した。
またサイトによってcheckboxに配列を使う使わないで揺れてたり、valueの値はtrue、falseしか扱ってないサイトがあって揺れて混乱した。
この問題が一応解決を見えたがあってるか、このやり方はやりたくないという人もいると思うので結論から書くと

checkboxのname属性は配列が扱え、配列が便利
valueは文字列を与えても問題ない
サーバーに送られる前は未checked状態の状態でもデータを拾える
サーバーに送られる前にvalueの値をfalse、’’(空文字)(どちらも空文字になるので好きな方)を代入して、checkedすれば、擬似的に全てのcheckboxのデータを送れる

checkboxの入力の中身(PHP)(チェックしたデータとチェックしてないデータを分けてる)

if($weapon[$count_weapon]!=""){
  echo "  "."<input type='checkbox'  class='RMEAwords'  name='".$words."[]' value='".$list[$count_weapon]."' checked>";
  echo "".$list[$count_weapon];
}else{
  echo "  "."<input type='checkbox'  class='RMEAwords' name='".$words."[]' value='".$list[$count_weapon]."'>"; 
   echo "".$list[$count_weapon];
}

checkboxの登録の中身(javascript)(未チェック状態のcheckboxがあれば、追加して空文字を代入する)

var words;
var flag;
function OnButtonClick(){
    var setRMEA = ["ambuscade","master","ergon","relic","mythic","empyrean","aeonic"];
    for(let i = 0 ;  i<7  ; i++){
        words = document.getElementsByName(setRMEA[i]+"[]");

        for(let n = 0; n < words.length; n ++){
            if(words[n].checked){
                //alert("真" + words[n].value);
                words[n].checked = true;    
                words[n].style.visibility ="hidden";
            }else{
                //alert("偽" + words[n].value);
                words[n].value = "";
                words[n].checked = true;
                words[n].style.visibility ="hidden";
            }
        }
    }
flag = document.getElementsByName("reloadflag");
flag.value = 1;
document.form1.action = 'newlsmem_g1.php';
document.form1.submit();
}

ポイントは特にないとはおもいます(;A´▽`A

これで頭から後ろまでcheckboxのデータをサーバーに送信できます。
ちなみに前画面に戻ると強制的にリロードするようにしてますが、本来チェックしたもののみチェックしたものが表示されました。(戻るボタン等の無効はしてますが、スマホ等の戻るボタンは制御出来ないため)
ただ、送信する際画面に全ての項目にチェックがついてる画面が一瞬表示されるので、全てのcheckboxの表示を送信の際消しています。CSSがわかる人は、checkboxを弄って体裁を整えるのも蟻だとおもいます。

これをsqlのshowコマンドを利用して、列名を取得して代入します。

            $stmt = $pdo->prepare("show fields from ".$words." ;");
            $res = $stmt->execute();
            $weapon1 = $stmt->fetchAll(PDO::FETCH_COLUMN);

showコマンドには、テーブルの様々な情報を取得でき、その最初の情報が列名となり、select文と同様の形で取得できます。ソースの量も減らせるし、便利だし、見た目もよくなります。

プログラム初心者なので間違いだらけかもだけどこんな感じです(゜ロ゜;
checkboxのデータを左寄せにsqlに代入していくプログラムなので、全てのcheckboxになにかしらのデータがないと、←詰めで本来入力されるべき場所に入らなくなるのでこまりましたが、これならこれでで解決になりました。
また、登録部分でnull,"(空文字)はどちらも"(空文字)となりsqlにnullを代入することができませんでした。私は不都合なかったので、受け取ったデータによってバインド変数にnullを加えるプログラムを書きませんでしたが必要なら書き加えてみてください。