リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 合体ドロップ
「もう一度プレイ」後の2回目のスコアが重複トークンで送信失敗する可能性
1. 不具合の内容
v1.114.0で追加されたゲームオーバー画面の「🔁 もう一度プレイ」を使うと、ページを再読み込みしないまま2回目のプレイが始まる。しかし重複送信防止用の play_token (scores.play_token に UNIQUE INDEX あり) がページ読み込み時に1回だけ生成・保持されるクライアント側の値である場合、再プレイ後に同じ play_token を使って2回目のスコアを送信すると、DBのUNIQUE制約 (uq_scores_play_token) に違反しINSERTが失敗する。結果として2回目以降のプレイ結果がランキングに保存されず、ユーザーには送信成功したように見えるが実際には記録されない、または送信エラーが出るだけで原因が分かりにくい。
2. 根拠・発生しそうな条件
- schema.sql に `ALTER TABLE scores ADD UNIQUE INDEX uq_scores_play_token (play_token)` があり、同じ play_token での2回目のINSERTは確実に失敗する。
- v1.114.0のリリースノートには「盤面・スコア・NEXTキュー・タイマー・コンボ・進化回数・離脱確認・送信UIを新規プレイ状態に戻します」とあるが、play_token(重複防止トークン)の再生成については明記されていない。
- 「もう一度プレイ」はページ再読み込みを伴わない実装のため、play_token がページロード時に生成されたグローバル変数のまま再利用される可能性が高く、これまでの「ページ遷移で毎回新しいトークンが発行される」前提が崩れている。
- 発生条件: タイトル→プレイ→ゲームオーバー→「もう一度プレイ」→2回目のプレイでスコア送信、という一連の操作を1ページロード内で行った場合。
3. 期待動作
「もう一度プレイ」を選択した際、盤面や統計と同様に play_token (および、もしCSRFトークンをリクエスト毎に使い捨てる設計になっている場合はその関連値) も新しいランダム値に再生成し、2回目以降のプレイでも常にユニークなトークンでスコア送信が成功すること。
4. 修正方針
- play.php / 対応するJSファイルで play_token を生成している箇所を特定し、「もう一度プレイ」ボタン押下時に実行される再初期化処理 (盤面・スコア・NEXTキューなどをリセットする関数) の中で play_token も新しい値に再生成するよう修正する。
- submit_score.php 側で同一 play_token による2回目のINSERTが失敗した場合に、汎用エラーではなく明確な原因(重複トークン)をログに残すようにし、今後同種の問題を検知しやすくする。
- 手動テスト: 1) ゲームをプレイしてスコア送信 → 成功を確認。2) 「もう一度プレイ」でリロードせずに再プレイし、再度スコア送信 → 正常にランキングへ反映されることを確認。
v1.114.0で追加されたゲームオーバー画面の「🔁 もう一度プレイ」を使うと、ページを再読み込みしないまま2回目のプレイが始まる。しかし重複送信防止用の play_token (scores.play_token に UNIQUE INDEX あり) がページ読み込み時に1回だけ生成・保持されるクライアント側の値である場合、再プレイ後に同じ play_token を使って2回目のスコアを送信すると、DBのUNIQUE制約 (uq_scores_play_token) に違反しINSERTが失敗する。結果として2回目以降のプレイ結果がランキングに保存されず、ユーザーには送信成功したように見えるが実際には記録されない、または送信エラーが出るだけで原因が分かりにくい。
2. 根拠・発生しそうな条件
- schema.sql に `ALTER TABLE scores ADD UNIQUE INDEX uq_scores_play_token (play_token)` があり、同じ play_token での2回目のINSERTは確実に失敗する。
- v1.114.0のリリースノートには「盤面・スコア・NEXTキュー・タイマー・コンボ・進化回数・離脱確認・送信UIを新規プレイ状態に戻します」とあるが、play_token(重複防止トークン)の再生成については明記されていない。
- 「もう一度プレイ」はページ再読み込みを伴わない実装のため、play_token がページロード時に生成されたグローバル変数のまま再利用される可能性が高く、これまでの「ページ遷移で毎回新しいトークンが発行される」前提が崩れている。
- 発生条件: タイトル→プレイ→ゲームオーバー→「もう一度プレイ」→2回目のプレイでスコア送信、という一連の操作を1ページロード内で行った場合。
3. 期待動作
「もう一度プレイ」を選択した際、盤面や統計と同様に play_token (および、もしCSRFトークンをリクエスト毎に使い捨てる設計になっている場合はその関連値) も新しいランダム値に再生成し、2回目以降のプレイでも常にユニークなトークンでスコア送信が成功すること。
4. 修正方針
- play.php / 対応するJSファイルで play_token を生成している箇所を特定し、「もう一度プレイ」ボタン押下時に実行される再初期化処理 (盤面・スコア・NEXTキューなどをリセットする関数) の中で play_token も新しい値に再生成するよう修正する。
- submit_score.php 側で同一 play_token による2回目のINSERTが失敗した場合に、汎用エラーではなく明確な原因(重複トークン)をログに残すようにし、今後同種の問題を検知しやすくする。
- 手動テスト: 1) ゲームをプレイしてスコア送信 → 成功を確認。2) 「もう一度プレイ」でリロードせずに再プレイし、再度スコア送信 → 正常にランキングへ反映されることを確認。
💬 返信 (3)
🛠 開発を開始しました (機能追加: vegetable-drop)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」の改善を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」の改善を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris