1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】ボタンの状態を切り替える処理の2度目以降が成功しない。【高校生のバグ解決録001】

1
Posted at

アドバイスなど,コメント頂けると嬉しいです。

食堂の予約システムの開発中,管理画面を作っていたときのお話です。

バグの詳細

作りたかったもの→注文の可/不可を切り替えるボタン。
Screenshot 2026-06-30 14.37.08.png
Screenshot 2026-06-30 14.37.04.png

「予約を一時停止」(0) → 「予約を再開」(1) の切り替えは成功。

しかし、(1)→(0) は戻らない。

page.php
$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>
function.php
$a=$_POST["stop"]??null;

if($a!==null){
$a=1-(int)($a);
SqEditdata("table","status","status",$a,"bit");
header("Location:page.php");
exit;
}
dosql.php
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の型にありました。

「ビットを用いた処理」という見栄えにこだわりすぎて,型を意識できていなかったことが仇となったようです。

page.php
$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'

最終的に処理の全体において文字型に統一したところ、正常に動作しました。
型の扱いに不慣れであるため,理由はあまりわかっていません。少しずつでも覚えていければと思います。

最後に

原因に気づくまでにかなり時間がかかってしまったのが今回の反省点です。
今後は思い込みで候補を決めつけず,一つずつ丁寧に確認していくことを心がけます。ここまでお読み頂き,ありがとうございました。

これ以上,変なバグが出ずに完成することを願っています…。

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?