アドバイスなど,コメント頂けると嬉しいです。
食堂の予約システムの開発中,管理画面を作っていたときのお話です。
バグの詳細
「予約を一時停止」(0) → 「予約を再開」(1) の切り替えは成功。
しかし、(1)→(0) は戻らない。
$status=["0","予約を一時停止"];
$j=(int)SqGetdata("reservation","status","status","bit");
if($j==1) $status=["1","予約を再開"];
?>
:
<button class="footer-button" onclick="Stop()"><?=$status[1]?></button>
:
<script>
function Stop(){
fetch("home-function.php",{
method:"POST",
headers:{
"Content-Type":"application/x-www-form-urlencoded"
},
body:"stop=<?=$status[0]?>"
}).then(r=>r.text()).then(()=>{
location.reload();
});
}
</script>
$a=$_POST["stop"]??null;
if($a!==null){
$a=1-(int)($a);
SqEditdata("table","status","status",$a,"bit");
header("Location:page.php");
exit;
}
function SqEditdata($a,$b,$c,$d,$e){
global $dbh;
$sql="UPDATE ".$a." SET ".$e."=:v WHERE ".$c."=:k";
$f=$dbh->prepare($sql);
$f->bindValue(":v",$d);
$f->bindValue(":k",$b);
$f->execute();
}
この時点でお気づきの方はいらっしゃいますか|ω・)?
試行錯誤の内訳
① SQL?
最初に疑ったことはSQLの実行ミスです。でも,同じ関数SqEditdataを利用している他処理は成功しています。実際,ここに問題はありませんでした。
② JavaScript?
次に,そもそもjsが正しい値を送っていないのではないかと考えました。
console.log(<?=$status[0]?>);
すると,1回目は正しく 0
2回目以降は何度クリックしても 1 が増えていくという挙動になりました。
意味がわからず,phpMyAdminでデータベースを確認しましたがこちらも同じく1のままです。正しい挙動なのに更新されない…。
バグの原因と解決
原因は0/1の型にありました。
「ビットを用いた処理」という見栄えにこだわりすぎて,型を意識できていなかったことが仇となったようです。
$status=["0","予約を一時停止"];
$j=SqGetdata("table","status","status","bit");
if($j=="1") $status=["1","予約を再開"];
| # | 名前 | タイプ | デフォルト値 | その他 |
|---|---|---|---|---|
| 1 | num🔑 | int(10) | AUTO_INCREMENT | |
| 2 | status | text | ''status'' | |
| 3 | bit | text | '0' |
最終的に処理の全体において文字型に統一したところ、正常に動作しました。
型の扱いに不慣れであるため,理由はあまりわかっていません。少しずつでも覚えていければと思います。
最後に
原因に気づくまでにかなり時間がかかってしまったのが今回の反省点です。
今後は思い込みで候補を決めつけず,一つずつ丁寧に確認していくことを心がけます。ここまでお読み頂き,ありがとうございました。
これ以上,変なバグが出ずに完成することを願っています…。

